' {$STAMP BS2pe}
' {$PBASIC 2.5}

OUTPUT 3
OUTPUT 14
OUTPUT 15
INPUT 11
INPUT 4
INPUT 0
OUTPUT 1
OUTPUT 7
OUTPUT 12
INPUT 10

gpsTimeHr VAR Byte
gpsTimeMin VAR Byte
gpsTimeSec VAR Byte
gpsTImeFrac VAR Byte
gpsLatDeg VAR Byte
gpsLatMin VAR Byte
gpsLatMinFrac VAR Word
latSect VAR Byte(2)
gpsLonDeg VAR Byte
gpsLonMin VAR Byte
gpsLonMinFrac VAR Word
lonSect VAR Byte(2)
gpsQual VAR Byte(2)
gpsMode VAR Byte(2)
checksum VAR Byte
updateCount VAR Word
moStatus VAR Byte
cnt VAR Nib
mvcInput VAR Nib

HIGH 14    'put watchdog in 500x mode

moStatus=2
updateCount = 1810
pwrChkLoop:
TOGGLE 15
DEBUG "sleep count is ", DEC updateCount,CR
IF IN4 = 1 THEN SEROUT 12,396,["sleep count is ", DEC updateCount,13,10]
DEBUG "12V good is ", DEC IN4,CR
IF IN4 = 1 THEN SEROUT 12, 396,["12V good is ", DEC IN4,13,10]
DEBUG "iridium modem net avail is ", DEC IN0, CR
IF IN4 = 1 THEN SEROUT 12,396,["iridium modem net avail is ", DEC IN0, 13,10]
IF IN4 = 1 THEN  'turn off power to gps & iridium
  HIGH 3
  DEBUG "in mainLoop, power to GPS is on",CR
  SEROUT 12,396,["in mainLoop, power to GPS is on",13,10]
ELSE
  LOW 3
  DEBUG "in mainLoop, power to GPS is off",CR
ENDIF
updateCount = updateCount+22
LOW 15
IF IN4 = 1 THEN SEROUT 12,396,["Send Command Now",CR]
cnt=0
IF IN4 = 1 THEN SERIN 10,396,2000,noInputFromMVC,[WAIT("cmd:"),DEC mvcInput]
IF mvcInput=1 THEN updateCount=1810
noInputFromMVC:
SLEEP 20
IF moStatus<>1 AND IN4=1 THEN updateCount = 1810
IF updateCount > 1800 THEN
  updateCount = 0
  HIGH 7    'turn on modem
  DEBUG "Powering up receiver", CR
  IF IN4 = 1 THEN SEROUT 12,396,["Powering up receiver", 13,10]
  HIGH 3
  FOR cnt=1 TO 13 '2 minutes of trying to get a gps fix
    GOSUB getGPSFix
    IF gpsQual(0)="A" THEN EXIT
  NEXT
  DEBUG "$GPLL,", DEC2 gpsLatDeg, DEC2 gpsLatMin,".", DEC5 gpsLatMinFrac,",", STR latSect,",", DEC3 gpsLonDeg, DEC2 gpsLonMin,".", DEC5 gpsLonMinFrac,",", STR lonSect,",", DEC2 gpsTimeHr,DEC2 gpsTimeMin, DEC2 gpsTimesec, ".",DEC2 gpsTimeFrac,",", STR gpsQual, ",", STR gpsMode, "*", HEX2 checksum, CR
  IF IN4 = 1 THEN SEROUT 12,396,["$GPLL,", DEC2 gpsLatDeg, DEC2 gpsLatMin,".", DEC5 gpsLatMinFrac,",", STR latSect,",", DEC3 gpsLonDeg, DEC2 gpsLonMin,".", DEC5 gpsLonMinFrac,",", STR lonSect,",", DEC2 gpsTimeHr,DEC2 gpsTimeMin, DEC2 gpsTimesec, ".",DEC2 gpsTimeFrac,",", STR gpsQual, ",", STR gpsMode, "*", HEX2 checksum, 13,10]
  FOR cnt=1 TO 30 'roughly half a minute of trying to send an SBD
    DEBUG "iridium modem net avail is ", DEC IN0, CR
    IF IN4 = 1 THEN SEROUT 12,396,["iridium modem net avail is ", DEC IN0, 13,10]
    GOSUB sendIridiumUpdate
    IF moStatus = 1 THEN EXIT
  NEXT
