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); } }
BOOL net_sms_handle_gsmlockq(char *caller, char *command, char *arguments) { char *p; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); net_puts_rom("GSMLOCK: "); p = par_get(PARAM_GSMLOCK); if (*p == 0) { net_puts_rom("(none)\r\n"); } else { net_puts_ram(p); net_puts_rom("\r\n"); } stp_s(net_scratchpad, "Current: ", car_gsmcops); net_puts_ram(net_scratchpad); return TRUE; }
// Register to the NET OVMS server void net_msg_register(void) { char k; char *p; unsigned int sr; // Make a (semi-)random client token sr = TMR0L*256; sr += TMR0H; for (k=0;k<8;k++) { sr += can_databuffer[k]; } srand(sr); for (k=0;k<TOKEN_SIZE;k++) { token[k] = cb64[rand()%64]; } token[TOKEN_SIZE] = 0; p = par_get(PARAM_SERVERPASS); hmac_md5(token, TOKEN_SIZE, p, strlen(p), digest); net_puts_rom("MP-C 0 "); net_puts_ram(token); net_puts_rom(" "); base64encodesend(digest, MD5_SIZE); net_puts_rom(" "); p = par_get(PARAM_VEHICLEID); net_puts_ram(p); net_puts_rom("\r\n"); }
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"); }
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_params(char* number) { unsigned char k; char *p; net_send_sms_start(number); net_puts_rom("Params:"); for (k=0;k<PARAM_MAX;k++) { sprintf(net_scratchpad, (rom far char*)" %u:", k); net_puts_ram(net_scratchpad); net_puts_ram(par_get(k)); } net_puts_rom("\x1a"); }
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_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"); }
void net_send_sms_start(char* number) { net_puts_rom("AT+CMGS=\""); net_puts_ram(number); net_puts_rom("\"\r\n"); delay100(2); }
BOOL net_sms_handle_gprsq(char *caller, char *command, char *arguments) { char *s; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); s = stp_rom(net_scratchpad, "GPRS:"); s = stp_s(s, "\r\n APN:", par_get(PARAM_GPRSAPN)); s = stp_s(s, "\r\n User:"******"\r\n Password:"******"\r\n GSM:", car_gsmcops); if (!inputs_gsmgprs()) s = stp_rom(s, "\r\n GPRS: DISABLED"); else if (net_msg_serverok) s = stp_rom(s, "\r\n GPRS: OK\r\n Server: Connected OK"); else if (net_state == NET_STATE_READY) s = stp_rom(s, "\r\n GSM: OK\r\n Server: Not connected"); else { s = stp_x(s, "\r\n GSM/GPRS: Not connected (0x", net_state); s = stp_rom(s, ")"); } net_puts_ram(net_scratchpad); return TRUE; }
void net_send_sms_ram(char* number, const char* message) { if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return; net_send_sms_start(number); net_puts_ram(message); net_send_sms_finish(); }
void net_sms_params(char* number) { unsigned char k; char *p; #ifdef OVMS_SUPPRESS_OUTGOING_SMS return; #endif net_send_sms_start(number); net_puts_rom("Params:"); for (k=0;k<PARAM_MAX;k++) { sprintf(net_scratchpad, (rom far char*)" %u:", k); net_puts_ram(net_scratchpad); net_puts_ram(par_get(k)); } net_puts_rom("\x1a"); }
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 }
BOOL net_sms_handle_passq(char *caller, char *command, char *arguments) { char *p = par_get(PARAM_MODULEPASS); if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); stp_s(net_scratchpad, "Module password: ", p); net_puts_ram(net_scratchpad); return TRUE; }
BOOL net_sms_handle_registerq(char *caller, char *command, char *arguments) { char *p = par_get(PARAM_REGPHONE); if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); stp_s(net_scratchpad, "Registered number: ", p); net_puts_ram(net_scratchpad); return TRUE; }
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_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_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(); }
BOOL net_sms_handle_vehicleq(char *caller, char *command, char *arguments) { char *s; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); s = stp_rom(net_scratchpad, "Vehicle:"); s = stp_vehicletype(s); net_puts_ram(net_scratchpad); return TRUE; }
BOOL net_sms_handle_vehicleq(char *caller, char *command, char *arguments) { char *s; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); s = stp_rom(net_scratchpad, "Vehicle:"); s = stp_s(s, "\r\n VehicleType: ", par_get(PARAM_VEHICLETYPE)); net_puts_ram(net_scratchpad); return TRUE; }
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; }
// Encode the message in net_scratchpad and start the send process void net_msg_encode_puts(void) { int k; char code; if (net_state == NET_STATE_DIAGMODE) { net_puts_ram(net_scratchpad); } else { if ((ptokenmade==1)&& (net_scratchpad[5]!='E')&& (net_scratchpad[5]!='A')&& (net_scratchpad[5]!='a')&& (net_scratchpad[5]!='g')&& (net_scratchpad[5]!='P')) { // We must convert the message to a paranoid one... // The message in net_scratchpad is of the form MP-0 X... // Where X is the code and ... is the (optional) data // Let's rebuild it in the net_msg_scratchpad... code = net_scratchpad[5]; strcpy(net_msg_scratchpad,net_scratchpad+6); // Paranoid encrypt the message part of the transaction RC4_setup(&pm_crypto1, &pm_crypto2, pdigest, MD5_SIZE); for (k=0;k<1024;k++) { net_scratchpad[0] = 0; RC4_crypt(&pm_crypto1, &pm_crypto2, net_scratchpad, 1); } k=strlen(net_msg_scratchpad); RC4_crypt(&pm_crypto1, &pm_crypto2, net_msg_scratchpad, k); strcpypgm2ram(net_scratchpad,(char const rom far*)"MP-0 EM"); net_scratchpad[7] = code; base64encode(net_msg_scratchpad,k,net_scratchpad+8); // The messdage is now in paranoid mode... } k=strlen(net_scratchpad); RC4_crypt(&tx_crypto1, &tx_crypto2, net_scratchpad, k); base64encodesend(net_scratchpad,k); } net_puts_rom("\r\n"); }
BOOL net_sms_handle_diag(char *caller, char *command, char *arguments) { char *s; if (sys_features[FEATURE_CARBITS] & FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); s = stp_rom(net_scratchpad, "DIAG:"); s = stp_i(s, "\n RED Led:", led_code[OVMS_LED_RED]); s = stp_i(s, "\n GRN Led:", led_code[OVMS_LED_GRN]); s = stp_x(s, "\n NET State:0x", net_state); if (car_12vline > 0) { s = stp_l2f(s, "\n 12V Line:", car_12vline, 1); s = stp_l2f(s, " ref=", car_12vline_ref, 1); } #ifndef OVMS_NO_CRASHDEBUG /* DEBUG / QA stats: output crash counter and decode last reason: */ s = stp_i(s, "\n Crashes:", debug_crashcnt); if (debug_crashreason) { s = stp_rom(s, "\n ..last:"); if (debug_crashreason & 0x01) s = stp_rom(s, " BOR"); // Brown Out Reset if (debug_crashreason & 0x02) s = stp_rom(s, " POR"); // Power On Reset if (debug_crashreason & 0x04) s = stp_rom(s, " PD"); // Power-Down Detection if (debug_crashreason & 0x08) s = stp_rom(s, " TO"); // Watchdog Timeout if (debug_crashreason & 0x10) s = stp_rom(s, " RI"); // Reset Instruction if (debug_crashreason & 0x20) s = stp_rom(s, " STKFUL"); // Stack overflow if (debug_crashreason & 0x40) s = stp_rom(s, " STKUNF"); // Stack underflow s = stp_i(s, " - ", debug_checkpoint); } #endif // OVMS_NO_CRASHDEBUG net_puts_ram(net_scratchpad); return TRUE; }
BOOL net_sms_handle_temps(char *caller, char *command, char *arguments) { char *s; s = stp_i(net_scratchpad, "Temperatures:\r\n Ambient: ", car_ambient_temp); s = stp_i(s, "C\r\n PEM: ", car_tpem); s = stp_i(s, "C\r\n Motor: ", car_tmotor); s = stp_i(s, "C\r\n Battery: ", car_tbattery); s = stp_rom(s, "C"); if ((car_stale_ambient==0)||(car_stale_temps==0)) s = stp_rom(s, "\r\n (stale)"); net_send_sms_start(caller); net_puts_ram(net_scratchpad); return TRUE; }
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; }
BOOL net_sms_handle_serverq(char *caller, char *command, char *arguments) { char *s; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); s = stp_rom(net_scratchpad, "Server:"); s = stp_s(s, "\r\n IP:", par_get(PARAM_SERVERIP)); s = stp_s(s, "\r\n Password:"******"\r\n Paranoid:", par_get(PARAM_PARANOID)); net_puts_ram(net_scratchpad); return TRUE; }
BOOL net_sms_handle_moduleq(char *caller, char *command, char *arguments) { char *s; if (sys_features[FEATURE_CARBITS]&FEATURE_CB_SOUT_SMS) return FALSE; net_send_sms_start(caller); s = stp_rom(net_scratchpad, "Module:"); s = stp_s(s, "\r\n VehicleID:", par_get(PARAM_VEHICLEID)); s = stp_s(s, "\r\n Units:", par_get(PARAM_MILESKM)); s = stp_s(s, "\r\n Notifications:", par_get(PARAM_NOTIFIES)); s = stp_s(s, "\r\n VehicleType:", par_get(PARAM_VEHICLETYPE)); net_puts_ram(net_scratchpad); return TRUE; }
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); }
BOOL net_sms_handle_version(char *caller, char *command, char *arguments) { unsigned char hwv = 1; char *s; #ifdef OVMS_HW_V2 hwv = 2; #endif s = stp_i(net_scratchpad, "OVMS Firmware version: ", ovms_firmware[0]); s = stp_i(s, ".", ovms_firmware[1]); s = stp_i(s, ".", ovms_firmware[2]); s = stp_s(s, "/", par_get(PARAM_VEHICLETYPE)); if (vehicle_version) s = stp_rom(s, vehicle_version); s = stp_i(s, "/V", hwv); net_send_sms_start(caller); net_puts_ram(net_scratchpad); return TRUE; }