before changing AsyncServer namespace
This commit is contained in:
parent
33dbf3fc7b
commit
b9f10bbd30
6
build.sh
6
build.sh
@ -3,4 +3,10 @@
|
|||||||
# first device connected
|
# first device connected
|
||||||
|
|
||||||
idf.py -DROLE=SENDER build
|
idf.py -DROLE=SENDER build
|
||||||
|
ret_val=$?
|
||||||
|
|
||||||
|
if (($ret_val != 0)); then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp build/wellhub.bin /var/www/esp_ota
|
||||||
|
|||||||
19
main/App.cpp
19
main/App.cpp
@ -7,9 +7,11 @@
|
|||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
|
|
||||||
#include "ProvisionSoftAP.h"
|
#include "ProvisionSoftAP.h"
|
||||||
|
#include "OTA.h"
|
||||||
|
|
||||||
#define LED_PIN 26
|
#define LED_PIN 26
|
||||||
|
|
||||||
|
|
||||||
App::App()
|
App::App()
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -20,21 +22,28 @@ void App::init()
|
|||||||
m_led = new Led(LED_PIN);
|
m_led = new Led(LED_PIN);
|
||||||
m_wifi = new Wifi();
|
m_wifi = new Wifi();
|
||||||
|
|
||||||
|
bool needs_provision = true;
|
||||||
|
|
||||||
if(SETTINGS.wifi.num > 0)
|
if(SETTINGS.wifi.num > 0)
|
||||||
{
|
{
|
||||||
// try connecting
|
// try connecting
|
||||||
m_led->setPulse(0, 255, 0);
|
m_led->setPulse(0, 255, 0);
|
||||||
uint32_t status = m_wifi->connect();
|
uint32_t status = m_wifi->start();
|
||||||
if(status == WH_OK)
|
if(status == WH_OK)
|
||||||
{
|
{
|
||||||
m_led->setColor(0, 0, 0);
|
m_led->setColor(0, 0, 0);
|
||||||
return;
|
needs_provision = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_led->setPulse(0, 0, 255);
|
if(needs_provision)
|
||||||
ProvisionSoftAP p(80);
|
{
|
||||||
p.init("wellhub", "12345678");
|
m_led->setPulse(0, 0, 255);
|
||||||
|
ProvisionSoftAP provision(80);
|
||||||
|
provision.start();
|
||||||
|
}
|
||||||
|
OTA ota;
|
||||||
|
ota.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::start()
|
void App::start()
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
idf_component_register(SRCS main.cpp App.cpp Settings.cpp Led.cpp TaskFactory.cpp Wifi.cpp utilities.cpp
|
idf_component_register(SRCS main.cpp App.cpp Settings.cpp Led.cpp TaskFactory.cpp Wifi.cpp utilities.cpp
|
||||||
ProvisionSoftAP.cpp ReaderWriter.cpp
|
ProvisionSoftAP.cpp ReaderWriter.cpp OTA.cpp
|
||||||
INCLUDE_DIRS "."
|
INCLUDE_DIRS "."
|
||||||
EMBED_TXTFILES ../html/logo.png ../html/provision.html
|
EMBED_TXTFILES ../html/logo.png ../html/provision.html
|
||||||
)
|
)
|
||||||
|
|||||||
@ -58,7 +58,6 @@ void Led::run()
|
|||||||
|
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
// vTaskSuspend(NULL);
|
|
||||||
xQueueReceive(m_queue, &msg, portMAX_DELAY);
|
xQueueReceive(m_queue, &msg, portMAX_DELAY);
|
||||||
|
|
||||||
if(msg.program == PROGRAM::STEADY)
|
if(msg.program == PROGRAM::STEADY)
|
||||||
|
|||||||
@ -12,12 +12,9 @@ class Led
|
|||||||
struct LED_QUEUE
|
struct LED_QUEUE
|
||||||
{
|
{
|
||||||
uint8_t program;
|
uint8_t program;
|
||||||
struct
|
uint8_t r;
|
||||||
{
|
uint8_t g;
|
||||||
uint8_t r;
|
uint8_t b;
|
||||||
uint8_t g;
|
|
||||||
uint8_t b;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
225
main/OTA.cpp
Normal file
225
main/OTA.cpp
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
/*
|
||||||
|
* OTA.cpp
|
||||||
|
*
|
||||||
|
* Created on: Apr 23, 2019
|
||||||
|
* Author: miro
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "esp_system.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "esp_ota_ops.h"
|
||||||
|
|
||||||
|
#include "esp_flash_partitions.h"
|
||||||
|
#include "esp_partition.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
#include "OTA.h"
|
||||||
|
|
||||||
|
#define EXAMPLE_SERVER_URL "http://192.168.1.131/wellhub.bin"
|
||||||
|
|
||||||
|
static const char *TAG = "OTA";
|
||||||
|
|
||||||
|
#define _FORCE_UPDATE
|
||||||
|
|
||||||
|
OTA::OTA()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void OTA::httpCleanup(esp_http_client_handle_t client)
|
||||||
|
{
|
||||||
|
esp_http_client_close(client);
|
||||||
|
esp_http_client_cleanup(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OTA::taskFatalError()
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "Exiting task due to fatal error...");
|
||||||
|
(void) vTaskDelete(NULL);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OTA::start()
|
||||||
|
{
|
||||||
|
esp_err_t err;
|
||||||
|
/* update handle : set by esp_ota_begin(), must be freed via esp_ota_end() */
|
||||||
|
esp_ota_handle_t update_handle = 0;
|
||||||
|
const esp_partition_t *update_partition = NULL;
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Starting OTA check...");
|
||||||
|
|
||||||
|
const esp_partition_t *configured = esp_ota_get_boot_partition();
|
||||||
|
const esp_partition_t *running = esp_ota_get_running_partition();
|
||||||
|
|
||||||
|
if (configured != running)
|
||||||
|
{
|
||||||
|
ESP_LOGW(TAG, "Configured OTA boot partition at offset 0x%08x, but running from offset 0x%08x",
|
||||||
|
configured->address, running->address);
|
||||||
|
ESP_LOGW(TAG,
|
||||||
|
"(This can happen if either the OTA boot data or preferred boot image become corrupted somehow.)");
|
||||||
|
}
|
||||||
|
ESP_LOGI(TAG, "Running partition type %d subtype %d (offset 0x%08x)", running->type, running->subtype,
|
||||||
|
running->address);
|
||||||
|
|
||||||
|
esp_http_client_config_t config = { };
|
||||||
|
config.url = EXAMPLE_SERVER_URL;
|
||||||
|
|
||||||
|
esp_http_client_handle_t client = esp_http_client_init(&config);
|
||||||
|
if (client == NULL)
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "Failed to initialize HTTP connection");
|
||||||
|
}
|
||||||
|
err = esp_http_client_open(client, 0);
|
||||||
|
if (err != ESP_OK)
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
|
||||||
|
esp_http_client_cleanup(client);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
esp_http_client_fetch_headers(client);
|
||||||
|
|
||||||
|
update_partition = esp_ota_get_next_update_partition(NULL);
|
||||||
|
ESP_LOGI(TAG, "Writing to partition subtype %d at offset 0x%x", update_partition->subtype,
|
||||||
|
update_partition->address);
|
||||||
|
assert(update_partition != NULL);
|
||||||
|
|
||||||
|
int binary_file_length = 0;
|
||||||
|
/*deal with all receive packet*/
|
||||||
|
bool image_header_was_checked = false;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
int data_read = esp_http_client_read(client, otaWriteData, BUFFSIZE);
|
||||||
|
if (data_read < 0)
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "Error: SSL data read error");
|
||||||
|
esp_http_client_close(client);
|
||||||
|
esp_http_client_cleanup(client);
|
||||||
|
taskFatalError();
|
||||||
|
}
|
||||||
|
else if (data_read > 0)
|
||||||
|
{
|
||||||
|
printf(".");
|
||||||
|
if (image_header_was_checked == false)
|
||||||
|
{
|
||||||
|
// this is the first 1k of received image
|
||||||
|
esp_app_desc_t new_app_info;
|
||||||
|
if (data_read > sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t))
|
||||||
|
{
|
||||||
|
// check current version with downloading
|
||||||
|
memcpy(&new_app_info,
|
||||||
|
&otaWriteData[sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t)],
|
||||||
|
sizeof(esp_app_desc_t));
|
||||||
|
ESP_LOGI(TAG, "New firmware");
|
||||||
|
ESP_LOGI(TAG, "version: %s", new_app_info.version);
|
||||||
|
ESP_LOGI(TAG, " name: %s", new_app_info.project_name);
|
||||||
|
ESP_LOGI(TAG, " c time: %s", new_app_info.time);
|
||||||
|
ESP_LOGI(TAG, " c date: %s", new_app_info.date);
|
||||||
|
ESP_LOGI(TAG, "idf ver: %s", new_app_info.idf_ver);
|
||||||
|
// ESP_LOGI(TAG, " sha: %s", new_app_info.app_elf_sha256);
|
||||||
|
|
||||||
|
esp_app_desc_t running_app_info;
|
||||||
|
if (esp_ota_get_partition_description(running, &running_app_info) == ESP_OK)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "");
|
||||||
|
ESP_LOGI(TAG, "Running firmware");
|
||||||
|
ESP_LOGI(TAG, "version: %s", running_app_info.version);
|
||||||
|
ESP_LOGI(TAG, " name: %s", running_app_info.project_name);
|
||||||
|
ESP_LOGI(TAG, " c time: %s", running_app_info.time);
|
||||||
|
ESP_LOGI(TAG, " c date: %s", running_app_info.date);
|
||||||
|
ESP_LOGI(TAG, "idf ver: %s", running_app_info.idf_ver);
|
||||||
|
// ESP_LOGI(TAG, " sha: %s", running_app_info.app_elf_sha256);
|
||||||
|
}
|
||||||
|
|
||||||
|
const esp_partition_t* last_invalid_app = esp_ota_get_last_invalid_partition();
|
||||||
|
esp_app_desc_t invalid_app_info;
|
||||||
|
if (esp_ota_get_partition_description(last_invalid_app, &invalid_app_info) == ESP_OK)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Last invalid firmware version: %s", invalid_app_info.version);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check current version with last invalid partition
|
||||||
|
if (last_invalid_app != NULL)
|
||||||
|
{
|
||||||
|
if (memcmp(invalid_app_info.version, new_app_info.version, sizeof(new_app_info.version) + sizeof(new_app_info.project_name) + sizeof(new_app_info.time)) == 0)
|
||||||
|
{
|
||||||
|
ESP_LOGW(TAG, "New version is the same as invalid version.");
|
||||||
|
ESP_LOGW(TAG, "Previously, there was an attempt to launch the firmware with %s version, but it failed.",
|
||||||
|
invalid_app_info.version);
|
||||||
|
ESP_LOGW(TAG, "The firmware has been rolled back to the previous version.");
|
||||||
|
httpCleanup(client);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifndef FORCE_UPDATE
|
||||||
|
if (memcmp(new_app_info.version, running_app_info.version, sizeof(new_app_info.version) + sizeof(new_app_info.project_name) + sizeof(new_app_info.time) + sizeof(new_app_info.date)) == 0)
|
||||||
|
{
|
||||||
|
ESP_LOGW(TAG, "Current running version is the same as a new. We will not continue the update.");
|
||||||
|
httpCleanup(client);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
image_header_was_checked = true;
|
||||||
|
|
||||||
|
err = esp_ota_begin(update_partition, OTA_SIZE_UNKNOWN, &update_handle);
|
||||||
|
if (err != ESP_OK)
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "esp_ota_begin failed (%s)", esp_err_to_name(err));
|
||||||
|
httpCleanup(client);
|
||||||
|
taskFatalError();
|
||||||
|
}
|
||||||
|
ESP_LOGI(TAG, "esp_ota_begin succeeded");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "received package is not fit len");
|
||||||
|
httpCleanup(client);
|
||||||
|
taskFatalError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = esp_ota_write(update_handle, (const void *) otaWriteData, data_read);
|
||||||
|
if (err != ESP_OK)
|
||||||
|
{
|
||||||
|
httpCleanup(client);
|
||||||
|
taskFatalError();
|
||||||
|
}
|
||||||
|
binary_file_length += data_read;
|
||||||
|
ESP_LOGD(TAG, "Written image length %d", binary_file_length);
|
||||||
|
}
|
||||||
|
else if (data_read == 0)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Connection closed,all data received");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Total Write binary data length : %d", binary_file_length);
|
||||||
|
|
||||||
|
if (esp_ota_end(update_handle) != ESP_OK)
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "esp_ota_end failed!");
|
||||||
|
httpCleanup(client);
|
||||||
|
taskFatalError();
|
||||||
|
}
|
||||||
|
|
||||||
|
err = esp_ota_set_boot_partition(update_partition);
|
||||||
|
if (err != ESP_OK)
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(err));
|
||||||
|
httpCleanup(client);
|
||||||
|
taskFatalError();
|
||||||
|
}
|
||||||
|
ESP_LOGI(TAG, "Prepare to restart system!");
|
||||||
|
esp_restart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OTA::~OTA()
|
||||||
|
{
|
||||||
|
}
|
||||||
34
main/OTA.h
Normal file
34
main/OTA.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* OTA.h
|
||||||
|
*
|
||||||
|
* Created on: Apr 23, 2019
|
||||||
|
* Author: miro
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __OTA_H__
|
||||||
|
#define __OTA_H__
|
||||||
|
|
||||||
|
|
||||||
|
#define BUFFSIZE 1024
|
||||||
|
#define HASH_LEN 32 /* SHA-256 digest length */
|
||||||
|
|
||||||
|
#include "esp_http_client.h"
|
||||||
|
|
||||||
|
class OTA
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void start();
|
||||||
|
|
||||||
|
private:
|
||||||
|
char otaWriteData[BUFFSIZE + 1] = { 0 };
|
||||||
|
void httpCleanup(esp_http_client_handle_t client);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void taskFatalError();
|
||||||
|
|
||||||
|
public:
|
||||||
|
OTA();
|
||||||
|
virtual ~OTA();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __OTA_H__ */
|
||||||
@ -1,10 +1,10 @@
|
|||||||
/*
|
///
|
||||||
* ProvisionSoftAP.cpp
|
/// © MiroZ 2024
|
||||||
*
|
///
|
||||||
* Created on: Apr 17, 2019
|
/// Created on: Apr 17, 2019
|
||||||
* Modified: 2024
|
/// Modified: 2024
|
||||||
* Author: miro
|
///
|
||||||
*/
|
|
||||||
#include <DNSServer.h>
|
#include <DNSServer.h>
|
||||||
#include "WiFi.h"
|
#include "WiFi.h"
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
@ -100,7 +100,7 @@ void ProvisionSoftAP::handleLogo(AsyncWebServerRequest* request)
|
|||||||
* ssid[in] ssid of the AP
|
* ssid[in] ssid of the AP
|
||||||
* password[in] password for the AP
|
* password[in] password for the AP
|
||||||
*/
|
*/
|
||||||
void ProvisionSoftAP::init(const char * ssid, const char * password)
|
void ProvisionSoftAP::start(const char * ssid, const char * password)
|
||||||
{
|
{
|
||||||
// start AP
|
// start AP
|
||||||
|
|
||||||
@ -125,43 +125,14 @@ void ProvisionSoftAP::init(const char * ssid, const char * password)
|
|||||||
m_webSocket->onEvent(std::bind(&ProvisionSoftAP::websocketEvent, this, _1, _2, _3, _4, _5, _6));
|
m_webSocket->onEvent(std::bind(&ProvisionSoftAP::websocketEvent, this, _1, _2, _3, _4, _5, _6));
|
||||||
m_webServer->addHandler(m_webSocket);
|
m_webServer->addHandler(m_webSocket);
|
||||||
m_webServer->on("/", std::bind(&ProvisionSoftAP::handlePortal, this, _1));
|
m_webServer->on("/", std::bind(&ProvisionSoftAP::handlePortal, this, _1));
|
||||||
m_webServer->on("/provision.html", std::bind(&ProvisionSoftAP::handlePortal, this, _1));
|
// m_webServer->on("/provision.html", std::bind(&ProvisionSoftAP::handlePortal, this, _1));
|
||||||
m_webServer->on("/generate_204", std::bind(&ProvisionSoftAP::handlePortal, this, _1)); //Android captive portal. Maybe not needed. Might be handled by notFound handler.
|
// m_webServer->on("/generate_204", std::bind(&ProvisionSoftAP::handlePortal, this, _1)); //Android captive portal. Maybe not needed. Might be handled by notFound handler.
|
||||||
m_webServer->on("/fwlink", std::bind(&ProvisionSoftAP::handlePortal, this, _1)); //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler.
|
// m_webServer->on("/fwlink", std::bind(&ProvisionSoftAP::handlePortal, this, _1)); //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler.
|
||||||
m_webServer->on("/logo.png", std::bind(&ProvisionSoftAP::handleLogo, this, _1));
|
m_webServer->on("/logo.png", std::bind(&ProvisionSoftAP::handleLogo, this, _1));
|
||||||
m_webServer->onNotFound(std::bind(&ProvisionSoftAP::handlePortal, this, _1));
|
m_webServer->onNotFound(std::bind(&ProvisionSoftAP::handlePortal, this, _1));
|
||||||
|
|
||||||
m_webServer->begin();
|
m_webServer->begin();
|
||||||
|
|
||||||
// char buf[64], buf1[32];
|
|
||||||
// m_rwriter->copyString("command:verify_wifi|ssid:gumball|pwd:12345688");
|
|
||||||
// ESP_LOGI(TAG, "%d", m_rwriter->elementIs(0, "command:verify_wifi"));
|
|
||||||
|
|
||||||
|
|
||||||
// uint32_t loc = m_rwriter->getNthDelimiter(0);
|
|
||||||
// if(m_rwriter->hasMore(loc))
|
|
||||||
// ESP_LOGI(TAG, "%d", loc);
|
|
||||||
// while(m_rwriter->hasMore(loc))
|
|
||||||
// {
|
|
||||||
// loc = m_rwriter->getNextDelimiter(loc);
|
|
||||||
// ESP_LOGI(TAG, "%d", loc);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if(m_rwriter->getElementAt(buf, 64, 3))
|
|
||||||
// ESP_LOGI(TAG, "'%s'", buf);
|
|
||||||
|
|
||||||
// bool ret_val = m_rwriter->getAt(buf, 64, 3);
|
|
||||||
// ESP_LOGI(TAG, "(%d) '%s'", ret_val, buf);
|
|
||||||
|
|
||||||
// Parser p(buf, ":");
|
|
||||||
|
|
||||||
// while(m_rwriter->getNext(buf, 64))
|
|
||||||
// {
|
|
||||||
// p.reset();
|
|
||||||
// while(p.getNext(buf1, 32))
|
|
||||||
// ESP_LOGI(TAG, "'%s'", buf1);
|
|
||||||
// }
|
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
m_dnsServer.processNextRequest();
|
m_dnsServer.processNextRequest();
|
||||||
@ -202,6 +173,16 @@ void ProvisionSoftAP::init(const char * ssid, const char * password)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProvisionSoftAP::start()
|
||||||
|
{
|
||||||
|
uint8_t mac[6];
|
||||||
|
WiFi.macAddress(mac);
|
||||||
|
char ssid[33];
|
||||||
|
|
||||||
|
sprintf(ssid, "Wellhub-%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||||
|
start(ssid, "12345678");
|
||||||
|
}
|
||||||
|
|
||||||
const char verify_wifi[] = "command:verify_wifi";
|
const char verify_wifi[] = "command:verify_wifi";
|
||||||
|
|
||||||
void ProvisionSoftAP::parseWebsocketCommand(char* data, size_t len)
|
void ProvisionSoftAP::parseWebsocketCommand(char* data, size_t len)
|
||||||
@ -282,7 +263,7 @@ void ProvisionSoftAP::tryConnect()
|
|||||||
SETTINGS.wifi.selected = 0;
|
SETTINGS.wifi.selected = 0;
|
||||||
SETTINGS.wifi.num = 1;
|
SETTINGS.wifi.num = 1;
|
||||||
|
|
||||||
Settings::getInstance().saveData();
|
SETTINGS_SAVE;
|
||||||
|
|
||||||
vTaskDelay(3000 / portTICK_PERIOD_MS);
|
vTaskDelay(3000 / portTICK_PERIOD_MS);
|
||||||
waitBufferEmpty();
|
waitBufferEmpty();
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
/*
|
///
|
||||||
* ProvisionSoftAP.h
|
/// © MiroZ 2024
|
||||||
*
|
///
|
||||||
* Created on: Apr 17, 2019
|
/// Created on: Apr 17, 2019
|
||||||
* Author: miro
|
/// Modified: 2024
|
||||||
*/
|
///
|
||||||
|
|
||||||
#ifndef MAIN_PROVISIONSOFTAP_H_
|
#ifndef __PROVISIONSOFTAP_H__
|
||||||
#define MAIN_PROVISIONSOFTAP_H_
|
#define __PROVISIONSOFTAP_H__
|
||||||
|
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
#include <DNSServer.h>
|
#include <DNSServer.h>
|
||||||
@ -43,10 +43,11 @@ private:
|
|||||||
void waitBufferEmpty();
|
void waitBufferEmpty();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void init(const char * ssid, const char * password);
|
void start(const char * ssid, const char * password);
|
||||||
|
void start();
|
||||||
|
|
||||||
ProvisionSoftAP(int port = 80);
|
ProvisionSoftAP(int port = 80);
|
||||||
virtual ~ProvisionSoftAP();
|
virtual ~ProvisionSoftAP();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* MAIN_PROVISIONSOFTAP_H_ */
|
#endif /* __PROVISIONSOFTAP_H__ */
|
||||||
|
|||||||
@ -70,7 +70,7 @@ struct SETTINGS_LEGACY
|
|||||||
uint32_t TEMP_OFFSET;
|
uint32_t TEMP_OFFSET;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SETTINGS_VERSION 3 // cannot be 0
|
#define SETTINGS_VERSION 2 // cannot be 0
|
||||||
#define SETTINGS_NUM_WIFI_ENTRIES 8
|
#define SETTINGS_NUM_WIFI_ENTRIES 8
|
||||||
|
|
||||||
// wifi definitions
|
// wifi definitions
|
||||||
@ -126,5 +126,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define SETTINGS Settings::getInstance().data()
|
#define SETTINGS Settings::getInstance().data()
|
||||||
|
#define SETTINGS_SAVE Settings::getInstance().saveData()
|
||||||
|
|
||||||
#endif /* __SETTINGS_H__ */
|
#endif /* __SETTINGS_H__ */
|
||||||
@ -4,27 +4,34 @@
|
|||||||
|
|
||||||
TaskFactory::TaskFactory()
|
TaskFactory::TaskFactory()
|
||||||
{
|
{
|
||||||
|
#ifdef USE_MUTEX
|
||||||
m_xMutex = xSemaphoreCreateMutex();
|
m_xMutex = xSemaphoreCreateMutex();
|
||||||
assert(m_xMutex);
|
assert(m_xMutex);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskFactory::~TaskFactory()
|
TaskFactory::~TaskFactory()
|
||||||
{
|
{
|
||||||
|
#ifdef USE_MUTEX
|
||||||
if(m_xMutex != NULL)
|
if(m_xMutex != NULL)
|
||||||
vSemaphoreDelete(m_xMutex);
|
vSemaphoreDelete(m_xMutex);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskHandle_t TaskFactory::createTask(TASK_FUNCTION task_function, const char *name, uint32_t stack_size, UBaseType_t priority, BaseType_t core)
|
TaskHandle_t TaskFactory::createTask(TASK_FUNCTION task_function, const char *name, uint32_t stack_size, UBaseType_t priority, BaseType_t core)
|
||||||
{
|
{
|
||||||
TaskHandle_t task_handle = nullptr;
|
TaskHandle_t task_handle = nullptr;
|
||||||
|
|
||||||
|
#ifdef USE_MUTEX
|
||||||
if (xSemaphoreTake(m_xMutex, portMAX_DELAY))
|
if (xSemaphoreTake(m_xMutex, portMAX_DELAY))
|
||||||
{
|
{
|
||||||
|
#endif
|
||||||
m_task_function = task_function;
|
m_task_function = task_function;
|
||||||
xTaskCreatePinnedToCore(taskStarter, name, stack_size, this, priority, &task_handle, core);
|
xTaskCreatePinnedToCore(taskStarter, name, stack_size, this, priority, &task_handle, core);
|
||||||
|
#ifdef USE_MUTEX
|
||||||
xSemaphoreGive(m_xMutex);
|
xSemaphoreGive(m_xMutex);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return task_handle;
|
return task_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,26 +12,24 @@
|
|||||||
|
|
||||||
typedef std::function<void()> TASK_FUNCTION;
|
typedef std::function<void()> TASK_FUNCTION;
|
||||||
|
|
||||||
|
// no need for mutex here
|
||||||
|
#define _USE_MUTEX
|
||||||
|
|
||||||
class TaskFactory
|
class TaskFactory
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
#ifdef USE_MUTEX
|
||||||
SemaphoreHandle_t m_xMutex = NULL;
|
SemaphoreHandle_t m_xMutex = NULL;
|
||||||
|
#endif
|
||||||
TASK_FUNCTION m_task_function = nullptr;
|
TASK_FUNCTION m_task_function = nullptr;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void taskStarter(void * ptr) {
|
static void taskStarter(void * ptr) { (static_cast<TaskFactory*>(ptr)->run()); }
|
||||||
(static_cast<TaskFactory*>(ptr)->run());
|
void run(){ m_task_function(); }
|
||||||
}
|
|
||||||
void run(){
|
|
||||||
m_task_function();
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TaskHandle_t createTask(TASK_FUNCTION task_function, const char *name, uint32_t stack_size, UBaseType_t priority, BaseType_t core);
|
TaskHandle_t createTask(TASK_FUNCTION task_function, const char *name, uint32_t stack_size, UBaseType_t priority, BaseType_t core);
|
||||||
|
static uint32_t getStackHighWaterMark(TaskHandle_t task){ return (uint32_t)uxTaskGetStackHighWaterMark(task); }
|
||||||
static uint32_t getStackHighWaterMark(TaskHandle_t task){
|
|
||||||
return (uint32_t)uxTaskGetStackHighWaterMark(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
TaskFactory();
|
TaskFactory();
|
||||||
~TaskFactory();
|
~TaskFactory();
|
||||||
|
|||||||
@ -84,7 +84,7 @@ uint32_t Wifi::connectTo(int index)
|
|||||||
|
|
||||||
/// @brief Connects to wifi. Returns immediately if already connected.
|
/// @brief Connects to wifi. Returns immediately if already connected.
|
||||||
/// @return WH_OK | WH_ERR_WIFI_NOT_PROVISIONED
|
/// @return WH_OK | WH_ERR_WIFI_NOT_PROVISIONED
|
||||||
uint32_t Wifi::connect()
|
uint32_t Wifi::start()
|
||||||
{
|
{
|
||||||
if(SETTINGS.wifi.num == 0)
|
if(SETTINGS.wifi.num == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -27,7 +27,7 @@ protected:
|
|||||||
void wifi_event(arduino_event_id_t event, arduino_event_info_t info);
|
void wifi_event(arduino_event_id_t event, arduino_event_info_t info);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
uint32_t connect();
|
uint32_t start();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __WIFI_H__ */
|
#endif /* __WIFI_H__ */
|
||||||
2
make.sh
2
make.sh
@ -10,6 +10,8 @@ if (($ret_val != 0)); then
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
cp build/wellhub.bin /var/www/esp_ota
|
||||||
|
|
||||||
if [$1 == '']; then
|
if [$1 == '']; then
|
||||||
idf.py -p /dev/ttyUSB1 -b 2000000 flash && idf.py -p /dev/ttyUSB1 monitor -B 450000
|
idf.py -p /dev/ttyUSB1 -b 2000000 flash && idf.py -p /dev/ttyUSB1 monitor -B 450000
|
||||||
else
|
else
|
||||||
|
|||||||
@ -45,7 +45,7 @@ CONFIG_ENABLE_ARDUINO_DEPENDS=y
|
|||||||
CONFIG_ARDUINO_RUN_CORE1=y
|
CONFIG_ARDUINO_RUN_CORE1=y
|
||||||
# CONFIG_ARDUINO_RUN_NO_AFFINITY is not set
|
# CONFIG_ARDUINO_RUN_NO_AFFINITY is not set
|
||||||
CONFIG_ARDUINO_RUNNING_CORE=1
|
CONFIG_ARDUINO_RUNNING_CORE=1
|
||||||
CONFIG_ARDUINO_LOOP_STACK_SIZE=8192
|
CONFIG_ARDUINO_LOOP_STACK_SIZE=1024
|
||||||
# CONFIG_ARDUINO_EVENT_RUN_CORE0 is not set
|
# CONFIG_ARDUINO_EVENT_RUN_CORE0 is not set
|
||||||
CONFIG_ARDUINO_EVENT_RUN_CORE1=y
|
CONFIG_ARDUINO_EVENT_RUN_CORE1=y
|
||||||
# CONFIG_ARDUINO_EVENT_RUN_NO_AFFINITY is not set
|
# CONFIG_ARDUINO_EVENT_RUN_NO_AFFINITY is not set
|
||||||
|
|||||||
@ -190,6 +190,16 @@ CONFIG_PARTITION_TABLE_OFFSET=0x8000
|
|||||||
CONFIG_PARTITION_TABLE_MD5=y
|
CONFIG_PARTITION_TABLE_MD5=y
|
||||||
# end of Partition Table
|
# end of Partition Table
|
||||||
|
|
||||||
|
#
|
||||||
|
# AsyncTCP Configuration
|
||||||
|
#
|
||||||
|
# CONFIG_ASYNC_TCP_RUN_CORE0 is not set
|
||||||
|
CONFIG_ASYNC_TCP_RUN_CORE1=y
|
||||||
|
# CONFIG_ASYNC_TCP_RUN_NO_AFFINITY is not set
|
||||||
|
CONFIG_ASYNC_TCP_RUNNING_CORE=1
|
||||||
|
CONFIG_ASYNC_TCP_USE_WDT=y
|
||||||
|
# end of AsyncTCP Configuration
|
||||||
|
|
||||||
#
|
#
|
||||||
# Compiler options
|
# Compiler options
|
||||||
#
|
#
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user