Data Recording Source Code:

' {$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

SELECT slotNum             'each slot holds approx. 1.5 minutes of data at 9600 baud. Slots 2-7 available
      CASE < 1                    'slot1 holds source code

         END

      CASE > 6                              'slot7 not used

         END

      CASE = 1

       STORE slotNum
       address = 0
       GOTO waitForAccel           'start of flight1

      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            'start of flight2

     CASE = 5

       STORE slotNum
       address = 0
       GOTO collectData

      CASE = 6
       STORE slotNum
       address = 0
       GOTO collectData                 'end dataSlot for flight2
ENDSELECT
'end slotNumControl

waitForAccel:                                'waits for accelerometer switch to trip
SELECT accelSwitch
      CASE = 1

         GOTO collectData

      CASE ELSE

         GOTO waitForAccel
ENDSELECT
'end waitForAccel

collectData:
           'Parse GPRMC sentence by counting commas
           '$GPRMC,hrsminssecs.sss,validitybit,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                           'writes to current slot until 2026 bytes are used

            'Parse GPRMC sentence by counting bytes & commas
            '$GPRMC,hrsminssecs.sss,validitybit,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 
           '$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                                       'start 3 byte footer for slotX datablock
address = address + 1
WRITE address, dayMonth.LOWBYTE
address = address + 1

WRITE address, year
address = address + 1

GOTO slotNumControl    
'endCollectData