#!/usr/bin/env python
import serial # requires pyserial
import sys, os
def collectRawData(port, samples):
collected_data = False
serial_timeouts = 0
f = open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'raw.txt'), 'w')
f.seek(0)
with serial.Serial(port, timeout=0.01) as ser:
i = 0
while i<samples:
i += 1
newline = ser.readline()
if not newline:
serial_timeouts+=1
else:
collected_data = True
serial_timeouts = 0
if collected_data and serial_timeouts>100:
break
f.write(newline)
if (i%1000) == 0:
print i
f.close()
def parseRawData():
message_length = 5 # iteration, ts, deltatime, serialbytes, bytelength
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'parsed.csv'), 'w') as out:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'raw.txt'), 'r') as f:
state = 0
buffer = ""
line_number = 0
data_iteration = 0
for line in f:
if line.strip() and (line.strip() == "START"):
if state <= 0: #-1 when recovering from an error
state = 1
else:
#error!
print "****** unexpected start sequence: '", line.strip(), "' @ line ", line_number
data_iteration += 1
# don't put bad data line in our outfile
state = 0 # reset for next S
elif state > 0 and state < message_length:
buffer = buffer + line.strip() + ", "
state += 1
elif state == message_length:
buffer = buffer + line.strip() + "\n"
state += 1
elif state == message_length + 1: #first tailing \n
if line.strip():
print "****** unexpected text: '", line.strip(), "' @ line ", line_number
data_iteration += 1
state = 0 #skip to START seek
else:
state += 1
elif state == message_length + 2: #second tailing \n
if line.strip():
print "****** unexpected text: '", line.strip(), "' @ line ", line_number
data_iteration += 1
state = 0 #skip to START seek
else:
try:
data_iteration = int(buffer.split(',')[0])
out.write(buffer)
buffer = ""
state = 0 # reset for next S
except:
print "****** iteration can't be found: '", line.strip(), "' @ line ", line_number
state = 0 # reset for next S
else:
print "syncing to 'START' @ line", line_number
if state == 0:
buffer = str(data_iteration) + ', ' + ( '-1, '*(message_length-1) ) + '\n'
out.write(buffer)
print "error line: ", buffer
buffer = ""
state = -1 #don't write multiple error lines
line_number +=1
if __name__ == '__main__':
collectRawData('COM7', 500000)
parseRawData()