From d062ce73d71789bcf511ebf2a75bf36501d7bf98 Mon Sep 17 00:00:00 2001 From: Max Andreev Date: Fri, 19 May 2023 12:32:30 +0300 Subject: [PATCH 01/23] Add new indexer (#2681) --- .github/workflows/build.yml | 17 +++++------------ .github/workflows/reindex.yml | 3 ++- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8358d1706..ca603a64a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -123,18 +123,11 @@ jobs: - name: 'Upload artifacts to update server' if: ${{ !github.event.pull_request.head.repo.fork }} run: | - mkdir -p ~/.ssh - ssh-keyscan -p ${{ secrets.RSYNC_DEPLOY_PORT }} -H ${{ secrets.RSYNC_DEPLOY_HOST }} > ~/.ssh/known_hosts - echo "${{ secrets.RSYNC_DEPLOY_KEY }}" > deploy_key; - chmod 600 ./deploy_key; - rsync -avzP --delete --mkpath \ - -e 'ssh -p ${{ secrets.RSYNC_DEPLOY_PORT }} -i ./deploy_key' \ - artifacts/ ${{ secrets.RSYNC_DEPLOY_USER }}@${{ secrets.RSYNC_DEPLOY_HOST }}:"${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${BRANCH_NAME}/"; - rm ./deploy_key; - - - name: 'Trigger update server reindex' - if: ${{ !github.event.pull_request.head.repo.fork }} - run: curl -X POST -F 'key=${{ secrets.REINDEX_KEY }}' ${{ secrets.REINDEX_URL }} + FILES=$(for CUR in $(ls artifacts/); do echo "-F files=@artifacts/$CUR"; done) + curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \ + -F "branch=${BRANCH_NAME}" \ + ${FILES[@]} \ + "${{ secrets.INDEXER_URL }}"/firmware/uploadfiles - name: 'Find Previous Comment' if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request }} diff --git a/.github/workflows/reindex.yml b/.github/workflows/reindex.yml index ea850e705..5645f609b 100644 --- a/.github/workflows/reindex.yml +++ b/.github/workflows/reindex.yml @@ -11,4 +11,5 @@ jobs: steps: - name: Trigger reindex run: | - curl -X POST -F 'key=${{ secrets.REINDEX_KEY }}' ${{ secrets.REINDEX_URL }} + curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \ + "${{ secrets.INDEXER_URL }}"/firmware/reindex From 1d79e149cfb3279c9b27fcc2873c3fba8a928841 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Fri, 19 May 2023 12:32:35 +0300 Subject: [PATCH 02/23] subrem fix repeat --- .../main/subghz_remote/subghz_remote_app_i.c | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/applications/main/subghz_remote/subghz_remote_app_i.c b/applications/main/subghz_remote/subghz_remote_app_i.c index 9b0f77d17..171618a5f 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.c +++ b/applications/main/subghz_remote/subghz_remote_app_i.c @@ -129,23 +129,31 @@ bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* dev Stream* flipper_format_stream = flipper_format_get_raw_stream(flipper_format); bool saved = false; + uint32_t repeat = 200; FuriString* file_dir = furi_string_alloc(); path_extract_dirname(dev_file_name, file_dir); do { - //removing additional fields + // removing additional fields flipper_format_delete_key(flipper_format, "Repeat"); - //flipper_format_delete_key(flipper_format, "Manufacture"); + // flipper_format_delete_key(flipper_format, "Manufacture"); if(!storage_simply_remove(storage, dev_file_name)) { break; } + //ToDo check Write stream_seek(flipper_format_stream, 0, StreamOffsetFromStart); stream_save_to_file(flipper_format_stream, storage, dev_file_name, FSOM_CREATE_ALWAYS); + if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { + FURI_LOG_E(TAG, "Unable Repeat"); + break; + } + saved = true; } while(0); + furi_string_free(file_dir); furi_record_close(RECORD_STORAGE); return saved; @@ -267,7 +275,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat bool ret = false; bool sub_preset_loaded = false; SubRemSubFilePreset* sub_preset; - + uint32_t repeat = 200; for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { sub_preset = app->subs_preset[i]; sub_preset_loaded = false; @@ -275,6 +283,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat // FURI_LOG_I(TAG, "Empty file path"); continue; } + repeat = 200; do { if(!flipper_format_file_open_existing( fff_data_file, furi_string_get_cstr(sub_preset->file_path))) { @@ -361,6 +370,11 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat FURI_LOG_E(TAG, "Protocol does not support transmission"); } + if(!flipper_format_insert_or_update_uint32(fff_data, "Repeat", &repeat, 1)) { + FURI_LOG_E(TAG, "Unable Repeat"); + break; + } + sub_preset_loaded = true; ret |= true; #if FURI_DEBUG From 47f6d787372e577e137f3fd4c645323b436c4b5a Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Fri, 19 May 2023 23:21:18 +0300 Subject: [PATCH 03/23] Loading States & fix label length --- .../main/subghz_remote/helpers/subrem_types.h | 15 +++++ .../scenes/subrem_scene_openmapfile.c | 2 +- .../subghz_remote/scenes/subrem_scene_start.c | 6 +- .../main/subghz_remote/subghz_remote_app_i.c | 58 ++++++++++++------- .../main/subghz_remote/subghz_remote_app_i.h | 3 +- .../main/subghz_remote/views/remote.c | 2 +- 6 files changed, 60 insertions(+), 26 deletions(-) diff --git a/applications/main/subghz_remote/helpers/subrem_types.h b/applications/main/subghz_remote/helpers/subrem_types.h index 1b99aac6d..13b42897f 100644 --- a/applications/main/subghz_remote/helpers/subrem_types.h +++ b/applications/main/subghz_remote/helpers/subrem_types.h @@ -25,8 +25,23 @@ typedef enum { SubRemViewIDRemote, } SubRemViewID; +typedef enum { + SubRemLoadSubStateNotSet, + SubRemLoadSubStatePreloaded, + SubRemLoadSubStateError, + SubRemLoadSubStateErrorNoFile, + SubRemLoadSubStateErrorFreq, + SubRemLoadSubStateErrorMod, + SubRemLoadSubStateErrorProtocol, + SubRemLoadSubStateOK, +} SubRemLoadSubState; + typedef enum { SubRemLoadMapStateBack = 0, SubRemLoadMapStateError, + SubRemLoadMapStateErrorOpenError, + SubRemLoadMapStateErrorStorage, + SubRemLoadMapStateErrorBrokenFile, + SubRemLoadMapStateNotAllOK, SubRemLoadMapStateOK, } SubRemLoadMapState; \ No newline at end of file diff --git a/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c b/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c index 3391845e1..ea5c14a0a 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c @@ -18,7 +18,7 @@ void subrem_scene_openmapfile_on_enter(void* context) { dialog_message_free(message); #endif } - if(load_state == SubRemLoadMapStateOK) { + if(load_state == SubRemLoadMapStateOK || load_state == SubRemLoadMapStateNotAllOK) { scene_manager_next_scene(app->scene_manager, SubRemSceneRemote); } else { // TODO: Map Preset Reset diff --git a/applications/main/subghz_remote/scenes/subrem_scene_start.c b/applications/main/subghz_remote/scenes/subrem_scene_start.c index 962eda54c..a4bfa5047 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_start.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_start.c @@ -34,8 +34,10 @@ void subrem_scene_start_on_enter(void* context) { // subrem_scene_start_submenu_callback, // app); - submenu_set_selected_item( - submenu, scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart)); + // TODO: set scene state in subrem alloc + // submenu_set_selected_item( + // submenu, scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart)); + submenu_set_selected_item(submenu, SubmenuIndexSubRemOpenMapFile); view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewSubmenu); } diff --git a/applications/main/subghz_remote/subghz_remote_app_i.c b/applications/main/subghz_remote/subghz_remote_app_i.c index 171618a5f..349fb87cd 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.c +++ b/applications/main/subghz_remote/subghz_remote_app_i.c @@ -51,6 +51,7 @@ SubRemSubFilePreset* subrem_sub_file_preset_alloc() { sub_preset->label = furi_string_alloc_set_str("N/A"); sub_preset->type = SubGhzProtocolTypeUnknown; + sub_preset->load_state = SubRemLoadSubStateNotSet; return sub_preset; } @@ -77,6 +78,7 @@ static void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset) { stream_clean(fff_data_stream); sub_preset->type = SubGhzProtocolTypeUnknown; + sub_preset->load_state = SubRemLoadSubStateNotSet; } void subrem_map_preset_reset(SubGhzRemoteApp* app) { @@ -108,6 +110,7 @@ static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data #endif path_extract_filename(sub_preset->file_path, sub_preset->label, true); } else { + // Preload seccesful FURI_LOG_I( TAG, "%-5s: %s %s", @@ -115,6 +118,7 @@ static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data furi_string_get_cstr(sub_preset->label), furi_string_get_cstr(sub_preset->file_path)); ret = true; + sub_preset->load_state = SubRemLoadSubStatePreloaded; } flipper_format_rewind(fff_data_file); } @@ -268,21 +272,25 @@ bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced) { return false; } -static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) { +static SubRemLoadMapState + subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) { furi_assert(app); FuriString* temp_str = furi_string_alloc(); uint32_t temp_data32; - bool ret = false; - bool sub_preset_loaded = false; + bool all_loaded = true; + SubRemLoadMapState ret = SubRemLoadMapStateErrorBrokenFile; + SubRemLoadSubState sub_preset_loaded; SubRemSubFilePreset* sub_preset; uint32_t repeat = 200; for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { sub_preset = app->subs_preset[i]; - sub_preset_loaded = false; if(furi_string_empty(sub_preset->file_path)) { // FURI_LOG_I(TAG, "Empty file path"); continue; } + + sub_preset_loaded = SubRemLoadSubStateErrorNoFile; + repeat = 200; do { if(!flipper_format_file_open_existing( @@ -305,6 +313,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat } //Load frequency + sub_preset_loaded = SubRemLoadSubStateErrorFreq; if(!flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) { FURI_LOG_W(TAG, "Cannot read frequency. Set default frequency"); sub_preset->freq_preset.frequency = @@ -317,6 +326,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat } //Load preset + sub_preset_loaded = SubRemLoadSubStateErrorMod; if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) { FURI_LOG_E(TAG, "Missing Preset"); break; @@ -329,6 +339,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat } //Load protocol + sub_preset_loaded = SubRemLoadSubStateErrorProtocol; if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) { FURI_LOG_E(TAG, "Missing Protocol"); break; @@ -375,8 +386,9 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat break; } - sub_preset_loaded = true; - ret |= true; + sub_preset_loaded = SubRemLoadSubStateOK; + ret = SubRemLoadMapStateNotAllOK; + #if FURI_DEBUG FURI_LOG_I(TAG, "%-16s - protocol Loaded", furi_string_get_cstr(sub_preset->label)); #endif @@ -385,9 +397,15 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat // TODO: // Load file state logic // Label depending on the state + // Move to remote scene - if(!sub_preset_loaded) { + if(sub_preset_loaded != SubRemLoadSubStateOK) { furi_string_set_str(sub_preset->label, "N/A"); + all_loaded = false; + } + + if(ret != SubRemLoadMapStateErrorBrokenFile && all_loaded) { + ret = SubRemLoadMapStateOK; } flipper_format_file_close(fff_data_file); @@ -397,7 +415,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat return ret; } -bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { +SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { furi_assert(app); furi_assert(file_path); #if FURI_DEBUG @@ -405,7 +423,7 @@ bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { #endif Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); - bool ret = false; + SubRemLoadMapState ret = SubRemLoadMapStateErrorOpenError; #if FURI_DEBUG FURI_LOG_I(TAG, "Open Map File.."); #endif @@ -413,20 +431,23 @@ bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { if(!flipper_format_file_open_existing(fff_data_file, file_path)) { FURI_LOG_E(TAG, "Could not open MAP file %s", file_path); + ret = SubRemLoadMapStateErrorOpenError; } else { if(!subrem_map_preset_load(app, fff_data_file)) { FURI_LOG_E(TAG, "Could no Sub file path in MAP file"); // ret = // error for popup - } else if( - (flipper_format_file_close(fff_data_file)) && - (subrem_map_preset_check(app, fff_data_file))) { - FURI_LOG_I(TAG, "Load Map File Seccesful"); - ret = true; + } else if(!flipper_format_file_close(fff_data_file)) { + ret = SubRemLoadMapStateErrorOpenError; + } else { + ret = subrem_map_preset_check(app, fff_data_file); } } - // TODO: Popup for error or return error type - if(!ret) { + if(ret == SubRemLoadMapStateOK) { + FURI_LOG_I(TAG, "Load Map File Seccesful"); + } else if(ret == SubRemLoadMapStateNotAllOK) { + FURI_LOG_I(TAG, "Load Map File Seccesful [Not all files]"); + } else { FURI_LOG_E(TAG, "Broken Map File"); } @@ -434,7 +455,6 @@ bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { flipper_format_free(fff_data_file); furi_record_close(RECORD_STORAGE); - return ret; } @@ -450,10 +470,8 @@ SubRemLoadMapState subrem_load_from_file(SubGhzRemoteApp* app) { // Input events and views are managed by file_select if(!dialog_file_browser_show(app->dialogs, app->file_path, app->file_path, &browser_options)) { - } else if(subrem_map_file_load(app, furi_string_get_cstr(app->file_path))) { - ret = SubRemLoadMapStateOK; } else { - ret = SubRemLoadMapStateError; + ret = subrem_map_file_load(app, furi_string_get_cstr(app->file_path)); } furi_string_free(file_path); diff --git a/applications/main/subghz_remote/subghz_remote_app_i.h b/applications/main/subghz_remote/subghz_remote_app_i.h index 1cbdbd5cd..40d70411a 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.h +++ b/applications/main/subghz_remote/subghz_remote_app_i.h @@ -42,6 +42,7 @@ typedef struct { FuriString* protocaol_name; FuriString* label; SubGhzProtocolType type; + SubRemLoadSubState load_state; } SubRemSubFilePreset; SubRemSubFilePreset* subrem_sub_file_preset_alloc(); @@ -70,8 +71,6 @@ typedef struct { bool tx_running; uint8_t chusen_sub; - - // TODO: LoadFileError } SubGhzRemoteApp; SubRemLoadMapState subrem_load_from_file(SubGhzRemoteApp* app); diff --git a/applications/main/subghz_remote/views/remote.c b/applications/main/subghz_remote/views/remote.c index 85c63568e..1f867cd0b 100644 --- a/applications/main/subghz_remote/views/remote.c +++ b/applications/main/subghz_remote/views/remote.c @@ -4,7 +4,7 @@ #include #include -#define SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH 16 +#define SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH 12 struct SubRemViewRemote { View* view; From a4d72e0fee973638c393a23c2819926ded35c3f0 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Fri, 19 May 2023 12:32:35 +0300 Subject: [PATCH 04/23] subrem fix repeat --- .../main/subghz_remote/subghz_remote_app_i.c | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/applications/main/subghz_remote/subghz_remote_app_i.c b/applications/main/subghz_remote/subghz_remote_app_i.c index 9b0f77d17..171618a5f 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.c +++ b/applications/main/subghz_remote/subghz_remote_app_i.c @@ -129,23 +129,31 @@ bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* dev Stream* flipper_format_stream = flipper_format_get_raw_stream(flipper_format); bool saved = false; + uint32_t repeat = 200; FuriString* file_dir = furi_string_alloc(); path_extract_dirname(dev_file_name, file_dir); do { - //removing additional fields + // removing additional fields flipper_format_delete_key(flipper_format, "Repeat"); - //flipper_format_delete_key(flipper_format, "Manufacture"); + // flipper_format_delete_key(flipper_format, "Manufacture"); if(!storage_simply_remove(storage, dev_file_name)) { break; } + //ToDo check Write stream_seek(flipper_format_stream, 0, StreamOffsetFromStart); stream_save_to_file(flipper_format_stream, storage, dev_file_name, FSOM_CREATE_ALWAYS); + if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { + FURI_LOG_E(TAG, "Unable Repeat"); + break; + } + saved = true; } while(0); + furi_string_free(file_dir); furi_record_close(RECORD_STORAGE); return saved; @@ -267,7 +275,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat bool ret = false; bool sub_preset_loaded = false; SubRemSubFilePreset* sub_preset; - + uint32_t repeat = 200; for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { sub_preset = app->subs_preset[i]; sub_preset_loaded = false; @@ -275,6 +283,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat // FURI_LOG_I(TAG, "Empty file path"); continue; } + repeat = 200; do { if(!flipper_format_file_open_existing( fff_data_file, furi_string_get_cstr(sub_preset->file_path))) { @@ -361,6 +370,11 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat FURI_LOG_E(TAG, "Protocol does not support transmission"); } + if(!flipper_format_insert_or_update_uint32(fff_data, "Repeat", &repeat, 1)) { + FURI_LOG_E(TAG, "Unable Repeat"); + break; + } + sub_preset_loaded = true; ret |= true; #if FURI_DEBUG From 561b54ce361c9627cb968f48bf2c3cab5c205b23 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Sat, 20 May 2023 09:38:44 +0300 Subject: [PATCH 05/23] SubGHz App: alloc balance --- applications/main/subghz/scenes/subghz_scene_decode_raw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_decode_raw.c b/applications/main/subghz/scenes/subghz_scene_decode_raw.c index e88da3749..102965df5 100644 --- a/applications/main/subghz/scenes/subghz_scene_decode_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_decode_raw.c @@ -179,11 +179,12 @@ void subghz_scene_decode_raw_on_enter(void* context) { furi_string_get_cstr(item_time), subghz_history_get_type_protocol(subghz->history, i)); } - furi_string_free(item_name); - furi_string_free(item_time); subghz_view_receiver_set_idx_menu(subghz->subghz_receiver, subghz->idx_menu_chosen); } + furi_string_free(item_name); + furi_string_free(item_time); + subghz_scene_receiver_update_statusbar(subghz); view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdReceiver); From 87ebbc990142a729a04b4baaa6f3b2f0454d0ae5 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 20 May 2023 09:52:00 +0300 Subject: [PATCH 06/23] Update wifi marauder --- .../scenes/wifi_marauder_scene_config.h | 1 + .../wifi_marauder_scene_sniffpmkid_options.c | 117 ++++++++++++++++++ .../scenes/wifi_marauder_scene_start.c | 19 +-- .../wifi_marauder_app.h | 2 +- .../wifi_marauder_app_i.h | 2 +- .../wifi_marauder_custom_event.h | 3 +- 6 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_sniffpmkid_options.c diff --git a/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h index ae976c6bf..d223af79a 100644 --- a/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h @@ -12,3 +12,4 @@ ADD_SCENE(wifi_marauder, script_confirm_delete, ScriptConfirmDelete) ADD_SCENE(wifi_marauder, script_stage_edit, ScriptStageEdit) ADD_SCENE(wifi_marauder, script_stage_add, ScriptStageAdd) ADD_SCENE(wifi_marauder, script_stage_edit_list, ScriptStageEditList) +ADD_SCENE(wifi_marauder, sniffpmkid_options, SniffPmkidOptions) diff --git a/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_sniffpmkid_options.c b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_sniffpmkid_options.c new file mode 100644 index 000000000..02869030e --- /dev/null +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_sniffpmkid_options.c @@ -0,0 +1,117 @@ +#include "../wifi_marauder_app_i.h" + +enum SubmenuIndex { + SubmenuIndexPassive, + SubmenuIndexActive, + SubmenuIndexTargetedPassive, + SubmenuIndexTargetedActive, + SubmenuIndexChannelPassive, + SubmenuIndexChannelActive, +}; + +static void wifi_marauder_scene_sniffpmkid_options_callback(void* context, uint32_t index) { + WifiMarauderApp* app = context; + + app->is_custom_tx_string = false; // this will be set if needed by text input + switch(index) { + case SubmenuIndexPassive: + app->selected_tx_string = "sniffpmkid"; + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneSniffPmkidOptions, index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput); + break; + case SubmenuIndexActive: + app->selected_tx_string = "sniffpmkid -d"; + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneSniffPmkidOptions, index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput); + break; + case SubmenuIndexTargetedPassive: + app->selected_tx_string = "sniffpmkid -l"; + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneSniffPmkidOptions, index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput); + break; + case SubmenuIndexTargetedActive: + app->selected_tx_string = "sniffpmkid -d -l"; + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneSniffPmkidOptions, index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput); + break; + case SubmenuIndexChannelPassive: + app->selected_tx_string = "sniffpmkid -c"; + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneSniffPmkidOptions, index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneTextInput); + break; + case SubmenuIndexChannelActive: + app->selected_tx_string = "sniffpmkid -d -c"; + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneSniffPmkidOptions, index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneTextInput); + break; + } +} + +void wifi_marauder_scene_sniffpmkid_options_on_enter(void* context) { + WifiMarauderApp* app = context; + + Submenu* submenu = app->submenu; + + submenu_set_header(submenu, "Sniff PMKID"); + submenu_add_item( + submenu, + "Passive", + SubmenuIndexPassive, + wifi_marauder_scene_sniffpmkid_options_callback, + app); + submenu_add_item( + submenu, + "Active (Force Deauth)", + SubmenuIndexActive, + wifi_marauder_scene_sniffpmkid_options_callback, + app); + submenu_add_item( + submenu, + "Targeted Passive (List)", + SubmenuIndexTargetedPassive, + wifi_marauder_scene_sniffpmkid_options_callback, + app); + submenu_add_item( + submenu, + "Targeted Active (List)", + SubmenuIndexTargetedActive, + wifi_marauder_scene_sniffpmkid_options_callback, + app); + submenu_add_item( + submenu, + "On Channel # - Passive", + SubmenuIndexChannelPassive, + wifi_marauder_scene_sniffpmkid_options_callback, + app); + submenu_add_item( + submenu, + "On Channel # - Active", + SubmenuIndexChannelActive, + wifi_marauder_scene_sniffpmkid_options_callback, + app); + + submenu_set_selected_item( + submenu, + scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneSniffPmkidOptions)); + view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu); +} + +bool wifi_marauder_scene_sniffpmkid_options_on_event(void* context, SceneManagerEvent event) { + //WifiMarauderApp* app = context; + UNUSED(context); + UNUSED(event); + bool consumed = false; + + return consumed; +} + +void wifi_marauder_scene_sniffpmkid_options_on_exit(void* context) { + WifiMarauderApp* app = context; + submenu_reset(app->submenu); +} diff --git a/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c index 6f22d0adb..28a3ed2a9 100644 --- a/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c @@ -97,13 +97,6 @@ const WifiMarauderItem items[NUM_MENU_ITEMS] = { NO_ARGS, FOCUS_CONSOLE_END, SHOW_STOPSCAN_TIP}, - {"Sniff PMKID", - {"ap", "channel"}, - 2, - {"sniffpmkid -d -l", "sniffpmkid -c"}, - TOGGLE_ARGS, - FOCUS_CONSOLE_END, - SHOW_STOPSCAN_TIP}, {"Channel", {"get", "set"}, 2, @@ -161,6 +154,14 @@ static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uin return; } + if(app->selected_tx_string && + strncmp("sniffpmkid", app->selected_tx_string, strlen("sniffpmkid")) == 0) { + // sniffpmkid submenu + view_dispatcher_send_custom_event( + app->view_dispatcher, WifiMarauderEventStartSniffPmkidOptions); + return; + } + // Select automation script if(index == NUM_MENU_ITEMS - 2) { view_dispatcher_send_custom_event( @@ -254,6 +255,10 @@ bool wifi_marauder_scene_start_on_event(void* context, SceneManagerEvent event) scene_manager_set_scene_state( app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index); scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptSelect); + } else if(event.event == WifiMarauderEventStartSniffPmkidOptions) { + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneSniffPmkidOptions); } consumed = true; } else if(event.type == SceneManagerEventTypeTick) { diff --git a/applications/external/wifi_marauder_companion/wifi_marauder_app.h b/applications/external/wifi_marauder_companion/wifi_marauder_app.h index 303fb59b4..7e3856059 100644 --- a/applications/external/wifi_marauder_companion/wifi_marauder_app.h +++ b/applications/external/wifi_marauder_companion/wifi_marauder_app.h @@ -4,7 +4,7 @@ extern "C" { #endif -#define WIFI_MARAUDER_APP_VERSION "v0.3.5" +#define WIFI_MARAUDER_APP_VERSION "v0.3.6" typedef struct WifiMarauderApp WifiMarauderApp; diff --git a/applications/external/wifi_marauder_companion/wifi_marauder_app_i.h b/applications/external/wifi_marauder_companion/wifi_marauder_app_i.h index 2a16522bb..45e1e5920 100644 --- a/applications/external/wifi_marauder_companion/wifi_marauder_app_i.h +++ b/applications/external/wifi_marauder_companion/wifi_marauder_app_i.h @@ -26,7 +26,7 @@ #include #include -#define NUM_MENU_ITEMS (18) +#define NUM_MENU_ITEMS (17) #define WIFI_MARAUDER_TEXT_BOX_STORE_SIZE (4096) #define WIFI_MARAUDER_TEXT_INPUT_STORE_SIZE (512) diff --git a/applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h b/applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h index 5acdfa38e..b6d9f8274 100644 --- a/applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h +++ b/applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h @@ -8,5 +8,6 @@ typedef enum { WifiMarauderEventSaveDestinationMac, WifiMarauderEventStartSettingsInit, WifiMarauderEventStartLogViewer, - WifiMarauderEventStartScriptSelect + WifiMarauderEventStartScriptSelect, + WifiMarauderEventStartSniffPmkidOptions } WifiMarauderCustomEvent; From 1ea138f7952ac9bce054ade7add4868694a24ce2 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 20 May 2023 10:01:05 +0300 Subject: [PATCH 07/23] Port XFW keyboard to marauder instead of UART Term keyboard This implementation has not only extra symbols but a cursor feature thanks to @Willy-JL --- .../assets/KeyKeyboardSelected_10x11.png | Bin 0 -> 7210 bytes .../assets/KeyKeyboard_10x11.png | Bin 0 -> 7763 bytes .../wifi_marauder_text_input.c | 559 +++++++++++------- .../wifi_marauder_text_input.h | 31 +- 4 files changed, 358 insertions(+), 232 deletions(-) create mode 100644 applications/external/wifi_marauder_companion/assets/KeyKeyboardSelected_10x11.png create mode 100644 applications/external/wifi_marauder_companion/assets/KeyKeyboard_10x11.png diff --git a/applications/external/wifi_marauder_companion/assets/KeyKeyboardSelected_10x11.png b/applications/external/wifi_marauder_companion/assets/KeyKeyboardSelected_10x11.png new file mode 100644 index 0000000000000000000000000000000000000000..231880386a9d9e83911088c9fcd083f84a7f75bb GIT binary patch literal 7210 zcmeHMc{G&m`=?Ublaz#}DWMw1jBO@scCroG3eED&7|aYa!&oaSQQ1?BvQr3^B_u>D zRI(HaN!GGvr}BHKx3~9vzvukUd(Q9oUvtjPbKlo}U7!29KG${M=ef>=S(q8{^N8_q zaB%P&8R}xd=jxbu^9JyDl++f>!NK>$&)SZO!LlG8bQ+QD4nUZ`9smUJArm<`d^+pBC6Dvw@S z{-)=@qQ^b|b+J}=KD@%AUv=la?m*JB2h-;tO5d8_imCrneonb*>iaiOoi~|NgFw@_ z>-`^xAU-r*IlrN-```Pz{aJjIOYe6%&l?S#KG|D$Cg<#&2dHBbiv7Hj8*N; zvpssiU{m_6Dsp$aNSFHK(;jp`NzI2;_pfRP-p$Ih1Qswm1DPBQr;lPomFj({Au*WtuGPPB=1`JJ~?+kaqp}DZ~9^g`Gj^RetXd*K0SH zJ19>d_hxz4gfY4o0~P!|>%7uPfv>JPngvYNlF~X@9cNkQ$44tEW#w;Kja|NWA?QYe z&H9z@Ym4K8Z!j`;{@pL7VRsr)Udlw5{+SzC-N*UwvONzkOf40U z>Rp-(=l&{CL^|2;(~ASTgnOY>356$qP_4Gxk;-pPt_!<)6839}w2C0ZH+P73R~zoA zFn_%N@Ixg{p$8YrhfCc{1rmh9hGTc&tOBI$_UL{wII{nO>x{xZV%vvv9Gd= zx{Pyg%#5TyO)8)1GAXF#*X)gq4!Nw>aI4h}Lk`(VVk4#x70O{KzJ)ax55nwywR#plr`5U|#GaS+K)ep~wM#|o9F=~q!f|G)!`qK75Qg1vNZBX8DGrBe2k!xwX z8B1u3=g$?|8;o_>aV_xi%Ti&>@Gj@N7luANROW9+BgM*T`r}Va1Gg8a0=FhYCAQ^Q z$qO!tS~(8BA870=lvwJyG|^ZNKy+-SwRsn`(Ul~Jjs4jZ$SbmC&)D64$#vG5B_l;1 z6Gq7f(^ECck_j$KLHIjw&JR3@bTuk>{YbD=Q_Yu=+$iWKA`Nur?CliUD~Z;CZ_axwEAz6nXHiQ|V(3?+8UAD0poEjPNp z!=4qc+*xD0C(f9CuE+RU>&Is!iU}1;H!p|xdE`EA_152&_U7A!#0%R^F}jGL46$AH zvN_wVQx**-Ns@z5UW{xuK9(a%@<76{xaxVs#0U2#!jvjihd!`91^f#PV{Xfmd#WC~~ete1cf9 z+fj!7dz04|rn`8u$6klHW{xx~EZCu6o1cGPbJWqCUzB9NRq;ubLEU}+i?7e;1jRO# z+c{ru?F{Ov**2A$KZvV~MLjJYOzFJ>b+Gsv=Wq86Uv;tPMcyPSNYh|?cDLcfjI)e0 zEgRho44AL@mP}3v&FHAz33PG8oo?9Vb|vIkE!{HY(6E?&)p~USUztO-==j{D_fs6S z?pF_^Bdo5;urkh85bzqMmr}VJc)0?O`vj`7lLMz__ujs7DdzNS>!LP-??O_Dl|$$x z(M@70&Y@Mj7#E-J^wvy&+wR6r`^mm7(>;3~#7{quo|mn0V6+)CDFp+iWon z-**4Ih^W!fEm`Gp=WC&lQbJBBh;#ziZNeg^@P<1}R9Y)$&fPxouwzgtChxVH{2fbT z7-ML@+(Gz`+2evrWYre4V*q(DPP-|sg&1b{zTZPK?C?82<8e2u1J9z1O4TpDf8~|> zQr-TE=>9_QAhl1O%=OcsA;;egY%+@ebo;AaQD>RihkW?Hv6!1Sf>aUCvx2DFFku1t z8?)QiCr6ChZuLJ(G#k%VIv}&Cl8YK^T6bDx!*roc!1fJo`f{HIYNQY{K72ffUC-gI zHAJe!xZ-6L@8+3qu1J>^FSMW$Bzd>@SHWbX`NXDAH0sD0oW49iZ%}Biku~Bla&n?~ zyN3S}=Wh!_U(4MK+Y3^f6)nlt2<A+q)6|<9u^{Hh0X&}JX;5(Xg=2C>r zm*t^Z%&r-}cdW^qkgAfDef~9dQ+ya$#WWa%<4^$Wu2ukS9Z0liiAG0pbA$!)Z8Uq#Yfwh zqDg$_FNsX-I&Gz~l)6~`DniZiIAi=^*anaCQ?RJRpWoA+CNfYfFRrLmNlt#|dYDyV zpG^9Cyk=epmzRvzua??W$}-Q1qJ>r{2W{4p)|Ajyz7&26GjQgVThTD3T~A7+KtL>2 zGA&c-k)Y>0e|&?u1$Hv^ob>H&0m~O1Jcn$o$Jtkm5up`aa_ui!xZa~x)^6U4TW)b& zX{S5zW}TE8yk=8gKt-hCzq0#yOAc+e?UX9q{oOk>RHWdzN;=6VbEW&Sd7|gcLiwfn zCR}bkzxZUcpHA(1-qVnk7fqEe>m7Zy8`vEl55;N@yxOrZ*x8GaBeBg4zoGspsbc@_ z@w1(qvvS(hFkPFYCWyWUWbS#&-W7)O`^h#J^$DLDbs)c+t41)8f)SO@HUMj|=3!Nt-&#P)G@e3IF#4Ecrw~5{EoL=*TYvGGo1>S-guq# zgWPpb%Gi2x{V5fhZb=HwZ!WusFW8K<1vJBkgJ@Cqo~K$2z74umF0ZGT;1&wyOi*5L z9~bc=Bi_7zobDi!)F~xX>k@hAp_OAdUu;q!%Az#WC8MP>HfaZu+^NvNKzbEIwCCpwD-o3Xa;iXcb_; z1H+*~zx9!AEwVmQjWXJ4;wbsZu7|K>J}S{JtN8s8rP1r#%z-!4us4BM^Zko8sxMkU zfSmQZr@Q2XJL8gmI`Qrvp4(L5Lx*(o6=YGB=MTFMs-`QQZ z)5s~^@J?DzB1yE+X89hA86oig#t7bg$m2lwNH#R8LCztxS8s8YluL4}d3Yx^$o80w zacig)w3_dOwbHoGU}CG#>+rMDZ}9UYDO#T!-v+u0yEk7Q?Y^12BtAbat;d<&?M3TP z)Lkx2UliNBk`(o#U378&oO|VyXH}Z)2_*AUD7CxJz0)Z>Btb8yxiet~>!O{XDoRWc z=sZc5E3NSo-z3Rq0~NV;fTRZT{o@InNIke(DtO~jN$j~feLel zkx|b!@dQP>7#7{q2|r5CDt6HNbadaHo9#!J_sGqjFy&YnN^Sa2CWFu|=vnG8Db`}j_G%ze?xY__Z+*K=t$HMC|n%BrJ@v)+*XbjmpV zCV%2!dz0AQG)MHZua-;X5T}|Fd@u<86oI z^A*lpZr5T9ikrDOI5?qX9UTiJ9i6{A8nBPKek1CxajnI+kgBXS=z(A;RAA?c!=3ey za<=gB+_izDGgV;QV?|@G^zB;MzXX@q@W|G~)?==!`O%|8PO4vbUtoM+>EVsom6#EK z_{=^SqoAEz?(9L<2mT8%_U*f3Z0P5O@7%>h({UlMuU(zZNnW0QZctleNXls=_;QB_ zdipyMuO4&nn)5g4+jMuA6nWpNtrPl2gty~!F+R9cYGahE7e?yJ#&W$Uhv^q18_#g# zamEfU);I8-qeklVBjd90miSaZs~1|-VI!NC#6o;1?oh4_J?3o!6>vImn)qe50Ou{fF+QymHg z*CBuTNAWN<{RK~D{A2;-L*57LA+I0@m#0wVf45*T^}IolpAP+33x+k=M$2OW2F;6( z2lTuFDs%7e5Cr@$dk-(V`&u{zygc9zP(W1%xU0fHwlpv@wfJSRN&$&X@mRA0$^M5X zlT7@Ztbh2ny0R9|?~Z`xzi|Jd{a5U3%Al61DO#6?_gZz&NLL-Yx<8sg!;=ZpiDj{I11RM^A$K#X;D1d;66I6eLGNLk=SSlV^g#y9l$RG}YQc)x* zsUTrEWmQ#}B1)AA!x2?M2pmos1t%(kIQZWn%;{vXDzWard$kHh0HJUQ6dq3`sKQk7 z$|^8LMI{x`8w3DTLgL_n0u~ELsw%8O5%6ez8l8d#(@CaaNr1cum9)07N;q2E!bly8 zkc0m%v2e#SiJ*Zx^eCC?<@5J~HJJifF|n&`Dk!U{AmAt^MT81cMMVYqw~`G&XMmNs zim3pXLn78zR?~t8g8_-fuGT3CuqFp%LF>=~ER#mJrqSHhp{p)IRxN)mn}WxQfMsHJ zu}lC2g(Hw?I0B7Ow1y+mNN|8S2#2HLzvgv{X%EZh)foi4rr4=9zm|a@?7HzBD0n# z*?;=NasgJe01^g+BVhkYnEcOxo))aobWI($gGVt;O??U-sm*G#& zK!5)~KR~vOSwT8}y5Z6&x`A8PBTVZMP{#YRdS&a^gaPJ@ k(Oa(fF60b8WFS2`E^HCx5!~3>143{Z>6z)~A2}KPKg=ZgNB{r; literal 0 HcmV?d00001 diff --git a/applications/external/wifi_marauder_companion/assets/KeyKeyboard_10x11.png b/applications/external/wifi_marauder_companion/assets/KeyKeyboard_10x11.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4c03478f68cb15c74ef99888ce4faf50e0a140 GIT binary patch literal 7763 zcmeHMcT|(hwg*8VAW}pT5e%V7OCh9?P?TPzgMbtONN-0#Ksbt`qQDF2@p$jMYrS>WdiTGRwen?V&)&b;`?vSZ`eqVoY^cr2evF-g zfq_$3N5ho90!va7!EG^n_JOLaXvtIPYQ|bLIl$M+=)P1CL*XpT|J)pSw`V*_Er$lGUV9}kPM4|w*oUQF?ll7f#pMss4lb=^o zxTHFHbLTtx?Ok4rEw7t>D(VkxZfcfTJ7sHGXLrI1f{9&ic>1nxr^!utU*9dyBa?uh zt<9U4zTNzMCU9G9(Yh;AD>cajAe{zue8xJ@Yg`6yOC0zLuJnr?{uC$hz$J!1t$O8Z z{Ij)7kNrj6`_Cz6d1P2Fte8CNzMOA6aWZ8mTM&she@Jegv}p%ETlw%=%BfQ0?9PX~ zT<5QUd04Y5|8c}-@_bFLkydQn+`w{A*uwddyO(PoJR82gHV_($1!NJc)^8hP1lU9Zl+Z^xD0YX>z1jRVXA=ShPzIG{j?tUd1$5uXpzb%b+lTD z2b_);b06!E6=dp6f=I-iVUTcm69n&=VQe7T!ul5pu5cE0(s6SWJI}i_jE6#mB*~3b zo+*ONne`OHMhVIaB2&sl@&(l{@-|78&dRPay-Nyenss(>xytRJBXX7ZBCWrZ8?SG2 zx?CcyK~JPT+0;;cXyw5(k@ua5@1=`W z8c3y;Ti?ENlwI$2_72c<)8{JlK<3$m@hAXh<&Tq6(7sBM9BfW9Dgz_Fly>T@yj?Lc zQ?nbWBB-Sl&boy_$x^=>j?9_78^8SihTeAQ)XJ2m-Q$A=a;E(d5lzX-UdYO|cS42h618SdzYS-CI9A7@(~mPVzJ3&;CuY?)844V_d` zdtM*YoBGXmqH6?{;ArSfbo~91V-={sw)#ULSMlAtwJht8T_cr_b0Eq_rM~{dTXu!W z;MrSTyi|xmiS& zg@pIknVWuh8jj=#3i?h(nqB7av~MqXrsY^7>fu;MzzM-dPt5F-l@JE|c29152hi_tgqdSUNxv_%CV5xX$KDkx3 z3CnUcOS{-qoZ%kl`(>>L@$q*+;jgFCS!bmJL`RvVio!W=Y2t9e_$6*hO`Frj0qcBL zS#X;i;h-nwCW732Xblr5#s}ruxdHY-oD&1lCxlpp;<;$SEL;&?bkD&tPIiEu?O-%| zy1xBY_3O|X#={?YKLND%WxD3hhuNxrodE=`jl%Z%3CrYrddKNXkr+9k1JXi4!nFfX zJ4?6t!y+@2G4b;{Qt7KA48G3_Ca3=}wKzjT-r#}N7bAazy*FCU5gM8c89CChRP@Sy z*mBJKlGm+$n|!e0Lv_}w{!?yu()7yog*3jzdz*+g2_>N|O*A^|C0~|D&)!5;Bid(b zt`7M?w(D5sYbFw389(#>FrsLMJW332BLYztaf%<)Pp;OW-R!T;)x6~}x7df8%8z({i?9Fw30dqk zPFb2k7$5N44No0AQ9nT30q=8Z4{D0MIONu6$5=MHUL0{gaBVsu_;8FGf98lLYh>ZT z^?kafil5OYR+UbcvM;f>$Z5<|#{)QeY3>&MfH@eea_4cXsQ7O~!+A@il8Ymz2VWd= zInDZh;oSl-*`)5mqd`027ZM?#>hq)#Su0L5n;O^e#9)zUSL_qlgrsA=>bUkZ zKCOJ5{hk(2g(0EjQn3vgIf>)gLUmOSnhG=Gv-jiIX@)56y zA8rlm%E#nBlj$2dnJ_`}iammVPPKa6SX$B=<-sa$cR*sHwMuOK>Nd;Rp#1ZI3*-D@ zW16!}9pyPOp6pZSfmh#bM|fH;vG>_Yo)kWkX_gbTD%#hmjVa&cXfqwupI$n=as6rS zy86Q&#b9=xS6awoj!Z@ugsmnwZyJwt#^aSU8kb~|z|USRw_^i9zN!^9N^k?u5^Gdu z)u}w~yt+2hhwSzKLY+_LE!$C4F^hM(+q~fvlY5hoxdj<=xt=MyY>WU{#Yd5iZly3%=9Omm?!k--5ALzv6@ z=i9Y_(81sXSV0+Hlu5GNn{h3D*)n^E`r|`pcXqO&LU-(!8P{bigU@H({%lixSvwSR z-!cx!-_ZO#u=BIv%Wo9ykgTa1G-$*+cKZ7#P6&0~shFV$A0reAMkRzP!iAsIt_ zV2@Iur*CdojvIBy`uBMU8hH;=tJkAel%T0gxL2$PxQ48on#%(Z-oxcEj4!Z2ZulGBZDQCVYdz*#i$zj-uZtXHT5_3S4J6*ao2xHk%-+V%QZ?2vf5D`s zD9`tRgN|P3!SVrGhCG{$@b zhlmo5Bq(hwp|apUmxq zdXRHWoJB8#)@m+eoqhNCN4_}-WD z>DF<9Y#!@qD?0Y_LbAg_iW!`$<<(E8KNxUq6f;}9-(&s~92=I|aMpKTICX_FBGZI8 zNAAvB#6QFBlUQVyIg%aeed9?%m@JQ2+=ULdM>=FzD?fGyN>EyFg{tkrY&GGf3XgZC zC2L=D86IptIWcfTu(3=MWXAn5QBg%O#5QJf0nkNZnd3gy2&uMsno`>4qar@mIVpBp z^~jr>T%#{e)gN-wx}9j}TA6pH>8+SM)nD9M?A%c9xk3bQaunz3FYcm@z~<|!N#jgG zVVx?iw&;|taD~P>19V-}BGao;pT*5YG}^oh~!SY!b5t?b(u1-{z$rMM6WlBOZ~~6Il?In)6pwm3Z(WUwlTAlq@roV};8S z1}EZ7_(}s^YJ6U29}N@&6j;jNnz|M?Sakh4MN4hT>)CqwYYg#4FEIDSjh%p{MvgiWNOgoT0nFGwKFX)YE7f#2o^Aw3+UqQTo`GZ!l^-V&A;@lwdBx+)-% zMtVk}-f39Sv0O+oboNNcD63hl-SguP^r)?-m`M}{mB)LsuQg336{`#T?;K6Yk-f$+ zc0GYZJYGA>QDgGSfpfyaddJw8zNWRCT+H3%Z#S7$+lro*)cy#K${p1D_a~eA&TWM# z%8)&OXN@TGnHkU|9`XuMb(b6=podP)K?Gs+)1=0O#xG2|e|G#bcMF ztesUK_b@^FinJVZiMu_0xp$oITRtKYx3oSDa+M7r$nRTYxc}GC80h6Pkqn8M zSI%oQ9~D2Y+t@dooof7O#8Yaq)shns(c;DwDCzZn5y$oEf@s{E^K61G7n6JZ&(>!} zrUAqc#qqQY)CjDx8E^V}S;YLe1cekg&~FJ2PihMN9WFowBHP0UC)2 zlYCt=H3T%bPNjAynUvpz!WbABL1cAxV_kLiKTo~%vu@^Sz;3=#N1-(Zt1?!+~3k7dtTw&iL2D@ok@;Z z!5eqd6@$dU)Usg!Bvi&{hVv>oqqzK7259;7HlS)@Jtcf7E%jqz&e!!P+O3au918~t zet?)u9s$;*)Uz(*8v)w0tmT5@WU)ZrH7#Aj$m&L-uS1~HTi4X9Z`vQeE%N?j(K9Np zHwb`t(6fGFo`oM>(N*?TTa|*nNWbN8_B44sf*s>`JZcj(aaV#;-?N?qkMFcPkD7_q z$VPE}ZJu&I;W$LXQ&X?_Syg37J0e0pXB=-w{|D=wtB|R|t+kaUeo`UES$-2n-BLr+nRUcxNIF=sYG78 zGC>(+i8O#2xT_PL$U6R>L^FRwbG*MZ9zy_~Qeju}#nJ&>i8LJ0*VV<1iuF|n?crkS z?Oibx1l&`hIV*##42*&56i*@$0YN}uU`=1LHyotG4pj0akg%p2T0bD@J!Oy+jpmMp zLVbLEAU^UCil-w~4uio!VQ?rM4yJ2>seW!WoG;joD!L2t9Ycdi#e0(7X=I8Ua2FHj zK=Gm}gFy6g;Gh1vx*Hh$gmbuCCBuEvPh2Z#u{ihyJ4l)tr9S z0yQO4DPEp|jVAgl1Oflk-rdX7WiK289!hi}y3$pt^jYQpWlC*b1LL0-yA(K* zUETMr=w$zkCXGz`i>!a~ZFgiZoL?QGoBzc97wtb|-&3Y*85m$SD0r`3_jEOsLA&!~ z2^2h;fZc1NF(`Q$3XKQL5#$}f2n84tj6uSYU?dy|L!;3|IR`nyFHpK}R2t3=Puzu~ zgG0!490hrK3`P!v2BXkuc`yP7R{&#BI5ZdzM=2;E5d<6xPx=MI$dgR3N}S8DUhP5= zcAB9w`HZVPU`MQwU^|-~Xk(yLf;~ z-&3wbrqbv4+Y^0XQD#Js@4fF`7xLax0s{9I1r~?@9s(8TP5hp3I@b3gyc5pNkx1V? zew6EAx!J%S)>LeS-Wnmb9nWrR3qxXieCzQocselected_keyboard = (model->selected_keyboard + 1) % keyboard_count; +} + +static uint8_t get_row_size(const Keyboard* keyboard, uint8_t row_index) { uint8_t row_size = 0; - - switch(row_index + 1) { - case 1: - row_size = sizeof(keyboard_keys_row_1) / sizeof(WIFI_TextInputKey); - break; - case 2: - row_size = sizeof(keyboard_keys_row_2) / sizeof(WIFI_TextInputKey); - break; - case 3: - row_size = sizeof(keyboard_keys_row_3) / sizeof(WIFI_TextInputKey); - break; - case 4: - row_size = sizeof(keyboard_keys_row_4) / sizeof(WIFI_TextInputKey); - break; + if(keyboard == &symbol_keyboard) { + switch(row_index + 1) { + case 1: + row_size = COUNT_OF(symbol_keyboard_keys_row_1); + break; + case 2: + row_size = COUNT_OF(symbol_keyboard_keys_row_2); + break; + case 3: + row_size = COUNT_OF(symbol_keyboard_keys_row_3); + break; + default: + furi_crash(NULL); + } + } else { + switch(row_index + 1) { + case 1: + row_size = COUNT_OF(keyboard_keys_row_1); + break; + case 2: + row_size = COUNT_OF(keyboard_keys_row_2); + break; + case 3: + row_size = COUNT_OF(keyboard_keys_row_3); + break; + default: + furi_crash(NULL); + } } return row_size; } -static const WIFI_TextInputKey* get_row(uint8_t row_index) { +static const WIFI_TextInputKey* get_row(const Keyboard* keyboard, uint8_t row_index) { const WIFI_TextInputKey* row = NULL; - - switch(row_index + 1) { - case 1: - row = keyboard_keys_row_1; - break; - case 2: - row = keyboard_keys_row_2; - break; - case 3: - row = keyboard_keys_row_3; - break; - case 4: - row = keyboard_keys_row_4; - break; + if(row_index < 3) { + row = keyboard->rows[row_index]; + } else { + furi_crash(NULL); } return row; } static char get_selected_char(WIFI_TextInputModel* model) { - return get_row(model->selected_row)[model->selected_column].text; + return get_row( + keyboards[model->selected_keyboard], model->selected_row)[model->selected_column] + .text; } static bool char_is_lowercase(char letter) { @@ -165,36 +231,9 @@ static bool char_is_lowercase(char letter) { } static char char_to_uppercase(const char letter) { - switch(letter) { - case '_': + if(letter == '_') { return 0x20; - break; - case '(': - return 0x29; - break; - case '{': - return 0x7d; - break; - case '[': - return 0x5d; - break; - case '/': - return 0x5c; - break; - case ';': - return 0x3a; - break; - case '.': - return 0x2c; - break; - case '!': - return 0x3f; - break; - case '<': - return 0x3e; - break; - } - if(char_is_lowercase(letter)) { + } else if(char_is_lowercase(letter)) { return (letter - 0x20); } else { return letter; @@ -202,86 +241,96 @@ static char char_to_uppercase(const char letter) { } static void wifi_text_input_backspace_cb(WIFI_TextInputModel* model) { - uint8_t text_length = model->clear_default_text ? 1 : strlen(model->text_buffer); - if(text_length > 0) { - model->text_buffer[text_length - 1] = 0; + if(model->clear_default_text) { + model->text_buffer[0] = 0; + model->cursor_pos = 0; + } else if(model->cursor_pos > 0) { + char* move = model->text_buffer + model->cursor_pos; + memmove(move - 1, move, strlen(move) + 1); + model->cursor_pos--; } } static void wifi_text_input_view_draw_callback(Canvas* canvas, void* _model) { WIFI_TextInputModel* model = _model; - //uint8_t text_length = model->text_buffer ? strlen(model->text_buffer) : 0; + uint8_t text_length = model->text_buffer ? strlen(model->text_buffer) : 0; uint8_t needed_string_width = canvas_width(canvas) - 8; uint8_t start_pos = 4; - const char* text = model->text_buffer; + model->cursor_pos = model->cursor_pos > text_length ? text_length : model->cursor_pos; + size_t cursor_pos = model->cursor_pos; canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); - canvas_draw_str(canvas, 2, 7, model->header); - elements_slightly_rounded_frame(canvas, 1, 8, 126, 12); + canvas_draw_str(canvas, 2, 8, model->header); + elements_slightly_rounded_frame(canvas, 1, 12, 126, 15); - if(canvas_string_width(canvas, text) > needed_string_width) { - canvas_draw_str(canvas, start_pos, 17, "..."); - start_pos += 6; - needed_string_width -= 8; - } - - while(text != 0 && canvas_string_width(canvas, text) > needed_string_width) { - text++; + char buf[model->text_buffer_size + 1]; + if(model->text_buffer) { + strlcpy(buf, model->text_buffer, sizeof(buf)); } + char* str = buf; if(model->clear_default_text) { elements_slightly_rounded_box( - canvas, start_pos - 1, 14, canvas_string_width(canvas, text) + 2, 10); + canvas, start_pos - 1, 14, canvas_string_width(canvas, str) + 2, 10); canvas_set_color(canvas, ColorWhite); } else { - canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 1, 18, "|"); - canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 2, 18, "|"); + char* move = str + cursor_pos; + memmove(move + 1, move, strlen(move) + 1); + str[cursor_pos] = '|'; } - canvas_draw_str(canvas, start_pos, 17, text); + + if(cursor_pos > 0 && canvas_string_width(canvas, str) > needed_string_width) { + canvas_draw_str(canvas, start_pos, 22, "..."); + start_pos += 6; + needed_string_width -= 8; + for(uint32_t off = 0; + strlen(str) && canvas_string_width(canvas, str) > needed_string_width && + off < cursor_pos; + off++) { + str++; + } + } + + if(canvas_string_width(canvas, str) > needed_string_width) { + needed_string_width -= 4; + size_t len = strlen(str); + while(len && canvas_string_width(canvas, str) > needed_string_width) { + str[len--] = '\0'; + } + strcat(str, "..."); + } + + canvas_draw_str(canvas, start_pos, 22, str); canvas_set_font(canvas, FontKeyboard); - for(uint8_t row = 0; row <= keyboard_row_count; row++) { - const uint8_t column_count = get_row_size(row); - const WIFI_TextInputKey* keys = get_row(row); + for(uint8_t row = 0; row < keyboard_row_count; row++) { + const uint8_t column_count = get_row_size(keyboards[model->selected_keyboard], row); + const WIFI_TextInputKey* keys = get_row(keyboards[model->selected_keyboard], row); for(size_t column = 0; column < column_count; column++) { + bool selected = !model->cursor_select && model->selected_row == row && + model->selected_column == column; + const Icon* icon = NULL; if(keys[column].text == ENTER_KEY) { - canvas_set_color(canvas, ColorBlack); - if(model->selected_row == row && model->selected_column == column) { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeySaveSelected_24x11); - } else { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeySave_24x11); - } + icon = selected ? &I_KeySaveSelected_24x11 : &I_KeySave_24x11; + } else if(keys[column].text == SWITCH_KEYBOARD_KEY) { + icon = selected ? &I_KeyKeyboardSelected_10x11 : &I_KeyKeyboard_10x11; } else if(keys[column].text == BACKSPACE_KEY) { - canvas_set_color(canvas, ColorBlack); - if(model->selected_row == row && model->selected_column == column) { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeyBackspaceSelected_16x9); - } else { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeyBackspace_16x9); - } + icon = selected ? &I_KeyBackspaceSelected_16x9 : &I_KeyBackspace_16x9; + } + canvas_set_color(canvas, ColorBlack); + if(icon != NULL) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + icon); } else { - if(model->selected_row == row && model->selected_column == column) { - canvas_set_color(canvas, ColorBlack); + if(selected) { canvas_draw_box( canvas, keyboard_origin_x + keys[column].x - 1, @@ -289,19 +338,25 @@ static void wifi_text_input_view_draw_callback(Canvas* canvas, void* _model) { 7, 10); canvas_set_color(canvas, ColorWhite); - } else { - canvas_set_color(canvas, ColorBlack); } - canvas_draw_glyph( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - keys[column].text); + if(model->clear_default_text || text_length == 0) { + canvas_draw_glyph( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + char_to_uppercase(keys[column].text)); + } else { + canvas_draw_glyph( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + keys[column].text); + } } } } - if(model->valadator_message_visible) { + if(model->validator_message_visible) { canvas_set_font(canvas, FontSecondary); canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 8, 10, 110, 48); @@ -319,37 +374,69 @@ static void UNUSED(wifi_text_input); if(model->selected_row > 0) { model->selected_row--; - if(model->selected_column > get_row_size(model->selected_row) - 6) { + if(model->selected_row == 0 && + model->selected_column > + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 6) { model->selected_column = model->selected_column + 1; } + if(model->selected_row == 1 && + model->selected_keyboard == symbol_keyboard.keyboard_index) { + if(model->selected_column > 5) + model->selected_column += 2; + else if(model->selected_column > 1) + model->selected_column += 1; + } + } else { + model->cursor_select = true; + model->clear_default_text = false; } } static void wifi_text_input_handle_down(WIFI_TextInput* wifi_text_input, WIFI_TextInputModel* model) { UNUSED(wifi_text_input); - if(model->selected_row < keyboard_row_count - 1) { + if(model->cursor_select) { + model->cursor_select = false; + } else if(model->selected_row < keyboard_row_count - 1) { model->selected_row++; - if(model->selected_column > get_row_size(model->selected_row) - 4) { + if(model->selected_row == 1 && + model->selected_column > + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 4) { model->selected_column = model->selected_column - 1; } + if(model->selected_row == 2 && + model->selected_keyboard == symbol_keyboard.keyboard_index) { + if(model->selected_column > 7) + model->selected_column -= 2; + else if(model->selected_column > 1) + model->selected_column -= 1; + } } } static void wifi_text_input_handle_left(WIFI_TextInput* wifi_text_input, WIFI_TextInputModel* model) { UNUSED(wifi_text_input); - if(model->selected_column > 0) { + if(model->cursor_select) { + if(model->cursor_pos > 0) { + model->cursor_pos = CLAMP(model->cursor_pos - 1, strlen(model->text_buffer), 0u); + } + } else if(model->selected_column > 0) { model->selected_column--; } else { - model->selected_column = get_row_size(model->selected_row) - 1; + model->selected_column = + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1; } } static void wifi_text_input_handle_right(WIFI_TextInput* wifi_text_input, WIFI_TextInputModel* model) { UNUSED(wifi_text_input); - if(model->selected_column < get_row_size(model->selected_row) - 1) { + if(model->cursor_select) { + model->cursor_pos = CLAMP(model->cursor_pos + 1, strlen(model->text_buffer), 0u); + } else if( + model->selected_column < + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1) { model->selected_column++; } else { model->selected_column = 0; @@ -359,35 +446,49 @@ static void static void wifi_text_input_handle_ok( WIFI_TextInput* wifi_text_input, WIFI_TextInputModel* model, - bool shift) { + InputType type) { + if(model->cursor_select) return; + bool shift = type == InputTypeLong; + bool repeat = type == InputTypeRepeat; char selected = get_selected_char(model); - uint8_t text_length = strlen(model->text_buffer); - - if(shift) { - selected = char_to_uppercase(selected); - } + size_t text_length = strlen(model->text_buffer); if(selected == ENTER_KEY) { if(model->validator_callback && (!model->validator_callback( model->text_buffer, model->validator_text, model->validator_callback_context))) { - model->valadator_message_visible = true; + model->validator_message_visible = true; furi_timer_start(wifi_text_input->timer, furi_kernel_get_tick_frequency() * 4); - } else if(model->callback != 0 && text_length > 0) { + } else if(model->callback != 0 && text_length >= model->minimum_length) { model->callback(model->callback_context); } - } else if(selected == BACKSPACE_KEY) { - wifi_text_input_backspace_cb(model); + } else if(selected == SWITCH_KEYBOARD_KEY) { + switch_keyboard(model); } else { - if(model->clear_default_text) { - text_length = 0; - } - if(text_length < (model->text_buffer_size - 1)) { - model->text_buffer[text_length] = selected; - model->text_buffer[text_length + 1] = 0; + if(selected == BACKSPACE_KEY) { + wifi_text_input_backspace_cb(model); + } else if(!repeat) { + if(model->clear_default_text) { + text_length = 0; + } + if(text_length < (model->text_buffer_size - 1)) { + if(shift != (text_length == 0)) { + selected = char_to_uppercase(selected); + } + if(model->clear_default_text) { + model->text_buffer[0] = selected; + model->text_buffer[1] = '\0'; + model->cursor_pos = 1; + } else { + char* move = model->text_buffer + model->cursor_pos; + memmove(move + 1, move, strlen(move) + 1); + model->text_buffer[model->cursor_pos] = selected; + model->cursor_pos++; + } + } } + model->clear_default_text = false; } - model->clear_default_text = false; } static bool wifi_text_input_view_input_callback(InputEvent* event, void* context) { @@ -400,8 +501,8 @@ static bool wifi_text_input_view_input_callback(InputEvent* event, void* context WIFI_TextInputModel* model = view_get_model(wifi_text_input->view); if((!(event->type == InputTypePress) && !(event->type == InputTypeRelease)) && - model->valadator_message_visible) { - model->valadator_message_visible = false; + model->validator_message_visible) { + model->validator_message_visible = false; consumed = true; } else if(event->type == InputTypeShort) { consumed = true; @@ -419,7 +520,7 @@ static bool wifi_text_input_view_input_callback(InputEvent* event, void* context wifi_text_input_handle_right(wifi_text_input, model); break; case InputKeyOk: - wifi_text_input_handle_ok(wifi_text_input, model, false); + wifi_text_input_handle_ok(wifi_text_input, model, event->type); break; default: consumed = false; @@ -441,7 +542,7 @@ static bool wifi_text_input_view_input_callback(InputEvent* event, void* context wifi_text_input_handle_right(wifi_text_input, model); break; case InputKeyOk: - wifi_text_input_handle_ok(wifi_text_input, model, true); + wifi_text_input_handle_ok(wifi_text_input, model, event->type); break; case InputKeyBack: wifi_text_input_backspace_cb(model); @@ -465,6 +566,9 @@ static bool wifi_text_input_view_input_callback(InputEvent* event, void* context case InputKeyRight: wifi_text_input_handle_right(wifi_text_input, model); break; + case InputKeyOk: + wifi_text_input_handle_ok(wifi_text_input, model, event->type); + break; case InputKeyBack: wifi_text_input_backspace_cb(model); break; @@ -487,7 +591,7 @@ void wifi_text_input_timer_callback(void* context) { with_view_model( wifi_text_input->view, WIFI_TextInputModel * model, - { model->valadator_message_visible = false; }, + { model->validator_message_visible = false; }, true); } @@ -505,7 +609,12 @@ WIFI_TextInput* wifi_text_input_alloc() { with_view_model( wifi_text_input->view, WIFI_TextInputModel * model, - { model->validator_text = furi_string_alloc(); }, + { + model->validator_text = furi_string_alloc(); + model->minimum_length = 1; + model->cursor_pos = 0; + model->cursor_select = false; + }, false); wifi_text_input_reset(wifi_text_input); @@ -537,11 +646,14 @@ void wifi_text_input_reset(WIFI_TextInput* wifi_text_input) { wifi_text_input->view, WIFI_TextInputModel * model, { - model->text_buffer_size = 0; model->header = ""; model->selected_row = 0; model->selected_column = 0; + model->selected_keyboard = 0; + model->minimum_length = 1; model->clear_default_text = false; + model->cursor_pos = 0; + model->cursor_select = false; model->text_buffer = NULL; model->text_buffer_size = 0; model->callback = NULL; @@ -549,7 +661,7 @@ void wifi_text_input_reset(WIFI_TextInput* wifi_text_input) { model->validator_callback = NULL; model->validator_callback_context = NULL; furi_string_reset(model->validator_text); - model->valadator_message_visible = false; + model->validator_message_visible = false; }, true); } @@ -575,15 +687,28 @@ void wifi_text_input_set_result_callback( model->text_buffer = text_buffer; model->text_buffer_size = text_buffer_size; model->clear_default_text = clear_default_text; + model->cursor_select = false; if(text_buffer && text_buffer[0] != '\0') { + model->cursor_pos = strlen(text_buffer); // Set focus on Save model->selected_row = 2; - model->selected_column = 8; + model->selected_column = 9; + model->selected_keyboard = 0; + } else { + model->cursor_pos = 0; } }, true); } +void wifi_text_input_set_minimum_length(WIFI_TextInput* wifi_text_input, size_t minimum_length) { + with_view_model( + wifi_text_input->view, + WIFI_TextInputModel * model, + { model->minimum_length = minimum_length; }, + true); +} + void wifi_text_input_set_validator( WIFI_TextInput* wifi_text_input, WIFI_TextInputValidatorCallback callback, diff --git a/applications/external/wifi_marauder_companion/wifi_marauder_text_input.h b/applications/external/wifi_marauder_companion/wifi_marauder_text_input.h index b6b1f7bdf..f5efe9234 100644 --- a/applications/external/wifi_marauder_companion/wifi_marauder_text_input.h +++ b/applications/external/wifi_marauder_companion/wifi_marauder_text_input.h @@ -22,27 +22,27 @@ WIFI_TextInput* wifi_text_input_alloc(); /** Deinitialize and free text input * - * @param wifi_text_input WIFI_TextInput instance + * @param text_input WIFI_TextInput instance */ -void wifi_text_input_free(WIFI_TextInput* wifi_text_input); +void wifi_text_input_free(WIFI_TextInput* text_input); /** Clean text input view Note: this function does not free memory * - * @param wifi_text_input Text input instance + * @param text_input Text input instance */ -void wifi_text_input_reset(WIFI_TextInput* wifi_text_input); +void wifi_text_input_reset(WIFI_TextInput* text_input); /** Get text input view * - * @param wifi_text_input WIFI_TextInput instance + * @param text_input WIFI_TextInput instance * * @return View instance that can be used for embedding */ -View* wifi_text_input_get_view(WIFI_TextInput* wifi_text_input); +View* wifi_text_input_get_view(WIFI_TextInput* text_input); /** Set text input result callback * - * @param wifi_text_input WIFI_TextInput instance + * @param text_input WIFI_TextInput instance * @param callback callback fn * @param callback_context callback context * @param text_buffer pointer to YOUR text buffer, that we going @@ -53,7 +53,7 @@ View* wifi_text_input_get_view(WIFI_TextInput* wifi_text_input); * event */ void wifi_text_input_set_result_callback( - WIFI_TextInput* wifi_text_input, + WIFI_TextInput* text_input, WIFI_TextInputCallback callback, void* callback_context, char* text_buffer, @@ -61,22 +61,23 @@ void wifi_text_input_set_result_callback( bool clear_default_text); void wifi_text_input_set_validator( - WIFI_TextInput* wifi_text_input, + WIFI_TextInput* text_input, WIFI_TextInputValidatorCallback callback, void* callback_context); -WIFI_TextInputValidatorCallback - wifi_text_input_get_validator_callback(WIFI_TextInput* wifi_text_input); +void wifi_text_input_set_minimum_length(WIFI_TextInput* text_input, size_t minimum_length); -void* wifi_text_input_get_validator_callback_context(WIFI_TextInput* wifi_text_input); +WIFI_TextInputValidatorCallback wifi_text_input_get_validator_callback(WIFI_TextInput* text_input); + +void* wifi_text_input_get_validator_callback_context(WIFI_TextInput* text_input); /** Set text input header text * - * @param wifi_text_input WIFI_TextInput instance + * @param text_input WIFI_TextInput instance * @param text text to be shown */ -void wifi_text_input_set_header_text(WIFI_TextInput* wifi_text_input, const char* text); +void wifi_text_input_set_header_text(WIFI_TextInput* text_input, const char* text); #ifdef __cplusplus } -#endif +#endif \ No newline at end of file From 8ee959e1afc2e08b1f729cc4799a6f341ff61062 Mon Sep 17 00:00:00 2001 From: nminaylov Date: Fri, 19 May 2023 18:14:22 +0300 Subject: [PATCH 08/23] USB HID report timeout --- firmware/targets/f7/furi_hal/furi_hal_usb_hid.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c b/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c index d27613410..334aa0102 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c +++ b/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c @@ -436,7 +436,11 @@ static bool hid_send_report(uint8_t report_id) { if((hid_semaphore == NULL) || (hid_connected == false)) return false; if((boot_protocol == true) && (report_id != ReportIdKeyboard)) return false; - furi_check(furi_semaphore_acquire(hid_semaphore, FuriWaitForever) == FuriStatusOk); + FuriStatus status = furi_semaphore_acquire(hid_semaphore, HID_INTERVAL * 2); + if(status == FuriStatusErrorTimeout) { + return false; + } + furi_check(status == FuriStatusOk); if(hid_connected == false) { return false; } From 2bda0820bfb16c4397b4a7e99f0481ef30614936 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Sat, 20 May 2023 09:38:44 +0300 Subject: [PATCH 09/23] SubGHz App: alloc balance --- applications/main/subghz/scenes/subghz_scene_decode_raw.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_decode_raw.c b/applications/main/subghz/scenes/subghz_scene_decode_raw.c index e88da3749..102965df5 100644 --- a/applications/main/subghz/scenes/subghz_scene_decode_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_decode_raw.c @@ -179,11 +179,12 @@ void subghz_scene_decode_raw_on_enter(void* context) { furi_string_get_cstr(item_time), subghz_history_get_type_protocol(subghz->history, i)); } - furi_string_free(item_name); - furi_string_free(item_time); subghz_view_receiver_set_idx_menu(subghz->subghz_receiver, subghz->idx_menu_chosen); } + furi_string_free(item_name); + furi_string_free(item_time); + subghz_scene_receiver_update_statusbar(subghz); view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdReceiver); From d949b010d863c25f8c81f5b1b956e263b61a93e1 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Fri, 19 May 2023 23:21:18 +0300 Subject: [PATCH 10/23] Loading States & fix label length --- .../main/subghz_remote/helpers/subrem_types.h | 15 +++++ .../scenes/subrem_scene_openmapfile.c | 2 +- .../subghz_remote/scenes/subrem_scene_start.c | 6 +- .../main/subghz_remote/subghz_remote_app_i.c | 58 ++++++++++++------- .../main/subghz_remote/subghz_remote_app_i.h | 3 +- .../main/subghz_remote/views/remote.c | 2 +- 6 files changed, 60 insertions(+), 26 deletions(-) diff --git a/applications/main/subghz_remote/helpers/subrem_types.h b/applications/main/subghz_remote/helpers/subrem_types.h index 1b99aac6d..13b42897f 100644 --- a/applications/main/subghz_remote/helpers/subrem_types.h +++ b/applications/main/subghz_remote/helpers/subrem_types.h @@ -25,8 +25,23 @@ typedef enum { SubRemViewIDRemote, } SubRemViewID; +typedef enum { + SubRemLoadSubStateNotSet, + SubRemLoadSubStatePreloaded, + SubRemLoadSubStateError, + SubRemLoadSubStateErrorNoFile, + SubRemLoadSubStateErrorFreq, + SubRemLoadSubStateErrorMod, + SubRemLoadSubStateErrorProtocol, + SubRemLoadSubStateOK, +} SubRemLoadSubState; + typedef enum { SubRemLoadMapStateBack = 0, SubRemLoadMapStateError, + SubRemLoadMapStateErrorOpenError, + SubRemLoadMapStateErrorStorage, + SubRemLoadMapStateErrorBrokenFile, + SubRemLoadMapStateNotAllOK, SubRemLoadMapStateOK, } SubRemLoadMapState; \ No newline at end of file diff --git a/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c b/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c index 3391845e1..ea5c14a0a 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c @@ -18,7 +18,7 @@ void subrem_scene_openmapfile_on_enter(void* context) { dialog_message_free(message); #endif } - if(load_state == SubRemLoadMapStateOK) { + if(load_state == SubRemLoadMapStateOK || load_state == SubRemLoadMapStateNotAllOK) { scene_manager_next_scene(app->scene_manager, SubRemSceneRemote); } else { // TODO: Map Preset Reset diff --git a/applications/main/subghz_remote/scenes/subrem_scene_start.c b/applications/main/subghz_remote/scenes/subrem_scene_start.c index 962eda54c..a4bfa5047 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_start.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_start.c @@ -34,8 +34,10 @@ void subrem_scene_start_on_enter(void* context) { // subrem_scene_start_submenu_callback, // app); - submenu_set_selected_item( - submenu, scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart)); + // TODO: set scene state in subrem alloc + // submenu_set_selected_item( + // submenu, scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart)); + submenu_set_selected_item(submenu, SubmenuIndexSubRemOpenMapFile); view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewSubmenu); } diff --git a/applications/main/subghz_remote/subghz_remote_app_i.c b/applications/main/subghz_remote/subghz_remote_app_i.c index 171618a5f..349fb87cd 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.c +++ b/applications/main/subghz_remote/subghz_remote_app_i.c @@ -51,6 +51,7 @@ SubRemSubFilePreset* subrem_sub_file_preset_alloc() { sub_preset->label = furi_string_alloc_set_str("N/A"); sub_preset->type = SubGhzProtocolTypeUnknown; + sub_preset->load_state = SubRemLoadSubStateNotSet; return sub_preset; } @@ -77,6 +78,7 @@ static void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset) { stream_clean(fff_data_stream); sub_preset->type = SubGhzProtocolTypeUnknown; + sub_preset->load_state = SubRemLoadSubStateNotSet; } void subrem_map_preset_reset(SubGhzRemoteApp* app) { @@ -108,6 +110,7 @@ static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data #endif path_extract_filename(sub_preset->file_path, sub_preset->label, true); } else { + // Preload seccesful FURI_LOG_I( TAG, "%-5s: %s %s", @@ -115,6 +118,7 @@ static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data furi_string_get_cstr(sub_preset->label), furi_string_get_cstr(sub_preset->file_path)); ret = true; + sub_preset->load_state = SubRemLoadSubStatePreloaded; } flipper_format_rewind(fff_data_file); } @@ -268,21 +272,25 @@ bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced) { return false; } -static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) { +static SubRemLoadMapState + subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) { furi_assert(app); FuriString* temp_str = furi_string_alloc(); uint32_t temp_data32; - bool ret = false; - bool sub_preset_loaded = false; + bool all_loaded = true; + SubRemLoadMapState ret = SubRemLoadMapStateErrorBrokenFile; + SubRemLoadSubState sub_preset_loaded; SubRemSubFilePreset* sub_preset; uint32_t repeat = 200; for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { sub_preset = app->subs_preset[i]; - sub_preset_loaded = false; if(furi_string_empty(sub_preset->file_path)) { // FURI_LOG_I(TAG, "Empty file path"); continue; } + + sub_preset_loaded = SubRemLoadSubStateErrorNoFile; + repeat = 200; do { if(!flipper_format_file_open_existing( @@ -305,6 +313,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat } //Load frequency + sub_preset_loaded = SubRemLoadSubStateErrorFreq; if(!flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) { FURI_LOG_W(TAG, "Cannot read frequency. Set default frequency"); sub_preset->freq_preset.frequency = @@ -317,6 +326,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat } //Load preset + sub_preset_loaded = SubRemLoadSubStateErrorMod; if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) { FURI_LOG_E(TAG, "Missing Preset"); break; @@ -329,6 +339,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat } //Load protocol + sub_preset_loaded = SubRemLoadSubStateErrorProtocol; if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) { FURI_LOG_E(TAG, "Missing Protocol"); break; @@ -375,8 +386,9 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat break; } - sub_preset_loaded = true; - ret |= true; + sub_preset_loaded = SubRemLoadSubStateOK; + ret = SubRemLoadMapStateNotAllOK; + #if FURI_DEBUG FURI_LOG_I(TAG, "%-16s - protocol Loaded", furi_string_get_cstr(sub_preset->label)); #endif @@ -385,9 +397,15 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat // TODO: // Load file state logic // Label depending on the state + // Move to remote scene - if(!sub_preset_loaded) { + if(sub_preset_loaded != SubRemLoadSubStateOK) { furi_string_set_str(sub_preset->label, "N/A"); + all_loaded = false; + } + + if(ret != SubRemLoadMapStateErrorBrokenFile && all_loaded) { + ret = SubRemLoadMapStateOK; } flipper_format_file_close(fff_data_file); @@ -397,7 +415,7 @@ static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_dat return ret; } -bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { +SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { furi_assert(app); furi_assert(file_path); #if FURI_DEBUG @@ -405,7 +423,7 @@ bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { #endif Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); - bool ret = false; + SubRemLoadMapState ret = SubRemLoadMapStateErrorOpenError; #if FURI_DEBUG FURI_LOG_I(TAG, "Open Map File.."); #endif @@ -413,20 +431,23 @@ bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { if(!flipper_format_file_open_existing(fff_data_file, file_path)) { FURI_LOG_E(TAG, "Could not open MAP file %s", file_path); + ret = SubRemLoadMapStateErrorOpenError; } else { if(!subrem_map_preset_load(app, fff_data_file)) { FURI_LOG_E(TAG, "Could no Sub file path in MAP file"); // ret = // error for popup - } else if( - (flipper_format_file_close(fff_data_file)) && - (subrem_map_preset_check(app, fff_data_file))) { - FURI_LOG_I(TAG, "Load Map File Seccesful"); - ret = true; + } else if(!flipper_format_file_close(fff_data_file)) { + ret = SubRemLoadMapStateErrorOpenError; + } else { + ret = subrem_map_preset_check(app, fff_data_file); } } - // TODO: Popup for error or return error type - if(!ret) { + if(ret == SubRemLoadMapStateOK) { + FURI_LOG_I(TAG, "Load Map File Seccesful"); + } else if(ret == SubRemLoadMapStateNotAllOK) { + FURI_LOG_I(TAG, "Load Map File Seccesful [Not all files]"); + } else { FURI_LOG_E(TAG, "Broken Map File"); } @@ -434,7 +455,6 @@ bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { flipper_format_free(fff_data_file); furi_record_close(RECORD_STORAGE); - return ret; } @@ -450,10 +470,8 @@ SubRemLoadMapState subrem_load_from_file(SubGhzRemoteApp* app) { // Input events and views are managed by file_select if(!dialog_file_browser_show(app->dialogs, app->file_path, app->file_path, &browser_options)) { - } else if(subrem_map_file_load(app, furi_string_get_cstr(app->file_path))) { - ret = SubRemLoadMapStateOK; } else { - ret = SubRemLoadMapStateError; + ret = subrem_map_file_load(app, furi_string_get_cstr(app->file_path)); } furi_string_free(file_path); diff --git a/applications/main/subghz_remote/subghz_remote_app_i.h b/applications/main/subghz_remote/subghz_remote_app_i.h index 1cbdbd5cd..40d70411a 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.h +++ b/applications/main/subghz_remote/subghz_remote_app_i.h @@ -42,6 +42,7 @@ typedef struct { FuriString* protocaol_name; FuriString* label; SubGhzProtocolType type; + SubRemLoadSubState load_state; } SubRemSubFilePreset; SubRemSubFilePreset* subrem_sub_file_preset_alloc(); @@ -70,8 +71,6 @@ typedef struct { bool tx_running; uint8_t chusen_sub; - - // TODO: LoadFileError } SubGhzRemoteApp; SubRemLoadMapState subrem_load_from_file(SubGhzRemoteApp* app); diff --git a/applications/main/subghz_remote/views/remote.c b/applications/main/subghz_remote/views/remote.c index 85c63568e..1f867cd0b 100644 --- a/applications/main/subghz_remote/views/remote.c +++ b/applications/main/subghz_remote/views/remote.c @@ -4,7 +4,7 @@ #include #include -#define SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH 16 +#define SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH 12 struct SubRemViewRemote { View* view; From 47b1cadbb66f00cfdb2f9d7fd63896fa2ca1b20f Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Sat, 20 May 2023 15:05:26 +0300 Subject: [PATCH 11/23] fix alloc balance --- applications/main/subghz_remote/subghz_remote_app.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/applications/main/subghz_remote/subghz_remote_app.c b/applications/main/subghz_remote/subghz_remote_app.c index 0b3f645ab..b957fb8bc 100644 --- a/applications/main/subghz_remote/subghz_remote_app.c +++ b/applications/main/subghz_remote/subghz_remote_app.c @@ -42,6 +42,7 @@ SubGhzRemoteApp* subghz_remote_app_alloc() { // View Dispatcher app->view_dispatcher = view_dispatcher_alloc(); + app->scene_manager = scene_manager_alloc(&subrem_scene_handlers, app); view_dispatcher_enable_queue(app->view_dispatcher); @@ -127,6 +128,9 @@ void subghz_remote_app_free(SubGhzRemoteApp* app) { view_dispatcher_remove_view(app->view_dispatcher, SubRemViewIDRemote); subrem_view_remote_free(app->subrem_remote_view); + scene_manager_free(app->scene_manager); + view_dispatcher_free(app->view_dispatcher); + subghz_receiver_free(app->receiver); subghz_environment_free(app->environment); subghz_setting_free(app->setting); From d7db7b8b6729a486d9db1239edcb78c9c7f72531 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 21 May 2023 20:18:09 +0300 Subject: [PATCH 12/23] fix builds for old pythons --- scripts/fbt/appmanifest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/fbt/appmanifest.py b/scripts/fbt/appmanifest.py index ed1654e36..eb265cee8 100644 --- a/scripts/fbt/appmanifest.py +++ b/scripts/fbt/appmanifest.py @@ -1,7 +1,7 @@ import os from dataclasses import dataclass, field from enum import Enum -from typing import Callable, List, Optional, Tuple +from typing import Callable, List, Optional, Tuple, Union class FlipperManifestException(Exception): @@ -56,7 +56,7 @@ class FlipperApplication: # .fap-specific sources: List[str] = field(default_factory=lambda: ["*.c*"]) - fap_version: str | Tuple[int] = "0.1" + fap_version: Union[str, Tuple[int]] = "0.1" fap_icon: Optional[str] = None fap_libs: List[str] = field(default_factory=list) fap_category: str = "" From ef19fa9b51c3c6047a865ae8ba0db4f0c32df30f Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 21 May 2023 20:37:55 +0300 Subject: [PATCH 13/23] SubRemote: Migrate old files and make folder if not exist --- applications/main/subghz_remote/subghz_remote_app.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/applications/main/subghz_remote/subghz_remote_app.c b/applications/main/subghz_remote/subghz_remote_app.c index 0b3f645ab..75f9fe3dc 100644 --- a/applications/main/subghz_remote/subghz_remote_app.c +++ b/applications/main/subghz_remote/subghz_remote_app.c @@ -23,6 +23,14 @@ static void subghz_remote_app_tick_event_callback(void* context) { SubGhzRemoteApp* subghz_remote_app_alloc() { SubGhzRemoteApp* app = malloc(sizeof(SubGhzRemoteApp)); + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_migrate(storage, EXT_PATH("unirf"), SUBREM_APP_FOLDER); + + if(!storage_simply_mkdir(storage, SUBREM_APP_FOLDER)) { + //FURI_LOG_E(TAG, "Could not create folder %s", SUBREM_APP_FOLDER); + } + furi_record_close(RECORD_STORAGE); + // Enable power for External CC1101 if it is connected furi_hal_subghz_enable_ext_power(); // Auto switch to internal radio if external radio is not available From d9fc408d96b5d012966e5039dced6e9c613ea1a4 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 21 May 2023 20:50:38 +0300 Subject: [PATCH 14/23] fbt: Use union for old py (#2685) --- scripts/fbt/appmanifest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/fbt/appmanifest.py b/scripts/fbt/appmanifest.py index ed1654e36..eb265cee8 100644 --- a/scripts/fbt/appmanifest.py +++ b/scripts/fbt/appmanifest.py @@ -1,7 +1,7 @@ import os from dataclasses import dataclass, field from enum import Enum -from typing import Callable, List, Optional, Tuple +from typing import Callable, List, Optional, Tuple, Union class FlipperManifestException(Exception): @@ -56,7 +56,7 @@ class FlipperApplication: # .fap-specific sources: List[str] = field(default_factory=lambda: ["*.c*"]) - fap_version: str | Tuple[int] = "0.1" + fap_version: Union[str, Tuple[int]] = "0.1" fap_icon: Optional[str] = None fap_libs: List[str] = field(default_factory=list) fap_category: str = "" From e71a66535d3d151af82d02029a8f7bf9396eb2d7 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Sun, 21 May 2023 10:29:58 +0300 Subject: [PATCH 15/23] move part of preset --- .../subghz_remote/helpers/subrem_presets.c | 40 ++ .../subghz_remote/helpers/subrem_presets.h | 27 ++ .../scenes/subrem_scene_remote.c | 12 +- .../main/subghz_remote/subghz_remote_app.c | 6 +- .../main/subghz_remote/subghz_remote_app_i.c | 345 ++++++++---------- .../main/subghz_remote/subghz_remote_app_i.h | 28 +- 6 files changed, 237 insertions(+), 221 deletions(-) create mode 100644 applications/main/subghz_remote/helpers/subrem_presets.c create mode 100644 applications/main/subghz_remote/helpers/subrem_presets.h diff --git a/applications/main/subghz_remote/helpers/subrem_presets.c b/applications/main/subghz_remote/helpers/subrem_presets.c new file mode 100644 index 000000000..03e497198 --- /dev/null +++ b/applications/main/subghz_remote/helpers/subrem_presets.c @@ -0,0 +1,40 @@ +#include "subrem_presets.h" + +SubRemSubFilePreset* subrem_sub_file_preset_alloc() { + SubRemSubFilePreset* sub_preset = malloc(sizeof(SubRemSubFilePreset)); + + sub_preset->fff_data = flipper_format_string_alloc(); + sub_preset->file_path = furi_string_alloc(); + sub_preset->protocaol_name = furi_string_alloc(); + sub_preset->label = furi_string_alloc_set_str("N/A"); + + sub_preset->type = SubGhzProtocolTypeUnknown; + sub_preset->load_state = SubRemLoadSubStateNotSet; + + return sub_preset; +} + +void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset) { + furi_assert(sub_preset); + + furi_string_free(sub_preset->label); + furi_string_free(sub_preset->protocaol_name); + furi_string_free(sub_preset->file_path); + flipper_format_free(sub_preset->fff_data); + + free(sub_preset); +} + +void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset) { + furi_assert(sub_preset); + + furi_string_set_str(sub_preset->label, "N/A"); + furi_string_reset(sub_preset->protocaol_name); + furi_string_reset(sub_preset->file_path); + + Stream* fff_data_stream = flipper_format_get_raw_stream(sub_preset->fff_data); + stream_clean(fff_data_stream); + + sub_preset->type = SubGhzProtocolTypeUnknown; + sub_preset->load_state = SubRemLoadSubStateNotSet; +} diff --git a/applications/main/subghz_remote/helpers/subrem_presets.h b/applications/main/subghz_remote/helpers/subrem_presets.h new file mode 100644 index 000000000..60eedad57 --- /dev/null +++ b/applications/main/subghz_remote/helpers/subrem_presets.h @@ -0,0 +1,27 @@ +#pragma once + +#include "subrem_types.h" +#include +#include + +typedef struct { + uint32_t frequency; + uint8_t* data; +} FreqPreset; + +// Sub File preset +typedef struct { + FlipperFormat* fff_data; + FreqPreset freq_preset; + FuriString* file_path; + FuriString* protocaol_name; + FuriString* label; + SubGhzProtocolType type; + SubRemLoadSubState load_state; +} SubRemSubFilePreset; + +SubRemSubFilePreset* subrem_sub_file_preset_alloc(); + +void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset); + +void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset); diff --git a/applications/main/subghz_remote/scenes/subrem_scene_remote.c b/applications/main/subghz_remote/scenes/subrem_scene_remote.c index c24583233..1b8dbc471 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_remote.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_remote.c @@ -41,11 +41,11 @@ static bool subrem_scene_remote_update_data_show(void* context) { subrem_view_remote_add_data_to_show( app->subrem_remote_view, - furi_string_get_cstr(app->subs_preset[0]->label), - furi_string_get_cstr(app->subs_preset[1]->label), - furi_string_get_cstr(app->subs_preset[2]->label), - furi_string_get_cstr(app->subs_preset[3]->label), - furi_string_get_cstr(app->subs_preset[4]->label)); + furi_string_get_cstr(app->map_preset->subs_preset[0]->label), + furi_string_get_cstr(app->map_preset->subs_preset[1]->label), + furi_string_get_cstr(app->map_preset->subs_preset[2]->label), + furi_string_get_cstr(app->map_preset->subs_preset[3]->label), + furi_string_get_cstr(app->map_preset->subs_preset[4]->label)); return ret; } @@ -85,7 +85,7 @@ bool subrem_scene_remote_on_event(void* context, SceneManagerEvent event) { subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateLoading); if(subrem_tx_start_sub( app, - app->subs_preset[app->chusen_sub], + app->map_preset->subs_preset[app->chusen_sub], subrem_scene_remote_raw_callback_end_tx)) { subrem_view_remote_set_presed_btn(app->subrem_remote_view, app->chusen_sub); subrem_view_remote_set_state( diff --git a/applications/main/subghz_remote/subghz_remote_app.c b/applications/main/subghz_remote/subghz_remote_app.c index b957fb8bc..4f9138e2a 100644 --- a/applications/main/subghz_remote/subghz_remote_app.c +++ b/applications/main/subghz_remote/subghz_remote_app.c @@ -74,8 +74,9 @@ SubGhzRemoteApp* subghz_remote_app_alloc() { SubRemViewIDRemote, subrem_view_remote_get_view(app->subrem_remote_view)); + app->map_preset = malloc(sizeof(SubRemMapPreset)); for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - app->subs_preset[i] = subrem_sub_file_preset_alloc(); + app->map_preset->subs_preset[i] = subrem_sub_file_preset_alloc(); } app->setting = subghz_setting_alloc(); @@ -136,8 +137,9 @@ void subghz_remote_app_free(SubGhzRemoteApp* app) { subghz_setting_free(app->setting); for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - subrem_sub_file_preset_free(app->subs_preset[i]); + subrem_sub_file_preset_free(app->map_preset->subs_preset[i]); } + free(app->map_preset); // Notifications furi_record_close(RECORD_NOTIFICATION); diff --git a/applications/main/subghz_remote/subghz_remote_app_i.c b/applications/main/subghz_remote/subghz_remote_app_i.c index 349fb87cd..9c35a0e03 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.c +++ b/applications/main/subghz_remote/subghz_remote_app_i.c @@ -42,50 +42,11 @@ static bool return true; } -SubRemSubFilePreset* subrem_sub_file_preset_alloc() { - SubRemSubFilePreset* sub_preset = malloc(sizeof(SubRemSubFilePreset)); - - sub_preset->fff_data = flipper_format_string_alloc(); - sub_preset->file_path = furi_string_alloc(); - sub_preset->protocaol_name = furi_string_alloc(); - sub_preset->label = furi_string_alloc_set_str("N/A"); - - sub_preset->type = SubGhzProtocolTypeUnknown; - sub_preset->load_state = SubRemLoadSubStateNotSet; - - return sub_preset; -} - -void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset) { - furi_assert(sub_preset); - - furi_string_free(sub_preset->label); - furi_string_free(sub_preset->protocaol_name); - furi_string_free(sub_preset->file_path); - flipper_format_free(sub_preset->fff_data); - - free(sub_preset); -} - -static void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset) { - furi_assert(sub_preset); - - furi_string_set_str(sub_preset->label, "N/A"); - furi_string_reset(sub_preset->protocaol_name); - furi_string_reset(sub_preset->file_path); - - Stream* fff_data_stream = flipper_format_get_raw_stream(sub_preset->fff_data); - stream_clean(fff_data_stream); - - sub_preset->type = SubGhzProtocolTypeUnknown; - sub_preset->load_state = SubRemLoadSubStateNotSet; -} - -void subrem_map_preset_reset(SubGhzRemoteApp* app) { - furi_assert(app); +void subrem_map_preset_reset(SubRemMapPreset* map_preset) { + furi_assert(map_preset); for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - subrem_sub_file_preset_reset(app->subs_preset[i]); + subrem_sub_file_preset_reset(map_preset->subs_preset[i]); } } @@ -94,7 +55,7 @@ static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data bool ret = false; SubRemSubFilePreset* sub_preset; for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = app->subs_preset[i]; + sub_preset = app->map_preset->subs_preset[i]; if(!flipper_format_read_string( fff_data_file, map_file_labels[i][0], sub_preset->file_path)) { #if FURI_DEBUG @@ -125,153 +86,6 @@ static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data return ret; } -bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* dev_file_name) { - furi_assert(flipper_format); - furi_assert(dev_file_name); - - Storage* storage = furi_record_open(RECORD_STORAGE); - Stream* flipper_format_stream = flipper_format_get_raw_stream(flipper_format); - - bool saved = false; - uint32_t repeat = 200; - FuriString* file_dir = furi_string_alloc(); - - path_extract_dirname(dev_file_name, file_dir); - do { - // removing additional fields - flipper_format_delete_key(flipper_format, "Repeat"); - // flipper_format_delete_key(flipper_format, "Manufacture"); - - if(!storage_simply_remove(storage, dev_file_name)) { - break; - } - - //ToDo check Write - stream_seek(flipper_format_stream, 0, StreamOffsetFromStart); - stream_save_to_file(flipper_format_stream, storage, dev_file_name, FSOM_CREATE_ALWAYS); - - if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { - FURI_LOG_E(TAG, "Unable Repeat"); - break; - } - - saved = true; - } while(0); - - furi_string_free(file_dir); - furi_record_close(RECORD_STORAGE); - return saved; -} - -bool subrem_tx_start_sub( - SubGhzRemoteApp* app, - SubRemSubFilePreset* sub_preset, - SubGhzProtocolEncoderRAWCallbackEnd callback) { - furi_assert(app); - furi_assert(sub_preset); - bool ret = false; - - subrem_tx_stop_sub(app, true); - - if(sub_preset->type == SubGhzProtocolTypeUnknown) { - return false; - } - - FURI_LOG_I(TAG, "Send %s", furi_string_get_cstr(sub_preset->label)); - - subghz_custom_btn_set(SUBGHZ_CUSTOM_BTN_OK); - keeloq_reset_original_btn(); - subghz_custom_btns_reset(); - - do { - flipper_format_rewind(sub_preset->fff_data); // - - app->transmitter = subghz_transmitter_alloc_init( - app->environment, furi_string_get_cstr(sub_preset->protocaol_name)); - - if(app->transmitter) { - if(subghz_transmitter_deserialize(app->transmitter, sub_preset->fff_data) != - SubGhzProtocolStatusOk) { - FURI_LOG_E(TAG, "Deserialize error!"); - break; - } - furi_hal_subghz_reset(); - furi_hal_subghz_idle(); - furi_hal_subghz_load_custom_preset(sub_preset->freq_preset.data); - furi_hal_gpio_init( - furi_hal_subghz.cc1101_g0_pin, GpioModeInput, GpioPullNo, GpioSpeedLow); - - furi_hal_subghz_idle(); - - furi_hal_subghz_set_frequency_and_path(sub_preset->freq_preset.frequency); - furi_hal_gpio_write(furi_hal_subghz.cc1101_g0_pin, false); - furi_hal_gpio_init( - furi_hal_subghz.cc1101_g0_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - - if(!furi_hal_subghz_tx()) { - FURI_LOG_E(TAG, "Sending not allowed"); - break; - } - - if(sub_preset->type == SubGhzProtocolTypeRAW) { - subghz_protocol_raw_file_encoder_worker_set_callback_end( - (SubGhzProtocolEncoderRAW*)subghz_transmitter_get_protocol_instance( - app->transmitter), - callback, - app); - } - - furi_hal_subghz_start_async_tx(subghz_transmitter_yield, app->transmitter); - - ret = true; - } - } while(false); - - app->tx_running = ret; - - return ret; -} - -static void subghz_tx_stop(SubGhzRemoteApp* app) { - furi_assert(app); - - //Stop TX - furi_hal_subghz_stop_async_tx(); - - subghz_transmitter_stop(app->transmitter); - subghz_transmitter_free(app->transmitter); - furi_hal_subghz_idle(); -} - -bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced) { - furi_assert(app); - SubRemSubFilePreset* sub_preset = app->subs_preset[app->chusen_sub]; - - if(forced || (sub_preset->type != SubGhzProtocolTypeRAW)) { - // SubRemSubKeyTypeRawKey)) { - if(app->tx_running) { - subghz_tx_stop(app); - - if(sub_preset->type == SubGhzProtocolTypeDynamic) { - subrem_save_protocol_to_file( - sub_preset->fff_data, furi_string_get_cstr(sub_preset->file_path)); - - keeloq_reset_mfname(); - keeloq_reset_kl_type(); - keeloq_reset_original_btn(); - subghz_custom_btns_reset(); - star_line_reset_mfname(); - star_line_reset_kl_type(); - } - - app->tx_running = false; - return true; - } - } - - return false; -} - static SubRemLoadMapState subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) { furi_assert(app); @@ -283,7 +97,7 @@ static SubRemLoadMapState SubRemSubFilePreset* sub_preset; uint32_t repeat = 200; for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = app->subs_preset[i]; + sub_preset = app->map_preset->subs_preset[i]; if(furi_string_empty(sub_preset->file_path)) { // FURI_LOG_I(TAG, "Empty file path"); continue; @@ -427,7 +241,7 @@ SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_p #if FURI_DEBUG FURI_LOG_I(TAG, "Open Map File.."); #endif - subrem_map_preset_reset(app); + subrem_map_preset_reset(app->map_preset); if(!flipper_format_file_open_existing(fff_data_file, file_path)) { FURI_LOG_E(TAG, "Could not open MAP file %s", file_path); @@ -458,6 +272,153 @@ SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_p return ret; } +bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* dev_file_name) { + furi_assert(flipper_format); + furi_assert(dev_file_name); + + Storage* storage = furi_record_open(RECORD_STORAGE); + Stream* flipper_format_stream = flipper_format_get_raw_stream(flipper_format); + + bool saved = false; + uint32_t repeat = 200; + FuriString* file_dir = furi_string_alloc(); + + path_extract_dirname(dev_file_name, file_dir); + do { + // removing additional fields + flipper_format_delete_key(flipper_format, "Repeat"); + // flipper_format_delete_key(flipper_format, "Manufacture"); + + if(!storage_simply_remove(storage, dev_file_name)) { + break; + } + + //ToDo check Write + stream_seek(flipper_format_stream, 0, StreamOffsetFromStart); + stream_save_to_file(flipper_format_stream, storage, dev_file_name, FSOM_CREATE_ALWAYS); + + if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { + FURI_LOG_E(TAG, "Unable Repeat"); + break; + } + + saved = true; + } while(0); + + furi_string_free(file_dir); + furi_record_close(RECORD_STORAGE); + return saved; +} + +bool subrem_tx_start_sub( + SubGhzRemoteApp* app, + SubRemSubFilePreset* sub_preset, + SubGhzProtocolEncoderRAWCallbackEnd callback) { + furi_assert(app); + furi_assert(sub_preset); + bool ret = false; + + subrem_tx_stop_sub(app, true); + + if(sub_preset->type == SubGhzProtocolTypeUnknown) { + return false; + } + + FURI_LOG_I(TAG, "Send %s", furi_string_get_cstr(sub_preset->label)); + + subghz_custom_btn_set(SUBGHZ_CUSTOM_BTN_OK); + keeloq_reset_original_btn(); + subghz_custom_btns_reset(); + + do { + flipper_format_rewind(sub_preset->fff_data); // + + app->transmitter = subghz_transmitter_alloc_init( + app->environment, furi_string_get_cstr(sub_preset->protocaol_name)); + + if(app->transmitter) { + if(subghz_transmitter_deserialize(app->transmitter, sub_preset->fff_data) != + SubGhzProtocolStatusOk) { + FURI_LOG_E(TAG, "Deserialize error!"); + break; + } + furi_hal_subghz_reset(); + furi_hal_subghz_idle(); + furi_hal_subghz_load_custom_preset(sub_preset->freq_preset.data); + furi_hal_gpio_init( + furi_hal_subghz.cc1101_g0_pin, GpioModeInput, GpioPullNo, GpioSpeedLow); + + furi_hal_subghz_idle(); + + furi_hal_subghz_set_frequency_and_path(sub_preset->freq_preset.frequency); + furi_hal_gpio_write(furi_hal_subghz.cc1101_g0_pin, false); + furi_hal_gpio_init( + furi_hal_subghz.cc1101_g0_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); + + if(!furi_hal_subghz_tx()) { + FURI_LOG_E(TAG, "Sending not allowed"); + break; + } + + if(sub_preset->type == SubGhzProtocolTypeRAW) { + subghz_protocol_raw_file_encoder_worker_set_callback_end( + (SubGhzProtocolEncoderRAW*)subghz_transmitter_get_protocol_instance( + app->transmitter), + callback, + app); + } + + furi_hal_subghz_start_async_tx(subghz_transmitter_yield, app->transmitter); + + ret = true; + } + } while(false); + + app->tx_running = ret; + + return ret; +} + +static void subghz_tx_stop(SubGhzRemoteApp* app) { + furi_assert(app); + + //Stop TX + furi_hal_subghz_stop_async_tx(); + + subghz_transmitter_stop(app->transmitter); + subghz_transmitter_free(app->transmitter); + furi_hal_subghz_idle(); +} + +bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced) { + furi_assert(app); + SubRemSubFilePreset* sub_preset = app->map_preset->subs_preset[app->chusen_sub]; + + if(forced || (sub_preset->type != SubGhzProtocolTypeRAW)) { + // SubRemSubKeyTypeRawKey)) { + if(app->tx_running) { + subghz_tx_stop(app); + + if(sub_preset->type == SubGhzProtocolTypeDynamic) { + subrem_save_protocol_to_file( + sub_preset->fff_data, furi_string_get_cstr(sub_preset->file_path)); + + keeloq_reset_mfname(); + keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + subghz_custom_btns_reset(); + star_line_reset_mfname(); + star_line_reset_kl_type(); + } + + app->tx_running = false; + return true; + } + } + + return false; +} + SubRemLoadMapState subrem_load_from_file(SubGhzRemoteApp* app) { furi_assert(app); diff --git a/applications/main/subghz_remote/subghz_remote_app_i.h b/applications/main/subghz_remote/subghz_remote_app_i.h index 40d70411a..5d34968cd 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.h +++ b/applications/main/subghz_remote/subghz_remote_app_i.h @@ -1,6 +1,8 @@ #pragma once #include "helpers/subrem_types.h" +#include "helpers/subrem_presets.h" + #include #include "views/remote.h" @@ -30,25 +32,8 @@ #define SUBREM_MAX_LEN_NAME 64 typedef struct { - uint32_t frequency; - uint8_t* data; -} FreqPreset; - -// Sub File preset -typedef struct { - FlipperFormat* fff_data; - FreqPreset freq_preset; - FuriString* file_path; - FuriString* protocaol_name; - FuriString* label; - SubGhzProtocolType type; - SubRemLoadSubState load_state; -} SubRemSubFilePreset; - -SubRemSubFilePreset* subrem_sub_file_preset_alloc(); - -void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset); - + SubRemSubFilePreset* subs_preset[SubRemSubKeyNameMaxCount]; +} SubRemMapPreset; typedef struct { Gui* gui; ViewDispatcher* view_dispatcher; @@ -56,12 +41,13 @@ typedef struct { NotificationApp* notifications; DialogsApp* dialogs; Submenu* submenu; + FuriString* file_path; - char file_name_tmp[SUBREM_MAX_LEN_NAME]; + // char file_name_tmp[SUBREM_MAX_LEN_NAME]; SubRemViewRemote* subrem_remote_view; - SubRemSubFilePreset* subs_preset[SubRemSubKeyNameMaxCount]; + SubRemMapPreset* map_preset; SubGhzSetting* setting; SubGhzEnvironment* environment; From 58b21f2a49aa5608c297be0ab0c1dd4bfdd858ac Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Sun, 21 May 2023 23:34:42 +0300 Subject: [PATCH 16/23] Using TxRx from subghz --- .../subghz_remote/helpers/subrem_presets.c | 139 +++++++ .../subghz_remote/helpers/subrem_presets.h | 13 +- .../main/subghz_remote/helpers/subrem_types.h | 2 +- .../scenes/subrem_scene_openmapfile.c | 3 +- .../scenes/subrem_scene_remote.c | 51 +-- .../main/subghz_remote/subghz_remote_app.c | 22 +- .../main/subghz_remote/subghz_remote_app_i.c | 346 ++++++------------ .../main/subghz_remote/subghz_remote_app_i.h | 19 +- .../main/subghz_remote/views/remote.c | 36 +- .../main/subghz_remote/views/remote.h | 12 +- 10 files changed, 310 insertions(+), 333 deletions(-) diff --git a/applications/main/subghz_remote/helpers/subrem_presets.c b/applications/main/subghz_remote/helpers/subrem_presets.c index 03e497198..9601aae6c 100644 --- a/applications/main/subghz_remote/helpers/subrem_presets.c +++ b/applications/main/subghz_remote/helpers/subrem_presets.c @@ -1,5 +1,7 @@ #include "subrem_presets.h" +#define TAG "SubRemPresets" + SubRemSubFilePreset* subrem_sub_file_preset_alloc() { SubRemSubFilePreset* sub_preset = malloc(sizeof(SubRemSubFilePreset)); @@ -8,6 +10,8 @@ SubRemSubFilePreset* subrem_sub_file_preset_alloc() { sub_preset->protocaol_name = furi_string_alloc(); sub_preset->label = furi_string_alloc_set_str("N/A"); + sub_preset->freq_preset.name = furi_string_alloc(); + sub_preset->type = SubGhzProtocolTypeUnknown; sub_preset->load_state = SubRemLoadSubStateNotSet; @@ -22,6 +26,8 @@ void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset) { furi_string_free(sub_preset->file_path); flipper_format_free(sub_preset->fff_data); + furi_string_free(sub_preset->freq_preset.name); + free(sub_preset); } @@ -38,3 +44,136 @@ void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset) { sub_preset->type = SubGhzProtocolTypeUnknown; sub_preset->load_state = SubRemLoadSubStateNotSet; } + +SubRemLoadSubState subrem_sub_preset_load( + SubRemSubFilePreset* sub_preset, + SubGhzTxRx* txrx, + FlipperFormat* fff_data_file) { + furi_assert(sub_preset); + furi_assert(txrx); + furi_assert(fff_data_file); + + Stream* fff_data_stream = flipper_format_get_raw_stream(sub_preset->fff_data); + + SubRemLoadSubState ret; + FuriString* temp_str = furi_string_alloc(); + uint32_t temp_data32; + uint32_t repeat = 200; + + ret = SubRemLoadSubStateError; + + do { + stream_clean(fff_data_stream); + if(!flipper_format_read_header(fff_data_file, temp_str, &temp_data32)) { + FURI_LOG_E(TAG, "Missing or incorrect header"); + break; + } + + if(((!strcmp(furi_string_get_cstr(temp_str), SUBGHZ_KEY_FILE_TYPE)) || + (!strcmp(furi_string_get_cstr(temp_str), SUBGHZ_RAW_FILE_TYPE))) && + temp_data32 == SUBGHZ_KEY_FILE_VERSION) { + } else { + FURI_LOG_E(TAG, "Type or version mismatch"); + break; + } + + SubGhzSetting* setting = subghz_txrx_get_setting(txrx); // txrx->setting; + + //Load frequency or using default from settings + ret = SubRemLoadSubStateErrorFreq; + if(!flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) { + FURI_LOG_W(TAG, "Cannot read frequency. Set default frequency"); + sub_preset->freq_preset.frequency = subghz_setting_get_default_frequency(setting); + } else if(!furi_hal_subghz_is_tx_allowed(temp_data32)) { + FURI_LOG_E(TAG, "This frequency can only be used for RX"); + break; + } + sub_preset->freq_preset.frequency = temp_data32; + + //Load preset + ret = SubRemLoadSubStateErrorMod; + if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) { + FURI_LOG_E(TAG, "Missing Preset"); + break; + } + + furi_string_set_str( + temp_str, subghz_txrx_get_preset_name(txrx, furi_string_get_cstr(temp_str))); + if(!strcmp(furi_string_get_cstr(temp_str), "")) { + break; + } + + if(!strcmp(furi_string_get_cstr(temp_str), "CUSTOM")) { + FURI_LOG_E(TAG, "CUSTOM preset is not supported"); + break; + // TODO Custom preset loading logic if need + // sub_preset->freq_preset.preset_index = + // subghz_setting_get_inx_preset_by_name(setting, furi_string_get_cstr(temp_str)); + } + + furi_string_set(sub_preset->freq_preset.name, temp_str); + + // Load protocol + ret = SubRemLoadSubStateErrorProtocol; + if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) { + FURI_LOG_E(TAG, "Missing Protocol"); + break; + } + + FlipperFormat* fff_data = sub_preset->fff_data; + if(!strcmp(furi_string_get_cstr(temp_str), "RAW")) { + //if RAW + subghz_protocol_raw_gen_fff_data( + fff_data, furi_string_get_cstr(sub_preset->file_path)); + } else { + stream_copy_full( + flipper_format_get_raw_stream(fff_data_file), + flipper_format_get_raw_stream(fff_data)); + } + + if(subghz_txrx_load_decoder_by_name_protocol(txrx, furi_string_get_cstr(temp_str))) { + SubGhzProtocolStatus status = + subghz_protocol_decoder_base_deserialize(subghz_txrx_get_decoder(txrx), fff_data); + if(status != SubGhzProtocolStatusOk) { + break; + } + } else { + FURI_LOG_E(TAG, "Protocol not found"); + break; + } + + const SubGhzProtocol* protocol = subghz_txrx_get_decoder(txrx)->protocol; + + if(protocol->flag & SubGhzProtocolFlag_Send) { + if((protocol->type == SubGhzProtocolTypeStatic) || + (protocol->type == SubGhzProtocolTypeDynamic) || + // TODO: BINRAW It probably works, but checks are needed. + // (protocol->type == SubGhzProtocolTypeBinRAW) || + (protocol->type == SubGhzProtocolTypeRAW)) { + sub_preset->type = protocol->type; + } else { + FURI_LOG_E(TAG, "Unsuported Protocol"); + break; + } + + furi_string_set(sub_preset->protocaol_name, temp_str); + } else { + FURI_LOG_E(TAG, "Protocol does not support transmission"); + break; + } + + if(!flipper_format_insert_or_update_uint32(fff_data, "Repeat", &repeat, 1)) { + FURI_LOG_E(TAG, "Unable Repeat"); + break; + } + + ret = SubRemLoadSubStateOK; + +#if FURI_DEBUG + FURI_LOG_I(TAG, "%-16s - protocol Loaded", furi_string_get_cstr(sub_preset->label)); +#endif + } while(false); + + furi_string_free(temp_str); + return ret; +} diff --git a/applications/main/subghz_remote/helpers/subrem_presets.h b/applications/main/subghz_remote/helpers/subrem_presets.h index 60eedad57..fd4a2d780 100644 --- a/applications/main/subghz_remote/helpers/subrem_presets.h +++ b/applications/main/subghz_remote/helpers/subrem_presets.h @@ -3,10 +3,12 @@ #include "subrem_types.h" #include #include +#include "../../subghz/helpers/subghz_txrx.h" typedef struct { + FuriString* name; uint32_t frequency; - uint8_t* data; + // size_t preset_index; // Need for custom preset } FreqPreset; // Sub File preset @@ -20,8 +22,17 @@ typedef struct { SubRemLoadSubState load_state; } SubRemSubFilePreset; +typedef struct { + SubRemSubFilePreset* subs_preset[SubRemSubKeyNameMaxCount]; +} SubRemMapPreset; + SubRemSubFilePreset* subrem_sub_file_preset_alloc(); void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset); void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset); + +SubRemLoadSubState subrem_sub_preset_load( + SubRemSubFilePreset* sub_preset, + SubGhzTxRx* txrx, + FlipperFormat* fff_data_file); diff --git a/applications/main/subghz_remote/helpers/subrem_types.h b/applications/main/subghz_remote/helpers/subrem_types.h index 13b42897f..def807898 100644 --- a/applications/main/subghz_remote/helpers/subrem_types.h +++ b/applications/main/subghz_remote/helpers/subrem_types.h @@ -26,7 +26,7 @@ typedef enum { } SubRemViewID; typedef enum { - SubRemLoadSubStateNotSet, + SubRemLoadSubStateNotSet = 0, SubRemLoadSubStatePreloaded, SubRemLoadSubStateError, SubRemLoadSubStateErrorNoFile, diff --git a/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c b/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c index ea5c14a0a..796699c83 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_openmapfile.c @@ -4,7 +4,8 @@ void subrem_scene_openmapfile_on_enter(void* context) { SubGhzRemoteApp* app = context; SubRemLoadMapState load_state = subrem_load_from_file(app); - if(load_state == SubRemLoadMapStateError) { + if(load_state != SubRemLoadMapStateOK && load_state != SubRemLoadMapStateNotAllOK && + load_state != SubRemLoadMapStateBack) { #ifdef SUBREM_LIGHT dialog_message_show_storage_error(app->dialogs, "Can't load\nMap file"); #else diff --git a/applications/main/subghz_remote/scenes/subrem_scene_remote.c b/applications/main/subghz_remote/scenes/subrem_scene_remote.c index 1b8dbc471..eaa1c41d9 100644 --- a/applications/main/subghz_remote/scenes/subrem_scene_remote.c +++ b/applications/main/subghz_remote/scenes/subrem_scene_remote.c @@ -37,17 +37,16 @@ static uint8_t subrem_scene_remote_event_to_index(SubRemCustomEvent event_id) { static bool subrem_scene_remote_update_data_show(void* context) { SubGhzRemoteApp* app = context; - bool ret = false; - subrem_view_remote_add_data_to_show( - app->subrem_remote_view, - furi_string_get_cstr(app->map_preset->subs_preset[0]->label), - furi_string_get_cstr(app->map_preset->subs_preset[1]->label), - furi_string_get_cstr(app->map_preset->subs_preset[2]->label), - furi_string_get_cstr(app->map_preset->subs_preset[3]->label), - furi_string_get_cstr(app->map_preset->subs_preset[4]->label)); + const char* labels[SubRemSubKeyNameMaxCount]; - return ret; + for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { + labels[i] = furi_string_get_cstr(app->map_preset->subs_preset[i]->label); + } + + subrem_view_remote_add_data_to_show(app->subrem_remote_view, labels); + + return true; } void subrem_scene_remote_on_enter(void* context) { @@ -81,32 +80,37 @@ bool subrem_scene_remote_on_event(void* context, SceneManagerEvent event) { event.event == SubRemCustomEventViewRemoteStartOK) { // Start sending sub subrem_tx_stop_sub(app, true); - app->chusen_sub = subrem_scene_remote_event_to_index(event.event); - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateLoading); - if(subrem_tx_start_sub( - app, - app->map_preset->subs_preset[app->chusen_sub], - subrem_scene_remote_raw_callback_end_tx)) { - subrem_view_remote_set_presed_btn(app->subrem_remote_view, app->chusen_sub); + + uint8_t chusen_sub = subrem_scene_remote_event_to_index(event.event); + app->chusen_sub = chusen_sub; + + subrem_view_remote_set_state( + app->subrem_remote_view, SubRemViewRemoteStateLoading, chusen_sub); + + if(subrem_tx_start_sub(app, app->map_preset->subs_preset[chusen_sub])) { + if(app->map_preset->subs_preset[chusen_sub]->type == SubGhzProtocolTypeRAW) { + subghz_txrx_set_raw_file_encoder_worker_callback_end( + app->txrx, subrem_scene_remote_raw_callback_end_tx, app); + } subrem_view_remote_set_state( - app->subrem_remote_view, SubRemViewRemoteStateSending); + app->subrem_remote_view, SubRemViewRemoteStateSending, chusen_sub); notification_message(app->notifications, &sequence_blink_start_magenta); } else { - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle); + subrem_view_remote_set_state( + app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); notification_message(app->notifications, &sequence_blink_stop); } return true; } else if(event.event == SubRemCustomEventViewRemoteForcedStop) { subrem_tx_stop_sub(app, true); - subrem_view_remote_set_presed_btn(app->subrem_remote_view, 0); - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle); + subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); notification_message(app->notifications, &sequence_blink_stop); return true; } else if(event.event == SubRemCustomEventViewRemoteStop) { if(subrem_tx_stop_sub(app, false)) { - subrem_view_remote_set_presed_btn(app->subrem_remote_view, 0); - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle); + subrem_view_remote_set_state( + app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); notification_message(app->notifications, &sequence_blink_stop); } @@ -123,8 +127,7 @@ void subrem_scene_remote_on_exit(void* context) { subrem_tx_stop_sub(app, true); - subrem_view_remote_set_presed_btn(app->subrem_remote_view, 0); - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle); + subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); notification_message(app->notifications, &sequence_blink_stop); } diff --git a/applications/main/subghz_remote/subghz_remote_app.c b/applications/main/subghz_remote/subghz_remote_app.c index 4f9138e2a..7383757d2 100644 --- a/applications/main/subghz_remote/subghz_remote_app.c +++ b/applications/main/subghz_remote/subghz_remote_app.c @@ -79,23 +79,9 @@ SubGhzRemoteApp* subghz_remote_app_alloc() { app->map_preset->subs_preset[i] = subrem_sub_file_preset_alloc(); } - app->setting = subghz_setting_alloc(); - subghz_setting_load(app->setting, EXT_PATH("subghz/assets/setting_user")); + app->txrx = subghz_txrx_alloc(); - app->environment = subghz_environment_alloc(); - - subghz_environment_load_keystore(app->environment, EXT_PATH("subghz/assets/keeloq_mfcodes")); - subghz_environment_load_keystore( - app->environment, EXT_PATH("subghz/assets/keeloq_mfcodes_user")); - subghz_environment_set_came_atomo_rainbow_table_file_name( - app->environment, EXT_PATH("subghz/assets/came_atomo")); - subghz_environment_set_alutech_at_4n_rainbow_table_file_name( - app->environment, EXT_PATH("subghz/assets/alutech_at_4n")); - subghz_environment_set_nice_flor_s_rainbow_table_file_name( - app->environment, EXT_PATH("subghz/assets/nice_flor_s")); - subghz_environment_set_protocol_registry(app->environment, (void*)&subghz_protocol_registry); - - app->receiver = subghz_receiver_alloc_init(app->environment); + subghz_txrx_set_need_save_callback(app->txrx, subrem_save_active_sub, app); app->tx_running = false; @@ -132,9 +118,7 @@ void subghz_remote_app_free(SubGhzRemoteApp* app) { scene_manager_free(app->scene_manager); view_dispatcher_free(app->view_dispatcher); - subghz_receiver_free(app->receiver); - subghz_environment_free(app->environment); - subghz_setting_free(app->setting); + subghz_txrx_free(app->txrx); for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { subrem_sub_file_preset_free(app->map_preset->subs_preset[i]); diff --git a/applications/main/subghz_remote/subghz_remote_app_i.c b/applications/main/subghz_remote/subghz_remote_app_i.c index 9c35a0e03..fb34b59f7 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.c +++ b/applications/main/subghz_remote/subghz_remote_app_i.c @@ -4,6 +4,8 @@ #include +#include "../subghz/helpers/subghz_txrx_i.h" + // #include // #include @@ -11,6 +13,12 @@ #define TAG "SubGhzRemote" +// XXX Using TxRx +// [x] use TxRx preset subrem_sub_preset_load & subrem_tx_start_sub +// [x] subrem_sub_preset_load & drop subrem_set_preset_data +// [x] subrem_tx_start_sub +// [x] subrem_tx_stop_sub + static const char* map_file_labels[SubRemSubKeyNameMaxCount][2] = { [SubRemSubKeyNameUp] = {"UP", "ULABEL"}, [SubRemSubKeyNameDown] = {"DOWN", "DLABEL"}, @@ -19,30 +27,7 @@ static const char* map_file_labels[SubRemSubKeyNameMaxCount][2] = { [SubRemSubKeyNameOk] = {"OK", "OKLABEL"}, }; -static bool - subrem_set_preset_data(SubGhzSetting* setting, FreqPreset* freq_preset, const char* preset) { - const char* preset_name = ""; - if(!strcmp(preset, "FuriHalSubGhzPresetOok270Async")) { - preset_name = "AM270"; - } else if(!strcmp(preset, "FuriHalSubGhzPresetOok650Async")) { - preset_name = "AM650"; - } else if(!strcmp(preset, "FuriHalSubGhzPreset2FSKDev238Async")) { - preset_name = "FM238"; - } else if(!strcmp(preset, "FuriHalSubGhzPreset2FSKDev476Async")) { - preset_name = "FM476"; - } else if(!strcmp(preset, "FuriHalSubGhzPresetCustom")) { - // preset_name = "CUSTOM"; - return false; - } else { - FURI_LOG_E(TAG, "Unknown preset"); - return false; - } - size_t preset_index = subghz_setting_get_inx_preset_by_name(setting, preset_name); - freq_preset->data = subghz_setting_get_preset_data(setting, preset_index); - return true; -} - -void subrem_map_preset_reset(SubRemMapPreset* map_preset) { +static void subrem_map_preset_reset(SubRemMapPreset* map_preset) { furi_assert(map_preset); for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { @@ -50,12 +35,61 @@ void subrem_map_preset_reset(SubRemMapPreset* map_preset) { } } -static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) { - furi_assert(app); +static SubRemLoadMapState subrem_map_preset_check( + SubRemMapPreset* map_preset, + SubGhzTxRx* txrx, + FlipperFormat* fff_data_file) { + furi_assert(map_preset); + furi_assert(txrx); + + bool all_loaded = true; + SubRemLoadMapState ret = SubRemLoadMapStateErrorBrokenFile; + + SubRemLoadSubState sub_preset_loaded; + SubRemSubFilePreset* sub_preset; + + for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { + sub_preset = map_preset->subs_preset[i]; + + sub_preset_loaded = SubRemLoadSubStateErrorNoFile; + + if(furi_string_empty(sub_preset->file_path)) { + // FURI_LOG_I(TAG, "Empty file path"); + } else if(!flipper_format_file_open_existing( + fff_data_file, furi_string_get_cstr(sub_preset->file_path))) { + FURI_LOG_W(TAG, "Error open file %s", furi_string_get_cstr(sub_preset->file_path)); + } else { + sub_preset_loaded = subrem_sub_preset_load(sub_preset, txrx, fff_data_file); + } + + // TODO: + // Load file state logic + // Label depending on the state + // Move to remote scene + + if(sub_preset_loaded != SubRemLoadSubStateOK) { + furi_string_set_str(sub_preset->label, "N/A"); + all_loaded = false; + } else { + ret = SubRemLoadMapStateNotAllOK; + } + + if(ret != SubRemLoadMapStateErrorBrokenFile && all_loaded) { + ret = SubRemLoadMapStateOK; + } + + flipper_format_file_close(fff_data_file); + } + + return ret; +} + +static bool subrem_map_preset_load(SubRemMapPreset* map_preset, FlipperFormat* fff_data_file) { + furi_assert(map_preset); bool ret = false; SubRemSubFilePreset* sub_preset; for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = app->map_preset->subs_preset[i]; + sub_preset = map_preset->subs_preset[i]; if(!flipper_format_read_string( fff_data_file, map_file_labels[i][0], sub_preset->file_path)) { #if FURI_DEBUG @@ -69,8 +103,13 @@ static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data #if FURI_DEBUG FURI_LOG_W(TAG, "No Label for %s", map_file_labels[i][0]); #endif + // TODO move to remote scene path_extract_filename(sub_preset->file_path, sub_preset->label, true); + ret = true; } else { + ret = true; + } + if(ret) { // Preload seccesful FURI_LOG_I( TAG, @@ -78,157 +117,14 @@ static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data map_file_labels[i][0], furi_string_get_cstr(sub_preset->label), furi_string_get_cstr(sub_preset->file_path)); - ret = true; sub_preset->load_state = SubRemLoadSubStatePreloaded; } + flipper_format_rewind(fff_data_file); } return ret; } -static SubRemLoadMapState - subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) { - furi_assert(app); - FuriString* temp_str = furi_string_alloc(); - uint32_t temp_data32; - bool all_loaded = true; - SubRemLoadMapState ret = SubRemLoadMapStateErrorBrokenFile; - SubRemLoadSubState sub_preset_loaded; - SubRemSubFilePreset* sub_preset; - uint32_t repeat = 200; - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = app->map_preset->subs_preset[i]; - if(furi_string_empty(sub_preset->file_path)) { - // FURI_LOG_I(TAG, "Empty file path"); - continue; - } - - sub_preset_loaded = SubRemLoadSubStateErrorNoFile; - - repeat = 200; - do { - if(!flipper_format_file_open_existing( - fff_data_file, furi_string_get_cstr(sub_preset->file_path))) { - FURI_LOG_W(TAG, "Error open file %s", furi_string_get_cstr(sub_preset->file_path)); - break; - } - - if(!flipper_format_read_header(fff_data_file, temp_str, &temp_data32)) { - FURI_LOG_E(TAG, "Missing or incorrect header"); - break; - } - - if(((!strcmp(furi_string_get_cstr(temp_str), SUBGHZ_KEY_FILE_TYPE)) || - (!strcmp(furi_string_get_cstr(temp_str), SUBGHZ_RAW_FILE_TYPE))) && - temp_data32 == SUBGHZ_KEY_FILE_VERSION) { - } else { - FURI_LOG_E(TAG, "Type or version mismatch"); - break; - } - - //Load frequency - sub_preset_loaded = SubRemLoadSubStateErrorFreq; - if(!flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) { - FURI_LOG_W(TAG, "Cannot read frequency. Set default frequency"); - sub_preset->freq_preset.frequency = - subghz_setting_get_default_frequency(app->setting); - } else if(!furi_hal_subghz_is_tx_allowed(temp_data32)) { - FURI_LOG_E(TAG, "This frequency can only be used for RX"); - break; - } else { - sub_preset->freq_preset.frequency = temp_data32; - } - - //Load preset - sub_preset_loaded = SubRemLoadSubStateErrorMod; - if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) { - FURI_LOG_E(TAG, "Missing Preset"); - break; - } - - if(!subrem_set_preset_data( - app->setting, &sub_preset->freq_preset, furi_string_get_cstr(temp_str))) { - FURI_LOG_E(TAG, "Cannot load preset."); - break; - } - - //Load protocol - sub_preset_loaded = SubRemLoadSubStateErrorProtocol; - if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) { - FURI_LOG_E(TAG, "Missing Protocol"); - break; - } - - FlipperFormat* fff_data = sub_preset->fff_data; - if(!strcmp(furi_string_get_cstr(temp_str), "RAW")) { - //if RAW - subghz_protocol_raw_gen_fff_data( - fff_data, furi_string_get_cstr(sub_preset->file_path)); - } else { - stream_copy_full( - flipper_format_get_raw_stream(fff_data_file), - flipper_format_get_raw_stream(fff_data)); - } - - const SubGhzProtocolRegistry* protocol_registry_items = - subghz_environment_get_protocol_registry(app->environment); - - const SubGhzProtocol* protocol = subghz_protocol_registry_get_by_name( - protocol_registry_items, furi_string_get_cstr(temp_str)); - - if(!protocol) { - FURI_LOG_E(TAG, "Protocol not found"); - break; - } else if(protocol->flag & SubGhzProtocolFlag_Send) { - if((protocol->type == SubGhzProtocolTypeStatic) || - (protocol->type == SubGhzProtocolTypeDynamic) || - // (protocol->type == SubGhzProtocolTypeBinRAW) || // TODO: BINRAW - (protocol->type == SubGhzProtocolTypeRAW)) { - sub_preset->type = protocol->type; - } else { - FURI_LOG_E(TAG, "Unsuported Protocol"); - break; - } - - furi_string_set(sub_preset->protocaol_name, temp_str); - } else { - FURI_LOG_E(TAG, "Protocol does not support transmission"); - } - - if(!flipper_format_insert_or_update_uint32(fff_data, "Repeat", &repeat, 1)) { - FURI_LOG_E(TAG, "Unable Repeat"); - break; - } - - sub_preset_loaded = SubRemLoadSubStateOK; - ret = SubRemLoadMapStateNotAllOK; - -#if FURI_DEBUG - FURI_LOG_I(TAG, "%-16s - protocol Loaded", furi_string_get_cstr(sub_preset->label)); -#endif - } while(false); - - // TODO: - // Load file state logic - // Label depending on the state - // Move to remote scene - - if(sub_preset_loaded != SubRemLoadSubStateOK) { - furi_string_set_str(sub_preset->label, "N/A"); - all_loaded = false; - } - - if(ret != SubRemLoadMapStateErrorBrokenFile && all_loaded) { - ret = SubRemLoadMapStateOK; - } - - flipper_format_file_close(fff_data_file); - } - furi_string_free(temp_str); - - return ret; -} - SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { furi_assert(app); furi_assert(file_path); @@ -247,13 +143,13 @@ SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_p FURI_LOG_E(TAG, "Could not open MAP file %s", file_path); ret = SubRemLoadMapStateErrorOpenError; } else { - if(!subrem_map_preset_load(app, fff_data_file)) { + if(!subrem_map_preset_load(app->map_preset, fff_data_file)) { FURI_LOG_E(TAG, "Could no Sub file path in MAP file"); // ret = // error for popup } else if(!flipper_format_file_close(fff_data_file)) { ret = SubRemLoadMapStateErrorOpenError; } else { - ret = subrem_map_preset_check(app, fff_data_file); + ret = subrem_map_preset_check(app->map_preset, app->txrx, fff_data_file); } } @@ -272,9 +168,9 @@ SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_p return ret; } -bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* dev_file_name) { +bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* sub_file_name) { furi_assert(flipper_format); - furi_assert(dev_file_name); + furi_assert(sub_file_name); Storage* storage = furi_record_open(RECORD_STORAGE); Stream* flipper_format_stream = flipper_format_get_raw_stream(flipper_format); @@ -283,19 +179,19 @@ bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* dev uint32_t repeat = 200; FuriString* file_dir = furi_string_alloc(); - path_extract_dirname(dev_file_name, file_dir); + path_extract_dirname(sub_file_name, file_dir); do { // removing additional fields flipper_format_delete_key(flipper_format, "Repeat"); // flipper_format_delete_key(flipper_format, "Manufacture"); - if(!storage_simply_remove(storage, dev_file_name)) { + if(!storage_simply_remove(storage, sub_file_name)) { break; } //ToDo check Write stream_seek(flipper_format_stream, 0, StreamOffsetFromStart); - stream_save_to_file(flipper_format_stream, storage, dev_file_name, FSOM_CREATE_ALWAYS); + stream_save_to_file(flipper_format_stream, storage, sub_file_name, FSOM_CREATE_ALWAYS); if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { FURI_LOG_E(TAG, "Unable Repeat"); @@ -310,10 +206,16 @@ bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* dev return saved; } -bool subrem_tx_start_sub( - SubGhzRemoteApp* app, - SubRemSubFilePreset* sub_preset, - SubGhzProtocolEncoderRAWCallbackEnd callback) { +void subrem_save_active_sub(void* context) { + furi_assert(context); + SubGhzRemoteApp* app = context; + + SubRemSubFilePreset* sub_preset = app->map_preset->subs_preset[app->chusen_sub]; + subrem_save_protocol_to_file( + sub_preset->fff_data, furi_string_get_cstr(sub_preset->file_path)); +} + +bool subrem_tx_start_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset) { furi_assert(app); furi_assert(sub_preset); bool ret = false; @@ -321,88 +223,44 @@ bool subrem_tx_start_sub( subrem_tx_stop_sub(app, true); if(sub_preset->type == SubGhzProtocolTypeUnknown) { - return false; - } + ret = false; + } else { + FURI_LOG_I(TAG, "Send %s", furi_string_get_cstr(sub_preset->label)); - FURI_LOG_I(TAG, "Send %s", furi_string_get_cstr(sub_preset->label)); + subghz_txrx_load_decoder_by_name_protocol( + app->txrx, furi_string_get_cstr(sub_preset->protocaol_name)); - subghz_custom_btn_set(SUBGHZ_CUSTOM_BTN_OK); - keeloq_reset_original_btn(); - subghz_custom_btns_reset(); + subghz_txrx_set_preset( + app->txrx, + furi_string_get_cstr(sub_preset->freq_preset.name), + sub_preset->freq_preset.frequency, + NULL, + 0); - do { - flipper_format_rewind(sub_preset->fff_data); // - - app->transmitter = subghz_transmitter_alloc_init( - app->environment, furi_string_get_cstr(sub_preset->protocaol_name)); - - if(app->transmitter) { - if(subghz_transmitter_deserialize(app->transmitter, sub_preset->fff_data) != - SubGhzProtocolStatusOk) { - FURI_LOG_E(TAG, "Deserialize error!"); - break; - } - furi_hal_subghz_reset(); - furi_hal_subghz_idle(); - furi_hal_subghz_load_custom_preset(sub_preset->freq_preset.data); - furi_hal_gpio_init( - furi_hal_subghz.cc1101_g0_pin, GpioModeInput, GpioPullNo, GpioSpeedLow); - - furi_hal_subghz_idle(); - - furi_hal_subghz_set_frequency_and_path(sub_preset->freq_preset.frequency); - furi_hal_gpio_write(furi_hal_subghz.cc1101_g0_pin, false); - furi_hal_gpio_init( - furi_hal_subghz.cc1101_g0_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - - if(!furi_hal_subghz_tx()) { - FURI_LOG_E(TAG, "Sending not allowed"); - break; - } - - if(sub_preset->type == SubGhzProtocolTypeRAW) { - subghz_protocol_raw_file_encoder_worker_set_callback_end( - (SubGhzProtocolEncoderRAW*)subghz_transmitter_get_protocol_instance( - app->transmitter), - callback, - app); - } - - furi_hal_subghz_start_async_tx(subghz_transmitter_yield, app->transmitter); + subghz_custom_btn_set(SUBGHZ_CUSTOM_BTN_OK); + keeloq_reset_original_btn(); + subghz_custom_btns_reset(); + if(subghz_txrx_tx_start(app->txrx, sub_preset->fff_data) == SubGhzTxRxStartTxStateOk) { ret = true; } - } while(false); + } app->tx_running = ret; return ret; } -static void subghz_tx_stop(SubGhzRemoteApp* app) { - furi_assert(app); - - //Stop TX - furi_hal_subghz_stop_async_tx(); - - subghz_transmitter_stop(app->transmitter); - subghz_transmitter_free(app->transmitter); - furi_hal_subghz_idle(); -} - bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced) { furi_assert(app); SubRemSubFilePreset* sub_preset = app->map_preset->subs_preset[app->chusen_sub]; if(forced || (sub_preset->type != SubGhzProtocolTypeRAW)) { - // SubRemSubKeyTypeRawKey)) { + // XXX drop app->tx_running if(app->tx_running) { - subghz_tx_stop(app); + subghz_txrx_stop(app->txrx); if(sub_preset->type == SubGhzProtocolTypeDynamic) { - subrem_save_protocol_to_file( - sub_preset->fff_data, furi_string_get_cstr(sub_preset->file_path)); - keeloq_reset_mfname(); keeloq_reset_kl_type(); keeloq_reset_original_btn(); diff --git a/applications/main/subghz_remote/subghz_remote_app_i.h b/applications/main/subghz_remote/subghz_remote_app_i.h index 5d34968cd..50e2bae9f 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.h +++ b/applications/main/subghz_remote/subghz_remote_app_i.h @@ -3,6 +3,8 @@ #include "helpers/subrem_types.h" #include "helpers/subrem_presets.h" +#include "../subghz/helpers/subghz_txrx.h" + #include #include "views/remote.h" @@ -31,9 +33,6 @@ #define SUBREM_APP_FOLDER EXT_PATH("subghz_remote") #define SUBREM_MAX_LEN_NAME 64 -typedef struct { - SubRemSubFilePreset* subs_preset[SubRemSubKeyNameMaxCount]; -} SubRemMapPreset; typedef struct { Gui* gui; ViewDispatcher* view_dispatcher; @@ -49,10 +48,7 @@ typedef struct { SubRemMapPreset* map_preset; - SubGhzSetting* setting; - SubGhzEnvironment* environment; - SubGhzReceiver* receiver; - SubGhzTransmitter* transmitter; + SubGhzTxRx* txrx; bool tx_running; @@ -61,9 +57,8 @@ typedef struct { SubRemLoadMapState subrem_load_from_file(SubGhzRemoteApp* app); -bool subrem_tx_start_sub( - SubGhzRemoteApp* app, - SubRemSubFilePreset* sub_preset, - SubGhzProtocolEncoderRAWCallbackEnd callback); +bool subrem_tx_start_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset); -bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced); \ No newline at end of file +bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced); + +void subrem_save_active_sub(void* context); \ No newline at end of file diff --git a/applications/main/subghz_remote/views/remote.c b/applications/main/subghz_remote/views/remote.c index 1f867cd0b..e062f11b1 100644 --- a/applications/main/subghz_remote/views/remote.c +++ b/applications/main/subghz_remote/views/remote.c @@ -41,24 +41,18 @@ void subrem_view_remote_set_callback( subrem_view_remote->context = context; } -void subrem_view_remote_add_data_to_show( - SubRemViewRemote* subrem_view_remote, - const char* up_label, - const char* down_label, - const char* left_label, - const char* right_label, - const char* ok_label) { +void subrem_view_remote_add_data_to_show(SubRemViewRemote* subrem_view_remote, const char** labels) { furi_assert(subrem_view_remote); with_view_model( subrem_view_remote->view, SubRemViewRemoteModel * model, { - strncpy(model->up_label, up_label, SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); - strncpy(model->down_label, down_label, SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); - strncpy(model->left_label, left_label, SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); - strncpy(model->right_label, right_label, SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); - strncpy(model->ok_label, ok_label, SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); + strncpy(model->up_label, labels[0], SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); + strncpy(model->down_label, labels[1], SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); + strncpy(model->left_label, labels[2], SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); + strncpy(model->right_label, labels[3], SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); + strncpy(model->ok_label, labels[4], SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); // furi_string_set(model->up_label, up_label); // furi_string_set(model->down_label, down_label); @@ -69,23 +63,21 @@ void subrem_view_remote_add_data_to_show( true); } -void subrem_view_remote_set_presed_btn(SubRemViewRemote* subrem_view_remote, uint8_t presed_btn) { +void subrem_view_remote_set_state( + SubRemViewRemote* subrem_view_remote, + SubRemViewRemoteState state, + uint8_t presed_btn) { furi_assert(subrem_view_remote); with_view_model( subrem_view_remote->view, SubRemViewRemoteModel * model, - { model->pressed_btn = presed_btn; }, + { + model->state = state; + model->pressed_btn = presed_btn; + }, true); } -void subrem_view_remote_set_state( - SubRemViewRemote* subrem_view_remote, - SubRemViewRemoteState state) { - furi_assert(subrem_view_remote); - with_view_model( - subrem_view_remote->view, SubRemViewRemoteModel * model, { model->state = state; }, true); -} - void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) { canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); diff --git a/applications/main/subghz_remote/views/remote.h b/applications/main/subghz_remote/views/remote.h index 76121cf8a..ea274fca4 100644 --- a/applications/main/subghz_remote/views/remote.h +++ b/applications/main/subghz_remote/views/remote.h @@ -24,15 +24,9 @@ void subrem_view_remote_free(SubRemViewRemote* subrem_view_remote); View* subrem_view_remote_get_view(SubRemViewRemote* subrem_view_remote); -void subrem_view_remote_add_data_to_show( - SubRemViewRemote* subrem_view_remote, - const char* up_label, - const char* down_label, - const char* left_label, - const char* right_label, - const char* ok_label); +void subrem_view_remote_add_data_to_show(SubRemViewRemote* subrem_view_remote, const char** labels); -void subrem_view_remote_set_presed_btn(SubRemViewRemote* subrem_view_remote, uint8_t presed_btn); void subrem_view_remote_set_state( SubRemViewRemote* subrem_view_remote, - SubRemViewRemoteState state); \ No newline at end of file + SubRemViewRemoteState state, + uint8_t presed_btn); \ No newline at end of file From 46832ff77f2f67a3b4f1a724dc768ade80d20ca6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 22 May 2023 02:33:43 +0300 Subject: [PATCH 17/23] gps uart stability fix --- applications/external/gps_nmea_uart/gps_uart.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/applications/external/gps_nmea_uart/gps_uart.c b/applications/external/gps_nmea_uart/gps_uart.c index 4e66aa284..ada8f04f9 100644 --- a/applications/external/gps_nmea_uart/gps_uart.c +++ b/applications/external/gps_nmea_uart/gps_uart.c @@ -74,11 +74,8 @@ static void gps_uart_parse_nmea(GpsUart* gps_uart, char* line) { static int32_t gps_uart_worker(void* context) { GpsUart* gps_uart = (GpsUart*)context; - gps_uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE * 5, 1); size_t rx_offset = 0; - gps_uart_serial_init(gps_uart); - while(1) { uint32_t events = furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever); @@ -148,6 +145,8 @@ void gps_uart_init_thread(GpsUart* gps_uart) { gps_uart->status.time_minutes = 0; gps_uart->status.time_seconds = 0; + gps_uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE * 5, 1); + gps_uart->thread = furi_thread_alloc(); furi_thread_set_name(gps_uart->thread, "GpsUartWorker"); furi_thread_set_stack_size(gps_uart->thread, 1024); @@ -155,6 +154,8 @@ void gps_uart_init_thread(GpsUart* gps_uart) { furi_thread_set_callback(gps_uart->thread, gps_uart_worker); furi_thread_start(gps_uart->thread); + + gps_uart_serial_init(gps_uart); } void gps_uart_deinit_thread(GpsUart* gps_uart) { From ace9e03fe72c921463e94b5570e5fd0753780694 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 22 May 2023 02:54:04 +0300 Subject: [PATCH 18/23] API: Cleanup, mini refactoring of some apps +6k of free flash space --- .../external/esp8266_deauth/esp8266_deauth.c | 18 +- .../external/tetris_game/tetris_game.c | 7 +- .../external/wifi_scanner/wifi_scanner.c | 332 ++++++++++++++---- firmware/targets/f7/api_symbols.csv | 34 +- 4 files changed, 292 insertions(+), 99 deletions(-) diff --git a/applications/external/esp8266_deauth/esp8266_deauth.c b/applications/external/esp8266_deauth/esp8266_deauth.c index fc165b932..07b7886c8 100644 --- a/applications/external/esp8266_deauth/esp8266_deauth.c +++ b/applications/external/esp8266_deauth/esp8266_deauth.c @@ -154,10 +154,8 @@ static void esp8266_deauth_module_render_callback(Canvas* const canvas, void* ct const char* strInitializing = "Something wrong"; canvas_draw_str( canvas, - (u8g2_GetDisplayWidth(&canvas->fb) / 2) - - (canvas_string_width(canvas, strInitializing) / 2), - (u8g2_GetDisplayHeight(&canvas->fb) / - 2) /* - (u8g2_GetMaxCharHeight(&canvas->fb) / 2)*/, + (128 / 2) - (canvas_string_width(canvas, strInitializing) / 2), + (64 / 2) /* - (canvas_current_font_height(canvas) / 2)*/, strInitializing); } break; case WaitingForModule: @@ -170,10 +168,8 @@ static void esp8266_deauth_module_render_callback(Canvas* const canvas, void* ct const char* strInitializing = "Attach WiFi Deauther module"; canvas_draw_str( canvas, - (u8g2_GetDisplayWidth(&canvas->fb) / 2) - - (canvas_string_width(canvas, strInitializing) / 2), - (u8g2_GetDisplayHeight(&canvas->fb) / - 2) /* - (u8g2_GetMaxCharHeight(&canvas->fb) / 2)*/, + (128 / 2) - (canvas_string_width(canvas, strInitializing) / 2), + (64 / 2) /* - (canvas_current_font_height(canvas) / 2)*/, strInitializing); } #endif @@ -188,10 +184,8 @@ static void esp8266_deauth_module_render_callback(Canvas* const canvas, void* ct const char* strInitializing = "Initializing..."; canvas_draw_str( canvas, - (u8g2_GetDisplayWidth(&canvas->fb) / 2) - - (canvas_string_width(canvas, strInitializing) / 2), - (u8g2_GetDisplayHeight(&canvas->fb) / 2) - - (u8g2_GetMaxCharHeight(&canvas->fb) / 2), + (128 / 2) - (canvas_string_width(canvas, strInitializing) / 2), + (64 / 2) - (canvas_current_font_height(canvas) / 2), strInitializing); } } diff --git a/applications/external/tetris_game/tetris_game.c b/applications/external/tetris_game/tetris_game.c index a569f46d4..5752e1fc3 100644 --- a/applications/external/tetris_game/tetris_game.c +++ b/applications/external/tetris_game/tetris_game.c @@ -367,11 +367,8 @@ int32_t tetris_game_app() { // Not doing this eventually causes issues with TimerSvc due to not sleeping/yielding enough in this task TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME); - TaskHandle_t curr_task = xTaskGetHandle("Tetris Game"); - uint32_t origTimerPrio = uxTaskPriorityGet(timer_task); - uint32_t myPrio = uxTaskPriorityGet(curr_task); - vTaskPrioritySet(timer_task, myPrio + 1); + vTaskPrioritySet(timer_task, configMAX_PRIORITIES - 1); ViewPort* view_port = view_port_alloc(); view_port_set_orientation(view_port, ViewPortOrientationVertical); @@ -475,7 +472,7 @@ int32_t tetris_game_app() { view_port_free(view_port); furi_message_queue_free(event_queue); furi_mutex_free(tetris_state->mutex); - vTaskPrioritySet(timer_task, origTimerPrio); + vTaskPrioritySet(timer_task, configTIMER_TASK_PRIORITY); free(newPiece); free(tetris_state); diff --git a/applications/external/wifi_scanner/wifi_scanner.c b/applications/external/wifi_scanner/wifi_scanner.c index 341287b54..9dabc6a90 100644 --- a/applications/external/wifi_scanner/wifi_scanner.c +++ b/applications/external/wifi_scanner/wifi_scanner.c @@ -104,6 +104,238 @@ typedef struct SWiFiScannerApp { uint8_t m_animtaionCounter; } SWiFiScannerApp; +/* + Fontname: -FreeType-Inconsolata LGC-Bold-R-Normal--36-360-72-72-P-176-ISO10646-1 + Copyright: Original Roman version created by Raph Levien using his own tools and FontForge. Copyright 2006 Raph Levien. Hellenisation of the Roman font, by Dimosthenis Kaponis, using FontForge. Hellenic glyphs Copyright 2010-2012 Dimosthenis Kaponis. Released under the SIL Open Font License, http://scripts.sil.org/OFL. Cyrillic glyphs added by MihailJP, using FontForge. Cyrillic glyphs Copyright 2012 MihailJP. Released under the SIL Open Font License, http://scripts.sil.org/OFL. Emboldened by MihailJP. Some glyphs modified by Greg Omelaenko, using FontForge. + Glyphs: 95/658 + BBX Build Mode: 2 +*/ +const uint8_t u8g2_font_inb27_mr[4414] = + "_\2\5\4\5\6\1\4\6\26%\0\370\33\371\35\371\5e\13\313\21! \13\266\14\366\207\377\377\377" + "\20\0!\30\266\14\366\7`\310\22\353E\42\351\177r|(\220h\240-\222\17\37\42%\266\14v\37" + "d,\62\310\42\203,\62\310\42\203,\62\310\42\203,\62\310\42\203,\62\310\42\203|\370\377\307\1#" + "M\266\14\366\7u\220\261\310 \213\14\262\310 \213\14\262\310 k\20b\36 \343\1\62\36 \3;" + "d\220E\6Yd\220\65\10Y\203\220\365\306\3c<@\306\3\344\220A\26\31d\221A\326 d\15" + "\62\330 \203\15\62\26!\343\303\63\0$A\266\14\366\7\200H\352\251\325\320;$\220P\14\21d\210" + "C\4\31\1\21AX\11\244e.\271\325\64F\202YD\224E\6Yd\20\23\10\31\244\214AD!" + "&\220P\314Cm\251G$\365\341\42\0%I\266\14\366\7\261\34RN!%\21B\226 \205\14\42" + "H!\203\4b\310H\346!\227N \253\204\22I,\221\222d\10F\302Q\15\221\220N\32\304\220@" + "\6)%\220A\12\21d\20R\304\42\204$R\312)\344\224\17/\3&F\266\14\366\7\264\274\304\326" + "b\251\214\222H!\211\24\222H!\212\14\262\310 \214\4\322\220;\16\65E\302!\202\220A\250A\221" + "\22\310 &\15r\16!\250\224bL)\5\225\7Fa\241\224\64\310\61F|x\30\0'\17\266\14" + "\366\7aH\372\357\303\377\177\1\0((\266\14v\14sD\363\216\63\317@\22\13,\221\304\22\211$" + "\261D\42\351\223ER\262\304\42K,\262\212v\261L\241\1)$\266\14\266\26\263D\233\254\305\42K" + ",\222\310\42\351_$\222\304\22I,\260\304\2\313\263\301\22\307\7\7\0*/\266\14\366\207\207\210\244" + "\261PH\11\205\14\62F\61a\10C\36\30\306\261\2\317C\215\10\262\310(\251\20\202\212!h\234\261" + "\2\12\37\376,\0+\33\266\14\366\207\207\210\244\267\36\30\344\201A\36\30\344\201\261\210\244\337\207\277\14" + "\0,\30\266\14\366\207\377\377\300\220%\32hI\42\307\34rH\42\7\15\15\0-\26\266\14\366\207\177" + "\352\201`\36\10\346\201`\36\10\37\376\277\4\0.\21\266\14\366\207\377\377\0\211\6\332\42\371p\22\0" + "/.\266\14\366\33\223\304\22I,\221H\22\211$\221H\22\211$\221H\22K$\261D\22K$\261" + "D\42I$\222D\42\211\34\65|x\17\0\60I\266\14\366\7\266<\324\324b\251\220\202\210!\247\230" + "b\310)\206\30SJA\204\24\22\10!e\10B\10\31\203\20\62(B\306 \224\30\205\20\22\206!" + "\4\31R\214)\245\34b\312!\247\224r\12)\211-\325\20,\37^\7\61\26\266\14\366\7\226@\363" + "NKL\265!\210\244\377\377\367\341y\0\62'\266\14\366\7\325\70\265Xr\247\24s\306)($\42" + "i\261D\22\13\254\277H\311g\36\10\346\201`\36\10\37\36\6\63-\266\14\366\7\324\70\265Xri" + "\230\222\2\42\222\26\313\63,\265\363RS\261\310\42i) \202\304)\207\224r\36jj\265\363\341y" + "\0\64\65\266\14\366\7\232H\22\13\264\336q\310\215@\32\11\204\21A\330\30d\221A\24!$\221B" + "\22)\4\21C\316\3\203<\60\310\3\203<\60\36\221\364}x\32\0\65*\266\14\366\7\361\235\337!" + "\222N\20\306TK\16\25b\316\70%\5T$\275#P)\4\21cJ\61\17\265\245\234\371\360:\0" + "\66>\266\14\366\7\327\70\265Xj\250\224\221\310\11\211H\22K$\243(\22\22z\347\201`L)\246" + "\234R\10*\205$RH\42\205$R\12\42\206\234b\212!\250\220\202\232b+=\363\341q\0\67-" + "\266\14\366\7\360\201`\36\10\346\201`\236$\261D\22K$\222\304\22I,\221H\22K$\222\304\22" + "I\254\42\211U$\261|\370\4\0\70;\266\14\366\7\325\70\265Xj\250\224r\212!\207\356\24C\20" + ")$\225Q\324b\251)U\204I\244\224C\31\202J!\211\24\222H!\211\224r\212)\245\234\207\232" + "Z\355|x\35\0\71\71\266\14\366\7\265\274\304\326b\251\220\202\210!\247\230b\10\42\206 b\10\42" + "\206 b\312\241L\71\205\30\344\251\23\10\33\203H\42\207$*\34\222D)\251%\266\322+\37>:" + "\27\266\14\366\207\77A\242\201\266H>|\210D\3m\221|\70\11\0;\34\266\14\366\207\77A\242\201" + "\266H>|\210D\3\255X$\221C\222HM\361\1\1< \266\14\366\207\271\60G,\357\264\304\360" + "\265\363J<\20\301\23/\210\301\3\215$T|\370\25\0= \266\14\366\207\317=\60\310\3\203<\60" + "\310\3\343\303\352\3\203<\60\310\3\203<\60>\374g\1>\36\266\14\366\207\266\240D\32\210\37<\261" + "\274\323\20\303\332\325P;\257\304\61\305\207\277\6\0\77%\266\14\266\67N\251\206\236\61\245\34r\312\21" + "\211H*\226Hb\201u\221H\352C\226D\3m\221|x\36\0@G\266\14\366\7\266\274\264\32r" + "\247\230b\10\42\205(B\306Ad\24\65\6ac\20\66\306(\204\214\61H!c\14R\310\30\203\24" + "\62\306\250\306\30m\220\301\310 \213\20R\2!d\222YNH.\265\245\234\371\360\70\0A<\266\14" + "\366\7\67PA\307\34\262\304\2\15<\357\70\22H#\201\264!\10#\203,\62\310\32e(RHj" + "\311\235\357\220S\12I\244\220T\6Yd\220E\6Y%\220F><\13\0BD\266\14\366\7\217)" + "\207\36\10\346\201`\310\61\205\240RH\42\205$RH\42\205\240R\310)\346\201`\336\371@\60\4\225" + "BR!D\21B\24!D\21B\24!$\25B\220!\17\210\362@\60\357\264\17\217\3C/\266\14" + "\366\7\327\264\245\32z\306\24S\312)\244$B\210\22\206\304\22\211\244'K,\222\310\22\213\12\247\240" + "a\214)\346\241\246V\63\37\36\7DC\266\14\366\7o\255\226\336y\207\30c\10*\205\240RH\42" + "\205\244B\210\42\204(B\210\42\204(B\210\42\204(B\210\42\204(B\210\42\204\244BH\42\205\240" + "R\10\42\206\30c\336q\250\245\365\341y\0E'\266\14\366\7\357\1Q\36\20\345\1Q\36\20\205H" + "\372\344;\277C$\375\344\3\242< \312\3\242< ><\14\0F\35\266\14\366\7\360\201`\36\10" + "\346\201`\36\10\206H\372\244C>D$\375\357\303W\0G:\266\14\366\7\326\70\245\32z\306\24S" + "\312)\244$a\210$\261D\42i&\15b\322 &\15b\322(\212\20\242\10!\212\220\222H)\210" + "\24c\212y \34\227\30;\37\36\7HM\266\14\366\7\217$RH\42\205$RH\42\205$RH" + "\42\205$RH\42\205$RH\42\205$R\36\20\345\1Q\36\20\345\1QH\42\205$RH\42\205" + "$RH\42\205$RH\42\205$RH\42\205$RH\42\205$\362\341a\0I\24\266\14\366\7\320" + "!_#\222\376\377k\357\374>\274\14\0J\33\266\14\366\7\264\245\236#\222\376\377\222\60%\215BR" + "S\213\245W>|\1\0KI\266\14\366\7\257\244\62H*\204\240R\310)\206\230rH)\210\24\222" + "\10!\212\14\262\210(\213\204\302RKM\261\22\312\42\203,\62\212\42\244$RH\42\245 b\312!" + "\247\30r\212!\250\24\222\12!\251\20\242\312\207g\1L\32\266\14\366\7\260D\42\351\377\377\311\7D" + "y@\224\7Dy@|x\27\0MU\266\14\366\7\217,\62\310\42\243\244\62J*\303\34\63\314\61" + "\343\224\63N\71\3\33$\214\61\2\31$\320\6\21#\14A\6\21#\14A\6\31eP\243\14\32!" + "\203\220A\310 \213\14\262\310 \213\14\262\310 \213\14\262\310 \213\14\262\310 \213\14\262\310\207g\1" + "NS\266\14\366\7\217(BJ\42\244$B\14\42\304 B\316!\344\34B\220!\204\4R\10!\201" + "\24B\210 \204\22\204P\203\42dP\204\22\204P\202\20RH \204\230\21\10!\6\21r\16!\347" + "\20\202\14!\310\20\222\12!\251\20\242\10!\212|x\27\0OC\266\14\366\7\325\70\265Xr\247\224" + "r\310)\245 RH*\204(\62\212\42\203,\62\310\42\203,\62\310\42\203,\62\310\42\203,\62\212" + "\42\204(BH*\244 b\310)\246\224\202\134bK\71\363\341u\0P\60\266\14\366\7\257\245w\36" + "\10\346\1Q\10*\205\244B\210\42\204(B\210\42\204(BH*\204\240R\36\20\345\201`\34b\212" + "H\372\357\303g\0QJ\266\14\366\7\325\70\265Xr\247\224r\310)\245 RH*\204\244\62\212\42" + "\203,\62\310\42\203,\62\310\42\203,\62\310\42\203,\62\212\42\204\244BH*\244 b\310)\246\224" + "\202\134b+\271\23\211$R\265\344\20\64\37@\0RC\266\14\366\7\217)\207\336y \30rL!" + "\250\24\222H!\211\24\222H!\211\24\202J!\247\230\7\202y\307!\246H!\211\24\222H)\210\30" + "\202\210)\207v\212!\210\30\202J!\211\24\222\312\207w\1S\61\266\14\366\7\365\264\245\32z\207\230" + "\12\211C\222\70DV\321D\364\262\207\242\221ER&,b\302\42e\244B\214)\345\1a^b\354" + "|x\35\0T\27\266\14\366\7\356\1\62\36 \343\1\62\36 \212H\372\377\377>|UH\266\14\366" + "\7\257$B\210\42\204(B\210\42\204(B\210\42\204(B\210\42\204(B\210\42\204(B\210\42\204" + "(B\210\42\204(B\210\42\204(B\210\42\204(B\210\42\244\240B\12*\245\230b\36rJ\71\363" + "\341u\0V>\266\14\366\7\216\60\42\10#\203(B\210\42\204(R\10\42\206 b\10\42\207\30\202" + "\210!\210\30\222H\31\212\20\242\10!\213\214\301\210 \214\10\322H\30\16{\6Z\221H\42\7\25\37" + ">W\134\266\14\366\7n\22\303\15A\212(D\220\62\10\21\244\14B\4!\204\214A\10!\23)c" + "\20\62\312\30\204\10\63\6!\302\10B\210\70\201\20\42N\30f\204!F\30\346\210\21\206\71\342\230#" + "\216\61\304\30C\12*\244\240B\12\42\206 b\10\42\206\240q\206\22H(\201\304\207\247\1XB\266" + "\14\366\7\217(BH\42\206 b\212!\210\224\202\12!\212\214\242\212 \214\204\302\222;\320\300\22K" + "\64\357<\324\24#\202,\62\212\42\204$R\12\42\206\34rJ)\210\24\222\312(\252|x\26\0Y" + "\60\266\14\366\7\216\254\42\212\42\204\244B\12\42\206 b\212!\210\30\202\12!\212\20\242\212 \214\10" + "\322H\30\16\275\363L,\221H\372\357\303\363\0Z\63\266\14\366\7\360\1Q\36\20\345\1Q\36\10\222" + "D\22K\244b\211$\226H\305\22I,\260D\22\13,\261\300\22\37\20\344\201A\36\30\344\201\361\341" + "]\0[\23\266\14\366n\251\227\210\244\377\377\77\331R\357C\10\0\134+\266\14\66\21\262H\42\213$" + "\262H\42\213$\262Hj\22I&\221d\22Id\221D\26Id\221D\26IM\42\311\14\37\36\1" + "]\20\266\14vn\251'\351\377\377_\352\373\220\2^!\266\14\366\7WL\42I\64\357<\324\210 " + "\213\14\262\10!\211\24\222\210!I\34\361\341\377\17\2_\26\266\14\366\207\377\377\247\36 \343\1\62\36" + " \343\1\362!\3\0`\33\266\14\266\11UPA\307$\222\310\22\213,\261\310\42\251\71Q\361\341\377" + "g\0a\60\266\14\366\207\217\236\266\222C.\15S$\325Rj\347\231\7\202)\207\224\202H!\211\24" + "\202J)\345\230\7\202y \34\25H\62\203|x\30\0b;\266\14\66.\221H\372\215\242HH\350" + "\235\7\202\61\305\224rJ!\251\20\222\12!\212\20\242\10!\212\20\242\10!\212\20\222\12)\210\24c" + "Jy \230w\206Hh\220\362\341u\0c(\266\14\366\207\257\32\247\224;\17\4S\225\202\206!I" + "\230\22\211\244\311\42\211,H\240b\310y \34\247\224\63\37\36\7d;\266\14\366\7\207H\372\251\62" + "\10J\201\234g\36\10\245\30S\10*\244\240BH*\204(B\210\42\204(B\210\42\244\240B\12*" + "\245\234R,\363@\70\17\245@T\31\344\303\273\0e,\266\14\366\207\217\236\266TC\317T\206 b" + "H\42\344\201A\36\30\344\201A\36\30\204H\42\253\24\216\61\344<\344\322r\346\303\343\0f\35\266\14" + "\366\7\302\70\265Xj\250\230\201\312\11\211H\312\71\344cD\322\377\367\341\23\0g=\266\14\366\207o" + "\26R\314\3\241< \10!j\224R\16}\247\224r\314(\251\251\265\324\42a\64\42[z \234\7" + "\202y@\20\222\312 \213\14\262\310(\251\214\7Fy \34\267\220\7h<\266\14v.\221H\372\215" + "\242\210@\210\4u\336\71\244\30c\210)\207\30\202\210!\210\30\202\210!\210\30\202\210!\210\30\202\210" + "!\210\30\202\210!\210\30\202\210!\210\30\202\310\207\207\1i\30\266\14\366\7`\310\22+\71>$S" + "\313I\372\277\326R\357\303\323\0j\37\266\14\366\7d\310\22+\71>\364\230\342I\372\377\227\204)\210" + "\220\202\134bK\71\363A\0k\71\266\14v.\221H\372\241R\310)\206\230rH)\210\220\222\310(" + "\212\210\262H(Lck\25Q\24!%\221R\20)\5\21S\16\71\305\20T\12A\206\220d>\274" + "\12\0l\21\266\14vVL'\351\377\377\330;\277\17/\3m@\266\14\366\207\257\221PF!+\234" + "\361\0\31\17\24QF\21\325 \204\10B(A\10%\10\241\4!\224 \204\22\204P\202\20J\20B" + "\11B(A\10%\10\241\4!\224 \204\22\204P\37\236\5n:\266\14\366\207\357\221Q\24\21\10\275" + "\363\316!\305\224CL\71\304\20D\14A\304\20D\14A\304\20D\14A\304\20D\14A\304\20D\14" + "A\304\20D\14A\304\20D><\14\0o\62\266\14\366\207\257\32\247TC\357\224bJ\71\245\220T" + "FIe\220E\6Yd\220E\6Yd\24E\10I\244\224SL)\306<\324\324r\346\303\343\0p" + "=\266\14\366\207\317\221Q\24\11\11=\20\314\3\301\230bJ\71\245\220T\10I\205\20E\10Q\204\20" + "E\10Q\204\20E\10I\205\24D\212\61\245<\20\314;$$DFQD\322\367\301\1q\71\266\14" + "\366\207\217\32AP\12\344<\363@(\305\230BP!\5\25B\24!D\21B\24!D\21B\24!" + "%\221BP)\345\224b\231\7\302y(\5\242\312 \222~\30\0r\37\266\14\366\207\17\22R\22\21" + "\351<\20\314\3\301\34#\216\71\342\224X\42\221\364\277\17\37\1s,\266\14\366\207\217\232\306\222C\317" + "\24C\16A\343\24\24R\211\351)\227\340\221\305\10E\214P\244\224S\312\3\341\270\304\332\371\360:\0" + "t\35\266\14\366\207\234\220\364\332;\277E$\375\223\305\4U\212XL\261\245\232\371\360\66\0u;\266" + "\14\366\207\317\221D\12I\244\220D\12I\244\220D\12I\244\220D\12I\244\220D\12I\244\220D\12" + "I\244\220DJ\71\245\224SL)\306<\20\316C)\20U\6\371\360\60\0v\63\266\14\366\207\257\25" + "E\10Q\204\20E\12I\303\20DL\71\3\21C\20\61$\221\62\24!D\21\62\30\21\204\21A\32" + "\11\303!w\240\201E\22\71>|wH\266\14\366\207\217Q\202\60\42H\31\204\214Q\6!c\224A" + "\310 \243\14j\224A\215\62F\31\303\210Q\206\30a\210QH\230\304($Lb\24\22\204@\306\14" + "s\314\60\307\14sJ)\247\224\202H!\211\24\362\341i\0x\63\266\14\366\207\317\221DJ\71\305\24" + "C\20)D\221QT\21\204%\207\334\201%\232w\36j$\224U\4Q\205\220DJ\71\305\224R\20" + ")$\225\17\357\2y<\266\14\366\207\317\225T\10I\244\220DJA\304\220CC\304\20D\12I\205" + "\20E\310Xd\20F\4aD\14\67\2q\347\35h`\221T$,\24\262\4!L-\325\320+\37" + "\24\0z&\266\14\366\207\357=\20\314\3\301<\20\314\213$\26X\213$\26X\27\13|@\220\7\6" + "y`\220\7\306\207w\1{$\266\14\366\7\342\264\304\324Z\253\300\22\211\244_$\357<\3\15<\262" + "H\372'K,r\255\305\224C\32\0|\16\266\14\366\7\200H\372\377\377\377\357\3}#\266\14\266\66" + "\20\271\324\224,\222\376d\221d\36h\336q\310\221H$\375\213e)\246Xj\347\3\1\0~\31\266" + "\14\366\207/\232\23\214\42d<\60\306\3\303\210\202`\371\360\377\303\0\0\0\0\4\377\377\0"; + +/* + Fontname: open_iconic_arrow_2x + Copyright: https://github.com/iconic/open-iconic, SIL OPEN FONT LICENSE + Glyphs: 28/28 + BBX Build Mode: 0 +*/ +const uint8_t u8g2_font_open_iconic_arrow_2x_t[644] = + "\34\0\4\4\5\5\4\4\6\20\20\0\0\16\0\16\0\0\17\0\0\2g@\17\352i\302$P\376\221" + "\12\64\246\310\11\2A\22O%\303\24Z\360X\242\17^\20\36-<(\0B\22O!\303\32\134\364" + "`\22\17\236\222\35,:\20\0C\17\352)\302$\216\224\31\24\212\4\312\77\2D\37\20\42\302eP" + "\25!\62\205\212\24*a\210#\304E\17\222 F\244P\231\42\245\24\232\2E \20\42\302ePU" + "\11\63E\216\220\71Ah-a\302e\15\241 s\244\310\231\22\246\24\232\2F\37\20\42\302eP\225" + "\211\62G\212\234!\201\310laj\27\221\70C\344H\31\23\245\24\232\2G\37\20\42\302ePU\221" + "\62\205\212\20#A\360haD\34\231(T\244P\31B\244\24\232\2H\21\12.\302C\214\376\215\212" + "$\207\212\15\14\4\0I\23P\341\302\25\134\364`\27\17\36\204xBz\270P\0J\23P\341\302*" + "|\64\221\27\17\36\204px \0U\23\20\42" + "\302\360\201x\230\212&k\22\235J\302\364\14\0V\34\320\241\302\34\36\200\30\27/\204\12\21\32\36\302" + "\240B\204\212x\341F<\200\300\0W\32\220\241\302&\230\354hq\202\304\221\21\306L\14\71A\342D" + "\217%,\14\0X\37\20\42\302\302\210\221@A\2\205K$\314\210\70\42\344\204\30\23$\134BA\2" + "\5q\2\0Y$\17\42\302\34\134\304\270TF\306\214\20\64bH\260\262\203\211\226\34\42$\320\230\21" + "\42H\245+,:\10\0Z\30\220!\303\32\36\200\360\321\4S\61\351\206\324 q\202\4\206\12\17\0" + "[\34\320\241\302`\324X\30q&D-J!&\211\230`a\204\313P\220@A\34\1\0\0\0\4" + "\377\377\0"; + +/* + Fontname: -Adobe-Courier-Bold-R-Normal--11-80-100-100-M-60-ISO10646-1 + Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. + Glyphs: 18/873 + BBX Build Mode: 0 +*/ +const uint8_t u8g2_font_courB08_tn[199] = + "\22\0\3\3\3\4\2\3\4\6\11\0\376\6\376\7\377\0\0\0\0\0\252 \5\0\353\0*\11$\357" + "\212P$\241\0+\12-\353\12\206J\301\20\0,\7\233\345\221$\1-\5\15\357(.\5\212\351\20" + "/\14\304\347K\212\205b\241X\14\0\60\12=\351\231Hx\221L\0\61\10>\351\22\21u\62\62\11" + "=\351\231\250\211\264\34\63\14=\351\231\250I\206\24\311\4\0\64\14>\351\223\215\42ZlB\11\0\65" + "\12=\351\270Q\324F\26\0\66\14=\351\231Hh\24\11E\62\1\67\13=\351\270\310D\62\221L\4" + "\70\15=\351\231H(\222\211\204\42\231\0\71\14=\351\231H(\22\32E\62\1:\6\242\351\20\12\0" + "\0\0\4\377\377\0"; + +/* + Fontname: -Misc-Fixed-Bold-R-Normal--13-120-75-75-C-70-ISO10646-1 + Copyright: Public domain font. Share and enjoy. + Glyphs: 95/1003 + BBX Build Mode: 0 +*/ +const uint8_t u8g2_font_7x13B_tr[1083] = + "_\0\3\3\3\4\3\5\4\6\15\0\376\11\376\11\0\1}\2\330\4\36 \5\0\356\7!\7J\303" + "\307\241D\42\10\235\332\207\204E\0#\20\315\302OR$r\230\244\34&I\221\10\0$\17N\302\227" + "\214\22\321F\223\250Dh\42\0%\17N\302\307H\22\251\4e\212\221JD\64&\17N\302\317H\242" + "\247\221$\62\251\210&\1'\7\42\327\307!\0(\14\314\302\227D$\21\251\211d\2)\15\314\302\207" + "L$\23\251\210$\42\0*\15\66\306O(&:\224d\241\10\0+\13\66\306\227Pt(\11E\0" + ",\10\244\276\317\212\22\0-\6\16\316\207\1.\10\234\276\217\204\42\1/\14N\302\247\232P\246(\23" + "\12\1\60\16N\302\227,\24\21\361$\11\305D\0\61\13N\302\227l\24\21\352\311\0\62\16N\302\17" + "ED\22\212F\62\241\320\0\63\15N\302\207Q\246F\25\222$\24\0\64\15N\302\247lD\221\220H" + "\207\240\2\65\16N\302\307!(\254\210\204B\222\204\2\66\16N\302\17ED\24VDL\22\12\0\67" + "\15N\302\207QM(\23\312\204\62\0\70\16N\302\17E\304$\241\210\230$\24\0\71\16N\302\17E" + "\304$)\12I\22\12\0:\14\304\276\217\204\42\207I(\22\0;\13\304\276\217\204\42\236L\224\0<" + "\10N\302\247LW\35=\7&\312\207\35j>\11N\302\207T\67\35\1\77\16N\302\17ED\22\212" + "fr\230P\4@\17N\302\17%\266R\211L\252\61\11\5\0A\13N\302\17E\304t\30q\22B" + "\14N\302GE\304t\21\61]\0C\13N\302\17ED\324\223\204\2D\12N\302GE\304O\27\0" + "E\13N\302\307!\250X\21*\32F\13N\302\307!\250X\21j\4G\14N\302\17EDT)\61" + "I\12H\13N\302\207\210\323a\304I\0I\11N\302\207I\250O\6J\12N\302\247>\222$\24\0" + "K\17N\302\207lD\221\220f$\211\22-\0L\10N\302\207P\77\32M\13N\302Gpt\70\210" + "x\22N\15N\302\207\210T\251\34&M$\1O\13N\302\17E\304O\22\12\0P\13N\302GE" + "\304t\21j\4Q\14V\276\17E\304S\205\62\241\12R\15N\302GE\304t!I\224h\1S\16" + "N\302\17ED\224R\205$\11\5\0T\11N\302\207I\250\237\0U\12N\302\207\210\77I(\0V" + "\15N\302\207\210I\22\312D\23*\1W\13N\302\207\210\247\303A\64\14X\17N\302Gp$\11\205" + "h\62R\212h\30Y\14N\302\207\210$!\321\204:\1Z\12N\302\207QMG\241\1[\10\314\302" + "\207I\237\10\134\14N\302\207P*\224*J\205\2]\10\314\302\7I\237\14^\11&\326\227\214\42\32" + "\6_\7\26\276\307\241\0`\7\234\336\207L\1a\12\66\302\17Ur\42I\12b\13N\302\207P\261" + "\42\342t\1c\13\66\302\17EDT\222P\0d\12N\302\247\226\23'I\1e\14\66\302\17Et" + "\30\212$\24\0f\14N\302\327H\242(\243\11\265\1g\16F\272\317\22IB\221RD\22\12\0h" + "\13N\302\207P\261\42\342I\0i\12N\302\227P\16\32\352dj\14^\272\247:L\250#IB\1" + "k\15N\302\207P\23EB\42I\224\4l\10N\302\317P\77\31m\12\66\302\207Dr\70\61\11n" + "\11\66\302GE\304\223\0o\12\66\302\17E\304IB\1p\13F\272GE\304t\21*\2q\12F" + "\272\317\211IR\324\0r\11\66\302GED\324\10s\15\66\302\17E$\21KD\22\12\0t\14F" + "\302\217PV\22j\21M\0u\11\66\302\207\210'I\1v\13\66\302\207\210IB\242\211\0w\13\66" + "\302\207\210\351p\11E\0x\14\66\302\207\210$!QD$\1y\14F\272\207\210\223\244H\222P\0" + "z\12\66\302\207Q&\222\11\15{\14\314\302OI&\221ID\262\1|\7J\303\307\3\1}\15\314" + "\302\307L$\221Id\242\12\0~\11\36\332\217\350\20\222\0\0\0\0\4\377\377\0"; + /////// INIT STATE /////// static void wifi_scanner_app_init(SWiFiScannerApp* const app) { app->m_context = Undefined; @@ -153,8 +385,8 @@ int16_t dBmtoPercentage(int16_t dBm) { void DrawSignalStrengthBar(Canvas* canvas, int rssi, int x, int y, int width, int height) { int16_t percents = dBmtoPercentage(rssi); - u8g2_DrawHLine(&canvas->fb, x, y, width); - u8g2_DrawHLine(&canvas->fb, x, y + height, width); + //u8g2_DrawHLine(&canvas->fb, x, y, width); + //u8g2_DrawHLine(&canvas->fb, x, y + height, width); if(rssi != NA && height > 0) { uint8_t barHeight = floor((height / 100.f) * percents); @@ -177,10 +409,8 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { const char* strError = "Something wrong"; canvas_draw_str( canvas, - (u8g2_GetDisplayWidth(&canvas->fb) / 2) - - (canvas_string_width(canvas, strError) / 2), - (u8g2_GetDisplayHeight(&canvas->fb) / - 2) /* - (u8g2_GetMaxCharHeight(&canvas->fb) / 2)*/, + (128 / 2) - (canvas_string_width(canvas, strError) / 2), + (64 / 2) /* - (canvas_current_font_height(canvas) / 2)*/, strError); } break; case WaitingForModule: @@ -192,10 +422,8 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { const char* strConnectModule = "Attach WiFi scanner module"; canvas_draw_str( canvas, - (u8g2_GetDisplayWidth(&canvas->fb) / 2) - - (canvas_string_width(canvas, strConnectModule) / 2), - (u8g2_GetDisplayHeight(&canvas->fb) / - 2) /* - (u8g2_GetMaxCharHeight(&canvas->fb) / 2)*/, + (128 / 2) - (canvas_string_width(canvas, strConnectModule) / 2), + (64 / 2) /* - (canvas_current_font_height(canvas) / 2)*/, strConnectModule); } #endif @@ -208,26 +436,19 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { const char* strInitializing = "Initializing..."; canvas_draw_str( canvas, - (u8g2_GetDisplayWidth(&canvas->fb) / 2) - - (canvas_string_width(canvas, strInitializing) / 2), - (u8g2_GetDisplayHeight(&canvas->fb) / 2) - - (u8g2_GetMaxCharHeight(&canvas->fb) / 2), + (128 / 2) - (canvas_string_width(canvas, strInitializing) / 2), + (64 / 2) - (canvas_current_font_height(canvas) / 2), strInitializing); } } break; case ScanMode: { uint8_t offsetY = 0; uint8_t offsetX = 0; - canvas_draw_frame( - canvas, - 0, - 0, - u8g2_GetDisplayWidth(&canvas->fb), - u8g2_GetDisplayHeight(&canvas->fb)); + canvas_draw_frame(canvas, 0, 0, 128, 64); //canvas_set_font(canvas, FontPrimary); - u8g2_SetFont(&canvas->fb, u8g2_font_7x13B_tr); - uint8_t fontHeight = u8g2_GetMaxCharHeight(&canvas->fb); + canvas_set_custom_u8g2_font(canvas, u8g2_font_7x13B_tr); + uint8_t fontHeight = canvas_current_font_height(canvas); offsetX += 5; offsetY += fontHeight; @@ -248,8 +469,8 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { furi_string_get_cstr(app->m_currentAccesspointDescription.m_bssid)); canvas_set_font(canvas, FontSecondary); - //u8g2_SetFont(&canvas->fb, u8g2_font_tinytim_tf); - fontHeight = u8g2_GetMaxCharHeight(&canvas->fb); + //canvas_set_custom_u8g2_font(canvas, u8g2_font_tinytim_tf); + fontHeight = canvas_current_font_height(canvas); offsetY += fontHeight + 1; @@ -276,24 +497,20 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { offsetY += fontHeight; offsetY -= fontHeight; - u8g2_SetFont(&canvas->fb, u8g2_font_courB08_tn); + canvas_set_custom_u8g2_font(canvas, u8g2_font_courB08_tn); snprintf( string, sizeof(string), "%d/%d", app->m_currentIndexAccessPoint, app->m_totalAccessPoints); - offsetX = u8g2_GetDisplayWidth(&canvas->fb) - canvas_string_width(canvas, string) - 5; + offsetX = 128 - canvas_string_width(canvas, string) - 5; canvas_draw_str(canvas, offsetX, offsetY, string); canvas_draw_frame( - canvas, - offsetX - 6, - offsetY - u8g2_GetMaxCharHeight(&canvas->fb) - 3, - u8g2_GetDisplayWidth(&canvas->fb), - u8g2_GetDisplayHeight(&canvas->fb)); + canvas, offsetX - 6, offsetY - canvas_current_font_height(canvas) - 3, 128, 64); - u8g2_SetFont(&canvas->fb, u8g2_font_open_iconic_arrow_2x_t); + canvas_set_custom_u8g2_font(canvas, u8g2_font_open_iconic_arrow_2x_t); if(app->m_currentIndexAccessPoint != app->m_totalAccessPoints) { //canvas_draw_triangle(canvas, offsetX - 5 - 20, offsetY + 5, 4, 4, CanvasDirectionBottomToTop); canvas_draw_str(canvas, offsetX - 0 - 35, offsetY + 5, "\x4C"); @@ -308,25 +525,21 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { uint8_t offsetY = 0; uint8_t offsetX = 0; - canvas_draw_frame( - canvas, - 0, - 0, - u8g2_GetDisplayWidth(&canvas->fb), - u8g2_GetDisplayHeight(&canvas->fb)); + canvas_draw_frame(canvas, 0, 0, 128, 64); //canvas_set_font(canvas, FontBigNumbers); - u8g2_SetFont(&canvas->fb, u8g2_font_inb27_mr); - uint8_t fontHeight = u8g2_GetMaxCharHeight(&canvas->fb); + //canvas_set_custom_u8g2_font(canvas, u8g2_font_inb27_mr); + canvas_set_custom_u8g2_font(canvas, u8g2_font_inb27_mr); + uint8_t fontHeight = canvas_current_font_height(canvas); uint8_t fontWidth = u8g2_GetMaxCharWidth(&canvas->fb); if(app->m_currentAccesspointDescription.m_rssi == NA) { - offsetX += floor(u8g2_GetDisplayWidth(&canvas->fb) / 2) - fontWidth - 10; + offsetX += floor(128 / 2) - fontWidth - 10; offsetY += fontHeight - 5; canvas_draw_str(canvas, offsetX, offsetY, "N/A"); } else { - offsetX += floor(u8g2_GetDisplayWidth(&canvas->fb) / 2) - 2 * fontWidth; + offsetX += floor(128 / 2) - 2 * fontWidth; offsetY += fontHeight - 5; char rssi[8]; @@ -335,12 +548,12 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { } //canvas_set_font(canvas, FontPrimary); - u8g2_SetFont(&canvas->fb, u8g2_font_7x13B_tr); - fontHeight = u8g2_GetMaxCharHeight(&canvas->fb); + canvas_set_custom_u8g2_font(canvas, u8g2_font_7x13B_tr); + fontHeight = canvas_current_font_height(canvas); fontWidth = u8g2_GetMaxCharWidth(&canvas->fb); offsetX = 5; - offsetY = u8g2_GetDisplayHeight(&canvas->fb) - 7 - fontHeight; + offsetY = 64 - 7 - fontHeight; canvas_draw_str( canvas, offsetX, @@ -358,12 +571,7 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { DrawSignalStrengthBar( canvas, app->m_currentAccesspointDescription.m_rssi, 5, 5, 12, 25); DrawSignalStrengthBar( - canvas, - app->m_currentAccesspointDescription.m_rssi, - u8g2_GetDisplayWidth(&canvas->fb) - 5 - 12, - 5, - 12, - 25); + canvas, app->m_currentAccesspointDescription.m_rssi, 128 - 5 - 12, 5, 12, 25); } break; case ScanAnimation: { uint32_t currentTime = furi_get_tick(); @@ -380,18 +588,15 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { canvas_draw_disc( canvas, offsetX + 30 + 25 * i, - u8g2_GetDisplayHeight(&canvas->fb) / 2 - 7, + 64 / 2 - 7, 5 * (app->m_animtaionCounter == i ? mutliplier : 1)); } - u8g2_SetFont(&canvas->fb, u8g2_font_7x13B_tr); + canvas_set_custom_u8g2_font(canvas, u8g2_font_7x13B_tr); //canvas_set_font(canvas, FontPrimary); const char* message = "Scanning"; canvas_draw_str( - canvas, - u8g2_GetDisplayWidth(&canvas->fb) / 2 - canvas_string_width(canvas, message) / 2, - 55, - message); + canvas, 128 / 2 - canvas_string_width(canvas, message) / 2, 55, message); } break; case MonitorAnimation: { uint32_t currentTime = furi_get_tick(); @@ -407,27 +612,24 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { canvas_draw_disc( canvas, offsetX + 30, - u8g2_GetDisplayHeight(&canvas->fb) / 2 - 7, + 64 / 2 - 7, 5 * (app->m_animtaionCounter == 0 ? mutliplier : 1)); canvas_draw_disc( canvas, offsetX + 55, - u8g2_GetDisplayHeight(&canvas->fb) / 2 - 7, + 64 / 2 - 7, 5 * (app->m_animtaionCounter == 1 ? mutliplier : 1)); canvas_draw_disc( canvas, offsetX + 80, - u8g2_GetDisplayHeight(&canvas->fb) / 2 - 7, + 64 / 2 - 7, 5 * (app->m_animtaionCounter == 0 ? mutliplier : 1)); - u8g2_SetFont(&canvas->fb, u8g2_font_7x13B_tr); + canvas_set_custom_u8g2_font(canvas, u8g2_font_7x13B_tr); //canvas_set_font(canvas, FontPrimary); const char* message = "Monitor Mode"; canvas_draw_str( - canvas, - u8g2_GetDisplayWidth(&canvas->fb) / 2 - canvas_string_width(canvas, message) / 2, - 55, - message); + canvas, 128 / 2 - canvas_string_width(canvas, message) / 2, 55, message); } break; default: break; diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 84d0beda8..937fa57d8 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -3036,13 +3036,13 @@ Function,-,subghz_protocol_decoder_power_smart_get_hash_data,uint8_t,void* Function,-,subghz_protocol_decoder_power_smart_get_string,void,"void*, FuriString*" Function,-,subghz_protocol_decoder_power_smart_reset,void,void* Function,-,subghz_protocol_decoder_power_smart_serialize,SubGhzProtocolStatus,"void*, FlipperFormat*, SubGhzRadioPreset*" -Function,+,subghz_protocol_decoder_princeton_alloc,void*,SubGhzEnvironment* +Function,-,subghz_protocol_decoder_princeton_alloc,void*,SubGhzEnvironment* Function,-,subghz_protocol_decoder_princeton_deserialize,SubGhzProtocolStatus,"void*, FlipperFormat*" -Function,+,subghz_protocol_decoder_princeton_feed,void,"void*, _Bool, uint32_t" -Function,+,subghz_protocol_decoder_princeton_free,void,void* -Function,+,subghz_protocol_decoder_princeton_get_hash_data,uint8_t,void* -Function,+,subghz_protocol_decoder_princeton_get_string,void,"void*, FuriString*" -Function,+,subghz_protocol_decoder_princeton_reset,void,void* +Function,-,subghz_protocol_decoder_princeton_feed,void,"void*, _Bool, uint32_t" +Function,-,subghz_protocol_decoder_princeton_free,void,void* +Function,-,subghz_protocol_decoder_princeton_get_hash_data,uint8_t,void* +Function,-,subghz_protocol_decoder_princeton_get_string,void,"void*, FuriString*" +Function,-,subghz_protocol_decoder_princeton_reset,void,void* Function,-,subghz_protocol_decoder_princeton_serialize,SubGhzProtocolStatus,"void*, FlipperFormat*, SubGhzRadioPreset*" Function,+,subghz_protocol_decoder_raw_alloc,void*,SubGhzEnvironment* Function,+,subghz_protocol_decoder_raw_deserialize,SubGhzProtocolStatus,"void*, FlipperFormat*" @@ -3261,11 +3261,11 @@ Function,-,subghz_protocol_encoder_power_smart_deserialize,SubGhzProtocolStatus, Function,-,subghz_protocol_encoder_power_smart_free,void,void* Function,-,subghz_protocol_encoder_power_smart_stop,void,void* Function,-,subghz_protocol_encoder_power_smart_yield,LevelDuration,void* -Function,+,subghz_protocol_encoder_princeton_alloc,void*,SubGhzEnvironment* +Function,-,subghz_protocol_encoder_princeton_alloc,void*,SubGhzEnvironment* Function,-,subghz_protocol_encoder_princeton_deserialize,SubGhzProtocolStatus,"void*, FlipperFormat*" -Function,+,subghz_protocol_encoder_princeton_free,void,void* -Function,+,subghz_protocol_encoder_princeton_stop,void,void* -Function,+,subghz_protocol_encoder_princeton_yield,LevelDuration,void* +Function,-,subghz_protocol_encoder_princeton_free,void,void* +Function,-,subghz_protocol_encoder_princeton_stop,void,void* +Function,-,subghz_protocol_encoder_princeton_yield,LevelDuration,void* Function,+,subghz_protocol_encoder_raw_alloc,void*,SubGhzEnvironment* Function,+,subghz_protocol_encoder_raw_deserialize,SubGhzProtocolStatus,"void*, FlipperFormat*" Function,+,subghz_protocol_encoder_raw_free,void,void* @@ -3457,7 +3457,7 @@ Function,-,u8g2_DrawExtendedUTF8,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, Function,-,u8g2_DrawFilledEllipse,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" Function,-,u8g2_DrawFrame,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" Function,-,u8g2_DrawGlyph,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, uint16_t" -Function,+,u8g2_DrawHLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" +Function,-,u8g2_DrawHLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" Function,-,u8g2_DrawHVLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" Function,-,u8g2_DrawHorizontalBitmap,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" Function,-,u8g2_DrawLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" @@ -3493,7 +3493,7 @@ Function,-,u8g2_SetBufferCurrTileRow,void,"u8g2_t*, uint8_t" Function,-,u8g2_SetClipWindow,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" Function,-,u8g2_SetDisplayRotation,void,"u8g2_t*, const u8g2_cb_t*" Function,-,u8g2_SetDrawColor,void,"u8g2_t*, uint8_t" -Function,+,u8g2_SetFont,void,"u8g2_t*, const uint8_t*" +Function,-,u8g2_SetFont,void,"u8g2_t*, const uint8_t*" Function,-,u8g2_SetFontDirection,void,"u8g2_t*, uint8_t" Function,-,u8g2_SetFontMode,void,"u8g2_t*, uint8_t" Function,-,u8g2_SetFontPosBaseline,void,u8g2_t* @@ -4531,7 +4531,7 @@ Function,-,uxTaskGetStackHighWaterMark,UBaseType_t,TaskHandle_t Function,-,uxTaskGetStackHighWaterMark2,uint16_t,TaskHandle_t Function,-,uxTaskGetSystemState,UBaseType_t,"TaskStatus_t*, const UBaseType_t, uint32_t*" Function,-,uxTaskGetTaskNumber,UBaseType_t,TaskHandle_t -Function,+,uxTaskPriorityGet,UBaseType_t,const TaskHandle_t +Function,-,uxTaskPriorityGet,UBaseType_t,const TaskHandle_t Function,-,uxTaskPriorityGetFromISR,UBaseType_t,const TaskHandle_t Function,-,uxTaskResetEventItemValue,TickType_t, Function,-,uxTimerGetReloadMode,UBaseType_t,TimerHandle_t @@ -5234,7 +5234,7 @@ Variable,-,u8g2_font_7x13B_mn,const uint8_t[], Variable,-,u8g2_font_7x13B_mr,const uint8_t[], Variable,-,u8g2_font_7x13B_tf,const uint8_t[], Variable,-,u8g2_font_7x13B_tn,const uint8_t[], -Variable,+,u8g2_font_7x13B_tr,const uint8_t[], +Variable,-,u8g2_font_7x13B_tr,const uint8_t[], Variable,-,u8g2_font_7x13O_mf,const uint8_t[], Variable,-,u8g2_font_7x13O_mn,const uint8_t[], Variable,-,u8g2_font_7x13O_mr,const uint8_t[], @@ -5438,7 +5438,7 @@ Variable,-,u8g2_font_chroma48medium8_8n,const uint8_t[], Variable,-,u8g2_font_chroma48medium8_8r,const uint8_t[], Variable,-,u8g2_font_chroma48medium8_8u,const uint8_t[], Variable,-,u8g2_font_courB08_tf,const uint8_t[], -Variable,+,u8g2_font_courB08_tn,const uint8_t[], +Variable,-,u8g2_font_courB08_tn,const uint8_t[], Variable,-,u8g2_font_courB08_tr,const uint8_t[], Variable,-,u8g2_font_courB10_tf,const uint8_t[], Variable,-,u8g2_font_courB10_tn,const uint8_t[], @@ -5788,7 +5788,7 @@ Variable,-,u8g2_font_inb24_mn,const uint8_t[], Variable,-,u8g2_font_inb24_mr,const uint8_t[], Variable,-,u8g2_font_inb27_mf,const uint8_t[], Variable,-,u8g2_font_inb27_mn,const uint8_t[], -Variable,+,u8g2_font_inb27_mr,const uint8_t[], +Variable,-,u8g2_font_inb27_mr,const uint8_t[], Variable,-,u8g2_font_inb30_mf,const uint8_t[], Variable,-,u8g2_font_inb30_mn,const uint8_t[], Variable,-,u8g2_font_inb30_mr,const uint8_t[], @@ -6265,7 +6265,7 @@ Variable,-,u8g2_font_open_iconic_app_4x_t,const uint8_t[], Variable,-,u8g2_font_open_iconic_app_6x_t,const uint8_t[], Variable,-,u8g2_font_open_iconic_app_8x_t,const uint8_t[], Variable,-,u8g2_font_open_iconic_arrow_1x_t,const uint8_t[], -Variable,+,u8g2_font_open_iconic_arrow_2x_t,const uint8_t[], +Variable,-,u8g2_font_open_iconic_arrow_2x_t,const uint8_t[], Variable,-,u8g2_font_open_iconic_arrow_4x_t,const uint8_t[], Variable,-,u8g2_font_open_iconic_arrow_6x_t,const uint8_t[], Variable,-,u8g2_font_open_iconic_arrow_8x_t,const uint8_t[], From 03d8804209fcc73489430dfa6ab39fa37b5be2ef Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 22 May 2023 03:05:51 +0300 Subject: [PATCH 19/23] More API cleanup --- firmware/targets/f7/api_symbols.csv | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 937fa57d8..33d37ea52 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1048,12 +1048,12 @@ Function,+,furi_hal_bt_change_app,_Bool,"FuriHalBtProfile, GapEventCallback, voi Function,+,furi_hal_bt_clear_white_list,_Bool, Function,+,furi_hal_bt_dump_state,void,FuriString* Function,+,furi_hal_bt_ensure_c2_mode,_Bool,BleGlueC2Mode -Function,+,furi_hal_bt_get_conn_rssi,uint32_t,uint8_t* +Function,-,furi_hal_bt_get_conn_rssi,uint32_t,uint8_t* Function,-,furi_hal_bt_get_hardfault_info,const FuriHalBtHardfaultInfo*, Function,+,furi_hal_bt_get_key_storage_buff,void,"uint8_t**, uint16_t*" Function,+,furi_hal_bt_get_profile_adv_name,const char*,FuriHalBtProfile Function,+,furi_hal_bt_get_profile_mac_addr,const uint8_t*,FuriHalBtProfile -Function,+,furi_hal_bt_get_profile_pairing_method,GapPairing,FuriHalBtProfile +Function,-,furi_hal_bt_get_profile_pairing_method,GapPairing,FuriHalBtProfile Function,+,furi_hal_bt_get_radio_stack,FuriHalBtStack, Function,+,furi_hal_bt_get_rssi,float, Function,+,furi_hal_bt_get_transmitted_packets,uint32_t, @@ -1416,7 +1416,7 @@ Function,+,furi_hal_subghz_get_rssi,float, Function,+,furi_hal_subghz_get_timestamp_file_names,_Bool, Function,+,furi_hal_subghz_idle,void, Function,-,furi_hal_subghz_init,void, -Function,+,furi_hal_subghz_init_check,_Bool, +Function,-,furi_hal_subghz_init_check,_Bool, Function,+,furi_hal_subghz_init_radio_type,_Bool,SubGhzRadioType Function,+,furi_hal_subghz_is_async_tx_complete,_Bool, Function,+,furi_hal_subghz_is_frequency_valid,_Bool,uint32_t @@ -1436,8 +1436,8 @@ Function,+,furi_hal_subghz_set_external_power_disable,void,_Bool Function,+,furi_hal_subghz_set_frequency,uint32_t,uint32_t Function,+,furi_hal_subghz_set_frequency_and_path,uint32_t,uint32_t Function,+,furi_hal_subghz_set_path,void,FuriHalSubGhzPath -Function,+,furi_hal_subghz_set_rolling_counter_mult,void,uint8_t -Function,+,furi_hal_subghz_set_timestamp_file_names,void,_Bool +Function,-,furi_hal_subghz_set_rolling_counter_mult,void,uint8_t +Function,-,furi_hal_subghz_set_timestamp_file_names,void,_Bool Function,-,furi_hal_subghz_shutdown,void, Function,+,furi_hal_subghz_sleep,void, Function,+,furi_hal_subghz_start_async_rx,void,"FuriHalSubGhzCaptureCallback, void*" @@ -1654,7 +1654,7 @@ Function,-,gamma,double,double Function,-,gamma_r,double,"double, int*" Function,-,gammaf,float,float Function,-,gammaf_r,float,"float, int*" -Function,+,gap_get_remote_conn_rssi,uint32_t,int8_t* +Function,-,gap_get_remote_conn_rssi,uint32_t,int8_t* Function,-,gap_get_state,GapState, Function,-,gap_init,_Bool,"GapConfig*, GapEventCallback, void*" Function,-,gap_start_advertising,void, From aab4d2bd34fa2a630dc443c8b3d3286f4240704b Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 22 May 2023 03:45:17 +0300 Subject: [PATCH 20/23] API CleanUp part 3 --- applications/external/doom/display.h | 2 +- .../external/esp8266_deauth/esp8266_deauth.c | 6 +- .../external/wifi_scanner/wifi_scanner.c | 6 +- applications/services/gui/application.fam | 1 - applications/services/gui/canvas.c | 5 + applications/services/gui/canvas.h | 8 + firmware/targets/f7/api_symbols.csv | 2901 +---------------- lib/SConscript | 1 - 8 files changed, 20 insertions(+), 2910 deletions(-) diff --git a/applications/external/doom/display.h b/applications/external/doom/display.h index cc9052acc..9695b5adf 100644 --- a/applications/external/doom/display.h +++ b/applications/external/doom/display.h @@ -90,7 +90,7 @@ void drawVLine(uint8_t x, int8_t start_y, int8_t end_y, uint8_t intensity, Canva void setupDisplay(Canvas* canvas) { memset(zbuffer, 0xff, 128); - display_buf = (uint8_t*)canvas_get_buffer(canvas); + display_buf = (uint8_t*)canvas->fb.tile_buf_ptr; //display_buf = u8g2_GetBufferPtr(&canvas->fb); } diff --git a/applications/external/esp8266_deauth/esp8266_deauth.c b/applications/external/esp8266_deauth/esp8266_deauth.c index 07b7886c8..e0a966975 100644 --- a/applications/external/esp8266_deauth/esp8266_deauth.c +++ b/applications/external/esp8266_deauth/esp8266_deauth.c @@ -11,8 +11,6 @@ //#include //#include -#include - #include "FlipperZeroWiFiDeauthModuleDefines.h" #define DEAUTH_APP_DEBUG 0 @@ -192,8 +190,8 @@ static void esp8266_deauth_module_render_callback(Canvas* const canvas, void* ct #endif // ENABLE_MODULE_POWER break; case ModuleActive: { - uint8_t* buffer = canvas_get_buffer(canvas); - app->m_canvasSize = canvas_get_buffer_size(canvas); + uint8_t* buffer = canvas->fb.tile_buf_ptr; + app->m_canvasSize = gui_get_framebuffer_size(app->m_gui); memcpy(buffer, app->m_backBuffer, app->m_canvasSize); } break; default: diff --git a/applications/external/wifi_scanner/wifi_scanner.c b/applications/external/wifi_scanner/wifi_scanner.c index 9dabc6a90..127bee0cd 100644 --- a/applications/external/wifi_scanner/wifi_scanner.c +++ b/applications/external/wifi_scanner/wifi_scanner.c @@ -11,8 +11,6 @@ #include #include -#include - #include "FlipperZeroWiFiModuleDefines.h" #define WIFI_APP_DEBUG 0 @@ -531,7 +529,7 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { //canvas_set_custom_u8g2_font(canvas, u8g2_font_inb27_mr); canvas_set_custom_u8g2_font(canvas, u8g2_font_inb27_mr); uint8_t fontHeight = canvas_current_font_height(canvas); - uint8_t fontWidth = u8g2_GetMaxCharWidth(&canvas->fb); + uint8_t fontWidth = canvas_current_font_width(canvas); if(app->m_currentAccesspointDescription.m_rssi == NA) { offsetX += floor(128 / 2) - fontWidth - 10; @@ -550,7 +548,7 @@ static void wifi_module_render_callback(Canvas* const canvas, void* ctx) { //canvas_set_font(canvas, FontPrimary); canvas_set_custom_u8g2_font(canvas, u8g2_font_7x13B_tr); fontHeight = canvas_current_font_height(canvas); - fontWidth = u8g2_GetMaxCharWidth(&canvas->fb); + fontWidth = canvas_current_font_width(canvas); offsetX = 5; offsetY = 64 - 7 - fontHeight; diff --git a/applications/services/gui/application.fam b/applications/services/gui/application.fam index 193b9dfd3..869d964dd 100644 --- a/applications/services/gui/application.fam +++ b/applications/services/gui/application.fam @@ -14,7 +14,6 @@ App( "gui.h", "icon_i.h", "elements.h", - "canvas_i.h", "view_dispatcher.h", "view_stack.h", "modules/button_menu.h", diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index 057bd3e95..0786e8486 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -100,6 +100,11 @@ uint8_t canvas_current_font_height(const Canvas* canvas) { return font_height; } +uint8_t canvas_current_font_width(const Canvas* canvas) { + furi_assert(canvas); + return (uint8_t)u8g2_GetMaxCharWidth(&canvas->fb); +} + const CanvasFontParameters* canvas_get_font_params(const Canvas* canvas, Font font) { furi_assert(canvas); furi_assert(font < FontTotalNumber); diff --git a/applications/services/gui/canvas.h b/applications/services/gui/canvas.h index 9d8cf607f..7a2ae1873 100644 --- a/applications/services/gui/canvas.h +++ b/applications/services/gui/canvas.h @@ -120,6 +120,14 @@ uint8_t canvas_height(const Canvas* canvas); */ uint8_t canvas_current_font_height(const Canvas* canvas); +/** Get current font width + * + * @param canvas Canvas instance + * + * @return width in pixels. + */ +uint8_t canvas_current_font_width(const Canvas* canvas); + /** Get font parameters * * @param canvas Canvas instance diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 33d37ea52..3313f3ecd 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -5,7 +5,6 @@ Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, Header,+,applications/services/dialogs/dialogs.h,, Header,+,applications/services/dolphin/dolphin.h,, -Header,+,applications/services/gui/canvas_i.h,, Header,+,applications/services/gui/elements.h,, Header,+,applications/services/gui/gui.h,, Header,+,applications/services/gui/icon_i.h,, @@ -213,7 +212,6 @@ Header,+,lib/toolbox/stream/string_stream.h,, Header,+,lib/toolbox/tar/tar_archive.h,, Header,+,lib/toolbox/value_index.h,, Header,+,lib/toolbox/version.h,, -Header,+,lib/u8g2/u8g2.h,, Function,-,LL_ADC_CommonDeInit,ErrorStatus,ADC_Common_TypeDef* Function,-,LL_ADC_CommonInit,ErrorStatus,"ADC_Common_TypeDef*, const LL_ADC_CommonInitTypeDef*" Function,-,LL_ADC_CommonStructInit,void,LL_ADC_CommonInitTypeDef* @@ -632,6 +630,7 @@ Function,-,calloc,void*,"size_t, size_t" Function,+,canvas_clear,void,Canvas* Function,+,canvas_commit,void,Canvas* Function,+,canvas_current_font_height,uint8_t,const Canvas* +Function,+,canvas_current_font_width,uint8_t,const Canvas* Function,+,canvas_draw_bitmap,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, const uint8_t*" Function,+,canvas_draw_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" Function,+,canvas_draw_circle,void,"Canvas*, uint8_t, uint8_t, uint8_t" @@ -649,17 +648,10 @@ Function,+,canvas_draw_rframe,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, Function,+,canvas_draw_str,void,"Canvas*, uint8_t, uint8_t, const char*" Function,+,canvas_draw_str_aligned,void,"Canvas*, uint8_t, uint8_t, Align, Align, const char*" Function,+,canvas_draw_triangle,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, CanvasDirection" -Function,+,canvas_draw_u8g2_bitmap,void,"u8g2_t*, uint8_t, uint8_t, uint8_t, uint8_t, const uint8_t*, uint8_t" Function,+,canvas_draw_xbm,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, const uint8_t*" -Function,-,canvas_frame_set,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" -Function,-,canvas_free,void,Canvas* -Function,+,canvas_get_buffer,uint8_t*,Canvas* -Function,+,canvas_get_buffer_size,size_t,const Canvas* Function,+,canvas_get_font_params,const CanvasFontParameters*,"const Canvas*, Font" -Function,-,canvas_get_orientation,CanvasOrientation,const Canvas* Function,+,canvas_glyph_width,uint8_t,"Canvas*, char" Function,+,canvas_height,uint8_t,const Canvas* -Function,-,canvas_init,Canvas*, Function,+,canvas_invert_color,void,Canvas* Function,+,canvas_reset,void,Canvas* Function,+,canvas_set_bitmap_mode,void,"Canvas*, _Bool" @@ -667,7 +659,6 @@ Function,+,canvas_set_color,void,"Canvas*, Color" Function,+,canvas_set_custom_u8g2_font,void,"Canvas*, const uint8_t*" Function,+,canvas_set_font,void,"Canvas*, Font" Function,+,canvas_set_font_direction,void,"Canvas*, CanvasDirection" -Function,-,canvas_set_orientation,void,"Canvas*, CanvasOrientation" Function,+,canvas_string_width,uint16_t,"Canvas*, const char*" Function,+,canvas_width,uint8_t,const Canvas* Function,-,cbrt,double,double @@ -716,13 +707,6 @@ Function,+,composite_api_resolver_add,void,"CompositeApiResolver*, const ElfApiI Function,+,composite_api_resolver_alloc,CompositeApiResolver*, Function,+,composite_api_resolver_free,void,CompositeApiResolver* Function,+,composite_api_resolver_get,const ElfApiInterface*,CompositeApiResolver* -Function,-,compress_alloc,Compress*,uint16_t -Function,-,compress_decode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" -Function,-,compress_encode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" -Function,-,compress_free,void,Compress* -Function,-,compress_icon_alloc,CompressIcon*, -Function,-,compress_icon_decode,void,"CompressIcon*, const uint8_t*, uint8_t**" -Function,-,compress_icon_free,void,CompressIcon* Function,-,copysign,double,"double, double" Function,-,copysignf,float,"float, float" Function,-,copysignl,long double,"long double, long double" @@ -2229,7 +2213,7 @@ Function,+,power_get_pubsub,FuriPubSub*,Power* Function,+,power_is_battery_healthy,_Bool,Power* Function,+,power_off,void,Power* Function,+,power_reboot,void,PowerBootMode -Function,+,power_trigger_ui_update,void,Power* +Function,-,power_trigger_ui_update,void,Power* Function,+,powf,float,"float, float" Function,-,powl,long double,"long double, long double" Function,+,pretty_format_bytes_hex_canonical,void,"FuriString*, size_t, const char*, const uint8_t*, size_t" @@ -3419,7 +3403,6 @@ Function,+,text_input_set_header_text,void,"TextInput*, const char*" Function,+,text_input_set_minimum_length,void,"TextInput*, size_t" Function,+,text_input_set_result_callback,void,"TextInput*, TextInputCallback, void*, char*, size_t, _Bool" Function,+,text_input_set_validator,void,"TextInput*, TextInputValidatorCallback, void*" -Function,-,tga_save,void,const char* Function,-,tgamma,double,double Function,-,tgammaf,float,float Function,-,tgammal,long double,long double @@ -3443,1060 +3426,6 @@ Function,-,trunc,double,double Function,-,truncf,float,float Function,-,truncl,long double,long double Function,-,tzset,void, -Function,-,u8g2_AddPolygonXY,void,"u8g2_t*, int16_t, int16_t" -Function,-,u8g2_ClearBuffer,void,u8g2_t* -Function,-,u8g2_ClearDisplay,void,u8g2_t* -Function,-,u8g2_ClearPolygonXY,void, -Function,-,u8g2_DrawBitmap,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" -Function,-,u8g2_DrawBox,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_DrawCircle,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" -Function,-,u8g2_DrawDisc,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" -Function,-,u8g2_DrawEllipse,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" -Function,-,u8g2_DrawExtUTF8,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, uint8_t, const uint16_t*, const char*" -Function,-,u8g2_DrawExtendedUTF8,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, uint8_t, u8g2_kerning_t*, const char*" -Function,-,u8g2_DrawFilledEllipse,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" -Function,-,u8g2_DrawFrame,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_DrawGlyph,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, uint16_t" -Function,-,u8g2_DrawHLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_DrawHVLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" -Function,-,u8g2_DrawHorizontalBitmap,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" -Function,-,u8g2_DrawLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_DrawLog,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8log_t*" -Function,-,u8g2_DrawPixel,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_DrawPolygon,void,u8g2_t* -Function,-,u8g2_DrawRBox,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_DrawRFrame,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_DrawStr,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, const char*" -Function,-,u8g2_DrawTriangle,void,"u8g2_t*, int16_t, int16_t, int16_t, int16_t, int16_t, int16_t" -Function,-,u8g2_DrawUTF8,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, const char*" -Function,-,u8g2_DrawUTF8Line,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const char*, uint8_t, uint8_t" -Function,-,u8g2_DrawUTF8Lines,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const char*" -Function,-,u8g2_DrawVLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_DrawXBM,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" -Function,-,u8g2_DrawXBMP,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" -Function,-,u8g2_FirstPage,void,u8g2_t* -Function,-,u8g2_GetFontSize,size_t,const uint8_t* -Function,-,u8g2_GetGlyphWidth,int8_t,"u8g2_t*, uint16_t" -Function,-,u8g2_GetKerning,uint8_t,"u8g2_t*, u8g2_kerning_t*, uint16_t, uint16_t" -Function,-,u8g2_GetKerningByTable,uint8_t,"u8g2_t*, const uint16_t*, uint16_t, uint16_t" -Function,-,u8g2_GetStrWidth,u8g2_long_t,"u8g2_t*, const char*" -Function,-,u8g2_GetStrX,int8_t,"u8g2_t*, const char*" -Function,-,u8g2_GetUTF8Width,u8g2_uint_t,"u8g2_t*, const char*" -Function,-,u8g2_IsAllValidUTF8,uint8_t,"u8g2_t*, const char*" -Function,-,u8g2_IsGlyph,uint8_t,"u8g2_t*, uint16_t" -Function,-,u8g2_IsIntersection,uint8_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_NextPage,uint8_t,u8g2_t* -Function,-,u8g2_SendBuffer,void,u8g2_t* -Function,-,u8g2_SendF,void,"u8g2_t*, const char*, ..." -Function,-,u8g2_SetBitmapMode,void,"u8g2_t*, uint8_t" -Function,-,u8g2_SetBufferCurrTileRow,void,"u8g2_t*, uint8_t" -Function,-,u8g2_SetClipWindow,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" -Function,-,u8g2_SetDisplayRotation,void,"u8g2_t*, const u8g2_cb_t*" -Function,-,u8g2_SetDrawColor,void,"u8g2_t*, uint8_t" -Function,-,u8g2_SetFont,void,"u8g2_t*, const uint8_t*" -Function,-,u8g2_SetFontDirection,void,"u8g2_t*, uint8_t" -Function,-,u8g2_SetFontMode,void,"u8g2_t*, uint8_t" -Function,-,u8g2_SetFontPosBaseline,void,u8g2_t* -Function,-,u8g2_SetFontPosBottom,void,u8g2_t* -Function,-,u8g2_SetFontPosCenter,void,u8g2_t* -Function,-,u8g2_SetFontPosTop,void,u8g2_t* -Function,-,u8g2_SetFontRefHeightAll,void,u8g2_t* -Function,-,u8g2_SetFontRefHeightExtendedText,void,u8g2_t* -Function,-,u8g2_SetFontRefHeightText,void,u8g2_t* -Function,-,u8g2_SetMaxClipWindow,void,u8g2_t* -Function,-,u8g2_SetupBitmap,void,"u8g2_t*, const u8g2_cb_t*, uint16_t, uint16_t" -Function,-,u8g2_SetupBuffer,void,"u8g2_t*, uint8_t*, uint8_t, u8g2_draw_ll_hvline_cb, const u8g2_cb_t*" -Function,-,u8g2_SetupBuffer_SDL_128x64,void,"u8g2_t*, const u8g2_cb_t*" -Function,-,u8g2_SetupBuffer_SDL_128x64_1,void,"u8g2_t*, const u8g2_cb_t*" -Function,-,u8g2_SetupBuffer_SDL_128x64_4,void,"u8g2_t*, const u8g2_cb_t*" -Function,-,u8g2_SetupBuffer_TGA_DESC,void,"u8g2_t*, const u8g2_cb_t*" -Function,-,u8g2_SetupBuffer_TGA_LCD,void,"u8g2_t*, const u8g2_cb_t*" -Function,-,u8g2_SetupBuffer_Utf8,void,"u8g2_t*, const u8g2_cb_t*" -Function,-,u8g2_Setup_a2printer_384x240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_a2printer_384x240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_a2printer_384x240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_hx1230_96x68_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_hx1230_96x68_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_hx1230_96x68_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_il3820_296x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_il3820_296x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_il3820_296x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_il3820_v2_296x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_il3820_v2_296x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_il3820_v2_296x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ist3020_erc19264_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ist3020_erc19264_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ist3020_erc19264_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ist7920_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ist7920_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ist7920_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ks0108_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ks0108_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ks0108_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ks0108_erm19264_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ks0108_erm19264_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ks0108_erm19264_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_160x160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_160x160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_160x160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_160x80_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_160x80_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_160x80_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_240x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_240x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_240x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_240x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_240x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_lc7981_240x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ld7032_60x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ld7032_60x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ld7032_60x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ld7032_i2c_60x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ld7032_i2c_60x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ld7032_i2c_60x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls013b7dh03_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls013b7dh03_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls013b7dh03_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls013b7dh05_144x168_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls013b7dh05_144x168_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls013b7dh05_144x168_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls027b7dh01_400x240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls027b7dh01_400x240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ls027b7dh01_400x240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_32x8_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_32x8_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_32x8_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_64x8_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_64x8_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_64x8_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_8x8_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_8x8_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_max7219_8x8_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_nt7534_tg12864r_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_nt7534_tg12864r_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_nt7534_tg12864r_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_null,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_pcd8544_84x48_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_pcd8544_84x48_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_pcd8544_84x48_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_pcf8812_96x65_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_pcf8812_96x65_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_pcf8812_96x65_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ra8835_320x240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ra8835_320x240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ra8835_320x240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ra8835_nhd_240x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ra8835_nhd_240x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ra8835_nhd_240x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sbn1661_122x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sbn1661_122x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sbn1661_122x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sed1330_240x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sed1330_240x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sed1330_240x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sed1520_122x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sed1520_122x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sed1520_122x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_vcomh0_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_vcomh0_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_vcomh0_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_winstar_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_winstar_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_128x64_winstar_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_64x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_64x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_64x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_72x40_wise_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_72x40_wise_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_72x40_wise_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_vcomh0_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_vcomh0_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_vcomh0_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_winstar_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_winstar_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_128x64_winstar_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_64x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_64x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_64x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_72x40_wise_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_72x40_wise_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1106_i2c_72x40_wise_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_64x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_64x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_64x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_64x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_64x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_64x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_pimoroni_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_pimoroni_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_pimoroni_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_seeed_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_seeed_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_seeed_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_seeed_96x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_seeed_96x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_i2c_seeed_96x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_pimoroni_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_pimoroni_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_pimoroni_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_seeed_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_seeed_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_seeed_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_seeed_96x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_seeed_96x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1107_seeed_96x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1108_160x160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1108_160x160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1108_160x160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1108_i2c_160x160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1108_i2c_160x160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1108_i2c_160x160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1122_256x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1122_256x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1122_256x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1122_i2c_256x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1122_i2c_256x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_sh1122_i2c_256x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd0323_i2c_os128064_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd0323_i2c_os128064_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd0323_i2c_os128064_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd0323_os128064_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd0323_os128064_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd0323_os128064_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x32_adafruit_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x32_adafruit_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x32_adafruit_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x32_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x32_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x32_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x64_adafruit_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x64_adafruit_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_128x64_adafruit_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x32_adafruit_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x32_adafruit_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x32_adafruit_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x32_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x32_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x32_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x64_adafruit_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x64_adafruit_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1305_i2c_128x64_adafruit_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x32_univision_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x32_univision_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x32_univision_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x32_winstar_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x32_winstar_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x32_winstar_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_alt0_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_alt0_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_alt0_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_vcomh0_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_vcomh0_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_128x64_vcomh0_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_48x64_winstar_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_48x64_winstar_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_48x64_winstar_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x32_1f_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x32_1f_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x32_1f_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x32_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x32_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x32_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x48_er_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x48_er_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_64x48_er_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_72x40_er_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_72x40_er_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_72x40_er_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_96x16_er_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_96x16_er_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_96x16_er_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x32_univision_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x32_univision_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x32_univision_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x32_winstar_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x32_winstar_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x32_winstar_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_alt0_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_alt0_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_alt0_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_vcomh0_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_vcomh0_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_128x64_vcomh0_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_48x64_winstar_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_48x64_winstar_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_48x64_winstar_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x32_1f_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x32_1f_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x32_1f_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x32_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x32_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x32_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x48_er_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x48_er_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_64x48_er_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_72x40_er_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_72x40_er_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_72x40_er_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_96x16_er_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_96x16_er_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1306_i2c_96x16_er_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_128x64_noname0_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_128x64_noname0_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_128x64_noname0_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_128x64_noname2_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_128x64_noname2_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_128x64_noname2_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_i2c_128x64_noname0_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_i2c_128x64_noname0_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_i2c_128x64_noname0_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_i2c_128x64_noname2_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_i2c_128x64_noname2_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1309_i2c_128x64_noname2_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1316_128x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1316_128x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1316_128x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1316_i2c_128x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1316_i2c_128x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1316_i2c_128x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1317_96x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1317_96x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1317_96x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1317_i2c_96x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1317_i2c_96x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1317_i2c_96x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_128x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_128x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_128x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_128x96_xcp_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_128x96_xcp_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_128x96_xcp_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_i2c_128x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_i2c_128x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_i2c_128x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_i2c_128x96_xcp_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_i2c_128x96_xcp_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1318_i2c_128x96_xcp_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1322_nhd_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1322_nhd_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1322_nhd_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1322_nhd_256x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1322_nhd_256x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1322_nhd_256x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1325_i2c_nhd_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1325_i2c_nhd_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1325_i2c_nhd_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1325_nhd_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1325_nhd_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1325_nhd_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1326_er_256x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1326_er_256x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1326_er_256x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1326_i2c_er_256x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1326_i2c_er_256x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1326_i2c_er_256x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ea_w128128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ea_w128128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ea_w128128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ea_w128128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ea_w128128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ea_w128128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_midas_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_midas_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_midas_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_seeed_96x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_seeed_96x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_seeed_96x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_visionox_128x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_visionox_128x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_visionox_128x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ws_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ws_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ws_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ws_96x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ws_96x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_i2c_ws_96x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_midas_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_midas_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_midas_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_seeed_96x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_seeed_96x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_seeed_96x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_visionox_128x96_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_visionox_128x96_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_visionox_128x96_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ws_128x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ws_128x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ws_128x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ws_96x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ws_96x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1327_ws_96x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1329_128x96_noname_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1329_128x96_noname_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1329_128x96_noname_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1606_172x72_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1606_172x72_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1606_172x72_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_200x200_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_200x200_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_200x200_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_gd_200x200_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_gd_200x200_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_gd_200x200_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_ws_200x200_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_ws_200x200_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_ssd1607_ws_200x200_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7511_avd_320x240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7511_avd_320x240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7511_avd_320x240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx172104_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx172104_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx172104_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx19296_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx19296_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx19296_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx240160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx240160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx240160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160_alt_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160_alt_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160_alt_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160m_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160m_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx256160m_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx25664_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx25664_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_jlx25664_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_wo256x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_wo256x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_i2c_wo256x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx172104_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx172104_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx172104_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx19296_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx19296_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx19296_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx240160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx240160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx240160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160_alt_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160_alt_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160_alt_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160m_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160m_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx256160m_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx25664_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx25664_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_jlx25664_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_wo256x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_wo256x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75256_wo256x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7528_i2c_nhd_c160100_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7528_i2c_nhd_c160100_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7528_i2c_nhd_c160100_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7528_nhd_c160100_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7528_nhd_c160100_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7528_nhd_c160100_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75320_i2c_jlx320240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75320_i2c_jlx320240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75320_i2c_jlx320240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75320_jlx320240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75320_jlx320240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st75320_jlx320240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_64128n_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_64128n_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_64128n_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_ea_dogm128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_ea_dogm128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_ea_dogm128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_ea_dogm132_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_ea_dogm132_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_ea_dogm132_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_erc12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_erc12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_erc12864_alt_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_erc12864_alt_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_erc12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_jlx12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_jlx12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_jlx12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lm6059_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lm6059_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lm6059_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lm6063_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lm6063_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lm6063_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lx12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lx12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_lx12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_nhd_c12832_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_nhd_c12832_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_nhd_c12832_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_nhd_c12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_nhd_c12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_nhd_c12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_zolen_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_zolen_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7565_zolen_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_64x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_64x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_64x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_enh_dg128064_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_enh_dg128064_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_enh_dg128064_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_enh_dg128064i_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_enh_dg128064i_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_enh_dg128064i_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_i2c_64x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_i2c_64x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_i2c_64x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_jlx12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_jlx12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_jlx12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_os12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_os12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_os12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_pi_132x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_pi_132x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7567_pi_132x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7586s_erc240160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7586s_erc240160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7586s_erc240160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7586s_s028hn118a_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7586s_s028hn118a_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7586s_s028hn118a_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7588_i2c_jlx12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7588_i2c_jlx12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7588_i2c_jlx12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7588_jlx12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7588_jlx12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7588_jlx12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_192x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_192x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_192x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_p_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_p_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_p_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_p_192x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_p_192x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_p_192x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_s_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_s_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_s_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_s_192x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_s_192x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_st7920_s_192x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_128x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_128x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_128x64_alt_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_128x64_alt_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_128x64_alt_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_128x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_160x80_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_160x80_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_160x80_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_240x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_240x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_240x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_240x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_240x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_240x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_256x64_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_256x64_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_t6963_256x64_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1601_128x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1601_128x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1601_128x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1601_i2c_128x32_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1601_i2c_128x32_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1601_i2c_128x32_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1604_i2c_jlx19264_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1604_i2c_jlx19264_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1604_i2c_jlx19264_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1604_jlx19264_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1604_jlx19264_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1604_jlx19264_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_240x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_240x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_240x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_erc240120_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_erc240120_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_erc240120_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_erc24064_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_erc24064_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_erc24064_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_240x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_240x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_240x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_erc240120_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_erc240120_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_erc240120_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_erc24064_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_erc24064_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1608_i2c_erc24064_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1610_ea_dogxl160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1610_ea_dogxl160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1610_ea_dogxl160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1610_i2c_ea_dogxl160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1610_i2c_ea_dogxl160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1610_i2c_ea_dogxl160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_cg160160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_cg160160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_cg160160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ea_dogm240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ea_dogm240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ea_dogm240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ea_dogxl240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ea_dogxl240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ea_dogxl240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ew50850_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ew50850_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_ew50850_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_cg160160_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_cg160160_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_cg160160_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ea_dogm240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ea_dogm240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ea_dogm240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ea_dogxl240_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ea_dogxl240_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ea_dogxl240_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ew50850_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ew50850_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1611_i2c_ew50850_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1638_160x128_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1638_160x128_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1638_160x128_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1701_ea_dogs102_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1701_ea_dogs102_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1701_ea_dogs102_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1701_mini12864_1,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1701_mini12864_2,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_Setup_uc1701_mini12864_f,void,"u8g2_t*, const u8g2_cb_t*, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8g2_UpdateDisplay,void,u8g2_t* -Function,-,u8g2_UpdateDisplayArea,void,"u8g2_t*, uint8_t, uint8_t, uint8_t, uint8_t" -Function,-,u8g2_UserInterfaceInputValue,uint8_t,"u8g2_t*, const char*, const char*, uint8_t*, uint8_t, uint8_t, uint8_t, const char*" -Function,-,u8g2_UserInterfaceMessage,uint8_t,"u8g2_t*, const char*, const char*, const char*, const char*" -Function,-,u8g2_UserInterfaceSelectionList,uint8_t,"u8g2_t*, const char*, uint8_t, const char*" -Function,-,u8g2_WriteBufferPBM,void,"u8g2_t*, void (*)(const char*)" -Function,-,u8g2_WriteBufferPBM2,void,"u8g2_t*, void (*)(const char*)" -Function,-,u8g2_WriteBufferXBM,void,"u8g2_t*, void (*)(const char*)" -Function,-,u8g2_WriteBufferXBM2,void,"u8g2_t*, void (*)(const char*)" -Function,-,u8g2_add_vector_x,u8g2_uint_t,"u8g2_uint_t, int8_t, int8_t, uint8_t" -Function,-,u8g2_add_vector_y,u8g2_uint_t,"u8g2_uint_t, int8_t, int8_t, uint8_t" -Function,-,u8g2_draw_l90_r0,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" -Function,-,u8g2_ll_hvline_horizontal_right_lsb,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" -Function,-,u8g2_ll_hvline_vertical_top_lsb,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, uint8_t" -Function,-,u8g2_m_11_6_1,uint8_t*,uint8_t* -Function,-,u8g2_m_11_6_2,uint8_t*,uint8_t* -Function,-,u8g2_m_11_6_f,uint8_t*,uint8_t* -Function,-,u8g2_m_12_12_1,uint8_t*,uint8_t* -Function,-,u8g2_m_12_12_2,uint8_t*,uint8_t* -Function,-,u8g2_m_12_12_f,uint8_t*,uint8_t* -Function,-,u8g2_m_12_2_1,uint8_t*,uint8_t* -Function,-,u8g2_m_12_2_2,uint8_t*,uint8_t* -Function,-,u8g2_m_12_2_f,uint8_t*,uint8_t* -Function,-,u8g2_m_12_8_1,uint8_t*,uint8_t* -Function,-,u8g2_m_12_8_2,uint8_t*,uint8_t* -Function,-,u8g2_m_12_8_f,uint8_t*,uint8_t* -Function,-,u8g2_m_12_9_1,uint8_t*,uint8_t* -Function,-,u8g2_m_12_9_2,uint8_t*,uint8_t* -Function,-,u8g2_m_12_9_f,uint8_t*,uint8_t* -Function,-,u8g2_m_13_8_1,uint8_t*,uint8_t* -Function,-,u8g2_m_13_8_2,uint8_t*,uint8_t* -Function,-,u8g2_m_13_8_f,uint8_t*,uint8_t* -Function,-,u8g2_m_16_12_1,uint8_t*,uint8_t* -Function,-,u8g2_m_16_12_2,uint8_t*,uint8_t* -Function,-,u8g2_m_16_12_f,uint8_t*,uint8_t* -Function,-,u8g2_m_16_16_1,uint8_t*,uint8_t* -Function,-,u8g2_m_16_16_2,uint8_t*,uint8_t* -Function,-,u8g2_m_16_16_f,uint8_t*,uint8_t* -Function,-,u8g2_m_16_4_1,uint8_t*,uint8_t* -Function,-,u8g2_m_16_4_2,uint8_t*,uint8_t* -Function,-,u8g2_m_16_4_f,uint8_t*,uint8_t* -Function,-,u8g2_m_16_8_1,uint8_t*,uint8_t* -Function,-,u8g2_m_16_8_2,uint8_t*,uint8_t* -Function,-,u8g2_m_16_8_f,uint8_t*,uint8_t* -Function,-,u8g2_m_17_4_1,uint8_t*,uint8_t* -Function,-,u8g2_m_17_4_2,uint8_t*,uint8_t* -Function,-,u8g2_m_17_4_f,uint8_t*,uint8_t* -Function,-,u8g2_m_17_8_1,uint8_t*,uint8_t* -Function,-,u8g2_m_17_8_2,uint8_t*,uint8_t* -Function,-,u8g2_m_17_8_f,uint8_t*,uint8_t* -Function,-,u8g2_m_18_21_1,uint8_t*,uint8_t* -Function,-,u8g2_m_18_21_2,uint8_t*,uint8_t* -Function,-,u8g2_m_18_21_f,uint8_t*,uint8_t* -Function,-,u8g2_m_1_1_1,uint8_t*,uint8_t* -Function,-,u8g2_m_1_1_2,uint8_t*,uint8_t* -Function,-,u8g2_m_1_1_f,uint8_t*,uint8_t* -Function,-,u8g2_m_20_10_1,uint8_t*,uint8_t* -Function,-,u8g2_m_20_10_2,uint8_t*,uint8_t* -Function,-,u8g2_m_20_10_f,uint8_t*,uint8_t* -Function,-,u8g2_m_20_13_1,uint8_t*,uint8_t* -Function,-,u8g2_m_20_13_2,uint8_t*,uint8_t* -Function,-,u8g2_m_20_13_f,uint8_t*,uint8_t* -Function,-,u8g2_m_20_16_1,uint8_t*,uint8_t* -Function,-,u8g2_m_20_16_2,uint8_t*,uint8_t* -Function,-,u8g2_m_20_16_f,uint8_t*,uint8_t* -Function,-,u8g2_m_20_20_1,uint8_t*,uint8_t* -Function,-,u8g2_m_20_20_2,uint8_t*,uint8_t* -Function,-,u8g2_m_20_20_f,uint8_t*,uint8_t* -Function,-,u8g2_m_22_13_1,uint8_t*,uint8_t* -Function,-,u8g2_m_22_13_2,uint8_t*,uint8_t* -Function,-,u8g2_m_22_13_f,uint8_t*,uint8_t* -Function,-,u8g2_m_22_9_1,uint8_t*,uint8_t* -Function,-,u8g2_m_22_9_2,uint8_t*,uint8_t* -Function,-,u8g2_m_22_9_f,uint8_t*,uint8_t* -Function,-,u8g2_m_24_12_1,uint8_t*,uint8_t* -Function,-,u8g2_m_24_12_2,uint8_t*,uint8_t* -Function,-,u8g2_m_24_12_f,uint8_t*,uint8_t* -Function,-,u8g2_m_24_4_1,uint8_t*,uint8_t* -Function,-,u8g2_m_24_4_2,uint8_t*,uint8_t* -Function,-,u8g2_m_24_4_f,uint8_t*,uint8_t* -Function,-,u8g2_m_24_8_1,uint8_t*,uint8_t* -Function,-,u8g2_m_24_8_2,uint8_t*,uint8_t* -Function,-,u8g2_m_24_8_f,uint8_t*,uint8_t* -Function,-,u8g2_m_25_25_1,uint8_t*,uint8_t* -Function,-,u8g2_m_25_25_2,uint8_t*,uint8_t* -Function,-,u8g2_m_25_25_f,uint8_t*,uint8_t* -Function,-,u8g2_m_30_15_1,uint8_t*,uint8_t* -Function,-,u8g2_m_30_15_2,uint8_t*,uint8_t* -Function,-,u8g2_m_30_15_f,uint8_t*,uint8_t* -Function,-,u8g2_m_30_16_1,uint8_t*,uint8_t* -Function,-,u8g2_m_30_16_2,uint8_t*,uint8_t* -Function,-,u8g2_m_30_16_f,uint8_t*,uint8_t* -Function,-,u8g2_m_30_20_1,uint8_t*,uint8_t* -Function,-,u8g2_m_30_20_2,uint8_t*,uint8_t* -Function,-,u8g2_m_30_20_f,uint8_t*,uint8_t* -Function,-,u8g2_m_30_8_1,uint8_t*,uint8_t* -Function,-,u8g2_m_30_8_2,uint8_t*,uint8_t* -Function,-,u8g2_m_30_8_f,uint8_t*,uint8_t* -Function,-,u8g2_m_32_16_1,uint8_t*,uint8_t* -Function,-,u8g2_m_32_16_2,uint8_t*,uint8_t* -Function,-,u8g2_m_32_16_f,uint8_t*,uint8_t* -Function,-,u8g2_m_32_20_1,uint8_t*,uint8_t* -Function,-,u8g2_m_32_20_2,uint8_t*,uint8_t* -Function,-,u8g2_m_32_20_f,uint8_t*,uint8_t* -Function,-,u8g2_m_32_4_1,uint8_t*,uint8_t* -Function,-,u8g2_m_32_4_2,uint8_t*,uint8_t* -Function,-,u8g2_m_32_4_f,uint8_t*,uint8_t* -Function,-,u8g2_m_32_8_1,uint8_t*,uint8_t* -Function,-,u8g2_m_32_8_2,uint8_t*,uint8_t* -Function,-,u8g2_m_32_8_f,uint8_t*,uint8_t* -Function,-,u8g2_m_37_16_1,uint8_t*,uint8_t* -Function,-,u8g2_m_37_16_2,uint8_t*,uint8_t* -Function,-,u8g2_m_37_16_f,uint8_t*,uint8_t* -Function,-,u8g2_m_40_30_1,uint8_t*,uint8_t* -Function,-,u8g2_m_40_30_2,uint8_t*,uint8_t* -Function,-,u8g2_m_40_30_f,uint8_t*,uint8_t* -Function,-,u8g2_m_48_17_1,uint8_t*,uint8_t* -Function,-,u8g2_m_48_17_2,uint8_t*,uint8_t* -Function,-,u8g2_m_48_17_f,uint8_t*,uint8_t* -Function,-,u8g2_m_48_30_1,uint8_t*,uint8_t* -Function,-,u8g2_m_48_30_2,uint8_t*,uint8_t* -Function,-,u8g2_m_48_30_f,uint8_t*,uint8_t* -Function,-,u8g2_m_4_1_1,uint8_t*,uint8_t* -Function,-,u8g2_m_4_1_2,uint8_t*,uint8_t* -Function,-,u8g2_m_4_1_f,uint8_t*,uint8_t* -Function,-,u8g2_m_50_30_1,uint8_t*,uint8_t* -Function,-,u8g2_m_50_30_2,uint8_t*,uint8_t* -Function,-,u8g2_m_50_30_f,uint8_t*,uint8_t* -Function,-,u8g2_m_6_8_1,uint8_t*,uint8_t* -Function,-,u8g2_m_6_8_2,uint8_t*,uint8_t* -Function,-,u8g2_m_6_8_f,uint8_t*,uint8_t* -Function,-,u8g2_m_8_16_1,uint8_t*,uint8_t* -Function,-,u8g2_m_8_16_2,uint8_t*,uint8_t* -Function,-,u8g2_m_8_16_f,uint8_t*,uint8_t* -Function,-,u8g2_m_8_1_1,uint8_t*,uint8_t* -Function,-,u8g2_m_8_1_2,uint8_t*,uint8_t* -Function,-,u8g2_m_8_1_f,uint8_t*,uint8_t* -Function,-,u8g2_m_8_4_1,uint8_t*,uint8_t* -Function,-,u8g2_m_8_4_2,uint8_t*,uint8_t* -Function,-,u8g2_m_8_4_f,uint8_t*,uint8_t* -Function,-,u8g2_m_8_6_1,uint8_t*,uint8_t* -Function,-,u8g2_m_8_6_2,uint8_t*,uint8_t* -Function,-,u8g2_m_8_6_f,uint8_t*,uint8_t* -Function,-,u8g2_m_9_5_1,uint8_t*,uint8_t* -Function,-,u8g2_m_9_5_2,uint8_t*,uint8_t* -Function,-,u8g2_m_9_5_f,uint8_t*,uint8_t* -Function,-,u8g_sdl_get_key,int, -Function,-,u8log_Init,void,"u8log_t*, uint8_t, uint8_t, uint8_t*" -Function,-,u8log_SetCallback,void,"u8log_t*, u8log_cb, void*" -Function,-,u8log_SetLineHeightOffset,void,"u8log_t*, int8_t" -Function,-,u8log_SetRedrawMode,void,"u8log_t*, uint8_t" -Function,-,u8log_WriteChar,void,"u8log_t*, uint8_t" -Function,-,u8log_WriteDec16,void,"u8log_t*, uint16_t, uint8_t" -Function,-,u8log_WriteDec8,void,"u8log_t*, uint8_t, uint8_t" -Function,-,u8log_WriteHex16,void,"u8log_t*, uint16_t" -Function,-,u8log_WriteHex32,void,"u8log_t*, uint32_t" -Function,-,u8log_WriteHex8,void,"u8log_t*, uint8_t" -Function,-,u8log_WriteString,void,"u8log_t*, const char*" -Function,-,u8log_u8g2_cb,void,u8log_t* -Function,-,u8log_u8x8_cb,void,u8log_t* -Function,-,u8sl_Next,void,u8sl_t* -Function,-,u8sl_Prev,void,u8sl_t* -Function,-,u8x8_ClearDisplay,void,u8x8_t* -Function,-,u8x8_ClearDisplayWithTile,void,"u8x8_t*, const uint8_t*" -Function,-,u8x8_ClearLine,void,"u8x8_t*, uint8_t" -Function,-,u8x8_ConnectBitmapToU8x8,uint8_t,u8x8_t* -Function,-,u8x8_CopyStringLine,void,"char*, uint8_t, const char*" -Function,-,u8x8_Draw1x2Glyph,void,"u8x8_t*, uint8_t, uint8_t, uint8_t" -Function,-,u8x8_Draw1x2String,uint8_t,"u8x8_t*, uint8_t, uint8_t, const char*" -Function,-,u8x8_Draw1x2UTF8,uint8_t,"u8x8_t*, uint8_t, uint8_t, const char*" -Function,-,u8x8_Draw2x2Glyph,void,"u8x8_t*, uint8_t, uint8_t, uint8_t" -Function,-,u8x8_Draw2x2String,uint8_t,"u8x8_t*, uint8_t, uint8_t, const char*" -Function,-,u8x8_Draw2x2UTF8,uint8_t,"u8x8_t*, uint8_t, uint8_t, const char*" -Function,-,u8x8_DrawGlyph,void,"u8x8_t*, uint8_t, uint8_t, uint8_t" -Function,-,u8x8_DrawLog,void,"u8x8_t*, uint8_t, uint8_t, u8log_t*" -Function,-,u8x8_DrawString,uint8_t,"u8x8_t*, uint8_t, uint8_t, const char*" -Function,-,u8x8_DrawTile,uint8_t,"u8x8_t*, uint8_t, uint8_t, uint8_t, uint8_t*" -Function,-,u8x8_DrawUTF8,uint8_t,"u8x8_t*, uint8_t, uint8_t, const char*" -Function,-,u8x8_DrawUTF8Line,uint8_t,"u8x8_t*, uint8_t, uint8_t, uint8_t, const char*" -Function,-,u8x8_DrawUTF8Lines,uint8_t,"u8x8_t*, uint8_t, uint8_t, uint8_t, const char*" -Function,-,u8x8_FillDisplay,void,u8x8_t* -Function,-,u8x8_GetBitmapPixel,uint8_t,"u8x8_t*, uint16_t, uint16_t" -Function,-,u8x8_GetMenuEvent,uint8_t,u8x8_t* -Function,-,u8x8_GetStringLineCnt,uint8_t,const char* -Function,-,u8x8_GetStringLineStart,const char*,"uint8_t, const char*" -Function,-,u8x8_GetUTF8Len,uint8_t,"u8x8_t*, const char*" -Function,-,u8x8_InitDisplay,void,u8x8_t* -Function,-,u8x8_RefreshDisplay,void,u8x8_t* -Function,-,u8x8_SaveBitmapTGA,void,"u8x8_t*, const char*" -Function,-,u8x8_SendF,void,"u8x8_t*, const char*, ..." -Function,-,u8x8_SetContrast,void,"u8x8_t*, uint8_t" -Function,-,u8x8_SetFlipMode,void,"u8x8_t*, uint8_t" -Function,-,u8x8_SetFont,void,"u8x8_t*, const uint8_t*" -Function,-,u8x8_SetPowerSave,void,"u8x8_t*, uint8_t" -Function,-,u8x8_Setup,void,"u8x8_t*, u8x8_msg_cb, u8x8_msg_cb, u8x8_msg_cb, u8x8_msg_cb" -Function,-,u8x8_SetupBitmap,void,"u8x8_t*, uint16_t, uint16_t" -Function,-,u8x8_SetupDefaults,void,u8x8_t* -Function,-,u8x8_SetupMemory,void,u8x8_t* -Function,-,u8x8_SetupStdio,void,u8x8_t* -Function,-,u8x8_Setup_SDL_128x64,void,u8x8_t* -Function,-,u8x8_Setup_SDL_240x160,void,u8x8_t* -Function,-,u8x8_Setup_TGA_DESC,void,u8x8_t* -Function,-,u8x8_Setup_TGA_LCD,void,u8x8_t* -Function,-,u8x8_Setup_Utf8,void,u8x8_t* -Function,-,u8x8_UserInterfaceInputValue,uint8_t,"u8x8_t*, const char*, const char*, uint8_t*, uint8_t, uint8_t, uint8_t, const char*" -Function,-,u8x8_UserInterfaceMessage,uint8_t,"u8x8_t*, const char*, const char*, const char*, const char*" -Function,-,u8x8_UserInterfaceSelectionList,uint8_t,"u8x8_t*, const char*, uint8_t, const char*" -Function,-,u8x8_ascii_next,uint16_t,"u8x8_t*, uint8_t" -Function,-,u8x8_byte_3wire_sw_spi,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_byte_4wire_sw_spi,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_byte_8bit_6800mode,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_byte_8bit_8080mode,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_byte_EndTransfer,uint8_t,u8x8_t* -Function,-,u8x8_byte_SendByte,uint8_t,"u8x8_t*, uint8_t" -Function,-,u8x8_byte_SendBytes,uint8_t,"u8x8_t*, uint8_t, uint8_t*" -Function,-,u8x8_byte_SetDC,uint8_t,"u8x8_t*, uint8_t" -Function,-,u8x8_byte_StartTransfer,uint8_t,u8x8_t* -Function,-,u8x8_byte_empty,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_byte_ks0108,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_byte_sed1520,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_byte_set_ks0108_cs,void,"u8x8_t*, uint8_t" -Function,-,u8x8_byte_ssd13xx_sw_i2c,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_byte_sw_i2c,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_001,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_011,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_100,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_110,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_EndTransfer,uint8_t,u8x8_t* -Function,-,u8x8_cad_SendArg,uint8_t,"u8x8_t*, uint8_t" -Function,-,u8x8_cad_SendCmd,uint8_t,"u8x8_t*, uint8_t" -Function,-,u8x8_cad_SendData,uint8_t,"u8x8_t*, uint8_t, uint8_t*" -Function,-,u8x8_cad_SendMultipleArg,uint8_t,"u8x8_t*, uint8_t, uint8_t" -Function,-,u8x8_cad_SendSequence,void,"u8x8_t*, const uint8_t*" -Function,-,u8x8_cad_StartTransfer,uint8_t,u8x8_t* -Function,-,u8x8_cad_empty,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_ld7032_i2c,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_ssd13xx_fast_i2c,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_ssd13xx_i2c,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_st75256_i2c,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_st7920_spi,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_uc16xx_i2c,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_cad_vsendf,void,"u8x8_t*, const char*, va_list" -Function,-,u8x8_capture_get_pixel_1,uint8_t,"uint16_t, uint16_t, uint8_t*, uint8_t" -Function,-,u8x8_capture_get_pixel_2,uint8_t,"uint16_t, uint16_t, uint8_t*, uint8_t" -Function,-,u8x8_capture_write_pbm_buffer,void,"uint8_t*, uint8_t, uint8_t, uint8_t (*)(uint16_t, uint16_t, uint8_t*, uint8_t), void (*)(const char*)" -Function,-,u8x8_capture_write_pbm_pre,void,"uint8_t, uint8_t, void (*)(const char*)" -Function,-,u8x8_capture_write_xbm_buffer,void,"uint8_t*, uint8_t, uint8_t, uint8_t (*)(uint16_t, uint16_t, uint8_t*, uint8_t), void (*)(const char*)" -Function,-,u8x8_capture_write_xbm_pre,void,"uint8_t, uint8_t, void (*)(const char*)" -Function,-,u8x8_d_a2printer_384x240,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_helper_display_init,void,u8x8_t* -Function,-,u8x8_d_helper_display_setup_memory,void,"u8x8_t*, const u8x8_display_info_t*" -Function,-,u8x8_d_hx1230_96x68,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_il3820_296x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_il3820_v2_296x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ist3020_erc19264,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ist7920_128x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ks0108_128x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ks0108_erm19264,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_lc7981_160x160,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_lc7981_160x80,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_lc7981_240x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_lc7981_240x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ld7032_60x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ls013b7dh03_128x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ls013b7dh05_144x168,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ls027b7dh01_400x240,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_max7219_16x16,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_max7219_32x8,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_max7219_64x8,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_max7219_8x8,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_nt7534_tg12864r,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_null_cb,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_pcd8544_84x48,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_pcf8812_96x65,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ra8835_320x240,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ra8835_nhd_240x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sbn1661_122x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sed1330_240x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sed1520_122x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1106_128x64_noname,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1106_128x64_vcomh0,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1106_128x64_winstar,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1106_64x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1106_72x40_wise,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1107_128x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1107_64x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1107_pimoroni_128x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1107_seeed_128x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1107_seeed_96x96,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1108_160x160,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_sh1122_256x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd0323_os128064,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1305_128x32_adafruit,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1305_128x32_noname,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1305_128x64_adafruit,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_128x32_univision,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_128x32_winstar,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_128x64_alt0,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_128x64_noname,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_128x64_vcomh0,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_48x64_winstar,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_64x32_1f,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_64x32_noname,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_64x48_er,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_72x40_er,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1306_96x16_er,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1309_128x64_noname0,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1309_128x64_noname2,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1316_128x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1317_96x96,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1318_128x96,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1318_128x96_xcp,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1322_nhd_128x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1322_nhd_256x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1325_nhd_128x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1326_er_256x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1327_ea_w128128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1327_midas_128x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1327_seeed_96x96,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1327_visionox_128x96,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1327_ws_128x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1327_ws_96x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1329_128x96_noname,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1606_172x72,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1607_200x200,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1607_gd_200x200,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1607_v2_200x200,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_ssd1607_ws_200x200,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7511_avd_320x240,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_jlx172104,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_jlx19296,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_jlx240160,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_jlx256128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_jlx256160,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_jlx256160_alt,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_jlx256160m,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_jlx25664,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75256_wo256x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7528_nhd_c160100,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st75320_jlx320240,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_64128n,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_ea_dogm128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_ea_dogm132,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_erc12864,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_erc12864_alt,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_jlx12864,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_lm6059,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_lm6063,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_lx12864,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_nhd_c12832,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_nhd_c12864,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7565_zolen_128x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7567_64x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7567_enh_dg128064,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7567_enh_dg128064i,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7567_jlx12864,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7567_os12864,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7567_pi_132x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7586s_erc240160,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7586s_s028hn118a,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7588_jlx12864,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7920_128x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_st7920_192x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_t6963_128x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_t6963_128x64_alt,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_t6963_160x80,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_t6963_240x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_t6963_240x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_t6963_256x64,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1601_128x32,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1604_jlx19264,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1608_240x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1608_erc240120,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1608_erc24064,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1610_ea_dogxl160,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1611_cg160160,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1611_ea_dogm240,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1611_ea_dogxl240,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1611_ew50850,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1617_jlx128128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1638_160x128,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1701_ea_dogs102,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_d_uc1701_mini12864,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_dummy_cb,uint8_t,"u8x8_t*, uint8_t, uint8_t, void*" -Function,-,u8x8_gpio_call,void,"u8x8_t*, uint8_t, uint8_t" -Function,-,u8x8_u16toa,const char*,"uint16_t, uint8_t" -Function,-,u8x8_u8toa,const char*,"uint8_t, uint8_t" -Function,-,u8x8_upscale_byte,uint16_t,uint8_t -Function,-,u8x8_utf8_init,void,u8x8_t* -Function,-,u8x8_utf8_next,uint16_t,"u8x8_t*, uint8_t" -Function,-,u8x8_utoa,const char*,uint16_t Function,-,uECC_compress,void,"const uint8_t*, uint8_t*, uECC_Curve" Function,+,uECC_compute_public_key,int,"const uint8_t*, uint8_t*, uECC_Curve" Function,-,uECC_curve_private_key_size,int,uECC_Curve @@ -4523,7 +3452,6 @@ Function,-,ulTaskGetIdleRunTimePercent,uint32_t, Function,-,ungetc,int,"int, FILE*" Function,-,unsetenv,int,const char* Function,-,usbd_poll,void,usbd_device* -Function,-,utf8_show,void, Function,-,utoa,char*,"unsigned, char*, int" Function,-,uxListRemove,UBaseType_t,ListItem_t* Function,-,uxTaskGetNumberOfTasks,UBaseType_t, @@ -5150,1831 +4078,6 @@ Variable,-,subghz_protocol_star_line,const SubGhzProtocol, Variable,-,subghz_protocol_star_line_decoder,const SubGhzProtocolDecoder, Variable,-,subghz_protocol_star_line_encoder,const SubGhzProtocolEncoder, Variable,-,suboptarg,char*, -Variable,-,u8g2_cb_mirror,const u8g2_cb_t, -Variable,-,u8g2_cb_r0,const u8g2_cb_t, -Variable,-,u8g2_cb_r1,const u8g2_cb_t, -Variable,-,u8g2_cb_r2,const u8g2_cb_t, -Variable,-,u8g2_cb_r3,const u8g2_cb_t, -Variable,-,u8g2_font_10x20_me,const uint8_t[], -Variable,-,u8g2_font_10x20_mf,const uint8_t[], -Variable,-,u8g2_font_10x20_mn,const uint8_t[], -Variable,-,u8g2_font_10x20_mr,const uint8_t[], -Variable,-,u8g2_font_10x20_t_arabic,const uint8_t[], -Variable,-,u8g2_font_10x20_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_10x20_t_greek,const uint8_t[], -Variable,-,u8g2_font_10x20_te,const uint8_t[], -Variable,-,u8g2_font_10x20_tf,const uint8_t[], -Variable,-,u8g2_font_10x20_tn,const uint8_t[], -Variable,-,u8g2_font_10x20_tr,const uint8_t[], -Variable,-,u8g2_font_4x6_mf,const uint8_t[], -Variable,-,u8g2_font_4x6_mn,const uint8_t[], -Variable,-,u8g2_font_4x6_mr,const uint8_t[], -Variable,-,u8g2_font_4x6_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_4x6_tf,const uint8_t[], -Variable,-,u8g2_font_4x6_tn,const uint8_t[], -Variable,-,u8g2_font_4x6_tr,const uint8_t[], -Variable,-,u8g2_font_5x7_mf,const uint8_t[], -Variable,-,u8g2_font_5x7_mn,const uint8_t[], -Variable,-,u8g2_font_5x7_mr,const uint8_t[], -Variable,-,u8g2_font_5x7_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_5x7_tf,const uint8_t[], -Variable,-,u8g2_font_5x7_tn,const uint8_t[], -Variable,-,u8g2_font_5x7_tr,const uint8_t[], -Variable,-,u8g2_font_5x8_mf,const uint8_t[], -Variable,-,u8g2_font_5x8_mn,const uint8_t[], -Variable,-,u8g2_font_5x8_mr,const uint8_t[], -Variable,-,u8g2_font_5x8_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_5x8_tf,const uint8_t[], -Variable,-,u8g2_font_5x8_tn,const uint8_t[], -Variable,-,u8g2_font_5x8_tr,const uint8_t[], -Variable,-,u8g2_font_6x10_mf,const uint8_t[], -Variable,-,u8g2_font_6x10_mn,const uint8_t[], -Variable,-,u8g2_font_6x10_mr,const uint8_t[], -Variable,-,u8g2_font_6x10_tf,const uint8_t[], -Variable,-,u8g2_font_6x10_tn,const uint8_t[], -Variable,-,u8g2_font_6x10_tr,const uint8_t[], -Variable,-,u8g2_font_6x12_m_symbols,const uint8_t[], -Variable,-,u8g2_font_6x12_me,const uint8_t[], -Variable,-,u8g2_font_6x12_mf,const uint8_t[], -Variable,-,u8g2_font_6x12_mn,const uint8_t[], -Variable,-,u8g2_font_6x12_mr,const uint8_t[], -Variable,-,u8g2_font_6x12_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_6x12_t_symbols,const uint8_t[], -Variable,-,u8g2_font_6x12_te,const uint8_t[], -Variable,-,u8g2_font_6x12_tf,const uint8_t[], -Variable,-,u8g2_font_6x12_tn,const uint8_t[], -Variable,-,u8g2_font_6x12_tr,const uint8_t[], -Variable,-,u8g2_font_6x13B_mf,const uint8_t[], -Variable,-,u8g2_font_6x13B_mn,const uint8_t[], -Variable,-,u8g2_font_6x13B_mr,const uint8_t[], -Variable,-,u8g2_font_6x13B_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_6x13B_t_hebrew,const uint8_t[], -Variable,-,u8g2_font_6x13B_tf,const uint8_t[], -Variable,-,u8g2_font_6x13B_tn,const uint8_t[], -Variable,-,u8g2_font_6x13B_tr,const uint8_t[], -Variable,-,u8g2_font_6x13O_mf,const uint8_t[], -Variable,-,u8g2_font_6x13O_mn,const uint8_t[], -Variable,-,u8g2_font_6x13O_mr,const uint8_t[], -Variable,-,u8g2_font_6x13O_tf,const uint8_t[], -Variable,-,u8g2_font_6x13O_tn,const uint8_t[], -Variable,-,u8g2_font_6x13O_tr,const uint8_t[], -Variable,-,u8g2_font_6x13_me,const uint8_t[], -Variable,-,u8g2_font_6x13_mf,const uint8_t[], -Variable,-,u8g2_font_6x13_mn,const uint8_t[], -Variable,-,u8g2_font_6x13_mr,const uint8_t[], -Variable,-,u8g2_font_6x13_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_6x13_t_hebrew,const uint8_t[], -Variable,-,u8g2_font_6x13_te,const uint8_t[], -Variable,-,u8g2_font_6x13_tf,const uint8_t[], -Variable,-,u8g2_font_6x13_tn,const uint8_t[], -Variable,-,u8g2_font_6x13_tr,const uint8_t[], -Variable,-,u8g2_font_7Segments_26x42_mn,const uint8_t[], -Variable,-,u8g2_font_7x13B_mf,const uint8_t[], -Variable,-,u8g2_font_7x13B_mn,const uint8_t[], -Variable,-,u8g2_font_7x13B_mr,const uint8_t[], -Variable,-,u8g2_font_7x13B_tf,const uint8_t[], -Variable,-,u8g2_font_7x13B_tn,const uint8_t[], -Variable,-,u8g2_font_7x13B_tr,const uint8_t[], -Variable,-,u8g2_font_7x13O_mf,const uint8_t[], -Variable,-,u8g2_font_7x13O_mn,const uint8_t[], -Variable,-,u8g2_font_7x13O_mr,const uint8_t[], -Variable,-,u8g2_font_7x13O_tf,const uint8_t[], -Variable,-,u8g2_font_7x13O_tn,const uint8_t[], -Variable,-,u8g2_font_7x13O_tr,const uint8_t[], -Variable,-,u8g2_font_7x13_m_symbols,const uint8_t[], -Variable,-,u8g2_font_7x13_me,const uint8_t[], -Variable,-,u8g2_font_7x13_mf,const uint8_t[], -Variable,-,u8g2_font_7x13_mn,const uint8_t[], -Variable,-,u8g2_font_7x13_mr,const uint8_t[], -Variable,-,u8g2_font_7x13_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_7x13_t_symbols,const uint8_t[], -Variable,-,u8g2_font_7x13_te,const uint8_t[], -Variable,-,u8g2_font_7x13_tf,const uint8_t[], -Variable,-,u8g2_font_7x13_tn,const uint8_t[], -Variable,-,u8g2_font_7x13_tr,const uint8_t[], -Variable,-,u8g2_font_7x14B_mf,const uint8_t[], -Variable,-,u8g2_font_7x14B_mn,const uint8_t[], -Variable,-,u8g2_font_7x14B_mr,const uint8_t[], -Variable,-,u8g2_font_7x14B_tf,const uint8_t[], -Variable,-,u8g2_font_7x14B_tn,const uint8_t[], -Variable,-,u8g2_font_7x14B_tr,const uint8_t[], -Variable,-,u8g2_font_7x14_mf,const uint8_t[], -Variable,-,u8g2_font_7x14_mn,const uint8_t[], -Variable,-,u8g2_font_7x14_mr,const uint8_t[], -Variable,-,u8g2_font_7x14_tf,const uint8_t[], -Variable,-,u8g2_font_7x14_tn,const uint8_t[], -Variable,-,u8g2_font_7x14_tr,const uint8_t[], -Variable,-,u8g2_font_8x13B_mf,const uint8_t[], -Variable,-,u8g2_font_8x13B_mn,const uint8_t[], -Variable,-,u8g2_font_8x13B_mr,const uint8_t[], -Variable,-,u8g2_font_8x13B_tf,const uint8_t[], -Variable,-,u8g2_font_8x13B_tn,const uint8_t[], -Variable,-,u8g2_font_8x13B_tr,const uint8_t[], -Variable,-,u8g2_font_8x13O_mf,const uint8_t[], -Variable,-,u8g2_font_8x13O_mn,const uint8_t[], -Variable,-,u8g2_font_8x13O_mr,const uint8_t[], -Variable,-,u8g2_font_8x13O_tf,const uint8_t[], -Variable,-,u8g2_font_8x13O_tn,const uint8_t[], -Variable,-,u8g2_font_8x13O_tr,const uint8_t[], -Variable,-,u8g2_font_8x13_m_symbols,const uint8_t[], -Variable,-,u8g2_font_8x13_me,const uint8_t[], -Variable,-,u8g2_font_8x13_mf,const uint8_t[], -Variable,-,u8g2_font_8x13_mn,const uint8_t[], -Variable,-,u8g2_font_8x13_mr,const uint8_t[], -Variable,-,u8g2_font_8x13_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_8x13_t_symbols,const uint8_t[], -Variable,-,u8g2_font_8x13_te,const uint8_t[], -Variable,-,u8g2_font_8x13_tf,const uint8_t[], -Variable,-,u8g2_font_8x13_tn,const uint8_t[], -Variable,-,u8g2_font_8x13_tr,const uint8_t[], -Variable,-,u8g2_font_9x15B_mf,const uint8_t[], -Variable,-,u8g2_font_9x15B_mn,const uint8_t[], -Variable,-,u8g2_font_9x15B_mr,const uint8_t[], -Variable,-,u8g2_font_9x15B_tf,const uint8_t[], -Variable,-,u8g2_font_9x15B_tn,const uint8_t[], -Variable,-,u8g2_font_9x15B_tr,const uint8_t[], -Variable,-,u8g2_font_9x15_m_symbols,const uint8_t[], -Variable,-,u8g2_font_9x15_me,const uint8_t[], -Variable,-,u8g2_font_9x15_mf,const uint8_t[], -Variable,-,u8g2_font_9x15_mn,const uint8_t[], -Variable,-,u8g2_font_9x15_mr,const uint8_t[], -Variable,-,u8g2_font_9x15_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_9x15_t_symbols,const uint8_t[], -Variable,-,u8g2_font_9x15_te,const uint8_t[], -Variable,-,u8g2_font_9x15_tf,const uint8_t[], -Variable,-,u8g2_font_9x15_tn,const uint8_t[], -Variable,-,u8g2_font_9x15_tr,const uint8_t[], -Variable,-,u8g2_font_9x18B_mf,const uint8_t[], -Variable,-,u8g2_font_9x18B_mn,const uint8_t[], -Variable,-,u8g2_font_9x18B_mr,const uint8_t[], -Variable,-,u8g2_font_9x18B_tf,const uint8_t[], -Variable,-,u8g2_font_9x18B_tn,const uint8_t[], -Variable,-,u8g2_font_9x18B_tr,const uint8_t[], -Variable,-,u8g2_font_9x18_mf,const uint8_t[], -Variable,-,u8g2_font_9x18_mn,const uint8_t[], -Variable,-,u8g2_font_9x18_mr,const uint8_t[], -Variable,-,u8g2_font_9x18_tf,const uint8_t[], -Variable,-,u8g2_font_9x18_tn,const uint8_t[], -Variable,-,u8g2_font_9x18_tr,const uint8_t[], -Variable,-,u8g2_font_BBSesque_te,const uint8_t[], -Variable,-,u8g2_font_BBSesque_tf,const uint8_t[], -Variable,-,u8g2_font_BBSesque_tr,const uint8_t[], -Variable,-,u8g2_font_BitTypeWriter_te,const uint8_t[], -Variable,-,u8g2_font_BitTypeWriter_tr,const uint8_t[], -Variable,-,u8g2_font_Born2bSportySlab_t_all,const uint8_t[], -Variable,-,u8g2_font_Born2bSportySlab_te,const uint8_t[], -Variable,-,u8g2_font_Born2bSportySlab_tf,const uint8_t[], -Variable,-,u8g2_font_Born2bSportySlab_tr,const uint8_t[], -Variable,-,u8g2_font_Born2bSportyV2_te,const uint8_t[], -Variable,-,u8g2_font_Born2bSportyV2_tf,const uint8_t[], -Variable,-,u8g2_font_Born2bSportyV2_tr,const uint8_t[], -Variable,-,u8g2_font_CursivePixel_tr,const uint8_t[], -Variable,-,u8g2_font_DigitalDiscoThin_te,const uint8_t[], -Variable,-,u8g2_font_DigitalDiscoThin_tf,const uint8_t[], -Variable,-,u8g2_font_DigitalDiscoThin_tn,const uint8_t[], -Variable,-,u8g2_font_DigitalDiscoThin_tr,const uint8_t[], -Variable,-,u8g2_font_DigitalDiscoThin_tu,const uint8_t[], -Variable,-,u8g2_font_DigitalDisco_te,const uint8_t[], -Variable,-,u8g2_font_DigitalDisco_tf,const uint8_t[], -Variable,-,u8g2_font_DigitalDisco_tn,const uint8_t[], -Variable,-,u8g2_font_DigitalDisco_tr,const uint8_t[], -Variable,-,u8g2_font_DigitalDisco_tu,const uint8_t[], -Variable,-,u8g2_font_Engrish_tf,const uint8_t[], -Variable,-,u8g2_font_Engrish_tr,const uint8_t[], -Variable,-,u8g2_font_Georgia7px_te,const uint8_t[], -Variable,-,u8g2_font_Georgia7px_tf,const uint8_t[], -Variable,-,u8g2_font_Georgia7px_tr,const uint8_t[], -Variable,-,u8g2_font_HelvetiPixelOutline_te,const uint8_t[], -Variable,-,u8g2_font_HelvetiPixelOutline_tr,const uint8_t[], -Variable,-,u8g2_font_HelvetiPixel_tr,const uint8_t[], -Variable,-,u8g2_font_IPAandRUSLCD_te,const uint8_t[], -Variable,-,u8g2_font_IPAandRUSLCD_tf,const uint8_t[], -Variable,-,u8g2_font_IPAandRUSLCD_tr,const uint8_t[], -Variable,-,u8g2_font_ImpactBits_tr,const uint8_t[], -Variable,-,u8g2_font_Pixellari_te,const uint8_t[], -Variable,-,u8g2_font_Pixellari_tf,const uint8_t[], -Variable,-,u8g2_font_Pixellari_tn,const uint8_t[], -Variable,-,u8g2_font_Pixellari_tr,const uint8_t[], -Variable,-,u8g2_font_Pixellari_tu,const uint8_t[], -Variable,-,u8g2_font_TimesNewPixel_tr,const uint8_t[], -Variable,-,u8g2_font_Untitled16PixelSansSerifBitmap_tr,const uint8_t[], -Variable,-,u8g2_font_VCR_OSD_mf,const uint8_t[], -Variable,-,u8g2_font_VCR_OSD_mn,const uint8_t[], -Variable,-,u8g2_font_VCR_OSD_mr,const uint8_t[], -Variable,-,u8g2_font_VCR_OSD_mu,const uint8_t[], -Variable,-,u8g2_font_VCR_OSD_tf,const uint8_t[], -Variable,-,u8g2_font_VCR_OSD_tn,const uint8_t[], -Variable,-,u8g2_font_VCR_OSD_tr,const uint8_t[], -Variable,-,u8g2_font_VCR_OSD_tu,const uint8_t[], -Variable,-,u8g2_font_Wizzard_tr,const uint8_t[], -Variable,-,u8g2_font_adventurer_t_all,const uint8_t[], -Variable,-,u8g2_font_adventurer_tf,const uint8_t[], -Variable,-,u8g2_font_adventurer_tr,const uint8_t[], -Variable,-,u8g2_font_amstrad_cpc_extended_8f,const uint8_t[], -Variable,-,u8g2_font_amstrad_cpc_extended_8n,const uint8_t[], -Variable,-,u8g2_font_amstrad_cpc_extended_8r,const uint8_t[], -Variable,-,u8g2_font_amstrad_cpc_extended_8u,const uint8_t[], -Variable,-,u8g2_font_artossans8_8n,const uint8_t[], -Variable,-,u8g2_font_artossans8_8r,const uint8_t[], -Variable,-,u8g2_font_artossans8_8u,const uint8_t[], -Variable,-,u8g2_font_artosserif8_8n,const uint8_t[], -Variable,-,u8g2_font_artosserif8_8r,const uint8_t[], -Variable,-,u8g2_font_artosserif8_8u,const uint8_t[], -Variable,-,u8g2_font_astragal_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_astragal_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_astragal_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_b10_b_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_b10_b_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_b10_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_b10_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_b12_b_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_b12_b_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_b12_b_t_japanese3,const uint8_t[], -Variable,-,u8g2_font_b12_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_b12_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_b12_t_japanese3,const uint8_t[], -Variable,-,u8g2_font_b16_b_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_b16_b_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_b16_b_t_japanese3,const uint8_t[], -Variable,-,u8g2_font_b16_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_b16_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_b16_t_japanese3,const uint8_t[], -Variable,-,u8g2_font_baby_tf,const uint8_t[], -Variable,-,u8g2_font_baby_tn,const uint8_t[], -Variable,-,u8g2_font_baby_tr,const uint8_t[], -Variable,-,u8g2_font_balthasar_regular_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_balthasar_regular_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_balthasar_regular_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_balthasar_titling_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_balthasar_titling_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_balthasar_titling_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_battery19_tn,const uint8_t[], -Variable,-,u8g2_font_bauhaus2015_tn,const uint8_t[], -Variable,-,u8g2_font_bauhaus2015_tr,const uint8_t[], -Variable,-,u8g2_font_beanstalk_mel_tn,const uint8_t[], -Variable,-,u8g2_font_beanstalk_mel_tr,const uint8_t[], -Variable,-,u8g2_font_bitcasual_t_all,const uint8_t[], -Variable,-,u8g2_font_bitcasual_tf,const uint8_t[], -Variable,-,u8g2_font_bitcasual_tn,const uint8_t[], -Variable,-,u8g2_font_bitcasual_tr,const uint8_t[], -Variable,-,u8g2_font_bitcasual_tu,const uint8_t[], -Variable,-,u8g2_font_blipfest_07_tn,const uint8_t[], -Variable,-,u8g2_font_blipfest_07_tr,const uint8_t[], -Variable,-,u8g2_font_bracketedbabies_tr,const uint8_t[], -Variable,-,u8g2_font_bubble_tn,const uint8_t[], -Variable,-,u8g2_font_bubble_tr,const uint8_t[], -Variable,-,u8g2_font_calibration_gothic_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_calibration_gothic_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_calibration_gothic_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_calibration_gothic_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_cardimon_pixel_tf,const uint8_t[], -Variable,-,u8g2_font_cardimon_pixel_tn,const uint8_t[], -Variable,-,u8g2_font_cardimon_pixel_tr,const uint8_t[], -Variable,-,u8g2_font_celibatemonk_tr,const uint8_t[], -Variable,-,u8g2_font_chikita_tf,const uint8_t[], -Variable,-,u8g2_font_chikita_tn,const uint8_t[], -Variable,-,u8g2_font_chikita_tr,const uint8_t[], -Variable,-,u8g2_font_chroma48medium8_8n,const uint8_t[], -Variable,-,u8g2_font_chroma48medium8_8r,const uint8_t[], -Variable,-,u8g2_font_chroma48medium8_8u,const uint8_t[], -Variable,-,u8g2_font_courB08_tf,const uint8_t[], -Variable,-,u8g2_font_courB08_tn,const uint8_t[], -Variable,-,u8g2_font_courB08_tr,const uint8_t[], -Variable,-,u8g2_font_courB10_tf,const uint8_t[], -Variable,-,u8g2_font_courB10_tn,const uint8_t[], -Variable,-,u8g2_font_courB10_tr,const uint8_t[], -Variable,-,u8g2_font_courB12_tf,const uint8_t[], -Variable,-,u8g2_font_courB12_tn,const uint8_t[], -Variable,-,u8g2_font_courB12_tr,const uint8_t[], -Variable,-,u8g2_font_courB14_tf,const uint8_t[], -Variable,-,u8g2_font_courB14_tn,const uint8_t[], -Variable,-,u8g2_font_courB14_tr,const uint8_t[], -Variable,-,u8g2_font_courB18_tf,const uint8_t[], -Variable,-,u8g2_font_courB18_tn,const uint8_t[], -Variable,-,u8g2_font_courB18_tr,const uint8_t[], -Variable,-,u8g2_font_courB24_tf,const uint8_t[], -Variable,-,u8g2_font_courB24_tn,const uint8_t[], -Variable,-,u8g2_font_courB24_tr,const uint8_t[], -Variable,-,u8g2_font_courR08_tf,const uint8_t[], -Variable,-,u8g2_font_courR08_tn,const uint8_t[], -Variable,-,u8g2_font_courR08_tr,const uint8_t[], -Variable,-,u8g2_font_courR10_tf,const uint8_t[], -Variable,-,u8g2_font_courR10_tn,const uint8_t[], -Variable,-,u8g2_font_courR10_tr,const uint8_t[], -Variable,-,u8g2_font_courR12_tf,const uint8_t[], -Variable,-,u8g2_font_courR12_tn,const uint8_t[], -Variable,-,u8g2_font_courR12_tr,const uint8_t[], -Variable,-,u8g2_font_courR14_tf,const uint8_t[], -Variable,-,u8g2_font_courR14_tn,const uint8_t[], -Variable,-,u8g2_font_courR14_tr,const uint8_t[], -Variable,-,u8g2_font_courR18_tf,const uint8_t[], -Variable,-,u8g2_font_courR18_tn,const uint8_t[], -Variable,-,u8g2_font_courR18_tr,const uint8_t[], -Variable,-,u8g2_font_courR24_tf,const uint8_t[], -Variable,-,u8g2_font_courR24_tn,const uint8_t[], -Variable,-,u8g2_font_courR24_tr,const uint8_t[], -Variable,-,u8g2_font_crox1c_mf,const uint8_t[], -Variable,-,u8g2_font_crox1c_mn,const uint8_t[], -Variable,-,u8g2_font_crox1c_mr,const uint8_t[], -Variable,-,u8g2_font_crox1c_tf,const uint8_t[], -Variable,-,u8g2_font_crox1c_tn,const uint8_t[], -Variable,-,u8g2_font_crox1c_tr,const uint8_t[], -Variable,-,u8g2_font_crox1cb_mf,const uint8_t[], -Variable,-,u8g2_font_crox1cb_mn,const uint8_t[], -Variable,-,u8g2_font_crox1cb_mr,const uint8_t[], -Variable,-,u8g2_font_crox1cb_tf,const uint8_t[], -Variable,-,u8g2_font_crox1cb_tn,const uint8_t[], -Variable,-,u8g2_font_crox1cb_tr,const uint8_t[], -Variable,-,u8g2_font_crox1h_tf,const uint8_t[], -Variable,-,u8g2_font_crox1h_tn,const uint8_t[], -Variable,-,u8g2_font_crox1h_tr,const uint8_t[], -Variable,-,u8g2_font_crox1hb_tf,const uint8_t[], -Variable,-,u8g2_font_crox1hb_tn,const uint8_t[], -Variable,-,u8g2_font_crox1hb_tr,const uint8_t[], -Variable,-,u8g2_font_crox1t_tf,const uint8_t[], -Variable,-,u8g2_font_crox1t_tn,const uint8_t[], -Variable,-,u8g2_font_crox1t_tr,const uint8_t[], -Variable,-,u8g2_font_crox1tb_tf,const uint8_t[], -Variable,-,u8g2_font_crox1tb_tn,const uint8_t[], -Variable,-,u8g2_font_crox1tb_tr,const uint8_t[], -Variable,-,u8g2_font_crox2c_mf,const uint8_t[], -Variable,-,u8g2_font_crox2c_mn,const uint8_t[], -Variable,-,u8g2_font_crox2c_mr,const uint8_t[], -Variable,-,u8g2_font_crox2c_tf,const uint8_t[], -Variable,-,u8g2_font_crox2c_tn,const uint8_t[], -Variable,-,u8g2_font_crox2c_tr,const uint8_t[], -Variable,-,u8g2_font_crox2cb_mf,const uint8_t[], -Variable,-,u8g2_font_crox2cb_mn,const uint8_t[], -Variable,-,u8g2_font_crox2cb_mr,const uint8_t[], -Variable,-,u8g2_font_crox2cb_tf,const uint8_t[], -Variable,-,u8g2_font_crox2cb_tn,const uint8_t[], -Variable,-,u8g2_font_crox2cb_tr,const uint8_t[], -Variable,-,u8g2_font_crox2h_tf,const uint8_t[], -Variable,-,u8g2_font_crox2h_tn,const uint8_t[], -Variable,-,u8g2_font_crox2h_tr,const uint8_t[], -Variable,-,u8g2_font_crox2hb_tf,const uint8_t[], -Variable,-,u8g2_font_crox2hb_tn,const uint8_t[], -Variable,-,u8g2_font_crox2hb_tr,const uint8_t[], -Variable,-,u8g2_font_crox2t_tf,const uint8_t[], -Variable,-,u8g2_font_crox2t_tn,const uint8_t[], -Variable,-,u8g2_font_crox2t_tr,const uint8_t[], -Variable,-,u8g2_font_crox2tb_tf,const uint8_t[], -Variable,-,u8g2_font_crox2tb_tn,const uint8_t[], -Variable,-,u8g2_font_crox2tb_tr,const uint8_t[], -Variable,-,u8g2_font_crox3c_mf,const uint8_t[], -Variable,-,u8g2_font_crox3c_mn,const uint8_t[], -Variable,-,u8g2_font_crox3c_mr,const uint8_t[], -Variable,-,u8g2_font_crox3c_tf,const uint8_t[], -Variable,-,u8g2_font_crox3c_tn,const uint8_t[], -Variable,-,u8g2_font_crox3c_tr,const uint8_t[], -Variable,-,u8g2_font_crox3cb_mf,const uint8_t[], -Variable,-,u8g2_font_crox3cb_mn,const uint8_t[], -Variable,-,u8g2_font_crox3cb_mr,const uint8_t[], -Variable,-,u8g2_font_crox3cb_tf,const uint8_t[], -Variable,-,u8g2_font_crox3cb_tn,const uint8_t[], -Variable,-,u8g2_font_crox3cb_tr,const uint8_t[], -Variable,-,u8g2_font_crox3h_tf,const uint8_t[], -Variable,-,u8g2_font_crox3h_tn,const uint8_t[], -Variable,-,u8g2_font_crox3h_tr,const uint8_t[], -Variable,-,u8g2_font_crox3hb_tf,const uint8_t[], -Variable,-,u8g2_font_crox3hb_tn,const uint8_t[], -Variable,-,u8g2_font_crox3hb_tr,const uint8_t[], -Variable,-,u8g2_font_crox3t_tf,const uint8_t[], -Variable,-,u8g2_font_crox3t_tn,const uint8_t[], -Variable,-,u8g2_font_crox3t_tr,const uint8_t[], -Variable,-,u8g2_font_crox3tb_tf,const uint8_t[], -Variable,-,u8g2_font_crox3tb_tn,const uint8_t[], -Variable,-,u8g2_font_crox3tb_tr,const uint8_t[], -Variable,-,u8g2_font_crox4h_tf,const uint8_t[], -Variable,-,u8g2_font_crox4h_tn,const uint8_t[], -Variable,-,u8g2_font_crox4h_tr,const uint8_t[], -Variable,-,u8g2_font_crox4hb_tf,const uint8_t[], -Variable,-,u8g2_font_crox4hb_tn,const uint8_t[], -Variable,-,u8g2_font_crox4hb_tr,const uint8_t[], -Variable,-,u8g2_font_crox4t_tf,const uint8_t[], -Variable,-,u8g2_font_crox4t_tn,const uint8_t[], -Variable,-,u8g2_font_crox4t_tr,const uint8_t[], -Variable,-,u8g2_font_crox4tb_tf,const uint8_t[], -Variable,-,u8g2_font_crox4tb_tn,const uint8_t[], -Variable,-,u8g2_font_crox4tb_tr,const uint8_t[], -Variable,-,u8g2_font_crox5h_tf,const uint8_t[], -Variable,-,u8g2_font_crox5h_tn,const uint8_t[], -Variable,-,u8g2_font_crox5h_tr,const uint8_t[], -Variable,-,u8g2_font_crox5hb_tf,const uint8_t[], -Variable,-,u8g2_font_crox5hb_tn,const uint8_t[], -Variable,-,u8g2_font_crox5hb_tr,const uint8_t[], -Variable,-,u8g2_font_crox5t_tf,const uint8_t[], -Variable,-,u8g2_font_crox5t_tn,const uint8_t[], -Variable,-,u8g2_font_crox5t_tr,const uint8_t[], -Variable,-,u8g2_font_crox5tb_tf,const uint8_t[], -Variable,-,u8g2_font_crox5tb_tn,const uint8_t[], -Variable,-,u8g2_font_crox5tb_tr,const uint8_t[], -Variable,-,u8g2_font_cu12_h_symbols,const uint8_t[], -Variable,-,u8g2_font_cu12_he,const uint8_t[], -Variable,-,u8g2_font_cu12_hf,const uint8_t[], -Variable,-,u8g2_font_cu12_hn,const uint8_t[], -Variable,-,u8g2_font_cu12_hr,const uint8_t[], -Variable,-,u8g2_font_cu12_me,const uint8_t[], -Variable,-,u8g2_font_cu12_mf,const uint8_t[], -Variable,-,u8g2_font_cu12_mn,const uint8_t[], -Variable,-,u8g2_font_cu12_mr,const uint8_t[], -Variable,-,u8g2_font_cu12_t_arabic,const uint8_t[], -Variable,-,u8g2_font_cu12_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_cu12_t_greek,const uint8_t[], -Variable,-,u8g2_font_cu12_t_hebrew,const uint8_t[], -Variable,-,u8g2_font_cu12_t_symbols,const uint8_t[], -Variable,-,u8g2_font_cu12_t_tibetan,const uint8_t[], -Variable,-,u8g2_font_cu12_te,const uint8_t[], -Variable,-,u8g2_font_cu12_tf,const uint8_t[], -Variable,-,u8g2_font_cu12_tn,const uint8_t[], -Variable,-,u8g2_font_cu12_tr,const uint8_t[], -Variable,-,u8g2_font_cube_mel_tn,const uint8_t[], -Variable,-,u8g2_font_cube_mel_tr,const uint8_t[], -Variable,-,u8g2_font_cupcakemetoyourleader_tn,const uint8_t[], -Variable,-,u8g2_font_cupcakemetoyourleader_tr,const uint8_t[], -Variable,-,u8g2_font_cupcakemetoyourleader_tu,const uint8_t[], -Variable,-,u8g2_font_cursor_tf,const uint8_t[], -Variable,-,u8g2_font_cursor_tr,const uint8_t[], -Variable,-,u8g2_font_diodesemimono_tr,const uint8_t[], -Variable,-,u8g2_font_disrespectfulteenager_tu,const uint8_t[], -Variable,-,u8g2_font_emoticons21_tr,const uint8_t[], -Variable,-,u8g2_font_etl14thai_t,const uint8_t[], -Variable,-,u8g2_font_etl16thai_t,const uint8_t[], -Variable,-,u8g2_font_etl24thai_t,const uint8_t[], -Variable,-,u8g2_font_f10_b_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_f10_b_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_f10_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_f10_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_f12_b_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_f12_b_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_f12_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_f12_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_f16_b_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_f16_b_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_f16_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_f16_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_fancypixels_tf,const uint8_t[], -Variable,-,u8g2_font_fancypixels_tr,const uint8_t[], -Variable,-,u8g2_font_fewture_tf,const uint8_t[], -Variable,-,u8g2_font_fewture_tn,const uint8_t[], -Variable,-,u8g2_font_fewture_tr,const uint8_t[], -Variable,-,u8g2_font_finderskeepers_tf,const uint8_t[], -Variable,-,u8g2_font_finderskeepers_tn,const uint8_t[], -Variable,-,u8g2_font_finderskeepers_tr,const uint8_t[], -Variable,-,u8g2_font_freedoomr10_mu,const uint8_t[], -Variable,-,u8g2_font_freedoomr10_tu,const uint8_t[], -Variable,-,u8g2_font_freedoomr25_mn,const uint8_t[], -Variable,-,u8g2_font_freedoomr25_tn,const uint8_t[], -Variable,-,u8g2_font_frikativ_t_all,const uint8_t[], -Variable,-,u8g2_font_frikativ_tf,const uint8_t[], -Variable,-,u8g2_font_frikativ_tr,const uint8_t[], -Variable,-,u8g2_font_fub11_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub11_tf,const uint8_t[], -Variable,-,u8g2_font_fub11_tn,const uint8_t[], -Variable,-,u8g2_font_fub11_tr,const uint8_t[], -Variable,-,u8g2_font_fub14_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub14_tf,const uint8_t[], -Variable,-,u8g2_font_fub14_tn,const uint8_t[], -Variable,-,u8g2_font_fub14_tr,const uint8_t[], -Variable,-,u8g2_font_fub17_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub17_tf,const uint8_t[], -Variable,-,u8g2_font_fub17_tn,const uint8_t[], -Variable,-,u8g2_font_fub17_tr,const uint8_t[], -Variable,-,u8g2_font_fub20_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub20_tf,const uint8_t[], -Variable,-,u8g2_font_fub20_tn,const uint8_t[], -Variable,-,u8g2_font_fub20_tr,const uint8_t[], -Variable,-,u8g2_font_fub25_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub25_tf,const uint8_t[], -Variable,-,u8g2_font_fub25_tn,const uint8_t[], -Variable,-,u8g2_font_fub25_tr,const uint8_t[], -Variable,-,u8g2_font_fub30_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub30_tf,const uint8_t[], -Variable,-,u8g2_font_fub30_tn,const uint8_t[], -Variable,-,u8g2_font_fub30_tr,const uint8_t[], -Variable,-,u8g2_font_fub35_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub35_tf,const uint8_t[], -Variable,-,u8g2_font_fub35_tn,const uint8_t[], -Variable,-,u8g2_font_fub35_tr,const uint8_t[], -Variable,-,u8g2_font_fub42_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub42_tf,const uint8_t[], -Variable,-,u8g2_font_fub42_tn,const uint8_t[], -Variable,-,u8g2_font_fub42_tr,const uint8_t[], -Variable,-,u8g2_font_fub49_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fub49_tn,const uint8_t[], -Variable,-,u8g2_font_fur11_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur11_tf,const uint8_t[], -Variable,-,u8g2_font_fur11_tn,const uint8_t[], -Variable,-,u8g2_font_fur11_tr,const uint8_t[], -Variable,-,u8g2_font_fur14_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur14_tf,const uint8_t[], -Variable,-,u8g2_font_fur14_tn,const uint8_t[], -Variable,-,u8g2_font_fur14_tr,const uint8_t[], -Variable,-,u8g2_font_fur17_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur17_tf,const uint8_t[], -Variable,-,u8g2_font_fur17_tn,const uint8_t[], -Variable,-,u8g2_font_fur17_tr,const uint8_t[], -Variable,-,u8g2_font_fur20_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur20_tf,const uint8_t[], -Variable,-,u8g2_font_fur20_tn,const uint8_t[], -Variable,-,u8g2_font_fur20_tr,const uint8_t[], -Variable,-,u8g2_font_fur25_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur25_tf,const uint8_t[], -Variable,-,u8g2_font_fur25_tn,const uint8_t[], -Variable,-,u8g2_font_fur25_tr,const uint8_t[], -Variable,-,u8g2_font_fur30_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur30_tf,const uint8_t[], -Variable,-,u8g2_font_fur30_tn,const uint8_t[], -Variable,-,u8g2_font_fur30_tr,const uint8_t[], -Variable,-,u8g2_font_fur35_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur35_tf,const uint8_t[], -Variable,-,u8g2_font_fur35_tn,const uint8_t[], -Variable,-,u8g2_font_fur35_tr,const uint8_t[], -Variable,-,u8g2_font_fur42_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur42_tf,const uint8_t[], -Variable,-,u8g2_font_fur42_tn,const uint8_t[], -Variable,-,u8g2_font_fur42_tr,const uint8_t[], -Variable,-,u8g2_font_fur49_t_symbol,const uint8_t[], -Variable,-,u8g2_font_fur49_tn,const uint8_t[], -Variable,-,u8g2_font_ganj_nameh_sans10_t_all,const uint8_t[], -Variable,-,u8g2_font_ganj_nameh_sans12_t_all,const uint8_t[], -Variable,-,u8g2_font_ganj_nameh_sans14_t_all,const uint8_t[], -Variable,-,u8g2_font_ganj_nameh_sans16_t_all,const uint8_t[], -Variable,-,u8g2_font_gb16st_t_1,const uint8_t[], -Variable,-,u8g2_font_gb16st_t_2,const uint8_t[], -Variable,-,u8g2_font_gb16st_t_3,const uint8_t[], -Variable,-,u8g2_font_gb24st_t_1,const uint8_t[], -Variable,-,u8g2_font_gb24st_t_2,const uint8_t[], -Variable,-,u8g2_font_gb24st_t_3,const uint8_t[], -Variable,-,u8g2_font_glasstown_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_glasstown_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_glasstown_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_glasstown_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_guildenstern_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_guildenstern_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_guildenstern_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_guildenstern_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_habsburgchancery_t_all,const uint8_t[], -Variable,-,u8g2_font_habsburgchancery_tf,const uint8_t[], -Variable,-,u8g2_font_habsburgchancery_tn,const uint8_t[], -Variable,-,u8g2_font_habsburgchancery_tr,const uint8_t[], -Variable,-,u8g2_font_halftone_tf,const uint8_t[], -Variable,-,u8g2_font_halftone_tn,const uint8_t[], -Variable,-,u8g2_font_halftone_tr,const uint8_t[], -Variable,-,u8g2_font_haxrcorp4089_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_haxrcorp4089_tn,const uint8_t[], -Variable,-,u8g2_font_haxrcorp4089_tr,const uint8_t[], -Variable,-,u8g2_font_heavybottom_tr,const uint8_t[], -Variable,-,u8g2_font_helvB08_te,const uint8_t[], -Variable,-,u8g2_font_helvB08_tf,const uint8_t[], -Variable,-,u8g2_font_helvB08_tn,const uint8_t[], -Variable,-,u8g2_font_helvB08_tr,const uint8_t[], -Variable,-,u8g2_font_helvB10_te,const uint8_t[], -Variable,-,u8g2_font_helvB10_tf,const uint8_t[], -Variable,-,u8g2_font_helvB10_tn,const uint8_t[], -Variable,-,u8g2_font_helvB10_tr,const uint8_t[], -Variable,-,u8g2_font_helvB12_te,const uint8_t[], -Variable,-,u8g2_font_helvB12_tf,const uint8_t[], -Variable,-,u8g2_font_helvB12_tn,const uint8_t[], -Variable,-,u8g2_font_helvB12_tr,const uint8_t[], -Variable,-,u8g2_font_helvB14_te,const uint8_t[], -Variable,-,u8g2_font_helvB14_tf,const uint8_t[], -Variable,-,u8g2_font_helvB14_tn,const uint8_t[], -Variable,-,u8g2_font_helvB14_tr,const uint8_t[], -Variable,-,u8g2_font_helvB18_te,const uint8_t[], -Variable,-,u8g2_font_helvB18_tf,const uint8_t[], -Variable,-,u8g2_font_helvB18_tn,const uint8_t[], -Variable,-,u8g2_font_helvB18_tr,const uint8_t[], -Variable,-,u8g2_font_helvB24_te,const uint8_t[], -Variable,-,u8g2_font_helvB24_tf,const uint8_t[], -Variable,-,u8g2_font_helvB24_tn,const uint8_t[], -Variable,-,u8g2_font_helvB24_tr,const uint8_t[], -Variable,-,u8g2_font_helvR08_te,const uint8_t[], -Variable,-,u8g2_font_helvR08_tf,const uint8_t[], -Variable,-,u8g2_font_helvR08_tn,const uint8_t[], -Variable,-,u8g2_font_helvR08_tr,const uint8_t[], -Variable,-,u8g2_font_helvR10_te,const uint8_t[], -Variable,-,u8g2_font_helvR10_tf,const uint8_t[], -Variable,-,u8g2_font_helvR10_tn,const uint8_t[], -Variable,-,u8g2_font_helvR10_tr,const uint8_t[], -Variable,-,u8g2_font_helvR12_te,const uint8_t[], -Variable,-,u8g2_font_helvR12_tf,const uint8_t[], -Variable,-,u8g2_font_helvR12_tn,const uint8_t[], -Variable,-,u8g2_font_helvR12_tr,const uint8_t[], -Variable,-,u8g2_font_helvR14_te,const uint8_t[], -Variable,-,u8g2_font_helvR14_tf,const uint8_t[], -Variable,-,u8g2_font_helvR14_tn,const uint8_t[], -Variable,-,u8g2_font_helvR14_tr,const uint8_t[], -Variable,-,u8g2_font_helvR18_te,const uint8_t[], -Variable,-,u8g2_font_helvR18_tf,const uint8_t[], -Variable,-,u8g2_font_helvR18_tn,const uint8_t[], -Variable,-,u8g2_font_helvR18_tr,const uint8_t[], -Variable,-,u8g2_font_helvR24_te,const uint8_t[], -Variable,-,u8g2_font_helvR24_tf,const uint8_t[], -Variable,-,u8g2_font_helvR24_tn,const uint8_t[], -Variable,-,u8g2_font_helvR24_tr,const uint8_t[], -Variable,-,u8g2_font_iconquadpix_m_all,const uint8_t[], -Variable,-,u8g2_font_inb16_mf,const uint8_t[], -Variable,-,u8g2_font_inb16_mn,const uint8_t[], -Variable,-,u8g2_font_inb16_mr,const uint8_t[], -Variable,-,u8g2_font_inb19_mf,const uint8_t[], -Variable,-,u8g2_font_inb19_mn,const uint8_t[], -Variable,-,u8g2_font_inb19_mr,const uint8_t[], -Variable,-,u8g2_font_inb21_mf,const uint8_t[], -Variable,-,u8g2_font_inb21_mn,const uint8_t[], -Variable,-,u8g2_font_inb21_mr,const uint8_t[], -Variable,-,u8g2_font_inb24_mf,const uint8_t[], -Variable,-,u8g2_font_inb24_mn,const uint8_t[], -Variable,-,u8g2_font_inb24_mr,const uint8_t[], -Variable,-,u8g2_font_inb27_mf,const uint8_t[], -Variable,-,u8g2_font_inb27_mn,const uint8_t[], -Variable,-,u8g2_font_inb27_mr,const uint8_t[], -Variable,-,u8g2_font_inb30_mf,const uint8_t[], -Variable,-,u8g2_font_inb30_mn,const uint8_t[], -Variable,-,u8g2_font_inb30_mr,const uint8_t[], -Variable,-,u8g2_font_inb33_mf,const uint8_t[], -Variable,-,u8g2_font_inb33_mn,const uint8_t[], -Variable,-,u8g2_font_inb33_mr,const uint8_t[], -Variable,-,u8g2_font_inb38_mf,const uint8_t[], -Variable,-,u8g2_font_inb38_mn,const uint8_t[], -Variable,-,u8g2_font_inb38_mr,const uint8_t[], -Variable,-,u8g2_font_inb42_mf,const uint8_t[], -Variable,-,u8g2_font_inb42_mn,const uint8_t[], -Variable,-,u8g2_font_inb42_mr,const uint8_t[], -Variable,-,u8g2_font_inb46_mf,const uint8_t[], -Variable,-,u8g2_font_inb46_mn,const uint8_t[], -Variable,-,u8g2_font_inb46_mr,const uint8_t[], -Variable,-,u8g2_font_inb49_mf,const uint8_t[], -Variable,-,u8g2_font_inb49_mn,const uint8_t[], -Variable,-,u8g2_font_inb49_mr,const uint8_t[], -Variable,-,u8g2_font_inb53_mf,const uint8_t[], -Variable,-,u8g2_font_inb53_mn,const uint8_t[], -Variable,-,u8g2_font_inb53_mr,const uint8_t[], -Variable,-,u8g2_font_inb57_mn,const uint8_t[], -Variable,-,u8g2_font_inb63_mn,const uint8_t[], -Variable,-,u8g2_font_inr16_mf,const uint8_t[], -Variable,-,u8g2_font_inr16_mn,const uint8_t[], -Variable,-,u8g2_font_inr16_mr,const uint8_t[], -Variable,-,u8g2_font_inr19_mf,const uint8_t[], -Variable,-,u8g2_font_inr19_mn,const uint8_t[], -Variable,-,u8g2_font_inr19_mr,const uint8_t[], -Variable,-,u8g2_font_inr21_mf,const uint8_t[], -Variable,-,u8g2_font_inr21_mn,const uint8_t[], -Variable,-,u8g2_font_inr21_mr,const uint8_t[], -Variable,-,u8g2_font_inr24_mf,const uint8_t[], -Variable,-,u8g2_font_inr24_mn,const uint8_t[], -Variable,-,u8g2_font_inr24_mr,const uint8_t[], -Variable,-,u8g2_font_inr24_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr27_mf,const uint8_t[], -Variable,-,u8g2_font_inr27_mn,const uint8_t[], -Variable,-,u8g2_font_inr27_mr,const uint8_t[], -Variable,-,u8g2_font_inr27_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr30_mf,const uint8_t[], -Variable,-,u8g2_font_inr30_mn,const uint8_t[], -Variable,-,u8g2_font_inr30_mr,const uint8_t[], -Variable,-,u8g2_font_inr30_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr33_mf,const uint8_t[], -Variable,-,u8g2_font_inr33_mn,const uint8_t[], -Variable,-,u8g2_font_inr33_mr,const uint8_t[], -Variable,-,u8g2_font_inr33_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr38_mf,const uint8_t[], -Variable,-,u8g2_font_inr38_mn,const uint8_t[], -Variable,-,u8g2_font_inr38_mr,const uint8_t[], -Variable,-,u8g2_font_inr38_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr42_mf,const uint8_t[], -Variable,-,u8g2_font_inr42_mn,const uint8_t[], -Variable,-,u8g2_font_inr42_mr,const uint8_t[], -Variable,-,u8g2_font_inr42_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr46_mf,const uint8_t[], -Variable,-,u8g2_font_inr46_mn,const uint8_t[], -Variable,-,u8g2_font_inr46_mr,const uint8_t[], -Variable,-,u8g2_font_inr46_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr49_mf,const uint8_t[], -Variable,-,u8g2_font_inr49_mn,const uint8_t[], -Variable,-,u8g2_font_inr49_mr,const uint8_t[], -Variable,-,u8g2_font_inr49_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr53_mf,const uint8_t[], -Variable,-,u8g2_font_inr53_mn,const uint8_t[], -Variable,-,u8g2_font_inr53_mr,const uint8_t[], -Variable,-,u8g2_font_inr53_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_inr57_mn,const uint8_t[], -Variable,-,u8g2_font_inr62_mn,const uint8_t[], -Variable,-,u8g2_font_iranian_sans_10_t_all,const uint8_t[], -Variable,-,u8g2_font_iranian_sans_12_t_all,const uint8_t[], -Variable,-,u8g2_font_iranian_sans_14_t_all,const uint8_t[], -Variable,-,u8g2_font_iranian_sans_16_t_all,const uint8_t[], -Variable,-,u8g2_font_iranian_sans_8_t_all,const uint8_t[], -Variable,-,u8g2_font_jinxedwizards_tr,const uint8_t[], -Variable,-,u8g2_font_koleeko_tf,const uint8_t[], -Variable,-,u8g2_font_koleeko_tn,const uint8_t[], -Variable,-,u8g2_font_koleeko_tr,const uint8_t[], -Variable,-,u8g2_font_koleeko_tu,const uint8_t[], -Variable,-,u8g2_font_lastapprenticebold_tr,const uint8_t[], -Variable,-,u8g2_font_lastapprenticethin_tr,const uint8_t[], -Variable,-,u8g2_font_lastpriestess_tr,const uint8_t[], -Variable,-,u8g2_font_lastpriestess_tu,const uint8_t[], -Variable,-,u8g2_font_logisoso16_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso16_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso16_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso18_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso18_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso18_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso20_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso20_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso20_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso22_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso22_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso22_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso24_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso24_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso24_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso26_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso26_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso26_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso28_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso28_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso28_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso30_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso30_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso30_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso32_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso32_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso32_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso34_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso34_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso34_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso38_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso38_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso38_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso42_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso42_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso42_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso46_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso46_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso46_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso50_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso50_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso50_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso54_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso54_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso54_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso58_tf,const uint8_t[], -Variable,-,u8g2_font_logisoso58_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso58_tr,const uint8_t[], -Variable,-,u8g2_font_logisoso62_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso78_tn,const uint8_t[], -Variable,-,u8g2_font_logisoso92_tn,const uint8_t[], -Variable,-,u8g2_font_luBIS08_te,const uint8_t[], -Variable,-,u8g2_font_luBIS08_tf,const uint8_t[], -Variable,-,u8g2_font_luBIS08_tn,const uint8_t[], -Variable,-,u8g2_font_luBIS08_tr,const uint8_t[], -Variable,-,u8g2_font_luBIS10_te,const uint8_t[], -Variable,-,u8g2_font_luBIS10_tf,const uint8_t[], -Variable,-,u8g2_font_luBIS10_tn,const uint8_t[], -Variable,-,u8g2_font_luBIS10_tr,const uint8_t[], -Variable,-,u8g2_font_luBIS12_te,const uint8_t[], -Variable,-,u8g2_font_luBIS12_tf,const uint8_t[], -Variable,-,u8g2_font_luBIS12_tn,const uint8_t[], -Variable,-,u8g2_font_luBIS12_tr,const uint8_t[], -Variable,-,u8g2_font_luBIS14_te,const uint8_t[], -Variable,-,u8g2_font_luBIS14_tf,const uint8_t[], -Variable,-,u8g2_font_luBIS14_tn,const uint8_t[], -Variable,-,u8g2_font_luBIS14_tr,const uint8_t[], -Variable,-,u8g2_font_luBIS18_te,const uint8_t[], -Variable,-,u8g2_font_luBIS18_tf,const uint8_t[], -Variable,-,u8g2_font_luBIS18_tn,const uint8_t[], -Variable,-,u8g2_font_luBIS18_tr,const uint8_t[], -Variable,-,u8g2_font_luBIS19_te,const uint8_t[], -Variable,-,u8g2_font_luBIS19_tf,const uint8_t[], -Variable,-,u8g2_font_luBIS19_tn,const uint8_t[], -Variable,-,u8g2_font_luBIS19_tr,const uint8_t[], -Variable,-,u8g2_font_luBIS24_te,const uint8_t[], -Variable,-,u8g2_font_luBIS24_tf,const uint8_t[], -Variable,-,u8g2_font_luBIS24_tn,const uint8_t[], -Variable,-,u8g2_font_luBIS24_tr,const uint8_t[], -Variable,-,u8g2_font_luBS08_te,const uint8_t[], -Variable,-,u8g2_font_luBS08_tf,const uint8_t[], -Variable,-,u8g2_font_luBS08_tn,const uint8_t[], -Variable,-,u8g2_font_luBS08_tr,const uint8_t[], -Variable,-,u8g2_font_luBS10_te,const uint8_t[], -Variable,-,u8g2_font_luBS10_tf,const uint8_t[], -Variable,-,u8g2_font_luBS10_tn,const uint8_t[], -Variable,-,u8g2_font_luBS10_tr,const uint8_t[], -Variable,-,u8g2_font_luBS12_te,const uint8_t[], -Variable,-,u8g2_font_luBS12_tf,const uint8_t[], -Variable,-,u8g2_font_luBS12_tn,const uint8_t[], -Variable,-,u8g2_font_luBS12_tr,const uint8_t[], -Variable,-,u8g2_font_luBS14_te,const uint8_t[], -Variable,-,u8g2_font_luBS14_tf,const uint8_t[], -Variable,-,u8g2_font_luBS14_tn,const uint8_t[], -Variable,-,u8g2_font_luBS14_tr,const uint8_t[], -Variable,-,u8g2_font_luBS18_te,const uint8_t[], -Variable,-,u8g2_font_luBS18_tf,const uint8_t[], -Variable,-,u8g2_font_luBS18_tn,const uint8_t[], -Variable,-,u8g2_font_luBS18_tr,const uint8_t[], -Variable,-,u8g2_font_luBS19_te,const uint8_t[], -Variable,-,u8g2_font_luBS19_tf,const uint8_t[], -Variable,-,u8g2_font_luBS19_tn,const uint8_t[], -Variable,-,u8g2_font_luBS19_tr,const uint8_t[], -Variable,-,u8g2_font_luBS24_te,const uint8_t[], -Variable,-,u8g2_font_luBS24_tf,const uint8_t[], -Variable,-,u8g2_font_luBS24_tn,const uint8_t[], -Variable,-,u8g2_font_luBS24_tr,const uint8_t[], -Variable,-,u8g2_font_luIS08_te,const uint8_t[], -Variable,-,u8g2_font_luIS08_tf,const uint8_t[], -Variable,-,u8g2_font_luIS08_tn,const uint8_t[], -Variable,-,u8g2_font_luIS08_tr,const uint8_t[], -Variable,-,u8g2_font_luIS10_te,const uint8_t[], -Variable,-,u8g2_font_luIS10_tf,const uint8_t[], -Variable,-,u8g2_font_luIS10_tn,const uint8_t[], -Variable,-,u8g2_font_luIS10_tr,const uint8_t[], -Variable,-,u8g2_font_luIS12_te,const uint8_t[], -Variable,-,u8g2_font_luIS12_tf,const uint8_t[], -Variable,-,u8g2_font_luIS12_tn,const uint8_t[], -Variable,-,u8g2_font_luIS12_tr,const uint8_t[], -Variable,-,u8g2_font_luIS14_te,const uint8_t[], -Variable,-,u8g2_font_luIS14_tf,const uint8_t[], -Variable,-,u8g2_font_luIS14_tn,const uint8_t[], -Variable,-,u8g2_font_luIS14_tr,const uint8_t[], -Variable,-,u8g2_font_luIS18_te,const uint8_t[], -Variable,-,u8g2_font_luIS18_tf,const uint8_t[], -Variable,-,u8g2_font_luIS18_tn,const uint8_t[], -Variable,-,u8g2_font_luIS18_tr,const uint8_t[], -Variable,-,u8g2_font_luIS19_te,const uint8_t[], -Variable,-,u8g2_font_luIS19_tf,const uint8_t[], -Variable,-,u8g2_font_luIS19_tn,const uint8_t[], -Variable,-,u8g2_font_luIS19_tr,const uint8_t[], -Variable,-,u8g2_font_luIS24_te,const uint8_t[], -Variable,-,u8g2_font_luIS24_tf,const uint8_t[], -Variable,-,u8g2_font_luIS24_tn,const uint8_t[], -Variable,-,u8g2_font_luIS24_tr,const uint8_t[], -Variable,-,u8g2_font_luRS08_te,const uint8_t[], -Variable,-,u8g2_font_luRS08_tf,const uint8_t[], -Variable,-,u8g2_font_luRS08_tn,const uint8_t[], -Variable,-,u8g2_font_luRS08_tr,const uint8_t[], -Variable,-,u8g2_font_luRS10_te,const uint8_t[], -Variable,-,u8g2_font_luRS10_tf,const uint8_t[], -Variable,-,u8g2_font_luRS10_tn,const uint8_t[], -Variable,-,u8g2_font_luRS10_tr,const uint8_t[], -Variable,-,u8g2_font_luRS12_te,const uint8_t[], -Variable,-,u8g2_font_luRS12_tf,const uint8_t[], -Variable,-,u8g2_font_luRS12_tn,const uint8_t[], -Variable,-,u8g2_font_luRS12_tr,const uint8_t[], -Variable,-,u8g2_font_luRS14_te,const uint8_t[], -Variable,-,u8g2_font_luRS14_tf,const uint8_t[], -Variable,-,u8g2_font_luRS14_tn,const uint8_t[], -Variable,-,u8g2_font_luRS14_tr,const uint8_t[], -Variable,-,u8g2_font_luRS18_te,const uint8_t[], -Variable,-,u8g2_font_luRS18_tf,const uint8_t[], -Variable,-,u8g2_font_luRS18_tn,const uint8_t[], -Variable,-,u8g2_font_luRS18_tr,const uint8_t[], -Variable,-,u8g2_font_luRS19_te,const uint8_t[], -Variable,-,u8g2_font_luRS19_tf,const uint8_t[], -Variable,-,u8g2_font_luRS19_tn,const uint8_t[], -Variable,-,u8g2_font_luRS19_tr,const uint8_t[], -Variable,-,u8g2_font_luRS24_te,const uint8_t[], -Variable,-,u8g2_font_luRS24_tf,const uint8_t[], -Variable,-,u8g2_font_luRS24_tn,const uint8_t[], -Variable,-,u8g2_font_luRS24_tr,const uint8_t[], -Variable,-,u8g2_font_lubB08_te,const uint8_t[], -Variable,-,u8g2_font_lubB08_tf,const uint8_t[], -Variable,-,u8g2_font_lubB08_tn,const uint8_t[], -Variable,-,u8g2_font_lubB08_tr,const uint8_t[], -Variable,-,u8g2_font_lubB10_te,const uint8_t[], -Variable,-,u8g2_font_lubB10_tf,const uint8_t[], -Variable,-,u8g2_font_lubB10_tn,const uint8_t[], -Variable,-,u8g2_font_lubB10_tr,const uint8_t[], -Variable,-,u8g2_font_lubB12_te,const uint8_t[], -Variable,-,u8g2_font_lubB12_tf,const uint8_t[], -Variable,-,u8g2_font_lubB12_tn,const uint8_t[], -Variable,-,u8g2_font_lubB12_tr,const uint8_t[], -Variable,-,u8g2_font_lubB14_te,const uint8_t[], -Variable,-,u8g2_font_lubB14_tf,const uint8_t[], -Variable,-,u8g2_font_lubB14_tn,const uint8_t[], -Variable,-,u8g2_font_lubB14_tr,const uint8_t[], -Variable,-,u8g2_font_lubB18_te,const uint8_t[], -Variable,-,u8g2_font_lubB18_tf,const uint8_t[], -Variable,-,u8g2_font_lubB18_tn,const uint8_t[], -Variable,-,u8g2_font_lubB18_tr,const uint8_t[], -Variable,-,u8g2_font_lubB19_te,const uint8_t[], -Variable,-,u8g2_font_lubB19_tf,const uint8_t[], -Variable,-,u8g2_font_lubB19_tn,const uint8_t[], -Variable,-,u8g2_font_lubB19_tr,const uint8_t[], -Variable,-,u8g2_font_lubB24_te,const uint8_t[], -Variable,-,u8g2_font_lubB24_tf,const uint8_t[], -Variable,-,u8g2_font_lubB24_tn,const uint8_t[], -Variable,-,u8g2_font_lubB24_tr,const uint8_t[], -Variable,-,u8g2_font_lubBI08_te,const uint8_t[], -Variable,-,u8g2_font_lubBI08_tf,const uint8_t[], -Variable,-,u8g2_font_lubBI08_tn,const uint8_t[], -Variable,-,u8g2_font_lubBI08_tr,const uint8_t[], -Variable,-,u8g2_font_lubBI10_te,const uint8_t[], -Variable,-,u8g2_font_lubBI10_tf,const uint8_t[], -Variable,-,u8g2_font_lubBI10_tn,const uint8_t[], -Variable,-,u8g2_font_lubBI10_tr,const uint8_t[], -Variable,-,u8g2_font_lubBI12_te,const uint8_t[], -Variable,-,u8g2_font_lubBI12_tf,const uint8_t[], -Variable,-,u8g2_font_lubBI12_tn,const uint8_t[], -Variable,-,u8g2_font_lubBI12_tr,const uint8_t[], -Variable,-,u8g2_font_lubBI14_te,const uint8_t[], -Variable,-,u8g2_font_lubBI14_tf,const uint8_t[], -Variable,-,u8g2_font_lubBI14_tn,const uint8_t[], -Variable,-,u8g2_font_lubBI14_tr,const uint8_t[], -Variable,-,u8g2_font_lubBI18_te,const uint8_t[], -Variable,-,u8g2_font_lubBI18_tf,const uint8_t[], -Variable,-,u8g2_font_lubBI18_tn,const uint8_t[], -Variable,-,u8g2_font_lubBI18_tr,const uint8_t[], -Variable,-,u8g2_font_lubBI19_te,const uint8_t[], -Variable,-,u8g2_font_lubBI19_tf,const uint8_t[], -Variable,-,u8g2_font_lubBI19_tn,const uint8_t[], -Variable,-,u8g2_font_lubBI19_tr,const uint8_t[], -Variable,-,u8g2_font_lubBI24_te,const uint8_t[], -Variable,-,u8g2_font_lubBI24_tf,const uint8_t[], -Variable,-,u8g2_font_lubBI24_tn,const uint8_t[], -Variable,-,u8g2_font_lubBI24_tr,const uint8_t[], -Variable,-,u8g2_font_lubI08_te,const uint8_t[], -Variable,-,u8g2_font_lubI08_tf,const uint8_t[], -Variable,-,u8g2_font_lubI08_tn,const uint8_t[], -Variable,-,u8g2_font_lubI08_tr,const uint8_t[], -Variable,-,u8g2_font_lubI10_te,const uint8_t[], -Variable,-,u8g2_font_lubI10_tf,const uint8_t[], -Variable,-,u8g2_font_lubI10_tn,const uint8_t[], -Variable,-,u8g2_font_lubI10_tr,const uint8_t[], -Variable,-,u8g2_font_lubI12_te,const uint8_t[], -Variable,-,u8g2_font_lubI12_tf,const uint8_t[], -Variable,-,u8g2_font_lubI12_tn,const uint8_t[], -Variable,-,u8g2_font_lubI12_tr,const uint8_t[], -Variable,-,u8g2_font_lubI14_te,const uint8_t[], -Variable,-,u8g2_font_lubI14_tf,const uint8_t[], -Variable,-,u8g2_font_lubI14_tn,const uint8_t[], -Variable,-,u8g2_font_lubI14_tr,const uint8_t[], -Variable,-,u8g2_font_lubI18_te,const uint8_t[], -Variable,-,u8g2_font_lubI18_tf,const uint8_t[], -Variable,-,u8g2_font_lubI18_tn,const uint8_t[], -Variable,-,u8g2_font_lubI18_tr,const uint8_t[], -Variable,-,u8g2_font_lubI19_te,const uint8_t[], -Variable,-,u8g2_font_lubI19_tf,const uint8_t[], -Variable,-,u8g2_font_lubI19_tn,const uint8_t[], -Variable,-,u8g2_font_lubI19_tr,const uint8_t[], -Variable,-,u8g2_font_lubI24_te,const uint8_t[], -Variable,-,u8g2_font_lubI24_tf,const uint8_t[], -Variable,-,u8g2_font_lubI24_tn,const uint8_t[], -Variable,-,u8g2_font_lubI24_tr,const uint8_t[], -Variable,-,u8g2_font_lubR08_te,const uint8_t[], -Variable,-,u8g2_font_lubR08_tf,const uint8_t[], -Variable,-,u8g2_font_lubR08_tn,const uint8_t[], -Variable,-,u8g2_font_lubR08_tr,const uint8_t[], -Variable,-,u8g2_font_lubR10_te,const uint8_t[], -Variable,-,u8g2_font_lubR10_tf,const uint8_t[], -Variable,-,u8g2_font_lubR10_tn,const uint8_t[], -Variable,-,u8g2_font_lubR10_tr,const uint8_t[], -Variable,-,u8g2_font_lubR12_te,const uint8_t[], -Variable,-,u8g2_font_lubR12_tf,const uint8_t[], -Variable,-,u8g2_font_lubR12_tn,const uint8_t[], -Variable,-,u8g2_font_lubR12_tr,const uint8_t[], -Variable,-,u8g2_font_lubR14_te,const uint8_t[], -Variable,-,u8g2_font_lubR14_tf,const uint8_t[], -Variable,-,u8g2_font_lubR14_tn,const uint8_t[], -Variable,-,u8g2_font_lubR14_tr,const uint8_t[], -Variable,-,u8g2_font_lubR18_te,const uint8_t[], -Variable,-,u8g2_font_lubR18_tf,const uint8_t[], -Variable,-,u8g2_font_lubR18_tn,const uint8_t[], -Variable,-,u8g2_font_lubR18_tr,const uint8_t[], -Variable,-,u8g2_font_lubR19_te,const uint8_t[], -Variable,-,u8g2_font_lubR19_tf,const uint8_t[], -Variable,-,u8g2_font_lubR19_tn,const uint8_t[], -Variable,-,u8g2_font_lubR19_tr,const uint8_t[], -Variable,-,u8g2_font_lubR24_te,const uint8_t[], -Variable,-,u8g2_font_lubR24_tf,const uint8_t[], -Variable,-,u8g2_font_lubR24_tn,const uint8_t[], -Variable,-,u8g2_font_lubR24_tr,const uint8_t[], -Variable,-,u8g2_font_lucasarts_scumm_subtitle_o_tf,const uint8_t[], -Variable,-,u8g2_font_lucasarts_scumm_subtitle_o_tn,const uint8_t[], -Variable,-,u8g2_font_lucasarts_scumm_subtitle_o_tr,const uint8_t[], -Variable,-,u8g2_font_lucasarts_scumm_subtitle_r_tf,const uint8_t[], -Variable,-,u8g2_font_lucasarts_scumm_subtitle_r_tn,const uint8_t[], -Variable,-,u8g2_font_lucasarts_scumm_subtitle_r_tr,const uint8_t[], -Variable,-,u8g2_font_lucasfont_alternate_tf,const uint8_t[], -Variable,-,u8g2_font_lucasfont_alternate_tn,const uint8_t[], -Variable,-,u8g2_font_lucasfont_alternate_tr,const uint8_t[], -Variable,-,u8g2_font_m2icon_5_tf,const uint8_t[], -Variable,-,u8g2_font_m2icon_7_tf,const uint8_t[], -Variable,-,u8g2_font_m2icon_9_tf,const uint8_t[], -Variable,-,u8g2_font_mademoiselle_mel_tn,const uint8_t[], -Variable,-,u8g2_font_mademoiselle_mel_tr,const uint8_t[], -Variable,-,u8g2_font_maniac_te,const uint8_t[], -Variable,-,u8g2_font_maniac_tf,const uint8_t[], -Variable,-,u8g2_font_maniac_tn,const uint8_t[], -Variable,-,u8g2_font_maniac_tr,const uint8_t[], -Variable,-,u8g2_font_mercutio_basic_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_mercutio_basic_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_mercutio_basic_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_mercutio_basic_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_mercutio_sc_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_mercutio_sc_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_mercutio_sc_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_mercutio_sc_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_michaelmouse_tu,const uint8_t[], -Variable,-,u8g2_font_micro_mn,const uint8_t[], -Variable,-,u8g2_font_micro_mr,const uint8_t[], -Variable,-,u8g2_font_micro_tn,const uint8_t[], -Variable,-,u8g2_font_micro_tr,const uint8_t[], -Variable,-,u8g2_font_miranda_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_miranda_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_miranda_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_missingplanet_t_all,const uint8_t[], -Variable,-,u8g2_font_missingplanet_tf,const uint8_t[], -Variable,-,u8g2_font_missingplanet_tn,const uint8_t[], -Variable,-,u8g2_font_missingplanet_tr,const uint8_t[], -Variable,-,u8g2_font_mozart_nbp_h_all,const uint8_t[], -Variable,-,u8g2_font_mozart_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_mozart_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_mozart_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_mozart_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_ncenB08_te,const uint8_t[], -Variable,-,u8g2_font_ncenB08_tf,const uint8_t[], -Variable,-,u8g2_font_ncenB08_tn,const uint8_t[], -Variable,-,u8g2_font_ncenB08_tr,const uint8_t[], -Variable,-,u8g2_font_ncenB10_te,const uint8_t[], -Variable,-,u8g2_font_ncenB10_tf,const uint8_t[], -Variable,-,u8g2_font_ncenB10_tn,const uint8_t[], -Variable,-,u8g2_font_ncenB10_tr,const uint8_t[], -Variable,-,u8g2_font_ncenB12_te,const uint8_t[], -Variable,-,u8g2_font_ncenB12_tf,const uint8_t[], -Variable,-,u8g2_font_ncenB12_tn,const uint8_t[], -Variable,-,u8g2_font_ncenB12_tr,const uint8_t[], -Variable,-,u8g2_font_ncenB14_te,const uint8_t[], -Variable,-,u8g2_font_ncenB14_tf,const uint8_t[], -Variable,-,u8g2_font_ncenB14_tn,const uint8_t[], -Variable,-,u8g2_font_ncenB14_tr,const uint8_t[], -Variable,-,u8g2_font_ncenB18_te,const uint8_t[], -Variable,-,u8g2_font_ncenB18_tf,const uint8_t[], -Variable,-,u8g2_font_ncenB18_tn,const uint8_t[], -Variable,-,u8g2_font_ncenB18_tr,const uint8_t[], -Variable,-,u8g2_font_ncenB24_te,const uint8_t[], -Variable,-,u8g2_font_ncenB24_tf,const uint8_t[], -Variable,-,u8g2_font_ncenB24_tn,const uint8_t[], -Variable,-,u8g2_font_ncenB24_tr,const uint8_t[], -Variable,-,u8g2_font_ncenR08_te,const uint8_t[], -Variable,-,u8g2_font_ncenR08_tf,const uint8_t[], -Variable,-,u8g2_font_ncenR08_tn,const uint8_t[], -Variable,-,u8g2_font_ncenR08_tr,const uint8_t[], -Variable,-,u8g2_font_ncenR10_te,const uint8_t[], -Variable,-,u8g2_font_ncenR10_tf,const uint8_t[], -Variable,-,u8g2_font_ncenR10_tn,const uint8_t[], -Variable,-,u8g2_font_ncenR10_tr,const uint8_t[], -Variable,-,u8g2_font_ncenR12_te,const uint8_t[], -Variable,-,u8g2_font_ncenR12_tf,const uint8_t[], -Variable,-,u8g2_font_ncenR12_tn,const uint8_t[], -Variable,-,u8g2_font_ncenR12_tr,const uint8_t[], -Variable,-,u8g2_font_ncenR14_te,const uint8_t[], -Variable,-,u8g2_font_ncenR14_tf,const uint8_t[], -Variable,-,u8g2_font_ncenR14_tn,const uint8_t[], -Variable,-,u8g2_font_ncenR14_tr,const uint8_t[], -Variable,-,u8g2_font_ncenR18_te,const uint8_t[], -Variable,-,u8g2_font_ncenR18_tf,const uint8_t[], -Variable,-,u8g2_font_ncenR18_tn,const uint8_t[], -Variable,-,u8g2_font_ncenR18_tr,const uint8_t[], -Variable,-,u8g2_font_ncenR24_te,const uint8_t[], -Variable,-,u8g2_font_ncenR24_tf,const uint8_t[], -Variable,-,u8g2_font_ncenR24_tn,const uint8_t[], -Variable,-,u8g2_font_ncenR24_tr,const uint8_t[], -Variable,-,u8g2_font_nerhoe_tf,const uint8_t[], -Variable,-,u8g2_font_nerhoe_tn,const uint8_t[], -Variable,-,u8g2_font_nerhoe_tr,const uint8_t[], -Variable,-,u8g2_font_nine_by_five_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_nine_by_five_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_nine_by_five_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_nine_by_five_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_nokiafc22_tf,const uint8_t[], -Variable,-,u8g2_font_nokiafc22_tn,const uint8_t[], -Variable,-,u8g2_font_nokiafc22_tr,const uint8_t[], -Variable,-,u8g2_font_nokiafc22_tu,const uint8_t[], -Variable,-,u8g2_font_oldwizard_tf,const uint8_t[], -Variable,-,u8g2_font_oldwizard_tn,const uint8_t[], -Variable,-,u8g2_font_oldwizard_tr,const uint8_t[], -Variable,-,u8g2_font_oldwizard_tu,const uint8_t[], -Variable,-,u8g2_font_open_iconic_all_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_all_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_all_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_all_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_all_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_app_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_app_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_app_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_app_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_app_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_arrow_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_arrow_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_arrow_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_arrow_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_arrow_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_check_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_check_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_check_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_check_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_check_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_email_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_email_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_email_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_email_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_email_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_embedded_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_embedded_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_embedded_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_embedded_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_embedded_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_gui_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_gui_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_gui_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_gui_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_gui_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_human_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_human_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_human_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_human_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_human_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_mime_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_mime_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_mime_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_mime_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_mime_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_other_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_other_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_other_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_other_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_other_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_play_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_play_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_play_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_play_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_play_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_text_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_text_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_text_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_text_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_text_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_thing_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_thing_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_thing_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_thing_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_thing_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_weather_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_weather_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_weather_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_weather_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_weather_8x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_www_1x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_www_2x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_www_4x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_www_6x_t,const uint8_t[], -Variable,-,u8g2_font_open_iconic_www_8x_t,const uint8_t[], -Variable,-,u8g2_font_ordinarybasis_t_all,const uint8_t[], -Variable,-,u8g2_font_ordinarybasis_tf,const uint8_t[], -Variable,-,u8g2_font_ordinarybasis_tn,const uint8_t[], -Variable,-,u8g2_font_ordinarybasis_tr,const uint8_t[], -Variable,-,u8g2_font_osb18_tf,const uint8_t[], -Variable,-,u8g2_font_osb18_tn,const uint8_t[], -Variable,-,u8g2_font_osb18_tr,const uint8_t[], -Variable,-,u8g2_font_osb21_tf,const uint8_t[], -Variable,-,u8g2_font_osb21_tn,const uint8_t[], -Variable,-,u8g2_font_osb21_tr,const uint8_t[], -Variable,-,u8g2_font_osb26_tf,const uint8_t[], -Variable,-,u8g2_font_osb26_tn,const uint8_t[], -Variable,-,u8g2_font_osb26_tr,const uint8_t[], -Variable,-,u8g2_font_osb29_tf,const uint8_t[], -Variable,-,u8g2_font_osb29_tn,const uint8_t[], -Variable,-,u8g2_font_osb29_tr,const uint8_t[], -Variable,-,u8g2_font_osb35_tf,const uint8_t[], -Variable,-,u8g2_font_osb35_tn,const uint8_t[], -Variable,-,u8g2_font_osb35_tr,const uint8_t[], -Variable,-,u8g2_font_osb41_tf,const uint8_t[], -Variable,-,u8g2_font_osb41_tn,const uint8_t[], -Variable,-,u8g2_font_osb41_tr,const uint8_t[], -Variable,-,u8g2_font_oskool_tf,const uint8_t[], -Variable,-,u8g2_font_oskool_tn,const uint8_t[], -Variable,-,u8g2_font_oskool_tr,const uint8_t[], -Variable,-,u8g2_font_osr18_tf,const uint8_t[], -Variable,-,u8g2_font_osr18_tn,const uint8_t[], -Variable,-,u8g2_font_osr18_tr,const uint8_t[], -Variable,-,u8g2_font_osr21_tf,const uint8_t[], -Variable,-,u8g2_font_osr21_tn,const uint8_t[], -Variable,-,u8g2_font_osr21_tr,const uint8_t[], -Variable,-,u8g2_font_osr26_tf,const uint8_t[], -Variable,-,u8g2_font_osr26_tn,const uint8_t[], -Variable,-,u8g2_font_osr26_tr,const uint8_t[], -Variable,-,u8g2_font_osr29_tf,const uint8_t[], -Variable,-,u8g2_font_osr29_tn,const uint8_t[], -Variable,-,u8g2_font_osr29_tr,const uint8_t[], -Variable,-,u8g2_font_osr35_tf,const uint8_t[], -Variable,-,u8g2_font_osr35_tn,const uint8_t[], -Variable,-,u8g2_font_osr35_tr,const uint8_t[], -Variable,-,u8g2_font_osr41_tf,const uint8_t[], -Variable,-,u8g2_font_osr41_tn,const uint8_t[], -Variable,-,u8g2_font_osr41_tr,const uint8_t[], -Variable,-,u8g2_font_p01type_tf,const uint8_t[], -Variable,-,u8g2_font_p01type_tn,const uint8_t[], -Variable,-,u8g2_font_p01type_tr,const uint8_t[], -Variable,-,u8g2_font_pcsenior_8f,const uint8_t[], -Variable,-,u8g2_font_pcsenior_8n,const uint8_t[], -Variable,-,u8g2_font_pcsenior_8r,const uint8_t[], -Variable,-,u8g2_font_pcsenior_8u,const uint8_t[], -Variable,-,u8g2_font_pearfont_tr,const uint8_t[], -Variable,-,u8g2_font_pieceofcake_mel_tn,const uint8_t[], -Variable,-,u8g2_font_pieceofcake_mel_tr,const uint8_t[], -Variable,-,u8g2_font_pixelle_micro_tn,const uint8_t[], -Variable,-,u8g2_font_pixelle_micro_tr,const uint8_t[], -Variable,-,u8g2_font_pixelmordred_t_all,const uint8_t[], -Variable,-,u8g2_font_pixelmordred_tf,const uint8_t[], -Variable,-,u8g2_font_pixelmordred_tn,const uint8_t[], -Variable,-,u8g2_font_pixelmordred_tr,const uint8_t[], -Variable,-,u8g2_font_pixelpoiiz_tr,const uint8_t[], -Variable,-,u8g2_font_press_mel_tn,const uint8_t[], -Variable,-,u8g2_font_press_mel_tr,const uint8_t[], -Variable,-,u8g2_font_pressstart2p_8f,const uint8_t[], -Variable,-,u8g2_font_pressstart2p_8n,const uint8_t[], -Variable,-,u8g2_font_pressstart2p_8r,const uint8_t[], -Variable,-,u8g2_font_pressstart2p_8u,const uint8_t[], -Variable,-,u8g2_font_profont10_mf,const uint8_t[], -Variable,-,u8g2_font_profont10_mn,const uint8_t[], -Variable,-,u8g2_font_profont10_mr,const uint8_t[], -Variable,-,u8g2_font_profont10_tf,const uint8_t[], -Variable,-,u8g2_font_profont10_tn,const uint8_t[], -Variable,-,u8g2_font_profont10_tr,const uint8_t[], -Variable,-,u8g2_font_profont11_mf,const uint8_t[], -Variable,-,u8g2_font_profont11_mn,const uint8_t[], -Variable,-,u8g2_font_profont11_mr,const uint8_t[], -Variable,-,u8g2_font_profont11_tf,const uint8_t[], -Variable,-,u8g2_font_profont11_tn,const uint8_t[], -Variable,-,u8g2_font_profont11_tr,const uint8_t[], -Variable,-,u8g2_font_profont12_mf,const uint8_t[], -Variable,-,u8g2_font_profont12_mn,const uint8_t[], -Variable,-,u8g2_font_profont12_mr,const uint8_t[], -Variable,-,u8g2_font_profont12_tf,const uint8_t[], -Variable,-,u8g2_font_profont12_tn,const uint8_t[], -Variable,-,u8g2_font_profont12_tr,const uint8_t[], -Variable,-,u8g2_font_profont15_mf,const uint8_t[], -Variable,-,u8g2_font_profont15_mn,const uint8_t[], -Variable,-,u8g2_font_profont15_mr,const uint8_t[], -Variable,-,u8g2_font_profont15_tf,const uint8_t[], -Variable,-,u8g2_font_profont15_tn,const uint8_t[], -Variable,-,u8g2_font_profont15_tr,const uint8_t[], -Variable,-,u8g2_font_profont17_mf,const uint8_t[], -Variable,-,u8g2_font_profont17_mn,const uint8_t[], -Variable,-,u8g2_font_profont17_mr,const uint8_t[], -Variable,-,u8g2_font_profont17_tf,const uint8_t[], -Variable,-,u8g2_font_profont17_tn,const uint8_t[], -Variable,-,u8g2_font_profont17_tr,const uint8_t[], -Variable,-,u8g2_font_profont22_mf,const uint8_t[], -Variable,-,u8g2_font_profont22_mn,const uint8_t[], -Variable,-,u8g2_font_profont22_mr,const uint8_t[], -Variable,-,u8g2_font_profont22_tf,const uint8_t[], -Variable,-,u8g2_font_profont22_tn,const uint8_t[], -Variable,-,u8g2_font_profont22_tr,const uint8_t[], -Variable,-,u8g2_font_profont29_mf,const uint8_t[], -Variable,-,u8g2_font_profont29_mn,const uint8_t[], -Variable,-,u8g2_font_profont29_mr,const uint8_t[], -Variable,-,u8g2_font_profont29_tf,const uint8_t[], -Variable,-,u8g2_font_profont29_tn,const uint8_t[], -Variable,-,u8g2_font_profont29_tr,const uint8_t[], -Variable,-,u8g2_font_prospero_bold_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_prospero_bold_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_prospero_bold_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_prospero_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_prospero_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_prospero_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_px437wyse700a_mf,const uint8_t[], -Variable,-,u8g2_font_px437wyse700a_mn,const uint8_t[], -Variable,-,u8g2_font_px437wyse700a_mr,const uint8_t[], -Variable,-,u8g2_font_px437wyse700a_tf,const uint8_t[], -Variable,-,u8g2_font_px437wyse700a_tn,const uint8_t[], -Variable,-,u8g2_font_px437wyse700a_tr,const uint8_t[], -Variable,-,u8g2_font_px437wyse700b_mf,const uint8_t[], -Variable,-,u8g2_font_px437wyse700b_mn,const uint8_t[], -Variable,-,u8g2_font_px437wyse700b_mr,const uint8_t[], -Variable,-,u8g2_font_px437wyse700b_tf,const uint8_t[], -Variable,-,u8g2_font_px437wyse700b_tn,const uint8_t[], -Variable,-,u8g2_font_px437wyse700b_tr,const uint8_t[], -Variable,-,u8g2_font_pxplusibmcga_8f,const uint8_t[], -Variable,-,u8g2_font_pxplusibmcga_8n,const uint8_t[], -Variable,-,u8g2_font_pxplusibmcga_8r,const uint8_t[], -Variable,-,u8g2_font_pxplusibmcga_8u,const uint8_t[], -Variable,-,u8g2_font_pxplusibmcgathin_8f,const uint8_t[], -Variable,-,u8g2_font_pxplusibmcgathin_8n,const uint8_t[], -Variable,-,u8g2_font_pxplusibmcgathin_8r,const uint8_t[], -Variable,-,u8g2_font_pxplusibmcgathin_8u,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga8_m_all,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga8_mf,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga8_mn,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga8_mr,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga8_t_all,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga8_tf,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga8_tn,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga8_tr,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga9_m_all,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga9_mf,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga9_mn,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga9_mr,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga9_t_all,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga9_tf,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga9_tn,const uint8_t[], -Variable,-,u8g2_font_pxplusibmvga9_tr,const uint8_t[], -Variable,-,u8g2_font_pxplustandynewtv_8_all,const uint8_t[], -Variable,-,u8g2_font_pxplustandynewtv_8f,const uint8_t[], -Variable,-,u8g2_font_pxplustandynewtv_8n,const uint8_t[], -Variable,-,u8g2_font_pxplustandynewtv_8r,const uint8_t[], -Variable,-,u8g2_font_pxplustandynewtv_8u,const uint8_t[], -Variable,-,u8g2_font_pxplustandynewtv_t_all,const uint8_t[], -Variable,-,u8g2_font_questgiver_tr,const uint8_t[], -Variable,-,u8g2_font_repress_mel_tn,const uint8_t[], -Variable,-,u8g2_font_repress_mel_tr,const uint8_t[], -Variable,-,u8g2_font_robot_de_niro_tf,const uint8_t[], -Variable,-,u8g2_font_robot_de_niro_tn,const uint8_t[], -Variable,-,u8g2_font_robot_de_niro_tr,const uint8_t[], -Variable,-,u8g2_font_roentgen_nbp_h_all,const uint8_t[], -Variable,-,u8g2_font_roentgen_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_roentgen_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_roentgen_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_roentgen_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_rosencrantz_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_rosencrantz_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_rosencrantz_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_rosencrantz_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_saikyosansbold8_8n,const uint8_t[], -Variable,-,u8g2_font_saikyosansbold8_8u,const uint8_t[], -Variable,-,u8g2_font_samim_10_t_all,const uint8_t[], -Variable,-,u8g2_font_samim_12_t_all,const uint8_t[], -Variable,-,u8g2_font_samim_14_t_all,const uint8_t[], -Variable,-,u8g2_font_samim_16_t_all,const uint8_t[], -Variable,-,u8g2_font_samim_fd_10_t_all,const uint8_t[], -Variable,-,u8g2_font_samim_fd_12_t_all,const uint8_t[], -Variable,-,u8g2_font_samim_fd_14_t_all,const uint8_t[], -Variable,-,u8g2_font_samim_fd_16_t_all,const uint8_t[], -Variable,-,u8g2_font_sandyforest_tn,const uint8_t[], -Variable,-,u8g2_font_sandyforest_tr,const uint8_t[], -Variable,-,u8g2_font_sandyforest_tu,const uint8_t[], -Variable,-,u8g2_font_secretaryhand_t_all,const uint8_t[], -Variable,-,u8g2_font_secretaryhand_tf,const uint8_t[], -Variable,-,u8g2_font_secretaryhand_tn,const uint8_t[], -Variable,-,u8g2_font_secretaryhand_tr,const uint8_t[], -Variable,-,u8g2_font_seraphimb1_tr,const uint8_t[], -Variable,-,u8g2_font_shylock_nbp_t_all,const uint8_t[], -Variable,-,u8g2_font_shylock_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_shylock_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_shylock_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_siji_t_6x10,const uint8_t[], -Variable,-,u8g2_font_sirclive_tn,const uint8_t[], -Variable,-,u8g2_font_sirclive_tr,const uint8_t[], -Variable,-,u8g2_font_sirclivethebold_tn,const uint8_t[], -Variable,-,u8g2_font_sirclivethebold_tr,const uint8_t[], -Variable,-,u8g2_font_smart_patrol_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_smart_patrol_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_smart_patrol_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_squirrel_tn,const uint8_t[], -Variable,-,u8g2_font_squirrel_tr,const uint8_t[], -Variable,-,u8g2_font_squirrel_tu,const uint8_t[], -Variable,-,u8g2_font_sticker_mel_tn,const uint8_t[], -Variable,-,u8g2_font_sticker_mel_tr,const uint8_t[], -Variable,-,u8g2_font_synchronizer_nbp_tf,const uint8_t[], -Variable,-,u8g2_font_synchronizer_nbp_tn,const uint8_t[], -Variable,-,u8g2_font_synchronizer_nbp_tr,const uint8_t[], -Variable,-,u8g2_font_t0_11_me,const uint8_t[], -Variable,-,u8g2_font_t0_11_mf,const uint8_t[], -Variable,-,u8g2_font_t0_11_mn,const uint8_t[], -Variable,-,u8g2_font_t0_11_mr,const uint8_t[], -Variable,-,u8g2_font_t0_11_t_all,const uint8_t[], -Variable,-,u8g2_font_t0_11_te,const uint8_t[], -Variable,-,u8g2_font_t0_11_tf,const uint8_t[], -Variable,-,u8g2_font_t0_11_tn,const uint8_t[], -Variable,-,u8g2_font_t0_11_tr,const uint8_t[], -Variable,-,u8g2_font_t0_11b_me,const uint8_t[], -Variable,-,u8g2_font_t0_11b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_11b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_11b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_11b_te,const uint8_t[], -Variable,-,u8g2_font_t0_11b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_11b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_11b_tr,const uint8_t[], -Variable,-,u8g2_font_t0_12_me,const uint8_t[], -Variable,-,u8g2_font_t0_12_mf,const uint8_t[], -Variable,-,u8g2_font_t0_12_mn,const uint8_t[], -Variable,-,u8g2_font_t0_12_mr,const uint8_t[], -Variable,-,u8g2_font_t0_12_te,const uint8_t[], -Variable,-,u8g2_font_t0_12_tf,const uint8_t[], -Variable,-,u8g2_font_t0_12_tn,const uint8_t[], -Variable,-,u8g2_font_t0_12_tr,const uint8_t[], -Variable,-,u8g2_font_t0_12b_me,const uint8_t[], -Variable,-,u8g2_font_t0_12b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_12b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_12b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_12b_te,const uint8_t[], -Variable,-,u8g2_font_t0_12b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_12b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_12b_tr,const uint8_t[], -Variable,-,u8g2_font_t0_13_me,const uint8_t[], -Variable,-,u8g2_font_t0_13_mf,const uint8_t[], -Variable,-,u8g2_font_t0_13_mn,const uint8_t[], -Variable,-,u8g2_font_t0_13_mr,const uint8_t[], -Variable,-,u8g2_font_t0_13_te,const uint8_t[], -Variable,-,u8g2_font_t0_13_tf,const uint8_t[], -Variable,-,u8g2_font_t0_13_tn,const uint8_t[], -Variable,-,u8g2_font_t0_13_tr,const uint8_t[], -Variable,-,u8g2_font_t0_13b_me,const uint8_t[], -Variable,-,u8g2_font_t0_13b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_13b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_13b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_13b_te,const uint8_t[], -Variable,-,u8g2_font_t0_13b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_13b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_13b_tr,const uint8_t[], -Variable,-,u8g2_font_t0_14_me,const uint8_t[], -Variable,-,u8g2_font_t0_14_mf,const uint8_t[], -Variable,-,u8g2_font_t0_14_mn,const uint8_t[], -Variable,-,u8g2_font_t0_14_mr,const uint8_t[], -Variable,-,u8g2_font_t0_14_te,const uint8_t[], -Variable,-,u8g2_font_t0_14_tf,const uint8_t[], -Variable,-,u8g2_font_t0_14_tn,const uint8_t[], -Variable,-,u8g2_font_t0_14_tr,const uint8_t[], -Variable,-,u8g2_font_t0_14b_me,const uint8_t[], -Variable,-,u8g2_font_t0_14b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_14b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_14b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_14b_te,const uint8_t[], -Variable,-,u8g2_font_t0_14b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_14b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_14b_tr,const uint8_t[], -Variable,-,u8g2_font_t0_15_me,const uint8_t[], -Variable,-,u8g2_font_t0_15_mf,const uint8_t[], -Variable,-,u8g2_font_t0_15_mn,const uint8_t[], -Variable,-,u8g2_font_t0_15_mr,const uint8_t[], -Variable,-,u8g2_font_t0_15_te,const uint8_t[], -Variable,-,u8g2_font_t0_15_tf,const uint8_t[], -Variable,-,u8g2_font_t0_15_tn,const uint8_t[], -Variable,-,u8g2_font_t0_15_tr,const uint8_t[], -Variable,-,u8g2_font_t0_15b_me,const uint8_t[], -Variable,-,u8g2_font_t0_15b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_15b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_15b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_15b_te,const uint8_t[], -Variable,-,u8g2_font_t0_15b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_15b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_15b_tr,const uint8_t[], -Variable,-,u8g2_font_t0_16_me,const uint8_t[], -Variable,-,u8g2_font_t0_16_mf,const uint8_t[], -Variable,-,u8g2_font_t0_16_mn,const uint8_t[], -Variable,-,u8g2_font_t0_16_mr,const uint8_t[], -Variable,-,u8g2_font_t0_16_te,const uint8_t[], -Variable,-,u8g2_font_t0_16_tf,const uint8_t[], -Variable,-,u8g2_font_t0_16_tn,const uint8_t[], -Variable,-,u8g2_font_t0_16_tr,const uint8_t[], -Variable,-,u8g2_font_t0_16b_me,const uint8_t[], -Variable,-,u8g2_font_t0_16b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_16b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_16b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_16b_te,const uint8_t[], -Variable,-,u8g2_font_t0_16b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_16b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_16b_tr,const uint8_t[], -Variable,-,u8g2_font_t0_17_me,const uint8_t[], -Variable,-,u8g2_font_t0_17_mf,const uint8_t[], -Variable,-,u8g2_font_t0_17_mn,const uint8_t[], -Variable,-,u8g2_font_t0_17_mr,const uint8_t[], -Variable,-,u8g2_font_t0_17_te,const uint8_t[], -Variable,-,u8g2_font_t0_17_tf,const uint8_t[], -Variable,-,u8g2_font_t0_17_tn,const uint8_t[], -Variable,-,u8g2_font_t0_17_tr,const uint8_t[], -Variable,-,u8g2_font_t0_17b_me,const uint8_t[], -Variable,-,u8g2_font_t0_17b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_17b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_17b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_17b_te,const uint8_t[], -Variable,-,u8g2_font_t0_17b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_17b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_17b_tr,const uint8_t[], -Variable,-,u8g2_font_t0_18_me,const uint8_t[], -Variable,-,u8g2_font_t0_18_mf,const uint8_t[], -Variable,-,u8g2_font_t0_18_mn,const uint8_t[], -Variable,-,u8g2_font_t0_18_mr,const uint8_t[], -Variable,-,u8g2_font_t0_18_te,const uint8_t[], -Variable,-,u8g2_font_t0_18_tf,const uint8_t[], -Variable,-,u8g2_font_t0_18_tn,const uint8_t[], -Variable,-,u8g2_font_t0_18_tr,const uint8_t[], -Variable,-,u8g2_font_t0_18b_me,const uint8_t[], -Variable,-,u8g2_font_t0_18b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_18b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_18b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_18b_te,const uint8_t[], -Variable,-,u8g2_font_t0_18b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_18b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_18b_tr,const uint8_t[], -Variable,-,u8g2_font_t0_22_me,const uint8_t[], -Variable,-,u8g2_font_t0_22_mf,const uint8_t[], -Variable,-,u8g2_font_t0_22_mn,const uint8_t[], -Variable,-,u8g2_font_t0_22_mr,const uint8_t[], -Variable,-,u8g2_font_t0_22_te,const uint8_t[], -Variable,-,u8g2_font_t0_22_tf,const uint8_t[], -Variable,-,u8g2_font_t0_22_tn,const uint8_t[], -Variable,-,u8g2_font_t0_22_tr,const uint8_t[], -Variable,-,u8g2_font_t0_22b_me,const uint8_t[], -Variable,-,u8g2_font_t0_22b_mf,const uint8_t[], -Variable,-,u8g2_font_t0_22b_mn,const uint8_t[], -Variable,-,u8g2_font_t0_22b_mr,const uint8_t[], -Variable,-,u8g2_font_t0_22b_te,const uint8_t[], -Variable,-,u8g2_font_t0_22b_tf,const uint8_t[], -Variable,-,u8g2_font_t0_22b_tn,const uint8_t[], -Variable,-,u8g2_font_t0_22b_tr,const uint8_t[], -Variable,-,u8g2_font_tallpix_tr,const uint8_t[], -Variable,-,u8g2_font_tenfatguys_t_all,const uint8_t[], -Variable,-,u8g2_font_tenfatguys_tf,const uint8_t[], -Variable,-,u8g2_font_tenfatguys_tn,const uint8_t[], -Variable,-,u8g2_font_tenfatguys_tr,const uint8_t[], -Variable,-,u8g2_font_tenfatguys_tu,const uint8_t[], -Variable,-,u8g2_font_tenstamps_mf,const uint8_t[], -Variable,-,u8g2_font_tenstamps_mn,const uint8_t[], -Variable,-,u8g2_font_tenstamps_mr,const uint8_t[], -Variable,-,u8g2_font_tenstamps_mu,const uint8_t[], -Variable,-,u8g2_font_tenthinguys_t_all,const uint8_t[], -Variable,-,u8g2_font_tenthinguys_tf,const uint8_t[], -Variable,-,u8g2_font_tenthinguys_tn,const uint8_t[], -Variable,-,u8g2_font_tenthinguys_tr,const uint8_t[], -Variable,-,u8g2_font_tenthinguys_tu,const uint8_t[], -Variable,-,u8g2_font_tenthinnerguys_t_all,const uint8_t[], -Variable,-,u8g2_font_tenthinnerguys_tf,const uint8_t[], -Variable,-,u8g2_font_tenthinnerguys_tn,const uint8_t[], -Variable,-,u8g2_font_tenthinnerguys_tr,const uint8_t[], -Variable,-,u8g2_font_tenthinnerguys_tu,const uint8_t[], -Variable,-,u8g2_font_timB08_tf,const uint8_t[], -Variable,-,u8g2_font_timB08_tn,const uint8_t[], -Variable,-,u8g2_font_timB08_tr,const uint8_t[], -Variable,-,u8g2_font_timB10_tf,const uint8_t[], -Variable,-,u8g2_font_timB10_tn,const uint8_t[], -Variable,-,u8g2_font_timB10_tr,const uint8_t[], -Variable,-,u8g2_font_timB12_tf,const uint8_t[], -Variable,-,u8g2_font_timB12_tn,const uint8_t[], -Variable,-,u8g2_font_timB12_tr,const uint8_t[], -Variable,-,u8g2_font_timB14_tf,const uint8_t[], -Variable,-,u8g2_font_timB14_tn,const uint8_t[], -Variable,-,u8g2_font_timB14_tr,const uint8_t[], -Variable,-,u8g2_font_timB18_tf,const uint8_t[], -Variable,-,u8g2_font_timB18_tn,const uint8_t[], -Variable,-,u8g2_font_timB18_tr,const uint8_t[], -Variable,-,u8g2_font_timB24_tf,const uint8_t[], -Variable,-,u8g2_font_timB24_tn,const uint8_t[], -Variable,-,u8g2_font_timB24_tr,const uint8_t[], -Variable,-,u8g2_font_timR08_tf,const uint8_t[], -Variable,-,u8g2_font_timR08_tn,const uint8_t[], -Variable,-,u8g2_font_timR08_tr,const uint8_t[], -Variable,-,u8g2_font_timR10_tf,const uint8_t[], -Variable,-,u8g2_font_timR10_tn,const uint8_t[], -Variable,-,u8g2_font_timR10_tr,const uint8_t[], -Variable,-,u8g2_font_timR12_tf,const uint8_t[], -Variable,-,u8g2_font_timR12_tn,const uint8_t[], -Variable,-,u8g2_font_timR12_tr,const uint8_t[], -Variable,-,u8g2_font_timR14_tf,const uint8_t[], -Variable,-,u8g2_font_timR14_tn,const uint8_t[], -Variable,-,u8g2_font_timR14_tr,const uint8_t[], -Variable,-,u8g2_font_timR18_tf,const uint8_t[], -Variable,-,u8g2_font_timR18_tn,const uint8_t[], -Variable,-,u8g2_font_timR18_tr,const uint8_t[], -Variable,-,u8g2_font_timR24_tf,const uint8_t[], -Variable,-,u8g2_font_timR24_tn,const uint8_t[], -Variable,-,u8g2_font_timR24_tr,const uint8_t[], -Variable,-,u8g2_font_tinytim_tf,const uint8_t[], -Variable,-,u8g2_font_tinytim_tn,const uint8_t[], -Variable,-,u8g2_font_tinytim_tr,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_me,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_mf,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_mn,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_mr,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_t_all,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_te,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_tf,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_tn,const uint8_t[], -Variable,-,u8g2_font_tom_thumb_4x6_tr,const uint8_t[], -Variable,-,u8g2_font_tooseornament_tf,const uint8_t[], -Variable,-,u8g2_font_tooseornament_tn,const uint8_t[], -Variable,-,u8g2_font_tooseornament_tr,const uint8_t[], -Variable,-,u8g2_font_torussansbold8_8n,const uint8_t[], -Variable,-,u8g2_font_torussansbold8_8r,const uint8_t[], -Variable,-,u8g2_font_torussansbold8_8u,const uint8_t[], -Variable,-,u8g2_font_trixel_square_tf,const uint8_t[], -Variable,-,u8g2_font_trixel_square_tn,const uint8_t[], -Variable,-,u8g2_font_trixel_square_tr,const uint8_t[], -Variable,-,u8g2_font_twelvedings_t_all,const uint8_t[], -Variable,-,u8g2_font_u8glib_4_hf,const uint8_t[], -Variable,-,u8g2_font_u8glib_4_hr,const uint8_t[], -Variable,-,u8g2_font_u8glib_4_tf,const uint8_t[], -Variable,-,u8g2_font_u8glib_4_tr,const uint8_t[], -Variable,-,u8g2_font_unifont_h_symbols,const uint8_t[], -Variable,-,u8g2_font_unifont_t_0_72_73,const uint8_t[], -Variable,-,u8g2_font_unifont_t_0_75,const uint8_t[], -Variable,-,u8g2_font_unifont_t_0_76,const uint8_t[], -Variable,-,u8g2_font_unifont_t_0_77,const uint8_t[], -Variable,-,u8g2_font_unifont_t_0_78_79,const uint8_t[], -Variable,-,u8g2_font_unifont_t_0_86,const uint8_t[], -Variable,-,u8g2_font_unifont_t_72_73,const uint8_t[], -Variable,-,u8g2_font_unifont_t_75,const uint8_t[], -Variable,-,u8g2_font_unifont_t_76,const uint8_t[], -Variable,-,u8g2_font_unifont_t_77,const uint8_t[], -Variable,-,u8g2_font_unifont_t_78_79,const uint8_t[], -Variable,-,u8g2_font_unifont_t_86,const uint8_t[], -Variable,-,u8g2_font_unifont_t_animals,const uint8_t[], -Variable,-,u8g2_font_unifont_t_arabic,const uint8_t[], -Variable,-,u8g2_font_unifont_t_bengali,const uint8_t[], -Variable,-,u8g2_font_unifont_t_cards,const uint8_t[], -Variable,-,u8g2_font_unifont_t_chinese1,const uint8_t[], -Variable,-,u8g2_font_unifont_t_chinese2,const uint8_t[], -Variable,-,u8g2_font_unifont_t_chinese3,const uint8_t[], -Variable,-,u8g2_font_unifont_t_cyrillic,const uint8_t[], -Variable,-,u8g2_font_unifont_t_devanagari,const uint8_t[], -Variable,-,u8g2_font_unifont_t_domino,const uint8_t[], -Variable,-,u8g2_font_unifont_t_emoticons,const uint8_t[], -Variable,-,u8g2_font_unifont_t_extended,const uint8_t[], -Variable,-,u8g2_font_unifont_t_greek,const uint8_t[], -Variable,-,u8g2_font_unifont_t_hebrew,const uint8_t[], -Variable,-,u8g2_font_unifont_t_japanese1,const uint8_t[], -Variable,-,u8g2_font_unifont_t_japanese2,const uint8_t[], -Variable,-,u8g2_font_unifont_t_japanese3,const uint8_t[], -Variable,-,u8g2_font_unifont_t_korean1,const uint8_t[], -Variable,-,u8g2_font_unifont_t_korean2,const uint8_t[], -Variable,-,u8g2_font_unifont_t_latin,const uint8_t[], -Variable,-,u8g2_font_unifont_t_polish,const uint8_t[], -Variable,-,u8g2_font_unifont_t_symbols,const uint8_t[], -Variable,-,u8g2_font_unifont_t_tibetan,const uint8_t[], -Variable,-,u8g2_font_unifont_t_urdu,const uint8_t[], -Variable,-,u8g2_font_unifont_t_vietnamese1,const uint8_t[], -Variable,-,u8g2_font_unifont_t_vietnamese2,const uint8_t[], -Variable,-,u8g2_font_unifont_t_weather,const uint8_t[], -Variable,-,u8g2_font_unifont_te,const uint8_t[], -Variable,-,u8g2_font_unifont_tf,const uint8_t[], -Variable,-,u8g2_font_unifont_tr,const uint8_t[], -Variable,-,u8g2_font_victoriabold8_8n,const uint8_t[], -Variable,-,u8g2_font_victoriabold8_8r,const uint8_t[], -Variable,-,u8g2_font_victoriabold8_8u,const uint8_t[], -Variable,-,u8g2_font_victoriamedium8_8n,const uint8_t[], -Variable,-,u8g2_font_victoriamedium8_8r,const uint8_t[], -Variable,-,u8g2_font_victoriamedium8_8u,const uint8_t[], -Variable,-,u8g2_font_wqy12_t_chinese1,const uint8_t[], -Variable,-,u8g2_font_wqy12_t_chinese2,const uint8_t[], -Variable,-,u8g2_font_wqy12_t_chinese3,const uint8_t[], -Variable,-,u8g2_font_wqy12_t_gb2312,const uint8_t[], -Variable,-,u8g2_font_wqy12_t_gb2312a,const uint8_t[], -Variable,-,u8g2_font_wqy12_t_gb2312b,const uint8_t[], -Variable,-,u8g2_font_wqy13_t_chinese1,const uint8_t[], -Variable,-,u8g2_font_wqy13_t_chinese2,const uint8_t[], -Variable,-,u8g2_font_wqy13_t_chinese3,const uint8_t[], -Variable,-,u8g2_font_wqy13_t_gb2312,const uint8_t[], -Variable,-,u8g2_font_wqy13_t_gb2312a,const uint8_t[], -Variable,-,u8g2_font_wqy13_t_gb2312b,const uint8_t[], -Variable,-,u8g2_font_wqy14_t_chinese1,const uint8_t[], -Variable,-,u8g2_font_wqy14_t_chinese2,const uint8_t[], -Variable,-,u8g2_font_wqy14_t_chinese3,const uint8_t[], -Variable,-,u8g2_font_wqy14_t_gb2312,const uint8_t[], -Variable,-,u8g2_font_wqy14_t_gb2312a,const uint8_t[], -Variable,-,u8g2_font_wqy14_t_gb2312b,const uint8_t[], -Variable,-,u8g2_font_wqy15_t_chinese1,const uint8_t[], -Variable,-,u8g2_font_wqy15_t_chinese2,const uint8_t[], -Variable,-,u8g2_font_wqy15_t_chinese3,const uint8_t[], -Variable,-,u8g2_font_wqy15_t_gb2312,const uint8_t[], -Variable,-,u8g2_font_wqy15_t_gb2312a,const uint8_t[], -Variable,-,u8g2_font_wqy15_t_gb2312b,const uint8_t[], -Variable,-,u8g2_font_wqy16_t_chinese1,const uint8_t[], -Variable,-,u8g2_font_wqy16_t_chinese2,const uint8_t[], -Variable,-,u8g2_font_wqy16_t_chinese3,const uint8_t[], -Variable,-,u8g2_font_wqy16_t_gb2312,const uint8_t[], -Variable,-,u8g2_font_wqy16_t_gb2312a,const uint8_t[], -Variable,-,u8g2_font_wqy16_t_gb2312b,const uint8_t[], -Variable,-,u8x8_font_5x7_f,const uint8_t[], -Variable,-,u8x8_font_5x7_n,const uint8_t[], -Variable,-,u8x8_font_5x7_r,const uint8_t[], -Variable,-,u8x8_font_5x8_f,const uint8_t[], -Variable,-,u8x8_font_5x8_n,const uint8_t[], -Variable,-,u8x8_font_5x8_r,const uint8_t[], -Variable,-,u8x8_font_7x14B_1x2_f,const uint8_t[], -Variable,-,u8x8_font_7x14B_1x2_n,const uint8_t[], -Variable,-,u8x8_font_7x14B_1x2_r,const uint8_t[], -Variable,-,u8x8_font_7x14_1x2_f,const uint8_t[], -Variable,-,u8x8_font_7x14_1x2_n,const uint8_t[], -Variable,-,u8x8_font_7x14_1x2_r,const uint8_t[], -Variable,-,u8x8_font_8x13B_1x2_f,const uint8_t[], -Variable,-,u8x8_font_8x13B_1x2_n,const uint8_t[], -Variable,-,u8x8_font_8x13B_1x2_r,const uint8_t[], -Variable,-,u8x8_font_8x13_1x2_f,const uint8_t[], -Variable,-,u8x8_font_8x13_1x2_n,const uint8_t[], -Variable,-,u8x8_font_8x13_1x2_r,const uint8_t[], -Variable,-,u8x8_font_amstrad_cpc_extended_f,const uint8_t[], -Variable,-,u8x8_font_amstrad_cpc_extended_n,const uint8_t[], -Variable,-,u8x8_font_amstrad_cpc_extended_r,const uint8_t[], -Variable,-,u8x8_font_amstrad_cpc_extended_u,const uint8_t[], -Variable,-,u8x8_font_artossans8_n,const uint8_t[], -Variable,-,u8x8_font_artossans8_r,const uint8_t[], -Variable,-,u8x8_font_artossans8_u,const uint8_t[], -Variable,-,u8x8_font_artosserif8_n,const uint8_t[], -Variable,-,u8x8_font_artosserif8_r,const uint8_t[], -Variable,-,u8x8_font_artosserif8_u,const uint8_t[], -Variable,-,u8x8_font_chroma48medium8_n,const uint8_t[], -Variable,-,u8x8_font_chroma48medium8_r,const uint8_t[], -Variable,-,u8x8_font_chroma48medium8_u,const uint8_t[], -Variable,-,u8x8_font_courB18_2x3_f,const uint8_t[], -Variable,-,u8x8_font_courB18_2x3_n,const uint8_t[], -Variable,-,u8x8_font_courB18_2x3_r,const uint8_t[], -Variable,-,u8x8_font_courB24_3x4_f,const uint8_t[], -Variable,-,u8x8_font_courB24_3x4_n,const uint8_t[], -Variable,-,u8x8_font_courB24_3x4_r,const uint8_t[], -Variable,-,u8x8_font_courR18_2x3_f,const uint8_t[], -Variable,-,u8x8_font_courR18_2x3_n,const uint8_t[], -Variable,-,u8x8_font_courR18_2x3_r,const uint8_t[], -Variable,-,u8x8_font_courR24_3x4_f,const uint8_t[], -Variable,-,u8x8_font_courR24_3x4_n,const uint8_t[], -Variable,-,u8x8_font_courR24_3x4_r,const uint8_t[], -Variable,-,u8x8_font_inb21_2x4_f,const uint8_t[], -Variable,-,u8x8_font_inb21_2x4_n,const uint8_t[], -Variable,-,u8x8_font_inb21_2x4_r,const uint8_t[], -Variable,-,u8x8_font_inb33_3x6_f,const uint8_t[], -Variable,-,u8x8_font_inb33_3x6_n,const uint8_t[], -Variable,-,u8x8_font_inb33_3x6_r,const uint8_t[], -Variable,-,u8x8_font_inb46_4x8_f,const uint8_t[], -Variable,-,u8x8_font_inb46_4x8_n,const uint8_t[], -Variable,-,u8x8_font_inb46_4x8_r,const uint8_t[], -Variable,-,u8x8_font_inr21_2x4_f,const uint8_t[], -Variable,-,u8x8_font_inr21_2x4_n,const uint8_t[], -Variable,-,u8x8_font_inr21_2x4_r,const uint8_t[], -Variable,-,u8x8_font_inr33_3x6_f,const uint8_t[], -Variable,-,u8x8_font_inr33_3x6_n,const uint8_t[], -Variable,-,u8x8_font_inr33_3x6_r,const uint8_t[], -Variable,-,u8x8_font_inr46_4x8_f,const uint8_t[], -Variable,-,u8x8_font_inr46_4x8_n,const uint8_t[], -Variable,-,u8x8_font_inr46_4x8_r,const uint8_t[], -Variable,-,u8x8_font_lucasarts_scumm_subtitle_o_2x2_f,const uint8_t[], -Variable,-,u8x8_font_lucasarts_scumm_subtitle_o_2x2_n,const uint8_t[], -Variable,-,u8x8_font_lucasarts_scumm_subtitle_o_2x2_r,const uint8_t[], -Variable,-,u8x8_font_lucasarts_scumm_subtitle_r_2x2_f,const uint8_t[], -Variable,-,u8x8_font_lucasarts_scumm_subtitle_r_2x2_n,const uint8_t[], -Variable,-,u8x8_font_lucasarts_scumm_subtitle_r_2x2_r,const uint8_t[], -Variable,-,u8x8_font_open_iconic_arrow_1x1,const uint8_t[], -Variable,-,u8x8_font_open_iconic_arrow_2x2,const uint8_t[], -Variable,-,u8x8_font_open_iconic_arrow_4x4,const uint8_t[], -Variable,-,u8x8_font_open_iconic_arrow_8x8,const uint8_t[], -Variable,-,u8x8_font_open_iconic_check_1x1,const uint8_t[], -Variable,-,u8x8_font_open_iconic_check_2x2,const uint8_t[], -Variable,-,u8x8_font_open_iconic_check_4x4,const uint8_t[], -Variable,-,u8x8_font_open_iconic_check_8x8,const uint8_t[], -Variable,-,u8x8_font_open_iconic_embedded_1x1,const uint8_t[], -Variable,-,u8x8_font_open_iconic_embedded_2x2,const uint8_t[], -Variable,-,u8x8_font_open_iconic_embedded_4x4,const uint8_t[], -Variable,-,u8x8_font_open_iconic_embedded_8x8,const uint8_t[], -Variable,-,u8x8_font_open_iconic_play_1x1,const uint8_t[], -Variable,-,u8x8_font_open_iconic_play_2x2,const uint8_t[], -Variable,-,u8x8_font_open_iconic_play_4x4,const uint8_t[], -Variable,-,u8x8_font_open_iconic_play_8x8,const uint8_t[], -Variable,-,u8x8_font_open_iconic_thing_1x1,const uint8_t[], -Variable,-,u8x8_font_open_iconic_thing_2x2,const uint8_t[], -Variable,-,u8x8_font_open_iconic_thing_4x4,const uint8_t[], -Variable,-,u8x8_font_open_iconic_thing_8x8,const uint8_t[], -Variable,-,u8x8_font_open_iconic_weather_1x1,const uint8_t[], -Variable,-,u8x8_font_open_iconic_weather_2x2,const uint8_t[], -Variable,-,u8x8_font_open_iconic_weather_4x4,const uint8_t[], -Variable,-,u8x8_font_open_iconic_weather_8x8,const uint8_t[], -Variable,-,u8x8_font_pcsenior_f,const uint8_t[], -Variable,-,u8x8_font_pcsenior_n,const uint8_t[], -Variable,-,u8x8_font_pcsenior_r,const uint8_t[], -Variable,-,u8x8_font_pcsenior_u,const uint8_t[], -Variable,-,u8x8_font_pressstart2p_f,const uint8_t[], -Variable,-,u8x8_font_pressstart2p_n,const uint8_t[], -Variable,-,u8x8_font_pressstart2p_r,const uint8_t[], -Variable,-,u8x8_font_pressstart2p_u,const uint8_t[], -Variable,-,u8x8_font_profont29_2x3_f,const uint8_t[], -Variable,-,u8x8_font_profont29_2x3_n,const uint8_t[], -Variable,-,u8x8_font_profont29_2x3_r,const uint8_t[], -Variable,-,u8x8_font_px437wyse700a_2x2_f,const uint8_t[], -Variable,-,u8x8_font_px437wyse700a_2x2_n,const uint8_t[], -Variable,-,u8x8_font_px437wyse700a_2x2_r,const uint8_t[], -Variable,-,u8x8_font_px437wyse700b_2x2_f,const uint8_t[], -Variable,-,u8x8_font_px437wyse700b_2x2_n,const uint8_t[], -Variable,-,u8x8_font_px437wyse700b_2x2_r,const uint8_t[], -Variable,-,u8x8_font_pxplusibmcga_f,const uint8_t[], -Variable,-,u8x8_font_pxplusibmcga_n,const uint8_t[], -Variable,-,u8x8_font_pxplusibmcga_r,const uint8_t[], -Variable,-,u8x8_font_pxplusibmcga_u,const uint8_t[], -Variable,-,u8x8_font_pxplusibmcgathin_f,const uint8_t[], -Variable,-,u8x8_font_pxplusibmcgathin_n,const uint8_t[], -Variable,-,u8x8_font_pxplusibmcgathin_r,const uint8_t[], -Variable,-,u8x8_font_pxplusibmcgathin_u,const uint8_t[], -Variable,-,u8x8_font_pxplustandynewtv_f,const uint8_t[], -Variable,-,u8x8_font_pxplustandynewtv_n,const uint8_t[], -Variable,-,u8x8_font_pxplustandynewtv_r,const uint8_t[], -Variable,-,u8x8_font_pxplustandynewtv_u,const uint8_t[], -Variable,-,u8x8_font_saikyosansbold8_n,const uint8_t[], -Variable,-,u8x8_font_saikyosansbold8_u,const uint8_t[], -Variable,-,u8x8_font_torussansbold8_n,const uint8_t[], -Variable,-,u8x8_font_torussansbold8_r,const uint8_t[], -Variable,-,u8x8_font_torussansbold8_u,const uint8_t[], -Variable,-,u8x8_font_victoriabold8_n,const uint8_t[], -Variable,-,u8x8_font_victoriabold8_r,const uint8_t[], -Variable,-,u8x8_font_victoriabold8_u,const uint8_t[], -Variable,-,u8x8_font_victoriamedium8_n,const uint8_t[], -Variable,-,u8x8_font_victoriamedium8_r,const uint8_t[], -Variable,-,u8x8_font_victoriamedium8_u,const uint8_t[], Variable,+,usb_cdc_dual,FuriHalUsbInterface, Variable,+,usb_cdc_single,FuriHalUsbInterface, Variable,+,usb_hid,FuriHalUsbInterface, diff --git a/lib/SConscript b/lib/SConscript index ec5dfda1e..8727746d8 100644 --- a/lib/SConscript +++ b/lib/SConscript @@ -44,7 +44,6 @@ env.Append( "variant", ) ), - File("u8g2/u8g2.h"), ], CPPDEFINES=[ '"M_MEMORY_FULL(x)=abort()"', From 1d11bc64a935270b7a2fac2c0df9fa2ef0bddcf9 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 22 May 2023 06:00:45 +0300 Subject: [PATCH 21/23] Update readme & changelog --- CHANGELOG.md | 49 +++++++++++-------------------------------------- ReadMe.md | 2 +- 2 files changed, 12 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a16fc8256..5dc889d2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,42 +1,15 @@ ### New changes -* **Warning! After installing, Desktop settings (Favoutite apps, PIN Code, AutoLock time..) will be resetted to default due to OFW changes, Please set your PIN code, Favourite apps again in Settings->Desktop** -* New way of changing device name -> **Now can be changed in Settings->Desktop** (by @xMasterX and @Willy-JL) -* Plugins: BadBT plugin (BT version of BadKB) [(by Willy-JL, ClaraCrazy, XFW contributors)](https://github.com/ClaraCrazy/Flipper-Xtreme/tree/dev/applications/main/bad_kb) -* Plugins: WiFi Marauder -> Added sniff pmkid on selected aps from 0.10.4 update (by @clipboard1) -* Plugins: SubGHz Bruteforcer -> Increase delay just a little bit to fix some cases when receiver will not get codes and decrease manual transmit delay -* Plugins: UART Terminal -> Fix crashes on plugin load with RX connected -* NFC: Mifare mini with SAK 0x89 support -* SubGHz: **CAME Atomo - Add manually support and custom buttons support** -* SubGHz: Fix crashes when deleting signals using right arrow button in `Read` mode -* SubGHz: Restore Rx indication after deletion after Memory is FULL (by @wosk | PR #464) -* SubGHz: **App refactoring** (OFW code ported + our code was refactored/cleaned up too) (by @gid9798 and @xMasterX | PR #461) -* SubGHz: Using scene manager functions in DecodeRAW (by @gid9798 | PR #462) -* SubGHz: Protocols and custom buttons refactoring (by @gid9798 | PR #465) -* SubGHz: Move `counter increase` setting out of debug, change max value -* GUI: Submenu locked elements (by @Willy-JL and @giacomoferretti) -* GUI: Text Input improvements, added cursor and ability to set minimal length (by @Willy-JL) -* BT API: Functions that allow to change bt mac address and device broadcasted name (by @Willy-JL and XFW contributors) -* Infrared: `External output` move out of debug and add power option for external modules -* Infrared: Updated universal remote assets (by @amec0e | PR #474) -* Extra pack: Some app fixes -* FBT: Fix vscode example config for debug builds - please run `./fbt vscode_dist` again if you had issues with debug builds size -* OFW PR 2316: NFC V support (by @g3gg0 & @nvx) -* OFW PR 2669: nfc: Fix MFUL tearing flags read (by @GMMan) -* OFW PR 2666: BadUSB: Add fr-FR-mac key layout (by @FelixLgr) -* OFW: api: added lib/nfc/protocols/nfc_util.h -* OFW: fix PIN retry count reset on reboot -* OFW: fbt: allow strings for fap_version field in app manifests -* OFW: Rpc: add desktop service. Desktop: refactor locking routine. **Now PIN lock is actually cannot be bypassed by reboot!** / **Desktop settings will be reset, please set your PIN and favourite apps again!** -* OFW: Part 2 of hooking C2 IPC -* OFW: ble: attempt to handle hardfaulted c2 -* OFW: Add Mfkey32 application -* OFW: Added DigitalSequence and PulseReader -* OFW: Debug: revert cortex debug to lxml and drop DWT **(reapply your VSCode launch.json from example folder)** -* OFW: furi_crash: added C2 status; added fw-version gdb command -* OFW: Removed STM32CubeWB module -* OFW: API version in UI -* OFW: ufbt: deploying sample ufbt automation for new apps; added `source "ufbt -s env"` for toolchain access -* OFW: Fix storage.py exist_dir logic +* SubGHz Remote: Full refactoring, app was re-made from scratch (by @gid9798) +* API: Cleanup, mini refactoring of some apps (+6k of free flash space) +* SubGHz: Various fixes (by @gid9798) +* SubGHz: Fix counter settings in debug +* SubGHz: Move dangerous_settings check (by @gid9798 | PR #475) +* Misc: Name changer code moved to proper place, load after system startup + extra checks +* Plugins: NMEA GPS UART - stability fix +* Plugins: Port XFW keyboard with extra symbols to WiFi Marauder instead of using UART Term keyboard (thanks to @Willy-JL) +* Plugins: Update WiFi Marauder [(by 0xchocolate)](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) +* OFW: fbt: Use union for old py (Fix builds if using older python versions) +* OFW PR 2682: USB HID report timeout (by nminaylov) #### [🎲 Download latest extra apps pack](https://github.com/xMasterX/all-the-plugins/archive/refs/heads/main.zip) diff --git a/ReadMe.md b/ReadMe.md index 596891d6e..fe6c7fb34 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -145,7 +145,7 @@ You can support us by using links or addresses below: - ESP32: WiFi Marauder companion plugin [(by 0xchocolate)](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) - Saving .pcap on flipper microSD [by tcpassos](https://github.com/tcpassos/flipperzero-firmware-with-wifi-marauder-companion) -> Only with custom marauder build (It is necessary to uncomment "#define WRITE_PACKETS_SERIAL" in configs.h (in marauder fw) and compile the firmware for the wifi board.) Or download precompiled build -> [Download esp32_marauder_ver_flipper_sd_serial.bin](https://github.com/justcallmekoko/ESP32Marauder/releases/latest) - NRF24: Sniffer & MouseJacker (with changes) [(by mothball187)](https://github.com/mothball187/flipperzero-nrf24/tree/main/mousejacker) - Simple Clock (timer by GMMan) [(original by CompaqDisc)](https://gist.github.com/CompaqDisc/4e329c501bd03c1e801849b81f48ea61) -- **Sub-GHz Remote** (UniversalRF Remix) [(by @darmiel & @xMasterX)](https://github.com/darmiel/flipper-playlist/tree/feat/unirf-protocols) (original by @ESurge) +- **Sub-GHz Remote** [(by @gid9798)](https://github.com/gid9798) - Spectrum Analyzer (with changes) [(by jolcese)](https://github.com/jolcese/flipperzero-firmware/tree/spectrum/applications/spectrum_analyzer) - [Ultra Narrow mode & scan channels non-consecutively](https://github.com/theY4Kman/flipperzero-firmware/commits?author=theY4Kman) - Metronome [(by panki27)](https://github.com/panki27/Metronome) - DTMF Dolphin [(by litui)](https://github.com/litui/dtmf_dolphin) From 451ba8da9f04a88f892e6caa6aba457ab25f5d31 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 22 May 2023 06:03:28 +0300 Subject: [PATCH 22/23] More API cleanup --- firmware/targets/f7/api_symbols.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 3313f3ecd..cd79ebb23 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -2515,7 +2515,7 @@ Function,-,select,int,"int, fd_set*, fd_set*, fd_set*, timeval*" Function,-,serial_svc_is_started,_Bool, Function,-,serial_svc_notify_buffer_is_empty,void, Function,-,serial_svc_set_callbacks,void,"uint16_t, SerialServiceEventCallback, void*" -Function,+,serial_svc_set_rpc_status,void,SerialServiceRpcStatus +Function,-,serial_svc_set_rpc_status,void,SerialServiceRpcStatus Function,-,serial_svc_start,void, Function,-,serial_svc_stop,void, Function,-,serial_svc_update_tx,_Bool,"uint8_t*, uint16_t" From 5f1ac6e1b14595e8727497b9227ad239d60f2d86 Mon Sep 17 00:00:00 2001 From: Yukai Li Date: Mon, 22 May 2023 03:14:18 -0600 Subject: [PATCH 23/23] fbt: Fix tar uid overflow when packaging (#2689) * fbt: Fix tar uid overflow when packaging * Fix trailing spaces --- scripts/sconsdist.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/sconsdist.py b/scripts/sconsdist.py index d2d1d2f49..461781136 100644 --- a/scripts/sconsdist.py +++ b/scripts/sconsdist.py @@ -271,7 +271,13 @@ class Main(App): self.note_dist_component( "update", "tgz", self.get_dist_path(bundle_tgz) ) - tar.add(bundle_dir, arcname=bundle_dir_name) + + # Strip uid and gid in case of overflow + def tar_filter(tarinfo): + tarinfo.uid = tarinfo.gid = 0 + return tarinfo + + tar.add(bundle_dir, arcname=bundle_dir_name, filter=tar_filter) return bundle_result