From 4f4bba55f1deaa30b47f318abfa109d4285b2e96 Mon Sep 17 00:00:00 2001 From: eKa Date: Fri, 24 Jan 2020 22:44:50 +0500 Subject: [PATCH] EEPROM version --- watchdog_3-leonardo.ino | 486 +++++++++++++++++++++++++++++----------- watchdog_3.h | 123 +++++----- 2 files changed, 434 insertions(+), 175 deletions(-) diff --git a/watchdog_3-leonardo.ino b/watchdog_3-leonardo.ino index 4ee336e..78e5b49 100644 --- a/watchdog_3-leonardo.ino +++ b/watchdog_3-leonardo.ino @@ -8,14 +8,15 @@ GPRS modem(Serial1, MOD_PWR); bool modemOK = false; byte modemErrCount = 0; -DHT dht(T_PIN, DHT11); +DHT11 tSensor(T_PIN); char command[CMD_SIZE]; char message[SMS_SIZE]; char phone[PHONE_SIZE]; char datetime[DATE_SIZE]; -char s_buffer[BUFFER_SIZE]; +char s_buffer[SHORT_BUFFER_SIZE]; char l_buffer[LONG_BUFFER_SIZE]; +char vl_buffer[SMS_SIZE + 80]; bool cmdFromModem = false; @@ -28,22 +29,22 @@ byte btnCount = 0; bool btnTrigger = false; byte event; -const float r12_1 = 20000; // 20K -const float r12_2 = 10000; // 10K -const float r5_1 = 10000; // 20K -const float r5_2 = 10000; // 10K -const float rbat_1 = 10000; // 10K -const float rbat_2 = 10000; // 10K -const float rout_1 = 10000; // 10K -const float rout_2 = 10000; // 10K +const float rin_1 = 200000; // 200K +const float rin_2 = 100000; // 100K +const float rbat_1 = 100000; // 100K +const float rbat_2 = 100000; // 100K +const float rusb_1 = 100000; // 100K +const float rusb_2 = 100000; // 100K float vcc = 0.0; -float k12, k5, kbat, kout; -float v12, v5, vbat, vout; +float kin, kbat, kusb; +float vin, vbat, vusb; // эту константу (typVbg) необходимо откалибровать индивидуально const float typVbg = 1.08; // 1.0 -- 1.2 +#ifdef MAIN + void setup() { Serial.begin(COM_BR); Serial1.begin(MOD_BR); @@ -52,23 +53,22 @@ void setup() { // Конфигурируем пины pinMode(A_PIN, INPUT); - pinMode(V5_PIN, INPUT); - pinMode(V12_PIN, INPUT); + pinMode(BAT_T_PIN, INPUT); + pinMode(VIN_PIN, INPUT); pinMode(VBAT_PIN, INPUT); - pinMode(VOUT_PIN, INPUT); + pinMode(VUSB_PIN, INPUT); pinMode(LED_PIN, OUTPUT); pinMode(BTN_PIN, INPUT); pinMode(FAN_PIN, OUTPUT); // Инициализируем климатический сенсор - dht.begin(); + tSensor.begin(); // Коэффициенты делителей напряжений - k12 = r12_2 / (r12_1 + r12_2); - k5 = r5_2 / (r5_1 + r5_2); + kin = rin_2 / (rin_1 + rin_2); kbat = rbat_2 / (rbat_1 + rbat_2); - kout = rout_2 / (rout_1 + rout_2); + kusb = rusb_2 / (rusb_1 + rusb_2); modem.controlGPIO(1, 0); modem.controlGPIO(2, 0); @@ -77,17 +77,13 @@ void setup() { sprint("Init"); printParams(); - sprint_P(str_help); - - initEEPROM(); + printHelp(); } void loop() { - - if (millis() - t > PERIOD) { + if (millis() - t < PERIOD) { getStatus(); t = millis(); - //sprint("Status!"); } checkModem(); @@ -100,59 +96,60 @@ void loop() { sprint(">", false); sprint(command); - if (!strcmp_P(command, cmd_status)) { + if (isCommandMatchIndex(command, CMD_INDEX_STATUS)) { + //printAll(); getStatusMessage(message); returnAnswer(message); - } else if (!strcmp_P(command, cmd_help)) { - sprint_P(str_help); + } else if (isCommandMatchIndex(command, CMD_INDEX_HELP)) { + printHelp(); sendHelp(); - } else if (!strcmp_P(command, cmd_sms_on)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_SMS_ON)) { smsOn(true); returnAnswer(); - } else if (!strcmp_P(command, cmd_sms_off)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_SMS_OFF)) { smsOn(false); returnAnswer(); - } else if (!strcmp_P(command, cmd_auth_on)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_AUTH_ON)) { authOn(true); returnAnswer(); - } else if (!strcmp_P(command, cmd_auth_off)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_AUTH_OFF)) { authOn(false); returnAnswer(); - } else if (!strcmp_P(command, cmd_fwd_on)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_FWD_ON)) { fwdOn(true); returnAnswer(); - } else if (!strcmp_P(command, cmd_fwd_off)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_FWD_OFF)) { fwdOn(false); returnAnswer(); - } else if (!strcmp_P(command, cmd_on)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_ON)) { mainPowerOn(); returnAnswer(); - } else if (!strcmp_P(command, cmd_off)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_OFF)) { mainPowerOff(); returnAnswer(); - } else if (!strcmp_P(command, cmd_reset)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_RESET)) { mainReset(); returnAnswer(); - } else if (!strcmp_P(command, cmd_a)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_A)) { a_PowerBreak(); returnAnswer(); - } else if (!strcmp_P(command, cmd_b)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_B)) { b_PowerBreak(); returnAnswer(); - } else if (!strcmp_P(command, cmd_forward)) { + } else if (isCommandMatchIndex(command, CMD_INDEX_FORWARD)) { forwardLastSMS(); - } else if (!strcmp_P(command, cmd_modem_reset) && !cmdFromModem) { + } else if (isCommandMatchIndex(command, CMD_INDEX_MODEM_RESET) && !cmdFromModem) { modem.reset(); modem.init(); returnAnswer(); - } else if (!strcmp_P(command, cmd_modem_console) && !cmdFromModem) { + } else if (isCommandMatchIndex(command, CMD_INDEX_MODEM_CONSOLE) && !cmdFromModem) { modemConsole(); - } else if (!strcmp_P(command, cmd_edit_ab) && !cmdFromModem) { + } else if (isCommandMatchIndex(command, CMD_INDEX_EDIT_AB) && !cmdFromModem) { editAddressBook(); - } else if (!strcmp_P(command, cmd_show_ab) && !cmdFromModem) { + } else if (isCommandMatchIndex(command, CMD_INDEX_SHOW_AB) && !cmdFromModem) { printAddressBook(); } else { - sprint_P(str_help); + printHelp(); sendHelp(); } } @@ -178,7 +175,7 @@ void loop() { sprint("Out call: ", phone); while (true) { ledOn(); - event = modem.getEvent(message, phone, datetime, l_buffer, LONG_BUFFER_SIZE, NO_CHECK); + event = modem.getEvent(message, phone, datetime, vl_buffer, VLONG_BUFFER_SIZE, NO_CHECK); ledOff(); delay(150); @@ -200,6 +197,8 @@ void loop() { } } +#endif + // Запрос статуса word getStatus() { unsigned int stat = 0; @@ -213,8 +212,8 @@ word getStatus() { if (loud > 250) stat |= LOUD_WARN; getVs(); - if (v12 < 10) stat |= POWER_WARN; - if (vbat < 6.4) stat |= BAT_WARN; + if (vin < 10) stat |= POWER_WARN; + if (vbat < 3.7) stat |= BAT_WARN; return stat; } @@ -237,10 +236,9 @@ void printAll() { sprint("fwd: ", fwdOn(), true); sprint("Vcc: ", vcc); - sprint("V12: ", v12); - sprint("V5: ", v5); + sprint("Vin: ", vin); sprint("Vbat: ", vbat); - sprint("Vout: ", vout); + sprint("Vusb: ", vusb); } // Формируем читабельную строку со статусом @@ -278,13 +276,8 @@ void getStatusMessage(char *message) { strcat(message, s); strcat(message, "V"); - strcat(message, "\nV12: "); - ftoa(v12, s); - strcat(message, s); - strcat(message, "V"); - - strcat(message, " V5: "); - ftoa(v5, s); + strcat(message, " Vin: "); + ftoa(vin, s); strcat(message, s); strcat(message, "V"); @@ -293,8 +286,8 @@ void getStatusMessage(char *message) { strcat(message, s); strcat(message, "V"); - strcat(message, " Vout: "); - ftoa(vout, s); + strcat(message, " Vusb: "); + ftoa(vusb, s); strcat(message, s); strcat(message, "V"); @@ -319,12 +312,20 @@ void getStatusMessage(char *message) { else strcat(message, "Off"); } -// Обработка событий модема +bool isCommandMatchIndex(const char *command, byte index) { + char t_command[CMD_SIZE]; + + if (!getCommand(index, t_command)) return false; + + return !strcmp(command, t_command); +} + +// Консоль модема void checkModem() { cmdFromModem = false; command[0] = '\0'; - switch (modem.getEvent(message, phone, datetime, l_buffer, LONG_BUFFER_SIZE)) { + switch (modem.getEvent(message, phone, datetime, vl_buffer, VLONG_BUFFER_SIZE)) { case ERR: sprint("Mdm err!"); modemOK = false; @@ -345,7 +346,7 @@ void checkModem() { flash(3); if (authOn() && !authOK(phone)) { - strcpy_P(command, cmd_forward); + getCommand(CMD_INDEX_FORWARD, command); } else { strncpy(command, message, CMD_SIZE); } @@ -385,9 +386,8 @@ void checkModem() { modemOK = true; } -// Консоль модема void modemConsole() { - sprint_P(str_modem_cons_on); + printShortString(S_STRING_INDEX_MODEM_CONS_ON); sprint("Timeout is ", TIMEOUT, false); sprint(" ms after last command"); @@ -397,7 +397,7 @@ void modemConsole() { if (Serial1.available()) { while(Serial1.available()) { s_buffer[i++] = Serial1.read(); - if(i == BUFFER_SIZE) break; + if(i == SHORT_BUFFER_SIZE) break; } Serial.write(s_buffer, i); @@ -409,7 +409,46 @@ void modemConsole() { t = millis(); } } - sprint_P(str_modem_cons_off); + printShortString(S_STRING_INDEX_MODEM_CONS_OFF); +} + +// Обработка звонков +void incomingCall() { + //if (!modem.ifcallNow()) return; + + if (!modem.isCallActive(phone, l_buffer)) return; + sprint("Call from: ", false); + sprint(phone); + + if (authOn() && !authOK(phone)) { + modem.callEnd(); + sprint("Call unauth"); + return; + } else modem.answer(); + + while (!modem.ifcallEnd()) { + + } + sprint("Call over"); +} + +// Читаем команды с GSM-модема +void readModem(char* msg, byte msg_size) { + msg[0] = '\0'; + message[0] = '\0'; + + if (!modemOK) return; + + if (modem.getSMS(message, phone, datetime, vl_buffer, VLONG_BUFFER_SIZE)) { +// sprint("Msg: ", message); +// sprint("Phn: ", phone); +// sprint("Dtm: ", datetime); + if (authOn() && !authOK(phone)) { + getCommand(CMD_INDEX_FORWARD, msg); + return; + } + strncpy(msg, message, msg_size); + } } // Читаем команды с COM-порта @@ -442,7 +481,14 @@ void returnAnswer(const char * answer) { void sendHelp() { if (modemOK && smsOn() && cmdFromModem) { if (authOn() && !authOK(phone)) return; - modem.sendSMS(phone, str_help); + + message[0] = '\0'; + getLongString(L_STRING_INDEX_HELP_1, l_buffer); + strcat(message, l_buffer); + getLongString(L_STRING_INDEX_HELP_2, l_buffer); + strcat(message, l_buffer); + + modem.sendSMS(phone, message); } } @@ -457,12 +503,12 @@ void forwardLastSMS() { if (fwdOn() && entryNotEmpty(0)) { loadPhoneNumber(0, main_phone); - s_buffer[0] = '\0'; - strcat(s_buffer, "SMS from "); - strcat(s_buffer, phone); - strcat(s_buffer, " at "); - strcat(s_buffer, datetime); - modem.sendSMS(main_phone, s_buffer); + l_buffer[0] = '\0'; + strcat(l_buffer, "SMS from "); + strcat(l_buffer, phone); + strcat(l_buffer, " at "); + strcat(l_buffer, datetime); + modem.sendSMS(main_phone, l_buffer); modem.sendSMS(main_phone, message); } } @@ -478,7 +524,7 @@ void mainPowerOn() { void mainPowerOff() { modem.controlGPIO(1, 1); - delay(6000); + delay(5000); modem.controlGPIO(1, 0); } @@ -502,7 +548,7 @@ void b_PowerBreak() { bool isPowerOn() { getVs(); - if (v12 > 10) return true; + if (vin > 10) return true; else return false; } @@ -574,30 +620,30 @@ void editAddressBook() { char indexString[4]; byte index, i = 0; - sprint_P(str_eab); - sprint_P(str_help_ab); - sprint_P(str_format_ab); + printShortString(S_STRING_INDEX_EAB_MODE); + printLongString(L_STRING_INDEX_HELP_AB); + printLongString(L_STRING_INDEX_FORMAT_AB); t = millis(); while (millis() - t < TIMEOUT) { - readSerial(s_buffer, BUFFER_SIZE); + readSerial(s_buffer, SHORT_BUFFER_SIZE); if (s_buffer[0] != '\0') { t = millis(); - if (!strcmp_P(s_buffer, cmd_exit)) { + if (isCommandMatchIndex(s_buffer, CMD_INDEX_EXIT)) { break; - } else if (!strcmp_P(s_buffer, cmd_show)) { + } else if (isCommandMatchIndex(s_buffer, CMD_INDEX_SHOW)) { printAddressBook(); - } else if (!strcmp_P(s_buffer, cmd_clear)) { + } else if (isCommandMatchIndex(s_buffer, CMD_INDEX_CLEAR)) { clearAddressBook(); } else { p = strstr(s_buffer, ":"); i = 0; - while(s_buffer[i] != ':' && i < BUFFER_SIZE) i++; + while(s_buffer[i] != ':' && i < SHORT_BUFFER_SIZE) i++; if (p == NULL || i == 0 || i > 1) { - sprint_P(str_format_ab); + printLongString(L_STRING_INDEX_FORMAT_AB); } else { // Get index clearBuffer(indexString, 4); @@ -621,7 +667,7 @@ void editAddressBook() { } } } - sprint_P(str_help); + printHelp(); } // Утилиты @@ -629,6 +675,23 @@ void clearBuffer(char *in_buffer, byte in_size) { for(byte i = 0; i < in_size - 1; i++) in_buffer[i] = '\0'; } +void printShortString(byte index, bool ln) { + getShortString(index, s_buffer); + Serial.print(s_buffer); + if (ln) Serial.println(); +} + +void printLongString(byte index, bool ln) { + getLongString(index, l_buffer); + Serial.print(l_buffer); + if (ln) Serial.println(); +} + +void printHelp() { + printLongString(L_STRING_INDEX_HELP_1, false); + printLongString(L_STRING_INDEX_HELP_2); +} + void printParams() { if(smsOn()) sprint("SMS on | ", false); else sprint("SMS off | ", false); if(authOn()) sprint("Auth on | ", false); else sprint("Auth off | ", false); @@ -645,62 +708,118 @@ bool authOK(char *phone) { return false; } -void sprint(const char *description, const byte data, const bool ln) { +void sprint(const char * description, const byte data, const bool ln) { Serial.print(description); Serial.print(data); if (ln) Serial.println(); } -void sprint(const char *description, const char *data, const bool ln) { +void sprint(const char * description, const char * data, const bool ln) { Serial.print(description); Serial.print(data); if (ln) Serial.println(); } -void sprint(const char *description, const int data, const bool ln) { +void sprint(const char * description, const int data, const bool ln) { Serial.print(description); Serial.print(data); if (ln) Serial.println(); } -void sprint(const char *description, const unsigned int data, const bool ln) { +void sprint(const char * description, const unsigned int data, const bool ln) { Serial.print(description); Serial.print(data); if (ln) Serial.println(); } -void sprint(const char *description, const long int data, const bool ln) { +void sprint(const char * description, const long int data, const bool ln) { Serial.print(description); Serial.print(data); if (ln) Serial.println(); } -void sprint(const char *description, const long unsigned int data, const bool ln) { +void sprint(const char * description, const long unsigned int data, const bool ln) { Serial.print(description); Serial.print(data); if (ln) Serial.println(); } -void sprint(const char *description, const float data, const bool ln) { +void sprint(const char * description, const float data, const bool ln) { Serial.print(description); Serial.print(data); if (ln) Serial.println(); } -void sprint(const char *description, const bool ln) { +void sprint(const char * description, const bool ln) { Serial.print(description); if (ln) Serial.println(); } -void sprint_P(const char *description, const bool ln) { - int len = strlen_P(description); - char c; +// EEPROM utils +bool setCommand(byte index, const char *command) { + if (index > CMD_MAX_INDEX) return false; - for (byte i = 0; i < len; i++) { - c = pgm_read_byte_near(description + i); - Serial.print(c); - } - if (ln) Serial.println(); + addr = CMD_ADDR + index * CMD_SIZE; + + for (byte i = 0; i < CMD_SIZE; i++) + EEPROM.update(addr + i, command[i]); + + return true; +} + +bool getCommand(byte index, char *command) { + if (index > CMD_MAX_INDEX) return false; + + addr = CMD_ADDR + index * CMD_SIZE; + + for (byte i = 0; i < CMD_SIZE; i++) + command[i] = EEPROM.read(addr + i); + + return true; +} + +bool setShortString(byte index, const char *s_buffer) { + if (index > S_STRING_MAX_INDEX) return false; + + addr = S_STRING_ADDR + index * SHORT_BUFFER_SIZE; + + for (byte i = 0; i < SHORT_BUFFER_SIZE; i++) + EEPROM.update(addr + i, s_buffer[i]); + + return true; +} + +bool getShortString(byte index, char *s_buffer) { + if (index > S_STRING_MAX_INDEX) return false; + + addr = S_STRING_ADDR + index * SHORT_BUFFER_SIZE; + + for (byte i = 0; i < SHORT_BUFFER_SIZE; i++) + s_buffer[i] = EEPROM.read(addr + i); + + return true; +} + +bool setLongString(byte index, const char *l_buffer) { + if (index > L_STRING_MAX_INDEX) return false; + + addr = L_STRING_ADDR + index * LONG_BUFFER_SIZE; + + for (byte i = 0; i < LONG_BUFFER_SIZE; i++) + EEPROM.update(addr + i, l_buffer[i]); + + return true; +} + +bool getLongString(byte index, char *l_buffer) { + if (index > L_STRING_MAX_INDEX) return false; + + addr = L_STRING_ADDR + index * LONG_BUFFER_SIZE; + + for (byte i = 0; i < LONG_BUFFER_SIZE; i++) + l_buffer[i] = EEPROM.read(addr + i); + + return true; } bool smsOn() { @@ -803,39 +922,35 @@ float readvcc() { } void getVs() { - v12 = 0.0; - v5 = 0.0; + vin = 0.0; vbat = 0.0; - vout = 0.0; + vusb = 0.0; - v12 += readvcc() * analogRead(V12_PIN); - v5 += readvcc() * analogRead(V5_PIN); + vin += readvcc() * analogRead(VIN_PIN); vbat += readvcc() * analogRead(VBAT_PIN); - vout += readvcc() * analogRead(VOUT_PIN); + vusb += readvcc() * analogRead(VUSB_PIN); vcc = readvcc(); - v12 = v12 / 1024.0 / k12; - v5 = v5 / 1024.0 / k5; + vin = vin / 1024.0 / kin; vbat = vbat / 1024.0 / kbat; - vout = vout / 1024.0 / kout; + vusb = vusb / 1024.0 / kusb; } void printVs() { sprint("Vcc: ", vcc); - sprint("V12: ", v12); - sprint("V5: ", v5); + sprint("Vin: ", vin); sprint("Vbat: ", vbat); - sprint("Vout: ", vout); + sprint("Vusb: ", vusb); } void getTH() { int check; - check = dht.read(); + check = tSensor.read(); switch (check) { case DHT_OK: - temp = dht.getTemperatureC(); - hum = dht.getHumidity(); + temp = tSensor.getTemperatureC(); + hum = tSensor.getHumidity(); break; case DHT_ERROR_TIMEOUT: temp = 253; @@ -864,14 +979,135 @@ void ftoa(float f, char *s) { strcat(s, t); } -void initEEPROM() { - int flag_addr = PARAM_ADDR + EEPROM_INIT_INDEX; +#ifdef INIT + +#define HELP_INIT "Usage: help | fill | print cmd | print short | print long" + +void fillEEPROM() { + // ClearParams + smsOn(false); + authOn(true); + fwdOn(true); - if (EEPROM.read(flag_addr) != INIT_FLAG) { - clearAddressBook(); - smsOn(false); - authOn(true); - fwdOn(true); - EEPROM.write(flag_addr, INIT_FLAG); + // Fill commands + // -- 123456789012345 + // 0 status + setCommand(CMD_INDEX_STATUS, "status"); + // 1 help + setCommand(CMD_INDEX_HELP, "help"); + // 2 sms on + setCommand(CMD_INDEX_SMS_ON, "sms on"); + // 3 sms off + setCommand(CMD_INDEX_SMS_OFF, "sms off"); + // 4 on + setCommand(CMD_INDEX_ON, "on"); + // 5 off + setCommand(CMD_INDEX_OFF, "off"); + // 6 reset + setCommand(CMD_INDEX_RESET, "reset"); + // 7 a + setCommand(CMD_INDEX_A, "a"); + // 8 b + setCommand(CMD_INDEX_B, "b"); + // 9 forward + setCommand(CMD_INDEX_FORWARD, "forward"); + // 10 + setCommand(CMD_INDEX_10, ""); + // 11 modem reset + setCommand(CMD_INDEX_MODEM_RESET, "modem reset"); + // 12 modem console + setCommand(CMD_INDEX_MODEM_CONSOLE, "modem console"); + // 13 edit ab + setCommand(CMD_INDEX_EDIT_AB, "edit ab"); + // 14 show ab + setCommand(CMD_INDEX_SHOW_AB, "show ab"); + // 15 show + setCommand(CMD_INDEX_SHOW, "show"); + // 16 clear + setCommand(CMD_INDEX_CLEAR, "clear"); + // 17 exit + setCommand(CMD_INDEX_EXIT, "exit"); + // 18 auth on + setCommand(CMD_INDEX_AUTH_ON, "auth on"); + // 19 auth off + setCommand(CMD_INDEX_AUTH_OFF, "auth off"); + // 20 forward on + setCommand(CMD_INDEX_FWD_ON, "forward on"); + // 21 forward off + setCommand(CMD_INDEX_FWD_OFF, "forward off"); + // 22 + setCommand(CMD_INDEX_22, ""); + // 23 + setCommand(CMD_INDEX_23, ""); + + //Fill short strings + // -- 1234567890123456789012345678901 + // 0 edit ab|show ab + setShortString(S_STRING_INDEX_1, ""); + // 1 Edit address book mode + setShortString(S_STRING_INDEX_EAB_MODE, "Edit address book mode"); + // 2 Modem console mode on + setShortString(S_STRING_INDEX_MODEM_CONS_ON, "Modem console mode on"); + // 3 Modem console mode off + setShortString(S_STRING_INDEX_MODEM_CONS_OFF, "Modem console mode off"); + + //Fill long strings + // -- 123456789012345678901234567890123456789012345678901234567890123 + // 0 Usage: help/status/on/off/reset/a/b/modem reset|console/edit ab + setLongString(L_STRING_INDEX_HELP_1, "Usage: help/status/on/off/reset/a/b/modem reset|console/edit ab"); + // 1 Type \"show\" to view, \"clear\" to erase, \"exit\" to return + setLongString(L_STRING_INDEX_HELP_AB, "Type \"show\" to view, \"clear\" to erase, \"exit\" to return"); + // 2 Format: \"i:+xxxxxxxxxxx\" to update or \"i:delete\" to delete + setLongString(L_STRING_INDEX_FORMAT_AB, "Format: \"i:+xxxxxxxxxxx\" to update or \"i:delete\" to delete"); + // 3 /show ab/sms on|off/auth on|off/fwd on|off + setLongString(L_STRING_INDEX_HELP_2, "/show ab/sms on|off/auth on|off/fwd on|off"); +} + +void setup() { + delay(5000); + Serial.println("Watchdog EEPROM init program"); + Serial.println(HELP_INIT); +} + +void loop() { + readSerial(command, CMD_SIZE); + + if (command[0] != '\0') { + Serial.println(command); + + if (!strcmp(command, "fill")) { + fillEEPROM(); + Serial.println("EEPROM init complete"); + } else if (!strcmp(command, "print cmd")) { + Serial.println("cmd: "); + for(byte i = 0; i <= CMD_MAX_INDEX; i++) { + getCommand(i, command); + Serial.print(i); + Serial.print(": "); + Serial.println(command); + } + } else if (!strcmp(command, "print short")) { + Serial.println("short: "); + for(byte i = 0; i <= S_STRING_MAX_INDEX; i++) { + getShortString(i, s_buffer); + Serial.print(i); + Serial.print(": "); + Serial.println(s_buffer); + } + } else if (!strcmp(command, "print long")) { + Serial.println("long: "); + for(byte i = 0; i <= L_STRING_MAX_INDEX; i++) { + getLongString(i, l_buffer); + Serial.print(i); + Serial.print(": "); + Serial.println(l_buffer); + } + } else if (!strcmp(command, "help")) { + Serial.println(HELP_INIT); + } else { + Serial.println(HELP_INIT); + } } } + +#endif diff --git a/watchdog_3.h b/watchdog_3.h index 6cfb230..e14d2c9 100644 --- a/watchdog_3.h +++ b/watchdog_3.h @@ -5,18 +5,23 @@ // ---------------------------------------------------------------------------------------------------- #include -#include #include "GPRS_Shield_Arduino.h" -#include +#include + +//#define INIT +#define MAIN /* * EEPROM mapping - * 1024 Kb + * 1024 B * 10 x 16 = 160 - address book | first addr 0 * 16 x 1 = 16 - parameters | first addr 160 + * 24 x 16 = 384 - commands | first addr 176 + * 4 x 32 = 128 - short strings | first addr 560 + * 4 x 64 = 256 - long strings | first addr 688 * ------------- - * 176 bytes - * 848 bytes free + * 944 bytes + * 80 bytes free */ #define AB_ADDR 0 @@ -27,40 +32,51 @@ #define SMS_ON_INDEX 0 #define AUTH_ON_INDEX 1 #define FWD_ON_INDEX 2 -#define EEPROM_INIT_INDEX 15 -#define INIT_FLAG 0xAC +#define CMD_ADDR 176 +#define CMD_MAX_INDEX 23 -const char cmd_status[] PROGMEM = {"status"}; -const char cmd_help[] PROGMEM = {"help"}; -const char cmd_sms_on[] PROGMEM = {"sms on"}; -const char cmd_sms_off[] PROGMEM = {"sms off"}; -const char cmd_on[] PROGMEM = {"on"}; -const char cmd_off[] PROGMEM = {"off"}; -const char cmd_reset[] PROGMEM = {"reset"}; -const char cmd_a[] PROGMEM = {"a"}; -const char cmd_b[] PROGMEM = {"b"}; -const char cmd_forward[] PROGMEM = {"forward"}; -const char cmd_modem_reset[] PROGMEM = {"modem reset"}; -const char cmd_modem_console[] PROGMEM = {"modem console"}; -const char cmd_edit_ab[] PROGMEM = {"edit ab"}; -const char cmd_show_ab[] PROGMEM = {"show ab"}; -const char cmd_show[] PROGMEM = {"show"}; -const char cmd_clear[] PROGMEM = {"clear"}; -const char cmd_exit[] PROGMEM = {"exit"}; -const char cmd_auth_on[] PROGMEM = {"auth on"}; -const char cmd_auth_off[] PROGMEM = {"auth off"}; -const char cmd_fwd_on[] PROGMEM = {"forward on"}; -const char cmd_fwd_off[] PROGMEM = {"forward off"}; +#define S_STRING_ADDR 560 +#define S_STRING_MAX_INDEX 3 -const char str_init_eeprom[] PROGMEM = {"EEPROM init complete"}; -const char str_eab[] PROGMEM = {"Edit address book mode"}; -const char str_modem_cons_on[] PROGMEM = {"Modem console mode on"}; -const char str_modem_cons_off[] PROGMEM = {"Modem console mode off"}; +#define L_STRING_ADDR 688 +#define L_STRING_MAX_INDEX 3 + +#define CMD_INDEX_STATUS 0 +#define CMD_INDEX_HELP 1 +#define CMD_INDEX_SMS_ON 2 +#define CMD_INDEX_SMS_OFF 3 +#define CMD_INDEX_ON 4 +#define CMD_INDEX_OFF 5 +#define CMD_INDEX_RESET 6 +#define CMD_INDEX_A 7 +#define CMD_INDEX_B 8 +#define CMD_INDEX_FORWARD 9 +#define CMD_INDEX_10 10 +#define CMD_INDEX_MODEM_RESET 11 +#define CMD_INDEX_MODEM_CONSOLE 12 +#define CMD_INDEX_EDIT_AB 13 +#define CMD_INDEX_SHOW_AB 14 +#define CMD_INDEX_SHOW 15 +#define CMD_INDEX_CLEAR 16 +#define CMD_INDEX_EXIT 17 +#define CMD_INDEX_AUTH_ON 18 +#define CMD_INDEX_AUTH_OFF 19 +#define CMD_INDEX_FWD_ON 20 +#define CMD_INDEX_FWD_OFF 21 +#define CMD_INDEX_22 22 +#define CMD_INDEX_23 23 + +#define S_STRING_INDEX_1 0 +#define S_STRING_INDEX_EAB_MODE 1 +#define S_STRING_INDEX_MODEM_CONS_ON 2 +#define S_STRING_INDEX_MODEM_CONS_OFF 3 + +#define L_STRING_INDEX_HELP_1 0 +#define L_STRING_INDEX_HELP_AB 1 +#define L_STRING_INDEX_FORMAT_AB 2 +#define L_STRING_INDEX_HELP_2 3 -const char str_help[] PROGMEM = {"Usage: help/status/on/off/reset/a/b/modem reset|console/edit ab/show ab/sms on|off/auth on|off/fwd on|off"}; -const char str_help_ab[] PROGMEM = {"Type \"show\" to view, \"clear\" to erase, \"exit\" to return"}; -const char str_format_ab[] PROGMEM = {"Format: \"i:+xxxxxxxxxxx\" to update or \"i:delete\" to delete"}; // Всякое #define TIMEOUT 60000 @@ -72,10 +88,10 @@ const char str_format_ab[] PROGMEM = {"Format: \"i:+xxxxxxxxxxx\" to update or // Сенсоры #define A_PIN A0 #define T_PIN A1 -#define VOUT_PIN A2 +#define BAT_T_PIN A2 #define VBAT_PIN A3 -#define V5_PIN A4 -#define V12_PIN A5 +#define VUSB_PIN A4 +#define VIN_PIN A5 #define LED_PIN 13 #define BTN_PIN 12 @@ -92,8 +108,9 @@ const char str_format_ab[] PROGMEM = {"Format: \"i:+xxxxxxxxxxx\" to update or #define SMS_SIZE 160 #define PHONE_SIZE 16 #define DATE_SIZE 24 -#define BUFFER_SIZE 64 -#define LONG_BUFFER_SIZE 240 +#define SHORT_BUFFER_SIZE 32 +#define LONG_BUFFER_SIZE 64 +#define VLONG_BUFFER_SIZE 240 // Флаги статуса #define TEMP_WARN 0x01 @@ -137,15 +154,22 @@ void printHelp(); void printParams(); bool authOK(char *phone); -void sprint(const char *description, const byte data, const bool ln = true); -void sprint(const char *description, const char *data, const bool ln = true); -void sprint(const char *description, const int data, const bool ln = true); -void sprint(const char *description, const unsigned int data, const bool ln = true); -void sprint(const char *description, const long int data, const bool ln = true); -void sprint(const char *description, const long unsigned int data, const bool ln = true); -void sprint(const char *description, const float data, const bool ln = true); -void sprint(const char *description, const bool ln = true); -void sprint_P(const char *description, const bool ln = true); +void sprint(const char * description, const byte data, const bool ln = true); +void sprint(const char * description, const char * data, const bool ln = true); +void sprint(const char * description, const int data, const bool ln = true); +void sprint(const char * description, const unsigned int data, const bool ln = true); +void sprint(const char * description, const long int data, const bool ln = true); +void sprint(const char * description, const long unsigned int data, const bool ln = true); +void sprint(const char * description, const float data, const bool ln = true); +void sprint(const char * description, const bool ln = true); + +// EEPROM utils +bool setCommand(byte index, const char *command); +bool getCommand(byte index, char *command); +bool setShortString(byte index, const char *s_buffer); +bool getShortString(byte index, char *s_buffer); +bool setLongString(byte index, const char *l_buffer); +bool getLongString(byte index, char *l_buffer); bool smsOn(); void smsOn(bool temp); @@ -165,4 +189,3 @@ float readvcc(); void getVs(); void printVs(); void getTH(); -void initEEPROM();