ENDIF
GOTO pwrChkLoop

getGPSFix:

latSect(1) = 0
lonSect(1) = 0
gpsQual(1) = 0
gpsMode(1) = 0
waitForFix:
DEBUG "Waiting for GPS fix", CR
SLEEP 10
TOGGLE 15
SERIN 11,396,1200,returnFromGPS,[WAIT("GPGLL,"),DEC2 gpsLatDeg,DEC2 gpsLatMin,SKIP 1,DEC5 gpsLatMinFrac,SKIP 1,STR latSect\1,SKIP 1,DEC3 gpsLonDeg,DEC2 gpsLonMin,SKIP 1,DEC5 gpsLonMinFrac,SKIP 1,STR lonSect\1,SKIP 1,DEC2 gpsTimeHr,DEC2 gpsTimeMin,DEC2 gpsTimeSec,SKIP 1,DEC2 gpsTimeFrac,SKIP 1,STR gpsQual\1, SKIP 1,STR gpsMode\1, SKIP 1, HEX2 checksum]
returnFromGps:
RETURN

sendIridiumUpdate:
SEROUT 1,1646,["AT+SBDWT=", DEC2 gpsLatDeg, DEC2 gpsLatMin,".",DEC5 gpsLatMinFrac,",",STR latSect,",",DEC3 gpsLonDeg, DEC2 gpsLonMin,".",DEC5 gpsLonMinFrac,",",STR lonSect,",", DEC2 GPSTimeHr,DEC2 gpsTimeMin, DEC2 gpsTimesec,".",DEC2 gpsTimeFrac, ",", STR gpsQual, 10, 13]
DEBUG "AT+SBDWT=",DEC2 gpsLatDeg, DEC2 gpsLatMin,".",DEC5 gpsLatMinFrac,",",STR latSect,",",DEC3 gpsLonDeg, DEC2 gpsLonMin,".",DEC5 gpsLonMinFrac,",",STR lonSect,",", DEC2 GPSTimeHr,DEC2 gpsTimeMin, DEC2 gpsTimesec,".",DEC2 gpsTimeFrac,",", STR gpsQual, CR
IF IN4 = 1 THEN SEROUT 12,396,["AT+SBDWT=",DEC2 gpsLatDeg, DEC2 gpsLatMin,".",DEC5 gpsLatMinFrac,",",STR latSect,",",DEC3 gpsLonDeg, DEC2 gpsLonMin,".",DEC5 gpsLonMinFrac,",",STR lonSect,",", DEC2 GPSTimeHr,DEC2 gpsTimeMin, DEC2 gpsTimesec,".",DEC2 gpsTimeFrac,",", STR gpsQual, 13,10]
SERIN 2,1646,5000,noIridiumOK, [WAIT("OK")]
noIridiumOK:
SEROUT 1,1646,["AT+SBDI", 10, 13]
SERIN  2,1646,20000,noIridium,[WAIT("SBDI:"),DEC1 moStatus]
DEBUG "moStatus was ", DEC1 moStatus, CR
IF IN4 = 1 THEN SEROUT 12,396,["moStatus was ", DEC1 moStatus, 13,10]
returnFromSBD:
RETURN

noGps1:
DEBUG "no gps", CR
IF IN4 = 1 THEN SEROUT 12,396, ["no gps", 13,10]
GOTO returnFromGps

noIridium:
DEBUG "timeout sending iridium update ", CR
IF IN4 = 1 THEN SEROUT 12,396,["timeout sending iridium update ", 13,10]
moStatus = 2
GOTO returnFromSBD