diff --git a/OpenTracker/OpenTracker.ino b/OpenTracker/OpenTracker.ino index 919f3b6..537764c 100644 --- a/OpenTracker/OpenTracker.ino +++ b/OpenTracker/OpenTracker.ino @@ -32,6 +32,7 @@ int SEND_DATA = 1; long time_start, time_stop, time_diff; //count execution time to trigger interval int interval_count = 0; //current interval count (increased on each data collection and reset after sending) int sms_check_count = 0; //counter for SMS check (increased on each cycle and reset after check) +int engine_off_send_count = 0; //counter for sending data when the ignition is off char data_current[DATA_LIMIT+1]; //data collected in one go, max 2500 chars int data_index = 0; //current data index (where last data record stopped) @@ -207,7 +208,7 @@ void loop() { // force sending last data interval_count = config.interval_send; collect_data(IGNT_STAT); - send_data(); + send_data(0); } engineRunning = 1; // save power when engine is off @@ -242,7 +243,9 @@ void loop() { //start counting time time_start = millis(); - if(ALWAYS_ON || IGNT_STAT == 0) { + if(ALWAYS_ON || IGNT_STAT == 0 || (ENGINE_OFF_INTERVAL_COUNT >0 && ++engine_off_send_count >= ENGINE_OFF_INTERVAL_COUNT)) { + engine_off_send_count = 0; + if(IGNT_STAT == 0) { debug_print(F("Ignition is ON!")); // Insert here only code that should be processed when Ignition is ON @@ -250,7 +253,7 @@ void loop() { //collecting GPS data collect_data(IGNT_STAT); - send_data(); + send_data(IGNT_STAT); #if SMS_CHECK_INTERVAL_ENGINE_RUNNING > 0 // perform SMS check @@ -288,8 +291,10 @@ void loop() { } #endif } - - status_led(); + + if (ENABLE_STATUS_LED) { + status_led(); + } debug_check_input(); diff --git a/OpenTracker/data.ino b/OpenTracker/data.ino index c6cf576..3908ca2 100644 --- a/OpenTracker/data.ino +++ b/OpenTracker/data.ino @@ -183,12 +183,25 @@ void collect_all_data(int ignitionState) { data_field_restart(); // append battery level to data packet - if(DATA_INCLUDE_BATTERY_LEVEL) { - data_field_separator(','); + if(DATA_INCLUDE_BATTERY_LEVEL || BATTERY_LOW_KILL_POWER > 0) { float sensorValue = analog_input_voltage(AIN_S_INLEVEL, HIGH); char batteryLevel[10]; dtostrf(sensorValue,2,2,batteryLevel); - data_append_string(batteryLevel); + + if (DATA_INCLUDE_BATTERY_LEVEL) { + data_field_separator(','); + data_append_string(batteryLevel); + } + + if (BATTERY_LOW_KILL_POWER > 0 && sensorValue < BATTERY_LOW_KILL_POWER) { + if (strlen(BATTERY_LOW_SMS_NUMBER) >0) { + char buf[100]; + snprintf((char *)&buf, sizeof(buf), "voltage dropped below %s - powering off", batteryLevel); + sms_send_msg(buf, BATTERY_LOW_SMS_NUMBER); + } + + power_cutoff = 1; + } } // ignition state @@ -297,7 +310,7 @@ void collect_all_data_raw(int ignitionState) { /** * This function send collected data using HTTP or TCP */ -void send_data() { +void send_data(int force) { debug_print(F("send_data() started")); debug_print(F("Current:")); @@ -306,7 +319,11 @@ void send_data() { interval_count++; debug_print(F("Data accumulated:")); debug_print(interval_count); - + + if (force) { + interval_count = config.interval_send; + } + // send accumulated data if (interval_count >= config.interval_send) { // if data send disabled, use storage diff --git a/OpenTracker/sms.ino b/OpenTracker/sms.ino index 35519bc..d265a59 100644 --- a/OpenTracker/sms.ino +++ b/OpenTracker/sms.ino @@ -288,8 +288,10 @@ void sms_cmd_run(char *cmd, char *phone) { if(strcmp(cmd, "locate") == 0) { debug_print(F("sms_cmd_run(): Locate command detected")); - if(LOCATE_COMMAND_FORMAT_IOS) { + if(LOCATE_COMMAND_FORMAT_IOS == 1) { snprintf(msg,sizeof(msg),"comgooglemaps://?center=%s,%s",lat_current,lon_current); + } else if(LOCATE_COMMAND_FORMAT_IOS == 2) { + snprintf(msg,sizeof(msg),"maps:ll=%s,%s&q=car",lat_current,lon_current); } else { snprintf(msg,sizeof(msg),"https://maps.google.com/maps/place/%s,%s",lat_current,lon_current); } diff --git a/OpenTracker/tracker.h.example b/OpenTracker/tracker.h.example index 9417f07..c95d045 100644 --- a/OpenTracker/tracker.h.example +++ b/OpenTracker/tracker.h.example @@ -8,6 +8,7 @@ //default settings (can be overwritten and stored in EEPRom) #define INTERVAL 5000 //how often to collect data (milli sec, 600000 - 10 mins) #define INTERVAL_SEND 4 //how many times to collect data before sending (times), sending interval interval*interval_send (4 default) +#define ENGINE_OFF_INTERVAL_COUNT 3600 //how often to send data when the ignition is off #define POWERSAVE 1 //enable power saving mode with engine off (turn off modem data session, slow down CPU) #define KEY "cSQ88qShwC3" //key for connection, will be sent with every data transmission - max 12 chars #define DATA_LIMIT 2500 //current data limit, data collected before sending to remote server can not exceed this @@ -19,7 +20,7 @@ #define SMS_CHECK_INTERVAL_COUNT 6 // 0=disable SMS check with engine off, 1-N=check every N cycles of interval time #define SMS_CHECK_INTERVAL_ENGINE_RUNNING 2 // 0=disable SMS check with engine running, 1-N=check every N cycles of interval time -#define LOCATE_COMMAND_FORMAT_IOS 0 // 1=google maps links will be sent as comgooglemaps://, 0=use format https://maps.google... +#define LOCATE_COMMAND_FORMAT_IOS 0 // 0=use format https://maps.google... 1=google maps links will be sent as comgooglemaps://, 2=apple maps format #define GSM_USE_QUECLOCATOR_TIMEOUT 10 // 0=don't use QuecLocator, 1-300=timeout for server reply #define GSM_USE_NTP_SERVER "pool.ntp.org" // use Network Time Protocol server for modem clock update (undefine to disable) @@ -102,3 +103,7 @@ #define KNOWN_APN_SCAN_MODE 1 // 0=check GPRS context only, 2=attempt only server connection, 1=use both in sequence #define KNOWN_APN_SCAN_USE_RESET 0 // 1=reset modem to change APN, 0=change APN without reset +#define ENABLE_STATUS_LED 1 + +#define BATTERY_LOW_KILL_POWER 0 // shutdown if the battery falls below this voltage, 0 = disabled +#define BATTERY_LOW_SMS_NUMBER "" // send SMS to this number before shutting down (blank = disabled)