This commit is contained in:
j3d1 2022-06-27 20:00:48 +02:00
parent b7ccdfd5d3
commit 56cddf7073
7 changed files with 79 additions and 20 deletions

View file

@ -8,6 +8,6 @@ RUN cd app/modules/sdk; export CT_EXPERIMENTAL=y; export CT_ALLOW_BUILD_AS_ROOT=
USER 0
RUN apt remove --purge -y python2 && apt autoremove --purge -y && apt install -y python3 python3-serial
RUN apt install -y --reinstall python-is-python3
USER 0
USER 1000
WORKDIR /app
ENV PATH=/app/modules/sdk/xtensa-lx106-elf/bin:$PATH

View file

@ -11,9 +11,9 @@
#include <espressif/esp_common.h>
#include <esp/uart.h>
void user_init(void)
{
#define PUB_MSG_LEN 16
void user_init(void) {
uart_set_baud(0, 115200);
printf("SDK version: %s\n", sdk_system_get_sdk_version());
@ -30,4 +30,11 @@ void user_init(void)
xTaskCreate(&httpd_task, "httpd_task", 1024, NULL, 2, NULL);
xTaskCreate(&lux_task, "lux_task", 512, NULL, 1, NULL);
wifi_alive = xSemaphoreCreateBinary();
publish_queue = xQueueCreate(3, PUB_MSG_LEN);
xTaskCreate(&beat_task, "beat_task", 256, NULL, 3, NULL);
}

View file

@ -3,6 +3,7 @@
//
#include "mqtt.h"
#include "wifi.h"
#include <stdio.h>
#include <string.h>
@ -22,15 +23,18 @@ extern "C" {
/* You can use http://test.mosquitto.org/ to test mqtt_client instead
* of setting up your own MQTT server */
#define MQTT_HOST ("172.16.0.42")
//#define MQTT_HOST ("172.16.0.42")
#define MQTT_HOST ("10.23.42.187")
#define MQTT_PORT 1883
#define MQTT_USER NULL
#define MQTT_PASS NULL
QueueHandle_t publish_queue;
#define PUB_MSG_LEN 16
QueueHandle_t publish_queue;
extern "C" void beat_task(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount();
char msg[PUB_MSG_LEN];
@ -98,13 +102,14 @@ extern "C" void mqtt_task(void *pvParameters) {
strcat(mqtt_client_id, get_my_id());
while (1) {
xSemaphoreTake(wifi_alive, portMAX_DELAY);
printf("%s: started\n\r", __func__);
printf("%s: (Re)connecting to MQTT server %s ... ", __func__,
MQTT_HOST);
ret = mqtt_network_connect(&network, MQTT_HOST, MQTT_PORT);
if(ret) {
printf("error: %d\n\r", ret);
taskYIELD();
printf("error 1: %d\n\r", ret);
vTaskDelay(1000 / portTICK_PERIOD_MS);
continue;
}
printf("done\n\r");
@ -121,9 +126,9 @@ extern "C" void mqtt_task(void *pvParameters) {
printf("Send MQTT connect ... ");
ret = mqtt_connect(&client, &data);
if(ret) {
printf("error: %d\n\r", ret);
printf("error 2: %d\n\r", ret);
mqtt_network_disconnect(&network);
taskYIELD();
vTaskDelay(1000 / portTICK_PERIOD_MS);
continue;
}
printf("done\r\n");

View file

@ -5,6 +5,10 @@
#ifndef FIRMWARE_MQTT_H
#define FIRMWARE_MQTT_H
#include <FreeRTOS.h>
#include <queue.h>
#ifdef __cplusplus
extern "C" {
#endif
@ -12,6 +16,8 @@ extern "C" {
void mqtt_task(void *pvParameters);
void beat_task(void *pvParameters);
extern QueueHandle_t publish_queue;
#ifdef __cplusplus
}
#endif

View file

@ -60,7 +60,8 @@ void websocket_task(void *pvParameter) {
UNLOCK_TCPIP_CORE();
} else
syslog("buffer too small -1\n");
vTaskDelayMs(1000);
taskYIELD();
}
//Global Info
@ -94,7 +95,8 @@ void websocket_task(void *pvParameter) {
UNLOCK_TCPIP_CORE();
} else
syslog("buffer too small 0\n");
vTaskDelayMs(1000);
taskYIELD();
}
//Connection Info
@ -117,7 +119,8 @@ void websocket_task(void *pvParameter) {
UNLOCK_TCPIP_CORE();
} else
syslog("buffer too small 1\n");
vTaskDelayMs(1000);
taskYIELD();
}
if(has_changed.wifi) {
@ -175,7 +178,8 @@ void websocket_task(void *pvParameter) {
syslog("buffer too small 2\n");
}
vTaskDelayMs(1000);
taskYIELD();
if(opmode == STATION_MODE || opmode == STATIONAP_MODE) {
uint8_t hwaddr[6];
@ -204,7 +208,8 @@ void websocket_task(void *pvParameter) {
}
vTaskDelayMs(250);
taskYIELD();
{
uint8_t response[3];
uint16_t val;
@ -354,11 +359,11 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len,
if(ret == OK) {
if(cmd == 'R' || cmd == 'C') { // Restart
printf("rebooting now");
vTaskDelay(1000 / portTICK_PERIOD_MS);
taskYIELD();
vPortEnterCritical();
sdk_system_restart();
} else if(cmd == 'X') { // Clear Config
vTaskDelay(1000 / portTICK_PERIOD_MS);
taskYIELD();
system_clear_config();
}
}
@ -378,8 +383,9 @@ void websocket_open_cb(struct tcp_pcb *pcb, const char *uri) {
extern "C" void httpd_task(void *pvParameters) {
(void) pvParameters;
while (!uxSemaphoreGetCount(wifi_available_semaphore))
vTaskDelay(500 / portTICK_PERIOD_MS);
//while (!uxSemaphoreGetCount(wifi_available_semaphore))
// taskYIELD();
printf("httpd_task: wifi is available\n");
websocket_register_callbacks((tWsOpenHandler) websocket_open_cb, (tWsHandler) websocket_cb);
httpd_init();

View file

@ -32,6 +32,7 @@ char *wifi_ap_ssid = nullptr;
char *wifi_ap_password = nullptr;
SemaphoreHandle_t wifi_available_semaphore = nullptr;
SemaphoreHandle_t wifi_alive = nullptr;
[[noreturn]] static void dns_task(void *pvParameters) {
char *wifi_ap_ip_addr = nullptr;
@ -347,5 +348,38 @@ extern "C" void wifi_task(void *pvParameters) {
xSemaphoreGive(wifi_available_semaphore);
//monitor loop connection here
vTaskDelete(nullptr);
uint8_t status = 0;
uint8_t retries = 30;
while (1) {
while ((status != STATION_GOT_IP) && (retries)) {
status = sdk_wifi_station_get_connect_status();
printf("%s: status = %d\n\r", __func__, status);
if(status == STATION_WRONG_PASSWORD) {
printf("WiFi: wrong password\n\r");
break;
} else if(status == STATION_NO_AP_FOUND) {
printf("WiFi: AP not found\n\r");
break;
} else if(status == STATION_CONNECT_FAIL) {
printf("WiFi: connection failed\r\n");
break;
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
--retries;
}
if(status == STATION_GOT_IP) {
printf("WiFi: Connected\n\r");
xSemaphoreGive(wifi_alive);
taskYIELD();
}
while ((status = sdk_wifi_station_get_connect_status()) == STATION_GOT_IP) {
xSemaphoreGive(wifi_alive);
taskYIELD();
}
printf("WiFi: disconnected\n\r");
sdk_wifi_station_disconnect();
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}

View file

@ -13,6 +13,7 @@ extern "C" {
#endif
extern SemaphoreHandle_t wifi_available_semaphore;
extern SemaphoreHandle_t wifi_alive;
void wifi_task(void *pvParameters);