## Original code by nick84, http://www.digitaldawgpound.org/nick84/post=222 ## ## Modified by Alexei Karpenko for High ALtitude Object (HALO) ## http://www.natrium42.com/halo/flight2/ ## ## Added to by James Coxon for Firefly HAL Platform ## http://www.pegasushabproject.org.uk/firefly/ ## http://www.ukhas.org.uk ## ##### Constants ##### TRUE = 1 FALSE = 0 #Use serial import SER #Use build in module import MOD #Use AT command interface import MDM #Use GPS import GPS #Use GPIO functions import GPIO nofix_count = 0 #Misc Functions def debugmsg(msgtext): msgtext = msgtext.replace('\r', '\\r') msgtext = msgtext.replace('\n', '\\n') SER.send(msgtext + '\r\n') #GPS status def gps_status(gpspos): debugmsg('Retrieving GPS status') gpspos_parts = gpspos.split(',') if ( (gpspos_parts[5] == '2') or (gpspos_parts[5] == '3') ): #2D or 3D fix debugmsg('GPS fix "' + gpspos_parts[5] + '" ie valid'); status = TRUE else: debugmsg('GPS fix "' + gpspos_parts[5] + '" ie not valid'); status = FALSE return status #SMS Send def sms_send(to, text): MDM.send('AT+CMGS="' + to + '"\r', 0) res = MDM.receive(50)#5 sec MOD.sleep(1)#wait 0.1sec #Check for SMS prompt if (res == '\r\n> '): #Send SMS message text MDM.send(text, 0) #End SMS MDM.sendbyte(0x1A, 0) res2 = MDM.receive(180)#5 sec MOD.sleep(1)#wait 0.1sec if (res2.find('\r\nOK\r\n') != -1): status = TRUE else: status = FALSE MDM.receive(1); # may prevent +CMS ERROR: 331 crash else: #Abort SMS (just in case) MDM.sendbyte(0x1B, 0) MOD.sleep(1)#wait 0.1sec status = FALSE return status #Setup SMS def sms_setup(): MDM.send('AT+CMGF=1\r', 0) res = MDM.receive(50)#5 sec MOD.sleep(1)#wait 0.1sec def cutdown(alt): debugmsg('Check Altitude') alt_temp = alt.split('.') debugmsg(alt_temp[0]) alt_int = int(alt_temp[0]) if (alt_int > 5000): debugmsg('Cutdown') GPIO.setIOvalue(4, 1) MOD.sleep(10) GPIO.setIOvalue(4, 0) else: debugmsg('Still Below 5000m') def camera(): GPIO.setIOvalue(6, 1) MOD.sleep(10) GPIO.setIOvalue(6, 0) def radio_on_of(on_off): if (on_off == 'on'): debugmsg('Radio on') GPIO.setIOvalue(7, 0) elif (on_off == 'off'): debugmsg('Radio off') GPIO.setIOvalue(7, 1) def dit(): MOD.sleep(2) GPIO.setIOvalue(3, 1) MOD.sleep(1) GPIO.setIOvalue(3,0) def dash(): MOD.sleep(2) GPIO.setIOvalue(3, 1) MOD.sleep(2) GPIO.setIOvalue(3,0) def morse_code(number): MOD.sleep(3) if (number == '.'): debugmsg('Dot') elif (number == 'N'): debugmsg('N') elif (number == 'S'): debugmsg('S') elif (number == 'E'): debugmsg('E') elif (number == 'W'): debugmsg('W') elif (number == '-'): debugmsg('-') else: int_number = int(number) debugmsg('%d' % int_number) if (int_number == 0): dash() dash() elif (int_number == 1): dit() elif (int_number == 2): dit() dit() elif (int_number == 3): dit() dit() dit() elif (int_number == 4): dit() dit() dit() dit() elif (int_number == 5): dash() elif (int_number == 6): dash() dit() elif (int_number == 7): dash() dit() dit() elif (int_number == 8): dash() dit() dit() dit() elif (int_number == 9): dash() dit() dit() dit() dit() else: debugmsg('Not between 0 and 9') def morse_splitter(coord): debugmsg(coord) j = 0 while j < len(coord): morse_code(coord[j]) j = j + 1 SER.send('Outside Main\r\n') debugmsg('Running...'); gpspos_lastvalid = '' sms_setup() #Main loop while 1: debugmsg('Entering loop') debugmsg('Click') camera() #Retrieve current position gpspos = GPS.getActualPosition() debugmsg('Position: %s' % gpspos) #Retrieve GPS fix status gps_statusnow = gps_status(gpspos) #Save last valid position #If position fix valid, or none recorded already, use last retrieved if ( (gps_statusnow == TRUE) or (gpspos_lastvalid == '') ): gpspos_lastvalid = gpspos nofix_count = 0 else: nofix_count = nofix_count + 1 if (nofix_count > 10): debugmsg('Resetting GPS') res = GPS.resetMode(1) #Cold resets GPS module if (res == '-1'): debugmsg('Error unable to reset GPS module') res = GPS.resetMode(0) #Hardware restart nofix_count = 0 debugmsg('No Fix Count: %d ' % nofix_count) #If GPS position fix valid if (gps_status(gpspos) == TRUE): GPIO.setIOdir(1, 1, 1) gpsdataparts = gpspos.split(',') senddata = 'T:' + gpsdataparts[0] + 'Lat:' + gpsdataparts[1] + ',Lon:' + gpsdataparts[2] + ',Alt:' + gpsdataparts[4] + ',H:' + gpsdataparts[6] + ',S:' + gpsdataparts[7] + 'km/hr' cutdown(gpsdataparts[4]) #Morse code radio_on_of("on") MOD.sleep(10) morse_splitter(gpsdataparts[1]) MOD.sleep(10) morse_splitter(gpsdataparts[2]) MOD.sleep(10) morse_splitter(gpsdataparts[4]) radio_on_of("off") else: GPIO.setIOdir(1, 0, 1) senddata = 'No GPS Fix' debugmsg(senddata) #Send SMS #sms_send('xxxxxxxxxxx', senddata) senddata_bot = 'track@natrium42.com ' + senddata #sms_send('07766404142', senddata_bot) debugmsg('Powersave for 50 seconds') #Powersave for 10 seconds MOD.powerSaving(45)