Sensor3/lib/patrix/console.cpp

146 lines
4.2 KiB
C++

#include <console.h>
#include <HardwareSerial.h>
#include <log.h>
#include <Esp.h>
#include <WiFi.h>
#include "mqtt.h"
#include "wifi.h"
char consoleBuffer[64] = "";
char *consoleBufferW = consoleBuffer;
const char *getFlashChipMode();
void consoleLoop() {
uint8_t i = 0;
while (Serial.available() > 0 && i++ < 100) {
const char symbol = static_cast<char>(Serial.read());
if (symbol == '\n' || symbol == '\r') {
if (*consoleBuffer != 0) {
Serial.print('\n');
info("CONSOLE > %s", consoleBuffer);
consoleHandle(consoleBuffer);
consoleBufferW = consoleBuffer;
*consoleBufferW = 0;
}
} else if (symbol == '\b') {
if (consoleBufferW > consoleBuffer) {
consoleBufferW--;
*consoleBufferW = 0;
Serial.print("\b \b");
}
} else {
if (consoleBufferW < consoleBuffer + sizeof consoleBuffer - 1) {
*consoleBufferW = symbol;
consoleBufferW++;
*consoleBufferW = 0;
Serial.print("\r");
Serial.print(consoleBuffer);
} else {
Serial.print("\nCONSOLE BUFFER OVERFLOW\n");
Serial.print(consoleBuffer);
}
}
}
}
void consoleHandle(const char *cmd) {
if (strcmp(cmd, "help") == 0) {
info("help : print this help");
info("info : print system info");
info("reboot : reboot system");
info("wifi : reconnect wifi");
info("mqtt : reconnect mqtt");
info("debug : toggle debug log");
} else if (strcmp(cmd, "info") == 0) {
uint64_t millis = getUptimeMillis();
uint64_t seconds = millis / 1000;
uint32_t minutes = seconds / 60;
uint32_t hours = minutes / 60;
uint16_t days = hours / 24;
char datetime[26];
getDateTime(datetime, sizeof datetime);
info("WiFi:");
info(" hostname: %s", HOSTNAME);
info(" mac: %s", WiFi.macAddress().c_str());
info(" ip: %s", WiFi.localIP().toString().c_str());
info(" gateway: %s", WiFi.gatewayIP().toString().c_str());
info(" ssid: %s", WiFi.SSID().c_str());
info(" bssid: %s", WiFi.BSSIDstr().c_str());
info(" rssi: %d", WiFi.RSSI());
info("Time:");
info(" uptime: %dd %2dh %2dm %2ds", days, hours % 24, minutes % 60, seconds % 60);
info(" sys: %s", datetime);
info("Chip:");
info(" model: %s", ESP.getChipModel());
info(" cores: %d", ESP.getChipCores());
info(" freq: %d", ESP.getCpuFreqMHz());
info("Flash:");
info(" mode: %s", getFlashChipMode());
info(" size: %d", ESP.getFlashChipSize());
info(" speed: %d", ESP.getFlashChipSpeed());
info("Heap:");
info(" size: %d", ESP.getHeapSize());
info(" free: %d", ESP.getFreeHeap());
info(" minFree: %d", ESP.getMinFreeHeap());
info(" maxAlloc: %d", ESP.getMaxAllocHeap());
info("PS RAM:");
info(" size: %d", ESP.getPsramSize());
info(" free: %d", ESP.getFreePsram());
info(" minFree: %d", ESP.getMinFreePsram());
info(" maxAlloc: %d", ESP.getMaxAllocPsram());
info("SDK:");
info(" size: %d", ESP.getSketchSize());
info(" free: %d", ESP.getFreeSketchSpace());
info(" MD5: %s", ESP.getSketchMD5().c_str());
info("SDK:");
info(" version: %s", ESP.getSdkVersion());
} else if (strcmp(cmd, "reboot") == 0) {
info("Rebooting...");
delay(500);
yield();
ESP.restart();
} else if (strcmp(cmd, "wifi") == 0) {
info("Reconnecting WiFi...");
wifiConnect();
} else if (strcmp(cmd, "mqtt") == 0) {
info("Reconnecting MQTT...");
mqttDisconnect();
} else if (strcmp(cmd, "debug") == 0) {
setDebugEnabled(!isDebugEnabled());
info("DEBUG: %s", isDebugEnabled() ? "ON" : "OFF");
} else if (!patrix_command((char *) cmd)) {
info("Unknown command: %s", cmd);
}
}
const char *getFlashChipMode() {
switch (ESP.getFlashChipMode()) {
case FM_QIO:
return "QIO";
case FM_QOUT:
return "QOUT";
case FM_DIO:
return "DIO";
case FM_DOUT:
return "DOUT";
case FM_FAST_READ:
return "FAST_READ";
case FM_SLOW_READ:
return "SLOW_READ";
case FM_UNKNOWN:
return "UNKNOWN";
default:
return "[???]";
}
}