Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 64 additions & 34 deletions parseData.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import binascii
import csv

phases = ["NA", "PRELAUNCH", "ARM", "BURN", "COAST", "DROGUE_DESCENT", "MAIN_DESCENT", "POSTLAUNCH",
"ABORT_COMMAND_RECEIVED", "ABORT_COMMUNICATION_ERROR", "ABORT_OXIDIZER_PRESSURE", "ABORT_UNSPECIFIED_REASON"]
valveStatus = ["NA","Closed", "Open"]
order = 'big'
class AvionicsData:
def __init__(self):
self.imu = [0] * 9
self.bar = [0] * 2
self.gps = [0] * 4
self.gps = [0] * 8
self.oxi = -1
self.cmb = -1
self.phs = -1
Expand All @@ -17,25 +20,31 @@ def __init__(self):
self.lowerVnt = -1

def __str__(self):
phases = ["NA", "PRELAUNCH", "ARM", "BURN", "COAST", "DROGUE_DESCENT", "MAIN_DESCENT", "POSTLAUNCH",
"ABORT_COMMAND_RECEIVED", "ABORT_COMMUNICATION_ERROR", "ABORT_OXIDIZER_PRESSURE", "ABORT_UNSPECIFIED_REASON"]
valveStatus = ["NA","Closed", "Open"]

string="IMU - ACCEL:\t\t"+ str(self.imu[0:3])+" mg"+"\n"
string+="IMU - GYRO:\t\t"+ str(self.imu[3:6])+" mdps"+"\n"
string+="BAR - PRESS:\t\t"+ str(self.bar[0]/100) +" mbar"+"\n"
string+="BAR - TEMP:\t\t"+ str(self.bar[1]/100)+" degrees C"+"\n"
string+="GPS - TIME:\t\t%06d UTC" % self.gps[0] + "\n"
#Convert GPS coordinates to latitude/longitude that Google Maps accepts
string+="GPS - LAT:\t\t%.5f" % (self.gps[1] + self.gps[2]/100000/60) + " " + str(self.gps[3]) + "\n"
string+="GPS - LONG:\t\t%.5f" % (self.gps[4] + self.gps[5]/100000/60) + " " + str(self.gps[6]) + "\n"
string+="GPS - ALT:\t\t" + str(self.gps[7]) + " m" + "\n"
string+="OXI - P:\t\t"+ str(self.oxi/1000)+" psi"+"\n"
string+="CMB - P:\t\t"+ str(self.cmb/1000)+" psi"+"\n"
string+="PHS - PHASE:\t\t"+ str(phases[self.phs+1])+"\n"
string+="Inj Valve:\t\t" + str(valveStatus[self.injValve+1])+"\n"
string+="Lower Vent:\t\t" + str(valveStatus[self.lowerVnt+1])+"\n"

return string
def writeToCSV(self):
with open('fligthData.csv', 'a') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow([str(self.imu[0]), str(self.imu[1]), str(self.imu[2]), str(self.imu[3]), str(self.imu[4]), str(self.imu[5]), str(self.bar[0]), str(self.bar[1])])
spamwriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow([str(self.imu[0:3]), str(self.imu[3:6]), str(self.bar[0]/100), str(self.bar[1]/100), str(self.gps[0]), \
str(self.gps[1]+(self.gps[2]/100000/60)) + " " + str(self.gps[3]), str(self.gps[4] + self.gps[5]/100000/60) + " " + str(self.gps[6]), \
str(self.gps[7]), str(self.oxi/1000), str(self.cmb/1000), \
str(phases[self.phs+1]), str(valveStatus[self.injValve+1]), str(valveStatus[self.lowerVnt+1])])

return string

def twos_complement(hexstr,bits):
value = int(hexstr,16)
Expand All @@ -53,40 +62,52 @@ def readSerial(ser,data):
i = 0
print(line)
while(i<len(line)):
# IMU Data
#IMU Data
if((line[i:i+8]=='31313131') and (len(line)-i>=81)):
if(line[i+80:i+82]=='00'):
print(line[i:i+82])
data.imu[0] = twos_complement(line[i+8:i+16], 32)
data.imu[1] = twos_complement(line[i+16:i+24], 32)
data.imu[2] = twos_complement(line[i+24:i+32], 32)
data.imu[3] = twos_complement(line[i+32:i+40], 32)
data.imu[4] = twos_complement(line[i+40:i+48], 32)
data.imu[5] = twos_complement(line[i+48:i+56], 32)
data.imu[0] = twos_complement(line[i+8:i+16], 32) #accel x
data.imu[1] = twos_complement(line[i+16:i+24], 32) #accel y
data.imu[2] = twos_complement(line[i+24:i+32], 32) #accel z
data.imu[3] = twos_complement(line[i+32:i+40], 32) #gyro x
data.imu[4] = twos_complement(line[i+40:i+48], 32) #gyro y
data.imu[5] = twos_complement(line[i+48:i+56], 32) #gyro z
i+=81
else: i+=1

