#include #include #include #include #include #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(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 { 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 "[???]"; } }