@@ -40,6 +40,34 @@ def readint(self, n):
4040 return int (value )
4141 return int .from_bytes (bytes , 'little' )
4242
43+ def read_byte (self ):
44+ """Read 1 byte (little endian)"""
45+ bytes = self .file .read (1 )
46+ if len (bytes ) == 0 :
47+ print ('ERR: Could not read_byte, corrupt structure. File position ' + self .pos ())
48+ return struct .unpack ("<B" , bytes )[0 ]
49+
50+ def read_ushort (self ):
51+ """Read 2 bytes as unsigned short (little endian)"""
52+ bytes = self .file .read (2 )
53+ if len (bytes ) == 0 :
54+ print ('ERR: Could not read_ushort, corrupt structure. File position ' + self .pos ())
55+ return struct .unpack ("<H" , bytes )[0 ]
56+
57+ def read_uint (self ):
58+ """Read 4 bytes as unsigned integer (little endian)"""
59+ bytes = self .file .read (4 )
60+ if len (bytes ) == 0 :
61+ print ('ERR: Could not read_uint, corrupt structure. File position ' + self .pos ())
62+ return struct .unpack ("<I" , bytes )[0 ]
63+
64+ def read_ulong (self ):
65+ """Read 6 bytes as unsigned long (little endian)"""
66+ bytes = self .file .read (6 )
67+ if len (bytes ) == 0 :
68+ print ('ERR: Could not read_ulong, corrupt structure. File position ' + self .pos ())
69+ return struct .unpack ("<Q" , bytes )[0 ]
70+
4371 def move (self , n ):
4472 """move n bytes from beginning of file"""
4573 return self .file .seek (n , 0 )
@@ -68,8 +96,8 @@ def close(self):
6896 def read_scp (self ):
6997 """Read an scp file into memory and returns a ScpRecord"""
7098 scpRecord = ScpRecord ()
71- scpRecord .crc = self .reader .readint ( 2 )
72- scpRecord .len = self .reader .readint ( 4 )
99+ scpRecord .crc = self .reader .read_ushort ( )
100+ scpRecord .len = self .reader .read_uint ( )
73101
74102 s0 = self ._section0 ()
75103 scpRecord .sections .append (s0 )
@@ -93,9 +121,9 @@ def read_scp(self):
93121 def _sectionheader (self ):
94122 """Read and return a section header"""
95123 header = SectionHeader ()
96- header .crc = self .reader .readint ( 2 )
97- header .id = self .reader .readint ( 2 )
98- header .len = self .reader .readint ( 4 )
124+ header .crc = self .reader .read_ushort ( )
125+ header .id = self .reader .read_ushort ( )
126+ header .len = self .reader .read_uint ( )
99127 header .versnr = self .reader .readint (1 )
100128 header .protnr = self .reader .readint (1 )
101129 header .reserved = self .reader .reads (6 )
@@ -107,11 +135,11 @@ def _sectionheader(self):
107135 def _sectionpointer (self ):
108136 """Read and return a section pointer"""
109137 p = SectionPointer ()
110- p .id = self .reader .readint ( 2 )
138+ p .id = self .reader .read_ushort ( )
111139 # section length
112- p .len = self .reader .readint ( 4 )
140+ p .len = self .reader .read_uint ( )
113141 # index of section starting from zero
114- p .index = self .reader .readint ( 4 )
142+ p .index = self .reader .read_uint ( )
115143 return p
116144
117145 def _section0 (self ):
@@ -139,8 +167,8 @@ def _section0(self):
139167 def _readtag (self ):
140168 """Read and return a scp tag"""
141169 tag = Tag ()
142- tag .tag = self .reader .readint ( 1 )
143- tag .len = self .reader .readint ( 2 )
170+ tag .tag = self .reader .read_byte ( )
171+ tag .len = self .reader .read_ushort ( )
144172
145173 if tag .len > 0 :
146174 tag .data = self .reader .read (tag .len )
@@ -149,9 +177,9 @@ def _readtag(self):
149177 def _readleadid (self ):
150178 """Read and return a LeadId"""
151179 leadid = LeadIdentification ()
152- leadid .startsample = self .reader .readint ( 4 )
153- leadid .endsample = self .reader .readint ( 4 )
154- leadid .leadid = self .reader .readint ( 1 )
180+ leadid .startsample = self .reader .read_uint ( )
181+ leadid .endsample = self .reader .read_uint ( )
182+ leadid .leadid = self .reader .read_byte ( )
155183 return leadid
156184
157185 def _read_section (self , pointer , nr_of_leads ):
@@ -206,6 +234,10 @@ def _section2(self, pointer):
206234
207235 header = self ._sectionheader ()
208236 s = Section2 (header , pointer )
237+
238+ s .nr_huffman_tables = self .reader .read_ushort ()
239+ # Number of code structures in table # 1
240+ s .nr_code_struct = self .reader .read_ushort ()
209241 return s
210242
211243 def _section3 (self , pointer ):
@@ -215,8 +247,8 @@ def _section3(self, pointer):
215247 header = self ._sectionheader ()
216248 s = Section3 (header , pointer )
217249
218- s .nrleads = self .reader .readint ( 1 )
219- s .flags = self .reader .readint ( 1 )
250+ s .nrleads = self .reader .read_byte ( )
251+ s .flags = self .reader .read_byte ( )
220252 # first bit
221253 s .ref_beat_substr = bool (s .flags >> 1 & 1 )
222254 # bits 3-7
@@ -235,6 +267,10 @@ def _section4(self, pointer):
235267 header = self ._sectionheader ()
236268 s = Section4 (header , pointer )
237269
270+ s .ref_beat_type_len = self .reader .read_ushort ()
271+ s .sample_nr_fidpoint = self .reader .read_ushort ()
272+ s .total_nr_qrs = self .reader .read_ushort ()
273+
238274 return s
239275
240276 def _section5 (self , pointer , nr_of_leads ):
@@ -244,14 +280,14 @@ def _section5(self, pointer, nr_of_leads):
244280 header = self ._sectionheader ()
245281 s = Section5 (header , pointer )
246282
247- s .avm = self .reader .readint ( 2 )
248- s .sample_time_interval = self .reader .readint ( 2 )
249- s .sample_encoding = self .reader .readint ( 1 )
250- s .reserved = self .reader .readint ( 1 )
283+ s .avm = self .reader .read_ushort ( )
284+ s .sample_time_interval = self .reader .read_ushort ( )
285+ s .sample_encoding = self .reader .read_byte ( )
286+ s .reserved = self .reader .read_byte ( )
251287
252288 # nr of bytes for each lead
253289 for _ in range (0 , nr_of_leads ):
254- s .nr_bytes_for_leads .append (self .reader .readint ( 2 ))
290+ s .nr_bytes_for_leads .append (self .reader .read_ushort ( ))
255291
256292 # samples for each lead
257293 for nr in s .nr_bytes_for_leads :
@@ -261,7 +297,7 @@ def _section5(self, pointer, nr_of_leads):
261297 samples_len = nr / 2
262298
263299 while samples_len > 0 :
264- data .samples .append (self .reader .readint ( 2 ))
300+ data .samples .append (self .reader .read_ushort ( ))
265301 samples_len = samples_len - 1
266302
267303 s .data .append (data )
@@ -275,16 +311,18 @@ def _section6(self, pointer, nr_of_leads):
275311 header = self ._sectionheader ()
276312 s = Section6 (header , pointer )
277313
278- s .avm = self .reader .readint ( 2 )
279- s .sample_time_interval = self .reader .readint ( 2 )
280- s .sample_encoding = self .reader .readint ( 1 )
281- s .bimodal_compression = self .reader .readint ( 1 )
314+ s .avm = self .reader .read_ushort ( )
315+ s .sample_time_interval = self .reader .read_ushort ( )
316+ s .sample_encoding = self .reader .read_byte ( )
317+ s .bimodal_compression = self .reader .read_byte ( )
282318
283319
284320 # nr of bytes for each lead
285321 for _ in range (0 , nr_of_leads ):
286- s .nr_bytes_for_leads .append (self .reader .readint ( 2 ))
322+ s .nr_bytes_for_leads .append (self .reader .read_ushort ( ))
287323
324+ # TODO: check if section2 exists -> samples are Huffman encoded
325+
288326 # samples for each lead
289327 for nr in s .nr_bytes_for_leads :
290328 data = DataSamples ()
@@ -293,6 +331,7 @@ def _section6(self, pointer, nr_of_leads):
293331 samples_len = nr / 2
294332
295333 while samples_len > 0 :
334+ # signed 2byte integers
296335 data .samples .append (self .reader .readint (2 ))
297336 samples_len = samples_len - 1
298337
@@ -306,6 +345,20 @@ def _section7(self, pointer):
306345 header = self ._sectionheader ()
307346 s = Section7 (header , pointer )
308347
348+ s .reference_count = self .reader .read_byte ()
349+ s .pace_count = self .reader .read_byte ()
350+ s .rr_interval = self .reader .read_ushort ()
351+ s .pp_interval = self .reader .read_ushort ()
352+ for i in range (0 , s .pace_count ):
353+ s .pace_times [i ] = self .reader .readint (2 )
354+ s .pace_amplitudes [i ] = self .reader .read_ushort ()
355+
356+ for i in range (0 , s .pace_count ):
357+ s .pace_types = self .reader .read_byte ()
358+ s .pace_sources = self .reader .read_byte ()
359+ s .pace_indexes = self .reader .readint (2 )
360+ s .pace_widths = self .reader .readint (2 )
361+
309362 return s
310363
311364
0 commit comments