//////////////////////////////////////////////////////////////////////// // can_state_ticker60() // State Model: Per-minute ticker // This function is called approximately once per minute (since state // was first entered), and gives the state a timeslice for activity. // void can_state_ticker60(void) { int minSOC; // check minSOC minSOC = sys_features[FEATURE_MINSOC]; if ((can_minSOCnotified == 0) && (car_SOC < minSOC)) { net_notify_status(2); can_minSOCnotified = 1; } else if ((can_minSOCnotified == 1) && (car_SOC > minSOC + 2)) { // reset the alert sent flag when SOC is 2% point higher than threshold can_minSOCnotified = 0; } }
//////////////////////////////////////////////////////////////////////// // net_state_activity() // State Model: Some async data has been received // This is called to indicate to the state that a complete piece of async // data has been received in net_buf (with length net_buf_pos, and mode // net_buf_mode), and the data should be completely handled before // returning. // void net_state_activity() { if (net_buf_mode == NET_BUF_SMS) { // An SMS has arrived, and net_caller has been primed if ((net_reg != 0x01)&&(net_reg != 0x05)) { // Treat this as a network registration net_watchdog=0; // Disable watchdog, as we have connectivity net_reg = 0x05; led_net(1); } net_sms_in(net_caller,net_buf,net_buf_pos); return; } else if (net_buf_mode != NET_BUF_CRLF) { // An IP data message has arrived net_msg_in(net_buf); return; } switch (net_state) { case NET_STATE_DOINIT: if ((net_buf_pos >= 2)&&(net_buf[0] == 'O')&&(net_buf[1] == 'K')) { net_state_enter(NET_STATE_COPS); } break; case NET_STATE_COPS: if ((net_buf_pos >= 2)&&(net_buf[0] == 'O')&&(net_buf[1] == 'K')) net_state_enter(NET_STATE_DONETINIT); // COPS reconnect was OK else if ((net_buf_pos >= 5)&&(net_buf[0] == 'E')&&(net_buf[1] == 'R')) net_state_enter(NET_STATE_SOFTRESET); // Reset the entire async break; case NET_STATE_DONETINIT: if ((net_buf_pos >= 2)&& (net_buf[0] == 'E')&& (net_buf[1] == 'R')&& (net_state_vchar == 5)) // ERROR response to AT+CIFSR { // This is a nasty case. The GPRS has locked up. // The only solution I can find is a hard reset of the modem led_act(0); net_state_enter(NET_STATE_HARDRESET); } else if ((net_buf_pos >= 2)&& (((net_buf[0] == 'O')&&(net_buf[1] == 'K')))|| // OK (((net_buf[0] == 'S')&&(net_buf[1] == 'H')))|| // SHUT OK (net_state_vchar == 5)) // Local IP address { net_buf_pos = 0; net_timeout_ticks = 60; net_link = 0; delay100(1); switch (++net_state_vchar) { case 1: net_puts_rom("AT+CGDCONT=1,\"IP\",\""); net_puts_ram(par_get(PARAM_GPRSAPN)); net_puts_rom("\"\r"); break; case 2: net_puts_rom("AT+CSTT=\""); net_puts_ram(par_get(PARAM_GPRSAPN)); net_puts_rom("\",\""); net_puts_ram(par_get(PARAM_GPRSUSER)); net_puts_rom("\",\""); net_puts_ram(par_get(PARAM_GPRSPASS)); net_puts_rom("\"\r"); break; case 3: net_puts_rom("AT+CIICR\r"); break; case 4: net_puts_rom("AT+CIPHEAD=1\r"); break; case 5: net_puts_rom("AT+CIFSR\r"); break; case 6: net_puts_rom("AT+CLPORT=\"TCP\",\"6867\"\r"); break; case 7: net_puts_rom("AT+CIPSTART=\"TCP\",\""); net_puts_ram(par_get(PARAM_SERVERIP)); net_puts_rom("\",\"6867\"\r"); break; case 8: net_state_enter(NET_STATE_READY); break; } } else if ((net_buf_pos>=7)&& (memcmppgm2ram(net_buf, (char const rom far*)"+CREG: 0", 8) == 0)) { // Lost network connectivity during NETINIT net_state_enter(NET_STATE_SOFTRESET); } else if (memcmppgm2ram(net_buf, (char const rom far*)"+PDP: DEACT", 11) == 0) { // PDP couldn't be activated - try again... net_state_enter(NET_STATE_SOFTRESET); } break; case NET_STATE_READY: if (memcmppgm2ram(net_buf, (char const rom far*)"+CREG", 5) == 0) { // "+CREG" Network registration if (net_buf[8]==',') net_reg = net_buf[9]&0x07; // +CREG: 1,x else net_reg = net_buf[7]&0x07; // +CREG: x if ((net_reg == 0x01)||(net_reg == 0x05)) // Registered to network? { net_watchdog=0; // Disable watchdog, as we have connectivity led_net(1); } else if (net_watchdog == 0) { net_watchdog = 120; // We need connectivity within 120 seconds led_net(0); } } else if (memcmppgm2ram(net_buf, (char const rom far*)"+CLIP", 5) == 0) { // Incoming CALL if ((net_reg != 0x01)&&(net_reg != 0x05)) { // Treat this as a network registration net_watchdog=0; // Disable watchdog, as we have connectivity net_reg = 0x05; led_net(1); } delay100(1); net_puts_rom(NET_HANGUP); net_notify_status(); } else if (memcmppgm2ram(net_buf, (char const rom far*)"CONNECT OK", 10) == 0) { if (net_link == 0) { net_msg_start(); net_msg_register(); net_msg_send(); } net_link = 1; } else if (memcmppgm2ram(net_buf, (char const rom far*)"STATE: ", 7) == 0) { // Incoming CIPSTATUS if (memcmppgm2ram(net_buf, (char const rom far*)"STATE: CONNECT OK", 17) == 0) { if (net_link == 0) { net_msg_start(); net_msg_register(); net_msg_send(); } net_link = 1; } else { net_link = 0; if ((net_reg == 0x01)||(net_reg == 0x05)) { // We have a GSM network, but CIPSTATUS is not up net_msg_disconnected(); net_state_enter(NET_STATE_DONETINIT); } } } else if (memcmppgm2ram(net_buf, (char const rom far*)"SEND OK", 7) == 0) { net_msg_sendpending = 0; } else if ( (memcmppgm2ram(net_buf, (char const rom far*)"SEND FAIL", 9) == 0)|| (memcmppgm2ram(net_buf, (char const rom far*)"CLOSED", 6) == 0)|| (memcmppgm2ram(net_buf, (char const rom far*)"+CME ERROR", 10) == 0)|| (memcmppgm2ram(net_buf, (char const rom far*)"+PDP: DEACT", 11) == 0) ) { // Various GPRS error results // Re-initialize GPRS network and TCP socket net_msg_disconnected(); net_state_enter(NET_STATE_DONETINIT); } break; } }