From a170dfe8a965f1579aca81aef8e442785ff73c07 Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Sun, 8 Jun 2025 14:58:50 +0200 Subject: [PATCH] Implement WiFi for TactilityC --- TactilityC/Include/tt_wifi.h | 74 +++++++++++++++++++++++++++++++++++ TactilityC/Source/tt_init.cpp | 11 ++++++ TactilityC/Source/tt_wifi.cpp | 55 ++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 TactilityC/Include/tt_wifi.h create mode 100644 TactilityC/Source/tt_wifi.cpp diff --git a/TactilityC/Include/tt_wifi.h b/TactilityC/Include/tt_wifi.h new file mode 100644 index 00000000..659fd750 --- /dev/null +++ b/TactilityC/Include/tt_wifi.h @@ -0,0 +1,74 @@ +#pragma once + +#include +#include + +#define TT_WIFI_SSID_LIMIT 32 // 32 characters/octets, according to IEEE 802.11-2020 spec +#define TT_WIFI_CREDENTIALS_PASSWORD_LIMIT 64 // 64 characters/octets, according to IEEE 802.11-2020 spec + +#ifdef __cplusplus +extern "C" { +#endif + +/** Important: These values must map to tt::service::wifi::RadioState values exactly */ +typedef enum { + WIFI_RADIO_STATE_ON_PENDING, + WIFI_RADIO_STATE_ON, + WIFI_RADIO_STATE_CONNECTION_PENDING, + WIFI_RADIO_STATE_CONNECTION_ACTIVE, + WIFI_RADIO_STATE_OFF_PENDING, + WIFI_RADIO_STATE_OFF, +} WifiRadioState; + +/** @return the state of the WiFi radio */ +WifiRadioState tt_wifi_get_radio_state(); + +/** @return a textual representation of the WiFi radio state */ +const char* tt_wifi_radio_state_to_string(WifiRadioState state); + +/** Start scanning */ +void tt_wifi_scan(); + +/** @return true if a scan is active/pending */ +bool tt_wifi_is_scanning(); + +/** + * Return the WiFi SSID that the system tries to connect to, or is connected to. + * @param[out] buffer an allocated string buffer. Its size must be (WIFI_SSID_LIMIT + 1). + */ +void tt_wifi_get_connection_target(char* buffer); + +/** + * @brief Enable/disable the radio. Ignores input if desired state matches current state. + * @param[in] enabled + */ +void tt_wifi_set_enabled(bool enabled); + +/** + * + * @param ssid The access point identifier - maximal 32 characters/octets + * @param password the password - maximum 64 characters/octets + * @param channel 0 means "any" + * @param autoConnect whether we want to automatically reconnect if a disconnect occurs + * @param remember whether the record should be stored permanently on the device (it is only stored if this connection attempt succeeds) + */ +void tt_wifi_connect(const char* ssid, const char* password, int32_t channel, bool autoConnect, bool remember); + +/** + * If WiFi is connected, this disconnects it. + */ +void tt_wifi_disconnect(); + +/** + * @return true if WiFi is active and encrypted + */ +bool tt_wifi_is_connnection_secure(); + +/** + * @return the current radio connection link quality + */ +int tt_wifi_get_rssi(); + +#ifdef __cplusplus +} +#endif diff --git a/TactilityC/Source/tt_init.cpp b/TactilityC/Source/tt_init.cpp index 2b7af9fd..85e0eeaf 100644 --- a/TactilityC/Source/tt_init.cpp +++ b/TactilityC/Source/tt_init.cpp @@ -16,6 +16,7 @@ #include "tt_thread.h" #include "tt_time.h" #include "tt_timer.h" +#include "tt_wifi.h" #include @@ -114,6 +115,16 @@ const struct esp_elfsym elf_symbols[] { ESP_ELFSYM_EXPORT(tt_timezone_get_code), ESP_ELFSYM_EXPORT(tt_timezone_is_format_24_hour), ESP_ELFSYM_EXPORT(tt_timezone_set_format_24_hour), + ESP_ELFSYM_EXPORT(tt_wifi_get_radio_state), + ESP_ELFSYM_EXPORT(tt_wifi_radio_state_to_string), + ESP_ELFSYM_EXPORT(tt_wifi_scan), + ESP_ELFSYM_EXPORT(tt_wifi_is_scanning), + ESP_ELFSYM_EXPORT(tt_wifi_get_connection_target), + ESP_ELFSYM_EXPORT(tt_wifi_set_enabled), + ESP_ELFSYM_EXPORT(tt_wifi_connect), + ESP_ELFSYM_EXPORT(tt_wifi_disconnect), + ESP_ELFSYM_EXPORT(tt_wifi_is_connnection_secure), + ESP_ELFSYM_EXPORT(tt_wifi_get_rssi), // tt::lvgl ESP_ELFSYM_EXPORT(tt_lvgl_spinner_create), // lv_event diff --git a/TactilityC/Source/tt_wifi.cpp b/TactilityC/Source/tt_wifi.cpp new file mode 100644 index 00000000..b64441f7 --- /dev/null +++ b/TactilityC/Source/tt_wifi.cpp @@ -0,0 +1,55 @@ +#include "tt_wifi.h" + +#include +#include +#include + +using namespace tt::service; + +extern "C" { + +WifiRadioState tt_wifi_get_radio_state() { + return static_cast(wifi::getRadioState()); +} +const char* tt_wifi_radio_state_to_string(WifiRadioState state) { + return wifi::radioStateToString(static_cast(state)); +} + +void tt_wifi_scan() { + wifi::scan(); +} + +bool tt_wifi_is_scanning() { + return wifi::isScanning(); +} + +void tt_wifi_get_connection_target(char* buffer) { + auto target = wifi::getConnectionTarget(); + strcpy(buffer, target.c_str()); +} + +void tt_wifi_set_enabled(bool enabled) { + wifi::setEnabled(enabled); +} + +void tt_wifi_connect(const char* ssid, const char* password, int32_t channel, bool autoConnect, bool remember) { + wifi::settings::WifiApSettings settings; + strcpy(settings.ssid, ssid); + strcpy(settings.password, password); + settings.channel = channel; + settings.auto_connect = autoConnect; +} + +void tt_wifi_disconnect() { + wifi::disconnect(); +} + +bool tt_wifi_is_connnection_secure() { + return wifi::isConnectionSecure(); +} + +int tt_wifi_get_rssi() { + return wifi::getRssi(); +} + +}