Compare commits

..

1 commit

Author SHA1 Message Date
5fa1ec14e2 add otaflash.py script to release files 2021-09-06 23:21:43 +02:00
7 changed files with 3 additions and 284 deletions

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="External" external.linked.project.id="firmware" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="CompDB" type="CPP_MODULE" version="4" />
<module version="4">
<component name="FacetManager">
<facet type="Python" name="Python facet">

View file

@ -11,8 +11,6 @@
#include <espressif/esp_common.h>
#include <esp/uart.h>
#include "rboot-api.h"
void user_init(void)
{
uart_set_baud(0, 115200);
@ -29,15 +27,4 @@ void user_init(void)
xTaskCreate(&httpd_task, "httpd_task", 1024, NULL, 2, NULL);
xTaskCreate(&lux_task, "lux_task", 512, NULL, 1, NULL);
rboot_config conf = rboot_get_config();
printf("\r\n\r\nOTA Basic demo.\r\nCurrently running on flash slot %d / %d.\r\n\r\n",
conf.current_rom, conf.count);
printf("Image addresses in flash:\r\n");
for(int i = 0; i <conf.count; i++) {
printf("%c%d: offset 0x%08x\r\n", i == conf.current_rom ? '*':' ', i, conf.roms[i]);
}
printf("profit!\n");
}

View file

