mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-26 12:14:56 +00:00
move embedded tutorials out of protocol tree
This commit is contained in:
1 parent
338756d0b0
commit
8fc5651044
287 files changed
+720
-267
No files matched your search
@@ -0,0 +1,8 @@
|
||||
idf_component_register(SRCS "main.c"
|
||||
"wifi.c"
|
||||
"uart.c"
|
||||
"cli.c"
|
||||
"net.c"
|
||||
"packed_fs.c"
|
||||
"mongoose.c")
|
||||
component_compile_options(-DUART_API_IMPLEMENTED=1)
|
||||
@@ -0,0 +1,94 @@
|
||||
#include "main.h"
|
||||
|
||||
static void cli_wifi(const char *ssid, const char *pass) {
|
||||
if (wifi_init(ssid, pass)) {
|
||||
mg_file_printf(&mg_fs_posix, WIFI_FILE, "{%m:%m,%m:%m}\n", mg_print_esc, 0,
|
||||
"ssid", mg_print_esc, 0, ssid, mg_print_esc, 0, "pass",
|
||||
mg_print_esc, 0, pass);
|
||||
MG_INFO(("Reboot now"));
|
||||
}
|
||||
}
|
||||
|
||||
static void cli_ls(void) {
|
||||
DIR *dirp = opendir(FS_ROOT);
|
||||
struct dirent *dp;
|
||||
if (dirp == NULL) {
|
||||
MG_ERROR(("Cannot open FS: %d", errno));
|
||||
} else {
|
||||
while ((dp = readdir(dirp)) != NULL) {
|
||||
/* Do not show current and parent dirs */
|
||||
if (strcmp((const char *) dp->d_name, ".") == 0 ||
|
||||
strcmp((const char *) dp->d_name, "..") == 0) {
|
||||
continue;
|
||||
} else {
|
||||
printf("%s\n", dp->d_name);
|
||||
}
|
||||
}
|
||||
closedir(dirp);
|
||||
}
|
||||
}
|
||||
|
||||
static void cli_cat(const char *fname) {
|
||||
char path[MG_PATH_MAX];
|
||||
snprintf(path, sizeof(path), "%s/%s", FS_ROOT, fname);
|
||||
FILE *fp = fopen(path, "r");
|
||||
if (fp != NULL) {
|
||||
int ch;
|
||||
while ((ch = fgetc(fp)) != EOF) putchar(ch);
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
static void cli_rm(const char *fname) {
|
||||
char path[100];
|
||||
snprintf(path, sizeof(path), "%s/%s", FS_ROOT, fname);
|
||||
remove(path);
|
||||
}
|
||||
|
||||
static struct mg_iobuf in;
|
||||
|
||||
void cli(uint8_t input_byte) {
|
||||
if (input_byte == 0 || input_byte == 0xff) return;
|
||||
if (in.len >= 128) in.len = 0;
|
||||
mg_iobuf_add(&in, in.len, &input_byte, sizeof(input_byte));
|
||||
|
||||
if (input_byte == '\n') {
|
||||
const char *arrow = "---";
|
||||
char buf0[10], buf1[50], buf2[250];
|
||||
|
||||
in.buf[in.len] = '\0';
|
||||
buf0[0] = buf1[0] = buf2[0] = '\0';
|
||||
sscanf((char *) in.buf, "%9s %49s %249[^\r\n]", buf0, buf1, buf2);
|
||||
|
||||
printf("%s CLI command: '%s'\n", arrow, buf0);
|
||||
if (strcmp(buf0, "reboot") == 0) {
|
||||
esp_restart();
|
||||
} else if (strcmp(buf0, "ls") == 0) {
|
||||
cli_ls();
|
||||
} else if (strcmp(buf0, "cat") == 0) {
|
||||
cli_cat(buf1);
|
||||
} else if (strcmp(buf0, "rm") == 0) {
|
||||
cli_rm(buf1);
|
||||
} else if (strcmp(buf0, "reboot") == 0) {
|
||||
esp_restart();
|
||||
} else if (strcmp(buf0, "ll") == 0) {
|
||||
mg_log_set(atoi(buf1));
|
||||
} else if (strcmp(buf0, "wifi") == 0) {
|
||||
cli_wifi(buf1, buf2);
|
||||
} else {
|
||||
printf("%s %s\n", arrow, "Unknown command. Usage:");
|
||||
printf("%s %s\n", arrow, " set NAME VALUE");
|
||||
printf("%s %s\n", arrow, " rm FILENAME");
|
||||
printf("%s %s\n", arrow, " cat FILENAME");
|
||||
printf("%s %s\n", arrow, " ls");
|
||||
printf("%s %s\n", arrow, " reboot");
|
||||
printf("%s %s\n", arrow, " wifi WIFI_NET WIFI_PASS");
|
||||
}
|
||||
printf("%s %s\n", arrow, "CLI output end");
|
||||
in.len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void cli_init(void) {
|
||||
mg_iobuf_init(&in, 0, 32);
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
// Copyright (c) 2020 Cesanta Software Limited
|
||||
// All rights reserved
|
||||
|
||||
#include "main.h"
|
||||
|
||||
const char *s_listening_url = "http://0.0.0.0:80";
|
||||
|
||||
struct mg_str config_read(void) {
|
||||
return mg_file_read(&mg_fs_posix, FS_ROOT "/config.json");
|
||||
}
|
||||
|
||||
void config_write(struct mg_str config) {
|
||||
mg_file_write(&mg_fs_posix, FS_ROOT "/config.json", config.buf, config.len);
|
||||
}
|
||||
|
||||
void app_main(void) {
|
||||
// Mount filesystem
|
||||
esp_vfs_spiffs_conf_t conf = {
|
||||
.base_path = FS_ROOT, .max_files = 20, .format_if_mount_failed = true};
|
||||
int res = esp_vfs_spiffs_register(&conf);
|
||||
MG_INFO(("FS at %s initialised, status: %d", conf.base_path, res));
|
||||
|
||||
// Try to connect to wifi by using saved WiFi credentials
|
||||
struct mg_str json = mg_file_read(&mg_fs_posix, WIFI_FILE);
|
||||
if (json.buf != NULL) {
|
||||
char *ssid = mg_json_get_str(json, "$.ssid");
|
||||
char *pass = mg_json_get_str(json, "$.pass");
|
||||
while (!wifi_init(ssid, pass)) (void) 0;
|
||||
mg_free(ssid);
|
||||
mg_free(pass);
|
||||
mg_free((void *) json.buf);
|
||||
} else {
|
||||
// If WiFi is not configured, run CLI until configured
|
||||
MG_INFO(("WiFi is not configured, running CLI. Press enter"));
|
||||
cli_init();
|
||||
for (;;) {
|
||||
uint8_t ch = getchar();
|
||||
cli(ch);
|
||||
usleep(10000);
|
||||
}
|
||||
}
|
||||
|
||||
// Connected to WiFi, now start HTTP server
|
||||
struct mg_mgr mgr;
|
||||
mg_mgr_init(&mgr);
|
||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
||||
MG_INFO(("Mongoose v%s on %s", MG_VERSION, s_listening_url));
|
||||
mg_http_listen(&mgr, s_listening_url, uart_bridge_fn, NULL);
|
||||
for (;;) mg_mgr_poll(&mgr, 10); // Infinite event loop
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
#pragma once
|
||||
|
||||
#include "mongoose.h"
|
||||
|
||||
#include "driver/gpio.h"
|
||||
#include "driver/uart.h"
|
||||
#include "esp_spiffs.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
|
||||
#define FS_ROOT "/spiffs"
|
||||
#define WIFI_FILE FS_ROOT "/wifi.json"
|
||||
#define UART_NO 1
|
||||
|
||||
void uart_bridge_fn(struct mg_connection *, int, void *);
|
||||
int uart_read(void *buf, size_t len);
|
||||
bool wifi_init(const char *ssid, const char *pass);
|
||||
void cli(uint8_t ch);
|
||||
void cli_init(void);
|
||||
@@ -0,0 +1 @@
|
||||
../../../../mongoose.c
|
||||
@@ -0,0 +1 @@
|
||||
../../../../mongoose.h
|
||||
@@ -0,0 +1,2 @@
|
||||
#define MG_ARCH MG_ARCH_ESP32
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
../../../http/uart-bridge/net.c
|
||||
@@ -0,0 +1 @@
|
||||
../../../http/uart-bridge/packed_fs.c
|
||||
@@ -0,0 +1,49 @@
|
||||
#include "main.h"
|
||||
#include "esp_idf_version.h" // < 3.3 not supported, sadly
|
||||
|
||||
int uart_close(int no) {
|
||||
return uart_driver_delete(no);
|
||||
}
|
||||
|
||||
int uart_open(int no, int rx, int tx, int cts, int rts, int baud) {
|
||||
uart_config_t uart_config = {
|
||||
.baud_rate = baud,
|
||||
.data_bits = UART_DATA_8_BITS,
|
||||
.parity = UART_PARITY_DISABLE,
|
||||
.stop_bits = UART_STOP_BITS_1,
|
||||
.flow_ctrl = cts > 0 && rts > 0 ? UART_HW_FLOWCTRL_CTS_RTS
|
||||
: cts > 0 ? UART_HW_FLOWCTRL_CTS
|
||||
: rts > 0 ? UART_HW_FLOWCTRL_RTS
|
||||
: UART_HW_FLOWCTRL_DISABLE,
|
||||
};
|
||||
int e1 = uart_param_config(no, &uart_config);
|
||||
int e2 = uart_set_pin(no, tx, rx, rts, cts);
|
||||
int e3 =
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 5)
|
||||
uart_driver_install(no, UART_HW_FIFO_LEN(no) * 2, UART_HW_FIFO_LEN(no) * 2, 0, NULL, 0);
|
||||
#else
|
||||
uart_driver_install(no, UART_FIFO_LEN * 2, UART_FIFO_LEN * 2, 0, NULL, 0);
|
||||
#endif
|
||||
MG_INFO(("%d: %d/%d/%d, %d %d %d", no, rx, tx, baud, e1, e2, e3));
|
||||
if (e1 != ESP_OK || e2 != ESP_OK || e3 != ESP_OK) return -1;
|
||||
return no;
|
||||
}
|
||||
|
||||
void uart_init(int tx, int rx, int baud) {
|
||||
uart_open(UART_NO, rx, tx, -1, -1, baud);
|
||||
}
|
||||
|
||||
int uart_read(void *buf, size_t len) {
|
||||
size_t x = 0;
|
||||
int no = UART_NO;
|
||||
if (uart_get_buffered_data_len(no, &x) != ESP_OK || x == 0) return 0;
|
||||
int n = uart_read_bytes(no, buf, len, 10 / portTICK_PERIOD_MS);
|
||||
MG_DEBUG(("%d bytes: [%.*s]", n, n, (char *) buf));
|
||||
return n;
|
||||
}
|
||||
|
||||
int uart_write(const void *buf, int len) {
|
||||
int no = UART_NO;
|
||||
MG_DEBUG(("%d bytes: [%.*s]", len, len, (char *) buf));
|
||||
return uart_write_bytes(no, (const char *) buf, len);
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
// Code taken from the ESP32 IDF WiFi station Example
|
||||
|
||||
#include <string.h>
|
||||
#include "esp_event.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_system.h"
|
||||
#include "esp_wifi.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/event_groups.h"
|
||||
#include "freertos/task.h"
|
||||
#include "nvs_flash.h"
|
||||
|
||||
#include "lwip/err.h"
|
||||
#include "lwip/sys.h"
|
||||
|
||||
#include "mongoose.h"
|
||||
|
||||
static EventGroupHandle_t s_wifi_event_group;
|
||||
|
||||
/* The event group allows multiple bits for each event, but we only care about
|
||||
* two events:
|
||||
* - we are connected to the AP with an IP
|
||||
* - we failed to connect after the maximum amount of retries */
|
||||
#define WIFI_CONNECTED_BIT BIT0
|
||||
#define WIFI_FAIL_BIT BIT1
|
||||
|
||||
static int s_retry_num = 0;
|
||||
|
||||
static void event_handler(void *arg, esp_event_base_t event_base,
|
||||
int32_t event_id, void *event_data) {
|
||||
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
|
||||
esp_wifi_connect();
|
||||
} else if (event_base == WIFI_EVENT &&
|
||||
event_id == WIFI_EVENT_STA_DISCONNECTED) {
|
||||
if (s_retry_num < 3) {
|
||||
esp_wifi_connect();
|
||||
s_retry_num++;
|
||||
MG_INFO(("retry to connect to the AP"));
|
||||
} else {
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
|
||||
}
|
||||
MG_ERROR(("connect to the AP fail"));
|
||||
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
|
||||
ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;
|
||||
MG_INFO(("IP ADDRESS: " IPSTR ". Go to:", IP2STR(&event->ip_info.ip)));
|
||||
MG_INFO(("http://" IPSTR, IP2STR(&event->ip_info.ip)));
|
||||
s_retry_num = 0;
|
||||
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
|
||||
}
|
||||
}
|
||||
|
||||
bool wifi_init(const char *ssid, const char *pass) {
|
||||
bool result = false;
|
||||
esp_err_t ret = nvs_flash_init();
|
||||
if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
|
||||
ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
||||
ESP_ERROR_CHECK(nvs_flash_erase());
|
||||
ret = nvs_flash_init();
|
||||
}
|
||||
ESP_ERROR_CHECK(ret);
|
||||
|
||||
s_wifi_event_group = xEventGroupCreate();
|
||||
|
||||
ESP_ERROR_CHECK(esp_netif_init());
|
||||
|
||||
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
||||
esp_netif_create_default_wifi_sta();
|
||||
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
||||
|
||||
esp_event_handler_instance_t instance_any_id;
|
||||
esp_event_handler_instance_t instance_got_ip;
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
||||
WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, &instance_any_id));
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
||||
IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, &instance_got_ip));
|
||||
|
||||
wifi_config_t c = {.sta = {.threshold = {.authmode = WIFI_AUTH_WPA2_PSK},
|
||||
.pmf_cfg = {.capable = true, .required = false}}};
|
||||
snprintf((char *) c.sta.ssid, sizeof(c.sta.ssid), "%s", ssid);
|
||||
snprintf((char *) c.sta.password, sizeof(c.sta.password), "%s", pass);
|
||||
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
||||
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &c));
|
||||
ESP_ERROR_CHECK(esp_wifi_start());
|
||||
MG_DEBUG(("wifi_init_sta finished."));
|
||||
|
||||
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
|
||||
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
|
||||
pdFALSE, pdFALSE, portMAX_DELAY);
|
||||
|
||||
if (bits & WIFI_CONNECTED_BIT) {
|
||||
MG_INFO(("connected to ap SSID:%s", ssid));
|
||||
result = true;
|
||||
} else if (bits & WIFI_FAIL_BIT) {
|
||||
MG_ERROR(("Failed to connect to SSID:%s, password:%s", ssid, pass));
|
||||
} else {
|
||||
MG_ERROR(("UNEXPECTED EVENT"));
|
||||
}
|
||||
|
||||
/* The event will not be processed after unregister */
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
|
||||
IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
|
||||
WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
|
||||
vEventGroupDelete(s_wifi_event_group);
|
||||
return result;
|
||||
}
|
||||
Reference in new issue
Block a user