' {$STAMP BS2p} ' {$PBASIC 2.5} 'Pins/Constants GPSio PIN 01 GPSraw PIN 03 accelSwitch PIN 09 MEMORYSIZE CON 2020 'must be made divisible by 20 (20B per block + 6b Header/Footer) 'Variables slotNum VAR Nib address VAR Word dayMonth VAR Word year VAR Byte hrs VAR Byte mins VAR Byte secs VAR Byte latLeft VAR Word latRight VAR Word longLeft VAR Word longRight VAR Word speed1 VAR Word speed2 VAR Nib course1 VAR Word course2 VAR Nib numSats VAR Nib alt1 VAR Word 'Initialize INPUT accelSwitch INPUT GPSraw LOW GPSraw slotNum = 0 address = 0 dayMonth = 0 year = 0 hrs = 0 mins = 0 secs = 0 latLeft = 0 latRight = 0 longLeft = 0 longRight = 0 speed1 = 0 speed2 = 0 course1 = 0 course2 = 0 numSats = 0 alt1 = 0 main: GOTO slotNumControl 'never returns to main unless a loss of power 'end main slotNumControl: slotNum = slotNum + 1 'enables 14k (2047 bytes X 7) for storage in multiple slots 'this is the only function where slotNum/address are initialized during runtime SELECT slotNum 'each slot holds approx. 1.5 minutes of data at 9600 baud. CASE < 1 END CASE > 6 END CASE = 1 STORE slotNum address = 0 GOTO waitForAccel CASE = 2 STORE slotNum address = 0 GOTO collectData CASE = 3 STORE slotNum address = 0 GOTO collectData 'end dataSlot for flight1 CASE = 4 STORE slotNum address = 0 GOTO waitForAccel CASE = 5 STORE slotNum address = 0 GOTO collectData CASE = 6 STORE slotNum address = 0 GOTO collectData 'end dataSlot for flight1 ENDSELECT 'end slotNumControl waitForAccel: SELECT accelSwitch CASE = 1 GOTO collectData CASE ELSE GOTO waitForAccel ENDSELECT 'end waitForAccel collectData: 'Parse GPRMC sentence by counting commas, dayMonth & year also serve as headers/footers for each programSlot datablock '$GPRMC,hrsminssecs.sss,validity bit,latLeft.latRight,N,longLeft.LongRight,W,speed1.speed2,course1.course2,dayMonthyear,...,CRC SERIN GPSio, 500,[WAIT("RMC,"), WAIT(",") , WAIT(","), WAIT(","), WAIT(","), WAIT(","), WAIT(","), WAIT(","), WAIT(","), DEC4 dayMonth, DEC2 year] WRITE address, dayMonth.HIGHBYTE address = address + 1 WRITE address, dayMonth.LOWBYTE address = address + 1 WRITE address, year address = address + 1 'end 3 byte header for slotX datablock DO WHILE address < MEMORYSIZE 'Parse GPRMC sentence by counting bytes & commas '$GPRMC,hrsminssecs.sss,validity bit,latLeft.latRight,N,longLeft.LongRight,W,speed1.speed2,course1.course2,dayMonthyear,...,CRC SERIN GPSio,500,[WAIT("RMC,"),DEC2 hrs, DEC2 mins, DEC2 secs, WAIT(","), DEC latLeft, DEC latRight, SKIP 3, DEC longLeft, DEC longRight, SKIP 3, DEC speed1, DEC speed2, DEC course1, DEC course2] WRITE address, hrs address = address + 1 WRITE address, mins address = address + 1 WRITE address, secs address = address + 1 WRITE address, latLeft.HIGHBYTE address = address + 1 WRITE address, latLeft.LOWBYTE address = address + 1 WRITE address, latRight.HIGHBYTE address = address + 1 WRITE address, latRight.LOWBYTE address = address + 1 WRITE address, longLeft.HIGHBYTE address = address + 1 WRITE address, longLeft.LOWBYTE address = address + 1 WRITE address, longRight.HIGHBYTE address = address + 1 WRITE address, longRight.LOWBYTE address = address + 1 WRITE address, speed1.HIGHBYTE address = address + 1 WRITE address, speed1.LOWBYTE address = address + 1 WRITE address, speed2 address = address + 1 WRITE address, course1.HIGHBYTE address = address + 1 WRITE address, course1.LOWBYTE address = address + 1 WRITE address, course2 address = address + 1 'Parse GPGGA sentence for altitude & number of satellites (0-12) by counting commas '$GPGGA,hrsminssecs.SSS,latLeft.latRight,N,longLeft.LongRight,W,positionIndicator,numSatellites,HDOP,MSLaltitude,...,CRC SERIN GPSio, 500,[WAIT("GGA,"), WAIT(",") , WAIT(","), WAIT(","), WAIT(","), WAIT(","), WAIT(","), DEC numSats, WAIT(","), DEC alt1] WRITE address, numSats address = address + 1 WRITE address, alt1.HIGHBYTE address = address + 1 WRITE address, alt1.LOWBYTE address = address + 1 LOOP 'Parse GPRMC sentence by counting commas, dayMonth & year also serve as headers/footers for each programSlot datablock '$GPRMC,hrsminssecs.sss,validity bit,latLeft.latRight,N,longLeft.LongRight,W,speed1.speed2,course1.course2,dayMonthyear,...,CRC SERIN GPSio, 500,[WAIT("RMC,"), WAIT(",") , WAIT(","), WAIT(","), WAIT(","), WAIT(","), WAIT(","), WAIT(","), WAIT(","), DEC4 dayMonth, DEC2 year] 'start 3 byte footer for slotX datablock WRITE address, dayMonth.HIGHBYTE address = address + 1 WRITE address, dayMonth.LOWBYTE address = address + 1 WRITE address, year address = address + 1 GOTO slotNumControl 'endCollectData