From e3c874786774731e0bfa7d211412dd67974643ba Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Tue, 12 Nov 2024 23:59:39 +0100 Subject: [PATCH] Wi-Fi client improvements and more (#78) + Updated docs + Wi-Fi mock improved + Wi-Fi status icon improved --- README.md | 11 +++- ...al_0_lock.png => wifi_signal_0_locked.png} | Bin data/screenshot-files.png | Bin 2950 -> 0 bytes docs/pics/screenshot-systeminfo.png | Bin 4325 -> 0 bytes docs/pics/screenshot-wifi_connect.png | Bin 0 -> 4532 bytes docs/pics/screenshot-wifi_manage.png | Bin 0 -> 3629 bytes .../src/services/wifi/wifi_esp.c | 2 +- .../src/services/wifi/wifi_mock.c | 36 ++++++++++-- .../src/apps/wifi_connect/wifi_connect_view.c | 54 ++++++++++++++---- .../statusbar_updater/statusbar_updater.c | 10 ++-- 10 files changed, 90 insertions(+), 23 deletions(-) rename data/assets/{wifi_signal_0_lock.png => wifi_signal_0_locked.png} (100%) delete mode 100644 data/screenshot-files.png delete mode 100644 docs/pics/screenshot-systeminfo.png create mode 100644 docs/pics/screenshot-wifi_connect.png create mode 100644 docs/pics/screenshot-wifi_manage.png diff --git a/README.md b/README.md index 1f52f869..fab5561f 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,18 @@ It provides an application framework that is based on code from the [Flipper Zer **Status: Alpha** -Tactility features a desktop with a set of applications: +A modern desktop with built-in apps: ![screenshot of desktop app](docs/pics/screenshot-desktop.png) ![screenshot of settings app](docs/pics/screenshot-settings.png) -![screenshot of system info app](docs/pics/screenshot-systeminfo.png) ![screenshot of files app](docs/pics/screenshot-files.png) +Configure your Wi-Fi without having to hard-code credentials: + +![screenshot of wifi management app](docs/pics/screenshot-wifi_manage.png) ![screenshot of wifi app to connect to wifi](docs/pics/screenshot-wifi_connect.png) + +And much more! + +![screenshot of GPIO app](docs/pics/screenshot-gpio.png) ![screenshot of files app](docs/pics/screenshot-files.png) -![screenshot of GPIO app](docs/pics/screenshot-gpio.png) Play with the built-in apps or build your own! Use one of the supported devices or set up the drivers for your own hardware platform. diff --git a/data/assets/wifi_signal_0_lock.png b/data/assets/wifi_signal_0_locked.png similarity index 100% rename from data/assets/wifi_signal_0_lock.png rename to data/assets/wifi_signal_0_locked.png diff --git a/data/screenshot-files.png b/data/screenshot-files.png deleted file mode 100644 index ff869c02668b5acc7cf6d450f0fb1a07d296ae93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2950 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 diff --git a/docs/pics/screenshot-systeminfo.png b/docs/pics/screenshot-systeminfo.png deleted file mode 100644 index 1b0df418f48be82d7757bdb04e9472cb15bdbabf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4325 zcmZ`-c{J2*`~S`iGa15TO)5)d57}k1WM49tibu*m%492)bu5XZlqCj}vXpFtu|*77 zD}#y*#+Hy}$Y3U8cs=iX&hvZU^ZwrZe9nD7*LALQpXvR2aCnGPI9flu;0|0Q? z!ra&%06+!@eEksQU^k`NI3GA(A*~%v4$PRCn8d`yy}dm;ogN<_pPQS@!NHM~l=S}n z``Ovq&CSh?jSVuH+}_@2Jp=@t&dwF?PR8-*c_;>H#4Gj&Y zr>BR8hGu4FMn^|iR#x`)^}TxaDkCF8Sy@?ITN?s_JbCgYEiKK~ z*4EzMzQ4bJY;3Hks0a>+b8>PvH8mw9B*ewVadUGA1_svG*H2GRfByV=iAsCi$FO+4 zDUn56r?d9=_h~fR{QP|PccxPAhWRVn+S=NU8#nIWy?gH5ISB~~7Z(>B8=ItV`rWqe z_p>`|bk?~-T2?CO{P&X&9I2p zHT#>q!es8U?%%&pq3*73v&L3;8yg#^rlz89U)2Es?%x*1hK_eYE5pB^PY@zt>*zeF zf&@YOrZ4Ba#{?6$@WD$zO?dv~yQd<^**oGHM9}O)b4Y-m@&@zsEsC+Cq{t`MRt}!j zcee&*`dsYHiPSmswc(S;59-aqL0&{3&)>1~y0!9b2RDnqr8lO#VQqaOFLL|qEwh;4 zm%H`RCT-zg=YD%e*#?d3u>52h%LDm3N88pXsu#7QX$^0-D;Dp489qPda4hs{q@0oA zGgLG)?4?7SpO|PHbe$gEmai5y5Fz_JUSDs^tVgu{q}d+Bmb6#;J7uqY!w=Yx{MPu4 ziDMvZ1oL%*-zwedMvTW?i@qx?9@Y0F6Bzx_wD{@g$tu$=*Imm^ENg;iy}UWAu#FgS zkX)2)qzYM@@hx-8n)q#C8?iPscjb1A5PBCptw(;aH%~yot{r=R@B1qjXn%Wc2e*|L zrjkSjcIW(Q8D%$VR|iAHBO<`60Jw2R9~POpf0VDu1i` z(sQ3oFS;aO)jC4wGWu(2$_KbM_MV^r(8U>$$|7A`iqI{~wpwtBmYHnbCHY!THtk;X z2zx2ZmzysePB%Wu7?EyeO)?818+#G_g-qN&z-KbP`?PG9bGNfSnm?|6;M9W)>zqRC zk}(m9V(>?0+Kh|IlRt!Þ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 VRI^dAU;jRkp`NL3>1A~2zW^e#0xbXl literal 0 HcmV?d00001 diff --git a/tactility-headless/src/services/wifi/wifi_esp.c b/tactility-headless/src/services/wifi/wifi_esp.c index ff0e0898..0497af60 100644 --- a/tactility-headless/src/services/wifi/wifi_esp.c +++ b/tactility-headless/src/services/wifi/wifi_esp.c @@ -642,7 +642,7 @@ _Noreturn int32_t wifi_main(TT_UNUSED void* parameter) { WifiMessage message; while (true) { - if (tt_message_queue_get(queue, &message, 5000 / portTICK_PERIOD_MS) == TtStatusOk) { + if (tt_message_queue_get(queue, &message, 10000 / portTICK_PERIOD_MS) == TtStatusOk) { TT_LOG_I(TAG, "Processing message of type %d", message.type); switch (message.type) { case WifiMessageTypeRadioOn: diff --git a/tactility-headless/src/services/wifi/wifi_mock.c b/tactility-headless/src/services/wifi/wifi_mock.c index c5cbff4c..2f95a5ab 100644 --- a/tactility-headless/src/services/wifi/wifi_mock.c +++ b/tactility-headless/src/services/wifi/wifi_mock.c @@ -34,6 +34,15 @@ static Wifi* wifi_singleton = NULL; static void wifi_lock(Wifi* wifi); static void wifi_unlock(Wifi* wifi); +// region Static + +static void wifi_publish_event_simple(Wifi* wifi, WifiEventType type) { + WifiEvent turning_on_event = {.type = type}; + tt_pubsub_publish(wifi->pubsub, &turning_on_event); +} + +// endregion Static + // region Alloc static Wifi* wifi_alloc() { @@ -41,7 +50,7 @@ static Wifi* wifi_alloc() { instance->mutex = tt_mutex_alloc(MutexTypeRecursive); instance->pubsub = tt_pubsub_alloc(); instance->scan_active = false; - instance->radio_state = WIFI_RADIO_OFF; + instance->radio_state = WIFI_RADIO_ON; instance->secure_connection = false; return instance; } @@ -84,7 +93,6 @@ void wifi_connect(const char* ssid, _Nullable const char* password) { void wifi_disconnect() { tt_assert(wifi_singleton); - // TODO: implement } void wifi_set_scan_records(uint16_t records) { @@ -96,14 +104,32 @@ void wifi_get_scan_results(WifiApRecord records[], uint16_t limit, uint16_t* res tt_check(wifi_singleton); tt_check(result_count); - // TODO: implement - *result_count = 0; + if (limit >= 5) { + strcpy((char*)records[0].ssid, "Home WiFi"); + records[0].auth_mode = WIFI_AUTH_WPA2_PSK; + records[0].rssi = -30; + strcpy((char*)records[1].ssid, "Living Room"); + records[1].auth_mode = WIFI_AUTH_WPA2_PSK; + records[1].rssi = -67; + strcpy((char*)records[2].ssid, "No place like 127.0.0.1"); + records[2].auth_mode = WIFI_AUTH_WPA2_PSK; + records[2].rssi = -70; + strcpy((char*)records[3].ssid, "Public Wi-Fi"); + records[3].auth_mode = WIFI_AUTH_WPA2_PSK; + records[3].rssi = -80; + strcpy((char*)records[4].ssid, "Bad Reception"); + records[4].auth_mode = WIFI_AUTH_WPA2_PSK; + records[4].rssi = -90; + *result_count = 5; + } else { + *result_count = 0; + } } void wifi_set_enabled(bool enabled) { tt_assert(wifi_singleton != NULL); if (enabled) { - wifi_singleton->radio_state = WIFI_RADIO_CONNECTION_ACTIVE; + wifi_singleton->radio_state = WIFI_RADIO_ON; wifi_singleton->secure_connection = true; } else { wifi_singleton->radio_state = WIFI_RADIO_OFF; diff --git a/tactility/src/apps/wifi_connect/wifi_connect_view.c b/tactility/src/apps/wifi_connect/wifi_connect_view.c index 5b674628..c0f92517 100644 --- a/tactility/src/apps/wifi_connect/wifi_connect_view.c +++ b/tactility/src/apps/wifi_connect/wifi_connect_view.c @@ -4,7 +4,6 @@ #include "lvgl.h" #include "services/gui/gui.h" #include "services/wifi/wifi_settings.h" -#include "ui/spacer.h" #include "ui/style.h" #include "ui/toolbar.h" #include "wifi_connect.h" @@ -38,7 +37,6 @@ static void on_connect(lv_event_t* event) { strcpy((char*)settings.ssid, ssid); settings.auto_connect = TT_WIFI_AUTO_CONNECT; // No UI yet, so use global setting:w - WifiConnectBindings* bindings = &wifi->bindings; bindings->on_connect_ssid( settings.ssid, @@ -91,28 +89,64 @@ void wifi_connect_view_create(App app, void* wifi, lv_obj_t* parent) { lv_obj_set_flex_grow(wrapper, 1); lv_obj_set_flex_flow(wrapper, LV_FLEX_FLOW_COLUMN); - lv_obj_t* ssid_label = lv_label_create(wrapper); + // SSID + + lv_obj_t* ssid_wrapper = lv_obj_create(wrapper); + lv_obj_set_width(ssid_wrapper, LV_PCT(100)); + lv_obj_set_height(ssid_wrapper, LV_SIZE_CONTENT); + tt_lv_obj_set_style_no_padding(ssid_wrapper); + lv_obj_set_style_border_width(ssid_wrapper, 0, 0); + + lv_obj_t* ssid_label_wrapper = lv_obj_create(ssid_wrapper); + lv_obj_set_width(ssid_label_wrapper, LV_PCT(50)); + lv_obj_set_height(ssid_label_wrapper, LV_SIZE_CONTENT); + lv_obj_align(ssid_label_wrapper, LV_ALIGN_LEFT_MID, 0, 0); + lv_obj_set_style_border_width(ssid_label_wrapper, 0, 0); + lv_obj_set_style_pad_left(ssid_label_wrapper, 0, 0); + lv_obj_set_style_pad_right(ssid_label_wrapper, 0, 0); + + lv_obj_t* ssid_label = lv_label_create(ssid_label_wrapper); lv_label_set_text(ssid_label, "Network:"); - view->ssid_textarea = lv_textarea_create(wrapper); + + view->ssid_textarea = lv_textarea_create(ssid_wrapper); lv_textarea_set_one_line(view->ssid_textarea, true); + lv_obj_align(view->ssid_textarea, LV_ALIGN_RIGHT_MID, 0, 0); + lv_obj_set_width(view->ssid_textarea, LV_PCT(50)); - tt_lv_spacer_create(wrapper, 1, 8); + // Password - lv_obj_t* password_label = lv_label_create(wrapper); + lv_obj_t* password_wrapper = lv_obj_create(wrapper); + lv_obj_set_width(password_wrapper, LV_PCT(100)); + lv_obj_set_height(password_wrapper, LV_SIZE_CONTENT); + tt_lv_obj_set_style_no_padding(password_wrapper); + lv_obj_set_style_border_width(password_wrapper, 0, 0); + + lv_obj_t* password_label_wrapper = lv_obj_create(password_wrapper); + lv_obj_set_width(password_label_wrapper, LV_PCT(50)); + lv_obj_set_height(password_label_wrapper, LV_SIZE_CONTENT); + lv_obj_align_to(password_label_wrapper, password_wrapper, LV_ALIGN_LEFT_MID, 0, 0); + lv_obj_set_style_border_width(password_label_wrapper, 0, 0); + lv_obj_set_style_pad_left(password_label_wrapper, 0, 0); + lv_obj_set_style_pad_right(password_label_wrapper, 0, 0); + + lv_obj_t* password_label = lv_label_create(password_label_wrapper); lv_label_set_text(password_label, "Password:"); - view->password_textarea = lv_textarea_create(wrapper); + + view->password_textarea = lv_textarea_create(password_wrapper); lv_textarea_set_one_line(view->password_textarea, true); lv_textarea_set_password_mode(view->password_textarea, true); + lv_obj_align(view->password_textarea, LV_ALIGN_RIGHT_MID, 0, 0); + lv_obj_set_width(view->password_textarea, LV_PCT(50)); - tt_lv_spacer_create(wrapper, 1, 8); - + // Bottom buttons wifi_connect_view_create_bottom_buttons(wifi, wrapper); + // Keyboard bindings gui_keyboard_add_textarea(view->ssid_textarea); gui_keyboard_add_textarea(view->password_textarea); // Init from app parameters - Bundle _Nullable bundle = tt_app_get_parameters(app); + _Nullable Bundle bundle = tt_app_get_parameters(app); if (bundle) { char* ssid; if (tt_bundle_opt_string(bundle, WIFI_CONNECT_PARAM_SSID, &ssid)) { diff --git a/tactility/src/services/statusbar_updater/statusbar_updater.c b/tactility/src/services/statusbar_updater/statusbar_updater.c index af26ee75..3634fc76 100644 --- a/tactility/src/services/statusbar_updater/statusbar_updater.c +++ b/tactility/src/services/statusbar_updater/statusbar_updater.c @@ -26,14 +26,16 @@ typedef struct { const char* wifi_get_status_icon_for_rssi(int rssi, bool secured) { if (rssi > 0) { return TT_ASSETS_ICON_WIFI_CONNECTION_ISSUE; - } else if (rssi > -67) { + } else if (rssi >= -30) { return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_4_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_4; - } else if (rssi > -70) { + } else if (rssi >= -67) { return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_3_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_3; - } else if (rssi > -80) { + } else if (rssi >= -70) { return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_2_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_2; - } else { + } else if (rssi >= -80) { return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_1_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_1; + } else { + return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_0_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_0; } }