// Start to send a net msg void net_msg_start(void) { net_msg_sendpending = 1; delay100(5); net_puts_rom("AT+CIPSEND\r"); delay100(10); }
// Start to send a net msg void net_msg_start(void) { if (net_state == NET_STATE_DIAGMODE) { net_puts_rom("# "); } else { net_msg_sendpending = 1; delay100(5); net_puts_rom("AT+CIPSEND\r"); delay100(10); } }
void net_sms_socalert(char* number) { char *s; delay100(10); net_send_sms_start(number); s = stp_i(net_scratchpad, "ALERT!!! CRITICAL SOC LEVEL APPROACHED (", car_SOC); // 95% s = stp_rom(s, "% SOC)"); net_puts_ram(net_scratchpad); net_send_sms_finish(); delay100(5); }
void net_msg_reply_ussd(char *buf, unsigned char buflen) { // called from net_state_activity() // buf contains a "+CUSD:" USSD command result // parse and return as command reply: char *s, *t = NULL; // Server not ready? abort // TODO: store, resend when server is connected if ((!net_msg_serverok) || (!buf) || (!buflen)) return; // isolate USSD reply text if (t = memchr((void *) buf, '"', buflen)) { ++t; buflen -= (t - buf); buf = t; // start of USSD string while ((*t) && (*t != '"') && ((t - buf) < buflen)) { if (*t == ',') // "escape" comma for MP-0 *t = '.'; t++; } *t = 0; // end of USSD string } // format reply: s = stp_i(net_scratchpad, "MP-0 c", CMD_SendUSSD); if (t) s = stp_s(s, ",0,", buf); else s = stp_rom(s, ",1,Invalid USSD result"); // send reply: if (net_msg_sendpending > 0) { delay100(20); // HACK... should buffer & retry later... but RAM is precious s = NULL; // flag } net_msg_start(); net_msg_encode_puts(); net_msg_send(); if (!s) delay100(20); // HACK: give modem additional time if there was sendpending>0 }
BOOL net_sms_handle_paramsq(char *caller, char *command, char *arguments) { unsigned char k, splen, msglen; char *p, *s; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); net_puts_rom("Params:"); msglen=7; for (k=0; k<PARAM_MAX; k++) { p = par_get(k); if (*p != 0) { s = stp_i(net_scratchpad, "\n", k); s = stp_s(s, ":", p); splen = s - net_scratchpad; if((msglen+splen) > 160) { // SMS becomes too long, finish & start next: net_send_sms_finish(); delay100(20); net_send_sms_start(caller); net_puts_rom("Params:"); msglen=7+splen; } net_puts_ram(net_scratchpad); } } return TRUE; }
void net_send_sms_start(char* number) { if (net_state == NET_STATE_DIAGMODE) { // DIAG mode: screen output net_puts_rom("# "); } else if (net_msg_bufpos) { // NET SMS wrapper mode: nothing to do here // net_put* will write to net_msg_bufpos } else { // MODEM mode: net_puts_rom("AT+CMGS=\""); net_puts_ram(number); net_puts_rom("\"\r\n"); delay100(2); } if ((car_time > 315360000)&& ((sys_features[FEATURE_CARBITS]&FEATURE_CB_SSMSTIME)==0)) { // Car time is valid, and sms time is not disabled char *p = par_get(PARAM_TIMEZONE); char *s = stp_time(net_scratchpad, NULL, car_time + timestring_to_mins(p)*60L); s = stp_rom(s, "\r "); net_puts_ram(net_scratchpad); } }
void net_send_sms_start(char* number) { net_puts_rom("AT+CMGS=\""); net_puts_ram(number); net_puts_rom("\"\r\n"); delay100(2); }
//////////////////////////////////////////////////////////////////////// // net_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 net_state_ticker60(void) { switch (net_state) { case NET_STATE_READY: if (net_msg_sendpending>0) { net_granular_tick -= 5; // Try again in 5 seconds... return; } if ((net_link==1)&&(net_apps_connected>0)) { net_msg_start(); net_msg_stat(); net_msg_gps(); net_msg_tpms(); net_msg_environment(); net_msg_send(); } net_state_vchar = net_state_vchar ^ 1; delay100(2); net_puts_rom(NET_CREG_CIPSTATUS); break; } }
void net_msg_cmd_do(void) { CHECKPOINT(0x44) delay100(2); // commands 40-49 are special AT commands, thus, disable net_msg here if ((net_msg_cmd_code < 40) || (net_msg_cmd_code > 49)) net_msg_start(); // Execute cmd: ask car module to execute first: if ((vehicle_fn_commandhandler == NULL)|| (! vehicle_fn_commandhandler(TRUE, net_msg_cmd_code,net_msg_cmd_msg))) { // Car module does not feel responsible, fall back to standard: if( !net_msg_cmd_exec() ) { // No standard as well => return "unimplemented" STP_UNIMPLEMENTED(net_scratchpad, net_msg_cmd_code); net_msg_encode_puts(); } } // terminate IPSEND by Ctrl-Z (should this be disabled for commands 40-49 as well?) net_msg_send(); #ifdef OVMS_ACCMODULE acc_handle_msg(TRUE, net_msg_cmd_code, net_msg_cmd_msg); #endif // clear command net_msg_cmd_code = 0; net_msg_cmd_msg[0] = 0; }
void net_sms_12v_alert(char* number) { char *s; delay100(10); net_send_sms_start(number); if (can_minSOCnotified & CAN_MINSOC_ALERT_12V) s = stp_l2f(net_scratchpad, "MP-0 PAALERT!!! 12V BATTERY CRITICAL (", car_12vline, 1); else s = stp_l2f(net_scratchpad, "MP-0 PA12V BATTERY OK (", car_12vline, 1); s = stp_l2f(s, "V, ref=", car_12vline_ref, 1); s = stp_rom(s, "V)"); net_puts_ram(net_scratchpad); net_send_sms_finish(); delay100(5); }
void net_msg_alert(void) { char *s; delay100(2); s = stp_rom(net_scratchpad, "MP-0 PA"); net_prep_stat(s); }
void net_msg_alarm(void) { char *p; delay100(2); net_msg_start(); strcpypgm2ram(net_scratchpad,(char const rom far*)"MP-0 PAVehicle alarm is sounding!"); net_msg_encode_puts(); net_msg_send(); }
void net_msg_valettrunk(void) { char *p; delay100(2); net_msg_start(); strcpypgm2ram(net_scratchpad,(char const rom far*)"MP-0 PATrunk has been opened (valet mode)."); net_msg_encode_puts(); net_msg_send(); }
void net_sms_alarm(char* number) { char *p; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return; delay100(2); net_send_sms_start(number); net_puts_rom(NET_MSG_ALARM); net_send_sms_finish(); }
void net_msg_socalert(void) { char *s; delay100(2); net_msg_start(); s = stp_i(net_scratchpad, "MP-0 PAALERT!!! CRITICAL SOC LEVEL APPROACHED (", car_SOC); // 95% s = stp_rom(s, "% SOC)"); net_msg_encode_puts(); net_msg_send(); }
void net_sms_valettrunk(char* number) { char *p; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return; delay100(2); net_send_sms_start(number); net_puts_rom(NET_MSG_VALETTRUNK); net_send_sms_finish(); }
void net_msg_erroralert(unsigned int errorcode, unsigned long errordata) { char *s; delay100(2); net_msg_start(); s = stp_s(net_scratchpad, "MP-0 PE", car_type); s = stp_ul(s, ",", (unsigned long)errorcode); s = stp_ul(s, ",", (unsigned long)errordata); net_msg_encode_puts(); net_msg_send(); }
void net_sms_gps(char* number) { delay100(2); net_send_sms_start(number); net_puts_rom(NET_MSG_GOOGLEMAPS); format_latlon(car_latitude,net_scratchpad); net_puts_ram(net_scratchpad); net_puts_rom(","); format_latlon(car_longitude,net_scratchpad); net_puts_ram(net_scratchpad); net_puts_rom("\x1a"); }
void net_sms_stat(char* number) { char *p; #ifdef OVMS_SUPPRESS_OUTGOING_SMS return; #endif delay100(2); net_send_sms_start(number); switch (car_chargemode) { case 0x00: net_puts_rom("Standard - "); // Charge Mode Standard break; case 0x01: net_puts_rom("Storage - "); // Storage break; case 0x03: net_puts_rom("Range - "); // Range break; case 0x04: net_puts_rom("Performance - "); // Performance } switch (car_chargestate) { case 0x01: net_puts_rom("Charging"); // Charge State Charging break; case 0x02: net_puts_rom("Charging, Topping off"); // Topping off break; case 0x04: net_puts_rom("Charging Done"); // Done break; default: net_puts_rom("Charging Stopped"); // Stopped } net_puts_rom(" \rIdeal Range: "); // Ideal Range p = par_get(PARAM_MILESKM); if (*p == 'M') // Kmh or Miles sprintf(net_scratchpad, (rom far char*)"%u mi", car_idealrange); // Miles else sprintf(net_scratchpad, (rom far char*)"%u Km", (unsigned int) (((float) car_idealrange * 1.609))+0.5); // Kmh net_puts_ram(net_scratchpad); net_puts_rom(" \rSOC: "); sprintf(net_scratchpad, (rom far char*)"%u%%", car_SOC); // 95% net_puts_ram(net_scratchpad); net_puts_rom("\x1a"); }
BOOL net_sms_stat(char* number) { if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; delay100(2); net_send_sms_start(number); net_prep_stat(net_scratchpad); cr2lf(net_scratchpad); net_puts_ram(net_scratchpad); return TRUE; }
void net_msg_alert(void) { char *p; delay100(2); net_msg_start(); strcpypgm2ram(net_scratchpad,(char const rom far*)"MP-0 PA"); switch (car_chargemode) { case 0x00: strcatpgm2ram(net_scratchpad,(char const rom far *)"Standard - "); // Charge Mode Standard break; case 0x01: strcatpgm2ram(net_scratchpad,(char const rom far *)"Storage - "); // Storage break; case 0x03: strcatpgm2ram(net_scratchpad,(char const rom far *)"Range - "); // Range break; case 0x04: strcatpgm2ram(net_scratchpad,(char const rom far *)"Performance - "); // Performance } switch (car_chargestate) { case 0x01: strcatpgm2ram(net_scratchpad,(char const rom far *)"Charging"); // Charge State Charging break; case 0x02: strcatpgm2ram(net_scratchpad,(char const rom far *)"Charging, Topping off"); // Topping off break; case 0x04: strcatpgm2ram(net_scratchpad,(char const rom far *)"Charging Done"); // Done break; default: strcatpgm2ram(net_scratchpad,(char const rom far *)"Charging Stopped"); // Stopped } strcatpgm2ram(net_scratchpad,(char const rom far *)"\rIdeal Range: "); // Ideal Range p = par_get(PARAM_MILESKM); if (*p == 'M') // Kmh or Miles sprintf(net_msg_scratchpad, (rom far char*)"%u mi", car_idealrange); // Miles else sprintf(net_msg_scratchpad, (rom far char*)"%u Km", (unsigned int) ((float) car_idealrange * 1.609)); // Kmh strcat((char*)net_scratchpad,net_msg_scratchpad); strcatpgm2ram(net_scratchpad,(char const rom far *)" SOC: "); sprintf(net_msg_scratchpad, (rom far char*)"%u%%", car_SOC); // 95% strcat(net_scratchpad,net_msg_scratchpad); net_msg_encode_puts(); net_msg_send(); }
void net_send_sms_start(char* number) { if (net_state == NET_STATE_DIAGMODE) { net_puts_rom("# "); } else { net_puts_rom("AT+CMGS=\""); net_puts_ram(number); net_puts_rom("\"\r\n"); delay100(2); } }
void net_sms_alert(char* number, alert_type alert) { if (sys_features[FEATURE_CARBITS]&(FEATURE_CB_SOUT_SMS|FEATURE_CB_SVALERTS)) return; delay100(2); net_send_sms_start(number); net_prep_alert(net_scratchpad, alert); cr2lf(net_scratchpad); net_puts_ram(net_scratchpad); net_send_sms_finish(); }
void net_msg_12v_alert(void) { char *s; delay100(2); net_msg_start(); if (can_minSOCnotified & CAN_MINSOC_ALERT_12V) s = stp_l2f(net_scratchpad, "MP-0 PAALERT!!! 12V BATTERY CRITICAL (", car_12vline, 1); else s = stp_l2f(net_scratchpad, "MP-0 PA12V BATTERY OK (", car_12vline, 1); s = stp_l2f(s, "V, ref=", car_12vline_ref, 1); s = stp_rom(s, "V)"); net_msg_encode_puts(); net_msg_send(); }
BOOL net_sms_ctp(char* number, char *arguments) { char *p; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; delay100(2); net_send_sms_start(number); net_prep_ctp(net_scratchpad, arguments); cr2lf(net_scratchpad); net_puts_ram(net_scratchpad); return TRUE; }
void net_sms_gps(char* number) { #ifdef OVMS_SUPPRESS_OUTGOING_SMS return; #endif delay100(2); net_send_sms_start(number); net_puts_rom(NET_MSG_GOOGLEMAPS); format_latlon(car_latitude,net_scratchpad); net_puts_ram(net_scratchpad); net_puts_rom(","); format_latlon(car_longitude,net_scratchpad); net_puts_ram(net_scratchpad); net_puts_rom("\x1a"); }
BOOL net_sms_handle_gps(char *caller, char *command, char *arguments) { char *s; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; delay100(2); net_send_sms_start(caller); s = stp_latlon(net_scratchpad, NET_MSG_GOOGLEMAPS, car_latitude); s = stp_latlon(s, ",", car_longitude); net_puts_ram(net_scratchpad); return TRUE; }
void net_msg_forward_sms(char *caller, char *SMS) { //Server not ready, stop sending //TODO: store this message inside buffer, resend it when server is connected if ((net_msg_serverok == 0)||(net_msg_sendpending)>0) return; delay100(2); net_msg_start(); strcpypgm2ram(net_scratchpad,(char const rom far*)"MP-0 PA"); strcatpgm2ram(net_scratchpad,(char const rom far*)"SMS FROM: "); strcat(net_scratchpad, caller); strcatpgm2ram(net_scratchpad,(char const rom far*)" - MSG: "); SMS[70]=0; // Hacky limit on the max size of an SMS forwarded strcat(net_scratchpad, SMS); net_msg_encode_puts(); net_msg_send(); }
void net_send_sms_start(char* number) { if (net_msg_bufpos) { // NET SMS wrapper mode: nothing to do here // net_put* will write to net_msg_bufpos } #ifdef OVMS_DIAGMODULE else if (net_state == NET_STATE_DIAGMODE) { // DIAG mode: screen output net_msg_sendpending = 1; net_puts_rom("# "); } #endif // OVMS_DIAGMODULE else { // MODEM mode: net_puts_rom("AT+CMGS=\""); net_puts_ram(number); net_puts_rom("\"\r\n"); delay100(2); } // ATT: the following code tries to prepend the current time to ALL // outbound SMS. It relies on a) all SMS leaving enough space // to add "HH:MM:SS\r " = 10 chars and b) ALL SMS senders to // call net_send_sms_start() BEFORE preparing the message in // net_scratchpad -- otherwise the prepd message is lost. #ifndef OVMS_NO_SMSTIME if ((car_time > 315360000)&& ((sys_features[FEATURE_CARBITS]&FEATURE_CB_SSMSTIME)==0)) { // Car time is valid, and sms time is not disabled char *p = par_get(PARAM_TIMEZONE); char *s = stp_time(net_scratchpad, NULL, car_time + timestring_to_mins(p)*60L); s = stp_rom(s, "\r "); net_puts_ram(net_scratchpad); } #endif //OVMS_NO_SMSTIME }
void net_msg_reply_ussd(char *buf) { // called from net_state_activity() // buf contains a "+CUSD:" USSD command result // parse and return as command reply: char *s, *t = NULL; // Server not ready? abort // TODO: store, resend when server is connected if ((!net_msg_serverok) || (!buf)) return; // isolate USSD reply text if (t = strchr(buf, '"')) { buf = ++t; // start of USSD string while ((*t) && (*t != '"')) { if (*t == ',') // replace comma *t = '.'; t++; } *t = 0; // end of USSD string } // format reply: s = stp_i(net_scratchpad, "MP-0 c", CMD_SendUSSD); if (t) s = stp_s(s, ",0,", buf); else s = stp_rom(s, ",1,Invalid USSD result"); // send reply: if (net_msg_sendpending > 0) delay100(20); // HACK... should abort, buffer & retry later... net_msg_start(); net_msg_encode_puts(); net_msg_send(); }