wellhub_reloaded/main/CommandProcessor.cpp

343 lines
9.4 KiB
C++

#include <esp_log.h>
#include "CommandProcessor.h"
#include "utilities.h"
#include "Settings.h"
#include <WiFi.h>
const char * TAG = "CommandProcessor";
CommandProcessor::CommandProcessor(AppIF & app) : m_app(app), m_rw(512)
{
}
#define BUF_LEN 128
char * getElementAt(int el, Parser & p, char * buffer)
{
buffer[0] = 0;
p.getElementAt(el, buffer, BUF_LEN);
return buffer;
}
bool CommandProcessor::cmdSetGroupId(Parser & p, char * buffer)
{
int value = 0;
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
if(strToInt(getElementAt(1, p, buffer), value))
{
ESP_LOGW(TAG, "new group value: %u", value);
SETTINGS.device.group_id = value;
SETTINGS_SAVE;
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|Z|ok");
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|Z|fail");
strcpy(m_buffer, m_rw.getBuffer());
return false;
}
bool CommandProcessor::cmdSetWorkingId(Parser & p, char * buffer)
{
int value = 0;
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
if(strToInt(getElementAt(1, p, buffer), value))
{
ESP_LOGW(TAG, "new device working id: %u", value);
SETTINGS.device.tata_id = value;
SETTINGS_SAVE;
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|-|ok");
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|-|fail");
strcpy(m_buffer, m_rw.getBuffer());
return false;
}
bool CommandProcessor::cmdRestart(Parser & p, char * buffer)
{
esp_restart();
return true;
}
bool CommandProcessor::cmdDeleteStoredSsids(Parser & p, char * buffer)
{
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
ESP_LOGW(TAG, "delete stored ssid's");
SETTINGS.wifi.num = 0;
SETTINGS_SAVE;
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|d|ok");
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
bool CommandProcessor::cmdReturnCurrentSsid(Parser & p, char * buffer)
{
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
ESP_LOGW(TAG, "return current ssid %s and rssi %d", WiFi.SSID().c_str(), WiFi.RSSI());
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|");
m_rw.appendf("a|%s,%d", WiFi.SSID().c_str(), WiFi.RSSI());
ESP_LOGI(TAG, "'%s'", m_rw.getBuffer());
// "a|gumball,-42"
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
bool CommandProcessor::cmdReturnVisibleNetworks(Parser & p, char * buffer)
{
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
ESP_LOGI(TAG, "Scanning wifi networks...");
int num_networks = WiFi.scanNetworks(false, false, false, 0);
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|");
m_rw.appendf("w|%d|", num_networks);
for(int n = 0; n < num_networks; n++)
{
m_rw.append(WiFi.SSID(n).c_str());
m_rw.append(",");
m_rw.appendf("%d", WiFi.RSSI(n));
if(n < num_networks - 1)
m_rw.append("|");
}
ESP_LOGI(TAG, "'%s'", m_rw.getBuffer());
// "w|4|gumball,-40|miro,-79|903noe,-84|TheGoodPlace-2.4,-93"
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
bool CommandProcessor::cmdAddNetwork(Parser & p, char * buffer)
{
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
if(p.getElementAt(1, buffer, BUF_LEN))
{
ESP_LOGI(TAG, "ssid/pwd: '%s'", buffer);
char ssid[36], pwd[36];
Parser pp(buffer, ",");
if(pp.getElementAt(0, ssid, sizeof(ssid)))
{
ESP_LOGI(TAG, "ssid: %s", ssid);
if(pp.getElementAt(1, pwd, sizeof(pwd)))
{
ESP_LOGI(TAG, "pwd: %s", pwd);
if(SETTINGS.wifi.num < SETTINGS_NUM_WIFI_ENTRIES - 1)
{
int ix = SETTINGS.wifi.num;
strcpy(SETTINGS.wifi.entry[ix].ssid, ssid);
strcpy(SETTINGS.wifi.entry[ix].pwd, pwd);
SETTINGS.wifi.num = ix + 1;
SETTINGS_SAVE;
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|W|ok");
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
}
}
}
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|W|fail");
strcpy(m_buffer, m_rw.getBuffer());
return false;
}
bool CommandProcessor::cmdReportAllSettings(Parser & p, char * buffer)
{
int64_t up_time = esp_timer_get_time();
uint8_t wifi_mac[8];
//added mac address
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|");
m_rw.appendf("-,%u", SETTINGS.device.tata_id); //wid
m_rw.append("|");
m_rw.appendf("Z,%u", SETTINGS.device.group_id); //group id
m_rw.append("|");
m_rw.appendf("0,%s", SETTINGS.mqtt.device_id); //client id mwtt client id(text)
m_rw.append("|");
m_rw.appendf("2,%u", up_time/1000000); //time since reboot (seconds)
m_rw.append("|");
m_rw.append("5,");
for(int n = 0; n < SETTINGS.wifi.num; n++)
{
m_rw.append(SETTINGS.wifi.entry[n].ssid);
m_rw.append("\t");
m_rw.append(SETTINGS.wifi.entry[n].pwd);
if(n < SETTINGS.wifi.num - 1)
m_rw.append("\n");
}
m_rw.append("|");
m_rw.appendf("9,%.3f", SETTINGS.sensors.temperature.temp_offset); //temp offset
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
bool CommandProcessor::cmdSetMqttDevId(Parser & p, char * buffer)
{
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
if(p.getElementAt(1, buffer, BUF_LEN))
{
ESP_LOGI(TAG, "new mqtt dev id: '%s'", buffer);
strcpy(SETTINGS.mqtt.device_id, buffer);
SETTINGS_SAVE;
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|0|ok");
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|0|fail");
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
bool CommandProcessor::cmdSetTemperatureOffset(Parser & p, char * buffer)
{
float value = 0;
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
if(strToFloat(getElementAt(1, p, buffer), value))
{
ESP_LOGW(TAG, "new temp offset: %f", value);
SETTINGS.sensors.temperature.temp_offset = value;
SETTINGS_SAVE;
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|9|ok");
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
m_rw.append("|9|fail");
strcpy(m_buffer, m_rw.getBuffer());
return false;
}
bool CommandProcessor::cmdAuth(Parser & p, char * buffer)
{
int value = 0;
if(strToInt(getElementAt(1, p, buffer), value))
{
if(value == 7856)
{
m_authenticated = true;
m_auth_time = millis();
ESP_LOGW(TAG, "Authenticated for 10s");
strcpy(m_buffer, "pin|ok");
return true;
}
}
return false;
}
bool CommandProcessor::cmdReadFullMac(Parser & p, char * buffer)
{
uint8_t wifi_mac[8];
esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA);
m_rw.reset();
m_rw.appendf("mac,%02x%02x%02x%02x%02x%02x", wifi_mac[0], wifi_mac[1], wifi_mac[2], wifi_mac[3], wifi_mac[4], wifi_mac[5]);
strcpy(m_buffer, m_rw.getBuffer());
return true;
}
#define COMMAND_START if(false){}
#define COMMAND(command, function) else if(strcmp(command, getElementAt(0, p, temp)) == 0) function(p, temp)
#define COMMAND_END else strcpy(m_buffer, "error");
char * CommandProcessor::process(const char * data, uint32_t len)
{
ESP_LOGI(TAG, "%s", data);
Parser p((char *)data, "|");
char temp[BUF_LEN];
if(strcmp("pin", getElementAt(0, p, temp)) == 0)
{
cmdAuth(p, temp);
return m_buffer;
}
if(millis() - m_auth_time > 10000)
{
ESP_LOGI(TAG, "nut autorized");
m_buffer[0] = 0;
return m_buffer;
}
m_auth_time = millis();
COMMAND_START
COMMAND("mac", cmdReadFullMac);
COMMAND("Z", cmdSetGroupId);
COMMAND("0", cmdSetMqttDevId);
COMMAND("-", cmdSetWorkingId);
COMMAND("s", cmdRestart);
COMMAND("d", cmdDeleteStoredSsids);
COMMAND("a", cmdReturnCurrentSsid);
COMMAND("w", cmdReturnVisibleNetworks);
COMMAND("W", cmdAddNetwork);
COMMAND("r", cmdReportAllSettings);
COMMAND("9", cmdSetTemperatureOffset);
COMMAND_END;
if(!m_authenticated)
m_buffer[0] = 0;
return m_buffer;
}