' {$STAMP BS2pe}
' {$PBASIC 2.5}
' iridium modem should be set to 600 baud/8 bit/no parity
' GPS should be configured to output a GLL string at 300 baud/8 bit/no parity
' MVC communications are at 2400 baud/8 bit/no parity

OUTPUT 3
OUTPUT 14
OUTPUT 15
INPUT 11
INPUT 4
INPUT 0
OUTPUT 1
OUTPUT 7
OUTPUT 12
INPUT 10

updateCount VAR Word
moStatus VAR Byte
cnt VAR Nib
mvcInput VAR Nib
gpstimeout VAR Nib
gllStr VAR Byte(21)

HIGH 14    'put watchdog in 500x mode

gpsTimeout = 0
moStatus=2
updateCount = 910
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
  HIGH 7
  DEBUG "in mainLoop, power to GPS is on",CR
  SEROUT 12,396,["in mainLoop, power to GPS is on",13,10]
ELSE
  LOW 3
  LOW 7
ENDIF
updateCount = updateCount+22
LOW 15
IF IN4 = 1 THEN SEROUT 12,396,["Send Command Now",CR]
cnt=0
mvcInput=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 = 910
IF updateCount > 900 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 IN4 = 1 THEN SEROUT 12,396,["timeout ", DEC gpstimeout, "$GPGLL,", STR gllStr]
    DEBUG "$GPGLL,", STR gllStr , CR
  NEXT
  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, " cnt is ", DEC cnt, 13,10]
    GOSUB sendIridiumUpdate
    IF moStatus = 1 THEN EXIT
  NEXT
ENDIF
GOTO pwrChkLoop

getGPSFix:
waitForFix:
DEBUG "Waiting for GPS fix, Iridium modem net avail is ", DEC IN0, CR
'SLEEP 10
TOGGLE 15
SERIN 11,396, [WAIT("GPGLL,"), STR gllStr\21\CR]
gpstimeout = 0
RETURN
timeoutFromGps:
gpstimeout=1
RETURN

sendIridiumUpdate:
SEROUT 1,1646,["AT+SBDWT=", "$GPGLL,", STR gllStr, 10, 13]
DEBUG "AT+SBDWT=", "$GPGLL,", STR gllStr, CR
IF IN4 = 1 THEN SEROUT 12,396,["AT+SBDWT=", "$GPGLL,", STR gllStr, 10, 13]
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, 10,13]
returnFromSBD:
RETURN

noIridium:
DEBUG "timeout sending iridium update ", CR
IF IN4 = 1 THEN SEROUT 12,396,["timeout sending iridium update ", 13,10]
moStatus = 2
GOTO returnFromSBD