EEPROM version

This commit is contained in:
eKa 2020-01-24 22:44:50 +05:00
parent 8c79fce887
commit 4f4bba55f1
2 changed files with 434 additions and 175 deletions

View File

@ -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
if (EEPROM.read(flag_addr) != INIT_FLAG) {
clearAddressBook();
smsOn(false);
authOn(true);
fwdOn(true);
EEPROM.write(flag_addr, INIT_FLAG);
#define HELP_INIT "Usage: help | fill | print cmd | print short | print long"
void fillEEPROM() {
// ClearParams
smsOn(false);
authOn(true);
fwdOn(true);
// 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, "<NONE>");
// 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, "<NONE>");
// 23
setCommand(CMD_INDEX_23, "<NONE>");
//Fill short strings
// -- 1234567890123456789012345678901
// 0 edit ab|show ab
setShortString(S_STRING_INDEX_1, "<NONE>");
// 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

View File

@ -5,18 +5,23 @@
// ----------------------------------------------------------------------------------------------------
#include <EEPROM.h>
#include <avr/pgmspace.h>
#include "GPRS_Shield_Arduino.h"
#include <TroykaDHT.h>
#include <TroykaDHT11.h>
//#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();