@ -16,8 +16,6 @@
<label for="bmenub" class="burger pseudo button">&#9776;</label>
<div class="menu">
<a href="/#" class="button icon-picture">Dashboard</a>
<a href="/#io" class="button icon-puzzle">I/O</a>
<a href="/#wifi" class="button icon-puzzle">Wifi Settings</a>
<a href="/#ota" class="button icon-picture">System</a>
</div>
</nav>
@ -60,125 +58,6 @@
</article>
</section>
<section id="io">
<h2>I/O</h2>
<article class="card">
<header>
<h3>Protocols</h3>
</header>
<div class="table">
<div class="row">
<label>MQTT</label>
<span><input type="checkbox" class="plain"/></span>
</div>
<div class="row">
<span><input type="reset" class="button"/></span>
<span><input type="submit" value="Save"></span>
</div>
</div>
</article>
<article class="card">
<header>
<h3>Station Mode <span class="label success">current connection</span></h3>
</header>
<div class="table">
<div class="row">
<label>WS2812 via I2S</label>
<span><input type="checkbox" class="plain"/></span>
<span><input type="color"/></span>
</div>
<div class="row">
<label>APA102C via SPI</label>
<span><input type="checkbox" class="plain"/></span>
<span><input type="color"/></span>
</div>
<div class="row">
<label>6 Channel SPI Dimmer</label>
<span><input type="checkbox" class="plain"/></span>
<span><input type="color"/></span>
</div>
<div class="row">
<label>Binary Output on GPIO4</label>
<span><input type="checkbox" class="plain"/></span>
<span><button class="toggle button">Toggle</button></span>
</div>
<div class="row">
<label>Binary Output on GPIO5</label>
<span><input type="checkbox" class="plain"/></span>
<span><button class="toggle button">Toggle</button></span>
</div>
<div class="row">
<span><input type="reset" class="button"/></span>
<span><input type="submit" value="Save"></span>
</div>
</div>
</article>
</section>
<section id="wifi">
<h2>Wifi Settings</h2>
<article class="card">
<header>
<h3>AP Mode</h3>
</header>
<div class="table">
<div class="row">
<label>Enable</label>
<span><input id="ap_toggle" type="checkbox" class="plain"/></span>
</div>
<div class="row">
<label>SSID</label>
<span><input id="ap_ssid" type="text" placeholder="SSID"/></span>
</div>
<div class="row">
<label>Password</label>
<span><input id="ap_pw" type="password" placeholder="Password"/></span>
</div>
<div class="row">
<span>AP IP</span>
<span><span class="postfill_apip">N/A</span></span>
</div>
<div class="row">
<span>AP MAC</span>
<span><span class="postfill_apmac">N/A</span></span>
</div>
<div class="row">
<span><input type="reset" class="button"/></span>
<span><input onclick="ap_update();" type="submit" value="Save"></span>
</div>
</div>
</article>
<article class="card">
<header>
<h3>Station Mode <span class="label success">current connection</span></h3>
</header>
<div class="table">
<div class="row">
<label>Eanable</label>
<span><input id="sta_toggle" type="checkbox" class="plain"/></span>
</div>
<div class="row">
<label>SSID</label>
<span><input id="sta_ssid" type="text" placeholder="SSID"/></span>
</div>
<div class="row">
<label>Password</label>
<span><input id="sta_pw" type="password" placeholder="Password"/></span>
</div>
<div class="row">
<span>Sation IP</span>
<span><span class="postfill_staip">N/A</span></span>
</div>
<div class="row">
<span>Station MAC</span>
<span><span class="postfill_stamac">N/A</span></span>
</div>
<div class="row">
<span><input type="reset" class="button"/></span>
<span><input onclick="sta_update();" type="submit" value="Save"></span>
</div>
</div>
</article>
</section>
<section id="dashboard">
<h2>Status</h2>
<div class="flex">
@ -416,46 +295,6 @@
startPolling();
}
var sta_toggle = document.getElementById("sta_toggle");
var sta_ssid = document.getElementById("sta_ssid");
var sta_pw = document.getElementById("sta_pw");
function sta_update() {
var en = sta_toggle.checked;
const ssid = sta_ssid.value;
const password = sta_pw.value;
const buffer = new ArrayBuffer(ssid.length + password.length + 4);
const view1 = new DataView(buffer);
var tx_len = 0;
view1.setChar(tx_len++, 'S');
view1.setChar(tx_len++, (en ? "E" : "D"));
tx_len = view1.setString(tx_len, ssid);
tx_len = view1.setString(tx_len, password);
wsWrite(buffer);
}
var ap_toggle = document.getElementById("ap_toggle");
var ap_ssid = document.getElementById("ap_ssid");
var ap_pw = document.getElementById("ap_pw");
function ap_update() {
var en = ap_toggle.checked;
const ssid = ap_ssid.value;
const password = ap_pw.value;
const buffer = new ArrayBuffer(ssid.length + password.length + 4);
const view1 = new DataView(buffer);
var tx_len = 0;
view1.setChar(tx_len++, 'A');
view1.setChar(tx_len++, (en ? "E" : "D"));
tx_len = view1.setString(tx_len, ssid);
tx_len = view1.setString(tx_len, password);
wsWrite(buffer);
}
var makeCRCTable = function () {
var c;
var crcTable = [];
@ -484,8 +323,6 @@
var firmware_file;
function load_firmware(evt) {
console.log("load_firmware", evt);
var file = evt.target.files[0];
if (!file) {
return;
@ -523,14 +360,11 @@
reject(i);
}, 2000);
wsWrite(frame.buffer);
//build packet: type, seq, len, hash, data
console.log(i, (end - begin), crc32(slice), (100*end/buf.byteLength)+"%");
});
}
function transmit_firmware_final(buf, hash) {
return new Promise((resolve, reject) => {
console.log("final: ", buf.byteLength, hash.toString(16));
var frame = new ArrayBuffer(12);
var headerview = new DataView(frame);
headerview.setChar(0, 'C');
@ -547,11 +381,8 @@
}
function transmit_firmware(evt) {
console.log("transmit_firmware", evt);
console.log("transmit_firmware begin");
if (firmware_file) {
console.log("len", firmware_file.byteLength);
//console.log(crc32(firmware_file));
(async () => {
const ash = crc32(firmware_file);
for (var i = 0; i * chunk_size < firmware_file.byteLength; i++) {

View file

@ -18,7 +18,6 @@ with open(args.binfile, "rb") as f:
rolling = 0
total = 0
while True:
print(i)
bytes = f.read(512)
rolling = zlib.crc32(bytes, rolling)
total += len(bytes)
@ -29,7 +28,6 @@ with open(args.binfile, "rb") as f:
msg += bytes
ws.send(msg)
reply = ws.recv()
print(reply)
time.sleep(0.05)
i += 1
if len(bytes) != 512:

View file

@ -23,7 +23,6 @@
void system_clear_config() {
vPortEnterCritical();
uint32_t num_sectors = 0x2000 / sdk_flashchip.sector_size;
//uint32_t start = sdk_flashchip.chip_size - num_sectors * sdk_flashchip.sector_size;
uint32_t start = 0x00100000;
for (uint32_t i = 0; i < num_sectors; i++) {
spiflash_erase_sector(start + i * sdk_flashchip.sector_size);
@ -42,7 +41,6 @@ void system_init_config() {
if(sysparam_get_info(&base_addr, &num_sectors) != SYSPARAM_OK) {
printf("Warning: WiFi config, sysparam not initialized\n");
num_sectors = 0x2000 / sdk_flashchip.sector_size;
//base_addr = sdk_flashchip.chip_size - (5 + num_sectors) * sdk_flashchip.sector_size;
if(sysparam_create_area(base_addr, num_sectors, true) == SYSPARAM_OK) {
sysparam_init(base_addr, 0);
}
@ -50,7 +48,7 @@ void system_init_config() {
}
}
#define MAX_IMAGE_SIZE 0x100000 /*1MB images max at the moment */
#define MAX_IMAGE_SIZE 0x100000
struct {
rboot_write_status status;
@ -68,14 +66,10 @@ void system_otaflash_init() {
otaflash_context.status = rboot_write_init(otaflash_context.base);
otaflash_context.head = otaflash_context.base;
otaflash_context.seq = 0;
//printf("slot: %u, base: %x, sector: %u\n", otaflash_context.slot, otaflash_context.base,
// otaflash_context.status.start_sector);
}
int system_otaflash_chunk(uint8_t *data, uint16_t len, uint16_t seq, uint32_t hash) {
uint32_t local_hash = crc32(data, len);
//printf("@%x seq: %u, len: %u, hash: %x =? %x\n", otaflash_context.head, seq, len, hash, local_hash);
if(hash == local_hash && otaflash_context.seq == seq) {
if(otaflash_context.head % SECTOR_SIZE == 0) {
sdk_spi_flash_erase_sector(otaflash_context.head / SECTOR_SIZE);
@ -91,7 +85,6 @@ int system_otaflash_chunk(uint8_t *data, uint16_t len, uint16_t seq, uint32_t ha
otaflash_context.seq++;
return 0x88;
} else {
//printf("nak: %04x = %04x, %04x = %04x\n", hash, local_hash, seq, otaflash_context.seq);
return 0xff;
}
@ -115,7 +108,7 @@ int system_otaflash_verify_and_switch(uint32_t len, uint32_t hash) {
vPortEnterCritical();
if(!rboot_set_current_rom(otaflash_context.slot)) {
printf("OTA TFTP failed to set new rboot slot\r\n");
printf("OTA failed to set new rboot slot\r\n");
}
sdk_system_restart();
vPortExitCritical(); // | should not be reached

View file

@ -184,21 +184,7 @@ void websocket_task(void *pvParameter) {
}
/*vTaskDelayMs(250);
{
uint8_t response[3];
uint16_t val;
val = sdk_system_adc_read();
response[2] = (uint8_t) val;
response[1] = val >> 8;
response[0] = 'V';
LOCK_TCPIP_CORE();
websocket_write(pcb, response, 3, WS_BIN_MODE);
UNLOCK_TCPIP_CORE();
}*/
vTaskDelayMs(500);
//printf("9: %d\n",gpio_read(9));
//printf("10: %d\n",gpio_read(10));
}
vTaskDelete(nullptr);
@ -233,19 +219,9 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len,
uint16_t val = 0;
char cmd = '0';
int8_t en = 0;
/*uint8_t ap_disable_if_sta = 0;
uint8_t ssid_hidden = 0;
uint8_t dns_enable = 0;
uint8_t mdns_enable = 0;*/
bool togl = 0;
switch (data[0]) {
case 'V': // ADC
/* This should be done on a separate thread in 'real' applications */
val = sdk_system_adc_read();
cmd = 'V';
break;
case 'R': // Restart
cmd = 'R';
break;
@ -282,41 +258,6 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len,
}
cmd = 'C';
break;
case 'S': {
if(data[1] == 'E')
en = 1;
char *ssid = &data[2];
size_t ssid_len = strlen(ssid);
char *password = &data[3 + ssid_len];
size_t password_len = strlen(password);
(void) password_len;
sysparam_set_int8("wifi_sta_enable", en);
sysparam_set_string("wifi_sta_ssid", ssid);
sysparam_set_string("wifi_sta_password", password);
}
cmd = 'S';
break;
case 'A': {
if(data[1] == 'E')
en = 1;
char *ssid = &data[2];
size_t ssid_len = strlen(ssid);
char *password = &data[3 + ssid_len];
size_t password_len = strlen(password);
(void) password_len;
sysparam_set_int8("wifi_ap_enable", en);
sysparam_set_string("wifi_ap_ssid", ssid);
sysparam_set_string("wifi_ap_password", password);
//sysparam_set_int8("wifi_ap_disable_if_sta", ap_disable_if_sta);
//sysparam_set_int8("wifi_ap_ssid_hidden", ssid_hidden);
//sysparam_set_int8("wifi_ap_dns", dns_enable);
//sysparam_set_int8("wifi_ap_mdns", mdns_enable);
}
cmd = 'A';
break;
default:
printf("[websocket_callback]:\n%.*s\n", (int) data_len, (char *) data);
printf("Unknown command %c\n", data[0]);
@ -353,36 +294,11 @@ void websocket_open_cb(struct tcp_pcb *pcb, const char *uri) {
}
}
/*const char *gpio_cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) {
for (int i = 0; i < iNumParams; i++) {
if(strcmp(pcParam[i], "on") == 0) {
uint8_t gpio_num = atoi(pcValue[i]);
gpio_enable(gpio_num, GPIO_OUTPUT);
gpio_write(gpio_num, true);
} else if(strcmp(pcParam[i], "off") == 0) {
uint8_t gpio_num = atoi(pcValue[i]);
gpio_enable(gpio_num, GPIO_OUTPUT);
gpio_write(gpio_num, false);
} else if(strcmp(pcParam[i], "toggle") == 0) {
uint8_t gpio_num = atoi(pcValue[i]);
gpio_enable(gpio_num, GPIO_OUTPUT);
gpio_toggle(gpio_num);
}
}
return "/index.html";
}*/
extern "C" void httpd_task(void *pvParameters) {
(void) pvParameters;
while (!uxSemaphoreGetCount(wifi_available_semaphore))
vTaskDelay(500 / portTICK_PERIOD_MS);
/*tCGI pCGIs[] = {
{"/gpio", (tCGIHandler) gpio_cgi_handler},
};
// register handlers and start the server
http_set_cgi_handlers(pCGIs, sizeof(pCGIs) / sizeof(pCGIs[0]));*/
websocket_register_callbacks((tWsOpenHandler) websocket_open_cb, (tWsHandler) websocket_cb);
httpd_init();

View file

@ -33,8 +33,6 @@ char *wifi_ap_password = nullptr;
SemaphoreHandle_t wifi_available_semaphore = nullptr;
[[noreturn]] static void dns_task(void *pvParameters) {
printf("run dns task\n");
char *wifi_ap_ip_addr = nullptr;
sysparam_get_string("wifi_ap_ip_addr", &wifi_ap_ip_addr);
if(!wifi_ap_ip_addr) {
@ -272,7 +270,6 @@ extern "C" void wifi_task(void *pvParameters) {
if(wifi_ap_channel < 1 || wifi_ap_channel > 14) {
wifi_ap_channel = 6;
}
wifi_ap_channel = 3;
int8_t wifi_ap_authmode = AUTH_WPA_WPA2_PSK;
sysparam_get_int8("wifi_ap_authmode", &wifi_ap_authmode);
@ -286,7 +283,6 @@ extern "C" void wifi_task(void *pvParameters) {
if(wifi_ap_max_conn < 1 || wifi_ap_max_conn > 8) {
wifi_ap_max_conn = 3;
}
wifi_ap_max_conn = 8;
int32_t wifi_ap_beacon_interval = 100;
sysparam_get_int32("wifi_ap_beacon_interval", &wifi_ap_beacon_interval);
@ -360,6 +356,5 @@ extern "C" void wifi_task(void *pvParameters) {
xSemaphoreGive(wifi_available_semaphore);
//monitor loop connection here
printf("wifi task done\n");
vTaskDelete(nullptr);
}