From 788cc90bbcddfef933c1ab74a04fb112fa16593e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?K=C3=B6ll=C5=91d=20Csaba?= <kollod.csaba@itk.ppke.hu>
Date: Mon, 2 Jan 2023 18:58:25 +0100
Subject: [PATCH] Dev: adding packets and plot

---
 mcc-flow/merge_records.py | 94 ++++++++++++++++++++++++++++-----------
 1 file changed, 68 insertions(+), 26 deletions(-)

diff --git a/mcc-flow/merge_records.py b/mcc-flow/merge_records.py
index a3183ef..54a3c9b 100644
--- a/mcc-flow/merge_records.py
+++ b/mcc-flow/merge_records.py
@@ -3,28 +3,27 @@ from pathlib import Path
 from struct import unpack
 
 import numpy as np
-
-
-def _read_block_data(file, shape, format_, format_size):
-    sh = np.prod(shape)
-    data = unpack(format_ * sh, file.read(format_size * sh))
-    data = np.array(data)
-    data = data.reshape(shape)
-    return data
+from matplotlib import pyplot as plt
 
 
 class FlowPacket:
-
-    def __init__(self, date_, flow, hr, spo2, vbat_eeg, vbat_arm,
+    header_fs = 1
+    signal_fs = 250
+    gyro_acc_fs = 50
+    sound_fs = 6000
+    grs_fs = 10
+
+    def __init__(self, date_, flow, hr, spo2,
+                 # vbat_eeg, vbat_arm,
                  eeg, eeg_giro, eeg_acc,
                  emg, emg_giro, emg_acc,
                  sound, gsr):
         self.date = date_
-        self.flow = flow
-        self.hr = hr
-        self.spo2 = spo2
-        self.vbat_eeg = vbat_eeg
-        self.vbat_arm = vbat_arm
+        self.duration = 1
+        self.flow = [flow]
+        self.hr = [hr]
+        self.spo2 = [spo2]
+
         self.eeg = eeg
         self.eeg_giro = eeg_giro
         self.eeg_acc = eeg_acc
@@ -35,10 +34,47 @@ class FlowPacket:
         self.gsr = gsr
 
     def __add__(self, other):
-        pass
+        self.flow.extend(other.flow)
+        self.hr.extend(other.hr)
+        self.spo2.extend(other.spo2)
+        self.eeg = np.concatenate((self.eeg, other.eeg), axis=-1)
+        self.eeg_giro = np.concatenate((self.eeg_giro, other.eeg_giro), axis=-1)
+        self.eeg_acc = np.concatenate((self.eeg_acc, other.eeg_acc), axis=-1)
+        self.emg = np.concatenate((self.emg, other.emg), axis=-1)
+        self.emg_giro = np.concatenate((self.emg_giro, other.emg_giro), axis=-1)
+        self.emg_acc = np.concatenate((self.emg_acc, other.emg_acc), axis=-1)
+        self.sound = np.concatenate((self.sound, other.sound), axis=-1)
+        self.gsr = np.concatenate((self.gsr, other.gsr), axis=-1)
+        self.duration += other.duration
+        return self
+
+    def _plot(self, data, title):
+        plt.figure()
+        plt.suptitle(title)
+        chs = data.shape[0]
+        for i in range(chs):
+            plt.subplot(chs, 1, i + 1)
+            plt.plot(np.linspace(0, self.duration, data.shape[1]), data[i, :])
+            plt.title(f'ch{i + 1}')
+        plt.xlabel('time (s)')
+
+    def plot(self):
+        self._plot(self.eeg, 'EEG')
+        self._plot(self.eeg_giro, 'EEG Gyro')
+        self._plot(self.emg, 'EMG')
+
+        plt.show()
 
 
-def process_packet(file):
+def _read_block_data(file, shape, format_, format_size):
+    sh = np.prod(shape)
+    data = unpack(format_ * sh, file.read(format_size * sh))
+    data = np.array(data)
+    data = data.reshape(shape)
+    return data
+
+
+def read_packet(file):
     # header
     date_, time_, flow, hr, spo2, vbat_eeg, vbat_arm = unpack('>II10sBHHH', file.read(25))
     date_ = str(date_)
@@ -65,17 +101,22 @@ def process_packet(file):
     gsr = _read_block_data(file, (10, 1), 'h', 2).T
     print(sound.shape, gsr.shape)
 
-    return date_, flow, hr, spo2, vbat_eeg, vbat_arm, eeg, eeg_giro, eeg_acc, emg, emg_giro
+    packet = FlowPacket(date_, flow, hr, spo2,  # vbat_eeg, vbat_arm,
+                        eeg, eeg_giro, eeg_acc,
+                        emg, emg_giro, emg_acc,
+                        sound, gsr)
+
+    return packet
 
 
 def read_dat_file(file):
     no_packets = unpack('>I', file.read(4))[0]
-    process_packet(file)
-
-
-# def process_data(byte_data):
-#     n_packets = unpack('>i', byte_data.pop(4))[0]
-#     print(n_packets)
+    packet_holder = read_packet(file)
+    for _ in range(no_packets - 1):
+        packet_holder += read_packet(file)
+    remaining = file.read()
+    assert len(remaining) == 0, f'Remaining {len(remaining)}'
+    return packet_holder
 
 
 def read_data(path):
@@ -83,10 +124,11 @@ def read_data(path):
     files = path.rglob('*.dat')
     for file in files:
         with open(file, 'rb') as f:
-            read_dat_file(f)
+            data = read_dat_file(f)
+            data.plot()
             exit(12)
 
 
 if __name__ == '__main__':
-    path = r'D:\Users\Csabi\dev\MCC Flow\database'
+    path = r'D:\Users\Csabi\OneDrive - Pázmány Péter Katolikus Egyetem\MCC Flow\database'
     read_data(path)
-- 
GitLab