OTA (experimental)
This commit is contained in:
parent
01fa10e3fd
commit
b12ed126b7
@ -278,6 +278,7 @@ Note: all settings are stored in NVRAM and will be reloaded when device starts.
|
|||||||
1 = reset MAC counter to zero
|
1 = reset MAC counter to zero
|
||||||
2 = reset device to factory settings
|
2 = reset device to factory settings
|
||||||
3 = flush send queues
|
3 = flush send queues
|
||||||
|
9 = OTA software update via Wifi
|
||||||
|
|
||||||
0x0A set LoRaWAN payload send cycle
|
0x0A set LoRaWAN payload send cycle
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@
|
|||||||
;env_default = heltec
|
;env_default = heltec
|
||||||
;env_default = ttgov1
|
;env_default = ttgov1
|
||||||
;env_default = ttgov2
|
;env_default = ttgov2
|
||||||
;env_default = ttgov21
|
env_default = ttgov21
|
||||||
env_default = ttgobeam
|
;env_default = ttgobeam
|
||||||
;env_default = lopy
|
;env_default = lopy
|
||||||
;env_default = lopy4
|
;env_default = lopy4
|
||||||
;env_default = fipy
|
;env_default = fipy
|
||||||
@ -29,7 +29,7 @@ package = ttgov21_old
|
|||||||
api_token = 2e10f923df5d47b9c7e25752510322a1d65ee997
|
api_token = 2e10f923df5d47b9c7e25752510322a1d65ee997
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
release_version = 5
|
release_version = 6
|
||||||
|
|
||||||
[ota]
|
[ota]
|
||||||
; build configuration based on Bintray and Wi-Fi settings
|
; build configuration based on Bintray and Wi-Fi settings
|
||||||
@ -62,6 +62,7 @@ build_flags =
|
|||||||
-D_lmic_config_h_
|
-D_lmic_config_h_
|
||||||
-include "src/paxcounter.conf"
|
-include "src/paxcounter.conf"
|
||||||
-include "src/hal/${PIOENV}.h"
|
-include "src/hal/${PIOENV}.h"
|
||||||
|
${ota.build_flags}
|
||||||
-w
|
-w
|
||||||
; ---> NOTE: For production run set DEBUG_LEVEL level to NONE! <---
|
; ---> NOTE: For production run set DEBUG_LEVEL level to NONE! <---
|
||||||
; otherwise device may leak RAM
|
; otherwise device may leak RAM
|
||||||
@ -89,7 +90,6 @@ monitor_speed = 115200
|
|||||||
lib_deps =
|
lib_deps =
|
||||||
${common_env_data.lib_deps_all}
|
${common_env_data.lib_deps_all}
|
||||||
build_flags =
|
build_flags =
|
||||||
${ota.build_flags}
|
|
||||||
${common_env_data.build_flags}
|
${common_env_data.build_flags}
|
||||||
|
|
||||||
[env:heltec]
|
[env:heltec]
|
||||||
@ -143,6 +143,9 @@ lib_deps =
|
|||||||
${common_env_data.lib_deps_display}
|
${common_env_data.lib_deps_display}
|
||||||
build_flags =
|
build_flags =
|
||||||
${common_env_data.build_flags}
|
${common_env_data.build_flags}
|
||||||
|
;upload_protocol = custom
|
||||||
|
;extra_scripts = pre:publish_firmware.py
|
||||||
|
|
||||||
|
|
||||||
[env:ttgobeam]
|
[env:ttgobeam]
|
||||||
platform = ${common_env_data.platform_espressif32}
|
platform = ${common_env_data.platform_espressif32}
|
||||||
@ -155,11 +158,10 @@ lib_deps =
|
|||||||
${common_env_data.lib_deps_all}
|
${common_env_data.lib_deps_all}
|
||||||
${common_env_data.lib_deps_gps}
|
${common_env_data.lib_deps_gps}
|
||||||
build_flags =
|
build_flags =
|
||||||
${ota.build_flags}
|
|
||||||
${common_env_data.build_flags}
|
${common_env_data.build_flags}
|
||||||
-mfix-esp32-psram-cache-issue
|
-mfix-esp32-psram-cache-issue
|
||||||
upload_protocol = custom
|
;upload_protocol = custom
|
||||||
extra_scripts = pre:publish_firmware.py
|
;extra_scripts = pre:publish_firmware.py
|
||||||
|
|
||||||
[env:fipy]
|
[env:fipy]
|
||||||
platform = ${common_env_data.platform_espressif32}
|
platform = ${common_env_data.platform_espressif32}
|
||||||
@ -200,7 +202,6 @@ lib_deps =
|
|||||||
${common_env_data.lib_deps_rgbled}
|
${common_env_data.lib_deps_rgbled}
|
||||||
${common_env_data.lib_deps_gps}
|
${common_env_data.lib_deps_gps}
|
||||||
build_flags =
|
build_flags =
|
||||||
${ota.build_flags}
|
|
||||||
${common_env_data.build_flags}
|
${common_env_data.build_flags}
|
||||||
-mfix-esp32-psram-cache-issue
|
-mfix-esp32-psram-cache-issue
|
||||||
|
|
||||||
@ -256,5 +257,4 @@ lib_deps =
|
|||||||
${common_env_data.lib_deps_gps}
|
${common_env_data.lib_deps_gps}
|
||||||
${common_env_data.lib_deps_display}
|
${common_env_data.lib_deps_display}
|
||||||
build_flags =
|
build_flags =
|
||||||
${ota.build_flags}
|
|
||||||
${common_env_data.build_flags}
|
${common_env_data.build_flags}
|
||||||
|
10
src/OTA.cpp
10
src/OTA.cpp
@ -36,16 +36,8 @@ volatile bool isValidContentType = false;
|
|||||||
static const char TAG[] = "main";
|
static const char TAG[] = "main";
|
||||||
|
|
||||||
void start_ota_update() {
|
void start_ota_update() {
|
||||||
ota_update = false; // clear ota trigger switch
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Stopping Wifi scanner");
|
|
||||||
vTaskDelete(WifiLoopTask);
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Starting Wifi OTA update");
|
ESP_LOGI(TAG, "Starting Wifi OTA update");
|
||||||
// switch off monitor more
|
|
||||||
ESP_ERROR_CHECK(
|
|
||||||
esp_wifi_set_promiscuous(false)); // now switch on monitor mode
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_set_promiscuous_rx_cb(NULL));
|
|
||||||
|
|
||||||
WiFi.begin(WIFI_SSID, WIFI_PASS);
|
WiFi.begin(WIFI_SSID, WIFI_PASS);
|
||||||
|
|
||||||
@ -56,7 +48,7 @@ void start_ota_update() {
|
|||||||
|
|
||||||
ESP_LOGI(TAG, "connected to %s", WIFI_SSID);
|
ESP_LOGI(TAG, "connected to %s", WIFI_SSID);
|
||||||
|
|
||||||
checkFirmwareUpdates();
|
checkFirmwareUpdates(); // gets and flashes new firmware and restarts
|
||||||
ESP.restart(); // reached only if update was not successful
|
ESP.restart(); // reached only if update was not successful
|
||||||
|
|
||||||
} // start_ota_update
|
} // start_ota_update
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "wifiscan.h"
|
|
||||||
|
|
||||||
void checkFirmwareUpdates();
|
void checkFirmwareUpdates();
|
||||||
void processOTAUpdate(const String &version);
|
void processOTAUpdate(const String &version);
|
||||||
|
@ -31,6 +31,7 @@ void defaultConfig() {
|
|||||||
cfg.rgblum = RGBLUMINOSITY; // RGB Led luminosity (0..100%)
|
cfg.rgblum = RGBLUMINOSITY; // RGB Led luminosity (0..100%)
|
||||||
cfg.gpsmode = 1; // 0=disabled, 1=enabled
|
cfg.gpsmode = 1; // 0=disabled, 1=enabled
|
||||||
cfg.monitormode = 0; // 0=disabled, 1=enabled
|
cfg.monitormode = 0; // 0=disabled, 1=enabled
|
||||||
|
cfg.runmode = 0; // 0=normal, 1=update
|
||||||
|
|
||||||
strncpy(cfg.version, PROGVERSION, sizeof(cfg.version) - 1);
|
strncpy(cfg.version, PROGVERSION, sizeof(cfg.version) - 1);
|
||||||
}
|
}
|
||||||
@ -143,6 +144,10 @@ void saveConfig() {
|
|||||||
flash8 != cfg.monitormode)
|
flash8 != cfg.monitormode)
|
||||||
nvs_set_i8(my_handle, "monitormode", cfg.monitormode);
|
nvs_set_i8(my_handle, "monitormode", cfg.monitormode);
|
||||||
|
|
||||||
|
if (nvs_get_i8(my_handle, "runmode", &flash8) != ESP_OK ||
|
||||||
|
flash8 != cfg.runmode)
|
||||||
|
nvs_set_i8(my_handle, "runmode", cfg.runmode);
|
||||||
|
|
||||||
if (nvs_get_i16(my_handle, "rssilimit", &flash16) != ESP_OK ||
|
if (nvs_get_i16(my_handle, "rssilimit", &flash16) != ESP_OK ||
|
||||||
flash16 != cfg.rssilimit)
|
flash16 != cfg.rssilimit)
|
||||||
nvs_set_i16(my_handle, "rssilimit", cfg.rssilimit);
|
nvs_set_i16(my_handle, "rssilimit", cfg.rssilimit);
|
||||||
@ -326,6 +331,14 @@ void loadConfig() {
|
|||||||
saveConfig();
|
saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nvs_get_i8(my_handle, "runmode", &flash8) == ESP_OK) {
|
||||||
|
cfg.runmode = flash8;
|
||||||
|
ESP_LOGI(TAG, "Run mode = %d", flash8);
|
||||||
|
} else {
|
||||||
|
ESP_LOGI(TAG, "Run mode set to default %d", cfg.runmode);
|
||||||
|
saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
nvs_close(my_handle);
|
nvs_close(my_handle);
|
||||||
ESP_LOGI(TAG, "Done");
|
ESP_LOGI(TAG, "Done");
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,9 @@ void doHomework() {
|
|||||||
// update uptime counter
|
// update uptime counter
|
||||||
uptime();
|
uptime();
|
||||||
|
|
||||||
if (ota_update)
|
// check if update mode trigger switch was set
|
||||||
start_ota_update();
|
if (cfg.runmode == 1)
|
||||||
|
ESP.restart();
|
||||||
|
|
||||||
// read battery voltage into global variable
|
// read battery voltage into global variable
|
||||||
#ifdef HAS_BATTERY_PROBE
|
#ifdef HAS_BATTERY_PROBE
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
// attn: increment version after modifications to configData_t truct!
|
// attn: increment version after modifications to configData_t truct!
|
||||||
#define PROGVERSION "1.4.23" // use max 10 chars here!
|
#define PROGVERSION "1.4.30" // use max 10 chars here!
|
||||||
#define PROGNAME "PAXCNT"
|
#define PROGNAME "PAXCNT"
|
||||||
|
|
||||||
// std::set for unified array functions
|
// std::set for unified array functions
|
||||||
@ -31,6 +31,7 @@ typedef struct {
|
|||||||
uint8_t rgblum; // RGB Led luminosity (0..100%)
|
uint8_t rgblum; // RGB Led luminosity (0..100%)
|
||||||
uint8_t gpsmode; // 0=disabled, 1=enabled
|
uint8_t gpsmode; // 0=disabled, 1=enabled
|
||||||
uint8_t monitormode; // 0=disabled, 1=enabled
|
uint8_t monitormode; // 0=disabled, 1=enabled
|
||||||
|
uint8_t runmode; // 0=normal, 1=update
|
||||||
char version[10]; // Firmware version
|
char version[10]; // Firmware version
|
||||||
} configData_t;
|
} configData_t;
|
||||||
|
|
||||||
@ -43,7 +44,6 @@ typedef struct {
|
|||||||
|
|
||||||
// global variables
|
// global variables
|
||||||
extern configData_t cfg; // current device configuration
|
extern configData_t cfg; // current device configuration
|
||||||
extern bool ota_update;
|
|
||||||
extern char display_line6[], display_line7[]; // screen buffers
|
extern char display_line6[], display_line7[]; // screen buffers
|
||||||
extern uint8_t channel; // wifi channel rotation counter
|
extern uint8_t channel; // wifi channel rotation counter
|
||||||
extern uint16_t macs_total, macs_wifi, macs_ble, batt_voltage; // display values
|
extern uint16_t macs_total, macs_wifi, macs_ble, batt_voltage; // display values
|
||||||
|
@ -196,11 +196,9 @@ void onEvent(ev_t ev) {
|
|||||||
|
|
||||||
if (LMIC.dataLen) {
|
if (LMIC.dataLen) {
|
||||||
ESP_LOGI(TAG, "Received %d bytes of payload, RSSI %d SNR %d",
|
ESP_LOGI(TAG, "Received %d bytes of payload, RSSI %d SNR %d",
|
||||||
LMIC.dataLen, LMIC.rssi, (signed char)LMIC.snr / 4);
|
LMIC.dataLen, LMIC.rssi, (signed char)LMIC.snr);
|
||||||
// LMIC.snr = SNR twos compliment [dB] * 4
|
|
||||||
// LMIC.rssi = RSSI [dBm] (-196...+63)
|
|
||||||
sprintf(display_line6, "RSSI %d SNR %d", LMIC.rssi,
|
sprintf(display_line6, "RSSI %d SNR %d", LMIC.rssi,
|
||||||
(signed char)LMIC.snr / 4);
|
(signed char)LMIC.snr);
|
||||||
|
|
||||||
// check if command is received on command port, then call interpreter
|
// check if command is received on command port, then call interpreter
|
||||||
if ((LMIC.txrxFlags & TXRX_PORT) &&
|
if ((LMIC.txrxFlags & TXRX_PORT) &&
|
||||||
|
15
src/main.cpp
15
src/main.cpp
@ -28,7 +28,6 @@ licenses. Refer to LICENSE.txt file in repository for more details.
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
configData_t cfg; // struct holds current device configuration
|
configData_t cfg; // struct holds current device configuration
|
||||||
bool ota_update = false; // triggers OTA update
|
|
||||||
char display_line6[16], display_line7[16]; // display buffers
|
char display_line6[16], display_line7[16]; // display buffers
|
||||||
uint8_t channel = 0; // channel rotation counter
|
uint8_t channel = 0; // channel rotation counter
|
||||||
uint16_t macs_total = 0, macs_wifi = 0, macs_ble = 0,
|
uint16_t macs_total = 0, macs_wifi = 0, macs_ble = 0,
|
||||||
@ -123,6 +122,13 @@ void setup() {
|
|||||||
// read settings from NVRAM
|
// read settings from NVRAM
|
||||||
loadConfig(); // includes initialize if necessary
|
loadConfig(); // includes initialize if necessary
|
||||||
|
|
||||||
|
// reboot to firmware update mode if ota trigger switch is set
|
||||||
|
if (cfg.runmode == 1) {
|
||||||
|
cfg.runmode = 0;
|
||||||
|
saveConfig();
|
||||||
|
start_ota_update();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef VENDORFILTER
|
#ifdef VENDORFILTER
|
||||||
strcat_P(features, " OUIFLT");
|
strcat_P(features, " OUIFLT");
|
||||||
#endif
|
#endif
|
||||||
@ -302,8 +308,8 @@ void setup() {
|
|||||||
ESP_LOGI(TAG, "Starting Wifi task on core 0");
|
ESP_LOGI(TAG, "Starting Wifi task on core 0");
|
||||||
wifi_sniffer_init();
|
wifi_sniffer_init();
|
||||||
// initialize salt value using esp_random() called by random() in
|
// initialize salt value using esp_random() called by random() in
|
||||||
// arduino-esp32 core. Note: do this *after* wifi has started, since function
|
// arduino-esp32 core. Note: do this *after* wifi has started, since
|
||||||
// gets it's seed from RF noise
|
// function gets it's seed from RF noise
|
||||||
reset_salt(); // get new 16bit for salting hashes
|
reset_salt(); // get new 16bit for salting hashes
|
||||||
xTaskCreatePinnedToCore(wifi_channel_loop, "wifiloop", 2048, (void *)1, 1,
|
xTaskCreatePinnedToCore(wifi_channel_loop, "wifiloop", 2048, (void *)1, 1,
|
||||||
&WifiLoopTask, 0);
|
&WifiLoopTask, 0);
|
||||||
@ -318,7 +324,8 @@ void setup() {
|
|||||||
void loop() {
|
void loop() {
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
// state machine for switching display, LED, button, housekeeping, senddata
|
// state machine for switching display, LED, button, housekeeping,
|
||||||
|
// senddata
|
||||||
|
|
||||||
#if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED)
|
#if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED)
|
||||||
led_loop();
|
led_loop();
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "senddata.h"
|
#include "senddata.h"
|
||||||
#include "cyclic.h"
|
#include "cyclic.h"
|
||||||
#include "beacon_array.h"
|
#include "beacon_array.h"
|
||||||
|
#include "ota.h"
|
||||||
|
|
||||||
#include <esp_spi_flash.h> // needed for reading ESP32 chip attributes
|
#include <esp_spi_flash.h> // needed for reading ESP32 chip attributes
|
||||||
#include <esp_event_loop.h> // needed for Wifi event handler
|
#include <esp_event_loop.h> // needed for Wifi event handler
|
||||||
|
@ -31,6 +31,11 @@ void set_reset(uint8_t val[]) {
|
|||||||
sprintf(display_line6, "Queue reset");
|
sprintf(display_line6, "Queue reset");
|
||||||
flushQueues();
|
flushQueues();
|
||||||
break;
|
break;
|
||||||
|
case 9: // reset and ask for software update via Wifi OTA
|
||||||
|
ESP_LOGI(TAG, "Remote command: software update via Wifi");
|
||||||
|
sprintf(display_line6, "Software update");
|
||||||
|
cfg.runmode = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ESP_LOGW(TAG, "Remote command: reset called with invalid parameter(s)");
|
ESP_LOGW(TAG, "Remote command: reset called with invalid parameter(s)");
|
||||||
}
|
}
|
||||||
@ -220,27 +225,22 @@ void get_gps(uint8_t val[]) {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void set_update(uint8_t val[]) {
|
|
||||||
ESP_LOGI(TAG, "Remote command: get firmware update");
|
|
||||||
ota_update = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
// assign previously defined functions to set of numeric remote commands
|
// assign previously defined functions to set of numeric remote commands
|
||||||
// format: opcode, function, #bytes params,
|
// format: opcode, function, #bytes params,
|
||||||
// flag (1 = do make settings persistent / 0 = don't)
|
// flag (true = do make settings persistent / false = don't)
|
||||||
//
|
//
|
||||||
cmd_t table[] = {
|
cmd_t table[] = {
|
||||||
{0x01, set_rssi, 1, true}, {0x02, set_countmode, 1, true},
|
{0x01, set_rssi, 1, true}, {0x02, set_countmode, 1, true},
|
||||||
{0x03, set_gps, 1, true}, {0x04, set_display, 1, true},
|
{0x03, set_gps, 1, true}, {0x04, set_display, 1, true},
|
||||||
{0x05, set_lorasf, 1, true}, {0x06, set_lorapower, 1, true},
|
{0x05, set_lorasf, 1, true}, {0x06, set_lorapower, 1, true},
|
||||||
{0x07, set_loraadr, 1, true}, {0x08, set_screensaver, 1, true},
|
{0x07, set_loraadr, 1, true}, {0x08, set_screensaver, 1, true},
|
||||||
{0x09, set_reset, 1, false}, {0x0a, set_sendcycle, 1, true},
|
{0x09, set_reset, 1, true}, {0x0a, set_sendcycle, 1, true},
|
||||||
{0x0b, set_wifichancycle, 1, true}, {0x0c, set_blescantime, 1, true},
|
{0x0b, set_wifichancycle, 1, true}, {0x0c, set_blescantime, 1, true},
|
||||||
{0x0d, set_vendorfilter, 1, false}, {0x0e, set_blescan, 1, true},
|
{0x0d, set_vendorfilter, 1, false}, {0x0e, set_blescan, 1, true},
|
||||||
{0x0f, set_wifiant, 1, true}, {0x10, set_rgblum, 1, true},
|
{0x0f, set_wifiant, 1, true}, {0x10, set_rgblum, 1, true},
|
||||||
{0x11, set_monitor, 1, true}, {0x12, set_beacon, 7, false},
|
{0x11, set_monitor, 1, true}, {0x12, set_beacon, 7, false},
|
||||||
{0x20, set_update, 0, false}, {0x80, get_config, 0, false},
|
{0x80, get_config, 0, false}, {0x81, get_status, 0, false},
|
||||||
{0x81, get_status, 0, false}, {0x84, get_gps, 0, false}};
|
{0x84, get_gps, 0, false}};
|
||||||
|
|
||||||
const uint8_t cmdtablesize =
|
const uint8_t cmdtablesize =
|
||||||
sizeof(table) / sizeof(table[0]); // number of commands in command table
|
sizeof(table) / sizeof(table[0]); // number of commands in command table
|
||||||
|
Loading…
Reference in New Issue
Block a user