mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-15 17:42:12 +00:00
Merge remote-tracking branch 'root/master' into dev
# Conflicts: # src/PowerFSM.cpp
This commit is contained in:
commit
7312c56d6c
@ -103,7 +103,7 @@ lib_deps =
|
|||||||
# board_build.ldscript = linker/esp32.extram.bss.ld
|
# board_build.ldscript = linker/esp32.extram.bss.ld
|
||||||
lib_ignore = segger_rtt
|
lib_ignore = segger_rtt
|
||||||
platform_packages =
|
platform_packages =
|
||||||
framework-arduinoespressif32@https://github.com/meshtastic/arduino-esp32.git#2814f110aa618429bdd9a0a2d6a93c55f29f87a6
|
framework-arduinoespressif32@https://github.com/meshtastic/arduino-esp32.git#c29e0bcde1b1b4a939dd7339dea0302d2d589ae7
|
||||||
|
|
||||||
; customize the partition table
|
; customize the partition table
|
||||||
; http://docs.platformio.org/en/latest/platforms/espressif32.html#partition-tables
|
; http://docs.platformio.org/en/latest/platforms/espressif32.html#partition-tables
|
||||||
|
@ -144,12 +144,12 @@ static void onEnter()
|
|||||||
|
|
||||||
uint32_t now = millis();
|
uint32_t now = millis();
|
||||||
|
|
||||||
if (now - lastPingMs > 30 * 1000) { // if more than a minute since our last press, ask node we are looking at to update their state
|
if (now - lastPingMs >
|
||||||
|
30 * 1000) { // if more than a minute since our last press, ask node we are looking at to update their state
|
||||||
if (displayedNodeNum)
|
if (displayedNodeNum)
|
||||||
service.sendNetworkPing(displayedNodeNum, true); // Refresh the currently displayed node
|
service.sendNetworkPing(displayedNodeNum, true); // Refresh the currently displayed node
|
||||||
lastPingMs = now;
|
lastPingMs = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void screenPress()
|
static void screenPress()
|
||||||
@ -171,11 +171,17 @@ Fsm powerFSM(&stateBOOT);
|
|||||||
|
|
||||||
void PowerFSM_setup()
|
void PowerFSM_setup()
|
||||||
{
|
{
|
||||||
|
bool isRouter = radioConfig.preferences.is_router;
|
||||||
|
|
||||||
// If we are not a router and we already have AC power go to POWER state after init, otherwise go to ON
|
// If we are not a router and we already have AC power go to POWER state after init, otherwise go to ON
|
||||||
// We assume routers might be powered all the time, but from a low current (solar) source
|
// We assume routers might be powered all the time, but from a low current (solar) source
|
||||||
bool isRouter = radioConfig.preferences.is_router;
|
|
||||||
bool isLowPower = radioConfig.preferences.is_low_power || isRouter;
|
bool isLowPower = radioConfig.preferences.is_low_power || isRouter;
|
||||||
bool hasPower = !isLowPower && powerStatus && powerStatus->getHasUSB();
|
|
||||||
|
/* To determine if we're externally powered, assumptions
|
||||||
|
1) If we're powered up and there's no battery, we must be getting power externally.
|
||||||
|
2) If we detect USB power from the power management chip, we must be getting power externally.
|
||||||
|
*/
|
||||||
|
bool hasPower = (powerStatus && !powerStatus->getHasBattery()) || (!isLowPower && powerStatus && powerStatus->getHasUSB());
|
||||||
|
|
||||||
DEBUG_MSG("PowerFSM init, USB power=%d\n", hasPower);
|
DEBUG_MSG("PowerFSM init, USB power=%d\n", hasPower);
|
||||||
powerFSM.add_timed_transition(&stateBOOT, hasPower ? &statePOWER : &stateON, 3 * 1000, NULL, "boot timeout");
|
powerFSM.add_timed_transition(&stateBOOT, hasPower ? &statePOWER : &stateON, 3 * 1000, NULL, "boot timeout");
|
||||||
|
@ -894,6 +894,22 @@ void Screen::handleStartBluetoothPinScreen(uint32_t pin)
|
|||||||
setFastFramerate();
|
setFastFramerate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Screen::blink() {
|
||||||
|
setFastFramerate();
|
||||||
|
uint8_t count = 10;
|
||||||
|
dispdev.setBrightness(254);
|
||||||
|
while(count>0) {
|
||||||
|
dispdev.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||||
|
dispdev.display();
|
||||||
|
delay(50);
|
||||||
|
dispdev.clear();
|
||||||
|
dispdev.display();
|
||||||
|
delay(50);
|
||||||
|
count = count -1;
|
||||||
|
}
|
||||||
|
dispdev.setBrightness(brightness);
|
||||||
|
}
|
||||||
|
|
||||||
void Screen::handlePrint(const char *text)
|
void Screen::handlePrint(const char *text)
|
||||||
{
|
{
|
||||||
DEBUG_MSG("Screen: %s", text);
|
DEBUG_MSG("Screen: %s", text);
|
||||||
|
@ -107,6 +107,8 @@ class Screen : public concurrency::OSThread
|
|||||||
*/
|
*/
|
||||||
void doDeepSleep();
|
void doDeepSleep();
|
||||||
|
|
||||||
|
void blink();
|
||||||
|
|
||||||
/// Handles a button press.
|
/// Handles a button press.
|
||||||
void onPress() { enqueueCmd(ScreenCmd{.cmd = Cmd::ON_PRESS}); }
|
void onPress() { enqueueCmd(ScreenCmd{.cmd = Cmd::ON_PRESS}); }
|
||||||
|
|
||||||
|
@ -60,6 +60,9 @@ void handleRestart(HTTPRequest *req, HTTPResponse *res);
|
|||||||
void handle404(HTTPRequest *req, HTTPResponse *res);
|
void handle404(HTTPRequest *req, HTTPResponse *res);
|
||||||
void handleFormUpload(HTTPRequest *req, HTTPResponse *res);
|
void handleFormUpload(HTTPRequest *req, HTTPResponse *res);
|
||||||
void handleScanNetworks(HTTPRequest *req, HTTPResponse *res);
|
void handleScanNetworks(HTTPRequest *req, HTTPResponse *res);
|
||||||
|
void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res);
|
||||||
|
void handleSpiffsDeleteStatic(HTTPRequest *req, HTTPResponse *res);
|
||||||
|
void handleBlinkLED(HTTPRequest *req, HTTPResponse *res);
|
||||||
|
|
||||||
void middlewareSpeedUp240(HTTPRequest *req, HTTPResponse *res, std::function<void()> next);
|
void middlewareSpeedUp240(HTTPRequest *req, HTTPResponse *res, std::function<void()> next);
|
||||||
void middlewareSpeedUp160(HTTPRequest *req, HTTPResponse *res, std::function<void()> next);
|
void middlewareSpeedUp160(HTTPRequest *req, HTTPResponse *res, std::function<void()> next);
|
||||||
@ -76,7 +79,8 @@ char contentTypes[][2][32] = {{".txt", "text/plain"}, {".html", "text/html"}
|
|||||||
{".js", "text/javascript"}, {".png", "image/png"},
|
{".js", "text/javascript"}, {".png", "image/png"},
|
||||||
{".jpg", "image/jpg"}, {".gz", "application/gzip"},
|
{".jpg", "image/jpg"}, {".gz", "application/gzip"},
|
||||||
{".gif", "image/gif"}, {".json", "application/json"},
|
{".gif", "image/gif"}, {".json", "application/json"},
|
||||||
{".css", "text/css"}, {"", ""}};
|
{".css", "text/css"}, {".ico","image/vnd.microsoft.icon"},
|
||||||
|
{".svg", "image/svg+xml"}, {"", ""}};
|
||||||
|
|
||||||
void handleWebResponse()
|
void handleWebResponse()
|
||||||
{
|
{
|
||||||
@ -125,11 +129,12 @@ void taskCreateCert(void *parameter)
|
|||||||
DEBUG_MSG("Existing SSL Certificate found!\n");
|
DEBUG_MSG("Existing SSL Certificate found!\n");
|
||||||
} else {
|
} else {
|
||||||
DEBUG_MSG("Creating the certificate. This may take a while. Please wait...\n");
|
DEBUG_MSG("Creating the certificate. This may take a while. Please wait...\n");
|
||||||
|
yield();
|
||||||
cert = new SSLCert();
|
cert = new SSLCert();
|
||||||
// disableCore1WDT();
|
yield();
|
||||||
int createCertResult = createSelfSignedCert(*cert, KEYSIZE_2048, "CN=meshtastic.local,O=Meshtastic,C=US",
|
int createCertResult = createSelfSignedCert(*cert, KEYSIZE_2048, "CN=meshtastic.local,O=Meshtastic,C=US",
|
||||||
"20190101000000", "20300101000000");
|
"20190101000000", "20300101000000");
|
||||||
// enableCore1WDT();
|
yield();
|
||||||
|
|
||||||
if (createCertResult != 0) {
|
if (createCertResult != 0) {
|
||||||
DEBUG_MSG("Creating the certificate failed\n");
|
DEBUG_MSG("Creating the certificate failed\n");
|
||||||
@ -241,6 +246,9 @@ void initWebServer()
|
|||||||
ResourceNode *node404 = new ResourceNode("", "GET", &handle404);
|
ResourceNode *node404 = new ResourceNode("", "GET", &handle404);
|
||||||
ResourceNode *nodeFormUpload = new ResourceNode("/upload", "POST", &handleFormUpload);
|
ResourceNode *nodeFormUpload = new ResourceNode("/upload", "POST", &handleFormUpload);
|
||||||
ResourceNode *nodeJsonScanNetworks = new ResourceNode("/json/scanNetworks", "GET", &handleScanNetworks);
|
ResourceNode *nodeJsonScanNetworks = new ResourceNode("/json/scanNetworks", "GET", &handleScanNetworks);
|
||||||
|
ResourceNode *nodeJsonBlinkLED = new ResourceNode("/json/blink", "POST", &handleBlinkLED);
|
||||||
|
ResourceNode *nodeJsonSpiffsBrowseStatic = new ResourceNode("/json/spiffs/browse/static/", "GET", &handleSpiffsBrowseStatic);
|
||||||
|
ResourceNode *nodeJsonDelete = new ResourceNode("/json/spiffs/delete/static", "DELETE", &handleSpiffsDeleteStatic);
|
||||||
|
|
||||||
// Secure nodes
|
// Secure nodes
|
||||||
secureServer->registerNode(nodeAPIv1ToRadioOptions);
|
secureServer->registerNode(nodeAPIv1ToRadioOptions);
|
||||||
@ -255,6 +263,9 @@ void initWebServer()
|
|||||||
secureServer->registerNode(nodeRestart);
|
secureServer->registerNode(nodeRestart);
|
||||||
secureServer->registerNode(nodeFormUpload);
|
secureServer->registerNode(nodeFormUpload);
|
||||||
secureServer->registerNode(nodeJsonScanNetworks);
|
secureServer->registerNode(nodeJsonScanNetworks);
|
||||||
|
secureServer->registerNode(nodeJsonBlinkLED);
|
||||||
|
secureServer->registerNode(nodeJsonSpiffsBrowseStatic);
|
||||||
|
secureServer->registerNode(nodeJsonDelete);
|
||||||
secureServer->setDefaultNode(node404);
|
secureServer->setDefaultNode(node404);
|
||||||
|
|
||||||
secureServer->addMiddleware(&middlewareSpeedUp240);
|
secureServer->addMiddleware(&middlewareSpeedUp240);
|
||||||
@ -272,6 +283,9 @@ void initWebServer()
|
|||||||
insecureServer->registerNode(nodeRestart);
|
insecureServer->registerNode(nodeRestart);
|
||||||
insecureServer->registerNode(nodeFormUpload);
|
insecureServer->registerNode(nodeFormUpload);
|
||||||
insecureServer->registerNode(nodeJsonScanNetworks);
|
insecureServer->registerNode(nodeJsonScanNetworks);
|
||||||
|
insecureServer->registerNode(nodeJsonBlinkLED);
|
||||||
|
insecureServer->registerNode(nodeJsonSpiffsBrowseStatic);
|
||||||
|
insecureServer->registerNode(nodeJsonDelete);
|
||||||
insecureServer->setDefaultNode(node404);
|
insecureServer->setDefaultNode(node404);
|
||||||
|
|
||||||
insecureServer->addMiddleware(&middlewareSpeedUp160);
|
insecureServer->addMiddleware(&middlewareSpeedUp160);
|
||||||
@ -379,6 +393,84 @@ void handleStaticPost(HTTPRequest *req, HTTPResponse *res)
|
|||||||
res->println("</body></html>");
|
res->println("</body></html>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handleSpiffsBrowseStatic(HTTPRequest *req, HTTPResponse *res)
|
||||||
|
{
|
||||||
|
// jm
|
||||||
|
|
||||||
|
res->setHeader("Content-Type", "application/json");
|
||||||
|
// res->setHeader("Content-Type", "text/html");
|
||||||
|
|
||||||
|
File root = SPIFFS.open("/");
|
||||||
|
|
||||||
|
if (root.isDirectory()) {
|
||||||
|
res->println("{");
|
||||||
|
res->println("\"data\": {");
|
||||||
|
|
||||||
|
File file = root.openNextFile();
|
||||||
|
res->print("\"files\": [");
|
||||||
|
bool firstFile = 1;
|
||||||
|
while (file) {
|
||||||
|
String filePath = String(file.name());
|
||||||
|
if (filePath.indexOf("/static") == 0) {
|
||||||
|
if (firstFile) {
|
||||||
|
firstFile = 0;
|
||||||
|
} else {
|
||||||
|
res->println(",");
|
||||||
|
}
|
||||||
|
|
||||||
|
res->println("{");
|
||||||
|
|
||||||
|
if (String(file.name()).substring(1).endsWith(".gz")) {
|
||||||
|
String modifiedFile = String(file.name()).substring(1);
|
||||||
|
modifiedFile.remove((modifiedFile.length() - 3), 3);
|
||||||
|
res->print("\"nameModified\": \"" + modifiedFile + "\",");
|
||||||
|
res->print("\"name\": \"" + String(file.name()).substring(1) + "\",");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
res->print("\"name\": \"" + String(file.name()).substring(1) + "\",");
|
||||||
|
}
|
||||||
|
res->print("\"size\": " + String(file.size()));
|
||||||
|
res->print("}");
|
||||||
|
}
|
||||||
|
|
||||||
|
file = root.openNextFile();
|
||||||
|
}
|
||||||
|
res->print("],");
|
||||||
|
res->print("\"filesystem\" : {");
|
||||||
|
res->print("\"total\" : " + String(SPIFFS.totalBytes()) + ",");
|
||||||
|
res->print("\"used\" : " + String(SPIFFS.usedBytes()) + ",");
|
||||||
|
res->print("\"free\" : " + String(SPIFFS.totalBytes() - SPIFFS.usedBytes()));
|
||||||
|
res->println("}");
|
||||||
|
res->println("},");
|
||||||
|
res->println("\"status\": \"ok\"");
|
||||||
|
res->println("}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleSpiffsDeleteStatic(HTTPRequest *req, HTTPResponse *res)
|
||||||
|
{
|
||||||
|
ResourceParameters *params = req->getParams();
|
||||||
|
std::string paramValDelete;
|
||||||
|
|
||||||
|
res->setHeader("Content-Type", "application/json");
|
||||||
|
if (params->getQueryParameter("delete", paramValDelete)) {
|
||||||
|
std::string pathDelete = "/" + paramValDelete;
|
||||||
|
if (SPIFFS.remove(pathDelete.c_str())) {
|
||||||
|
Serial.println(pathDelete.c_str());
|
||||||
|
res->println("{");
|
||||||
|
res->println("\"status\": \"ok\"");
|
||||||
|
res->println("}");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
Serial.println(pathDelete.c_str());
|
||||||
|
res->println("{");
|
||||||
|
res->println("\"status\": \"Error\"");
|
||||||
|
res->println("}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void handleStaticBrowse(HTTPRequest *req, HTTPResponse *res)
|
void handleStaticBrowse(HTTPRequest *req, HTTPResponse *res)
|
||||||
{
|
{
|
||||||
// Get access to the parameters
|
// Get access to the parameters
|
||||||
@ -911,6 +1003,37 @@ void handleRestart(HTTPRequest *req, HTTPResponse *res)
|
|||||||
ESP.restart();
|
ESP.restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handleBlinkLED(HTTPRequest *req, HTTPResponse *res)
|
||||||
|
{
|
||||||
|
res->setHeader("Content-Type", "application/json");
|
||||||
|
|
||||||
|
ResourceParameters *params = req->getParams();
|
||||||
|
std::string blink_target;
|
||||||
|
|
||||||
|
if (!params->getQueryParameter("blink_target", blink_target)) {
|
||||||
|
// if no blink_target was supplied in the URL parameters of the
|
||||||
|
// POST request, then assume we should blink the LED
|
||||||
|
blink_target = "LED";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blink_target == "LED") {
|
||||||
|
uint8_t count = 10;
|
||||||
|
while (count > 0) {
|
||||||
|
setLed(true);
|
||||||
|
delay(50);
|
||||||
|
setLed(false);
|
||||||
|
delay(50);
|
||||||
|
count = count - 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
screen->blink();
|
||||||
|
}
|
||||||
|
|
||||||
|
res->println("{");
|
||||||
|
res->println("\"status\": \"ok\"");
|
||||||
|
res->println("}");
|
||||||
|
}
|
||||||
|
|
||||||
void handleScanNetworks(HTTPRequest *req, HTTPResponse *res)
|
void handleScanNetworks(HTTPRequest *req, HTTPResponse *res)
|
||||||
{
|
{
|
||||||
res->setHeader("Content-Type", "application/json");
|
res->setHeader("Content-Type", "application/json");
|
||||||
@ -933,7 +1056,6 @@ void handleScanNetworks(HTTPRequest *req, HTTPResponse *res)
|
|||||||
ssidString.replace("\"", "\\\"");
|
ssidString.replace("\"", "\\\"");
|
||||||
ssidString.toCharArray(ssidArray, 50);
|
ssidString.toCharArray(ssidArray, 50);
|
||||||
|
|
||||||
|
|
||||||
if (WiFi.encryptionType(i) != WIFI_AUTH_OPEN) {
|
if (WiFi.encryptionType(i) != WIFI_AUTH_OPEN) {
|
||||||
// res->println("{\"ssid\": \"%s\",\"rssi\": -75}, ", String(WiFi.SSID(i).c_str() );
|
// res->println("{\"ssid\": \"%s\",\"rssi\": -75}, ", String(WiFi.SSID(i).c_str() );
|
||||||
|
|
||||||
@ -953,7 +1075,6 @@ void handleScanNetworks(HTTPRequest *req, HTTPResponse *res)
|
|||||||
res->println("},");
|
res->println("},");
|
||||||
res->println("\"status\": \"ok\"");
|
res->println("\"status\": \"ok\"");
|
||||||
res->println("}");
|
res->println("}");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleFavicon(HTTPRequest *req, HTTPResponse *res)
|
void handleFavicon(HTTPRequest *req, HTTPResponse *res)
|
||||||
|
@ -40,12 +40,14 @@ bool isWifiAvailable()
|
|||||||
const char *wifiName = radioConfig.preferences.wifi_ssid;
|
const char *wifiName = radioConfig.preferences.wifi_ssid;
|
||||||
const char *wifiPsw = radioConfig.preferences.wifi_password;
|
const char *wifiPsw = radioConfig.preferences.wifi_password;
|
||||||
|
|
||||||
// strcpy(radioConfig.preferences.wifi_ssid, "");
|
// strcpy(radioConfig.preferences.wifi_ssid, "meshtastic");
|
||||||
// strcpy(radioConfig.preferences.wifi_password, "");
|
// strcpy(radioConfig.preferences.wifi_password, "meshtastic!");
|
||||||
|
|
||||||
// strcpy(radioConfig.preferences.wifi_ssid, "meshtasticAdmin");
|
// strcpy(radioConfig.preferences.wifi_ssid, "meshtasticAdmin");
|
||||||
// strcpy(radioConfig.preferences.wifi_password, "12345678");
|
// strcpy(radioConfig.preferences.wifi_password, "12345678");
|
||||||
|
|
||||||
// radioConfig.preferences.wifi_ap_mode = true;
|
// radioConfig.preferences.wifi_ap_mode = true;
|
||||||
|
// radioConfig.preferences.wifi_ap_mode = false;
|
||||||
|
|
||||||
if (*wifiName && *wifiPsw) {
|
if (*wifiName && *wifiPsw) {
|
||||||
return 1;
|
return 1;
|
||||||
@ -221,10 +223,17 @@ static void WiFiEvent(WiFiEvent_t event)
|
|||||||
DEBUG_MSG("Obtained IP address: \n");
|
DEBUG_MSG("Obtained IP address: \n");
|
||||||
Serial.println(WiFi.localIP());
|
Serial.println(WiFi.localIP());
|
||||||
|
|
||||||
|
if (!APStartupComplete) {
|
||||||
// Start web server
|
// Start web server
|
||||||
|
DEBUG_MSG("... Starting network services\n");
|
||||||
initWebServer();
|
initWebServer();
|
||||||
initApiServer();
|
initApiServer();
|
||||||
|
|
||||||
|
APStartupComplete = true;
|
||||||
|
} else {
|
||||||
|
DEBUG_MSG("... Not starting network services (They're already running)\n");
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SYSTEM_EVENT_STA_LOST_IP:
|
case SYSTEM_EVENT_STA_LOST_IP:
|
||||||
DEBUG_MSG("Lost IP address and IP address is reset to 0\n");
|
DEBUG_MSG("Lost IP address and IP address is reset to 0\n");
|
||||||
@ -253,7 +262,7 @@ static void WiFiEvent(WiFiEvent_t event)
|
|||||||
|
|
||||||
APStartupComplete = true;
|
APStartupComplete = true;
|
||||||
} else {
|
} else {
|
||||||
DEBUG_MSG("... Not starting network services\n");
|
DEBUG_MSG("... Not starting network services (They're already running)\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user