Add canal command: save channel to flash and reboot
This commit is contained in:
59
src/main.cpp
59
src/main.cpp
@@ -52,6 +52,36 @@ static bool g_startup_msg_sent = false;
|
||||
struct SecurityConfig { uint32_t magic; uint8_t armed; uint8_t relay2; };
|
||||
static const uint32_t CFG_MAGIC = 0x53454355;
|
||||
|
||||
struct ChannelConfig { uint32_t magic; char name[32]; char password[32]; };
|
||||
static const uint32_t CHAN_MAGIC = 0x4348414E;
|
||||
|
||||
static char g_channel_name[32] = "";
|
||||
static char g_channel_pass[32] = "";
|
||||
|
||||
bool saveChannelConfig() {
|
||||
ChannelConfig cfg;
|
||||
memset(&cfg, 0, sizeof(cfg));
|
||||
cfg.magic = CHAN_MAGIC;
|
||||
strncpy(cfg.name, g_channel_name, sizeof(cfg.name) - 1);
|
||||
strncpy(cfg.password, g_channel_pass, sizeof(cfg.password) - 1);
|
||||
File f = InternalFS.open(CHANNEL_FILE, FILE_O_WRITE);
|
||||
if (!f) return false;
|
||||
bool ok = f.write((const uint8_t*)&cfg, sizeof(cfg)) == sizeof(cfg);
|
||||
f.close(); return ok;
|
||||
}
|
||||
|
||||
bool loadChannelConfig() {
|
||||
File f = InternalFS.open(CHANNEL_FILE, FILE_O_READ);
|
||||
if (!f) return false;
|
||||
ChannelConfig cfg;
|
||||
if (f.read(&cfg, sizeof(cfg)) != sizeof(cfg)) { f.close(); return false; }
|
||||
f.close();
|
||||
if (cfg.magic != CHAN_MAGIC) return false;
|
||||
strncpy(g_channel_name, cfg.name, sizeof(g_channel_name) - 1);
|
||||
strncpy(g_channel_pass, cfg.password, sizeof(g_channel_pass) - 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool saveSecurityConfig() {
|
||||
SecurityConfig cfg = { CFG_MAGIC, g_armed ? 1 : 0, g_relay2_state ? 1 : 0 };
|
||||
File f = InternalFS.open(CONFIG_FILE, FILE_O_WRITE);
|
||||
@@ -80,8 +110,9 @@ public:
|
||||
: Mesh(r, *new ArduinoMillis(), rng, clock, *new StaticPoolPacketManager(16), t) {}
|
||||
|
||||
void setup_channel() {
|
||||
const char* pass = g_channel_pass[0] ? g_channel_pass : "1234";
|
||||
uint8_t key[32];
|
||||
SHA256 sha; sha.reset(); sha.update((const uint8_t*)"1234", 4); sha.finalize(key, 32);
|
||||
SHA256 sha; sha.reset(); sha.update((const uint8_t*)pass, strlen(pass)); sha.finalize(key, 32);
|
||||
memset(mesh_channel.secret, 0, 32);
|
||||
memcpy(mesh_channel.secret, key, 16);
|
||||
mesh::Utils::sha256(mesh_channel.hash, sizeof(mesh_channel.hash), mesh_channel.secret, 16);
|
||||
@@ -148,7 +179,7 @@ public:
|
||||
while (*cmd == ' ') cmd++;
|
||||
|
||||
if (strcmp(cmd, "help") == 0) {
|
||||
defer_response("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,relay,status,ver,scan,security_conf");
|
||||
defer_response("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,relay,status,ver,scan,canal");
|
||||
} else if (strcmp(cmd, "ohrana on") == 0) {
|
||||
g_armed = true; digitalWrite(PIN_RELAY_1, LOW); saveSecurityConfig(); defer_response("ohrana on ok");
|
||||
} else if (strcmp(cmd, "ohrana off") == 0) {
|
||||
@@ -180,16 +211,19 @@ public:
|
||||
float sum = 0;
|
||||
for (int j = 0; j < 20; j++) { sum += radio_driver.getCurrentRSSI(); delay(50); }
|
||||
char r[32]; snprintf(r, sizeof(r), "noise:%.0fdBm", sum / 20); defer_response(r);
|
||||
} else if (strncmp(cmd, "security_conf", 13) == 0) {
|
||||
const char* nc = cmd + 13; while (*nc == ' ') nc++;
|
||||
if (strlen(nc) > 0 && strlen(nc) < 32) {
|
||||
uint8_t key[32];
|
||||
SHA256 sha; sha.reset(); sha.update((const uint8_t*)nc, strlen(nc)); sha.finalize(key, 32);
|
||||
memset(mesh_channel.secret, 0, 32);
|
||||
memcpy(mesh_channel.secret, key, 16);
|
||||
mesh::Utils::sha256(mesh_channel.hash, sizeof(mesh_channel.hash), mesh_channel.secret, 16);
|
||||
char r[64]; snprintf(r, sizeof(r), "channel:%s", nc); defer_response(r);
|
||||
} else defer_response("bad name");
|
||||
} else if (strncmp(cmd, "canal", 5) == 0) {
|
||||
const char* rest = cmd + 5; while (*rest == ' ') rest++;
|
||||
char cname[32], cpass[32];
|
||||
int n = sscanf(rest, "%31s %31s", cname, cpass);
|
||||
if (n == 2) {
|
||||
strncpy(g_channel_name, cname, sizeof(g_channel_name) - 1);
|
||||
strncpy(g_channel_pass, cpass, sizeof(g_channel_pass) - 1);
|
||||
saveChannelConfig();
|
||||
char r[64]; snprintf(r, sizeof(r), "canal %s %s ok", cname, cpass);
|
||||
send_text(r);
|
||||
delay(100);
|
||||
NVIC_SystemReset();
|
||||
} else defer_response("canal name password");
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -227,6 +261,7 @@ void setup() {
|
||||
|
||||
InternalFS.begin();
|
||||
loadSecurityConfig();
|
||||
loadChannelConfig();
|
||||
if (g_armed) digitalWrite(PIN_RELAY_1, LOW); else digitalWrite(PIN_RELAY_1, HIGH);
|
||||
digitalWrite(PIN_RELAY_2, g_relay2_state ? LOW : HIGH);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user