# Barometer Data
#Barometer Data
elif((line[i:i+8])=='32323232' and len(line)-i>=25):
if(line[i+24:i+26]=='00'):
print(line[i:i+26])
data.bar[0] = twos_complement(line[i+8:i+16], 32)
data.bar[1] = twos_complement(line[i+16:i+24], 32)
data.bar[0] = twos_complement(line[i+8:i+16], 32) #pressure
data.bar[1] = twos_complement(line[i+16:i+24], 32) #temp
i+=25
else:
i+=1

#GPS Data
elif((line[i:i+8]=='33333333') and (len(line)-i>=41)):
if(line[i+40:i+42]=='00'):
print(line[i:i+42])
data.gps[0] = twos_complement(line[i+8:i+16], 32)
data.gps[1] = twos_complement(line[i+16:i+24], 32)
data.gps[2] = twos_complement(line[i+24:i+32], 32)
data.gps[3] = twos_complement(line[i+32:i+40], 32)
i+=41
else:
i+=1
elif((line[i:i+8]=='33333333') and (len(line)-i>=57)):
if(line[i+56:i+58]=='00'):
data.gps[0] = (twos_complement(line[i+8:i+16], 32))/100 #
data.gps[1] = (twos_complement(line[i+16:i+24], 32))
data.gps[2] = (twos_complement(line[i+24:i+32], 32))
if data.gps[1] < 0:
data.gps[3] = "S"
data.gps[1] *= -1
data.gps[2] *= -1
else:
data.gps[3] = "N"
data.gps[4] = (twos_complement(line[i+32:i+40], 32))
data.gps[5] = (twos_complement(line[i+40:i+48], 32))
if data.gps[4] < 0:
data.gps[6] = "W"
data.gps[4] *= -1
data.gps[5] *= -1
else:
data.gps[6] = "E"
data.gps[7] = (twos_complement(line[i+48:i+56], 32))/10
i+=57
else: i+=1

#Oxidizer Tank Pressure
elif((line[i:i+8]=='34343434') and (len(line)-i>=17)):
Expand All @@ -103,38 +124,47 @@ def readSerial(ser,data):
else: i+=1

#Flight Phase
elif((line[i:i+8]=='36363636') and (len(line)-i>=13)):
elif((line[i:i+8]=='36363636') and (len(line)-i>=11)):
if(line[i+10:i+12]=='00'):
data.phs = int(line[i+8:i+10], 16)
i+=12
i+=11
else: i+=1

#Injection Valve Status
elif((line[i:i+8]=='38383838') and (len(line)-i>=13)):
elif((line[i:i+8]=='38383838') and (len(line)-i>=11)):
if(line[i+10:i+12]=='00'):
data.injValve = int(line[i+8:i+10], 16)
i+=12
i+=11
else: i+=1

#Lower Vent Valve
elif((line[i:i+8]=='39393939') and (len(line)-i>=13)):
elif((line[i:i+8]=='39393939') and (len(line)-i>=11)):
if(line[i+10:i+12]=='00'):
data.lowerVnt = int(line[i+8:i+10], 16)
i+=12
i+=11
else: i+=1

#No packet detected
else: i+=1

print(data)
data.writeToCSV()
ser.flushInput()


if __name__ == "__main__":
ser = None
data = AvionicsData()
with open('fligthData.csv', 'a') as csvheader:
spamwriter = csv.writer(csvheader, delimiter=',', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(["Acceleration(mg)", "Gyro(mdps)", "Pressure(mbar)","Temp(C)", "GPS Time(UTC)", "Latitude","Longitude", \
"Altitude(m)", "Oxi Pressure(psi)", "Combu Pressure(psi)","Phase", "Inj Valve", "Lower Vent"])
while(True):
port = input('Enter a Serial Port to connect to:') #Linux: /dev/ttyUSBx, Windows: COMx
ser = serial.Serial(port, 9600, timeout=0)

ser.flushInput()

while(ser!=None):
time.sleep(1)
time.sleep(0.5)
readSerial(ser, data)