Merge branch 'dev' into release-candidate
This commit is contained in:
		
						commit
						cb227dafd1
					
				
							
								
								
									
										14
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								Makefile
									
									
									
									
									
								
							| @ -49,12 +49,16 @@ firmware_clean: | ||||
| 
 | ||||
| .PHONY: bootloader_flash | ||||
| bootloader_flash: | ||||
| ifeq ($(FORCE), '1') | ||||
| 	rm $(PROJECT_ROOT)/bootloader/.obj/f*/flash || true | ||||
| endif | ||||
| 	$(MAKE) -C $(PROJECT_ROOT)/bootloader -j$(NPROCS) flash | ||||
| 
 | ||||
| .PHONY: firmware_flash | ||||
| firmware_flash: | ||||
| ifeq ($(FORCE), '1') | ||||
| 	rm $(PROJECT_ROOT)/firmware/.obj/f*/flash || true | ||||
| endif | ||||
| 	$(MAKE) -C $(PROJECT_ROOT)/firmware -j$(NPROCS) flash | ||||
| 
 | ||||
| .PHONY: flash_radio | ||||
| @ -73,8 +77,16 @@ flash_radio_fus: | ||||
| 	@echo "================    JUST DON'T    ================" | ||||
| 	@echo | ||||
| 
 | ||||
| .PHONY:  | ||||
| .PHONY: flash_radio_fus_please_i_m_not_going_to_complain | ||||
| flash_radio_fus_please_i_m_not_going_to_complain: | ||||
| 	$(PROJECT_ROOT)/scripts/flash.py core2fus 0x080EC000 --statement=AGREE_TO_LOOSE_FLIPPER_FEATURES_THAT_USES_CRYPTO_ENCLAVE $(COPRO_DIR)/stm32wb5x_FUS_fw_for_fus_0_5_3.bin | ||||
| 	$(PROJECT_ROOT)/scripts/flash.py core2fus 0x080EC000 --statement=AGREE_TO_LOOSE_FLIPPER_FEATURES_THAT_USES_CRYPTO_ENCLAVE $(COPRO_DIR)/stm32wb5x_FUS_fw.bin | ||||
| 	$(PROJECT_ROOT)/scripts/ob.py set | ||||
| 
 | ||||
| FORMAT_SOURCES = $(shell find applications bootloader core -iname "*.h" -o -iname "*.c" -o -iname "*.cpp") | ||||
| 
 | ||||
| .PHONY: format | ||||
| format: | ||||
| 	@echo "Formatting sources with clang-format" | ||||
| 	@clang-format -style=file -i $(FORMAT_SOURCES) | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| #include "bt_i.h" | ||||
| #include "battery_service.h" | ||||
| #include "bt_keys_storage.h" | ||||
| 
 | ||||
| #define BT_SERVICE_TAG "BT" | ||||
| 
 | ||||
| @ -69,8 +70,8 @@ Bt* bt_alloc() { | ||||
| 
 | ||||
|     // Power
 | ||||
|     bt->power = furi_record_open("power"); | ||||
|     PubSub* power_pubsub = power_get_pubsub(bt->power); | ||||
|     subscribe_pubsub(power_pubsub, bt_battery_level_changed_callback, bt); | ||||
|     FuriPubSub* power_pubsub = power_get_pubsub(bt->power); | ||||
|     furi_pubsub_subscribe(power_pubsub, bt_battery_level_changed_callback, bt); | ||||
| 
 | ||||
|     // RPC
 | ||||
|     bt->rpc = furi_record_open("rpc"); | ||||
| @ -161,6 +162,14 @@ static void bt_on_gap_event_callback(BleEvent event, void* context) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void bt_on_key_storage_change_callback(uint8_t* addr, uint16_t size, void* context) { | ||||
|     furi_assert(context); | ||||
|     Bt* bt = context; | ||||
|     FURI_LOG_I(BT_SERVICE_TAG, "Changed addr start: %08lX, size changed: %d", addr, size); | ||||
|     BtMessage message = {.type = BtMessageTypeKeysStorageUpdated}; | ||||
|     furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK); | ||||
| } | ||||
| 
 | ||||
| static void bt_statusbar_update(Bt* bt) { | ||||
|     if(bt->status == BtStatusAdvertising) { | ||||
|         view_port_set_width(bt->statusbar_view_port, icon_get_width(&I_Bluetooth_5x8)); | ||||
| @ -177,7 +186,12 @@ int32_t bt_srv() { | ||||
|     Bt* bt = bt_alloc(); | ||||
|     furi_record_create("bt", bt); | ||||
| 
 | ||||
|     if(!furi_hal_bt_wait_startup()) { | ||||
|     // Read keys
 | ||||
|     if(!bt_load_key_storage(bt)) { | ||||
|         FURI_LOG_W(BT_SERVICE_TAG, "Failed to load saved bonding keys"); | ||||
|     } | ||||
|     // Start 2nd core
 | ||||
|     if(!furi_hal_bt_start_core2()) { | ||||
|         FURI_LOG_E(BT_SERVICE_TAG, "Core2 startup failed"); | ||||
|     } else { | ||||
|         view_port_enabled_set(bt->statusbar_view_port, true); | ||||
| @ -190,6 +204,8 @@ int32_t bt_srv() { | ||||
|             FURI_LOG_E(BT_SERVICE_TAG, "BT App start failed"); | ||||
|         } | ||||
|     } | ||||
|     furi_hal_bt_set_key_storage_change_callback(bt_on_key_storage_change_callback, bt); | ||||
| 
 | ||||
|     // Update statusbar
 | ||||
|     bt_statusbar_update(bt); | ||||
| 
 | ||||
| @ -207,6 +223,8 @@ int32_t bt_srv() { | ||||
|         } else if(message.type == BtMessageTypePinCodeShow) { | ||||
|             // Display PIN code
 | ||||
|             bt_pin_code_show_event_handler(bt, message.data.pin_code); | ||||
|         } else if(message.type == BtMessageTypeKeysStorageUpdated) { | ||||
|             bt_save_key_storage(bt); | ||||
|         } | ||||
|     } | ||||
|     return 0; | ||||
|  | ||||
| @ -25,6 +25,7 @@ typedef enum { | ||||
|     BtMessageTypeUpdateStatusbar, | ||||
|     BtMessageTypeUpdateBatteryLevel, | ||||
|     BtMessageTypePinCodeShow, | ||||
|     BtMessageTypeKeysStorageUpdated, | ||||
| } BtMessageType; | ||||
| 
 | ||||
| typedef union { | ||||
| @ -38,6 +39,8 @@ typedef struct { | ||||
| } BtMessage; | ||||
| 
 | ||||
| struct Bt { | ||||
|     uint8_t* bt_keys_addr_start; | ||||
|     uint16_t bt_keys_size; | ||||
|     BtSettings bt_settings; | ||||
|     BtStatus status; | ||||
|     osMessageQueueId_t message_queue; | ||||
|  | ||||
							
								
								
									
										41
									
								
								applications/bt/bt_service/bt_keys_storage.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								applications/bt/bt_service/bt_keys_storage.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| #include "bt_keys_storage.h" | ||||
| #include <furi.h> | ||||
| #include <file-worker.h> | ||||
| 
 | ||||
| #define BT_KEYS_STORAGE_TAG "bt keys storage" | ||||
| #define BT_KEYS_STORAGE_PATH "/int/bt.keys" | ||||
| 
 | ||||
| bool bt_load_key_storage(Bt* bt) { | ||||
|     furi_assert(bt); | ||||
| 
 | ||||
|     bool file_loaded = false; | ||||
|     furi_hal_bt_get_key_storage_buff(&bt->bt_keys_addr_start, &bt->bt_keys_size); | ||||
| 
 | ||||
|     FileWorker* file_worker = file_worker_alloc(true); | ||||
|     if(file_worker_open(file_worker, BT_KEYS_STORAGE_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { | ||||
|         furi_hal_bt_nvm_sram_sem_acquire(); | ||||
|         if(file_worker_read(file_worker, bt->bt_keys_addr_start, bt->bt_keys_size)) { | ||||
|             file_loaded = true; | ||||
|         } | ||||
|         furi_hal_bt_nvm_sram_sem_release(); | ||||
|     } | ||||
|     file_worker_free(file_worker); | ||||
|     return file_loaded; | ||||
| } | ||||
| 
 | ||||
| bool bt_save_key_storage(Bt* bt) { | ||||
|     furi_assert(bt); | ||||
|     furi_assert(bt->bt_keys_addr_start); | ||||
| 
 | ||||
|     bool file_saved = false; | ||||
|     FileWorker* file_worker = file_worker_alloc(true); | ||||
|     if(file_worker_open(file_worker, BT_KEYS_STORAGE_PATH, FSAM_WRITE, FSOM_OPEN_ALWAYS)) { | ||||
|         furi_hal_bt_nvm_sram_sem_acquire(); | ||||
|         if(file_worker_write(file_worker, bt->bt_keys_addr_start, bt->bt_keys_size)) { | ||||
|             file_saved = true; | ||||
|         } | ||||
|         furi_hal_bt_nvm_sram_sem_release(); | ||||
|     } | ||||
|     file_worker_free(file_worker); | ||||
|     return file_saved; | ||||
| } | ||||
							
								
								
									
										7
									
								
								applications/bt/bt_service/bt_keys_storage.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								applications/bt/bt_service/bt_keys_storage.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include "bt_i.h" | ||||
| 
 | ||||
| bool bt_load_key_storage(Bt* bt); | ||||
| 
 | ||||
| bool bt_save_key_storage(Bt* bt); | ||||
| @ -350,7 +350,7 @@ void cli_command_gpio_set(Cli* cli, string_t args, void* context) { | ||||
|         "PA4", | ||||
|         "PA6", | ||||
|         "PA7", | ||||
| #ifdef DEBUG | ||||
| #ifdef FURI_DEBUG | ||||
|         "PA0", | ||||
|         "PB7", | ||||
|         "PB8", | ||||
| @ -366,7 +366,7 @@ void cli_command_gpio_set(Cli* cli, string_t args, void* context) { | ||||
|         {.port = GPIOA, .pin = LL_GPIO_PIN_4}, | ||||
|         {.port = GPIOA, .pin = LL_GPIO_PIN_6}, | ||||
|         {.port = GPIOA, .pin = LL_GPIO_PIN_7}, | ||||
| #ifdef DEBUG | ||||
| #ifdef FURI_DEBUG | ||||
|         {.port = GPIOA, .pin = LL_GPIO_PIN_0}, // IR_RX (PA0)
 | ||||
|         {.port = GPIOB, .pin = LL_GPIO_PIN_7}, // UART RX (PB7)
 | ||||
|         {.port = GPIOB, .pin = LL_GPIO_PIN_8}, // SPEAKER (PB8)
 | ||||
| @ -411,7 +411,7 @@ void cli_command_gpio_set(Cli* cli, string_t args, void* context) { | ||||
|         LL_GPIO_SetPinOutputType(gpio[num].port, gpio[num].pin, LL_GPIO_OUTPUT_PUSHPULL); | ||||
|         LL_GPIO_ResetOutputPin(gpio[num].port, gpio[num].pin); | ||||
|     } else if(!string_cmp(args, "1")) { | ||||
| #ifdef DEBUG | ||||
| #ifdef FURI_DEBUG | ||||
|         if(num == 8) { // PA0
 | ||||
|             printf( | ||||
|                 "Setting PA0 pin HIGH with TSOP connected can damage IR receiver. Are you sure you want to continue? (y/n)?\r\n"); | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| #include "desktop_i.h" | ||||
| #include <furi-hal-lock.h> | ||||
| 
 | ||||
| static void desktop_lock_icon_callback(Canvas* canvas, void* context) { | ||||
|     furi_assert(canvas); | ||||
| @ -117,9 +118,22 @@ static bool desktop_is_first_start() { | ||||
| 
 | ||||
| int32_t desktop_srv(void* p) { | ||||
|     Desktop* desktop = desktop_alloc(); | ||||
|     bool loaded = LOAD_DESKTOP_SETTINGS(&desktop->settings); | ||||
|     if(!loaded) { | ||||
|         furi_hal_lock_set(false); | ||||
|         memset(&desktop->settings, 0, sizeof(desktop->settings)); | ||||
|         SAVE_DESKTOP_SETTINGS(&desktop->settings); | ||||
|     } | ||||
| 
 | ||||
|     scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); | ||||
| 
 | ||||
|     if(furi_hal_lock_get()) { | ||||
|         furi_hal_usb_disable(); | ||||
|         scene_manager_set_scene_state( | ||||
|             desktop->scene_manager, DesktopSceneLocked, DesktopLockedWithPin); | ||||
|         scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); | ||||
|     } | ||||
| 
 | ||||
|     if(desktop_is_first_start()) { | ||||
|         scene_manager_next_scene(desktop->scene_manager, DesktopSceneFirstStart); | ||||
|     } | ||||
|  | ||||
| @ -1,49 +0,0 @@ | ||||
| #include <furi.h> | ||||
| #include <file-worker.h> | ||||
| #include "desktop_settings.h" | ||||
| 
 | ||||
| #define DESKTOP_SETTINGS_TAG "Desktop settings" | ||||
| #define DESKTOP_SETTINGS_PATH "/int/desktop.settings" | ||||
| 
 | ||||
| bool desktop_settings_load(DesktopSettings* desktop_settings) { | ||||
|     furi_assert(desktop_settings); | ||||
|     bool file_loaded = false; | ||||
|     DesktopSettings settings = {}; | ||||
| 
 | ||||
|     FURI_LOG_I(DESKTOP_SETTINGS_TAG, "Loading settings from \"%s\"", DESKTOP_SETTINGS_PATH); | ||||
|     FileWorker* file_worker = file_worker_alloc(true); | ||||
|     if(file_worker_open(file_worker, DESKTOP_SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { | ||||
|         if(file_worker_read(file_worker, &settings, sizeof(settings))) { | ||||
|             file_loaded = true; | ||||
|         } | ||||
|     } | ||||
|     file_worker_free(file_worker); | ||||
| 
 | ||||
|     if(file_loaded) { | ||||
|         if(settings.version != DESKTOP_SETTINGS_VER) { | ||||
|             FURI_LOG_E(DESKTOP_SETTINGS_TAG, "Settings version mismatch"); | ||||
|         } else { | ||||
|             osKernelLock(); | ||||
|             *desktop_settings = settings; | ||||
|             osKernelUnlock(); | ||||
|         } | ||||
|     } else { | ||||
|         FURI_LOG_E(DESKTOP_SETTINGS_TAG, "Settings load failed"); | ||||
|     } | ||||
|     return file_loaded; | ||||
| } | ||||
| 
 | ||||
| bool desktop_settings_save(DesktopSettings* desktop_settings) { | ||||
|     furi_assert(desktop_settings); | ||||
|     bool result = false; | ||||
| 
 | ||||
|     FileWorker* file_worker = file_worker_alloc(true); | ||||
|     if(file_worker_open(file_worker, DESKTOP_SETTINGS_PATH, FSAM_WRITE, FSOM_OPEN_ALWAYS)) { | ||||
|         if(file_worker_write(file_worker, desktop_settings, sizeof(DesktopSettings))) { | ||||
|             FURI_LOG_I(DESKTOP_SETTINGS_TAG, "Settings saved to \"%s\"", DESKTOP_SETTINGS_PATH); | ||||
|             result = true; | ||||
|         } | ||||
|     } | ||||
|     file_worker_free(file_worker); | ||||
|     return result; | ||||
| } | ||||
| @ -2,23 +2,35 @@ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| #include <toolbox/saved_struct.h> | ||||
| 
 | ||||
| #define DESKTOP_SETTINGS_VER (1) | ||||
| #define DESKTOP_SETTINGS_PATH "/int/desktop.settings" | ||||
| #define DESKTOP_SETTINGS_MAGIC (0x17) | ||||
| #define PIN_MAX_LENGTH 12 | ||||
| 
 | ||||
| #define SAVE_DESKTOP_SETTINGS(x) \ | ||||
|     saved_struct_save(           \ | ||||
|         DESKTOP_SETTINGS_PATH,   \ | ||||
|         (x),                     \ | ||||
|         sizeof(DesktopSettings), \ | ||||
|         DESKTOP_SETTINGS_MAGIC,  \ | ||||
|         DESKTOP_SETTINGS_VER) | ||||
| 
 | ||||
| #define LOAD_DESKTOP_SETTINGS(x) \ | ||||
|     saved_struct_load(           \ | ||||
|         DESKTOP_SETTINGS_PATH,   \ | ||||
|         (x),                     \ | ||||
|         sizeof(DesktopSettings), \ | ||||
|         DESKTOP_SETTINGS_MAGIC,  \ | ||||
|         DESKTOP_SETTINGS_VER) | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint8_t length; | ||||
|     uint8_t data[PIN_MAX_LENGTH]; | ||||
| } PinCode; | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint8_t version; | ||||
|     uint16_t favorite; | ||||
| 
 | ||||
|     PinCode pincode; | ||||
|     bool locked; | ||||
| } DesktopSettings; | ||||
| 
 | ||||
| bool desktop_settings_load(DesktopSettings* desktop_settings); | ||||
| 
 | ||||
| bool desktop_settings_save(DesktopSettings* desktop_settings); | ||||
|  | ||||
| @ -15,9 +15,6 @@ static bool desktop_settings_back_event_callback(void* context) { | ||||
| DesktopSettingsApp* desktop_settings_app_alloc() { | ||||
|     DesktopSettingsApp* app = furi_alloc(sizeof(DesktopSettingsApp)); | ||||
| 
 | ||||
|     app->settings.version = DESKTOP_SETTINGS_VER; | ||||
|     desktop_settings_load(&app->settings); | ||||
| 
 | ||||
|     app->gui = furi_record_open("gui"); | ||||
|     app->view_dispatcher = view_dispatcher_alloc(); | ||||
|     app->scene_manager = scene_manager_alloc(&desktop_settings_scene_handlers, app); | ||||
| @ -62,8 +59,8 @@ void desktop_settings_app_free(DesktopSettingsApp* app) { | ||||
| 
 | ||||
| extern int32_t desktop_settings_app(void* p) { | ||||
|     DesktopSettingsApp* app = desktop_settings_app_alloc(); | ||||
|     LOAD_DESKTOP_SETTINGS(&app->settings); | ||||
|     view_dispatcher_run(app->view_dispatcher); | ||||
|     desktop_settings_save(&app->settings); | ||||
|     desktop_settings_app_free(app); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| #include "../desktop_settings_app.h" | ||||
| #include "applications.h" | ||||
| #include "desktop/desktop_settings/desktop_settings.h" | ||||
| 
 | ||||
| static void desktop_settings_scene_favorite_submenu_callback(void* context, uint32_t index) { | ||||
|     DesktopSettingsApp* app = context; | ||||
| @ -43,5 +44,6 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e | ||||
| 
 | ||||
| void desktop_settings_scene_favorite_on_exit(void* context) { | ||||
|     DesktopSettingsApp* app = context; | ||||
|     SAVE_DESKTOP_SETTINGS(&app->settings); | ||||
|     submenu_clean(app->submenu); | ||||
| } | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| #include "../desktop_settings_app.h" | ||||
| #include "desktop/desktop_settings/desktop_settings.h" | ||||
| 
 | ||||
| #define SCENE_EXIT_EVENT (0U) | ||||
| 
 | ||||
| @ -57,6 +58,7 @@ bool desktop_settings_scene_pincode_input_on_event(void* context, SceneManagerEv | ||||
| 
 | ||||
| void desktop_settings_scene_pincode_input_on_exit(void* context) { | ||||
|     DesktopSettingsApp* app = context; | ||||
|     SAVE_DESKTOP_SETTINGS(&app->settings); | ||||
|     code_input_set_result_callback(app->code_input, NULL, NULL, NULL, NULL, NULL, 0); | ||||
|     code_input_set_header_text(app->code_input, ""); | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,8 @@ | ||||
| #include "../desktop_i.h" | ||||
| #include "../views/desktop_lock_menu.h" | ||||
| #include <toolbox/saved_struct.h> | ||||
| #include <stdbool.h> | ||||
| #include <furi-hal-lock.h> | ||||
| 
 | ||||
| void desktop_scene_lock_menu_callback(DesktopLockMenuEvent event, void* context) { | ||||
|     Desktop* desktop = (Desktop*)context; | ||||
| @ -9,7 +12,7 @@ void desktop_scene_lock_menu_callback(DesktopLockMenuEvent event, void* context) | ||||
| void desktop_scene_lock_menu_on_enter(void* context) { | ||||
|     Desktop* desktop = (Desktop*)context; | ||||
| 
 | ||||
|     desktop_settings_load(&desktop->settings); | ||||
|     LOAD_DESKTOP_SETTINGS(&desktop->settings); | ||||
| 
 | ||||
|     desktop_lock_menu_set_callback(desktop->lock_menu, desktop_scene_lock_menu_callback, desktop); | ||||
|     desktop_lock_menu_pin_set(desktop->lock_menu, desktop->settings.pincode.length > 0); | ||||
| @ -29,10 +32,9 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { | ||||
|             consumed = true; | ||||
|             break; | ||||
|         case DesktopLockMenuEventPinLock: | ||||
| 
 | ||||
|             if(desktop->settings.pincode.length > 0) { | ||||
|                 desktop->settings.locked = true; | ||||
|                 desktop_settings_save(&desktop->settings); | ||||
|                 furi_hal_lock_set(true); | ||||
|                 furi_hal_usb_disable(); | ||||
|                 scene_manager_set_scene_state( | ||||
|                     desktop->scene_manager, DesktopSceneLocked, DesktopLockedWithPin); | ||||
|                 scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); | ||||
| @ -43,10 +45,10 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { | ||||
|             consumed = true; | ||||
|             break; | ||||
|         case DesktopLockMenuEventExit: | ||||
|             scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); | ||||
|             scene_manager_search_and_switch_to_previous_scene( | ||||
|                 desktop->scene_manager, DesktopSceneMain); | ||||
|             consumed = true; | ||||
|             break; | ||||
| 
 | ||||
|         default: | ||||
|             break; | ||||
|         } | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| #include "../desktop_i.h" | ||||
| #include "../views/desktop_locked.h" | ||||
| #include <furi-hal-lock.h> | ||||
| 
 | ||||
| void desktop_scene_locked_callback(DesktopLockedEvent event, void* context) { | ||||
|     Desktop* desktop = (Desktop*)context; | ||||
| @ -40,8 +41,8 @@ static bool desktop_scene_locked_check_pin(Desktop* desktop, DesktopMainEvent ev | ||||
| 
 | ||||
|     if(match) { | ||||
|         desktop->pincode_buffer.length = 0; | ||||
|         desktop->settings.locked = false; | ||||
|         desktop_settings_save(&desktop->settings); | ||||
|         furi_hal_usb_enable(); | ||||
|         furi_hal_lock_set(false); | ||||
|         desktop_main_unlocked(desktop->main_view); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -34,8 +34,6 @@ void desktop_scene_main_on_enter(void* context) { | ||||
|     desktop_main_set_callback(main_view, desktop_scene_main_callback, desktop); | ||||
|     view_port_enabled_set(desktop->lock_viewport, false); | ||||
| 
 | ||||
|     desktop_settings_load(&desktop->settings); | ||||
| 
 | ||||
|     if(scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneMain) == | ||||
|        DesktopMainEventUnlocked) { | ||||
|         desktop_main_unlocked(desktop->main_view); | ||||
| @ -72,7 +70,7 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { | ||||
|             break; | ||||
| 
 | ||||
|         case DesktopMainEventOpenFavorite: | ||||
|             desktop_settings_load(&desktop->settings); | ||||
|             LOAD_DESKTOP_SETTINGS(&desktop->settings); | ||||
|             desktop_switch_to_app(desktop, &FLIPPER_APPS[desktop->settings.favorite]); | ||||
|             consumed = true; | ||||
|             break; | ||||
|  | ||||
| @ -4,7 +4,6 @@ | ||||
| 
 | ||||
| void desktop_scene_ok_callback(void* context) { | ||||
|     Desktop* app = context; | ||||
|     desktop_settings_save(&app->settings); | ||||
|     view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EXIT_EVENT); | ||||
| } | ||||
| 
 | ||||
| @ -45,6 +44,7 @@ bool desktop_scene_pinsetup_on_event(void* context, SceneManagerEvent event) { | ||||
| 
 | ||||
| void desktop_scene_pinsetup_on_exit(void* context) { | ||||
|     Desktop* app = context; | ||||
|     SAVE_DESKTOP_SETTINGS(&app->settings); | ||||
|     code_input_set_result_callback(app->code_input, NULL, NULL, NULL, NULL, NULL, 0); | ||||
|     code_input_set_header_text(app->code_input, ""); | ||||
| } | ||||
|  | ||||
| @ -10,7 +10,6 @@ | ||||
| 
 | ||||
| typedef enum { | ||||
|     DesktopLockMenuEventLock, | ||||
|     DesktopLockMenuEventUnlock, | ||||
|     DesktopLockMenuEventPinLock, | ||||
|     DesktopLockMenuEventExit, | ||||
| } DesktopLockMenuEvent; | ||||
|  | ||||
| @ -81,12 +81,7 @@ static void dolphin_check_butthurt(DolphinState* state) { | ||||
|     furi_assert(state); | ||||
|     float diff_time = difftime(dolphin_state_get_timestamp(state), dolphin_state_timestamp()); | ||||
| 
 | ||||
| #if 0 | ||||
|     FURI_LOG_I("dolphin-state", "Butthurt check, time since deed %.0f", fabs(diff_time)); | ||||
| #endif | ||||
| 
 | ||||
|     if((fabs(diff_time)) > DOLPHIN_TIMEGATE) { | ||||
|         // increase butthurt
 | ||||
|         FURI_LOG_I("dolphin-state", "Increasing butthurt"); | ||||
|         dolphin_state_butthurted(state); | ||||
|     } | ||||
|  | ||||
| @ -2,20 +2,14 @@ | ||||
| #include <storage/storage.h> | ||||
| #include <furi.h> | ||||
| #include <math.h> | ||||
| #include <toolbox/saved_struct.h> | ||||
| 
 | ||||
| #define DOLPHIN_STORE_KEY "/int/dolphin.state" | ||||
| #define DOLPHIN_STORE_HEADER_MAGIC 0xD0 | ||||
| #define DOLPHIN_STORE_HEADER_VERSION 0x01 | ||||
| #define DOLPHIN_STATE_TAG "DolphinState" | ||||
| #define DOLPHIN_STATE_PATH "/int/dolphin.state" | ||||
| #define DOLPHIN_STATE_HEADER_MAGIC 0xD0 | ||||
| #define DOLPHIN_STATE_HEADER_VERSION 0x01 | ||||
| #define DOLPHIN_LVL_THRESHOLD 20.0f | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint8_t magic; | ||||
|     uint8_t version; | ||||
|     uint8_t checksum; | ||||
|     uint8_t flags; | ||||
|     uint32_t timestamp; | ||||
| } DolphinStoreHeader; | ||||
| 
 | ||||
| typedef struct { | ||||
|     uint32_t limit_ibutton; | ||||
|     uint32_t limit_nfc; | ||||
| @ -28,25 +22,16 @@ typedef struct { | ||||
|     uint64_t timestamp; | ||||
| } DolphinStoreData; | ||||
| 
 | ||||
| typedef struct { | ||||
|     DolphinStoreHeader header; | ||||
|     DolphinStoreData data; | ||||
| } DolphinStore; | ||||
| 
 | ||||
| struct DolphinState { | ||||
|     Storage* fs_api; | ||||
|     DolphinStoreData data; | ||||
|     bool dirty; | ||||
| }; | ||||
| 
 | ||||
| DolphinState* dolphin_state_alloc() { | ||||
|     DolphinState* dolphin_state = furi_alloc(sizeof(DolphinState)); | ||||
|     dolphin_state->fs_api = furi_record_open("storage"); | ||||
|     return dolphin_state; | ||||
|     return furi_alloc(sizeof(DolphinState)); | ||||
| } | ||||
| 
 | ||||
| void dolphin_state_free(DolphinState* dolphin_state) { | ||||
|     furi_record_close("storage"); | ||||
|     free(dolphin_state); | ||||
| } | ||||
| 
 | ||||
| @ -55,121 +40,38 @@ bool dolphin_state_save(DolphinState* dolphin_state) { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     FURI_LOG_I("dolphin-state", "State is dirty, saving to \"%s\"", DOLPHIN_STORE_KEY); | ||||
|     DolphinStore store; | ||||
|     // Calculate checksum
 | ||||
|     uint8_t* source = (uint8_t*)&dolphin_state->data; | ||||
|     uint8_t checksum = 0; | ||||
|     for(size_t i = 0; i < sizeof(DolphinStoreData); i++) { | ||||
|         checksum += source[i]; | ||||
|     } | ||||
|     // Set header
 | ||||
|     store.header.magic = DOLPHIN_STORE_HEADER_MAGIC; | ||||
|     store.header.version = DOLPHIN_STORE_HEADER_VERSION; | ||||
|     store.header.checksum = checksum; | ||||
|     store.header.flags = 0; | ||||
|     store.header.timestamp = 0; | ||||
|     // Set data
 | ||||
|     store.data = dolphin_state->data; | ||||
|     bool result = saved_struct_save( | ||||
|         DOLPHIN_STATE_PATH, | ||||
|         &dolphin_state->data, | ||||
|         sizeof(DolphinStoreData), | ||||
|         DOLPHIN_STATE_HEADER_MAGIC, | ||||
|         DOLPHIN_STATE_HEADER_VERSION); | ||||
| 
 | ||||
|     // Store
 | ||||
|     File* file = storage_file_alloc(dolphin_state->fs_api); | ||||
|     bool save_result = storage_file_open(file, DOLPHIN_STORE_KEY, FSAM_WRITE, FSOM_CREATE_ALWAYS); | ||||
| 
 | ||||
|     if(save_result) { | ||||
|         uint16_t bytes_count = storage_file_write(file, &store, sizeof(DolphinStore)); | ||||
| 
 | ||||
|         if(bytes_count != sizeof(DolphinStore)) { | ||||
|             save_result = false; | ||||
|         } | ||||
|     if(result) { | ||||
|         FURI_LOG_I(DOLPHIN_STATE_TAG, "State saved"); | ||||
|         dolphin_state->dirty = false; | ||||
|     } else { | ||||
|         FURI_LOG_E(DOLPHIN_STATE_TAG, "Failed to save state"); | ||||
|     } | ||||
| 
 | ||||
|     if(!save_result) { | ||||
|         FURI_LOG_E( | ||||
|             "dolphin-state", | ||||
|             "Save failed. Storage returned: %s", | ||||
|             storage_file_get_error_desc(file)); | ||||
|     } | ||||
| 
 | ||||
|     storage_file_close(file); | ||||
|     storage_file_free(file); | ||||
| 
 | ||||
|     dolphin_state->dirty = !save_result; | ||||
| 
 | ||||
|     FURI_LOG_I("dolphin-state", "Saved"); | ||||
| 
 | ||||
|     return save_result; | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| bool dolphin_state_load(DolphinState* dolphin_state) { | ||||
|     DolphinStore store; | ||||
|     // Read Dolphin State Store
 | ||||
|     FURI_LOG_I("dolphin-state", "Loading state from \"%s\"", DOLPHIN_STORE_KEY); | ||||
|     bool loaded = saved_struct_load( | ||||
|         DOLPHIN_STATE_PATH, | ||||
|         &dolphin_state->data, | ||||
|         sizeof(DolphinStoreData), | ||||
|         DOLPHIN_STATE_HEADER_MAGIC, | ||||
|         DOLPHIN_STATE_HEADER_VERSION); | ||||
| 
 | ||||
|     File* file = storage_file_alloc(dolphin_state->fs_api); | ||||
|     bool load_result = storage_file_open(file, DOLPHIN_STORE_KEY, FSAM_READ, FSOM_OPEN_EXISTING); | ||||
|     if(!load_result) { | ||||
|         FURI_LOG_E( | ||||
|             "dolphin-state", | ||||
|             "Load failed. Storage returned: %s", | ||||
|             storage_file_get_error_desc(file)); | ||||
|     } else { | ||||
|         uint16_t bytes_count = storage_file_read(file, &store, sizeof(DolphinStore)); | ||||
| 
 | ||||
|         if(bytes_count != sizeof(DolphinStore)) { | ||||
|             load_result = false; | ||||
|         } | ||||
|     if(!loaded) { | ||||
|         FURI_LOG_W(DOLPHIN_STATE_TAG, "Reset dolphin-state"); | ||||
|         memset(dolphin_state, 0, sizeof(*dolphin_state)); | ||||
|         dolphin_state->dirty = true; | ||||
|     } | ||||
| 
 | ||||
|     if(!load_result) { | ||||
|         FURI_LOG_E("dolphin-state", "DolphinStore size mismatch"); | ||||
|     } else { | ||||
|         if(store.header.magic == DOLPHIN_STORE_HEADER_MAGIC && | ||||
|            store.header.version == DOLPHIN_STORE_HEADER_VERSION) { | ||||
|             FURI_LOG_I( | ||||
|                 "dolphin-state", | ||||
|                 "Magic(%d) and Version(%d) match", | ||||
|                 store.header.magic, | ||||
|                 store.header.version); | ||||
|             uint8_t checksum = 0; | ||||
|             const uint8_t* source = (const uint8_t*)&store.data; | ||||
|             for(size_t i = 0; i < sizeof(DolphinStoreData); i++) { | ||||
|                 checksum += source[i]; | ||||
|             } | ||||
| 
 | ||||
|             if(store.header.checksum == checksum) { | ||||
|                 FURI_LOG_I("dolphin-state", "Checksum(%d) match", store.header.checksum); | ||||
|                 dolphin_state->data = store.data; | ||||
|             } else { | ||||
|                 FURI_LOG_E( | ||||
|                     "dolphin-state", | ||||
|                     "Checksum(%d != %d) mismatch", | ||||
|                     store.header.checksum, | ||||
|                     checksum); | ||||
|                 load_result = false; | ||||
|             } | ||||
|         } else { | ||||
|             FURI_LOG_E( | ||||
|                 "dolphin-state", | ||||
|                 "Magic(%d != %d) or Version(%d != %d) mismatch", | ||||
|                 store.header.magic, | ||||
|                 DOLPHIN_STORE_HEADER_MAGIC, | ||||
|                 store.header.version, | ||||
|                 DOLPHIN_STORE_HEADER_VERSION); | ||||
|             load_result = false; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     storage_file_close(file); | ||||
|     storage_file_free(file); | ||||
| 
 | ||||
|     dolphin_state->dirty = !load_result; | ||||
| 
 | ||||
|     return load_result; | ||||
| } | ||||
| 
 | ||||
| void dolphin_state_clear(DolphinState* dolphin_state) { | ||||
|     memset(&dolphin_state->data, 0, sizeof(DolphinStoreData)); | ||||
|     return loaded; | ||||
| } | ||||
| 
 | ||||
| uint64_t dolphin_state_timestamp() { | ||||
| @ -229,4 +131,4 @@ uint32_t dolphin_state_get_level(uint32_t icounter) { | ||||
| 
 | ||||
| uint32_t dolphin_state_xp_to_levelup(uint32_t icounter, uint32_t level, bool remaining) { | ||||
|     return (DOLPHIN_LVL_THRESHOLD * level * (level + 1) / 2) - (remaining ? icounter : 0); | ||||
| } | ||||
| } | ||||
|  | ||||
| @ -67,6 +67,9 @@ void gpio_scene_start_on_enter(void* context) { | ||||
|     variable_item_list_add(var_item_list, "GPIO tester", 0, NULL, NULL); | ||||
|     variable_item_list_add(var_item_list, "USB-UART bridge", 0, NULL, NULL); | ||||
| 
 | ||||
|     variable_item_list_set_selected_item( | ||||
|         var_item_list, scene_manager_get_scene_state(app->scene_manager, GpioSceneStart)); | ||||
| 
 | ||||
|     view_dispatcher_switch_to_view(app->view_dispatcher, GpioAppViewVarItemList); | ||||
| } | ||||
| 
 | ||||
| @ -80,8 +83,10 @@ bool gpio_scene_start_on_event(void* context, SceneManagerEvent event) { | ||||
|         } else if(event.event == GPIO_SCENE_START_CUSTOM_EVENT_OTG_OFF) { | ||||
|             furi_hal_power_disable_otg(); | ||||
|         } else if(event.event == GPIO_SCENE_START_CUSTOM_EVENT_TEST) { | ||||
|             scene_manager_set_scene_state(app->scene_manager, GpioSceneStart, 1); | ||||
|             scene_manager_next_scene(app->scene_manager, GpioSceneTest); | ||||
|         } else if(event.event == GPIO_SCENE_START_CUSTOM_EVENT_USB_UART) { | ||||
|             scene_manager_set_scene_state(app->scene_manager, GpioSceneStart, 2); | ||||
|             scene_manager_next_scene(app->scene_manager, GpioSceneUsbUart); | ||||
|         } | ||||
|         consumed = true; | ||||
|  | ||||
| @ -120,12 +120,19 @@ void gpio_scene_usb_uart_on_enter(void* context) { | ||||
|     item = variable_item_list_add(var_item_list, "Enable", 0, NULL, NULL); | ||||
|     item = variable_item_list_add(var_item_list, "Disable", 0, NULL, NULL); | ||||
| 
 | ||||
|     variable_item_list_set_selected_item( | ||||
|         var_item_list, scene_manager_get_scene_state(app->scene_manager, GpioSceneUsbUart)); | ||||
| 
 | ||||
|     view_dispatcher_switch_to_view(app->view_dispatcher, GpioAppViewUsbUart); | ||||
| } | ||||
| 
 | ||||
| void gpio_scene_usb_uart_on_exit(void* context) { | ||||
|     GpioApp* app = context; | ||||
|     usb_uart_disable(); | ||||
|     scene_manager_set_scene_state( | ||||
|         app->scene_manager, | ||||
|         GpioSceneUsbUart, | ||||
|         variable_item_list_get_selected_item_index(app->var_item_list)); | ||||
|     variable_item_list_clean(app->var_item_list); | ||||
|     free(cfg_set); | ||||
| } | ||||
|  | ||||
| @ -4,23 +4,19 @@ | ||||
| #include <furi-hal-usb-cdc_i.h> | ||||
| #include "usb_cdc.h" | ||||
| 
 | ||||
| #define USB_PKT_LEN CDC_DATA_SZ | ||||
| #define USB_UART_RX_BUF_SIZE (USB_PKT_LEN * 3) | ||||
| #define USB_UART_TX_BUF_SIZE (USB_PKT_LEN * 3) | ||||
| #define USB_CDC_PKT_LEN CDC_DATA_SZ | ||||
| #define USB_UART_RX_BUF_SIZE (USB_CDC_PKT_LEN * 5) | ||||
| 
 | ||||
| typedef enum { | ||||
|     WorkerEvtStop = (1 << 0), | ||||
|     WorkerEvtRxReady = (1 << 1), | ||||
|     WorkerEvtRxDone = (1 << 1), | ||||
| 
 | ||||
|     WorkerEvtTxStop = (1 << 2), | ||||
|     WorkerEvtTxReady = (1 << 3), | ||||
| 
 | ||||
|     WorkerEvtSof = (1 << 4), | ||||
| 
 | ||||
|     WorkerEvtCdcRx = (1 << 3), | ||||
| } WorkerEvtFlags; | ||||
| 
 | ||||
| #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxReady) | ||||
| #define WORKER_ALL_TX_EVENTS (WorkerEvtTxStop | WorkerEvtTxReady) | ||||
| #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone) | ||||
| #define WORKER_ALL_TX_EVENTS (WorkerEvtTxStop | WorkerEvtCdcRx) | ||||
| 
 | ||||
| typedef struct { | ||||
|     UsbUartConfig cfg; | ||||
| @ -28,13 +24,13 @@ typedef struct { | ||||
|     FuriThread* thread; | ||||
|     FuriThread* tx_thread; | ||||
| 
 | ||||
|     osEventFlagsId_t events; | ||||
| 
 | ||||
|     StreamBufferHandle_t rx_stream; | ||||
|     StreamBufferHandle_t tx_stream; | ||||
| 
 | ||||
|     uint8_t rx_buf[USB_PKT_LEN]; | ||||
|     uint8_t tx_buf[USB_PKT_LEN]; | ||||
|     osMutexId_t usb_mutex; | ||||
| 
 | ||||
|     osSemaphoreId_t tx_sem; | ||||
| 
 | ||||
|     uint8_t rx_buf[USB_CDC_PKT_LEN]; | ||||
| 
 | ||||
|     bool buf_full; | ||||
| } UsbUartParams; | ||||
| @ -65,21 +61,18 @@ static void usb_uart_on_irq_cb(UartIrqEvent ev, uint8_t data) { | ||||
| 
 | ||||
|     if(ev == UartIrqEventRXNE) { | ||||
|         xStreamBufferSendFromISR(usb_uart->rx_stream, &data, 1, &xHigherPriorityTaskWoken); | ||||
| 
 | ||||
|         size_t ret = xStreamBufferBytesAvailable(usb_uart->rx_stream); | ||||
|         if(ret > USB_PKT_LEN) osEventFlagsSet(usb_uart->events, WorkerEvtRxReady); | ||||
|     } else if(ev == UartIrqEventIDLE) { | ||||
|         osEventFlagsSet(usb_uart->events, WorkerEvtRxReady); | ||||
|         portYIELD_FROM_ISR(xHigherPriorityTaskWoken); | ||||
|         osThreadFlagsSet(furi_thread_get_thread_id(usb_uart->thread), WorkerEvtRxDone); | ||||
|     } | ||||
| 
 | ||||
|     portYIELD_FROM_ISR(xHigherPriorityTaskWoken); | ||||
| } | ||||
| 
 | ||||
| static int32_t usb_uart_worker(void* context) { | ||||
|     memcpy(&usb_uart->cfg, context, sizeof(UsbUartConfig)); | ||||
| 
 | ||||
|     usb_uart->rx_stream = xStreamBufferCreate(USB_UART_RX_BUF_SIZE, 1); | ||||
|     usb_uart->tx_stream = xStreamBufferCreate(USB_UART_TX_BUF_SIZE, 1); | ||||
| 
 | ||||
|     usb_uart->tx_sem = osSemaphoreNew(1, 1, NULL); | ||||
|     usb_uart->usb_mutex = osMutexNew(NULL); | ||||
| 
 | ||||
|     usb_uart->tx_thread = furi_thread_alloc(); | ||||
|     furi_thread_set_name(usb_uart->tx_thread, "usb_uart_tx"); | ||||
| @ -91,10 +84,10 @@ static int32_t usb_uart_worker(void* context) { | ||||
|     if(usb_uart->cfg.vcp_ch == 0) { | ||||
|         furi_hal_usb_set_config(UsbModeVcpSingle); | ||||
|         furi_hal_vcp_disable(); | ||||
|         osEventFlagsSet(usb_uart->events, WorkerEvtSof); | ||||
|     } else { | ||||
|         furi_hal_usb_set_config(UsbModeVcpDual); | ||||
|     } | ||||
|     osThreadFlagsSet(furi_thread_get_thread_id(usb_uart->tx_thread), WorkerEvtCdcRx); | ||||
| 
 | ||||
|     if(usb_uart->cfg.uart_ch == FuriHalUartIdUSART1) { | ||||
|         furi_hal_console_disable(); | ||||
| @ -114,26 +107,25 @@ static int32_t usb_uart_worker(void* context) { | ||||
|     furi_thread_start(usb_uart->tx_thread); | ||||
| 
 | ||||
|     while(1) { | ||||
|         uint32_t events = osEventFlagsWait( | ||||
|             usb_uart->events, WORKER_ALL_RX_EVENTS, osFlagsWaitAny, osWaitForever); | ||||
|         uint32_t events = osThreadFlagsWait(WORKER_ALL_RX_EVENTS, osFlagsWaitAny, osWaitForever); | ||||
|         furi_check((events & osFlagsError) == 0); | ||||
|         if(events & WorkerEvtStop) break; | ||||
|         if(events & WorkerEvtRxReady) { | ||||
|             size_t len = 0; | ||||
|             do { | ||||
|                 len = xStreamBufferReceive(usb_uart->rx_stream, usb_uart->rx_buf, USB_PKT_LEN, 0); | ||||
|                 if(len > 0) { | ||||
|                     if((osEventFlagsWait(usb_uart->events, WorkerEvtSof, osFlagsWaitAny, 100) & | ||||
|                         osFlagsError) == 0) | ||||
|                         furi_hal_cdc_send(usb_uart->cfg.vcp_ch, usb_uart->rx_buf, len); | ||||
|                     else | ||||
|                         xStreamBufferReset(usb_uart->rx_stream); | ||||
|         if(events & WorkerEvtRxDone) { | ||||
|             size_t len = | ||||
|                 xStreamBufferReceive(usb_uart->rx_stream, usb_uart->rx_buf, USB_CDC_PKT_LEN, 0); | ||||
|             if(len > 0) { | ||||
|                 if(osSemaphoreAcquire(usb_uart->tx_sem, 100) == osOK) { | ||||
|                     furi_check(osMutexAcquire(usb_uart->usb_mutex, osWaitForever) == osOK); | ||||
|                     furi_hal_cdc_send(usb_uart->cfg.vcp_ch, usb_uart->rx_buf, len); | ||||
|                     furi_check(osMutexRelease(usb_uart->usb_mutex) == osOK); | ||||
|                 } else { | ||||
|                     xStreamBufferReset(usb_uart->rx_stream); | ||||
|                 } | ||||
|             } while(len > 0); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     osEventFlagsSet(usb_uart->events, WorkerEvtTxStop); | ||||
|     osThreadFlagsSet(furi_thread_get_thread_id(usb_uart->tx_thread), WorkerEvtTxStop); | ||||
|     furi_thread_join(usb_uart->tx_thread); | ||||
|     furi_thread_free(usb_uart->tx_thread); | ||||
| 
 | ||||
| @ -147,35 +139,26 @@ static int32_t usb_uart_worker(void* context) { | ||||
|     if(usb_uart->cfg.vcp_ch == 0) furi_hal_vcp_enable(); | ||||
| 
 | ||||
|     vStreamBufferDelete(usb_uart->rx_stream); | ||||
|     vStreamBufferDelete(usb_uart->tx_stream); | ||||
|     osMutexDelete(usb_uart->usb_mutex); | ||||
|     osSemaphoreDelete(usb_uart->tx_sem); | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static int32_t usb_uart_tx_thread(void* context) { | ||||
|     uint8_t data[USB_PKT_LEN]; | ||||
|     uint8_t data[USB_CDC_PKT_LEN]; | ||||
|     while(1) { | ||||
|         uint32_t events = osEventFlagsWait( | ||||
|             usb_uart->events, WORKER_ALL_TX_EVENTS, osFlagsWaitAny, osWaitForever); | ||||
|         uint32_t events = osThreadFlagsWait(WORKER_ALL_TX_EVENTS, osFlagsWaitAny, osWaitForever); | ||||
|         furi_check((events & osFlagsError) == 0); | ||||
|         if(events & WorkerEvtTxStop) break; | ||||
|         if(events & WorkerEvtTxReady) { | ||||
|             size_t len = 0; | ||||
|             do { | ||||
|                 len = xStreamBufferReceive(usb_uart->tx_stream, &data, 1, 0); | ||||
|                 if(len > 0) { | ||||
|                     furi_hal_uart_tx(usb_uart->cfg.uart_ch, data, len); | ||||
|                 } | ||||
|                 if((usb_uart->buf_full == true) && | ||||
|                    (xStreamBufferBytesAvailable(usb_uart->tx_stream) == 0)) { | ||||
|                     // Stream buffer was overflown, but now is free. Reading USB buffer to resume USB transfers
 | ||||
|                     usb_uart->buf_full = false; | ||||
|                     int32_t size = furi_hal_cdc_receive(usb_uart->cfg.vcp_ch, data, USB_PKT_LEN); | ||||
|                     if(size > 0) { | ||||
|                         furi_hal_uart_tx(usb_uart->cfg.uart_ch, data, size); | ||||
|                     } | ||||
|                 } | ||||
|             } while(len > 0); | ||||
|         if(events & WorkerEvtCdcRx) { | ||||
|             furi_check(osMutexAcquire(usb_uart->usb_mutex, osWaitForever) == osOK); | ||||
|             int32_t size = furi_hal_cdc_receive(usb_uart->cfg.vcp_ch, data, USB_CDC_PKT_LEN); | ||||
|             furi_check(osMutexRelease(usb_uart->usb_mutex) == osOK); | ||||
| 
 | ||||
|             if(size > 0) { | ||||
|                 furi_hal_uart_tx(usb_uart->cfg.uart_ch, data, size); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return 0; | ||||
| @ -184,26 +167,11 @@ static int32_t usb_uart_tx_thread(void* context) { | ||||
| /* VCP callbacks */ | ||||
| 
 | ||||
| static void vcp_on_cdc_tx_complete() { | ||||
|     osEventFlagsSet(usb_uart->events, WorkerEvtSof); | ||||
|     osSemaphoreRelease(usb_uart->tx_sem); | ||||
| } | ||||
| 
 | ||||
| static void vcp_on_cdc_rx() { | ||||
|     BaseType_t xHigherPriorityTaskWoken = pdFALSE; | ||||
| 
 | ||||
|     uint16_t max_len = xStreamBufferSpacesAvailable(usb_uart->tx_stream); | ||||
|     if(max_len >= USB_PKT_LEN) { | ||||
|         //if(max_len > USB_PKT_LEN) max_len = USB_PKT_LEN;
 | ||||
|         int32_t size = furi_hal_cdc_receive(usb_uart->cfg.vcp_ch, usb_uart->tx_buf, USB_PKT_LEN); | ||||
|         if(size > 0) { | ||||
|             size_t ret = xStreamBufferSendFromISR( | ||||
|                 usb_uart->tx_stream, usb_uart->tx_buf, size, &xHigherPriorityTaskWoken); | ||||
|             furi_check(ret == size); | ||||
|         } | ||||
|     } else { | ||||
|         usb_uart->buf_full = true; | ||||
|     } | ||||
|     osEventFlagsSet(usb_uart->events, WorkerEvtTxReady); | ||||
|     portYIELD_FROM_ISR(xHigherPriorityTaskWoken); | ||||
|     osThreadFlagsSet(furi_thread_get_thread_id(usb_uart->tx_thread), WorkerEvtCdcRx); | ||||
| } | ||||
| 
 | ||||
| static void vcp_state_callback(uint8_t state) { | ||||
| @ -228,18 +196,15 @@ void usb_uart_enable(UsbUartConfig* cfg) { | ||||
|         furi_thread_set_context(usb_uart->thread, cfg); | ||||
|         furi_thread_set_callback(usb_uart->thread, usb_uart_worker); | ||||
| 
 | ||||
|         usb_uart->events = osEventFlagsNew(NULL); | ||||
| 
 | ||||
|         furi_thread_start(usb_uart->thread); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void usb_uart_disable() { | ||||
|     if(running == true) { | ||||
|         osEventFlagsSet(usb_uart->events, WorkerEvtStop); | ||||
|         osThreadFlagsSet(furi_thread_get_thread_id(usb_uart->thread), WorkerEvtStop); | ||||
|         furi_thread_join(usb_uart->thread); | ||||
|         furi_thread_free(usb_uart->thread); | ||||
|         osEventFlagsDelete(usb_uart->events); | ||||
|         free(usb_uart); | ||||
|         running = false; | ||||
|     } | ||||
|  | ||||
| @ -189,7 +189,7 @@ void gui_input(Gui* gui, InputEvent* input_event) { | ||||
|     } else if(input_event->type == InputTypePress) { | ||||
|         gui->ongoing_input |= key_bit; | ||||
|     } else if(!(gui->ongoing_input & key_bit)) { | ||||
|         FURI_LOG_W( | ||||
|         FURI_LOG_D( | ||||
|             "Gui", | ||||
|             "non-complementary input, discarding key: %s type: %s, sequence: %p", | ||||
|             input_get_key_name(input_event->key), | ||||
| @ -211,7 +211,7 @@ void gui_input(Gui* gui, InputEvent* input_event) { | ||||
|     if(view_port && view_port == gui->ongoing_input_view_port) { | ||||
|         view_port_input(view_port, input_event); | ||||
|     } else if(gui->ongoing_input_view_port && input_event->type == InputTypeRelease) { | ||||
|         FURI_LOG_W( | ||||
|         FURI_LOG_D( | ||||
|             "Gui", | ||||
|             "ViewPort changed while key press %p -> %p. Sending key: %s, type: %s, sequence: %p to previous view port", | ||||
|             gui->ongoing_input_view_port, | ||||
| @ -221,7 +221,7 @@ void gui_input(Gui* gui, InputEvent* input_event) { | ||||
|             input_event->sequence); | ||||
|         view_port_input(gui->ongoing_input_view_port, input_event); | ||||
|     } else { | ||||
|         FURI_LOG_W( | ||||
|         FURI_LOG_D( | ||||
|             "Gui", | ||||
|             "ViewPort changed while key press %p -> %p. Discarding key: %s, type: %s, sequence: %p", | ||||
|             gui->ongoing_input_view_port, | ||||
| @ -258,8 +258,7 @@ void gui_cli_screen_stream_callback(uint8_t* data, size_t size, void* context) { | ||||
| void gui_cli_screen_stream(Cli* cli, string_t args, void* context) { | ||||
|     furi_assert(context); | ||||
|     Gui* gui = context; | ||||
|     gui_set_framebuffer_callback_context(gui, gui); | ||||
|     gui_set_framebuffer_callback(gui, gui_cli_screen_stream_callback); | ||||
|     gui_set_framebuffer_callback(gui, gui_cli_screen_stream_callback, gui); | ||||
|     gui_redraw(gui); | ||||
| 
 | ||||
|     // Wait for control events
 | ||||
| @ -279,8 +278,7 @@ void gui_cli_screen_stream(Cli* cli, string_t args, void* context) { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     gui_set_framebuffer_callback(gui, NULL); | ||||
|     gui_set_framebuffer_callback_context(gui, NULL); | ||||
|     gui_set_framebuffer_callback(gui, NULL, NULL); | ||||
| } | ||||
| 
 | ||||
| void gui_add_view_port(Gui* gui, ViewPort* view_port, GuiLayer layer) { | ||||
| @ -387,14 +385,12 @@ void gui_view_port_send_to_back(Gui* gui, ViewPort* view_port) { | ||||
|     gui_unlock(gui); | ||||
| } | ||||
| 
 | ||||
| void gui_set_framebuffer_callback(Gui* gui, GuiCanvasCommitCallback callback) { | ||||
| void gui_set_framebuffer_callback(Gui* gui, GuiCanvasCommitCallback callback, void* context) { | ||||
|     furi_assert(gui); | ||||
|     gui_lock(gui); | ||||
|     gui->canvas_callback = callback; | ||||
| } | ||||
| 
 | ||||
| void gui_set_framebuffer_callback_context(Gui* gui, void* context) { | ||||
|     furi_assert(gui); | ||||
|     gui->canvas_callback_context = context; | ||||
|     gui_unlock(gui); | ||||
| } | ||||
| 
 | ||||
| Gui* gui_alloc() { | ||||
| @ -414,7 +410,7 @@ Gui* gui_alloc() { | ||||
|     gui->input_queue = osMessageQueueNew(8, sizeof(InputEvent), NULL); | ||||
|     gui->input_events = furi_record_open("input_events"); | ||||
|     furi_check(gui->input_events); | ||||
|     subscribe_pubsub(gui->input_events, gui_input_events_callback, gui); | ||||
|     furi_pubsub_subscribe(gui->input_events, gui_input_events_callback, gui); | ||||
|     // Cli
 | ||||
|     gui->cli = furi_record_open("cli"); | ||||
|     cli_add_command( | ||||
|  | ||||
| @ -73,15 +73,9 @@ void gui_view_port_send_to_back(Gui* gui, ViewPort* view_port); | ||||
|  * | ||||
|  * @param      gui       Gui instance | ||||
|  * @param      callback  GuiCanvasCommitCallback | ||||
|  * @param      context   GuiCanvasCommitCallback context | ||||
|  */ | ||||
| void gui_set_framebuffer_callback(Gui* gui, GuiCanvasCommitCallback callback); | ||||
| 
 | ||||
| /** Set gui canvas commit callback context
 | ||||
|  * | ||||
|  * @param      gui      Gui instance | ||||
|  * @param      context  pointer to context | ||||
|  */ | ||||
| void gui_set_framebuffer_callback_context(Gui* gui, void* context); | ||||
| void gui_set_framebuffer_callback(Gui* gui, GuiCanvasCommitCallback callback, void* context); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
|  | ||||
| @ -50,7 +50,7 @@ struct Gui { | ||||
| 
 | ||||
|     // Input
 | ||||
|     osMessageQueueId_t input_queue; | ||||
|     PubSub* input_events; | ||||
|     FuriPubSub* input_events; | ||||
|     uint8_t ongoing_input; | ||||
|     ViewPort* ongoing_input_view_port; | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| #include "icon_i.h" | ||||
| 
 | ||||
| #include <furi.h> | ||||
| #include <timers.h> | ||||
| 
 | ||||
| IconAnimation* icon_animation_alloc(const Icon* icon) { | ||||
|     furi_assert(icon); | ||||
|  | ||||
							
								
								
									
										36
									
								
								applications/gui/modules/variable-item-list.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										36
									
								
								applications/gui/modules/variable-item-list.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @ -84,6 +84,40 @@ static void variable_item_list_draw_callback(Canvas* canvas, void* _model) { | ||||
|     elements_scrollbar(canvas, model->position, VariableItemArray_size(model->items)); | ||||
| } | ||||
| 
 | ||||
| void variable_item_list_set_selected_item(VariableItemList* variable_item_list, uint8_t index) { | ||||
|     with_view_model( | ||||
|         variable_item_list->view, (VariableItemListModel * model) { | ||||
|             uint8_t position = index; | ||||
|             if(position >= VariableItemArray_size(model->items)) { | ||||
|                 position = 0; | ||||
|             } | ||||
| 
 | ||||
|             model->position = position; | ||||
|             model->window_position = position; | ||||
| 
 | ||||
|             if(model->window_position > 0) { | ||||
|                 model->window_position -= 1; | ||||
|             } | ||||
| 
 | ||||
|             if(VariableItemArray_size(model->items) <= 4) { | ||||
|                 model->window_position = 0; | ||||
|             } else { | ||||
|                 if(model->window_position >= (VariableItemArray_size(model->items) - 4)) { | ||||
|                     model->window_position = (VariableItemArray_size(model->items) - 4); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             return true; | ||||
|         }); | ||||
| } | ||||
| 
 | ||||
| uint8_t variable_item_list_get_selected_item_index(VariableItemList* variable_item_list) { | ||||
|     VariableItemListModel* model = view_get_model(variable_item_list->view); | ||||
|     uint8_t idx = model->position; | ||||
|     view_commit_model(variable_item_list->view, false); | ||||
|     return idx; | ||||
| } | ||||
| 
 | ||||
| static bool variable_item_list_input_callback(InputEvent* event, void* context) { | ||||
|     VariableItemList* variable_item_list = context; | ||||
|     furi_assert(variable_item_list); | ||||
| @ -323,4 +357,4 @@ uint8_t variable_item_get_current_value_index(VariableItem* item) { | ||||
| 
 | ||||
| void* variable_item_get_context(VariableItem* item) { | ||||
|     return item->context; | ||||
| } | ||||
| } | ||||
|  | ||||
| @ -70,6 +70,10 @@ void variable_item_list_set_enter_callback( | ||||
|     VariableItemListEnterCallback callback, | ||||
|     void* context); | ||||
| 
 | ||||
| void variable_item_list_set_selected_item(VariableItemList* variable_item_list, uint8_t index); | ||||
| 
 | ||||
| uint8_t variable_item_list_get_selected_item_index(VariableItemList* variable_item_list); | ||||
| 
 | ||||
| /** Set item current selected index
 | ||||
|  * | ||||
|  * @param      item                 VariableItem* instance | ||||
|  | ||||
| @ -236,7 +236,7 @@ void view_dispatcher_handle_input(ViewDispatcher* view_dispatcher, InputEvent* e | ||||
|     } else if(event->type == InputTypeRelease) { | ||||
|         view_dispatcher->ongoing_input &= ~key_bit; | ||||
|     } else if(!(view_dispatcher->ongoing_input & key_bit)) { | ||||
|         FURI_LOG_W( | ||||
|         FURI_LOG_D( | ||||
|             "ViewDispatcher", | ||||
|             "non-complementary input, discarding key: %s, type: %s, sequence: %p", | ||||
|             input_get_key_name(event->key), | ||||
| @ -275,7 +275,7 @@ void view_dispatcher_handle_input(ViewDispatcher* view_dispatcher, InputEvent* e | ||||
|             } | ||||
|         } | ||||
|     } else if(view_dispatcher->ongoing_input_view && event->type == InputTypeRelease) { | ||||
|         FURI_LOG_W( | ||||
|         FURI_LOG_D( | ||||
|             "ViewDispatcher", | ||||
|             "View changed while key press %p -> %p. Sending key: %s, type: %s, sequence: %p to previous view port", | ||||
|             view_dispatcher->ongoing_input_view, | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| #include <callback-connector.h> | ||||
| #include <m-string.h> | ||||
| #include <toolbox/path.h> | ||||
| #include <toolbox/flipper-file-cpp.h> | ||||
| #include <flipper_file/flipper_file.h> | ||||
| 
 | ||||
| const char* iButtonApp::app_folder = "/any/ibutton"; | ||||
| const char* iButtonApp::app_extension = ".ibtn"; | ||||
| @ -48,8 +48,8 @@ iButtonApp::iButtonApp() | ||||
| iButtonApp::~iButtonApp() { | ||||
|     for(std::map<Scene, iButtonScene*>::iterator it = scenes.begin(); it != scenes.end(); ++it) { | ||||
|         delete it->second; | ||||
|         scenes.erase(it); | ||||
|     } | ||||
|     scenes.clear(); | ||||
|     delete key_worker; | ||||
| 
 | ||||
|     furi_hal_power_insomnia_exit(); | ||||
| @ -191,7 +191,7 @@ bool iButtonApp::save_key(const char* key_name) { | ||||
|     // Create ibutton directory if necessary
 | ||||
|     make_app_folder(); | ||||
| 
 | ||||
|     FlipperFileCpp file(storage); | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
|     string_t key_file_name; | ||||
|     bool result = false; | ||||
|     string_init(key_file_name); | ||||
| @ -207,27 +207,30 @@ bool iButtonApp::save_key(const char* key_name) { | ||||
|         string_printf(key_file_name, "%s/%s%s", app_folder, key.get_name(), app_extension); | ||||
| 
 | ||||
|         // Open file for write
 | ||||
|         if(!file.new_write(string_get_cstr(key_file_name))) break; | ||||
|         if(!flipper_file_open_always(file, string_get_cstr(key_file_name))) break; | ||||
| 
 | ||||
|         // Write header
 | ||||
|         if(!file.write_header_cstr(iButtonApp::app_filetype, 1)) break; | ||||
|         if(!flipper_file_write_header_cstr(file, iButtonApp::app_filetype, 1)) break; | ||||
| 
 | ||||
|         // Write key type
 | ||||
|         if(!file.write_comment_cstr("Key type can be Cyfral, Dallas or Metakom")) break; | ||||
|         if(!flipper_file_write_comment_cstr(file, "Key type can be Cyfral, Dallas or Metakom")) | ||||
|             break; | ||||
|         const char* key_type = key.get_key_type_string_by_type(key.get_key_type()); | ||||
|         if(!file.write_string_cstr("Key type", key_type)) break; | ||||
|         if(!flipper_file_write_string_cstr(file, "Key type", key_type)) break; | ||||
| 
 | ||||
|         // Write data
 | ||||
|         if(!file.write_comment_cstr( | ||||
|                "Data size for Cyfral is 2, for Metakom is 4, for Dallas is 8")) | ||||
|         if(!flipper_file_write_comment_cstr( | ||||
|                file, "Data size for Cyfral is 2, for Metakom is 4, for Dallas is 8")) | ||||
|             break; | ||||
| 
 | ||||
|         if(!file.write_hex_array("Data", key.get_data(), key.get_type_data_size())) break; | ||||
|         if(!flipper_file_write_hex(file, "Data", key.get_data(), key.get_type_data_size())) break; | ||||
|         result = true; | ||||
| 
 | ||||
|     } while(false); | ||||
| 
 | ||||
|     file.close(); | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
| 
 | ||||
|     string_clear(key_file_name); | ||||
| 
 | ||||
|     if(!result) { | ||||
| @ -238,28 +241,29 @@ bool iButtonApp::save_key(const char* key_name) { | ||||
| } | ||||
| 
 | ||||
| bool iButtonApp::load_key_data(string_t key_path) { | ||||
|     FlipperFileCpp file(storage); | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
|     bool result = false; | ||||
|     string_t data; | ||||
|     string_init(data); | ||||
| 
 | ||||
|     do { | ||||
|         if(!file.open_read(string_get_cstr(key_path))) break; | ||||
|         if(!flipper_file_open_existing(file, string_get_cstr(key_path))) break; | ||||
| 
 | ||||
|         // header
 | ||||
|         uint32_t version; | ||||
|         if(!file.read_header(data, &version)) break; | ||||
|         if(!flipper_file_read_header(file, data, &version)) break; | ||||
|         if(string_cmp_str(data, iButtonApp::app_filetype) != 0) break; | ||||
|         if(version != 1) break; | ||||
| 
 | ||||
|         // key type
 | ||||
|         iButtonKeyType type; | ||||
|         if(!file.read_string("Key type", data)) break; | ||||
|         if(!flipper_file_read_string(file, "Key type", data)) break; | ||||
|         if(!key.get_key_type_by_type_string(string_get_cstr(data), &type)) break; | ||||
| 
 | ||||
|         // key data
 | ||||
|         uint8_t key_data[IBUTTON_KEY_DATA_SIZE] = {0}; | ||||
|         if(!file.read_hex_array("Data", key_data, key.get_type_data_size_by_type(type))) break; | ||||
|         if(!flipper_file_read_hex(file, "Data", key_data, key.get_type_data_size_by_type(type))) | ||||
|             break; | ||||
| 
 | ||||
|         key.set_type(type); | ||||
|         key.set_data(key_data, IBUTTON_KEY_DATA_SIZE); | ||||
| @ -267,7 +271,8 @@ bool iButtonApp::load_key_data(string_t key_path) { | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     file.close(); | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     string_clear(data); | ||||
| 
 | ||||
|     if(!result) { | ||||
|  | ||||
| @ -28,11 +28,11 @@ void input_press_timer_callback(void* arg) { | ||||
|     input_pin->press_counter++; | ||||
|     if(input_pin->press_counter == INPUT_LONG_PRESS_COUNTS) { | ||||
|         event.type = InputTypeLong; | ||||
|         notify_pubsub(&input->event_pubsub, &event); | ||||
|         furi_pubsub_publish(input->event_pubsub, &event); | ||||
|     } else if(input_pin->press_counter > INPUT_LONG_PRESS_COUNTS) { | ||||
|         input_pin->press_counter--; | ||||
|         event.type = InputTypeRepeat; | ||||
|         notify_pubsub(&input->event_pubsub, &event); | ||||
|         furi_pubsub_publish(input->event_pubsub, &event); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -89,7 +89,7 @@ void input_cli_send(Cli* cli, string_t args, void* context) { | ||||
|         return; | ||||
|     } | ||||
|     // Publish input event
 | ||||
|     notify_pubsub(&input->event_pubsub, &event); | ||||
|     furi_pubsub_publish(input->event_pubsub, &event); | ||||
| } | ||||
| 
 | ||||
| const char* input_get_key_name(InputKey key) { | ||||
| @ -120,8 +120,8 @@ const char* input_get_type_name(InputType type) { | ||||
| int32_t input_srv() { | ||||
|     input = furi_alloc(sizeof(Input)); | ||||
|     input->thread = osThreadGetId(); | ||||
|     init_pubsub(&input->event_pubsub); | ||||
|     furi_record_create("input_events", &input->event_pubsub); | ||||
|     input->event_pubsub = furi_pubsub_alloc(); | ||||
|     furi_record_create("input_events", input->event_pubsub); | ||||
| 
 | ||||
|     input->cli = furi_record_open("cli"); | ||||
|     if(input->cli) { | ||||
| @ -168,14 +168,14 @@ int32_t input_srv() { | ||||
|                     input_timer_stop(input->pin_states[i].press_timer); | ||||
|                     if(input->pin_states[i].press_counter < INPUT_LONG_PRESS_COUNTS) { | ||||
|                         event.type = InputTypeShort; | ||||
|                         notify_pubsub(&input->event_pubsub, &event); | ||||
|                         furi_pubsub_publish(input->event_pubsub, &event); | ||||
|                     } | ||||
|                     input->pin_states[i].press_counter = 0; | ||||
|                 } | ||||
| 
 | ||||
|                 // Send Press/Release event
 | ||||
|                 event.type = input->pin_states[i].state ? InputTypePress : InputTypeRelease; | ||||
|                 notify_pubsub(&input->event_pubsub, &event); | ||||
|                 furi_pubsub_publish(input->event_pubsub, &event); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | ||||
| @ -18,7 +18,7 @@ typedef enum { | ||||
|     InputTypeRepeat, /**< Repeat event, emmited with INPUT_REPEATE_PRESS period after InputTypeLong event */ | ||||
| } InputType; | ||||
| 
 | ||||
| /** Input Event, dispatches with PubSub */ | ||||
| /** Input Event, dispatches with FuriPubSub */ | ||||
| typedef struct { | ||||
|     uint32_t sequence; | ||||
|     InputKey key; | ||||
|  | ||||
| @ -6,8 +6,6 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include "input.h" | ||||
| #include <FreeRTOS.h> | ||||
| #include <timers.h> | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| @ -35,7 +33,7 @@ typedef struct { | ||||
| /** Input state */ | ||||
| typedef struct { | ||||
|     osThreadId_t thread; | ||||
|     PubSub event_pubsub; | ||||
|     FuriPubSub* event_pubsub; | ||||
|     InputPinState* pin_states; | ||||
|     Cli* cli; | ||||
|     volatile uint32_t counter; | ||||
|  | ||||
| @ -211,10 +211,12 @@ void IrdaApp::notify_red_blink() { | ||||
|     notification_message(notification, &sequence_blink_red_10); | ||||
| } | ||||
| 
 | ||||
| void IrdaApp::notify_space_blink() { | ||||
| void IrdaApp::notify_sent_just_learnt() { | ||||
|     static const NotificationSequence sequence = { | ||||
|         &message_green_0, | ||||
|         &message_vibro_on, | ||||
|         &message_delay_50, | ||||
|         &message_vibro_off, | ||||
|         &message_green_255, | ||||
|         &message_do_not_reset, | ||||
|         NULL, | ||||
| @ -261,10 +263,6 @@ void IrdaApp::notify_blink_green() { | ||||
|     notification_message(notification, &sequence); | ||||
| } | ||||
| 
 | ||||
| void IrdaApp::notify_double_vibro() { | ||||
|     notification_message(notification, &sequence_double_vibro); | ||||
| } | ||||
| 
 | ||||
| void IrdaApp::notify_green_on() { | ||||
|     notification_message(notification, &sequence_set_only_green_255); | ||||
| } | ||||
|  | ||||
| @ -77,8 +77,7 @@ public: | ||||
| 
 | ||||
|     void notify_success(); | ||||
|     void notify_red_blink(); | ||||
|     void notify_space_blink(); | ||||
|     void notify_double_vibro(); | ||||
|     void notify_sent_just_learnt(); | ||||
|     void notify_green_on(); | ||||
|     void notify_green_off(); | ||||
|     void notify_click(); | ||||
|  | ||||
| @ -23,16 +23,24 @@ void IrdaAppSceneLearnSuccess::on_enter(IrdaApp* app) { | ||||
| 
 | ||||
|     if(!signal.is_raw()) { | ||||
|         auto message = &signal.get_message(); | ||||
|         uint8_t adr_digits = ROUND_UP_TO(irda_get_protocol_address_length(message->protocol), 4); | ||||
|         uint8_t cmd_digits = ROUND_UP_TO(irda_get_protocol_command_length(message->protocol), 4); | ||||
|         uint8_t max_digits = MAX(adr_digits, cmd_digits); | ||||
|         max_digits = MIN(max_digits, 7); | ||||
|         size_t label_x_offset = 63 + (7 - max_digits) * 3; | ||||
| 
 | ||||
|         app->set_text_store(0, "%s", irda_get_protocol_name(message->protocol)); | ||||
|         app->set_text_store( | ||||
|             1, | ||||
|             "A: 0x%0*lX\nC: 0x%0*lX\n", | ||||
|             ROUND_UP_TO(irda_get_protocol_address_length(message->protocol), 4), | ||||
|             adr_digits, | ||||
|             message->address, | ||||
|             ROUND_UP_TO(irda_get_protocol_command_length(message->protocol), 4), | ||||
|             cmd_digits, | ||||
|             message->command); | ||||
|         dialog_ex_set_header(dialog_ex, app->get_text_store(0), 95, 10, AlignCenter, AlignCenter); | ||||
|         dialog_ex_set_text(dialog_ex, app->get_text_store(1), 75, 23, AlignLeft, AlignTop); | ||||
| 
 | ||||
|         dialog_ex_set_header(dialog_ex, app->get_text_store(0), 95, 7, AlignCenter, AlignCenter); | ||||
|         dialog_ex_set_text( | ||||
|             dialog_ex, app->get_text_store(1), label_x_offset, 34, AlignLeft, AlignCenter); | ||||
|     } else { | ||||
|         dialog_ex_set_header(dialog_ex, "Unknown", 95, 10, AlignCenter, AlignCenter); | ||||
|         app->set_text_store(0, "%d samples", signal.get_raw_signal().timings_cnt); | ||||
| @ -42,7 +50,7 @@ void IrdaAppSceneLearnSuccess::on_enter(IrdaApp* app) { | ||||
|     dialog_ex_set_left_button_text(dialog_ex, "Retry"); | ||||
|     dialog_ex_set_right_button_text(dialog_ex, "Save"); | ||||
|     dialog_ex_set_center_button_text(dialog_ex, "Send"); | ||||
|     dialog_ex_set_icon(dialog_ex, 0, 1, &I_DolphinExcited_64x63); | ||||
|     dialog_ex_set_icon(dialog_ex, 0, 1, &I_DolphinReadingSuccess_59x63); | ||||
|     dialog_ex_set_result_callback(dialog_ex, dialog_result_callback); | ||||
|     dialog_ex_set_context(dialog_ex, app); | ||||
| 
 | ||||
| @ -62,7 +70,7 @@ bool IrdaAppSceneLearnSuccess::on_event(IrdaApp* app, IrdaAppEvent* event) { | ||||
|             app->switch_to_next_scene_without_saving(IrdaApp::Scene::Learn); | ||||
|             break; | ||||
|         case DialogExResultCenter: { | ||||
|             app->notify_space_blink(); | ||||
|             app->notify_sent_just_learnt(); | ||||
|             auto signal = app->get_received_signal(); | ||||
|             signal.transmit(); | ||||
|             break; | ||||
|  | ||||
| @ -39,10 +39,6 @@ void IrdaAppSceneLearn::on_enter(IrdaApp* app) { | ||||
|         popup, "Point the remote at IR port\nand push the button", 5, 10, AlignLeft, AlignCenter); | ||||
|     popup_set_callback(popup, NULL); | ||||
| 
 | ||||
|     if(app->get_learn_new_remote()) { | ||||
|         app->notify_double_vibro(); | ||||
|     } | ||||
| 
 | ||||
|     view_manager->switch_to(IrdaAppViewManager::ViewType::Popup); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -10,8 +10,9 @@ RfidTimerEmulator::~RfidTimerEmulator() { | ||||
| 
 | ||||
|     for(it = encoders.begin(); it != encoders.end(); ++it) { | ||||
|         delete it->second; | ||||
|         encoders.erase(it); | ||||
|     } | ||||
| 
 | ||||
|     encoders.clear(); | ||||
| } | ||||
| 
 | ||||
| void RfidTimerEmulator::start(LfrfidKeyType type, const uint8_t* data, uint8_t data_size) { | ||||
|  | ||||
| @ -16,8 +16,8 @@ | ||||
| #include "scene/lfrfid-app-scene-delete-confirm.h" | ||||
| #include "scene/lfrfid-app-scene-delete-success.h" | ||||
| 
 | ||||
| #include <lib/toolbox/path.h> | ||||
| #include <lib/toolbox/flipper-file-cpp.h> | ||||
| #include <toolbox/path.h> | ||||
| #include <flipper_file/flipper_file.h> | ||||
| 
 | ||||
| const char* LfRfidApp::app_folder = "/any/lfrfid"; | ||||
| const char* LfRfidApp::app_extension = ".rfid"; | ||||
| @ -119,17 +119,17 @@ bool LfRfidApp::delete_key(RfidKey* key) { | ||||
| } | ||||
| 
 | ||||
| bool LfRfidApp::load_key_data(const char* path, RfidKey* key) { | ||||
|     FlipperFileCpp file(storage); | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
|     bool result = false; | ||||
|     string_t str_result; | ||||
|     string_init(str_result); | ||||
| 
 | ||||
|     do { | ||||
|         if(!file.open_read(path)) break; | ||||
|         if(!flipper_file_open_existing(file, path)) break; | ||||
| 
 | ||||
|         // header
 | ||||
|         uint32_t version; | ||||
|         if(!file.read_header(str_result, &version)) break; | ||||
|         if(!flipper_file_read_header(file, str_result, &version)) break; | ||||
|         if(string_cmp_str(str_result, app_filetype) != 0) break; | ||||
|         if(version != 1) break; | ||||
| 
 | ||||
| @ -137,13 +137,13 @@ bool LfRfidApp::load_key_data(const char* path, RfidKey* key) { | ||||
|         LfrfidKeyType type; | ||||
|         RfidKey loaded_key; | ||||
| 
 | ||||
|         if(!file.read_string("Key type", str_result)) break; | ||||
|         if(!flipper_file_read_string(file, "Key type", str_result)) break; | ||||
|         if(!lfrfid_key_get_string_type(string_get_cstr(str_result), &type)) break; | ||||
|         loaded_key.set_type(type); | ||||
| 
 | ||||
|         // key data
 | ||||
|         uint8_t key_data[loaded_key.get_type_data_count()] = {}; | ||||
|         if(!file.read_hex_array("Data", key_data, loaded_key.get_type_data_count())) break; | ||||
|         if(!flipper_file_read_hex(file, "Data", key_data, loaded_key.get_type_data_count())) break; | ||||
|         loaded_key.set_data(key_data, loaded_key.get_type_data_count()); | ||||
| 
 | ||||
|         path_extract_filename_no_ext(path, str_result); | ||||
| @ -153,7 +153,8 @@ bool LfRfidApp::load_key_data(const char* path, RfidKey* key) { | ||||
|         result = true; | ||||
|     } while(0); | ||||
| 
 | ||||
|     file.close(); | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     string_clear(str_result); | ||||
| 
 | ||||
|     if(!result) { | ||||
| @ -164,21 +165,27 @@ bool LfRfidApp::load_key_data(const char* path, RfidKey* key) { | ||||
| } | ||||
| 
 | ||||
| bool LfRfidApp::save_key_data(const char* path, RfidKey* key) { | ||||
|     FlipperFileCpp file(storage); | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
|     bool result = false; | ||||
| 
 | ||||
|     do { | ||||
|         if(!file.new_write(path)) break; | ||||
|         if(!file.write_header_cstr(app_filetype, 1)) break; | ||||
|         if(!file.write_comment_cstr("Key type can be EM4100, H10301 or I40134")) break; | ||||
|         if(!file.write_string_cstr("Key type", lfrfid_key_get_type_string(key->get_type()))) break; | ||||
|         if(!file.write_comment_cstr("Data size for EM4100 is 5, for H10301 is 3, for I40134 is 3")) | ||||
|         if(!flipper_file_open_always(file, path)) break; | ||||
|         if(!flipper_file_write_header_cstr(file, app_filetype, 1)) break; | ||||
|         if(!flipper_file_write_comment_cstr(file, "Key type can be EM4100, H10301 or I40134")) | ||||
|             break; | ||||
|         if(!flipper_file_write_string_cstr( | ||||
|                file, "Key type", lfrfid_key_get_type_string(key->get_type()))) | ||||
|             break; | ||||
|         if(!flipper_file_write_comment_cstr( | ||||
|                file, "Data size for EM4100 is 5, for H10301 is 3, for I40134 is 3")) | ||||
|             break; | ||||
|         if(!flipper_file_write_hex(file, "Data", key->get_data(), key->get_type_data_count())) | ||||
|             break; | ||||
|         if(!file.write_hex_array("Data", key->get_data(), key->get_type_data_count())) break; | ||||
|         result = true; | ||||
|     } while(0); | ||||
| 
 | ||||
|     file.close(); | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
| 
 | ||||
|     if(!result) { | ||||
|         dialog_message_show_storage_error(dialogs, "Cannot save\nkey file"); | ||||
|  | ||||
							
								
								
									
										4
									
								
								applications/loader/loader.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										4
									
								
								applications/loader/loader.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @ -140,7 +140,7 @@ static void loader_thread_state_callback(FuriThreadState thread_state, void* con | ||||
|     Loader* instance = context; | ||||
| 
 | ||||
|     if(thread_state == FuriThreadStateRunning) { | ||||
|         instance->free_heap_size = xPortGetFreeHeapSize(); | ||||
|         instance->free_heap_size = memmgr_get_free_heap(); | ||||
|     } else if(thread_state == FuriThreadStateStopped) { | ||||
|         /*
 | ||||
|          * Current Leak Sanitizer assumes that memory is allocated and freed | ||||
| @ -153,7 +153,7 @@ static void loader_thread_state_callback(FuriThreadState thread_state, void* con | ||||
|          * both values should be taken into account. | ||||
|          */ | ||||
|         delay(20); | ||||
|         int heap_diff = instance->free_heap_size - xPortGetFreeHeapSize(); | ||||
|         int heap_diff = instance->free_heap_size - memmgr_get_free_heap(); | ||||
|         FURI_LOG_I( | ||||
|             LOADER_LOG_TAG, | ||||
|             "Application thread stopped. Heap allocation balance: %d. Thread allocation balance: %d.", | ||||
|  | ||||
| @ -427,7 +427,7 @@ static NotificationApp* notification_app_alloc() { | ||||
| 
 | ||||
|     // display backlight control
 | ||||
|     app->event_record = furi_record_open("input_events"); | ||||
|     subscribe_pubsub(app->event_record, input_event_callback, app); | ||||
|     furi_pubsub_subscribe(app->event_record, input_event_callback, app); | ||||
|     notification_message(app, &sequence_display_on); | ||||
| 
 | ||||
|     return app; | ||||
|  | ||||
| @ -44,7 +44,7 @@ typedef struct { | ||||
| 
 | ||||
| struct NotificationApp { | ||||
|     osMessageQueueId_t queue; | ||||
|     PubSub* event_record; | ||||
|     FuriPubSub* event_record; | ||||
|     osTimerId_t display_timer; | ||||
| 
 | ||||
|     NotificationLedLayer display; | ||||
|  | ||||
| @ -31,7 +31,7 @@ Power* power_alloc() { | ||||
|     power->gui = furi_record_open("gui"); | ||||
| 
 | ||||
|     // Pubsub
 | ||||
|     init_pubsub(&power->event_pubsub); | ||||
|     power->event_pubsub = furi_pubsub_alloc(); | ||||
| 
 | ||||
|     // State initialization
 | ||||
|     power->state = PowerStateNotCharging; | ||||
| @ -60,10 +60,6 @@ Power* power_alloc() { | ||||
| void power_free(Power* power) { | ||||
|     furi_assert(power); | ||||
| 
 | ||||
|     // Records
 | ||||
|     furi_record_close("notification"); | ||||
|     furi_record_close("gui"); | ||||
| 
 | ||||
|     // Gui
 | ||||
|     view_dispatcher_remove_view(power->view_dispatcher, PowerViewOff); | ||||
|     power_off_free(power->power_off); | ||||
| @ -73,6 +69,14 @@ void power_free(Power* power) { | ||||
| 
 | ||||
|     // State
 | ||||
|     osMutexDelete(power->info_mtx); | ||||
| 
 | ||||
|     // FuriPubSub
 | ||||
|     furi_pubsub_free(power->event_pubsub); | ||||
| 
 | ||||
|     // Records
 | ||||
|     furi_record_close("notification"); | ||||
|     furi_record_close("gui"); | ||||
| 
 | ||||
|     free(power); | ||||
| } | ||||
| 
 | ||||
| @ -83,14 +87,14 @@ static void power_check_charging_state(Power* power) { | ||||
|                 notification_internal_message(power->notification, &sequence_charged); | ||||
|                 power->state = PowerStateCharged; | ||||
|                 power->event.type = PowerEventTypeFullyCharged; | ||||
|                 notify_pubsub(&power->event_pubsub, &power->event); | ||||
|                 furi_pubsub_publish(power->event_pubsub, &power->event); | ||||
|             } | ||||
|         } else { | ||||
|             if(power->state != PowerStateCharging) { | ||||
|                 notification_internal_message(power->notification, &sequence_charging); | ||||
|                 power->state = PowerStateCharging; | ||||
|                 power->event.type = PowerEventTypeStartCharging; | ||||
|                 notify_pubsub(&power->event_pubsub, &power->event); | ||||
|                 furi_pubsub_publish(power->event_pubsub, &power->event); | ||||
|             } | ||||
|         } | ||||
|     } else { | ||||
| @ -98,7 +102,7 @@ static void power_check_charging_state(Power* power) { | ||||
|             notification_internal_message(power->notification, &sequence_not_charging); | ||||
|             power->state = PowerStateNotCharging; | ||||
|             power->event.type = PowerEventTypeStopCharging; | ||||
|             notify_pubsub(&power->event_pubsub, &power->event); | ||||
|             furi_pubsub_publish(power->event_pubsub, &power->event); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -156,7 +160,7 @@ static void power_check_battery_level_change(Power* power) { | ||||
|         power->battery_level = power->info.charge; | ||||
|         power->event.type = PowerEventTypeBatteryLevelChanged; | ||||
|         power->event.data.battery_level = power->battery_level; | ||||
|         notify_pubsub(&power->event_pubsub, &power->event); | ||||
|         furi_pubsub_publish(power->event_pubsub, &power->event); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -62,4 +62,4 @@ void power_get_info(Power* power, PowerInfo* info); | ||||
| /** Get power event pubsub handler
 | ||||
|  * @param power - Power instance | ||||
|  */ | ||||
| PubSub* power_get_pubsub(Power* power); | ||||
| FuriPubSub* power_get_pubsub(Power* power); | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| #include "power_i.h" | ||||
| 
 | ||||
| #include <furi.h> | ||||
| #include "furi-hal-power.h" | ||||
| #include "furi-hal-bootloader.h" | ||||
| @ -30,7 +31,7 @@ void power_get_info(Power* power, PowerInfo* info) { | ||||
|     osMutexRelease(power->info_mtx); | ||||
| } | ||||
| 
 | ||||
| PubSub* power_get_pubsub(Power* power) { | ||||
| FuriPubSub* power_get_pubsub(Power* power) { | ||||
|     furi_assert(power); | ||||
|     return &power->event_pubsub; | ||||
|     return power->event_pubsub; | ||||
| } | ||||
|  | ||||
| @ -25,7 +25,7 @@ struct Power { | ||||
|     ViewPort* battery_view_port; | ||||
|     Gui* gui; | ||||
|     NotificationApp* notification; | ||||
|     PubSub event_pubsub; | ||||
|     FuriPubSub* event_pubsub; | ||||
|     PowerEvent event; | ||||
| 
 | ||||
|     PowerState state; | ||||
|  | ||||
| @ -45,6 +45,10 @@ static RpcSystemCallbacks rpc_systems[] = { | ||||
|         .alloc = rpc_system_app_alloc, | ||||
|         .free = NULL, | ||||
|     }, | ||||
|     { | ||||
|         .alloc = rpc_system_gui_alloc, | ||||
|         .free = rpc_system_gui_free, | ||||
|     }, | ||||
| }; | ||||
| 
 | ||||
| struct RpcSession { | ||||
| @ -161,10 +165,10 @@ void rpc_print_message(const PB_Main* message) { | ||||
|     case PB_Main_stop_session_tag: | ||||
|         string_cat_printf(str, "\tstop_session {\r\n"); | ||||
|         break; | ||||
|     case PB_Main_app_start_tag: { | ||||
|     case PB_Main_app_start_request_tag: { | ||||
|         string_cat_printf(str, "\tapp_start {\r\n"); | ||||
|         const char* name = message->content.app_start.name; | ||||
|         const char* args = message->content.app_start.args; | ||||
|         const char* name = message->content.app_start_request.name; | ||||
|         const char* args = message->content.app_start_request.args; | ||||
|         if(name) { | ||||
|             string_cat_printf(str, "\t\tname: %s\r\n", name); | ||||
|         } | ||||
| @ -260,6 +264,22 @@ void rpc_print_message(const PB_Main* message) { | ||||
|         string_cat_printf(str, "\tlist_response {\r\n"); | ||||
|         rpc_sprintf_msg_file(str, "\t\t", msg_file, msg_file_count); | ||||
|     } | ||||
|     case PB_Main_gui_start_screen_stream_request_tag: | ||||
|         string_cat_printf(str, "\tstart_screen_stream {\r\n"); | ||||
|         break; | ||||
|     case PB_Main_gui_stop_screen_stream_request_tag: | ||||
|         string_cat_printf(str, "\tstop_screen_stream {\r\n"); | ||||
|         break; | ||||
|     case PB_Main_gui_screen_stream_frame_tag: | ||||
|         string_cat_printf(str, "\tscreen_stream_frame {\r\n"); | ||||
|         break; | ||||
|     case PB_Main_gui_send_input_event_request_tag: | ||||
|         string_cat_printf(str, "\tsend_input_event {\r\n"); | ||||
|         string_cat_printf( | ||||
|             str, "\t\tkey: %d\r\n", message->content.gui_send_input_event_request.key); | ||||
|         string_cat_printf( | ||||
|             str, "\t\type: %d\r\n", message->content.gui_send_input_event_request.type); | ||||
|         break; | ||||
|     } | ||||
|     string_cat_printf(str, "\t}\r\n}\r\n"); | ||||
|     printf("%s", string_get_cstr(str)); | ||||
|  | ||||
| @ -9,13 +9,13 @@ void rpc_system_app_start_process(const PB_Main* request, void* context) { | ||||
|     Rpc* rpc = context; | ||||
|     furi_assert(rpc); | ||||
|     furi_assert(request); | ||||
|     furi_assert(request->which_content == PB_Main_app_start_tag); | ||||
|     furi_assert(request->which_content == PB_Main_app_start_request_tag); | ||||
|     PB_CommandStatus result = PB_CommandStatus_ERROR_APP_CANT_START; | ||||
| 
 | ||||
|     Loader* loader = furi_record_open("loader"); | ||||
|     const char* app_name = request->content.app_start.name; | ||||
|     const char* app_name = request->content.app_start_request.name; | ||||
|     if(app_name) { | ||||
|         const char* app_args = request->content.app_start.args; | ||||
|         const char* app_args = request->content.app_start_request.args; | ||||
|         LoaderStatus status = loader_start(loader, app_name, app_args); | ||||
|         if(status == LoaderStatusErrorAppStarted) { | ||||
|             result = PB_CommandStatus_ERROR_APP_SYSTEM_LOCKED; | ||||
| @ -70,7 +70,7 @@ void* rpc_system_app_alloc(Rpc* rpc) { | ||||
|     }; | ||||
| 
 | ||||
|     rpc_handler.message_handler = rpc_system_app_start_process; | ||||
|     rpc_add_handler(rpc, PB_Main_app_start_tag, &rpc_handler); | ||||
|     rpc_add_handler(rpc, PB_Main_app_start_request_tag, &rpc_handler); | ||||
| 
 | ||||
|     rpc_handler.message_handler = rpc_system_app_lock_status_process; | ||||
|     rpc_add_handler(rpc, PB_Main_app_lock_status_request_tag, &rpc_handler); | ||||
|  | ||||
							
								
								
									
										155
									
								
								applications/rpc/rpc_gui.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								applications/rpc/rpc_gui.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,155 @@ | ||||
| #include "flipper.pb.h" | ||||
| #include "rpc_i.h" | ||||
| #include "gui.pb.h" | ||||
| #include <gui/gui_i.h> | ||||
| 
 | ||||
| typedef struct { | ||||
|     Rpc* rpc; | ||||
|     Gui* gui; | ||||
| } RpcGuiSystem; | ||||
| 
 | ||||
| void rpc_system_gui_screen_frame_callback(uint8_t* data, size_t size, void* context) { | ||||
|     furi_assert(data); | ||||
|     furi_assert(size == 1024); | ||||
|     furi_assert(context); | ||||
| 
 | ||||
|     RpcGuiSystem* rpc_gui = context; | ||||
| 
 | ||||
|     PB_Main* frame = furi_alloc(sizeof(PB_Main)); | ||||
| 
 | ||||
|     frame->which_content = PB_Main_gui_screen_stream_frame_tag; | ||||
|     frame->command_status = PB_CommandStatus_OK; | ||||
|     frame->content.gui_screen_stream_frame.data = furi_alloc(PB_BYTES_ARRAY_T_ALLOCSIZE(size)); | ||||
|     uint8_t* buffer = frame->content.gui_screen_stream_frame.data->bytes; | ||||
|     uint16_t* frame_size_msg = &frame->content.gui_screen_stream_frame.data->size; | ||||
|     *frame_size_msg = size; | ||||
|     memcpy(buffer, data, size); | ||||
| 
 | ||||
|     rpc_send_and_release(rpc_gui->rpc, frame); | ||||
| 
 | ||||
|     free(frame); | ||||
| } | ||||
| 
 | ||||
| void rpc_system_gui_start_screen_stream_process(const PB_Main* request, void* context) { | ||||
|     furi_assert(request); | ||||
|     furi_assert(context); | ||||
|     RpcGuiSystem* rpc_gui = context; | ||||
| 
 | ||||
|     rpc_send_and_release_empty(rpc_gui->rpc, request->command_id, PB_CommandStatus_OK); | ||||
| 
 | ||||
|     gui_set_framebuffer_callback(rpc_gui->gui, rpc_system_gui_screen_frame_callback, context); | ||||
| } | ||||
| 
 | ||||
| void rpc_system_gui_stop_screen_stream_process(const PB_Main* request, void* context) { | ||||
|     furi_assert(request); | ||||
|     furi_assert(context); | ||||
|     RpcGuiSystem* rpc_gui = context; | ||||
| 
 | ||||
|     rpc_send_and_release_empty(rpc_gui->rpc, request->command_id, PB_CommandStatus_OK); | ||||
| 
 | ||||
|     gui_set_framebuffer_callback(rpc_gui->gui, NULL, NULL); | ||||
| } | ||||
| 
 | ||||
| void rpc_system_gui_send_input_event_request_process(const PB_Main* request, void* context) { | ||||
|     furi_assert(request); | ||||
|     furi_assert(request->which_content == PB_Main_gui_send_input_event_request_tag); | ||||
|     furi_assert(context); | ||||
|     RpcGuiSystem* rpc_gui = context; | ||||
| 
 | ||||
|     InputEvent event; | ||||
| 
 | ||||
|     bool invalid = false; | ||||
| 
 | ||||
|     switch(request->content.gui_send_input_event_request.key) { | ||||
|     case PB_Gui_InputKey_UP: | ||||
|         event.key = InputKeyUp; | ||||
|         break; | ||||
|     case PB_Gui_InputKey_DOWN: | ||||
|         event.key = InputKeyDown; | ||||
|         break; | ||||
|     case PB_Gui_InputKey_RIGHT: | ||||
|         event.key = InputKeyRight; | ||||
|         break; | ||||
|     case PB_Gui_InputKey_LEFT: | ||||
|         event.key = InputKeyLeft; | ||||
|         break; | ||||
|     case PB_Gui_InputKey_OK: | ||||
|         event.key = InputKeyOk; | ||||
|         break; | ||||
|     case PB_Gui_InputKey_BACK: | ||||
|         event.key = InputKeyBack; | ||||
|         break; | ||||
|     default: | ||||
|         // Invalid key
 | ||||
|         invalid = true; | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     switch(request->content.gui_send_input_event_request.type) { | ||||
|     case PB_Gui_InputType_PRESS: | ||||
|         event.type = InputTypePress; | ||||
|         break; | ||||
|     case PB_Gui_InputType_RELEASE: | ||||
|         event.type = InputTypeRelease; | ||||
|         break; | ||||
|     case PB_Gui_InputType_SHORT: | ||||
|         event.type = InputTypeShort; | ||||
|         break; | ||||
|     case PB_Gui_InputType_LONG: | ||||
|         event.type = InputTypeLong; | ||||
|         break; | ||||
|     case PB_Gui_InputType_REPEAT: | ||||
|         event.type = InputTypeRepeat; | ||||
|         break; | ||||
|     default: | ||||
|         // Invalid type
 | ||||
|         invalid = true; | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     if(invalid) { | ||||
|         rpc_send_and_release_empty( | ||||
|             rpc_gui->rpc, request->command_id, PB_CommandStatus_ERROR_INVALID_PARAMETERS); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     FuriPubSub* input_events = furi_record_open("input_events"); | ||||
|     furi_check(input_events); | ||||
|     furi_pubsub_publish(input_events, &event); | ||||
|     furi_record_close("input_events"); | ||||
|     rpc_send_and_release_empty(rpc_gui->rpc, request->command_id, PB_CommandStatus_OK); | ||||
| } | ||||
| 
 | ||||
| void* rpc_system_gui_alloc(Rpc* rpc) { | ||||
|     furi_assert(rpc); | ||||
| 
 | ||||
|     RpcGuiSystem* rpc_gui = furi_alloc(sizeof(RpcGuiSystem)); | ||||
|     rpc_gui->gui = furi_record_open("gui"); | ||||
|     rpc_gui->rpc = rpc; | ||||
| 
 | ||||
|     RpcHandler rpc_handler = { | ||||
|         .message_handler = NULL, | ||||
|         .decode_submessage = NULL, | ||||
|         .context = rpc_gui, | ||||
|     }; | ||||
| 
 | ||||
|     rpc_handler.message_handler = rpc_system_gui_start_screen_stream_process; | ||||
|     rpc_add_handler(rpc, PB_Main_gui_start_screen_stream_request_tag, &rpc_handler); | ||||
| 
 | ||||
|     rpc_handler.message_handler = rpc_system_gui_stop_screen_stream_process; | ||||
|     rpc_add_handler(rpc, PB_Main_gui_stop_screen_stream_request_tag, &rpc_handler); | ||||
| 
 | ||||
|     rpc_handler.message_handler = rpc_system_gui_send_input_event_request_process; | ||||
|     rpc_add_handler(rpc, PB_Main_gui_send_input_event_request_tag, &rpc_handler); | ||||
| 
 | ||||
|     return rpc_gui; | ||||
| } | ||||
| 
 | ||||
| void rpc_system_gui_free(void* ctx) { | ||||
|     furi_assert(ctx); | ||||
|     RpcGuiSystem* rpc_gui = ctx; | ||||
|     furi_assert(rpc_gui->gui); | ||||
|     gui_set_framebuffer_callback(rpc_gui->gui, NULL, NULL); | ||||
|     furi_record_close("gui"); | ||||
|     free(rpc_gui); | ||||
| } | ||||
| @ -1,5 +1,6 @@ | ||||
| #pragma once | ||||
| #include "rpc.h" | ||||
| #include "storage/filesystem-api-defines.h" | ||||
| #include <pb.h> | ||||
| #include <pb_decode.h> | ||||
| #include <pb_encode.h> | ||||
| @ -24,6 +25,10 @@ void* rpc_system_status_alloc(Rpc* rpc); | ||||
| void* rpc_system_storage_alloc(Rpc* rpc); | ||||
| void rpc_system_storage_free(void* ctx); | ||||
| void* rpc_system_app_alloc(Rpc* rpc); | ||||
| void* rpc_system_gui_alloc(Rpc* rpc); | ||||
| void rpc_system_gui_free(void* ctx); | ||||
| 
 | ||||
| void rpc_print_message(const PB_Main* message); | ||||
| void rpc_cli_command_start_session(Cli* cli, string_t args, void* context); | ||||
| 
 | ||||
| PB_CommandStatus rpc_system_storage_get_error(FS_Error fs_error); | ||||
| @ -51,7 +51,7 @@ static void rpc_system_storage_reset_state(RpcStorageSystem* rpc_storage, bool s | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static PB_CommandStatus rpc_system_storage_get_error(FS_Error fs_error) { | ||||
| PB_CommandStatus rpc_system_storage_get_error(FS_Error fs_error) { | ||||
|     PB_CommandStatus pb_error; | ||||
|     switch(fs_error) { | ||||
|     case FSE_OK: | ||||
| @ -96,6 +96,40 @@ static PB_CommandStatus rpc_system_storage_get_file_error(File* file) { | ||||
|     return rpc_system_storage_get_error(storage_file_get_error(file)); | ||||
| } | ||||
| 
 | ||||
| static void rpc_system_storage_stat_process(const PB_Main* request, void* context) { | ||||
|     furi_assert(request); | ||||
|     furi_assert(context); | ||||
|     furi_assert(request->which_content == PB_Main_storage_stat_request_tag); | ||||
| 
 | ||||
|     RpcStorageSystem* rpc_storage = context; | ||||
|     rpc_system_storage_reset_state(rpc_storage, true); | ||||
| 
 | ||||
|     PB_Main* response = furi_alloc(sizeof(PB_Main)); | ||||
|     response->command_id = request->command_id; | ||||
| 
 | ||||
|     Storage* fs_api = furi_record_open("storage"); | ||||
| 
 | ||||
|     const char* path = request->content.storage_stat_request.path; | ||||
|     FileInfo fileinfo; | ||||
|     FS_Error error = storage_common_stat(fs_api, path, &fileinfo); | ||||
| 
 | ||||
|     response->command_status = rpc_system_storage_get_error(error); | ||||
|     response->which_content = PB_Main_empty_tag; | ||||
| 
 | ||||
|     if(error == FSE_OK) { | ||||
|         response->which_content = PB_Main_storage_stat_response_tag; | ||||
|         response->content.storage_stat_response.has_file = true; | ||||
|         response->content.storage_stat_response.file.type = (fileinfo.flags & FSF_DIRECTORY) ? | ||||
|                                                                 PB_Storage_File_FileType_DIR : | ||||
|                                                                 PB_Storage_File_FileType_FILE; | ||||
|         response->content.storage_stat_response.file.size = fileinfo.size; | ||||
|     } | ||||
| 
 | ||||
|     rpc_send_and_release(rpc_storage->rpc, response); | ||||
|     free(response); | ||||
|     furi_record_close("storage"); | ||||
| } | ||||
| 
 | ||||
| static void rpc_system_storage_list_root(const PB_Main* request, void* context) { | ||||
|     RpcStorageSystem* rpc_storage = context; | ||||
|     const char* hard_coded_dirs[] = {"any", "int", "ext"}; | ||||
| @ -140,11 +174,10 @@ static void rpc_system_storage_list_process(const PB_Main* request, void* contex | ||||
|     PB_Main response = { | ||||
|         .command_id = request->command_id, | ||||
|         .has_next = false, | ||||
|         .which_content = PB_Main_storage_list_request_tag, | ||||
|         .which_content = PB_Main_storage_list_response_tag, | ||||
|         .command_status = PB_CommandStatus_OK, | ||||
|     }; | ||||
|     PB_Storage_ListResponse* list = &response.content.storage_list_response; | ||||
|     response.which_content = PB_Main_storage_list_response_tag; | ||||
| 
 | ||||
|     bool finish = false; | ||||
|     int i = 0; | ||||
| @ -434,6 +467,9 @@ void* rpc_system_storage_alloc(Rpc* rpc) { | ||||
|         .context = rpc_storage, | ||||
|     }; | ||||
| 
 | ||||
|     rpc_handler.message_handler = rpc_system_storage_stat_process; | ||||
|     rpc_add_handler(rpc, PB_Main_storage_stat_request_tag, &rpc_handler); | ||||
| 
 | ||||
|     rpc_handler.message_handler = rpc_system_storage_list_process; | ||||
|     rpc_add_handler(rpc, PB_Main_storage_list_request_tag, &rpc_handler); | ||||
| 
 | ||||
|  | ||||
| @ -324,6 +324,11 @@ FS_Error storage_file_get_error(File* file) { | ||||
|     return file->error_id; | ||||
| } | ||||
| 
 | ||||
| int32_t storage_file_get_internal_error(File* file) { | ||||
|     furi_check(file != NULL); | ||||
|     return file->internal_error_id; | ||||
| } | ||||
| 
 | ||||
| const char* storage_file_get_error_desc(File* file) { | ||||
|     furi_check(file != NULL); | ||||
|     return filesystem_api_error_get_desc(file->error_id); | ||||
|  | ||||
| @ -1,8 +1,10 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <furi.h> | ||||
| #include "filesystem-api-internal.h" | ||||
| #include <m-string.h> | ||||
| #include <m-array.h> | ||||
| #include <m-list.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
|  | ||||
| @ -197,6 +197,12 @@ const char* storage_error_get_desc(FS_Error error_id); | ||||
|  */ | ||||
| FS_Error storage_file_get_error(File* file); | ||||
| 
 | ||||
| /** Retrieves the internal (storage-specific) error id from the file object
 | ||||
|  * @param file pointer to file object. Pointer must not point to NULL. YOU CANNOT RETREIVE THE INTERNAL ERROR ID IF THE FILE HAS BEEN CLOSED | ||||
|  * @return FS_Error error id | ||||
|  */ | ||||
| int32_t storage_file_get_internal_error(File* file); | ||||
| 
 | ||||
| /** Retrieves the error text from the file object
 | ||||
|  * @param file pointer to file object. Pointer must not point to NULL. YOU CANNOT RETREIVE THE ERROR TEXT IF THE FILE HAS BEEN CLOSED | ||||
|  * @return const char* error text | ||||
|  | ||||
| @ -119,7 +119,7 @@ static int storage_int_device_erase(const struct lfs_config* c, lfs_block_t bloc | ||||
|     LFSData* lfs_data = c->context; | ||||
|     size_t page = lfs_data->start_page + block; | ||||
| 
 | ||||
|     FURI_LOG_D(TAG, "Device erase: page %d, translated page: %d", block, page); | ||||
|     FURI_LOG_D(TAG, "Device erase: page %d, translated page: %x", block, page); | ||||
| 
 | ||||
|     if(furi_hal_flash_erase(page, 1)) { | ||||
|         return 0; | ||||
|  | ||||
| @ -188,7 +188,8 @@ SubGhz* subghz_alloc() { | ||||
|     string_init(subghz->error_str); | ||||
| 
 | ||||
|     subghz_parser_load_keeloq_file(subghz->txrx->parser, "/ext/subghz/keeloq_mfcodes"); | ||||
|     subghz_parser_load_nice_flor_s_file(subghz->txrx->parser, "/ext/subghz/nice_floor_s_rx"); | ||||
|     subghz_parser_load_keeloq_file(subghz->txrx->parser, "/ext/subghz/keeloq_mfcodes_user"); | ||||
|     subghz_parser_load_nice_flor_s_file(subghz->txrx->parser, "/ext/subghz/nice_flor_s_rx"); | ||||
|     subghz_parser_load_came_atomo_file(subghz->txrx->parser, "/ext/subghz/came_atomo"); | ||||
| 
 | ||||
|     //subghz_parser_enable_dump_text(subghz->protocol, subghz_text_callback, subghz);
 | ||||
|  | ||||
| @ -3,26 +3,16 @@ | ||||
| #include <furi.h> | ||||
| #include <furi-hal.h> | ||||
| #include <stream_buffer.h> | ||||
| 
 | ||||
| #include <lib/toolbox/args.h> | ||||
| #include <lib/subghz/subghz_parser.h> | ||||
| #include <lib/subghz/subghz_keystore.h> | ||||
| #include <lib/subghz/protocols/subghz_protocol_common.h> | ||||
| #include <lib/subghz/protocols/subghz_protocol_princeton.h> | ||||
| 
 | ||||
| #define SUBGHZ_FREQUENCY_RANGE_STR \ | ||||
|     "299999755...348000000 or 386999938...464000000 or 778999847...928000000" | ||||
| 
 | ||||
| void subghz_cli_init() { | ||||
|     Cli* cli = furi_record_open("cli"); | ||||
| 
 | ||||
|     cli_add_command( | ||||
|         cli, "subghz_tx_carrier", CliCommandFlagDefault, subghz_cli_command_tx_carrier, NULL); | ||||
|     cli_add_command( | ||||
|         cli, "subghz_rx_carrier", CliCommandFlagDefault, subghz_cli_command_rx_carrier, NULL); | ||||
|     cli_add_command(cli, "subghz_tx", CliCommandFlagDefault, subghz_cli_command_tx, NULL); | ||||
|     cli_add_command(cli, "subghz_rx", CliCommandFlagDefault, subghz_cli_command_rx, NULL); | ||||
| 
 | ||||
|     furi_record_close("cli"); | ||||
| } | ||||
| 
 | ||||
| void subghz_cli_command_tx_carrier(Cli* cli, string_t args, void* context) { | ||||
|     uint32_t frequency = 433920000; | ||||
| 
 | ||||
| @ -222,7 +212,9 @@ void subghz_cli_command_rx(Cli* cli, string_t args, void* context) { | ||||
| 
 | ||||
|     SubGhzParser* parser = subghz_parser_alloc(); | ||||
|     subghz_parser_load_keeloq_file(parser, "/ext/subghz/keeloq_mfcodes"); | ||||
|     subghz_parser_load_nice_flor_s_file(parser, "/ext/subghz/nice_floor_s_rx"); | ||||
|     subghz_parser_load_keeloq_file(parser, "/ext/subghz/keeloq_mfcodes_user"); | ||||
|     subghz_parser_load_nice_flor_s_file(parser, "/ext/subghz/nice_flor_s_rx"); | ||||
|     subghz_parser_load_came_atomo_file(parser, "/ext/subghz/came_atomo"); | ||||
|     subghz_parser_enable_dump_text(parser, subghz_cli_command_rx_text_callback, instance); | ||||
| 
 | ||||
|     // Configure radio
 | ||||
| @ -267,3 +259,131 @@ void subghz_cli_command_rx(Cli* cli, string_t args, void* context) { | ||||
|     vStreamBufferDelete(instance->stream); | ||||
|     free(instance); | ||||
| } | ||||
| 
 | ||||
| void subghz_cli_command_print_usage() { | ||||
|     printf("Usage:\r\n"); | ||||
|     printf("subghz <cmd> <args>\r\n"); | ||||
|     printf("Cmd list:\r\n"); | ||||
|     printf( | ||||
|         "\tencrypt_keeloq <path_decrypted_file> <path_encrypted_file> <IV:16 bytes in hex>\t - Encrypt keeloq manufacture keys\r\n"); | ||||
|     printf( | ||||
|         "\tencrypt_raw <path_decrypted_file> <path_encrypted_file> <IV:16 bytes in hex>\t - Encrypt RAW data\r\n"); | ||||
| } | ||||
| 
 | ||||
| void subghz_cli_command_encrypt_keeloq(Cli* cli, string_t args) { | ||||
|     uint8_t iv[16]; | ||||
| 
 | ||||
|     string_t source; | ||||
|     string_t destination; | ||||
|     string_init(source); | ||||
|     string_init(destination); | ||||
| 
 | ||||
|     SubGhzKeystore* keystore = subghz_keystore_alloc(); | ||||
| 
 | ||||
|     do { | ||||
|         if(!args_read_string_and_trim(args, source)) { | ||||
|             subghz_cli_command_print_usage(); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(!args_read_string_and_trim(args, destination)) { | ||||
|             subghz_cli_command_print_usage(); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(!args_read_hex_bytes(args, iv, 16)) { | ||||
|             subghz_cli_command_print_usage(); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(!subghz_keystore_load(keystore, string_get_cstr(source))) { | ||||
|             printf("Failed to load Keystore"); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(!subghz_keystore_save(keystore, string_get_cstr(destination), iv)) { | ||||
|             printf("Failed to save Keystore"); | ||||
|             break; | ||||
|         } | ||||
|     } while(false); | ||||
| 
 | ||||
|     subghz_keystore_free(keystore); | ||||
|     string_clear(destination); | ||||
|     string_clear(source); | ||||
| } | ||||
| 
 | ||||
| void subghz_cli_command_encrypt_raw(Cli* cli, string_t args) { | ||||
|     uint8_t iv[16]; | ||||
| 
 | ||||
|     string_t source; | ||||
|     string_t destination; | ||||
|     string_init(source); | ||||
|     string_init(destination); | ||||
| 
 | ||||
|     do { | ||||
|         if(!args_read_string_and_trim(args, source)) { | ||||
|             subghz_cli_command_print_usage(); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(!args_read_string_and_trim(args, destination)) { | ||||
|             subghz_cli_command_print_usage(); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(!args_read_hex_bytes(args, iv, 16)) { | ||||
|             subghz_cli_command_print_usage(); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(!subghz_keystore_raw_encrypted_save( | ||||
|                string_get_cstr(source), string_get_cstr(destination), iv)) { | ||||
|             printf("Failed to save Keystore"); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|     } while(false); | ||||
| 
 | ||||
|     string_clear(destination); | ||||
|     string_clear(source); | ||||
| } | ||||
| 
 | ||||
| void subghz_cli_command(Cli* cli, string_t args, void* context) { | ||||
|     string_t cmd; | ||||
|     string_init(cmd); | ||||
| 
 | ||||
|     do { | ||||
|         if(!args_read_string_and_trim(args, cmd)) { | ||||
|             subghz_cli_command_print_usage(); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(string_cmp_str(cmd, "encrypt_keeloq") == 0) { | ||||
|             subghz_cli_command_encrypt_keeloq(cli, args); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         if(string_cmp_str(cmd, "encrypt_raw") == 0) { | ||||
|             subghz_cli_command_encrypt_raw(cli, args); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         subghz_cli_command_print_usage(); | ||||
|     } while(false); | ||||
| 
 | ||||
|     string_clear(cmd); | ||||
| } | ||||
| 
 | ||||
| void subghz_cli_init() { | ||||
|     Cli* cli = furi_record_open("cli"); | ||||
| 
 | ||||
|     cli_add_command( | ||||
|         cli, "subghz_tx_carrier", CliCommandFlagDefault, subghz_cli_command_tx_carrier, NULL); | ||||
|     cli_add_command( | ||||
|         cli, "subghz_rx_carrier", CliCommandFlagDefault, subghz_cli_command_rx_carrier, NULL); | ||||
|     cli_add_command(cli, "subghz_tx", CliCommandFlagDefault, subghz_cli_command_tx, NULL); | ||||
|     cli_add_command(cli, "subghz_rx", CliCommandFlagDefault, subghz_cli_command_rx, NULL); | ||||
|     cli_add_command(cli, "subghz", CliCommandFlagDefault, subghz_cli_command, NULL); | ||||
| 
 | ||||
|     furi_record_close("cli"); | ||||
| } | ||||
|  | ||||
| @ -3,15 +3,3 @@ | ||||
| #include <cli/cli.h> | ||||
| 
 | ||||
| void subghz_cli_init(); | ||||
| 
 | ||||
| void subghz_cli_command_tx_carrier(Cli* cli, string_t args, void* context); | ||||
| 
 | ||||
| void subghz_cli_command_rx_carrier(Cli* cli, string_t args, void* context); | ||||
| 
 | ||||
| void subghz_cli_command_tx_pt(Cli* cli, string_t args, void* context); | ||||
| 
 | ||||
| void subghz_cli_command_rx_pt(Cli* cli, string_t args, void* context); | ||||
| 
 | ||||
| void subghz_cli_command_tx(Cli* cli, string_t args, void* context); | ||||
| 
 | ||||
| void subghz_cli_command_rx(Cli* cli, string_t args, void* context); | ||||
|  | ||||
							
								
								
									
										500
									
								
								applications/tests/flipper_file/flipper_file_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										500
									
								
								applications/tests/flipper_file/flipper_file_test.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,500 @@ | ||||
| #include <furi.h> | ||||
| #include <flipper_file/flipper_file.h> | ||||
| #include "../minunit.h" | ||||
| 
 | ||||
| #define TEST_DIR TEST_DIR_NAME "/" | ||||
| #define TEST_DIR_NAME "/ext/unit_tests_tmp" | ||||
| 
 | ||||
| static const char* test_filetype = "Flipper File test"; | ||||
| static const uint32_t test_version = 666; | ||||
| 
 | ||||
| static const char* test_string_key = "String data"; | ||||
| static const char* test_string_data = "String"; | ||||
| static const char* test_string_updated_data = "New string"; | ||||
| 
 | ||||
| static const char* test_int_key = "Int32 data"; | ||||
| static const int32_t test_int_data[] = {1234, -6345, 7813, 0}; | ||||
| static const int32_t test_int_updated_data[] = {-1337, 69}; | ||||
| 
 | ||||
| static const char* test_uint_key = "Uint32 data"; | ||||
| static const uint32_t test_uint_data[] = {1234, 0, 5678, 9098, 7654321}; | ||||
| static const uint32_t test_uint_updated_data[] = {8, 800, 555, 35, 35}; | ||||
| 
 | ||||
| static const char* test_float_key = "Float data"; | ||||
| static const float test_float_data[] = {1.5f, 1000.0f}; | ||||
| static const float test_float_updated_data[] = {1.2f}; | ||||
| 
 | ||||
| static const char* test_hex_key = "Hex data"; | ||||
| static const uint8_t test_hex_data[] = {0xDE, 0xAD, 0xBE}; | ||||
| static const uint8_t test_hex_updated_data[] = {0xFE, 0xCA}; | ||||
| 
 | ||||
| #define READ_TEST_WIN "ff_win.test" | ||||
| static const char* test_data_win = "Filetype: Flipper File test\n" | ||||
|                                    "Version: 666\n" | ||||
|                                    "# This is comment\n" | ||||
|                                    "String data: String\n" | ||||
|                                    "Int32 data: 1234 -6345 7813 0\n" | ||||
|                                    "Uint32 data: 1234 0 5678 9098 7654321\n" | ||||
|                                    "Float data: 1.5 1000.0\n" | ||||
|                                    "Hex data: DE AD BE"; | ||||
| 
 | ||||
| #define READ_TEST_NIX "ff_nix.test" | ||||
| static const char* test_data_nix = "Filetype: Flipper File test\r\n" | ||||
|                                    "Version: 666\r\n" | ||||
|                                    "# This is comment\r\n" | ||||
|                                    "String data: String\r\n" | ||||
|                                    "Int32 data: 1234 -6345 7813 0\r\n" | ||||
|                                    "Uint32 data: 1234 0 5678 9098 7654321\r\n" | ||||
|                                    "Float data: 1.5 1000.0\r\n" | ||||
|                                    "Hex data: DE AD BE"; | ||||
| 
 | ||||
| #define READ_TEST_FLP "ff_flp.test" | ||||
| 
 | ||||
| // data created by user on linux machine
 | ||||
| const char* test_file_linux = TEST_DIR READ_TEST_WIN; | ||||
| // data created by user on windows machine
 | ||||
| const char* test_file_windows = TEST_DIR READ_TEST_NIX; | ||||
| // data created by flipper itself
 | ||||
| const char* test_file_flipper = TEST_DIR READ_TEST_FLP; | ||||
| 
 | ||||
| static bool storage_write_string(const char* path, const char* data) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     File* file = storage_file_alloc(storage); | ||||
|     bool result = false; | ||||
| 
 | ||||
|     do { | ||||
|         if(!storage_file_open(file, path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) break; | ||||
|         if(storage_file_write(file, data, strlen(data)) != strlen(data)) break; | ||||
| 
 | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     storage_file_close(file); | ||||
|     storage_file_free(file); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static void tests_setup() { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data"); | ||||
|     mu_assert(storage_simply_mkdir(storage, TEST_DIR_NAME), "Cannot create dir"); | ||||
|     furi_record_close("storage"); | ||||
| } | ||||
| 
 | ||||
| static void tests_teardown() { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data"); | ||||
|     furi_record_close("storage"); | ||||
| } | ||||
| 
 | ||||
| static bool test_read(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
| 
 | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
|     string_t string_value; | ||||
|     string_init(string_value); | ||||
|     uint32_t uint32_value; | ||||
|     void* scratchpad = malloc(512); | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_existing(file, file_name)) break; | ||||
| 
 | ||||
|         if(!flipper_file_read_header(file, string_value, &uint32_value)) break; | ||||
|         if(string_cmp_str(string_value, test_filetype) != 0) break; | ||||
|         if(uint32_value != test_version) break; | ||||
| 
 | ||||
|         if(!flipper_file_read_string(file, test_string_key, string_value)) break; | ||||
|         if(string_cmp_str(string_value, test_string_data) != 0) break; | ||||
| 
 | ||||
|         if(!flipper_file_get_value_count(file, test_int_key, &uint32_value)) break; | ||||
|         if(uint32_value != COUNT_OF(test_int_data)) break; | ||||
|         if(!flipper_file_read_int32(file, test_int_key, scratchpad, uint32_value)) break; | ||||
|         if(memcmp(scratchpad, test_int_data, sizeof(int32_t) * COUNT_OF(test_int_data)) != 0) | ||||
|             break; | ||||
| 
 | ||||
|         if(!flipper_file_get_value_count(file, test_uint_key, &uint32_value)) break; | ||||
|         if(uint32_value != COUNT_OF(test_uint_data)) break; | ||||
|         if(!flipper_file_read_uint32(file, test_uint_key, scratchpad, uint32_value)) break; | ||||
|         if(memcmp(scratchpad, test_uint_data, sizeof(uint32_t) * COUNT_OF(test_uint_data)) != 0) | ||||
|             break; | ||||
| 
 | ||||
|         if(!flipper_file_get_value_count(file, test_float_key, &uint32_value)) break; | ||||
|         if(uint32_value != COUNT_OF(test_float_data)) break; | ||||
|         if(!flipper_file_read_float(file, test_float_key, scratchpad, uint32_value)) break; | ||||
|         if(memcmp(scratchpad, test_float_data, sizeof(float) * COUNT_OF(test_float_data)) != 0) | ||||
|             break; | ||||
| 
 | ||||
|         if(!flipper_file_get_value_count(file, test_hex_key, &uint32_value)) break; | ||||
|         if(uint32_value != COUNT_OF(test_hex_data)) break; | ||||
|         if(!flipper_file_read_hex(file, test_hex_key, scratchpad, uint32_value)) break; | ||||
|         if(memcmp(scratchpad, test_hex_data, sizeof(uint8_t) * COUNT_OF(test_hex_data)) != 0) | ||||
|             break; | ||||
| 
 | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     free(scratchpad); | ||||
|     string_clear(string_value); | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
| 
 | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static bool test_read_updated(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
| 
 | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
|     string_t string_value; | ||||
|     string_init(string_value); | ||||
|     uint32_t uint32_value; | ||||
|     void* scratchpad = malloc(512); | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_existing(file, file_name)) break; | ||||
| 
 | ||||
|         if(!flipper_file_read_header(file, string_value, &uint32_value)) break; | ||||
|         if(string_cmp_str(string_value, test_filetype) != 0) break; | ||||
|         if(uint32_value != test_version) break; | ||||
| 
 | ||||
|         if(!flipper_file_read_string(file, test_string_key, string_value)) break; | ||||
|         if(string_cmp_str(string_value, test_string_updated_data) != 0) break; | ||||
| 
 | ||||
|         if(!flipper_file_get_value_count(file, test_int_key, &uint32_value)) break; | ||||
|         if(uint32_value != COUNT_OF(test_int_updated_data)) break; | ||||
|         if(!flipper_file_read_int32(file, test_int_key, scratchpad, uint32_value)) break; | ||||
|         if(memcmp( | ||||
|                scratchpad, | ||||
|                test_int_updated_data, | ||||
|                sizeof(int32_t) * COUNT_OF(test_int_updated_data)) != 0) | ||||
|             break; | ||||
| 
 | ||||
|         if(!flipper_file_get_value_count(file, test_uint_key, &uint32_value)) break; | ||||
|         if(uint32_value != COUNT_OF(test_uint_updated_data)) break; | ||||
|         if(!flipper_file_read_uint32(file, test_uint_key, scratchpad, uint32_value)) break; | ||||
|         if(memcmp( | ||||
|                scratchpad, | ||||
|                test_uint_updated_data, | ||||
|                sizeof(uint32_t) * COUNT_OF(test_uint_updated_data)) != 0) | ||||
|             break; | ||||
| 
 | ||||
|         if(!flipper_file_get_value_count(file, test_float_key, &uint32_value)) break; | ||||
|         if(uint32_value != COUNT_OF(test_float_updated_data)) break; | ||||
|         if(!flipper_file_read_float(file, test_float_key, scratchpad, uint32_value)) break; | ||||
|         if(memcmp( | ||||
|                scratchpad, | ||||
|                test_float_updated_data, | ||||
|                sizeof(float) * COUNT_OF(test_float_updated_data)) != 0) | ||||
|             break; | ||||
| 
 | ||||
|         if(!flipper_file_get_value_count(file, test_hex_key, &uint32_value)) break; | ||||
|         if(uint32_value != COUNT_OF(test_hex_updated_data)) break; | ||||
|         if(!flipper_file_read_hex(file, test_hex_key, scratchpad, uint32_value)) break; | ||||
|         if(memcmp( | ||||
|                scratchpad, | ||||
|                test_hex_updated_data, | ||||
|                sizeof(uint8_t) * COUNT_OF(test_hex_updated_data)) != 0) | ||||
|             break; | ||||
| 
 | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     free(scratchpad); | ||||
|     string_clear(string_value); | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
| 
 | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static bool test_write(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_always(file, file_name)) break; | ||||
|         if(!flipper_file_write_header_cstr(file, test_filetype, test_version)) break; | ||||
|         if(!flipper_file_write_comment_cstr(file, "This is comment")) break; | ||||
|         if(!flipper_file_write_string_cstr(file, test_string_key, test_string_data)) break; | ||||
|         if(!flipper_file_write_int32(file, test_int_key, test_int_data, COUNT_OF(test_int_data))) | ||||
|             break; | ||||
|         if(!flipper_file_write_uint32( | ||||
|                file, test_uint_key, test_uint_data, COUNT_OF(test_uint_data))) | ||||
|             break; | ||||
|         if(!flipper_file_write_float( | ||||
|                file, test_float_key, test_float_data, COUNT_OF(test_float_data))) | ||||
|             break; | ||||
|         if(!flipper_file_write_hex(file, test_hex_key, test_hex_data, COUNT_OF(test_hex_data))) | ||||
|             break; | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static bool test_delete_last_key(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_existing(file, file_name)) break; | ||||
|         if(!flipper_file_delete_key(file, test_hex_key)) break; | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static bool test_append_key(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_append(file, file_name)) break; | ||||
|         if(!flipper_file_write_hex(file, test_hex_key, test_hex_data, COUNT_OF(test_hex_data))) | ||||
|             break; | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static bool test_update(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_existing(file, file_name)) break; | ||||
|         if(!flipper_file_update_string_cstr(file, test_string_key, test_string_updated_data)) | ||||
|             break; | ||||
|         if(!flipper_file_update_int32( | ||||
|                file, test_int_key, test_int_updated_data, COUNT_OF(test_int_updated_data))) | ||||
|             break; | ||||
|         if(!flipper_file_update_uint32( | ||||
|                file, test_uint_key, test_uint_updated_data, COUNT_OF(test_uint_updated_data))) | ||||
|             break; | ||||
|         if(!flipper_file_update_float( | ||||
|                file, test_float_key, test_float_updated_data, COUNT_OF(test_float_updated_data))) | ||||
|             break; | ||||
|         if(!flipper_file_update_hex( | ||||
|                file, test_hex_key, test_hex_updated_data, COUNT_OF(test_hex_updated_data))) | ||||
|             break; | ||||
| 
 | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static bool test_update_backward(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_existing(file, file_name)) break; | ||||
|         if(!flipper_file_update_string_cstr(file, test_string_key, test_string_data)) break; | ||||
|         if(!flipper_file_update_int32(file, test_int_key, test_int_data, COUNT_OF(test_int_data))) | ||||
|             break; | ||||
|         if(!flipper_file_update_uint32( | ||||
|                file, test_uint_key, test_uint_data, COUNT_OF(test_uint_data))) | ||||
|             break; | ||||
|         if(!flipper_file_update_float( | ||||
|                file, test_float_key, test_float_data, COUNT_OF(test_float_data))) | ||||
|             break; | ||||
|         if(!flipper_file_update_hex(file, test_hex_key, test_hex_data, COUNT_OF(test_hex_data))) | ||||
|             break; | ||||
| 
 | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static bool test_write_multikey(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_always(file, file_name)) break; | ||||
|         if(!flipper_file_write_header_cstr(file, test_filetype, test_version)) break; | ||||
| 
 | ||||
|         bool error = false; | ||||
|         for(uint8_t index = 0; index < 100; index++) { | ||||
|             if(!flipper_file_write_hex(file, test_hex_key, &index, 1)) { | ||||
|                 error = true; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         if(error) break; | ||||
| 
 | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static bool test_read_multikey(const char* file_name) { | ||||
|     Storage* storage = furi_record_open("storage"); | ||||
|     bool result = false; | ||||
|     FlipperFile* file = flipper_file_alloc(storage); | ||||
| 
 | ||||
|     string_t string_value; | ||||
|     string_init(string_value); | ||||
|     uint32_t uint32_value; | ||||
| 
 | ||||
|     do { | ||||
|         if(!flipper_file_open_existing(file, file_name)) break; | ||||
|         if(!flipper_file_read_header(file, string_value, &uint32_value)) break; | ||||
|         if(string_cmp_str(string_value, test_filetype) != 0) break; | ||||
|         if(uint32_value != test_version) break; | ||||
| 
 | ||||
|         bool error = false; | ||||
|         uint8_t uint8_value; | ||||
|         for(uint8_t index = 0; index < 100; index++) { | ||||
|             if(!flipper_file_read_hex(file, test_hex_key, &uint8_value, 1)) { | ||||
|                 error = true; | ||||
|                 break; | ||||
|             } | ||||
| 
 | ||||
|             if(uint8_value != index) { | ||||
|                 error = true; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         if(error) break; | ||||
| 
 | ||||
|         result = true; | ||||
|     } while(false); | ||||
| 
 | ||||
|     string_clear(string_value); | ||||
|     flipper_file_close(file); | ||||
|     flipper_file_free(file); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_write_test) { | ||||
|     mu_assert(storage_write_string(test_file_linux, test_data_nix), "Write test error [Linux]"); | ||||
|     mu_assert( | ||||
|         storage_write_string(test_file_windows, test_data_win), "Write test error [Windows]"); | ||||
|     mu_assert(test_write(test_file_flipper), "Write test error [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_read_test) { | ||||
|     mu_assert(test_read(test_file_linux), "Read test error [Linux]"); | ||||
|     mu_assert(test_read(test_file_windows), "Read test error [Windows]"); | ||||
|     mu_assert(test_read(test_file_flipper), "Read test error [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_delete_test) { | ||||
|     mu_assert(test_delete_last_key(test_file_linux), "Cannot delete key [Linux]"); | ||||
|     mu_assert(test_delete_last_key(test_file_windows), "Cannot delete key [Windows]"); | ||||
|     mu_assert(test_delete_last_key(test_file_flipper), "Cannot delete key [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_delete_result_test) { | ||||
|     mu_assert(!test_read(test_file_linux), "Key deleted incorrectly [Linux]"); | ||||
|     mu_assert(!test_read(test_file_windows), "Key deleted incorrectly [Windows]"); | ||||
|     mu_assert(!test_read(test_file_flipper), "Key deleted incorrectly [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_append_test) { | ||||
|     mu_assert(test_append_key(test_file_linux), "Cannot append data [Linux]"); | ||||
|     mu_assert(test_append_key(test_file_windows), "Cannot append data [Windows]"); | ||||
|     mu_assert(test_append_key(test_file_flipper), "Cannot append data [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_append_result_test) { | ||||
|     mu_assert(test_read(test_file_linux), "Data appended incorrectly [Linux]"); | ||||
|     mu_assert(test_read(test_file_windows), "Data appended incorrectly [Windows]"); | ||||
|     mu_assert(test_read(test_file_flipper), "Data appended incorrectly [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_update_1_test) { | ||||
|     mu_assert(test_update(test_file_linux), "Cannot update data #1 [Linux]"); | ||||
|     mu_assert(test_update(test_file_windows), "Cannot update data #1 [Windows]"); | ||||
|     mu_assert(test_update(test_file_flipper), "Cannot update data #1 [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_update_1_result_test) { | ||||
|     mu_assert(test_read_updated(test_file_linux), "Data #1 updated incorrectly [Linux]"); | ||||
|     mu_assert(test_read_updated(test_file_windows), "Data #1 updated incorrectly [Windows]"); | ||||
|     mu_assert(test_read_updated(test_file_flipper), "Data #1 updated incorrectly [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_update_2_test) { | ||||
|     mu_assert(test_update_backward(test_file_linux), "Cannot update data #2 [Linux]"); | ||||
|     mu_assert(test_update_backward(test_file_windows), "Cannot update data #2 [Windows]"); | ||||
|     mu_assert(test_update_backward(test_file_flipper), "Cannot update data #2 [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_update_2_result_test) { | ||||
|     mu_assert(test_read(test_file_linux), "Data #2 updated incorrectly [Linux]"); | ||||
|     mu_assert(test_read(test_file_windows), "Data #2 updated incorrectly [Windows]"); | ||||
|     mu_assert(test_read(test_file_flipper), "Data #2 updated incorrectly [Flipper]"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(flipper_file_multikey_test) { | ||||
|     mu_assert(test_write_multikey(TEST_DIR "ff_multiline.test"), "Multikey write test error"); | ||||
|     mu_assert(test_read_multikey(TEST_DIR "ff_multiline.test"), "Multikey read test error"); | ||||
| } | ||||
| 
 | ||||
| MU_TEST_SUITE(flipper_file) { | ||||
|     tests_setup(); | ||||
|     MU_RUN_TEST(flipper_file_write_test); | ||||
|     MU_RUN_TEST(flipper_file_read_test); | ||||
|     MU_RUN_TEST(flipper_file_delete_test); | ||||
|     MU_RUN_TEST(flipper_file_delete_result_test); | ||||
|     MU_RUN_TEST(flipper_file_append_test); | ||||
|     MU_RUN_TEST(flipper_file_append_result_test); | ||||
|     MU_RUN_TEST(flipper_file_update_1_test); | ||||
|     MU_RUN_TEST(flipper_file_update_1_result_test); | ||||
|     MU_RUN_TEST(flipper_file_update_2_test); | ||||
|     MU_RUN_TEST(flipper_file_update_2_result_test); | ||||
|     MU_RUN_TEST(flipper_file_multikey_test); | ||||
|     tests_teardown(); | ||||
| } | ||||
| 
 | ||||
| int run_minunit_test_flipper_file() { | ||||
|     MU_RUN_SUITE(flipper_file); | ||||
|     return MU_EXIT_CODE; | ||||
| } | ||||
| @ -16,39 +16,30 @@ void test_pubsub_handler(const void* arg, void* ctx) { | ||||
| } | ||||
| 
 | ||||
| void test_furi_pubsub() { | ||||
|     bool result; | ||||
|     PubSub test_pubsub; | ||||
|     PubSubItem* test_pubsub_item; | ||||
|     FuriPubSub* test_pubsub = NULL; | ||||
|     FuriPubSubSubscription* test_pubsub_subscription = NULL; | ||||
| 
 | ||||
|     // init pubsub case
 | ||||
|     result = init_pubsub(&test_pubsub); | ||||
|     mu_assert(result, "init pubsub failed"); | ||||
|     test_pubsub = furi_pubsub_alloc(); | ||||
|     mu_assert_pointers_not_eq(test_pubsub, NULL); | ||||
| 
 | ||||
|     // subscribe pubsub case
 | ||||
|     test_pubsub_item = subscribe_pubsub(&test_pubsub, test_pubsub_handler, (void*)&context_value); | ||||
|     mu_assert_pointers_not_eq(test_pubsub_item, NULL); | ||||
|     test_pubsub_subscription = | ||||
|         furi_pubsub_subscribe(test_pubsub, test_pubsub_handler, (void*)&context_value); | ||||
|     mu_assert_pointers_not_eq(test_pubsub_subscription, NULL); | ||||
| 
 | ||||
|     /// notify pubsub case
 | ||||
|     result = notify_pubsub(&test_pubsub, (void*)¬ify_value_0); | ||||
|     mu_assert(result, "notify pubsub failed"); | ||||
|     furi_pubsub_publish(test_pubsub, (void*)¬ify_value_0); | ||||
|     mu_assert_int_eq(pubsub_value, notify_value_0); | ||||
|     mu_assert_int_eq(pubsub_context_value, context_value); | ||||
| 
 | ||||
|     // unsubscribe pubsub case
 | ||||
|     result = unsubscribe_pubsub(test_pubsub_item); | ||||
|     mu_assert(result, "unsubscribe pubsub failed"); | ||||
| 
 | ||||
|     result = unsubscribe_pubsub(test_pubsub_item); | ||||
|     mu_assert(!result, "unsubscribe pubsub not failed"); | ||||
|     furi_pubsub_unsubscribe(test_pubsub, test_pubsub_subscription); | ||||
| 
 | ||||
|     /// notify unsubscribed pubsub case
 | ||||
|     result = notify_pubsub(&test_pubsub, (void*)¬ify_value_1); | ||||
|     mu_assert(result, "notify pubsub failed"); | ||||
|     furi_pubsub_publish(test_pubsub, (void*)¬ify_value_1); | ||||
|     mu_assert_int_not_eq(pubsub_value, notify_value_1); | ||||
| 
 | ||||
|     // delete pubsub case
 | ||||
|     result = delete_pubsub(&test_pubsub); | ||||
|     mu_assert(result, "unsubscribe pubsub failed"); | ||||
| 
 | ||||
|     // TODO test case that the pubsub_delete will remove pubsub from heap
 | ||||
|     furi_pubsub_free(test_pubsub); | ||||
| } | ||||
| @ -218,6 +218,9 @@ static void test_rpc_create_simple_message( | ||||
|     message->which_content = tag; | ||||
|     message->has_next = false; | ||||
|     switch(tag) { | ||||
|     case PB_Main_storage_stat_request_tag: | ||||
|         message->content.storage_stat_request.path = str_copy; | ||||
|         break; | ||||
|     case PB_Main_storage_list_request_tag: | ||||
|         message->content.storage_list_request.path = str_copy; | ||||
|         break; | ||||
| @ -369,6 +372,19 @@ static void test_rpc_compare_messages(PB_Main* result, PB_Main* expected) { | ||||
|         mu_check(result_locked == expected_locked); | ||||
|         break; | ||||
|     } | ||||
|     case PB_Main_storage_stat_response_tag: { | ||||
|         bool result_has_msg_file = result->content.storage_stat_response.has_file; | ||||
|         bool expected_has_msg_file = expected->content.storage_stat_response.has_file; | ||||
|         mu_check(result_has_msg_file == expected_has_msg_file); | ||||
| 
 | ||||
|         if(result_has_msg_file) { | ||||
|             PB_Storage_File* result_msg_file = &result->content.storage_stat_response.file; | ||||
|             PB_Storage_File* expected_msg_file = &expected->content.storage_stat_response.file; | ||||
|             test_rpc_compare_file(result_msg_file, expected_msg_file); | ||||
|         } else { | ||||
|             mu_check(0); | ||||
|         } | ||||
|     } break; | ||||
|     case PB_Main_storage_read_response_tag: { | ||||
|         bool result_has_msg_file = result->content.storage_read_response.has_file; | ||||
|         bool expected_has_msg_file = expected->content.storage_read_response.has_file; | ||||
| @ -455,11 +471,10 @@ static void test_rpc_storage_list_create_expected_list( | ||||
|     PB_Main response = { | ||||
|         .command_id = command_id, | ||||
|         .has_next = false, | ||||
|         .which_content = PB_Main_storage_list_request_tag, | ||||
|         .which_content = PB_Main_storage_list_response_tag, | ||||
|         /* other fields (e.g. msg_files ptrs) explicitly initialized by 0 */ | ||||
|     }; | ||||
|     PB_Storage_ListResponse* list = &response.content.storage_list_response; | ||||
|     response.which_content = PB_Main_storage_list_response_tag; | ||||
| 
 | ||||
|     bool finish = false; | ||||
|     int i = 0; | ||||
| @ -649,9 +664,8 @@ static bool test_is_exists(const char* path) { | ||||
|     Storage* fs_api = furi_record_open("storage"); | ||||
|     FileInfo fileinfo; | ||||
|     FS_Error result = storage_common_stat(fs_api, path, &fileinfo); | ||||
| 
 | ||||
|     furi_check((result == FSE_OK) || (result == FSE_NOT_EXIST)); | ||||
| 
 | ||||
|     furi_record_close("storage"); | ||||
|     return result == FSE_OK; | ||||
| } | ||||
| 
 | ||||
| @ -687,6 +701,59 @@ static void test_create_file(const char* path, size_t size) { | ||||
|     furi_check(test_is_exists(path)); | ||||
| } | ||||
| 
 | ||||
| static void test_rpc_storage_stat_run(const char* path, uint32_t command_id) { | ||||
|     PB_Main request; | ||||
|     MsgList_t expected_msg_list; | ||||
|     MsgList_init(expected_msg_list); | ||||
| 
 | ||||
|     test_rpc_create_simple_message(&request, PB_Main_storage_stat_request_tag, path, command_id); | ||||
| 
 | ||||
|     Storage* fs_api = furi_record_open("storage"); | ||||
|     FileInfo fileinfo; | ||||
|     FS_Error error = storage_common_stat(fs_api, path, &fileinfo); | ||||
|     furi_record_close("storage"); | ||||
| 
 | ||||
|     PB_Main* response = MsgList_push_new(expected_msg_list); | ||||
|     response->command_id = command_id; | ||||
|     response->command_status = rpc_system_storage_get_error(error); | ||||
|     response->has_next = false; | ||||
|     response->which_content = PB_Main_empty_tag; | ||||
| 
 | ||||
|     if(error == FSE_OK) { | ||||
|         response->which_content = PB_Main_storage_stat_response_tag; | ||||
|         response->content.storage_stat_response.has_file = true; | ||||
|         response->content.storage_stat_response.file.type = (fileinfo.flags & FSF_DIRECTORY) ? | ||||
|                                                                 PB_Storage_File_FileType_DIR : | ||||
|                                                                 PB_Storage_File_FileType_FILE; | ||||
|         response->content.storage_stat_response.file.size = fileinfo.size; | ||||
|     } | ||||
| 
 | ||||
|     test_rpc_encode_and_feed_one(&request); | ||||
|     test_rpc_decode_and_compare(expected_msg_list); | ||||
| 
 | ||||
|     pb_release(&PB_Main_msg, &request); | ||||
|     test_rpc_free_msg_list(expected_msg_list); | ||||
| } | ||||
| 
 | ||||
| #define TEST_DIR_STAT_NAME TEST_DIR "stat_dir" | ||||
| #define TEST_DIR_STAT TEST_DIR_STAT_NAME "/" | ||||
| MU_TEST(test_storage_stat) { | ||||
|     test_create_dir(TEST_DIR_STAT_NAME); | ||||
|     test_create_file(TEST_DIR_STAT "empty.txt", 0); | ||||
|     test_create_file(TEST_DIR_STAT "l33t.txt", 1337); | ||||
| 
 | ||||
|     test_rpc_storage_stat_run("/", ++command_id); | ||||
|     test_rpc_storage_stat_run("/int", ++command_id); | ||||
|     test_rpc_storage_stat_run("/ext", ++command_id); | ||||
| 
 | ||||
|     test_rpc_storage_stat_run(TEST_DIR_STAT "empty.txt", ++command_id); | ||||
|     test_rpc_storage_stat_run(TEST_DIR_STAT "l33t.txt", ++command_id); | ||||
|     test_rpc_storage_stat_run(TEST_DIR_STAT "missing", ++command_id); | ||||
|     test_rpc_storage_stat_run(TEST_DIR_STAT_NAME, ++command_id); | ||||
| 
 | ||||
|     test_rpc_storage_stat_run(TEST_DIR_STAT, ++command_id); | ||||
| } | ||||
| 
 | ||||
| MU_TEST(test_storage_read) { | ||||
|     test_create_file(TEST_DIR "empty.txt", 0); | ||||
|     test_create_file(TEST_DIR "file1.txt", 1); | ||||
| @ -1138,6 +1205,7 @@ MU_TEST_SUITE(test_rpc_status) { | ||||
| MU_TEST_SUITE(test_rpc_storage) { | ||||
|     MU_SUITE_CONFIGURE(&test_rpc_storage_setup, &test_rpc_storage_teardown); | ||||
| 
 | ||||
|     MU_RUN_TEST(test_storage_stat); | ||||
|     MU_RUN_TEST(test_storage_list); | ||||
|     MU_RUN_TEST(test_storage_read); | ||||
|     MU_RUN_TEST(test_storage_write_read); | ||||
| @ -1158,23 +1226,23 @@ static void test_app_create_request( | ||||
|     request->command_id = command_id; | ||||
|     request->command_status = PB_CommandStatus_OK; | ||||
|     request->cb_content.funcs.encode = NULL; | ||||
|     request->which_content = PB_Main_app_start_tag; | ||||
|     request->which_content = PB_Main_app_start_request_tag; | ||||
|     request->has_next = false; | ||||
| 
 | ||||
|     if(app_name) { | ||||
|         char* msg_app_name = furi_alloc(strlen(app_name) + 1); | ||||
|         strcpy(msg_app_name, app_name); | ||||
|         request->content.app_start.name = msg_app_name; | ||||
|         request->content.app_start_request.name = msg_app_name; | ||||
|     } else { | ||||
|         request->content.app_start.name = NULL; | ||||
|         request->content.app_start_request.name = NULL; | ||||
|     } | ||||
| 
 | ||||
|     if(app_args) { | ||||
|         char* msg_app_args = furi_alloc(strlen(app_args) + 1); | ||||
|         strcpy(msg_app_args, app_args); | ||||
|         request->content.app_start.args = msg_app_args; | ||||
|         request->content.app_start_request.args = msg_app_args; | ||||
|     } else { | ||||
|         request->content.app_start.args = NULL; | ||||
|         request->content.app_start_request.args = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| #include "m-string.h" | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <furi.h> | ||||
| #include <furi-hal.h> | ||||
| @ -12,6 +13,7 @@ | ||||
| int run_minunit(); | ||||
| int run_minunit_test_irda_decoder_encoder(); | ||||
| int run_minunit_test_rpc(); | ||||
| int run_minunit_test_flipper_file(); | ||||
| 
 | ||||
| void minunit_print_progress(void) { | ||||
|     static char progress[] = {'\\', '|', '/', '-'}; | ||||
| @ -36,11 +38,9 @@ void unit_tests_cli(Cli* cli, string_t args, void* context) { | ||||
|     minunit_status = 0; | ||||
| 
 | ||||
|     Loader* loader = furi_record_open("loader"); | ||||
|     furi_record_close("loader"); | ||||
| 
 | ||||
|     NotificationApp* notification = furi_record_open("notification"); | ||||
|     furi_record_close("notification"); | ||||
| 
 | ||||
|     // TODO: lock device while test running
 | ||||
|     if(loader_is_locked(loader)) { | ||||
|         FURI_LOG_E(TESTS_TAG, "RPC: stop all applications to run tests"); | ||||
|         notification_message(notification, &sequence_blink_magenta_100); | ||||
| @ -48,10 +48,15 @@ void unit_tests_cli(Cli* cli, string_t args, void* context) { | ||||
|         notification_message_block(notification, &sequence_set_only_blue_255); | ||||
| 
 | ||||
|         uint32_t heap_before = memmgr_get_free_heap(); | ||||
|         uint32_t cycle_counter = DWT->CYCCNT; | ||||
| 
 | ||||
|         test_result |= run_minunit(); | ||||
|         test_result |= run_minunit_test_irda_decoder_encoder(); | ||||
|         test_result |= run_minunit_test_rpc(); | ||||
|         test_result |= run_minunit_test_flipper_file(); | ||||
|         cycle_counter = (DWT->CYCCNT - cycle_counter); | ||||
| 
 | ||||
|         FURI_LOG_I(TESTS_TAG, "Consumed: %0.2fs", (float)cycle_counter / (SystemCoreClock)); | ||||
| 
 | ||||
|         if(test_result == 0) { | ||||
|             delay(200); /* wait for tested services and apps to deallocate */ | ||||
| @ -68,10 +73,15 @@ void unit_tests_cli(Cli* cli, string_t args, void* context) { | ||||
|             FURI_LOG_E(TESTS_TAG, "FAILED"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     furi_record_close("notification"); | ||||
|     furi_record_close("loader"); | ||||
| } | ||||
| 
 | ||||
| void unit_tests_cli_init() { | ||||
|     Cli* cli = furi_record_open("cli"); | ||||
| 
 | ||||
|     // We need to launch apps from tests, so we cannot lock loader
 | ||||
|     cli_add_command(cli, "unit_tests", CliCommandFlagParallelSafe, unit_tests_cli, NULL); | ||||
|     furi_record_close("cli"); | ||||
| } | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
| #error Regenerate this file with the current version of nanopb generator. | ||||
| #endif | ||||
| 
 | ||||
| PB_BIND(PB_App_Start, PB_App_Start, AUTO) | ||||
| PB_BIND(PB_App_StartRequest, PB_App_StartRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_App_LockStatusRequest, PB_App_LockStatusRequest, AUTO) | ||||
|  | ||||
| @ -14,10 +14,10 @@ typedef struct _PB_App_LockStatusRequest { | ||||
|     char dummy_field; | ||||
| } PB_App_LockStatusRequest; | ||||
| 
 | ||||
| typedef struct _PB_App_Start {  | ||||
| typedef struct _PB_App_StartRequest {  | ||||
|     char *name;  | ||||
|     char *args;  | ||||
| } PB_App_Start; | ||||
| } PB_App_StartRequest; | ||||
| 
 | ||||
| typedef struct _PB_App_LockStatusResponse {  | ||||
|     bool locked;  | ||||
| @ -29,24 +29,24 @@ extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Initializer values for message structs */ | ||||
| #define PB_App_Start_init_default                {NULL, NULL} | ||||
| #define PB_App_StartRequest_init_default         {NULL, NULL} | ||||
| #define PB_App_LockStatusRequest_init_default    {0} | ||||
| #define PB_App_LockStatusResponse_init_default   {0} | ||||
| #define PB_App_Start_init_zero                   {NULL, NULL} | ||||
| #define PB_App_StartRequest_init_zero            {NULL, NULL} | ||||
| #define PB_App_LockStatusRequest_init_zero       {0} | ||||
| #define PB_App_LockStatusResponse_init_zero      {0} | ||||
| 
 | ||||
| /* Field tags (for use in manual encoding/decoding) */ | ||||
| #define PB_App_Start_name_tag                    1 | ||||
| #define PB_App_Start_args_tag                    2 | ||||
| #define PB_App_StartRequest_name_tag             1 | ||||
| #define PB_App_StartRequest_args_tag             2 | ||||
| #define PB_App_LockStatusResponse_locked_tag     1 | ||||
| 
 | ||||
| /* Struct field encoding specification for nanopb */ | ||||
| #define PB_App_Start_FIELDLIST(X, a) \ | ||||
| #define PB_App_StartRequest_FIELDLIST(X, a) \ | ||||
| X(a, POINTER,  SINGULAR, STRING,   name,              1) \ | ||||
| X(a, POINTER,  SINGULAR, STRING,   args,              2) | ||||
| #define PB_App_Start_CALLBACK NULL | ||||
| #define PB_App_Start_DEFAULT NULL | ||||
| #define PB_App_StartRequest_CALLBACK NULL | ||||
| #define PB_App_StartRequest_DEFAULT NULL | ||||
| 
 | ||||
| #define PB_App_LockStatusRequest_FIELDLIST(X, a) \ | ||||
| 
 | ||||
| @ -58,17 +58,17 @@ X(a, STATIC,   SINGULAR, BOOL,     locked,            1) | ||||
| #define PB_App_LockStatusResponse_CALLBACK NULL | ||||
| #define PB_App_LockStatusResponse_DEFAULT NULL | ||||
| 
 | ||||
| extern const pb_msgdesc_t PB_App_Start_msg; | ||||
| extern const pb_msgdesc_t PB_App_StartRequest_msg; | ||||
| extern const pb_msgdesc_t PB_App_LockStatusRequest_msg; | ||||
| extern const pb_msgdesc_t PB_App_LockStatusResponse_msg; | ||||
| 
 | ||||
| /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ | ||||
| #define PB_App_Start_fields &PB_App_Start_msg | ||||
| #define PB_App_StartRequest_fields &PB_App_StartRequest_msg | ||||
| #define PB_App_LockStatusRequest_fields &PB_App_LockStatusRequest_msg | ||||
| #define PB_App_LockStatusResponse_fields &PB_App_LockStatusResponse_msg | ||||
| 
 | ||||
| /* Maximum encoded size of messages (where known) */ | ||||
| /* PB_App_Start_size depends on runtime parameters */ | ||||
| /* PB_App_StartRequest_size depends on runtime parameters */ | ||||
| #define PB_App_LockStatusRequest_size            0 | ||||
| #define PB_App_LockStatusResponse_size           2 | ||||
| 
 | ||||
|  | ||||
| @ -2,12 +2,12 @@ | ||||
| 
 | ||||
| #include <gui/icon_i.h> | ||||
| 
 | ||||
| const uint8_t _I_Certification1_103x23_0[] = {0x01,0x00,0x98,0x00,0x9f,0xff,0xbe,0x30,0x38,0x04,0xf2,0x01,0xe0,0x80,0x82,0x87,0xf9,0x01,0x06,0x24,0xfe,0x01,0xf8,0x80,0xfe,0x21,0xff,0xf8,0x3c,0xff,0x9c,0x0c,0x1e,0x00,0x30,0x7f,0xc0,0xc1,0xe3,0xc0,0xe3,0xd0,0x7e,0x75,0xc4,0x46,0x30,0x70,0xd9,0x46,0x3c,0x10,0x09,0xc0,0x30,0xfe,0x10,0x1c,0x04,0x3c,0x18,0x37,0x08,0x05,0xc0,0x18,0x77,0x88,0x07,0x00,0x6e,0x31,0x89,0x87,0xe2,0x00,0x0c,0x39,0xc0,0x30,0x49,0x83,0x18,0x8c,0x7f,0xa0,0x60,0xc3,0x2c,0xa0,0x30,0x60,0xe0,0x01,0x06,0x14,0x70,0x18,0x26,0x51,0x8c,0x43,0x20,0x70,0x20,0x64,0xe3,0x03,0xa2,0x74,0x10,0x62,0x5f,0xce,0xc3,0x8f,0x06,0x78,0x31,0xc4,0xc6,0x33,0xc2,0x6f,0x99,0xf5,0x03,0x89,0xb7,0xb0,0x2d,0x7d,0x9f,0x2e,0x98,0x8c,0x0a,0x86,0x3c,0x0c,0x30,0xb9,0x7e,0x20,0x30,0x88,0x07,0xfe,0x0e,0x0c,0x42,0xda,0x40,0x3f,0x90,0x10,}; | ||||
| const uint8_t *_I_Certification1_103x23[] = {_I_Certification1_103x23_0}; | ||||
| 
 | ||||
| const uint8_t _I_Certification2_119x30_0[] = {0x01,0x00,0x3c,0x01,0x00,0x5c,0x06,0x01,0x40,0x07,0x5e,0x0b,0xff,0x20,0x07,0x5d,0x92,0x01,0x13,0x03,0xa4,0x70,0x06,0x5f,0xe0,0x10,0xc6,0x20,0x10,0xc8,0x1c,0xce,0x70,0x07,0x19,0xf0,0x08,0x70,0x10,0x18,0x1c,0x03,0xe1,0xff,0x83,0x83,0x84,0x34,0x57,0xf0,0x10,0xd8,0x03,0x23,0x00,0x1c,0x8c,0x08,0x1c,0x30,0xf0,0xc8,0xf8,0xc1,0xc3,0x10,0x00,0x90,0x48,0x60,0x70,0x3d,0x98,0x90,0x70,0x1c,0x10,0x70,0xc2,0x03,0x65,0xa0,0xc0,0x07,0x47,0xe6,0x6d,0x1e,0x07,0x04,0x06,0x20,0xe3,0x90,0x5f,0x41,0xc9,0xe0,0xc0,0x08,0x46,0x09,0x18,0x41,0x0c,0x82,0x44,0x0e,0x11,0x61,0x5c,0x27,0xd0,0x70,0x70,0xc5,0xc1,0xc3,0x40,0x8a,0x17,0x84,0x94,0x53,0x0a,0x0c,0x1a,0x01,0xe2,0x88,0x7e,0x01,0xc3,0x08,0x80,0xff,0xcd,0x05,0xb8,0x80,0x43,0xa0,0x11,0xe8,0x80,0x84,0x43,0xa5,0xfe,0x98,0xa1,0x86,0xb9,0x00,0x8e,0x9c,0x47,0xe0,0x5d,0x1a,0x04,0x88,0x8e,0x20,0x02,0x97,0x60,0x27,0x40,0xe1,0x03,0x95,0x02,0x82,0x0e,0x49,0x35,0x0a,0x65,0x00,0xe1,0x28,0x04,0xfe,0x38,0x05,0xc8,0xf8,0xe3,0xf0,0x09,0x3c,0x8a,0xe4,0x0e,0x4e,0x02,0xe0,0x7f,0xff,0x39,0xfe,0x02,0x47,0x14,0xf1,0x0b,0x13,0x41,0xc0,0x52,0x0c,0xc2,0x61,0xc0,0x90,0xc3,0x38,0x50,0x1e,0x27,0xfe,0x8f,0x00,0xc8,0x48,0x20,0xc0,0xe3,0x40,0x0e,0x04,0x1c,0x98,0x8d,0x04,0x28,0x1c,0x4a,0x31,0x00,0x0c,0x0e,0x11,0x38,0x59,0x8c,0x12,0x7f,0x12,0x81,0xfc,0x27,0xf7,0x08,0x05,0x06,0x01,0x07,0x07,0x1c,0x08,0x6c,0x20,0xe2,0x98,0x40,0x27,0xd0,0x08,0x34,0x42,0x70,0xef,0x13,0xa8,0xd0,0x05,0x84,0x1d,0x10,0x00,0xc1,0xdf,0x43,0x0c,0x41,0x1a,0xcc,0x47,0x63,0xff,0x00,0x0c,0x0c,0xe4,0x2d,0x91,0x00,0x17,0xf8,0x1c,0x3c,0x00,0x71,0x09,0xc7,0xfc,0x0d,0x30,0x06,0x7f,0x3f,0xea,0x11,0x07,0x78,0x3b,0xc1,0xd6,}; | ||||
| const uint8_t *_I_Certification2_119x30[] = {_I_Certification2_119x30_0}; | ||||
| 
 | ||||
| const uint8_t _I_Certification1_103x23_0[] = {0x01,0x00,0x98,0x00,0x9f,0xff,0xbe,0x30,0x38,0x04,0xf2,0x01,0xe0,0x80,0x82,0x87,0xf9,0x01,0x06,0x24,0xfe,0x01,0xf8,0x80,0xfe,0x21,0xff,0xf8,0x3c,0xff,0x9c,0x0c,0x1e,0x00,0x30,0x7f,0xc0,0xc1,0xe3,0xc0,0xe3,0xd0,0x7e,0x75,0xc4,0x46,0x30,0x70,0xd9,0x46,0x3c,0x10,0x09,0xc0,0x30,0xfe,0x10,0x1c,0x04,0x3c,0x18,0x37,0x08,0x05,0xc0,0x18,0x77,0x88,0x07,0x00,0x6e,0x31,0x89,0x87,0xe2,0x00,0x0c,0x39,0xc0,0x30,0x49,0x83,0x18,0x8c,0x7f,0xa0,0x60,0xc3,0x2c,0xa0,0x30,0x60,0xe0,0x01,0x06,0x14,0x70,0x18,0x26,0x51,0x8c,0x43,0x20,0x70,0x20,0x64,0xe3,0x03,0xa2,0x74,0x10,0x62,0x5f,0xce,0xc3,0x8f,0x06,0x78,0x31,0xc4,0xc6,0x33,0xc2,0x6f,0x99,0xf5,0x03,0x89,0xb7,0xb0,0x2d,0x7d,0x9f,0x2e,0x98,0x8c,0x0a,0x86,0x3c,0x0c,0x30,0xb9,0x7e,0x20,0x30,0x88,0x07,0xfe,0x0e,0x0c,0x42,0xda,0x40,0x3f,0x90,0x10,}; | ||||
| const uint8_t *_I_Certification1_103x23[] = {_I_Certification1_103x23_0}; | ||||
| 
 | ||||
| const uint8_t _A_WatchingTV_128x64_0[] = {0x01,0x00,0x32,0x02,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1f,0x80,0x01,0x15,0x04,0x21,0x70,0x18,0x05,0x02,0x42,0x09,0x5f,0xfc,0x7c,0x0a,0x70,0x20,0x78,0xc4,0x41,0xc9,0xc0,0x80,0x58,0x01,0xf9,0x20,0x1d,0x98,0x00,0x60,0x80,0x81,0x84,0x83,0xd2,0x20,0x3b,0x30,0x00,0xc2,0x01,0xe3,0x06,0x07,0xa0,0x20,0x45,0x64,0x16,0x30,0x7b,0x0a,0x04,0x04,0x60,0xf3,0x85,0x03,0xd0,0x38,0x42,0x22,0x23,0x14,0x80,0x9e,0xa0,0xf2,0x21,0x11,0x74,0x60,0x1a,0x00,0x90,0xa2,0x14,0x1e,0x86,0x41,0xa8,0x04,0x84,0x1e,0xc1,0x83,0x07,0x8c,0xc0,0xee,0x80,0xf7,0x03,0x88,0x3c,0x6f,0xfe,0x00,0xb9,0x40,0xf0,0x10,0xf0,0x7a,0x40,0x86,0xa3,0x80,0xcf,0x83,0xcc,0x06,0x2b,0x04,0x82,0x46,0x1c,0xaa,0x0f,0x22,0x42,0x41,0x22,0x80,0x84,0x07,0x8f,0x82,0x7e,0x1f,0x48,0x44,0x90,0x1e,0x9c,0x08,0x0c,0x82,0xce,0x1f,0x48,0x84,0x88,0x06,0x33,0x01,0xd9,0xd8,0x34,0xfa,0x00,0x79,0xfe,0x28,0xe0,0x31,0x86,0x00,0x84,0x8a,0x3c,0x0a,0x9f,0x04,0x1e,0x70,0x6a,0xc0,0x0c,0x49,0x64,0x12,0x1c,0x06,0xbc,0x3e,0x90,0x11,0x48,0xfc,0x02,0xc6,0x02,0x1a,0x87,0x41,0x3e,0x94,0x0f,0xc4,0x3c,0x0e,0x42,0x22,0x64,0x8b,0x3d,0x30,0x0f,0x63,0x57,0x1c,0x00,0x3e,0x5f,0xff,0xfc,0x3c,0x1e,0x83,0x22,0x40,0x8e,0xa0,0x08,0x35,0x5a,0xaf,0xd4,0x24,0x21,0x31,0x80,0x6b,0x8e,0x25,0x04,0xea,0x01,0xc7,0x54,0x00,0x48,0x76,0x03,0xaa,0x0f,0x18,0xe4,0x02,0xf1,0x35,0x0f,0x90,0x00,0xe1,0xfc,0x0d,0x57,0xff,0xc2,0x51,0x18,0x65,0xa8,0x3e,0xbe,0xa8,0x55,0x83,0x03,0x01,0x8f,0x1d,0xc6,0x0d,0xd4,0x0f,0xad,0xd6,0x1a,0xf9,0x10,0xe8,0xbd,0xc4,0xa0,0x30,0x10,0xfa,0x6b,0xa1,0x40,0xf1,0x25,0x0c,0xbb,0x01,0x01,0xa8,0x40,0xc3,0xe9,0x57,0x9e,0xcf,0xb0,0x06,0x61,0x82,0xd0,0x20,0x3a,0x88,0x10,0xf9,0x35,0x5c,0xa9,0x0e,0x00,0x0c,0x30,0x24,0xf0,0x87,0xc4,0xf8,0x5f,0xfb,0xfd,0x54,0x7e,0x38,0x01,0x28,0xc0,0x53,0xc3,0xe8,0x83,0xe2,0x00,0x05,0xb8,0xd5,0x0f,0xc6,0x80,0x1e,0x13,0x58,0xbd,0x06,0x30,0x3e,0x40,0xf9,0x31,0x85,0x56,0x50,0x08,0x24,0x82,0x44,0x00,0x1d,0x16,0xcc,0x3e,0x34,0x00,0x79,0x60,0x11,0xa3,0x02,0x90,0x1f,0x4c,0x04,0x30,0xdc,0x00,0x3c,0xa8,0x17,0xd7,0x20,0xd0,0x07,0xc5,0x98,0x1f,0x94,0x02,0x42,0xfd,0x2a,0x3e,0x00,0x26,0x23,0xe4,0x0f,0x8c,0x02,0x7c,0xfd,0x2a,0x00,0x3c,0x8d,0xc5,0x23,0xd9,0x07,0xc8,0x00,0x56,0xa2,0x21,0x28,0x84,0x04,0x22,0x22,0x0f,0x88,0xf8,0xa6,0xa0,0xf6,0x3f,0x98,0x3c,0xb4,0x11,0xaa,0x03,0x14,0x43,0xf5,0x54,0x8a,0x83,0xce,0x63,0xfc,0xc7,0xc8,0x87,0xe8,0xc0,0x14,0x20,0xbc,0x47,0x01,0x49,0x81,0x64,0x03,0xeb,0x50,0x42,0x10,0x3d,0x47,0xe5,0x2a,0x0f,0x16,0xaa,0x1d,0x80,0x84,0x0b,0xc8,0x3e,0x95,0xd6,0x31,0x92,0x86,0x0e,0x4f,0x20,0x78,0x8f,0xcb,0xed,0xaa,0xf5,0x21,0xc4,0x1e,0x30,0x43,0xa0,0xc4,0x49,0xe2,0x1a,0x2c,0x2f,0x5e,0x3e,0x41,0x18,0xf0,0x3c,0xe5,0x27,0xf4,0x83,0x5b,0x0e,0x04,0x6d,0x10,0x78,0xc8,0x01,0xe4,0x1f,0x28,0x2c,0xe1,0x40,0x60,0xf3,0x8a,0x83,0xc4,0x7e,0x50,0x63,0x48,0xa0,0x48,0x1e,0x70,0xb0,0xfa,0x83,0xce,0x01,0x03,0x07,0x8c,0x40,}; | ||||
| const uint8_t _A_WatchingTV_128x64_1[] = {0x01,0x00,0x4a,0x02,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1f,0x80,0x01,0x0f,0x02,0x80,0x10,0xb8,0x0c,0x03,0x41,0x20,0x04,0xaf,0xfe,0x3e,0x05,0x38,0x14,0x03,0xc1,0x10,0x07,0x27,0x02,0xab,0x75,0x07,0xae,0x80,0x1e,0xba,0x0d,0x56,0xa8,0x0c,0x70,0x48,0x05,0x42,0x12,0x0f,0x40,0xa8,0xd4,0x07,0x62,0x00,0x18,0x44,0x03,0x61,0x05,0x07,0xa0,0x20,0x74,0x02,0xb1,0x0b,0x20,0x18,0xc5,0x07,0x40,0x0c,0x18,0x3c,0x76,0x10,0x70,0x7a,0x05,0x47,0x01,0x0a,0x03,0x11,0xb0,0x47,0xec,0x25,0x28,0xa8,0x18,0x91,0x83,0xb0,0x2f,0xa9,0x30,0xa3,0x4a,0x04,0xac,0x23,0xd4,0x1e,0x53,0x40,0x7a,0x4a,0x38,0x1f,0xf0,0x7b,0x4a,0x00,0xe9,0x38,0x01,0x8e,0x0e,0x06,0x17,0x18,0x1e,0x02,0x1f,0x30,0x23,0xa4,0x60,0x06,0x3f,0xc2,0xe1,0x04,0x86,0x01,0x60,0x3b,0xa0,0x3c,0x8d,0x86,0x0f,0x2a,0x80,0x3d,0x22,0x83,0xc4,0x07,0x8f,0x83,0x7e,0x1f,0x48,0x44,0x90,0xa8,0x6d,0xe1,0x80,0xf8,0x2c,0xf5,0x16,0x3a,0x48,0x90,0x86,0x3b,0x2b,0x06,0x9f,0x40,0x0f,0x3f,0xc5,0x1c,0x06,0x25,0x82,0x22,0x8f,0x02,0xa7,0xd1,0x07,0x9c,0x1a,0xb0,0x03,0x18,0x60,0x08,0xf0,0x1a,0xf0,0xfa,0x40,0x6c,0x1f,0x0f,0xf9,0x6c,0xa0,0xc5,0xe2,0xe8,0x27,0xd2,0x80,0xf9,0x10,0x01,0x04,0x8a,0x01,0xa8,0x67,0xa6,0x01,0xf2,0x2a,0xe5,0x80,0x75,0x00,0x43,0xff,0xff,0xc3,0xc1,0xe9,0xf0,0x14,0x94,0x0f,0x54,0x04,0x1a,0xad,0x57,0xea,0x12,0x10,0x98,0xc0,0x35,0xc7,0x12,0x82,0x75,0x00,0xe3,0xaa,0x00,0x24,0x3b,0x01,0xd5,0x07,0x8c,0x72,0x01,0x7a,0x9a,0x87,0xc8,0x00,0x70,0xfe,0x06,0xab,0xff,0xe1,0x28,0x8e,0xb6,0xd4,0x1f,0x5f,0x54,0x2a,0xc1,0xd5,0x80,0xc7,0xac,0x18,0x0a,0xb0,0x94,0x43,0xc9,0x75,0x86,0xe8,0x35,0x41,0xd1,0xa8,0x50,0x30,0x7a,0xa8,0x08,0x7d,0x35,0xc1,0xf1,0xa0,0x12,0x86,0x5d,0xa0,0x80,0xd5,0x60,0x61,0xf4,0xab,0xcf,0x67,0xd8,0x03,0x30,0xc5,0x6a,0x01,0xd1,0x81,0x0f,0x93,0x55,0xca,0x90,0xe0,0x00,0xc3,0x0a,0x4f,0x08,0x7c,0x4f,0x85,0xff,0xbf,0xd5,0x61,0xb2,0x0c,0x00,0x94,0x60,0xa4,0xd1,0xf5,0x41,0xf1,0x00,0x02,0xdc,0x06,0x86,0x40,0x70,0x1d,0x56,0x09,0x3c,0x31,0xd8,0xc0,0xf9,0x03,0xe5,0x40,0x0f,0x08,0x08,0x5c,0x83,0x20,0x91,0x00,0x07,0x45,0xb3,0x0f,0x8d,0x01,0xac,0x30,0x0d,0x02,0x34,0x60,0x72,0x03,0xe9,0x80,0x86,0x1b,0x80,0x07,0x95,0x42,0xfa,0xe4,0x1a,0x00,0xf8,0xb3,0x03,0xf2,0x80,0x48,0x5f,0xa5,0x47,0xc0,0x3f,0x44,0x7c,0x81,0xf1,0x80,0x4f,0x81,0xe3,0xd5,0xa0,0x03,0xc8,0xdc,0x52,0x3d,0x90,0x7c,0x87,0xc6,0x44,0x2c,0x04,0x04,0x04,0x22,0x22,0x0f,0x88,0xf8,0xa6,0xa0,0xf6,0x3f,0x98,0x3c,0xb5,0x51,0xaa,0x04,0x80,0x3f,0x44,0x91,0x8a,0x83,0xce,0x63,0xfc,0xc7,0xc8,0x87,0xe9,0xa8,0x42,0x14,0x40,0x1e,0x34,0x98,0x16,0x40,0x3e,0x51,0xd3,0x41,0xa1,0x04,0x1e,0xa3,0xf2,0x00,0x24,0x3b,0x01,0x08,0x17,0x90,0x7d,0x2b,0xac,0x63,0x25,0x0c,0x1c,0x9e,0x40,0xf1,0x1f,0x97,0xdb,0x55,0xea,0x43,0x88,0x3c,0x60,0x83,0x61,0x88,0x93,0xc4,0x34,0x58,0x5e,0xbc,0x7c,0xa2,0x31,0xe0,0x79,0xca,0x4f,0xe9,0x06,0xb6,0x20,0x08,0xda,0x20,0xf1,0x90,0x03,0xc8,0x3e,0x50,0x59,0xc0,0x3c,0x93,0xa2,0x0f,0x28,0xa8,0x3c,0x47,0xe5,0x06,0x34,0x88,0x00,0x59,0xa2,0x0f,0x28,0x58,0x7d,0x41,0xe7,0x00,0x81,0x83,0xc6,0x20,}; | ||||
| const uint8_t _A_WatchingTV_128x64_2[] = {0x01,0x00,0x37,0x02,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1f,0x80,0x01,0x0c,0x62,0x80,0x10,0xb8,0x0c,0x02,0x29,0x20,0x04,0xaf,0xfe,0x3e,0x05,0x38,0x14,0x02,0x39,0x10,0x07,0x27,0x02,0x01,0x60,0x07,0xac,0x58,0x1e,0xa2,0x51,0x1d,0x90,0x00,0x60,0x90,0x09,0x54,0x20,0x1e,0x81,0x52,0x1d,0x88,0x00,0x41,0x83,0x36,0x09,0x08,0x00,0xc2,0xa4,0x2b,0x10,0xb1,0xd8,0x80,0xc6,0x28,0x30,0x11,0x83,0xcb,0x8d,0x03,0x07,0xa0,0x54,0x87,0x06,0x46,0x18,0x54,0x1c,0x1e,0xe5,0x83,0x46,0x0e,0x18,0x9e,0xa4,0xc2,0x07,0x99,0x90,0x69,0x40,0xf8,0x4c,0x18,0x3c,0x64,0x80,0xfc,0x03,0x8c,0xf3,0xe1,0x3f,0xc0,0x03,0x07,0x01,0x03,0xc0,0x43,0xc1,0xe9,0x02,0x8c,0x2a,0x86,0xc0,0x0f,0x30,0x50,0xac,0x12,0x09,0x38,0x01,0x8c,0x7c,0x1e,0xae,0x84,0x82,0x45,0x1e,0xa8,0x0f,0x1f,0x04,0xfc,0x3e,0x90,0x80,0x79,0x06,0x0b,0x81,0x01,0x90,0x59,0xc3,0xe9,0x10,0x91,0x16,0x10,0x36,0x36,0x0d,0x3e,0x80,0x1e,0x7f,0x89,0x38,0x0c,0x4a,0x42,0x02,0x2e,0x05,0x4f,0x82,0x0f,0x38,0x35,0x60,0x06,0x40,0x21,0x86,0x10,0x47,0x5e,0x1f,0x48,0x0d,0x83,0x01,0xff,0x45,0x90,0x48,0xaa,0x1d,0x04,0xfa,0x50,0x2f,0x01,0x63,0x72,0x18,0x7c,0xca,0x63,0x80,0x7b,0x1a,0xb8,0xe0,0x01,0xf2,0xff,0xff,0xe1,0xe0,0xf4,0xf8,0x20,0x4f,0x50,0x04,0x1a,0xad,0x57,0xea,0x12,0x10,0x98,0xc0,0x35,0xc7,0x12,0x82,0x75,0x00,0xe3,0xaa,0x00,0x24,0x3b,0x01,0xd5,0x07,0x8c,0x72,0x01,0x78,0x9a,0x87,0xc8,0x00,0x70,0xfe,0x06,0xab,0xff,0xe1,0x28,0x8c,0x32,0xd4,0x1f,0x5f,0x54,0x2a,0xc1,0x81,0x80,0xc7,0x94,0x23,0x06,0xea,0x07,0xd6,0xeb,0x0d,0x58,0x08,0x74,0x62,0x00,0x31,0xd4,0x40,0x43,0xe9,0xae,0x85,0x03,0xc4,0x94,0x32,0xec,0x04,0x06,0xa1,0x03,0x0f,0xa5,0x5e,0x7b,0x3e,0xc0,0x19,0x86,0x0b,0x40,0x80,0xea,0x20,0x43,0xe4,0xd5,0x72,0xa4,0x38,0x00,0x30,0xc0,0x93,0xc2,0x1f,0x13,0xe1,0x7f,0xef,0xf5,0x51,0xf8,0xe0,0x04,0xa3,0x01,0x4f,0x0f,0xa2,0x0f,0x88,0x00,0x16,0xe3,0x54,0x3f,0x1a,0x00,0x78,0x4d,0x62,0xf4,0x18,0xc0,0xf9,0x03,0xe4,0xc6,0x15,0x59,0x40,0x20,0x92,0x09,0x10,0x00,0x74,0x5b,0x30,0xf8,0xd0,0x01,0xe5,0x80,0x46,0x8c,0x0a,0x40,0x7d,0x30,0x10,0xc3,0x70,0x00,0xf2,0xa0,0x5f,0x5c,0x83,0x40,0x1f,0x16,0x60,0x7e,0x50,0x09,0x0b,0xf4,0xa8,0xf8,0x00,0x98,0x8f,0x90,0x3e,0x30,0x09,0xf3,0xf4,0xa8,0x00,0xf2,0x37,0x14,0x8f,0x64,0x1f,0x20,0x01,0x5a,0x88,0x84,0xa2,0x10,0x10,0x88,0x88,0x3e,0x23,0xe2,0x9a,0x83,0xd8,0xfe,0x60,0xf2,0xd0,0x46,0xa8,0x0c,0x51,0x0f,0xd5,0x52,0x2a,0x0f,0x39,0x8f,0xf3,0x1f,0x22,0x1f,0xa3,0x00,0x50,0x82,0xf1,0x1c,0x05,0x26,0x05,0x90,0x0f,0xad,0x41,0x08,0x40,0xf5,0x1f,0x94,0xa8,0x3c,0x5a,0xa8,0x76,0x02,0x10,0x2f,0x20,0xfa,0x57,0x58,0xc6,0x4a,0x18,0x39,0x3c,0x81,0xe2,0x3f,0x2f,0xb6,0xab,0xd4,0x87,0x10,0x78,0xc1,0x0e,0x83,0x11,0x27,0x88,0x68,0xb0,0xbd,0x78,0xf9,0x04,0x63,0xc0,0xf3,0x94,0x9f,0xd2,0x0d,0x6c,0x38,0x11,0xb4,0x41,0xe3,0x20,0x07,0x90,0x7c,0xa0,0xb3,0x85,0x01,0x83,0xce,0x2a,0x0f,0x11,0xf9,0x41,0x8d,0x22,0x81,0x20,0x79,0xc2,0xc3,0xea,0x0f,0x38,0x04,0x0c,0x1e,0x31,0x00,}; | ||||
| @ -25,23 +25,20 @@ const uint8_t _A_Wink_128x64_7[] = {0x01,0x00,0x9a,0x01,0x00,0x78,0x03,0xc0,0x1e | ||||
| const uint8_t _A_Wink_128x64_8[] = {0x01,0x00,0x95,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x00,0xf8,0x3f,0xf1,0xf0,0x7e,0x4e,0x02,0x23,0x01,0x07,0xdc,0x1e,0x01,0xf0,0x87,0x03,0xab,0x81,0xff,0xdf,0xc7,0xae,0x00,0xfa,0x98,0x40,0x2a,0x90,0x7e,0xc0,0xc2,0xa3,0x10,0x0d,0x54,0x0f,0x1d,0x03,0x07,0xcc,0x12,0x01,0x55,0x81,0xc4,0xc8,0x16,0x1f,0x1e,0x0d,0x86,0x10,0x0f,0xbe,0xad,0xc3,0x08,0x34,0x10,0x03,0xe0,0x00,0x43,0xea,0x8c,0x42,0x22,0x3e,0x08,0x78,0x3d,0xa8,0x00,0x21,0xaa,0xe3,0x22,0x13,0x88,0xe5,0xe0,0x1e,0xd2,0x00,0x10,0xda,0xa0,0x92,0x19,0x64,0x1f,0x80,0x7e,0x7c,0x07,0xfe,0x7f,0x0c,0x81,0x79,0xa0,0x38,0x04,0x13,0x44,0x03,0x03,0x18,0x8c,0x61,0x24,0x6b,0x31,0x07,0xb4,0x22,0xc1,0xfe,0x99,0xcc,0x3c,0x11,0x08,0x07,0xe0,0x1e,0xd0,0x49,0x84,0x06,0xc9,0x20,0x9c,0x43,0x20,0x1f,0xe1,0xfb,0x40,0xb2,0x10,0x0e,0x41,0xb0,0x60,0x58,0x0b,0xf8,0x3d,0xa0,0x34,0x8f,0xe6,0x44,0x0a,0x5e,0x09,0xfa,0x41,0xe5,0x1f,0xed,0x1c,0x04,0xa6,0x3f,0x08,0xf8,0x3d,0xe4,0x9f,0xf9,0x3c,0x05,0xe6,0x3f,0xc4,0xfb,0xc0,0x22,0x9f,0xfa,0x3c,0x05,0x9c,0x3f,0xe8,0x38,0x3d,0xf2,0x9e,0x7a,0x7c,0x06,0x0c,0x94,0x18,0x18,0x3e,0xb0,0x24,0x01,0xff,0x9f,0x98,0x1e,0x5f,0xfa,0x7d,0xc6,0x01,0xe0,0xff,0xbc,0x20,0x1e,0x51,0xd2,0xf0,0x9f,0x9c,0x1e,0x84,0xb1,0xfc,0x1f,0xa3,0x01,0x96,0xff,0x86,0xcb,0xf8,0x7e,0x8a,0x04,0x97,0xff,0x41,0x02,0x8f,0xf8,0xfd,0x1a,0x09,0x55,0xf8,0x0a,0x5f,0xf3,0xf4,0x54,0x29,0xb1,0xe1,0xa1,0x1f,0xa7,0x51,0x9a,0x81,0x01,0x04,0xfc,0x58,0x01,0x0b,0x54,0x32,0xa8,0x92,0xf8,0x7f,0xca,0x83,0x0e,0x0f,0xb7,0xa8,0x08,0x5f,0x88,0x09,0x7c,0x61,0x21,0xf6,0xaa,0x81,0x0b,0xf9,0x00,0xb8,0x70,0x1a,0x62,0x1f,0x59,0x50,0x10,0xa7,0xcb,0x01,0x9c,0x83,0xda,0xa1,0x15,0x80,0x58,0x30,0x02,0xd1,0xc0,0x43,0xe0,0x81,0xf6,0x85,0x17,0x47,0xe0,0xad,0x1f,0x84,0x00,0x1e,0xd5,0x08,0x2a,0x34,0x80,0x02,0x21,0x13,0xb1,0x07,0xd8,0x00,0xa7,0x62,0x0f,0xbb,0x5d,0x17,0xee,0x1f,0x6a,0x02,0xc1,0xc0,0x0d,0x3c,0x07,0x6f,0x01,0xa1,0x00,0x05,0x98,0x03,0xb5,0x1c,0x20,0xfd,0xb8,0x13,0x79,0xd8,0xc0,0xff,0x1f,0x78,0x01,0xfe,0x10,0x70,0x7e,0xff,0x0f,0xbd,0xfe,0x07,0xc8,}; | ||||
| const uint8_t *_A_Wink_128x64[] = {_A_Wink_128x64_0,_A_Wink_128x64_1,_A_Wink_128x64_2,_A_Wink_128x64_3,_A_Wink_128x64_4,_A_Wink_128x64_5,_A_Wink_128x64_6,_A_Wink_128x64_7,_A_Wink_128x64_8}; | ||||
| 
 | ||||
| const uint8_t _I_dir_10px_0[] = {0x01,0x00,0x11,0x00,0x00,0x0c,0xfe,0x01,0x41,0x80,0x7f,0xe0,0x70,0x18,0x10,0x05,0x7f,0xd0,0x10,0x88,0x80,}; | ||||
| const uint8_t *_I_dir_10px[] = {_I_dir_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_Nfc_10px_0[] = {0x00,0x80,0x00,0x00,0x01,0x22,0x02,0x43,0x02,0x45,0x02,0x49,0x02,0x31,0x02,0x22,0x02,0x00,0x01,0x80,0x00,}; | ||||
| const uint8_t *_I_Nfc_10px[] = {_I_Nfc_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_sub1_10px_0[] = {0x01,0x00,0x12,0x00,0x81,0x40,0x69,0x30,0x2c,0x2c,0x0b,0x6a,0x01,0x28,0x0c,0x0a,0x65,0x01,0x98,0x40,0x00,0x26,}; | ||||
| const uint8_t *_I_sub1_10px[] = {_I_sub1_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_ir_10px_0[] = {0x00,0xFC,0x00,0x02,0x01,0x79,0x02,0x84,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x58,0x00,0x78,0x00,0xFF,0x03,}; | ||||
| const uint8_t *_I_ir_10px[] = {_I_ir_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_unknown_10px_0[] = {0x01,0x00,0x12,0x00,0xbc,0x40,0x39,0x90,0x0c,0x24,0x03,0x81,0x00,0xb0,0x40,0x26,0x00,0x12,0x00,0x08,0x14,0xc0,}; | ||||
| const uint8_t *_I_unknown_10px[] = {_I_unknown_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_ibutt_10px_0[] = {0x00,0x80,0x03,0x40,0x02,0x20,0x02,0x10,0x01,0x8E,0x00,0x41,0x00,0x2D,0x00,0x2D,0x00,0x21,0x00,0x1E,0x00,}; | ||||
| const uint8_t *_I_ibutt_10px[] = {_I_ibutt_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_unknown_10px_0[] = {0x01,0x00,0x12,0x00,0xbc,0x40,0x39,0x90,0x0c,0x24,0x03,0x81,0x00,0xb0,0x40,0x26,0x00,0x12,0x00,0x08,0x14,0xc0,}; | ||||
| const uint8_t *_I_unknown_10px[] = {_I_unknown_10px_0}; | ||||
| const uint8_t _I_Nfc_10px_0[] = {0x00,0x80,0x00,0x00,0x01,0x22,0x02,0x43,0x02,0x45,0x02,0x49,0x02,0x31,0x02,0x22,0x02,0x00,0x01,0x80,0x00,}; | ||||
| const uint8_t *_I_Nfc_10px[] = {_I_Nfc_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_ble_10px_0[] = {0x00,0x04,0x00,0x8C,0x00,0x15,0x01,0x56,0x02,0x8C,0x02,0x8C,0x02,0x56,0x02,0x15,0x01,0x8C,0x00,0x04,0x00,}; | ||||
| const uint8_t *_I_ble_10px[] = {_I_ble_10px_0}; | ||||
| @ -49,41 +46,38 @@ const uint8_t *_I_ble_10px[] = {_I_ble_10px_0}; | ||||
| const uint8_t _I_125_10px_0[] = {0x00,0xE0,0x00,0x00,0x01,0x0E,0x02,0x31,0x02,0x45,0x02,0x91,0x00,0xAA,0x00,0x92,0x00,0x44,0x00,0x38,0x00,}; | ||||
| const uint8_t *_I_125_10px[] = {_I_125_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_dir_10px_0[] = {0x01,0x00,0x11,0x00,0x00,0x0c,0xfe,0x01,0x41,0x80,0x7f,0xe0,0x70,0x18,0x10,0x05,0x7f,0xd0,0x10,0x88,0x80,}; | ||||
| const uint8_t *_I_dir_10px[] = {_I_dir_10px_0}; | ||||
| 
 | ||||
| const uint8_t _I_BLE_Pairing_128x64_0[] = {0x01,0x00,0xb7,0x01,0x00,0x6c,0x38,0x1f,0xd0,0x10,0x76,0xe0,0x03,0xdd,0x40,0x07,0xf4,0x82,0x01,0x08,0x07,0xf4,0xc0,0x1f,0x91,0x08,0x07,0x00,0x1f,0xc0,0x0d,0x1e,0xe8,0x3f,0xc0,0x03,0x58,0x80,0xcf,0x11,0xd9,0xaf,0x85,0x77,0x01,0xf7,0x60,0xf8,0x45,0xff,0x05,0xed,0x9e,0x7c,0x09,0xdb,0xe0,0x2f,0x78,0x03,0x3c,0x8e,0xee,0x8a,0x43,0x81,0xfb,0x0c,0x66,0xe8,0xfc,0x59,0xba,0x6f,0x28,0x1b,0xfb,0xa3,0x80,0xfc,0xa0,0x1f,0xc6,0x86,0xbf,0xc3,0x78,0xce,0x04,0x19,0x26,0x77,0xfa,0x43,0xbe,0x12,0xa0,0x7e,0xf8,0x2a,0xa2,0x02,0xff,0x89,0x27,0x01,0xbf,0x99,0x38,0x8a,0xfc,0x0f,0x8e,0x07,0xfe,0x0e,0x94,0x2c,0x07,0xfc,0x7f,0x1f,0xf5,0x00,0xc3,0x00,0xe4,0x31,0x13,0xd1,0x00,0x0a,0xb8,0x19,0x25,0x91,0xc0,0x81,0xe2,0xb9,0x4d,0x5d,0x78,0x64,0x2e,0x84,0x80,0x61,0x07,0x02,0x3e,0x2a,0xa4,0xa2,0x00,0xf2,0x40,0x20,0xe3,0x21,0xa0,0x62,0x9f,0x60,0x05,0x02,0x3e,0x36,0x41,0x66,0x23,0x20,0x51,0xfc,0x40,0x68,0x0f,0x15,0x90,0x60,0x20,0x1b,0x09,0x89,0x70,0x46,0x42,0x07,0x14,0x99,0x41,0xe8,0x1f,0x18,0x0c,0x07,0xc1,0x19,0xff,0xc3,0xce,0x6b,0x54,0x8f,0xe0,0x3f,0x90,0x78,0x17,0x02,0x1a,0x70,0x39,0x01,0xa0,0xb1,0x53,0xb5,0x88,0xc7,0xe0,0x98,0x08,0x3a,0xd5,0xe8,0x97,0xd0,0x78,0xcf,0xe1,0x07,0xf1,0x0d,0x08,0x00,0x74,0x10,0x80,0x18,0xe8,0x97,0xc3,0xf2,0xff,0xc4,0x03,0xe3,0x04,0x8c,0x19,0xcc,0x00,0x35,0x0c,0x3c,0x03,0xf9,0x3f,0xb0,0x8f,0xc6,0x31,0x0e,0x0f,0x90,0x90,0xb5,0x45,0xc1,0xf8,0x4f,0xf0,0xde,0x18,0xcc,0x82,0x08,0x1f,0x22,0x20,0xd0,0x3a,0xab,0xd1,0xe0,0x5f,0xa1,0x1b,0x19,0x8d,0x02,0x04,0x9a,0x1d,0x04,0x28,0x26,0x36,0xa8,0x05,0xf0,0xe0,0x3f,0x04,0xf8,0xd0,0x30,0x55,0xfa,0xad,0x54,0x3e,0x35,0x09,0xab,0xac,0xbf,0x2b,0xf2,0x0a,0x0e,0xfb,0x55,0xaa,0x0f,0x94,0x68,0x04,0x30,0x6f,0xd3,0x7c,0xb0,0x15,0x0f,0xfd,0x7f,0xeb,0x05,0x4f,0x0b,0x60,0xa3,0x1f,0x28,0x0b,0xfc,0xbc,0x30,0x1f,0xf7,0xfe,0x54,0x2c,0x18,0x30,0x3c,0x6f,0x00,0xf2,0x1c,0x8c,0xf8,0x10,0x3c,0x00,0xf8,0xd5,0x5c,0x05,0xb8,0xb0,0xaa,0xdb,0x01,0x2b,0x31,0x0a,0xdc,0xa7,0x00,0xe6,0x00,0x0c,0x56,0x00,0x7e,0x10,0x00,0xcc,0x01,0xf0,0x1f,0x1b,0x40,0x2e,0x00,0x07,0x16,0x10,0x90,0x02,0xe5,0x90,0x06,0x29,0x00,0x2a,0xa9,0x00,0x2f,0x10,0x02,0xa5,0x10,0x02,0xf1,0x00,0x2a,0xa0,0x0d,0xc0,0x00,0xec,0x01,0xfd,0x60,0x17,0x6a,0xc0,0x60,0x40,0xfd,0xc0,0x30,0x04,0x01,0xb0,0xb0,0x7f,0x45,0x80,}; | ||||
| const uint8_t *_I_BLE_Pairing_128x64[] = {_I_BLE_Pairing_128x64_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonRightSmall_3x5_0[] = {0x00,0x01,0x03,0x07,0x03,0x01,}; | ||||
| const uint8_t *_I_ButtonRightSmall_3x5[] = {_I_ButtonRightSmall_3x5_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonLeft_4x7_0[] = {0x00,0x08,0x0C,0x0E,0x0F,0x0E,0x0C,0x08,}; | ||||
| const uint8_t *_I_ButtonLeft_4x7[] = {_I_ButtonLeft_4x7_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonLeftSmall_3x5_0[] = {0x00,0x04,0x06,0x07,0x06,0x04,}; | ||||
| const uint8_t *_I_ButtonLeftSmall_3x5[] = {_I_ButtonLeftSmall_3x5_0}; | ||||
| 
 | ||||
| const uint8_t _I_DFU_128x50_0[] = {0x01,0x00,0x2e,0x02,0x00,0x57,0xfe,0x0e,0x0e,0xcf,0x84,0x02,0x70,0x0f,0xc8,0x74,0x03,0x80,0x0e,0xbc,0x7c,0x04,0x06,0x30,0x30,0x74,0xe0,0x2f,0xe0,0x42,0x82,0x03,0xe7,0x81,0xff,0x02,0x14,0x20,0x1f,0x3e,0x00,0x79,0xc4,0x01,0xfd,0x20,0x07,0xd5,0xd4,0xe2,0x53,0xf2,0x74,0xff,0xe1,0x40,0x41,0x87,0xd8,0x01,0xf1,0x60,0xf0,0x43,0xca,0x43,0xe0,0xa7,0x83,0xe2,0x30,0x01,0x29,0x84,0x7b,0x20,0x0f,0x88,0x30,0x3c,0xb1,0x90,0x1d,0x00,0xfa,0x30,0x3f,0xf8,0xcc,0x02,0xc6,0x31,0x1f,0x83,0x49,0xa8,0x16,0x0a,0xf4,0x7f,0x00,0x21,0x1f,0x04,0x38,0x06,0x20,0x04,0x90,0x46,0x35,0xf0,0xfa,0x00,0xcc,0x7f,0x10,0x14,0x0b,0x46,0x20,0xd5,0x70,0x50,0xb4,0x06,0xf1,0x00,0x9f,0x03,0xd7,0x09,0x81,0xd7,0xc0,0x8b,0x85,0x38,0xc0,0x50,0x41,0xeb,0x63,0xc0,0x07,0xc6,0x90,0xbf,0x2b,0x05,0x01,0xb8,0xb1,0x0c,0x06,0xae,0x01,0x24,0x6f,0x94,0x42,0x80,0xb2,0x49,0xc4,0x33,0x80,0x1f,0x18,0x93,0xfc,0xa1,0x14,0x0e,0x02,0x9c,0x43,0xc3,0x07,0x81,0xfc,0x03,0xe2,0xc0,0x28,0x14,0x10,0x5e,0x3f,0x03,0xc0,0xcf,0xf8,0x10,0x0f,0xe5,0x56,0x03,0x05,0xf0,0x40,0x20,0x20,0xf2,0x42,0x0d,0xfd,0x72,0x30,0x0f,0xf8,0x7c,0x41,0xe3,0x80,0x10,0x0d,0x00,0x5c,0x4a,0xd1,0x87,0xf8,0x39,0xf5,0x5c,0x0c,0x0b,0xe0,0x1c,0x10,0x78,0xfc,0x02,0x04,0x20,0x1f,0xf7,0x0f,0x57,0x80,0x81,0x5e,0x13,0x83,0x01,0x1f,0x97,0xff,0xfe,0x03,0x2e,0x07,0x57,0x03,0x01,0xbf,0x1d,0x45,0x70,0x27,0xe4,0xff,0x8c,0x07,0xf5,0x83,0xe0,0xcf,0xe1,0x00,0xf6,0x10,0x8c,0x07,0xb1,0x07,0xc1,0xfc,0x63,0xe5,0xd2,0x07,0x8f,0x80,0x1a,0x21,0xe1,0xc0,0x71,0xe0,0x20,0xf1,0x24,0x88,0x34,0x62,0x00,0xe3,0x3f,0x8d,0xfe,0x81,0x80,0xc1,0xf8,0x5b,0xe2,0x0f,0x18,0xc7,0xf0,0x1e,0x50,0x35,0xa0,0xc8,0x3f,0x98,0x30,0x70,0x87,0x44,0x1e,0x21,0xe3,0xf8,0x02,0x4b,0xaf,0x01,0x81,0xb3,0xca,0x01,0x1c,0x25,0x94,0x01,0x04,0x58,0x8d,0x5c,0x0b,0xc6,0x08,0x10,0x78,0xc3,0x3f,0xf0,0x72,0x88,0x98,0x8b,0x89,0x55,0x82,0xc7,0x9b,0xe5,0x00,0x87,0x26,0xc4,0x46,0x20,0xf2,0xd1,0x87,0xc6,0x0c,0xdf,0x21,0x50,0x8a,0xc7,0x00,0x38,0x2e,0x04,0x42,0xaf,0x05,0x06,0x0a,0xb8,0x70,0x0f,0x91,0x80,0x5c,0x03,0xc5,0x30,0x84,0x6a,0xe1,0x40,0xf1,0x7b,0x0f,0x00,0x7a,0x24,0x21,0x07,0x94,0x33,0x09,0x57,0x8a,0x93,0x85,0xec,0x3e,0x00,0x79,0x0b,0x88,0x06,0x3c,0x3f,0xfc,0xa8,0x1e,0x21,0x91,0x76,0x90,0x90,0x40,0x03,0xe0,0xe0,0x78,0x3f,0xd5,0x58,0x0e,0x08,0x32,0x3f,0x88,0xa8,0x90,0x8c,0x25,0x30,0xbc,0x7f,0xb5,0x50,0x1b,0xe0,0x20,0x7f,0x92,0x33,0x88,0x97,0x4a,0x07,0x0c,0x9e,0x5f,0xeb,0xaa,0xf2,0x74,0x8d,0x17,0x80,0x06,0x29,0xf1,0xe0,0x71,0xfb,0xfd,0x71,0xd8,0xff,0xf8,0x21,0x71,0x04,0x87,0x01,0xc1,0xa1,0xff,0x83,0xe7,0xf0,0xff,0xc1,0x51,0xe4,0xdd,0x1b,0x07,0xc2,0x63,0xf6,0x0f,0x9f,0xeb,0x5f,0x02,0x77,0x8a,0xc4,0xa3,0x17,0xc8,0x44,0x8c,0x34,0x20,0x71,0xfe,0x99,0x04,0x88,0x40,0x01,0xc3,0x47,0xf0,0x93,0x0f,0xf4,0x28,0x0e,0x3a,0xad,0x50,0x39,0x30,0x1f,0x18,0x3d,0x0e,0x31,0xff,0x3d,0x0c,0x02,0xa8,0x03,0x20,0x01,0x7e,0x3f,0xf8,0x09,0x06,0x33,0xfe,0x1b,0x50,}; | ||||
| const uint8_t *_I_DFU_128x50[] = {_I_DFU_128x50_0}; | ||||
| 
 | ||||
| const uint8_t _I_Warning_30x23_0[] = {0x01,0x00,0x47,0x00,0x80,0x70,0x00,0x65,0xe0,0x80,0x80,0xc7,0xe1,0x03,0x01,0xaf,0xe2,0x0e,0x03,0x19,0xe4,0x3c,0x06,0xb3,0xe8,0xf8,0x0c,0x67,0xf3,0xf0,0x1a,0x60,0x27,0xf7,0xf1,0x50,0xcf,0xff,0xe0,0x34,0xf0,0x00,0xc6,0x03,0xf0,0x01,0x8c,0x0c,0x06,0x7f,0x80,0x18,0xc1,0xff,0x9f,0xff,0xfc,0x3c,0x06,0x7f,0xe0,0x58,0xc7,0xff,0xe0,0x31,0x00,0x88,0x00,0x67,0xff,0xe0,0x18,0xc7,0xc0,}; | ||||
| const uint8_t *_I_Warning_30x23[] = {_I_Warning_30x23_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonDown_7x4_0[] = {0x00,0x7F,0x3E,0x1C,0x08,}; | ||||
| const uint8_t *_I_ButtonDown_7x4[] = {_I_ButtonDown_7x4_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonRight_4x7_0[] = {0x00,0x01,0x03,0x07,0x0F,0x07,0x03,0x01,}; | ||||
| const uint8_t *_I_ButtonRight_4x7[] = {_I_ButtonRight_4x7_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonCenter_7x7_0[] = {0x00,0x1C,0x22,0x5D,0x5D,0x5D,0x22,0x1C,}; | ||||
| const uint8_t *_I_ButtonCenter_7x7[] = {_I_ButtonCenter_7x7_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonLeft_4x7_0[] = {0x00,0x08,0x0C,0x0E,0x0F,0x0E,0x0C,0x08,}; | ||||
| const uint8_t *_I_ButtonLeft_4x7[] = {_I_ButtonLeft_4x7_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonUp_7x4_0[] = {0x00,0x08,0x1C,0x3E,0x7F,}; | ||||
| const uint8_t *_I_ButtonUp_7x4[] = {_I_ButtonUp_7x4_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinOkay_41x43_0[] = {0x01,0x00,0xa0,0x00,0x00,0x0f,0x82,0x3e,0x05,0x38,0xf7,0x80,0x08,0x58,0x08,0x0c,0x02,0x0e,0x05,0x1b,0x00,0x08,0x63,0x00,0x21,0x88,0x00,0x86,0x40,0x02,0x18,0x40,0x08,0x68,0x00,0x21,0x82,0x06,0x88,0x0a,0xf0,0x21,0x39,0x09,0x84,0x02,0x20,0x57,0x09,0x98,0x15,0x67,0xc0,0x54,0xbe,0x81,0x4f,0x01,0xfe,0x02,0x9d,0x03,0xc4,0x20,0x10,0x29,0x7c,0x80,0xa9,0xfe,0x02,0xac,0x14,0x0a,0x77,0xc8,0x58,0x8c,0xf0,0x11,0x51,0x79,0xff,0x61,0x44,0x93,0x81,0x02,0xc4,0x9e,0x60,0xb2,0xf0,0xa0,0x46,0x0c,0x17,0x14,0x99,0x1a,0x07,0x80,0x59,0x49,0x82,0x21,0xc0,0xa4,0x82,0x24,0xb9,0x20,0x88,0x1c,0x47,0xc2,0x07,0x11,0x54,0xa0,0x60,0x53,0xb8,0x0a,0x4b,0xf3,0x03,0x87,0x81,0x4a,0x0d,0xfc,0x1a,0x98,0x68,0xb8,0x01,0x51,0x13,0x15,0xe0,0x82,0x7f,0x8d,0x78,0x38,0xbf,0xff,0xfa,0xb8,0x60,0xbf,0x1b,0xf9,0x50,0x14,0xea,0xe7,0x02,0x02,0x8e,0xac,0x94,0x40,}; | ||||
| const uint8_t *_I_DolphinOkay_41x43[] = {_I_DolphinOkay_41x43_0}; | ||||
| const uint8_t _I_DFU_128x50_0[] = {0x01,0x00,0x2e,0x02,0x00,0x57,0xfe,0x0e,0x0e,0xcf,0x84,0x02,0x70,0x0f,0xc8,0x74,0x03,0x80,0x0e,0xbc,0x7c,0x04,0x06,0x30,0x30,0x74,0xe0,0x2f,0xe0,0x42,0x82,0x03,0xe7,0x81,0xff,0x02,0x14,0x20,0x1f,0x3e,0x00,0x79,0xc4,0x01,0xfd,0x20,0x07,0xd5,0xd4,0xe2,0x53,0xf2,0x74,0xff,0xe1,0x40,0x41,0x87,0xd8,0x01,0xf1,0x60,0xf0,0x43,0xca,0x43,0xe0,0xa7,0x83,0xe2,0x30,0x01,0x29,0x84,0x7b,0x20,0x0f,0x88,0x30,0x3c,0xb1,0x90,0x1d,0x00,0xfa,0x30,0x3f,0xf8,0xcc,0x02,0xc6,0x31,0x1f,0x83,0x49,0xa8,0x16,0x0a,0xf4,0x7f,0x00,0x21,0x1f,0x04,0x38,0x06,0x20,0x04,0x90,0x46,0x35,0xf0,0xfa,0x00,0xcc,0x7f,0x10,0x14,0x0b,0x46,0x20,0xd5,0x70,0x50,0xb4,0x06,0xf1,0x00,0x9f,0x03,0xd7,0x09,0x81,0xd7,0xc0,0x8b,0x85,0x38,0xc0,0x50,0x41,0xeb,0x63,0xc0,0x07,0xc6,0x90,0xbf,0x2b,0x05,0x01,0xb8,0xb1,0x0c,0x06,0xae,0x01,0x24,0x6f,0x94,0x42,0x80,0xb2,0x49,0xc4,0x33,0x80,0x1f,0x18,0x93,0xfc,0xa1,0x14,0x0e,0x02,0x9c,0x43,0xc3,0x07,0x81,0xfc,0x03,0xe2,0xc0,0x28,0x14,0x10,0x5e,0x3f,0x03,0xc0,0xcf,0xf8,0x10,0x0f,0xe5,0x56,0x03,0x05,0xf0,0x40,0x20,0x20,0xf2,0x42,0x0d,0xfd,0x72,0x30,0x0f,0xf8,0x7c,0x41,0xe3,0x80,0x10,0x0d,0x00,0x5c,0x4a,0xd1,0x87,0xf8,0x39,0xf5,0x5c,0x0c,0x0b,0xe0,0x1c,0x10,0x78,0xfc,0x02,0x04,0x20,0x1f,0xf7,0x0f,0x57,0x80,0x81,0x5e,0x13,0x83,0x01,0x1f,0x97,0xff,0xfe,0x03,0x2e,0x07,0x57,0x03,0x01,0xbf,0x1d,0x45,0x70,0x27,0xe4,0xff,0x8c,0x07,0xf5,0x83,0xe0,0xcf,0xe1,0x00,0xf6,0x10,0x8c,0x07,0xb1,0x07,0xc1,0xfc,0x63,0xe5,0xd2,0x07,0x8f,0x80,0x1a,0x21,0xe1,0xc0,0x71,0xe0,0x20,0xf1,0x24,0x88,0x34,0x62,0x00,0xe3,0x3f,0x8d,0xfe,0x81,0x80,0xc1,0xf8,0x5b,0xe2,0x0f,0x18,0xc7,0xf0,0x1e,0x50,0x35,0xa0,0xc8,0x3f,0x98,0x30,0x70,0x87,0x44,0x1e,0x21,0xe3,0xf8,0x02,0x4b,0xaf,0x01,0x81,0xb3,0xca,0x01,0x1c,0x25,0x94,0x01,0x04,0x58,0x8d,0x5c,0x0b,0xc6,0x08,0x10,0x78,0xc3,0x3f,0xf0,0x72,0x88,0x98,0x8b,0x89,0x55,0x82,0xc7,0x9b,0xe5,0x00,0x87,0x26,0xc4,0x46,0x20,0xf2,0xd1,0x87,0xc6,0x0c,0xdf,0x21,0x50,0x8a,0xc7,0x00,0x38,0x2e,0x04,0x42,0xaf,0x05,0x06,0x0a,0xb8,0x70,0x0f,0x91,0x80,0x5c,0x03,0xc5,0x30,0x84,0x6a,0xe1,0x40,0xf1,0x7b,0x0f,0x00,0x7a,0x24,0x21,0x07,0x94,0x33,0x09,0x57,0x8a,0x93,0x85,0xec,0x3e,0x00,0x79,0x0b,0x88,0x06,0x3c,0x3f,0xfc,0xa8,0x1e,0x21,0x91,0x76,0x90,0x90,0x40,0x03,0xe0,0xe0,0x78,0x3f,0xd5,0x58,0x0e,0x08,0x32,0x3f,0x88,0xa8,0x90,0x8c,0x25,0x30,0xbc,0x7f,0xb5,0x50,0x1b,0xe0,0x20,0x7f,0x92,0x33,0x88,0x97,0x4a,0x07,0x0c,0x9e,0x5f,0xeb,0xaa,0xf2,0x74,0x8d,0x17,0x80,0x06,0x29,0xf1,0xe0,0x71,0xfb,0xfd,0x71,0xd8,0xff,0xf8,0x21,0x71,0x04,0x87,0x01,0xc1,0xa1,0xff,0x83,0xe7,0xf0,0xff,0xc1,0x51,0xe4,0xdd,0x1b,0x07,0xc2,0x63,0xf6,0x0f,0x9f,0xeb,0x5f,0x02,0x77,0x8a,0xc4,0xa3,0x17,0xc8,0x44,0x8c,0x34,0x20,0x71,0xfe,0x99,0x04,0x88,0x40,0x01,0xc3,0x47,0xf0,0x93,0x0f,0xf4,0x28,0x0e,0x3a,0xad,0x50,0x39,0x30,0x1f,0x18,0x3d,0x0e,0x31,0xff,0x3d,0x0c,0x02,0xa8,0x03,0x20,0x01,0x7e,0x3f,0xf8,0x09,0x06,0x33,0xfe,0x1b,0x50,}; | ||||
| const uint8_t *_I_DFU_128x50[] = {_I_DFU_128x50_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart4_67x53_0[] = {0x01,0x00,0x1f,0x01,0x00,0x17,0xc3,0xfe,0x08,0x68,0x74,0x02,0x0e,0x07,0x4c,0x04,0x06,0x01,0x18,0x04,0x25,0x00,0x04,0x36,0x00,0x42,0x48,0x02,0x88,0x00,0x28,0x80,0x0c,0xa0,0x40,0x83,0x84,0x00,0xca,0x08,0x08,0x30,0x21,0x83,0x0c,0x2c,0x81,0xe3,0x04,0x20,0xc0,0x80,0x02,0x31,0x32,0x11,0x02,0x27,0x00,0x5d,0x40,0x45,0x87,0x90,0x3e,0x7c,0x00,0x43,0x84,0x4e,0x60,0x43,0x30,0x89,0x82,0x12,0x80,0x15,0x20,0x40,0x99,0xc8,0x22,0x7b,0x88,0x10,0x20,0x82,0x27,0x7c,0x82,0x9d,0x48,0x22,0x5f,0x0d,0xfc,0x08,0x10,0x41,0x12,0xf8,0x57,0xc2,0x28,0x30,0x1e,0x07,0x9e,0x06,0x87,0x25,0x79,0xc4,0x20,0x40,0x83,0x21,0x14,0x22,0x08,0x08,0x38,0x2a,0xb8,0xd9,0x47,0x0a,0x14,0x09,0xf0,0x54,0x47,0x1f,0x81,0x82,0x1a,0xde,0x8e,0x33,0xd1,0xc7,0x81,0x0f,0x0e,0x45,0x18,0x20,0xa1,0xe6,0xf2,0x10,0x89,0xa0,0x70,0x11,0x00,0x41,0x46,0x03,0x86,0x55,0x10,0x40,0xc1,0x82,0x25,0x20,0x04,0x11,0x94,0x80,0x43,0x10,0x84,0x01,0x46,0xc0,0xbd,0x38,0x40,0x20,0x8f,0x49,0x08,0xc4,0x1c,0xc8,0x22,0x50,0x38,0x20,0x20,0x86,0xe4,0x83,0x10,0x41,0x8b,0x87,0xf9,0x03,0x81,0xc0,0x81,0x05,0x81,0xc0,0x40,0xf3,0x90,0x60,0x41,0x70,0x2c,0x17,0x01,0xc0,0xc1,0x41,0x05,0x30,0x98,0x43,0x04,0x65,0x01,0x04,0x0c,0x32,0x38,0x91,0x18,0x04,0x14,0x10,0x38,0x18,0x1e,0xac,0x7c,0x41,0x11,0x88,0x5f,0xfc,0x17,0x55,0xa9,0x82,0x06,0x05,0xbc,0x85,0x02,0x08,0xc6,0x32,0x0f,0xe5,0x5e,0x1a,0x08,0x5c,0x06,0xaa,0x34,0x08,0x4a,0x06,0x02,0xab,0x75,0xf0,0x4f,0xc1,0x05,0x80,0x08,0x8e,0xab,0x7f,0xea,0x04,0x11,0x80,0x6a,0xa0,0x02,0x03,0x08,}; | ||||
| const uint8_t *_I_DolphinFirstStart4_67x53[] = {_I_DolphinFirstStart4_67x53_0}; | ||||
| const uint8_t _I_ButtonLeftSmall_3x5_0[] = {0x00,0x04,0x06,0x07,0x06,0x04,}; | ||||
| const uint8_t *_I_ButtonLeftSmall_3x5[] = {_I_ButtonLeftSmall_3x5_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonRightSmall_3x5_0[] = {0x00,0x01,0x03,0x07,0x03,0x01,}; | ||||
| const uint8_t *_I_ButtonRightSmall_3x5[] = {_I_ButtonRightSmall_3x5_0}; | ||||
| 
 | ||||
| const uint8_t _I_ButtonRight_4x7_0[] = {0x00,0x01,0x03,0x07,0x0F,0x07,0x03,0x01,}; | ||||
| const uint8_t *_I_ButtonRight_4x7[] = {_I_ButtonRight_4x7_0}; | ||||
| 
 | ||||
| const uint8_t _I_Warning_30x23_0[] = {0x01,0x00,0x47,0x00,0x80,0x70,0x00,0x65,0xe0,0x80,0x80,0xc7,0xe1,0x03,0x01,0xaf,0xe2,0x0e,0x03,0x19,0xe4,0x3c,0x06,0xb3,0xe8,0xf8,0x0c,0x67,0xf3,0xf0,0x1a,0x60,0x27,0xf7,0xf1,0x50,0xcf,0xff,0xe0,0x34,0xf0,0x00,0xc6,0x03,0xf0,0x01,0x8c,0x0c,0x06,0x7f,0x80,0x18,0xc1,0xff,0x9f,0xff,0xfc,0x3c,0x06,0x7f,0xe0,0x58,0xc7,0xff,0xe0,0x31,0x00,0x88,0x00,0x67,0xff,0xe0,0x18,0xc7,0xc0,}; | ||||
| const uint8_t *_I_Warning_30x23[] = {_I_Warning_30x23_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart2_59x51_0[] = {0x01,0x00,0x2e,0x01,0x00,0x1f,0xfe,0x06,0x05,0x3f,0xc7,0xfe,0x01,0x1c,0x03,0x16,0x02,0xaf,0x0f,0x80,0x58,0x01,0xc7,0xaa,0x80,0x82,0xc4,0x0e,0x55,0x6b,0x28,0x10,0x81,0x45,0xab,0x8d,0x01,0xca,0x04,0x1a,0x1a,0xac,0x1c,0x0e,0x50,0x48,0x06,0xc0,0x3c,0x40,0x01,0x84,0x40,0x2b,0x15,0x51,0xd9,0xc4,0x20,0x1a,0xc9,0x50,0x1c,0xe4,0x02,0xe1,0x8a,0x81,0xd7,0x55,0x0a,0x03,0x9d,0x02,0x01,0x5c,0x82,0x81,0xd7,0xc0,0x3a,0x10,0x3a,0x12,0x88,0xc8,0x60,0x11,0x07,0xa0,0x1c,0x68,0x00,0xf6,0xe0,0x22,0x50,0x0e,0x36,0x00,0x7b,0x68,0x00,0x83,0xa0,0x11,0x08,0x1c,0x6a,0x03,0x42,0x44,0x1e,0xc0,0x28,0x50,0x61,0xf9,0x56,0x00,0xe3,0x60,0x40,0x88,0x1c,0x75,0x01,0x42,0x07,0x9d,0x50,0x5e,0x4b,0x01,0x37,0x8e,0xb0,0x0e,0x51,0xd8,0x04,0xc2,0x01,0xd4,0x5d,0x1c,0x02,0x30,0x7f,0x14,0x99,0x5c,0x20,0x11,0x48,0x07,0x58,0x0e,0x20,0x81,0xd0,0x23,0x04,0x1e,0x30,0x80,0x38,0xd4,0x11,0x82,0x0f,0x18,0x40,0xb0,0xb0,0x50,0x3d,0x58,0x1c,0x52,0x85,0xf1,0x83,0x75,0x58,0x64,0x49,0x1a,0xfc,0x17,0x57,0x01,0x88,0x25,0x0b,0x55,0x02,0xaa,0xc0,0x64,0x14,0x08,0x1e,0x02,0xaa,0x1f,0x18,0x0f,0x00,0xbe,0x20,0xf1,0x80,0x82,0x46,0x01,0x03,0x82,0xe0,0x04,0xa3,0xab,0x46,0x0e,0x32,0x15,0x80,0xb5,0x40,0x2a,0xa4,0x21,0x98,0x43,0x70,0x13,0x58,0x04,0xac,0xa4,0x3c,0x08,0xd6,0x02,0x35,0x00,0x8a,0xcd,0x06,0xa3,0x1d,0xa0,0x24,0x46,0x57,0xe8,0x26,0x8c,0xdb,0x80,0x84,0x18,0xad,0x42,0x07,0x5f,0xbf,0xb9,0x8a,0x17,0x80,0xff,0x6a,0xb0,0x46,0x91,0x07,0x88,0xc4,0x4a,0x43,0x1f,0x07,0x92,0xc4,0x49,0x82,0x9b,0x25,0x98,0xc0,0x28,0xa0,0x73,0x1f,0x0b,0x50,0x81,0xea,0x07,0x40,0x7b,0xac,0x44,0x0e,0xa0,}; | ||||
| const uint8_t *_I_DolphinFirstStart2_59x51[] = {_I_DolphinFirstStart2_59x51_0}; | ||||
| @ -91,110 +85,113 @@ const uint8_t *_I_DolphinFirstStart2_59x51[] = {_I_DolphinFirstStart2_59x51_0}; | ||||
| const uint8_t _I_DolphinFirstStart5_54x49_0[] = {0x01,0x00,0x0b,0x01,0x00,0x0f,0xf2,0xfe,0x06,0x48,0x1e,0x02,0x06,0x05,0x2e,0x00,0x08,0x61,0x80,0x62,0x98,0x00,0x86,0x20,0x06,0x28,0x40,0x08,0x64,0x00,0x62,0x82,0x00,0x86,0x80,0x06,0x28,0x14,0x72,0x01,0x80,0x03,0x14,0x06,0x44,0x03,0x20,0x49,0x00,0xc4,0x0c,0x61,0x13,0x81,0x07,0x90,0x0c,0xff,0xa8,0x18,0xcc,0xe0,0x10,0x78,0x60,0x18,0xc9,0xe3,0x10,0x03,0x0e,0x02,0x02,0x4f,0x19,0x00,0x18,0x78,0x10,0x12,0x78,0xc8,0x0a,0xc3,0xf8,0x80,0xc1,0x80,0xc5,0xe0,0xff,0x8f,0x47,0xe1,0x27,0x03,0x0d,0xfc,0x80,0x3b,0xc9,0x74,0x43,0x81,0x0f,0xb0,0x40,0x2b,0xd2,0xd3,0x71,0x07,0x87,0x5f,0x16,0x84,0x54,0x23,0xe3,0x21,0xab,0xc5,0x61,0x1a,0x82,0xf0,0xf0,0x35,0x70,0xa8,0x45,0x50,0x2a,0x3e,0x0a,0xac,0x1e,0x11,0x28,0x03,0x0f,0xc3,0xfe,0x06,0x19,0xa0,0x18,0x6f,0x9f,0x08,0x7c,0x22,0x30,0x06,0x1d,0xfc,0x3e,0x21,0x08,0x00,0x8f,0x01,0x7a,0x31,0x08,0x24,0x42,0x21,0xf0,0x5e,0x08,0x18,0x44,0xe3,0x0f,0x59,0x92,0xb4,0x96,0x66,0x06,0x58,0x10,0x19,0x60,0x20,0x64,0x46,0x08,0x19,0x27,0x00,0x65,0x9f,0x81,0x93,0xd1,0x2b,0x03,0x17,0x82,0x3f,0x50,0x9a,0x81,0x87,0x51,0x1e,0xf0,0x68,0x69,0x40,0x61,0xea,0x9d,0x86,0x1d,0x45,0x80,0x61,0x2d,0x48,0xc2,0x67,0x8d,0x12,0x3a,0x06,0x19,0x02,0x88,0x74,0x4b,0x21,0x03,0x1d,0x08,0xca,0x21,0x41,0x06,0x93,0xe8,0xa1,0x85,0x31,0xe9,0x24,0x48,0x20,0x30,0x1b,0x10,0x18,0x77,0x8f,0xa1,0x80,0xcc,0x40,0xc3,0x56,0x0b,0x8c,0x0a,0x22,0xba,0x12,0x88,0x81,0x84,}; | ||||
| const uint8_t *_I_DolphinFirstStart5_54x49[] = {_I_DolphinFirstStart5_54x49_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart0_70x53_0[] = {0x01,0x00,0x5a,0x01,0x80,0x60,0x3f,0xf7,0xf0,0x42,0xf8,0x01,0x43,0x07,0x04,0x24,0x72,0x01,0xc0,0x9d,0x82,0x13,0xff,0xff,0xbd,0x70,0x20,0x20,0x72,0xe0,0x40,0x2a,0x11,0xdb,0x00,0x6c,0xec,0x10,0x0d,0x44,0x3a,0x71,0x0e,0x04,0x14,0x42,0x01,0x54,0x86,0xd3,0x27,0x02,0x44,0xd4,0x41,0xb0,0xf2,0x10,0x42,0x55,0x38,0x71,0x1b,0x10,0x18,0xa0,0x41,0x11,0xb1,0xc8,0x28,0x98,0x09,0xfc,0x00,0x72,0x35,0x49,0x8d,0x0b,0xc1,0x70,0xf0,0x10,0x4b,0x51,0x11,0xc2,0x6c,0x0a,0xa3,0x03,0x80,0x7f,0xbf,0xf3,0x08,0x46,0x60,0x90,0x30,0x60,0x50,0xd8,0x2c,0x11,0x0c,0x71,0x5c,0x60,0xf8,0x0f,0xcf,0x3f,0x81,0x80,0xa1,0x9e,0x86,0x0f,0xc0,0x82,0x64,0x30,0x3e,0x09,0x84,0x03,0xf1,0x03,0xa0,0x40,0xa4,0x18,0x39,0xfc,0x20,0x52,0x30,0x19,0x07,0xc6,0x8e,0x4a,0x18,0x22,0x74,0x60,0x1a,0x0f,0xc6,0x3c,0x60,0x5c,0x05,0x28,0xe4,0x3f,0x99,0xf8,0x22,0x28,0x7e,0x05,0x91,0xa8,0x7f,0x23,0xf0,0x59,0x00,0xac,0x63,0xe0,0x81,0xcf,0x4f,0xe0,0xb1,0x81,0x58,0xc3,0xc1,0x08,0x24,0x1f,0xf9,0x68,0x6a,0x1f,0xe9,0xff,0x16,0x02,0x34,0x13,0x50,0x82,0x0a,0xea,0x60,0x1f,0xf9,0xf0,0x41,0x05,0x1d,0x30,0x09,0x18,0x60,0x15,0xa3,0xe8,0x83,0x47,0xe0,0xec,0x2c,0xaf,0xf2,0x0e,0x08,0x1f,0xc1,0x18,0x60,0x1a,0xaf,0xc2,0x6c,0x89,0x62,0x03,0x19,0xad,0xe5,0x70,0x44,0x62,0x80,0x5a,0xa1,0x4f,0x63,0x23,0x0c,0x7a,0xaa,0x4d,0x11,0xe9,0x00,0x06,0x73,0xaa,0x25,0x0a,0x78,0xaf,0x90,0x09,0x25,0x54,0x56,0x5f,0x04,0x30,0xc0,0x64,0x7a,0xa1,0x11,0x7e,0x20,0x18,0x0f,0x3c,0x82,0xaa,0x04,0x18,0x0d,0xf8,0x16,0x33,0xe8,0x84,0xa8,0x08,0x3c,0x33,0x00,0xf0,0x20,0x71,0x08,0xa9,0x38,0x86,0x62,0x62,0x18,0x40,0x44,0x80,0x09,0x04,0x08,0x90,0x01,0x20,0x41,0x17,0x22,0x90,0x01,0x3e,0x00,0x76,0x80,0x1d,0x48,0x00,0x8d,0x91,0x00,0x34,0xf8,0x20,0xe2,0xa7,0x9c,0x06,0x5c,0x11,0x02,0x28,0x5d,0x91,0x35,0x48,0xaf,0xf8,0x04,0x3f,0xf9,0x88,0x20,0x01,}; | ||||
| const uint8_t *_I_DolphinFirstStart0_70x53[] = {_I_DolphinFirstStart0_70x53_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart6_58x54_0[] = {0x01,0x00,0x21,0x01,0x00,0x0f,0xf2,0x7e,0x06,0x4c,0x04,0x0f,0x81,0x03,0x03,0x9d,0x80,0x04,0x30,0xc0,0x39,0xc6,0x00,0x43,0x30,0x03,0x9c,0x10,0x04,0x34,0x00,0x39,0xc0,0x84,0x44,0x07,0x38,0x08,0x0d,0x41,0x68,0x13,0x70,0x39,0x08,0xd0,0x56,0xa1,0xd1,0x03,0x94,0x80,0x04,0x30,0x68,0x04,0x20,0x0e,0x84,0x91,0x03,0xa9,0x64,0x62,0x80,0x41,0x88,0x40,0x3f,0xc6,0xf1,0xfe,0x43,0xc0,0xe3,0x80,0xff,0xff,0xe0,0x3f,0xf8,0xf8,0x1c,0x78,0x18,0x1f,0xfe,0x0f,0x02,0x12,0x18,0x47,0x03,0x82,0x10,0x1e,0x08,0x1c,0xf5,0x60,0x71,0xd4,0x81,0xcf,0xab,0xff,0xd5,0xf5,0xc0,0xe3,0x04,0xe0,0x03,0x86,0xae,0x27,0x28,0x27,0x40,0x0e,0x21,0x91,0x03,0x96,0x80,0x0e,0x34,0x18,0x79,0x28,0x60,0x95,0x00,0x38,0xf8,0x20,0x27,0xd1,0x82,0x6a,0x03,0xc3,0x1c,0x39,0x94,0x0a,0xa1,0xc0,0xc5,0x2f,0xca,0x05,0x02,0x90,0x24,0x56,0x04,0x68,0x10,0x01,0x4f,0x80,0xea,0x5b,0x10,0x38,0x83,0x8d,0xa0,0x30,0x30,0x38,0xa3,0x09,0xc0,0x20,0xf2,0x03,0x90,0xc0,0x46,0xe2,0x91,0x2f,0x80,0xfc,0xe0,0x1e,0x08,0x02,0x54,0x47,0x62,0x27,0x2f,0xfb,0x14,0xdc,0xc6,0xb5,0x30,0x38,0x8b,0x05,0x6a,0x60,0x01,0x89,0x00,0xc8,0x16,0x50,0x29,0x10,0x1c,0x8d,0x25,0x05,0xa1,0x15,0xc9,0xfe,0x50,0xaa,0x08,0x10,0x67,0x01,0x22,0x8a,0xe0,0x60,0xe5,0xf2,0x07,0x8e,0xa8,0xb0,0x49,0xe1,0x00,0x0d,0xd4,0x68,0x5a,0x00,0x39,0x46,0x88,0x84,0x07,0x30,0xe8,0x81,0xc6,0x40,0x4d,0x11,0x91,0x17,0x06,0x40,0x65,0x11,0x51,0x01,0xc6,0x81,0x04,0x32,0x18,0x1e,0x92,0x64,0x00,0x11,0x68,0x81,0xd6,0xa0,0x07,0x16,0x22,0x6b,0x0a,0x82,0x07,0x3f,0x05,0x4d,0xdc,0x24,0x21,}; | ||||
| const uint8_t *_I_DolphinFirstStart6_58x54[] = {_I_DolphinFirstStart6_58x54_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart1_59x53_0[] = {0x01,0x00,0x1e,0x01,0x00,0x0e,0x03,0xfe,0x07,0x5b,0x84,0x02,0x06,0x07,0x48,0x64,0x02,0x08,0x07,0x48,0x14,0x02,0x10,0x07,0x48,0x0c,0x03,0x21,0x3f,0x13,0x18,0x84,0xa8,0x00,0x75,0x8c,0x00,0xca,0x00,0x0b,0x28,0x20,0x1d,0xa0,0x59,0xe0,0x39,0x48,0x07,0x03,0x81,0xd5,0x81,0xd6,0x81,0x55,0x8c,0x01,0xc6,0x21,0x00,0x87,0x68,0x25,0x52,0x40,0x39,0x7c,0x21,0xf5,0x08,0xa8,0x1d,0x20,0xfa,0x88,0x70,0x1c,0xfd,0x10,0x3a,0xa4,0x1f,0x88,0x54,0x18,0x85,0x52,0x09,0xbe,0x81,0xc1,0x0c,0x83,0x10,0x94,0x40,0x39,0xf0,0x19,0x21,0xc8,0x62,0x12,0x0c,0x04,0x0e,0x0c,0x07,0x38,0x07,0x86,0x07,0x18,0x03,0x94,0xc2,0x01,0x9e,0x81,0xca,0x38,0x89,0x21,0x0f,0x0c,0x03,0xf9,0x27,0x13,0x94,0xd0,0xb6,0x70,0x20,0x38,0xda,0x80,0xe5,0x10,0x03,0x95,0x59,0x54,0x70,0x10,0x38,0xda,0xc0,0xc3,0xfe,0xc1,0xab,0x0b,0xaa,0x2a,0x1c,0x05,0x81,0x58,0x38,0x09,0xd0,0x5c,0xa3,0xe0,0x72,0x86,0xae,0x8d,0x40,0x34,0x06,0xa1,0xc0,0xc0,0xe3,0xc0,0x65,0x1c,0x19,0x58,0x29,0xe1,0x00,0x14,0x28,0x0a,0x26,0x61,0x00,0x15,0x58,0x0a,0x2e,0x34,0xd6,0x42,0x9e,0x6b,0x54,0x82,0x92,0x08,0x1e,0x63,0x41,0x1d,0x0a,0x88,0x60,0x1d,0x42,0x11,0x5c,0x01,0xe5,0x3c,0x03,0x97,0x30,0x0e,0x42,0x42,0x80,0xd0,0x82,0xe4,0x07,0x28,0x17,0x10,0x1e,0xb0,0x4a,0x20,0x3d,0x61,0x1a,0x80,0x79,0x0f,0x0a,0x21,0x70,0x07,0x90,0x1c,0xa4,0x1a,0x00,0x7a,0xd0,0x0e,0x42,0x34,0x20,0x10,0xe0,0x00,0xed,0x00,0xa1,0x82,0xc8,0xc6,0x74,0x40,0xd9,0x01,0xce,0x84,0x07,0x69,0x10,0xcc,0x80,0xe7,0x5c,0x03,0xb4,0xa8,0x96,0x40,0x73,0x8a,0x96,0xc8,0x0c,0x40,}; | ||||
| const uint8_t *_I_DolphinFirstStart1_59x53[] = {_I_DolphinFirstStart1_59x53_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart8_56x51_0[] = {0x01,0x00,0xfd,0x00,0x00,0x17,0x83,0xff,0x01,0x03,0x1c,0x72,0x01,0x06,0x03,0x1c,0x0e,0x01,0x18,0x02,0x96,0x00,0x04,0x36,0x00,0x31,0x50,0x01,0x24,0x1c,0x29,0x00,0x28,0xa0,0x40,0x21,0x88,0x01,0x8a,0x08,0x02,0x18,0x40,0x18,0x80,0x64,0x09,0x20,0x89,0x81,0x98,0x3c,0x42,0x63,0x03,0x30,0xcc,0x70,0x10,0x71,0xd9,0x01,0x86,0xc1,0x1c,0x03,0x24,0x42,0x7e,0x50,0x12,0x91,0x62,0x2f,0xf8,0x0e,0x00,0x18,0xb9,0x17,0x1c,0x04,0x83,0x02,0x06,0x1e,0x27,0xc4,0x54,0x20,0x62,0xf2,0x7c,0xe0,0x52,0x0c,0x10,0x88,0x7c,0x9f,0xf8,0x28,0x18,0x41,0xa5,0xff,0x85,0x48,0x30,0x80,0xd1,0xe4,0x5f,0xc1,0xa3,0x84,0x26,0x0f,0x23,0xfe,0x1b,0x18,0x44,0x16,0x01,0x90,0x81,0xc1,0x62,0x10,0x84,0xc0,0xf8,0x20,0x30,0x28,0x84,0x40,0x1a,0x25,0x11,0x82,0x42,0x22,0x11,0xf4,0xd9,0xc1,0x02,0x22,0xb2,0x38,0x14,0xc1,0x8e,0x90,0x14,0xc1,0xa2,0x86,0x02,0xc6,0x30,0x31,0x06,0x8c,0x0c,0x26,0x02,0x56,0x9d,0x04,0x0c,0x6a,0xa1,0x03,0x21,0x20,0x68,0x5f,0xe7,0xa9,0x00,0x86,0x85,0x01,0x8f,0xe0,0x08,0xe3,0x00,0xe1,0x02,0xc6,0xfe,0x16,0x23,0xe1,0x13,0x10,0xa4,0x82,0xb1,0x12,0x88,0x00,0xf0,0x91,0xe0,0x6a,0xfd,0x63,0xfc,0x08,0x78,0x18,0xb5,0x5e,0xad,0xfb,0x84,0xa0,0x95,0x48,0xad,0x54,0x4a,0x50,0x4d,0x44,0x6b,0x56,0x0d,0x28,0x45,0x42,0x6a,0x0d,0x38,0x46,0x02,0x55,0xaa,0x35,0x25,0x52,0xac,0x06,0x4b,0x04,0xa8,0x0c,0x94,0x03,0xa0,0x80,0x04,}; | ||||
| const uint8_t *_I_DolphinFirstStart8_56x51[] = {_I_DolphinFirstStart8_56x51_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart7_61x51_0[] = {0x01,0x00,0x13,0x01,0x00,0x17,0x03,0xff,0x01,0x03,0xa4,0xe2,0x01,0x0e,0x03,0xa4,0x1a,0x01,0x30,0x03,0x1e,0x00,0x2a,0x3c,0x00,0x39,0xd0,0x00,0x65,0x03,0x01,0x94,0x80,0x06,0x50,0x40,0x19,0x44,0x00,0x65,0x08,0x01,0xb0,0x2c,0xe2,0x81,0xb6,0x86,0x0a,0xd8,0x7c,0x20,0x75,0x85,0x10,0xcc,0x06,0x50,0x50,0x3b,0x10,0xce,0x00,0x69,0x20,0x79,0x7c,0x20,0x20,0x71,0xc0,0x07,0xca,0xf1,0x02,0x81,0x01,0xc6,0x3a,0x07,0x1f,0xe4,0x10,0x0e,0x53,0xe0,0x38,0xe7,0xa0,0xa0,0x72,0xbb,0x81,0xca,0x12,0x68,0x1c,0x05,0x5c,0x0e,0x3f,0xe8,0xc8,0x1c,0xab,0xe0,0x72,0x94,0x81,0xda,0xb2,0x07,0x5f,0xe0,0x3d,0xbf,0x95,0x44,0x20,0x81,0xce,0xf1,0x2f,0x03,0x94,0xb8,0xae,0x51,0x00,0x39,0x47,0x60,0xd0,0x84,0x70,0x81,0xcb,0x44,0x9d,0x10,0x3a,0x58,0xce,0xe6,0x07,0x29,0x10,0x18,0xa0,0x50,0x88,0x76,0x02,0x22,0x07,0x49,0x8e,0x02,0x24,0x07,0x4e,0x0e,0x02,0x12,0x96,0x38,0x44,0x07,0x02,0x8f,0x1c,0x07,0x1c,0x4e,0x30,0x1c,0x10,0x3c,0x6c,0x13,0x80,0x38,0xc0,0xb0,0x80,0xf1,0x6e,0x90,0x1c,0x71,0x10,0xd7,0x49,0x81,0xc7,0x20,0x0f,0x17,0xe9,0x42,0x20,0x91,0x09,0xeb,0x24,0xe2,0x10,0x49,0x07,0x6f,0xff,0x80,0x56,0x88,0x1c,0xa2,0xae,0xd1,0x66,0x89,0xe0,0x68,0x11,0xb8,0x06,0xc0,0x2e,0x40,0x71,0x9a,0xc0,0x2b,0x00,0x73,0xc0,0x7a,0xe0,0x09,0x12,0x03,0x95,0x57,0xff,0x17,0x03,0x9c,0x03,0x57,0xaa,0x78,0x94,0x40,0xa6,0x35,0x5a,0xac,0x14,0x0e,0x9a,0xad,0x50,0xf8,0x41,0x05,0x00,0x83,0x55,0x14,0x06,0x07,0x18,0x54,0xa0,0x0e,0xb0,0x60,0x31,0xc0,0x00,}; | ||||
| const uint8_t *_I_DolphinFirstStart7_61x51[] = {_I_DolphinFirstStart7_61x51_0}; | ||||
| 
 | ||||
| const uint8_t _I_Flipper_young_80x60_0[] = {0x01,0x00,0xa3,0x01,0x00,0x1e,0x03,0xff,0xff,0x87,0x82,0x57,0xf1,0x83,0x90,0xde,0x01,0x2b,0x0e,0x83,0x70,0xfb,0x10,0x10,0x41,0xf8,0x27,0x70,0xcc,0x34,0xc6,0x0e,0x09,0x3e,0x04,0x86,0x21,0x0c,0x90,0xc3,0x03,0xa9,0xe7,0xb0,0x46,0x2c,0x51,0x40,0x4a,0x63,0x38,0x31,0x0a,0x34,0x90,0x12,0x91,0x8e,0x3c,0xff,0x89,0x4c,0x04,0xa4,0x43,0xfd,0xf3,0xc3,0xf2,0x01,0x29,0xe0,0x2b,0x8e,0x72,0xa0,0x46,0x4b,0xe0,0x30,0xba,0x10,0x22,0xca,0x1c,0x0b,0x26,0x09,0x3c,0x04,0x0c,0x08,0x59,0xc8,0x21,0x64,0xc4,0x47,0x98,0x82,0x81,0x0a,0xe0,0x21,0x39,0x04,0x34,0x88,0x60,0x93,0xa0,0x45,0x4b,0x06,0xa3,0x40,0x48,0xfc,0x20,0xf0,0x82,0xa2,0x4d,0x60,0x11,0xe9,0xc2,0x19,0x64,0xd0,0x08,0x1f,0x80,0x7e,0x60,0x01,0x92,0x60,0x20,0x38,0x05,0x21,0x7c,0x3f,0xf0,0x1a,0xe6,0x00,0xe6,0x21,0x32,0x1a,0x0c,0x0e,0x91,0x80,0x8f,0xc0,0x06,0x25,0xcc,0xbf,0xc1,0xaa,0x10,0x0b,0xfc,0x02,0x60,0x2e,0x2c,0x04,0x32,0xc1,0x00,0xff,0x40,0x68,0x00,0x91,0x89,0xc0,0x21,0x20,0x51,0xfe,0x41,0xf0,0x00,0x91,0xc4,0xcf,0xe2,0x40,0x51,0xfc,0x0c,0x86,0x07,0x80,0xe2,0xdf,0xda,0x25,0xf0,0x9f,0xc0,0x21,0x98,0x0f,0x27,0xfd,0xa2,0x5e,0x01,0x90,0xc4,0x30,0x1e,0x2f,0xfc,0xa1,0x3a,0x45,0x41,0xb0,0x60,0x3e,0x5e,0x79,0x4a,0x10,0xbf,0xe2,0x61,0xc0,0x82,0x52,0x01,0xff,0x36,0x8e,0x3b,0xe5,0xff,0x04,0x9f,0xf8,0x78,0x3b,0x8f,0x97,0xf8,0x12,0x7f,0xc3,0x78,0xf8,0x3e,0x5f,0xc0,0x49,0xfe,0x08,0xc2,0x17,0x1f,0xcd,0xa5,0xac,0x5f,0x02,0x30,0xc0,0x30,0x5f,0xfd,0x23,0xbc,0xbc,0x1f,0xf0,0xc1,0x5f,0xaa,0x8e,0x52,0x28,0x10,0x10,0x6f,0x1b,0x28,0x57,0x81,0x66,0x25,0x01,0x80,0x4e,0x28,0x15,0x98,0xad,0xc3,0xfd,0xff,0xff,0x91,0x87,0xc1,0x80,0xd4,0xc2,0xb2,0x03,0xb1,0x5b,0x13,0x34,0x6a,0xf1,0x58,0x84,0x0e,0x1d,0x00,0x23,0x14,0x0f,0x55,0x0a,0x88,0x67,0x0d,0x83,0x7c,0x04,0x8c,0x0a,0xa9,0x15,0x90,0x7c,0x07,0x23,0xf8,0x80,0xc1,0xa0,0xda,0x88,0x54,0x82,0x00,0x2f,0x1f,0xe4,0x3c,0x7a,0x35,0x08,0xab,0x20,0x7f,0x03,0xc1,0x2d,0x96,0x82,0x14,0xce,0x20,0x02,0x04,0xc6,0x00,0x60,0x20,0x01,0x84,0xc4,0x6a,0x21,0x36,0x3b,0x8c,0xf0,0x3c,0xc8,0x02,0x1b,0x88,0x01,0xe1,0x80,0x98,0x2d,0x10,0x01,0xb0,0x05,0xa1,0x00,0x3d,0xf8,0x13,0x17,0x81,0x47,0x80,0x0b,0xc0,0x28,0x8e,0x02,0xa4,0x81,0x2c,0xf0,0x20,0x01,0x00,}; | ||||
| const uint8_t *_I_Flipper_young_80x60[] = {_I_Flipper_young_80x60_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart8_56x51_0[] = {0x01,0x00,0xfd,0x00,0x00,0x17,0x83,0xff,0x01,0x03,0x1c,0x72,0x01,0x06,0x03,0x1c,0x0e,0x01,0x18,0x02,0x96,0x00,0x04,0x36,0x00,0x31,0x50,0x01,0x24,0x1c,0x29,0x00,0x28,0xa0,0x40,0x21,0x88,0x01,0x8a,0x08,0x02,0x18,0x40,0x18,0x80,0x64,0x09,0x20,0x89,0x81,0x98,0x3c,0x42,0x63,0x03,0x30,0xcc,0x70,0x10,0x71,0xd9,0x01,0x86,0xc1,0x1c,0x03,0x24,0x42,0x7e,0x50,0x12,0x91,0x62,0x2f,0xf8,0x0e,0x00,0x18,0xb9,0x17,0x1c,0x04,0x83,0x02,0x06,0x1e,0x27,0xc4,0x54,0x20,0x62,0xf2,0x7c,0xe0,0x52,0x0c,0x10,0x88,0x7c,0x9f,0xf8,0x28,0x18,0x41,0xa5,0xff,0x85,0x48,0x30,0x80,0xd1,0xe4,0x5f,0xc1,0xa3,0x84,0x26,0x0f,0x23,0xfe,0x1b,0x18,0x44,0x16,0x01,0x90,0x81,0xc1,0x62,0x10,0x84,0xc0,0xf8,0x20,0x30,0x28,0x84,0x40,0x1a,0x25,0x11,0x82,0x42,0x22,0x11,0xf4,0xd9,0xc1,0x02,0x22,0xb2,0x38,0x14,0xc1,0x8e,0x90,0x14,0xc1,0xa2,0x86,0x02,0xc6,0x30,0x31,0x06,0x8c,0x0c,0x26,0x02,0x56,0x9d,0x04,0x0c,0x6a,0xa1,0x03,0x21,0x20,0x68,0x5f,0xe7,0xa9,0x00,0x86,0x85,0x01,0x8f,0xe0,0x08,0xe3,0x00,0xe1,0x02,0xc6,0xfe,0x16,0x23,0xe1,0x13,0x10,0xa4,0x82,0xb1,0x12,0x88,0x00,0xf0,0x91,0xe0,0x6a,0xfd,0x63,0xfc,0x08,0x78,0x18,0xb5,0x5e,0xad,0xfb,0x84,0xa0,0x95,0x48,0xad,0x54,0x4a,0x50,0x4d,0x44,0x6b,0x56,0x0d,0x28,0x45,0x42,0x6a,0x0d,0x38,0x46,0x02,0x55,0xaa,0x35,0x25,0x52,0xac,0x06,0x4b,0x04,0xa8,0x0c,0x94,0x03,0xa0,0x80,0x04,}; | ||||
| const uint8_t *_I_DolphinFirstStart8_56x51[] = {_I_DolphinFirstStart8_56x51_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart1_59x53_0[] = {0x01,0x00,0x1e,0x01,0x00,0x0e,0x03,0xfe,0x07,0x5b,0x84,0x02,0x06,0x07,0x48,0x64,0x02,0x08,0x07,0x48,0x14,0x02,0x10,0x07,0x48,0x0c,0x03,0x21,0x3f,0x13,0x18,0x84,0xa8,0x00,0x75,0x8c,0x00,0xca,0x00,0x0b,0x28,0x20,0x1d,0xa0,0x59,0xe0,0x39,0x48,0x07,0x03,0x81,0xd5,0x81,0xd6,0x81,0x55,0x8c,0x01,0xc6,0x21,0x00,0x87,0x68,0x25,0x52,0x40,0x39,0x7c,0x21,0xf5,0x08,0xa8,0x1d,0x20,0xfa,0x88,0x70,0x1c,0xfd,0x10,0x3a,0xa4,0x1f,0x88,0x54,0x18,0x85,0x52,0x09,0xbe,0x81,0xc1,0x0c,0x83,0x10,0x94,0x40,0x39,0xf0,0x19,0x21,0xc8,0x62,0x12,0x0c,0x04,0x0e,0x0c,0x07,0x38,0x07,0x86,0x07,0x18,0x03,0x94,0xc2,0x01,0x9e,0x81,0xca,0x38,0x89,0x21,0x0f,0x0c,0x03,0xf9,0x27,0x13,0x94,0xd0,0xb6,0x70,0x20,0x38,0xda,0x80,0xe5,0x10,0x03,0x95,0x59,0x54,0x70,0x10,0x38,0xda,0xc0,0xc3,0xfe,0xc1,0xab,0x0b,0xaa,0x2a,0x1c,0x05,0x81,0x58,0x38,0x09,0xd0,0x5c,0xa3,0xe0,0x72,0x86,0xae,0x8d,0x40,0x34,0x06,0xa1,0xc0,0xc0,0xe3,0xc0,0x65,0x1c,0x19,0x58,0x29,0xe1,0x00,0x14,0x28,0x0a,0x26,0x61,0x00,0x15,0x58,0x0a,0x2e,0x34,0xd6,0x42,0x9e,0x6b,0x54,0x82,0x92,0x08,0x1e,0x63,0x41,0x1d,0x0a,0x88,0x60,0x1d,0x42,0x11,0x5c,0x01,0xe5,0x3c,0x03,0x97,0x30,0x0e,0x42,0x42,0x80,0xd0,0x82,0xe4,0x07,0x28,0x17,0x10,0x1e,0xb0,0x4a,0x20,0x3d,0x61,0x1a,0x80,0x79,0x0f,0x0a,0x21,0x70,0x07,0x90,0x1c,0xa4,0x1a,0x00,0x7a,0xd0,0x0e,0x42,0x34,0x20,0x10,0xe0,0x00,0xed,0x00,0xa1,0x82,0xc8,0xc6,0x74,0x40,0xd9,0x01,0xce,0x84,0x07,0x69,0x10,0xcc,0x80,0xe7,0x5c,0x03,0xb4,0xa8,0x96,0x40,0x73,0x8a,0x96,0xc8,0x0c,0x40,}; | ||||
| const uint8_t *_I_DolphinFirstStart1_59x53[] = {_I_DolphinFirstStart1_59x53_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinOkay_41x43_0[] = {0x01,0x00,0xa0,0x00,0x00,0x0f,0x82,0x3e,0x05,0x38,0xf7,0x80,0x08,0x58,0x08,0x0c,0x02,0x0e,0x05,0x1b,0x00,0x08,0x63,0x00,0x21,0x88,0x00,0x86,0x40,0x02,0x18,0x40,0x08,0x68,0x00,0x21,0x82,0x06,0x88,0x0a,0xf0,0x21,0x39,0x09,0x84,0x02,0x20,0x57,0x09,0x98,0x15,0x67,0xc0,0x54,0xbe,0x81,0x4f,0x01,0xfe,0x02,0x9d,0x03,0xc4,0x20,0x10,0x29,0x7c,0x80,0xa9,0xfe,0x02,0xac,0x14,0x0a,0x77,0xc8,0x58,0x8c,0xf0,0x11,0x51,0x79,0xff,0x61,0x44,0x93,0x81,0x02,0xc4,0x9e,0x60,0xb2,0xf0,0xa0,0x46,0x0c,0x17,0x14,0x99,0x1a,0x07,0x80,0x59,0x49,0x82,0x21,0xc0,0xa4,0x82,0x24,0xb9,0x20,0x88,0x1c,0x47,0xc2,0x07,0x11,0x54,0xa0,0x60,0x53,0xb8,0x0a,0x4b,0xf3,0x03,0x87,0x81,0x4a,0x0d,0xfc,0x1a,0x98,0x68,0xb8,0x01,0x51,0x13,0x15,0xe0,0x82,0x7f,0x8d,0x78,0x38,0xbf,0xff,0xfa,0xb8,0x60,0xbf,0x1b,0xf9,0x50,0x14,0xea,0xe7,0x02,0x02,0x8e,0xac,0x94,0x40,}; | ||||
| const uint8_t *_I_DolphinOkay_41x43[] = {_I_DolphinOkay_41x43_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart3_57x48_0[] = {0x01,0x00,0x12,0x01,0x00,0x16,0x03,0xff,0x07,0x03,0xa5,0x82,0x01,0x38,0x03,0xa4,0x62,0x01,0xc0,0x03,0xa4,0x10,0x04,0x30,0x10,0x39,0xc0,0x80,0x48,0x0c,0x40,0x91,0x7e,0x20,0x60,0x72,0x84,0x02,0x8b,0x78,0x12,0x28,0x80,0x68,0x85,0x87,0x20,0x11,0x18,0x5c,0x80,0xe8,0x01,0x19,0xc5,0x00,0x0e,0x62,0xc1,0x9f,0x01,0xcb,0xe9,0x03,0x84,0x60,0x20,0xf8,0x00,0x38,0xd7,0x21,0xb1,0x0f,0x04,0x04,0x0e,0x5a,0x89,0xd4,0x83,0xc0,0x4b,0x3a,0xc5,0x54,0xcc,0x20,0x51,0x00,0x8e,0xc3,0x54,0x80,0x13,0xf8,0x81,0xc6,0xc1,0x55,0x01,0x8c,0x78,0x0e,0x30,0xee,0x06,0xaa,0x05,0xe0,0xae,0x01,0xc6,0x23,0x80,0xaa,0xc1,0x60,0x1a,0x90,0x38,0xc8,0x60,0x1a,0xb8,0x54,0x02,0xad,0x07,0x80,0xd0,0x40,0x83,0x15,0x80,0x7b,0x21,0x10,0x1c,0x0c,0x03,0x7f,0x2a,0x80,0x4d,0x00,0xe3,0x01,0xf8,0xf0,0x2a,0xf0,0x08,0x60,0x1c,0x60,0x41,0xd1,0xdf,0x1a,0x44,0x0e,0x50,0x68,0x05,0xe3,0x07,0x02,0x82,0x01,0xc6,0x19,0x00,0xf8,0x5f,0xe0,0x20,0x72,0xfa,0x40,0x7f,0xc2,0xb1,0x03,0x88,0x68,0x7f,0xf6,0xb4,0x28,0xc0,0x80,0xe3,0x88,0xaa,0xc7,0x40,0xe9,0x50,0xd5,0x41,0x94,0xa2,0x07,0x29,0x87,0x52,0x02,0x07,0x12,0x30,0xc1,0x22,0x16,0x86,0x29,0x01,0xca,0x30,0xf6,0x10,0x39,0xc2,0x23,0x10,0x6c,0x00,0x1d,0x3d,0x10,0x1b,0x02,0xe0,0x41,0x03,0x08,0x75,0x0c,0x60,0x0e,0x4f,0x11,0x0a,0x0c,0x18,0x0e,0x96,0x06,0x28,0x81,0xd3,0x01,0x1f,0x01,0x90,0x1c,0xdc,0xc2,0x01,0x15,0xd0,0x81,0xdc,0x4c,0x30,0x30,0x3f,0x00,0xc4,0x0e,0x30,0x20,0x3c,0x8c,0xc8,0x0f,0x2b,0x41,}; | ||||
| const uint8_t *_I_DolphinFirstStart3_57x48[] = {_I_DolphinFirstStart3_57x48_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart7_61x51_0[] = {0x01,0x00,0x13,0x01,0x00,0x17,0x03,0xff,0x01,0x03,0xa4,0xe2,0x01,0x0e,0x03,0xa4,0x1a,0x01,0x30,0x03,0x1e,0x00,0x2a,0x3c,0x00,0x39,0xd0,0x00,0x65,0x03,0x01,0x94,0x80,0x06,0x50,0x40,0x19,0x44,0x00,0x65,0x08,0x01,0xb0,0x2c,0xe2,0x81,0xb6,0x86,0x0a,0xd8,0x7c,0x20,0x75,0x85,0x10,0xcc,0x06,0x50,0x50,0x3b,0x10,0xce,0x00,0x69,0x20,0x79,0x7c,0x20,0x20,0x71,0xc0,0x07,0xca,0xf1,0x02,0x81,0x01,0xc6,0x3a,0x07,0x1f,0xe4,0x10,0x0e,0x53,0xe0,0x38,0xe7,0xa0,0xa0,0x72,0xbb,0x81,0xca,0x12,0x68,0x1c,0x05,0x5c,0x0e,0x3f,0xe8,0xc8,0x1c,0xab,0xe0,0x72,0x94,0x81,0xda,0xb2,0x07,0x5f,0xe0,0x3d,0xbf,0x95,0x44,0x20,0x81,0xce,0xf1,0x2f,0x03,0x94,0xb8,0xae,0x51,0x00,0x39,0x47,0x60,0xd0,0x84,0x70,0x81,0xcb,0x44,0x9d,0x10,0x3a,0x58,0xce,0xe6,0x07,0x29,0x10,0x18,0xa0,0x50,0x88,0x76,0x02,0x22,0x07,0x49,0x8e,0x02,0x24,0x07,0x4e,0x0e,0x02,0x12,0x96,0x38,0x44,0x07,0x02,0x8f,0x1c,0x07,0x1c,0x4e,0x30,0x1c,0x10,0x3c,0x6c,0x13,0x80,0x38,0xc0,0xb0,0x80,0xf1,0x6e,0x90,0x1c,0x71,0x10,0xd7,0x49,0x81,0xc7,0x20,0x0f,0x17,0xe9,0x42,0x20,0x91,0x09,0xeb,0x24,0xe2,0x10,0x49,0x07,0x6f,0xff,0x80,0x56,0x88,0x1c,0xa2,0xae,0xd1,0x66,0x89,0xe0,0x68,0x11,0xb8,0x06,0xc0,0x2e,0x40,0x71,0x9a,0xc0,0x2b,0x00,0x73,0xc0,0x7a,0xe0,0x09,0x12,0x03,0x95,0x57,0xff,0x17,0x03,0x9c,0x03,0x57,0xaa,0x78,0x94,0x40,0xa6,0x35,0x5a,0xac,0x14,0x0e,0x9a,0xad,0x50,0xf8,0x41,0x05,0x00,0x83,0x55,0x14,0x06,0x07,0x18,0x54,0xa0,0x0e,0xb0,0x60,0x31,0xc0,0x00,}; | ||||
| const uint8_t *_I_DolphinFirstStart7_61x51[] = {_I_DolphinFirstStart7_61x51_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart0_70x53_0[] = {0x01,0x00,0x5a,0x01,0x80,0x60,0x3f,0xf7,0xf0,0x42,0xf8,0x01,0x43,0x07,0x04,0x24,0x72,0x01,0xc0,0x9d,0x82,0x13,0xff,0xff,0xbd,0x70,0x20,0x20,0x72,0xe0,0x40,0x2a,0x11,0xdb,0x00,0x6c,0xec,0x10,0x0d,0x44,0x3a,0x71,0x0e,0x04,0x14,0x42,0x01,0x54,0x86,0xd3,0x27,0x02,0x44,0xd4,0x41,0xb0,0xf2,0x10,0x42,0x55,0x38,0x71,0x1b,0x10,0x18,0xa0,0x41,0x11,0xb1,0xc8,0x28,0x98,0x09,0xfc,0x00,0x72,0x35,0x49,0x8d,0x0b,0xc1,0x70,0xf0,0x10,0x4b,0x51,0x11,0xc2,0x6c,0x0a,0xa3,0x03,0x80,0x7f,0xbf,0xf3,0x08,0x46,0x60,0x90,0x30,0x60,0x50,0xd8,0x2c,0x11,0x0c,0x71,0x5c,0x60,0xf8,0x0f,0xcf,0x3f,0x81,0x80,0xa1,0x9e,0x86,0x0f,0xc0,0x82,0x64,0x30,0x3e,0x09,0x84,0x03,0xf1,0x03,0xa0,0x40,0xa4,0x18,0x39,0xfc,0x20,0x52,0x30,0x19,0x07,0xc6,0x8e,0x4a,0x18,0x22,0x74,0x60,0x1a,0x0f,0xc6,0x3c,0x60,0x5c,0x05,0x28,0xe4,0x3f,0x99,0xf8,0x22,0x28,0x7e,0x05,0x91,0xa8,0x7f,0x23,0xf0,0x59,0x00,0xac,0x63,0xe0,0x81,0xcf,0x4f,0xe0,0xb1,0x81,0x58,0xc3,0xc1,0x08,0x24,0x1f,0xf9,0x68,0x6a,0x1f,0xe9,0xff,0x16,0x02,0x34,0x13,0x50,0x82,0x0a,0xea,0x60,0x1f,0xf9,0xf0,0x41,0x05,0x1d,0x30,0x09,0x18,0x60,0x15,0xa3,0xe8,0x83,0x47,0xe0,0xec,0x2c,0xaf,0xf2,0x0e,0x08,0x1f,0xc1,0x18,0x60,0x1a,0xaf,0xc2,0x6c,0x89,0x62,0x03,0x19,0xad,0xe5,0x70,0x44,0x62,0x80,0x5a,0xa1,0x4f,0x63,0x23,0x0c,0x7a,0xaa,0x4d,0x11,0xe9,0x00,0x06,0x73,0xaa,0x25,0x0a,0x78,0xaf,0x90,0x09,0x25,0x54,0x56,0x5f,0x04,0x30,0xc0,0x64,0x7a,0xa1,0x11,0x7e,0x20,0x18,0x0f,0x3c,0x82,0xaa,0x04,0x18,0x0d,0xf8,0x16,0x33,0xe8,0x84,0xa8,0x08,0x3c,0x33,0x00,0xf0,0x20,0x71,0x08,0xa9,0x38,0x86,0x62,0x62,0x18,0x40,0x44,0x80,0x09,0x04,0x08,0x90,0x01,0x20,0x41,0x17,0x22,0x90,0x01,0x3e,0x00,0x76,0x80,0x1d,0x48,0x00,0x8d,0x91,0x00,0x34,0xf8,0x20,0xe2,0xa7,0x9c,0x06,0x5c,0x11,0x02,0x28,0x5d,0x91,0x35,0x48,0xaf,0xf8,0x04,0x3f,0xf9,0x88,0x20,0x01,}; | ||||
| const uint8_t *_I_DolphinFirstStart0_70x53[] = {_I_DolphinFirstStart0_70x53_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinFirstStart4_67x53_0[] = {0x01,0x00,0x1f,0x01,0x00,0x17,0xc3,0xfe,0x08,0x68,0x74,0x02,0x0e,0x07,0x4c,0x04,0x06,0x01,0x18,0x04,0x25,0x00,0x04,0x36,0x00,0x42,0x48,0x02,0x88,0x00,0x28,0x80,0x0c,0xa0,0x40,0x83,0x84,0x00,0xca,0x08,0x08,0x30,0x21,0x83,0x0c,0x2c,0x81,0xe3,0x04,0x20,0xc0,0x80,0x02,0x31,0x32,0x11,0x02,0x27,0x00,0x5d,0x40,0x45,0x87,0x90,0x3e,0x7c,0x00,0x43,0x84,0x4e,0x60,0x43,0x30,0x89,0x82,0x12,0x80,0x15,0x20,0x40,0x99,0xc8,0x22,0x7b,0x88,0x10,0x20,0x82,0x27,0x7c,0x82,0x9d,0x48,0x22,0x5f,0x0d,0xfc,0x08,0x10,0x41,0x12,0xf8,0x57,0xc2,0x28,0x30,0x1e,0x07,0x9e,0x06,0x87,0x25,0x79,0xc4,0x20,0x40,0x83,0x21,0x14,0x22,0x08,0x08,0x38,0x2a,0xb8,0xd9,0x47,0x0a,0x14,0x09,0xf0,0x54,0x47,0x1f,0x81,0x82,0x1a,0xde,0x8e,0x33,0xd1,0xc7,0x81,0x0f,0x0e,0x45,0x18,0x20,0xa1,0xe6,0xf2,0x10,0x89,0xa0,0x70,0x11,0x00,0x41,0x46,0x03,0x86,0x55,0x10,0x40,0xc1,0x82,0x25,0x20,0x04,0x11,0x94,0x80,0x43,0x10,0x84,0x01,0x46,0xc0,0xbd,0x38,0x40,0x20,0x8f,0x49,0x08,0xc4,0x1c,0xc8,0x22,0x50,0x38,0x20,0x20,0x86,0xe4,0x83,0x10,0x41,0x8b,0x87,0xf9,0x03,0x81,0xc0,0x81,0x05,0x81,0xc0,0x40,0xf3,0x90,0x60,0x41,0x70,0x2c,0x17,0x01,0xc0,0xc1,0x41,0x05,0x30,0x98,0x43,0x04,0x65,0x01,0x04,0x0c,0x32,0x38,0x91,0x18,0x04,0x14,0x10,0x38,0x18,0x1e,0xac,0x7c,0x41,0x11,0x88,0x5f,0xfc,0x17,0x55,0xa9,0x82,0x06,0x05,0xbc,0x85,0x02,0x08,0xc6,0x32,0x0f,0xe5,0x5e,0x1a,0x08,0x5c,0x06,0xaa,0x34,0x08,0x4a,0x06,0x02,0xab,0x75,0xf0,0x4f,0xc1,0x05,0x80,0x08,0x8e,0xab,0x7f,0xea,0x04,0x11,0x80,0x6a,0xa0,0x02,0x03,0x08,}; | ||||
| const uint8_t *_I_DolphinFirstStart4_67x53[] = {_I_DolphinFirstStart4_67x53_0}; | ||||
| 
 | ||||
| const uint8_t _I_PassportBottom_128x17_0[] = {0x01,0x00,0x5e,0x00,0x96,0x01,0x97,0xe1,0xff,0x00,0x2e,0x3e,0x68,0x0f,0x5a,0xc5,0x54,0x00,0xb9,0x50,0xfb,0x6a,0x35,0x40,0x05,0xcd,0x4e,0x03,0xfd,0x30,0x0f,0xf8,0x7f,0xa0,0x81,0xfe,0xf9,0x1b,0xfb,0xf3,0x01,0x47,0x66,0x02,0x1b,0x03,0x07,0xe7,0x02,0x0b,0x02,0x07,0xe5,0x82,0x0b,0xf2,0x1c,0xb0,0x01,0x67,0xf0,0x5f,0xd0,0x3f,0x23,0xf0,0x9b,0xc9,0xe5,0x80,0x03,0xd5,0xc0,0x00,0x86,0x01,0xf3,0xe6,0x1e,0x58,0x00,0x36,0xa8,0x06,0xac,0x04,0x30,0x6c,0x30,0xee,0x60,0x1f,0xe0,0x10,0xff,0x0d,0xfb,0x00,}; | ||||
| const uint8_t *_I_PassportBottom_128x17[] = {_I_PassportBottom_128x17_0}; | ||||
| 
 | ||||
| const uint8_t _I_DoorLocked_10x56_0[] = {0x01,0x00,0x4e,0x00,0x86,0x40,0x25,0xb0,0x0b,0x6c,0x03,0x9b,0x00,0xc6,0xc0,0x65,0x90,0x10,0x3a,0xc3,0x20,0x31,0xc8,0x04,0xe2,0x01,0x70,0x80,0x78,0x20,0x1c,0x48,0x07,0x22,0x01,0xd0,0x00,0xf0,0x44,0x68,0x90,0x09,0x04,0x02,0x21,0x00,0x84,0x40,0x25,0x80,0x12,0x1e,0x88,0x14,0xc0,0x2e,0x0d,0x11,0xca,0xf8,0x60,0x1c,0x38,0x07,0x1a,0x05,0xcc,0x80,0x72,0x60,0x5c,0x38,0x10,0x1c,0xf9,0x10,0x2e,0x00,0x05,0x60,0x00,0x11,}; | ||||
| const uint8_t *_I_DoorLocked_10x56[] = {_I_DoorLocked_10x56_0}; | ||||
| 
 | ||||
| const uint8_t _I_DoorLeft_70x55_0[] = {0x01,0x00,0x19,0x01,0x00,0x2c,0x32,0x01,0x03,0x04,0x2c,0x18,0x10,0xf0,0x40,0x47,0x82,0x06,0x81,0x03,0xff,0x80,0x08,0x1a,0x20,0x82,0x15,0x28,0x21,0x87,0x82,0x08,0x6f,0xc0,0xb1,0xe6,0x10,0x10,0x8b,0x46,0x20,0x43,0x55,0x8f,0x82,0x10,0x32,0x73,0x0a,0x09,0x89,0x6c,0x1e,0x09,0x00,0x18,0x60,0xf0,0x0c,0x84,0x93,0x82,0x03,0x18,0x0c,0x02,0x1d,0x00,0x90,0x52,0x70,0x50,0x1e,0x00,0x58,0x63,0x90,0x0a,0x06,0x4a,0x09,0x03,0xb0,0x02,0x06,0x70,0x62,0x49,0xf8,0x0c,0x66,0x3f,0xf0,0x41,0x63,0x04,0x43,0x00,0x99,0x60,0x00,0x85,0xc8,0x06,0x14,0xd0,0x80,0x3f,0xc8,0x0d,0xb8,0x10,0x70,0xf8,0x34,0x13,0x03,0x39,0x04,0x1c,0x42,0x19,0xf8,0xa0,0xc2,0x01,0x07,0xef,0x02,0x8c,0x80,0x10,0x9d,0x00,0x43,0xec,0x00,0xa3,0x10,0x04,0x25,0xce,0x19,0xfc,0x88,0x82,0x12,0x0c,0x35,0x10,0x42,0x4c,0xa1,0x90,0x3f,0xc0,0x21,0x22,0x39,0x82,0xc8,0x88,0xd2,0x11,0xf0,0x01,0x88,0xd5,0x18,0xe2,0x08,0x68,0x10,0x0c,0xa8,0x00,0x83,0x81,0xcc,0xd5,0xc3,0x80,0x84,0x82,0x0e,0xcc,0xc0,0x15,0x79,0x02,0x0b,0x98,0xf8,0x11,0x88,0x82,0x0f,0x31,0x19,0x02,0x08,0x2c,0x9f,0x6a,0x1d,0x20,0x41,0x31,0x4c,0x10,0x8d,0x73,0x04,0x23,0xa4,0xc4,0x6c,0xde,0x20,0x42,0xcc,0x01,0x07,0x07,0xff,0x80,0x06,0x3e,0x08,0x38,0x70,0x20,0xa1,0xe0,0x83,0x8e,0x01,0x0c,0xf0,0x73,0x80,0x43,0x70,0x05,0x08,0x00,0x2c,0x04,0xc4,0x46,0x53,0x09,0x98,0x24,0x80,0x65,0x80,0xb0,0xd9,0x84,0x65,0x32,0x06,0x17,0x0f,0x98,0x23,0x63,0xe1,0x88,0xc4,0x08,0x5f,0xc1,0x30,0x9d,0x84,0x4e,0x66,0x94,0x11,0x98,0x75,0x26,0x00,}; | ||||
| const uint8_t *_I_DoorLeft_70x55[] = {_I_DoorLeft_70x55_0}; | ||||
| 
 | ||||
| const uint8_t _I_PassportLeft_6x47_0[] = {0x01,0x00,0x1c,0x00,0x9e,0x40,0xa3,0x32,0x59,0x2c,0x66,0x03,0x01,0x82,0xc2,0x62,0x32,0x50,0x16,0xc8,0x60,0x30,0x28,0x24,0x32,0x39,0x3c,0x9e,0x4d,0x25,0x80,0x1a,}; | ||||
| const uint8_t *_I_PassportLeft_6x47[] = {_I_PassportLeft_6x47_0}; | ||||
| 
 | ||||
| const uint8_t _I_DoorRight_70x55_0[] = {0x01,0x00,0x16,0x01,0x81,0xcc,0x01,0x0f,0x60,0x04,0x3f,0x00,0x10,0xf8,0x08,0x0c,0x02,0x05,0x01,0x84,0x02,0x06,0x26,0x0a,0x10,0x8a,0xcc,0xe0,0x1d,0x68,0xe0,0x18,0xab,0xd0,0x0b,0x18,0x10,0x46,0xe6,0x16,0x1e,0x18,0x10,0x46,0xe4,0x28,0x2c,0x98,0x14,0x68,0x00,0x21,0x1d,0x10,0x8c,0x40,0x02,0x0e,0x10,0xa1,0x08,0xc8,0x40,0x42,0x62,0x11,0x94,0x03,0xfd,0xff,0x00,0x0c,0xff,0x0c,0x08,0x28,0x60,0xe4,0xc0,0x85,0x00,0x83,0x00,0x87,0xf1,0x00,0x8c,0x02,0x0b,0x07,0x24,0x84,0xff,0x04,0xc7,0x80,0xa0,0xe4,0xa0,0x81,0x41,0x04,0x17,0x02,0x41,0x49,0x81,0x0e,0x10,0xb2,0xa0,0x82,0x0e,0x9f,0xfc,0x0a,0x62,0xf2,0xc0,0x03,0x92,0xf0,0x08,0x2d,0x78,0x20,0xff,0x02,0x01,0x08,0xae,0x60,0x64,0x38,0x0d,0xb0,0x8d,0x08,0x82,0x11,0x58,0xc4,0x13,0xc0,0x35,0x68,0x62,0x68,0x81,0x09,0x08,0x84,0x40,0x81,0x0d,0x18,0x69,0x10,0x47,0x44,0x66,0x5f,0x21,0xa9,0x29,0x94,0x10,0x2f,0x23,0x53,0x14,0x60,0x42,0x3c,0x08,0xfc,0x02,0x2c,0x62,0x23,0x58,0xd0,0x22,0x00,0x83,0x3e,0x98,0x44,0x43,0x46,0x22,0x30,0x89,0xce,0x01,0x0f,0x70,0x04,0x3f,0x81,0x8a,0x3c,0x21,0xaa,0x70,0x1a,0xe3,0x44,0x1a,0xa6,0x01,0xd2,0x38,0x90,0x8a,0x40,0x20,0xe5,0x96,0x80,0x43,0x81,0x06,0x6b,0x28,0x07,0xf3,0xfe,0x00,0x19,0xf9,0x34,0xc1,0x08,0x8f,0x20,0xf1,0x3e,0x16,0x00,0xa8,0x19,0x00,0x10,0x76,0x03,0xe2,0x3e,0x90,0x45,0x38,0x01,0x42,0x05,0x88,0x44,0x67,0x15,0x70,0x41,0x38,0x04,0x10,0x24,0x03,0x00,0x10,0x20,0x4a,0x46,0xe9,0x46,0xe1,0x04,0x50,0x66,0x40,0x85,0x19,0x98,0x00,0xc0,}; | ||||
| const uint8_t *_I_DoorRight_70x55[] = {_I_DoorRight_70x55_0}; | ||||
| 
 | ||||
| const uint8_t _I_DoorLocked_10x56_0[] = {0x01,0x00,0x4e,0x00,0x86,0x40,0x25,0xb0,0x0b,0x6c,0x03,0x9b,0x00,0xc6,0xc0,0x65,0x90,0x10,0x3a,0xc3,0x20,0x31,0xc8,0x04,0xe2,0x01,0x70,0x80,0x78,0x20,0x1c,0x48,0x07,0x22,0x01,0xd0,0x00,0xf0,0x44,0x68,0x90,0x09,0x04,0x02,0x21,0x00,0x84,0x40,0x25,0x80,0x12,0x1e,0x88,0x14,0xc0,0x2e,0x0d,0x11,0xca,0xf8,0x60,0x1c,0x38,0x07,0x1a,0x05,0xcc,0x80,0x72,0x60,0x5c,0x38,0x10,0x1c,0xf9,0x10,0x2e,0x00,0x05,0x60,0x00,0x11,}; | ||||
| const uint8_t *_I_DoorLocked_10x56[] = {_I_DoorLocked_10x56_0}; | ||||
| 
 | ||||
| const uint8_t _I_PassportLeft_6x47_0[] = {0x01,0x00,0x1c,0x00,0x9e,0x40,0xa3,0x32,0x59,0x2c,0x66,0x03,0x01,0x82,0xc2,0x62,0x32,0x50,0x16,0xc8,0x60,0x30,0x28,0x24,0x32,0x39,0x3c,0x9e,0x4d,0x25,0x80,0x1a,}; | ||||
| const uint8_t *_I_PassportLeft_6x47[] = {_I_PassportLeft_6x47_0}; | ||||
| 
 | ||||
| const uint8_t _I_LockPopup_100x49_0[] = {0x01,0x00,0x37,0x01,0xfc,0x7f,0xc0,0x13,0x01,0xfe,0x03,0x2a,0x07,0x06,0x12,0xd4,0x1a,0x06,0x0c,0xa8,0x60,0x33,0xe0,0x12,0x08,0x40,0x32,0x3f,0xd0,0x70,0x64,0xe0,0x20,0x31,0x8a,0x00,0x32,0x2c,0x10,0x0b,0x00,0x32,0x62,0x10,0x0c,0x06,0x00,0x19,0x00,0x82,0xc0,0x83,0x22,0x08,0x04,0x18,0x11,0x6a,0x01,0x25,0x02,0x84,0x83,0x1e,0x02,0x04,0x10,0xe1,0x03,0x1e,0x3c,0x0c,0x9c,0x1c,0x02,0x43,0x00,0x84,0x4f,0xc1,0x8f,0x80,0xaf,0x40,0x39,0x14,0x00,0x63,0xd0,0x36,0xf0,0x09,0xc6,0x00,0x18,0xd4,0x3a,0x06,0x9c,0x08,0x20,0xc9,0xdf,0xc0,0x20,0x7f,0x00,0x65,0x40,0x3f,0x80,0xc7,0xd0,0x10,0x06,0x01,0x7f,0x06,0x34,0x8e,0xa1,0x3d,0x80,0x70,0x0b,0x4f,0x23,0xd0,0x50,0xa0,0x1f,0x08,0x78,0x66,0x11,0xe3,0xfc,0x83,0x83,0x1e,0x40,0x0c,0x1f,0xfb,0xec,0x41,0x8c,0x03,0x1e,0x07,0x00,0x4d,0x10,0x0a,0x04,0xc0,0x9b,0x30,0x0c,0x1f,0xff,0xff,0x9f,0x06,0x3e,0x01,0x80,0x48,0xe7,0x99,0x83,0x0d,0x6a,0xe0,0xc4,0x90,0x03,0x1a,0x76,0x0c,0x38,0xe0,0x34,0x45,0x25,0x02,0x06,0x0d,0xe0,0x18,0x3c,0x08,0x19,0x40,0x78,0x00,0xc1,0x81,0xc3,0x27,0xf8,0x48,0x26,0x82,0x7d,0x00,0xfc,0x40,0xfc,0x10,0xfc,0x04,0xfc,0x18,0x30,0x28,0x7d,0x02,0x3f,0x00,0x98,0x41,0x38,0x31,0x08,0x25,0x0e,0x19,0x1f,0x81,0x42,0x70,0x11,0xa2,0x08,0xe2,0x30,0x72,0x08,0x76,0x0a,0x19,0x0f,0x85,0x42,0x60,0x11,0x51,0x78,0xc2,0x20,0x32,0x08,0x26,0x00,0x18,0x91,0x00,0x60,0x91,0x44,0x08,0x34,0x08,0x64,0x1f,0xe4,0x07,0x3f,0x84,0x0d,0x58,0x44,0x01,0x83,0xdc,0x60,0x43,0xe1,0x39,0xa9,0xd0,0x60,0x70,0x16,0x78,0xca,0x01,0x8f,0x83,0x3d,0x10,0x33,0x29,0x00,0xc7,0xa1,0x83,0x3f,0x10,0x0c,0x79,0x30,0x32,0xa0,0xdf,0xc7,0xa0,0x80,0x22,0x07,0xf8,0x06,0x54,0x04,}; | ||||
| const uint8_t *_I_LockPopup_100x49[] = {_I_LockPopup_100x49_0}; | ||||
| 
 | ||||
| const uint8_t _I_Mute_25x27_0[] = {0x01,0x00,0x51,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x31,0x81,0xc0,0x64,0x38,0x08,0xa4,0x06,0x83,0x40,0x86,0x40,0x70,0x32,0x08,0x20,0x3c,0x63,0xf0,0x60,0x38,0xc0,0xa0,0xa0,0x31,0xc2,0x02,0xc7,0x03,0x48,0x01,0x94,0xc0,0x06,0xc0,0xb3,0x09,0x98,0x6c,0x84,0x68,0x2b,0x21,0x99,0x8e,0xcc,0x86,0x64,0xb3,0x81,0x94,0xc6,0x03,0x06,0x80,0x70,0x20,0x1f,0xcf,0xfd,0xfc,0xce,0x80,}; | ||||
| const uint8_t *_I_Mute_25x27[] = {_I_Mute_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaArrowUp_4x8_0[] = {0x00,0x18,0x3C,0x7E,0xFF,}; | ||||
| const uint8_t *_I_IrdaArrowUp_4x8[] = {_I_IrdaArrowUp_4x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Up_hvr_25x27_0[] = {0x01,0x00,0x39,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x20,0x3c,0xf7,0x80,0xcb,0x8e,0x03,0x2c,0x18,0x0c,0x80,0x26,0x25,0x18,0x08,0xa4,0x7f,0x90,0x11,0x88,0xfe,0x20,0x31,0xf8,0x07,0xc2,0x03,0x0f,0x80,0x78,0x00,0x68,0x37,0xf0,0x1d,0x95,0xcc,0xbe,0x66,0x73,}; | ||||
| const uint8_t *_I_Up_hvr_25x27[] = {_I_Up_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Mute_hvr_25x27_0[] = {0x01,0x00,0x4a,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x20,0x21,0xfe,0x40,0x7b,0xf7,0xff,0x5c,0x07,0x7f,0xbf,0xf9,0xc0,0x6f,0xfd,0xff,0xd8,0x3c,0x7c,0x1f,0x90,0x38,0xff,0x7f,0x40,0x31,0xbd,0x82,0xc6,0xff,0xb7,0x01,0x97,0x3c,0x06,0xc0,0xb3,0x09,0x98,0x6c,0x84,0x68,0x2b,0x21,0x99,0x8e,0xcc,0x86,0x64,0xb5,0x01,0x89,0x5c,0xcb,0xe6,0x67,0x30,}; | ||||
| const uint8_t *_I_Mute_hvr_25x27[] = {_I_Mute_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Vol_down_25x27_0[] = {0x01,0x00,0x2c,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x3f,0x01,0xff,0x07,0xff,0x07,0x01,0xa0,0x5f,0xc0,0x7e,0x03,0x38,0x19,0x4c,0x60,0x30,0x68,0x07,0x02,0x01,0xfc,0xff,0xdf,0xcc,0xe8,}; | ||||
| const uint8_t *_I_Vol_down_25x27[] = {_I_Vol_down_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Down_25x27_0[] = {0x01,0x00,0x46,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x3f,0x01,0x9f,0xc7,0xff,0x1f,0x01,0xa7,0x87,0xff,0x0f,0x80,0xf0,0x7f,0xf0,0x78,0x0e,0x07,0xff,0x03,0x0b,0x8f,0xfc,0x04,0x30,0x1f,0xf0,0x7c,0xaf,0x80,0x32,0x9c,0x00,0xca,0x20,0x37,0xf0,0x18,0xc0,0xca,0x63,0x01,0x83,0x40,0x38,0x10,0x0f,0xe7,0xfe,0xfe,0x67,0x40,}; | ||||
| const uint8_t *_I_Down_25x27[] = {_I_Down_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Power_hvr_25x27_0[] = {0x01,0x00,0x4b,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x3f,0xff,0x78,0x0c,0xb8,0xe0,0x35,0xbf,0xf1,0xbf,0x90,0x19,0xff,0x1b,0xf1,0x01,0x8f,0xf1,0xfe,0x30,0x1c,0xff,0x1f,0xe6,0x03,0x5f,0x78,0x0c,0xbf,0xe0,0x39,0x8f,0xff,0xc3,0x63,0x3f,0xff,0x08,0xc6,0xff,0x7c,0x15,0x89,0x04,0x7f,0xc0,0x31,0xc1,0x8e,0xc8,0x8e,0x60,0x36,0x2b,0x99,0x7c,0xcc,0xe6,}; | ||||
| const uint8_t *_I_Power_hvr_25x27[] = {_I_Power_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaLearnShort_128x31_0[] = {0x01,0x00,0x10,0x01,0x00,0x47,0xfb,0xfe,0x00,0x38,0x38,0x3e,0x20,0x20,0x54,0x84,0x03,0x9f,0xc0,0x06,0x58,0x80,0x3d,0xf2,0x00,0x65,0x90,0x03,0xde,0x90,0x06,0x5a,0x07,0xc0,0x8a,0x70,0x1a,0x04,0x02,0x51,0x80,0x03,0x94,0x02,0x3f,0x40,0x20,0x24,0x0b,0x01,0x00,0x92,0x70,0x35,0x40,0x01,0xe0,0xdf,0xf0,0x10,0x40,0x71,0x58,0x20,0x90,0x88,0x0c,0x4a,0x81,0x55,0x00,0x0f,0x87,0xf7,0x00,0x82,0x43,0x36,0x16,0xdc,0x9c,0x12,0x21,0x01,0x85,0x70,0x3f,0xc1,0xf1,0xf8,0xfc,0x60,0x20,0xf5,0x90,0x40,0xa1,0x34,0x08,0x18,0x7c,0x7e,0x24,0x91,0x07,0x8c,0xc0,0x5e,0x52,0x28,0x14,0x17,0x81,0x01,0x0f,0x8f,0xe7,0xe3,0x03,0x1f,0x8e,0x02,0xdb,0x03,0x8e,0x49,0x20,0x50,0x2e,0x04,0x72,0xbd,0x55,0xdc,0xeb,0xa0,0x7c,0x4f,0x68,0xbc,0x60,0x72,0x40,0x79,0x50,0x23,0x9a,0x6d,0x56,0x66,0x5c,0x0f,0x21,0x78,0x9b,0x04,0x1e,0x28,0x21,0x8e,0x5c,0x43,0xe6,0x2f,0x10,0xf9,0x0b,0xc7,0x04,0x99,0x18,0x06,0xe0,0x7e,0x56,0x32,0x78,0x8f,0xc4,0x08,0x32,0x20,0x79,0x48,0x2b,0x85,0xf2,0xf8,0x83,0xc4,0x5c,0x3f,0x03,0x78,0xd0,0x81,0xe3,0xc0,0xdf,0x9f,0xcb,0xf3,0x04,0xc6,0x7d,0xfb,0xdf,0x34,0x78,0xd0,0x45,0xe5,0x7e,0x4f,0x97,0xe2,0x09,0x80,0x07,0x88,0xbc,0x61,0x00,0xf3,0xd8,0x2f,0xcb,0xe0,0xcf,0x60,0x68,0xd0,0x30,0x15,0xfa,0xac,0x36,0x3f,0x60,0x77,0xb3,0x80,0x5d,0xe6,0x4b,0x20,0x03,0x03,0xc4,0x01,0xd0,0x10,0x7f,0x40,0x81,0xfc,0xa7,0x10,0x06,0x99,0xd0,0x01,0x51,0x00,0x7f,0x48,0x01,0xfd,0xc0,0x43,0x98,0x00,0x8e,0xfe,0x00,0xf0,}; | ||||
| const uint8_t *_I_IrdaLearnShort_128x31[] = {_I_IrdaLearnShort_128x31_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaArrowDown_4x8_0[] = {0x00,0xFF,0x7E,0x3C,0x18,}; | ||||
| const uint8_t *_I_IrdaArrowDown_4x8[] = {_I_IrdaArrowDown_4x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Vol_down_hvr_25x27_0[] = {0x01,0x00,0x23,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x20,0x3f,0x01,0xf8,0xb4,0x7f,0x00,0x34,0x0b,0xf8,0x0f,0xc0,0x6e,0x57,0x32,0xf9,0x99,0xcc,}; | ||||
| const uint8_t *_I_Vol_down_hvr_25x27[] = {_I_Vol_down_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaLearn_128x64_0[] = {0x01,0x00,0xcc,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3f,0x01,0x07,0x82,0x41,0x21,0x20,0x73,0x00,0x8e,0x82,0x0f,0x00,0xa0,0x01,0x46,0x11,0x00,0x07,0xc0,0x28,0x41,0xe5,0xc8,0xba,0x63,0xa7,0x70,0x6b,0x3d,0xbb,0x99,0x19,0xee,0x68,0x71,0x16,0x3f,0x70,0x3c,0x64,0xf9,0x58,0x25,0x26,0x13,0x91,0xc9,0x64,0xa4,0x99,0x2d,0x06,0x1f,0x29,0x42,0x07,0x8c,0x80,0x1e,0x50,0xff,0x88,0x3c,0x67,0x80,0xf1,0xc1,0x03,0xde,0x03,0x11,0x07,0x8c,0x10,0x1e,0x38,0x40,0x79,0xf0,0x32,0x80,0xf1,0x83,0x58,0x72,0x58,0xc8,0xc6,0x73,0x40,0x3f,0x10,0x78,0x9e,0xf1,0x17,0xe9,0xcf,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x02,0x44,0x18,0xa3,0x80,0x82,0x32,0x06,0x44,0x0f,0xf0,0x73,0x5d,0xe3,0x92,0x7e,0xcf,0x06,0x3b,0xc3,0xa4,0xdd,0xfc,0xc8,0x35,0xca,0x44,0xa5,0x34,0x5c,0x16,0x92,0x89,0x4a,0x91,0x4a,0x60,0x20,0xf7,0xa4,0x83,0xc6,0x8e,0x0f,0xba,0x88,0x3c,0x68,0x00,0xf7,0x80,0x65,0xe3,0x9c,0x7a,0x6e,0x0a,0x49,0xc3,0xb8,0xc8,0xa4,0xc0,0xf5,0x00,0x08,0x1d,0xc0,0x0e,0x0f,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2f,0xfb,0xfe,0x00,0x38,0x39,0x97,0xa1,0x00,0xe7,0xf0,0x3b,0x1c,0x00,0xd9,0x00,0x32,0xc8,0x01,0xef,0x48,0x03,0x2d,0x03,0xe0,0x45,0x38,0x0d,0x02,0x01,0x28,0xc0,0x01,0xca,0x01,0x1f,0xa0,0x10,0x12,0x05,0x80,0x80,0x49,0x38,0x1a,0xa0,0x00,0xf0,0x6f,0xf8,0x08,0x20,0x38,0xac,0x10,0x48,0x44,0x06,0x25,0x40,0xaa,0x80,0x07,0xc3,0xfb,0x80,0x41,0x21,0x9b,0x0b,0x6e,0x4e,0x09,0x10,0x80,0xc2,0xb8,0x1f,0xe0,0xf8,0xfc,0x7e,0x30,0x10,0x7a,0xc8,0x20,0x50,0x9a,0x04,0x0c,0x3e,0x3f,0x12,0x48,0x83,0xc6,0x60,0x2f,0x29,0x14,0x0a,0x0b,0xc0,0x80,0x87,0xc7,0xf3,0xf1,0x81,0x8f,0xc7,0x01,0x6d,0x81,0xc7,0x24,0x90,0x28,0x17,0x02,0x39,0x5e,0xaa,0xee,0x75,0xd0,0x3e,0x27,0xb4,0x5e,0x30,0x39,0x20,0x3c,0xa8,0x11,0xcd,0x36,0xab,0x33,0x2e,0x07,0x90,0xbc,0x4d,0x82,0x0f,0x14,0x10,0xc7,0x2e,0x21,0xf3,0x17,0x88,0x7c,0x85,0xe3,0x82,0x4c,0x8c,0x03,0x70,0x3f,0x2b,0x19,0x3c,0x47,0xe2,0x04,0x19,0x10,0x3c,0xa4,0x15,0xc2,0xf9,0x7c,0x41,0xe2,0x2e,0x1f,0x81,0xbc,0x68,0x40,0xf1,0xe0,0x6f,0xcf,0xe5,0xf9,0x82,0x63,0x3e,0xfd,0xef,0x9a,0x3c,0x68,0x22,0xf2,0xbf,0x27,0xcb,0xf1,0x04,0xc0,0x03,0xc4,0x5e,0x30,0x80,0x79,0xec,0x17,0xe5,0xf0,0x67,0xb0,0x34,0x68,0x18,0x0a,0xfd,0x56,0x1b,0x1f,0xb0,0x3b,0xd9,0xc0,0x2e,0xf3,0x25,0x90,0x01,0x81,0xe2,0x00,0xe8,0x08,0x3f,0xa0,0x40,0xfe,0x53,0x88,0x03,0x4c,0xe8,0x00,0xa8,0x80,0x3f,0xa4,0x00,0xfe,0xe0,0x21,0xcc,0x00,0x47,0x7f,0x00,0x78,}; | ||||
| const uint8_t *_I_IrdaLearn_128x64[] = {_I_IrdaLearn_128x64_0}; | ||||
| 
 | ||||
| const uint8_t _I_Down_hvr_25x27_0[] = {0x01,0x00,0x3a,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x20,0x3f,0x01,0x9c,0x3e,0x01,0xe0,0x01,0xa4,0x7e,0x01,0xf0,0x80,0x8b,0x47,0xf1,0x01,0x16,0x8f,0xf0,0x2e,0x23,0x11,0x01,0x88,0x04,0xf0,0x60,0x32,0xe3,0x80,0xcb,0xde,0x37,0xf0,0x1a,0x95,0xcc,0xbe,0x66,0x73,}; | ||||
| const uint8_t *_I_Down_hvr_25x27[] = {_I_Down_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Vol_down_hvr_25x27_0[] = {0x01,0x00,0x23,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x20,0x3f,0x01,0xf8,0xb4,0x7f,0x00,0x34,0x0b,0xf8,0x0f,0xc0,0x6e,0x57,0x32,0xf9,0x99,0xcc,}; | ||||
| const uint8_t *_I_Vol_down_hvr_25x27[] = {_I_Vol_down_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Down_25x27_0[] = {0x01,0x00,0x46,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x3f,0x01,0x9f,0xc7,0xff,0x1f,0x01,0xa7,0x87,0xff,0x0f,0x80,0xf0,0x7f,0xf0,0x78,0x0e,0x07,0xff,0x03,0x0b,0x8f,0xfc,0x04,0x30,0x1f,0xf0,0x7c,0xaf,0x80,0x32,0x9c,0x00,0xca,0x20,0x37,0xf0,0x18,0xc0,0xca,0x63,0x01,0x83,0x40,0x38,0x10,0x0f,0xe7,0xfe,0xfe,0x67,0x40,}; | ||||
| const uint8_t *_I_Down_25x27[] = {_I_Down_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Fill_marker_7x7_0[] = {0x00,0x1C,0x32,0x6F,0x5F,0x7F,0x3E,0x1C,}; | ||||
| const uint8_t *_I_Fill_marker_7x7[] = {_I_Fill_marker_7x7_0}; | ||||
| 
 | ||||
| const uint8_t _I_Power_25x27_0[] = {0x01,0x00,0x54,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x30,0x18,0x80,0x0c,0xa7,0x00,0x35,0xc0,0xce,0x60,0x70,0x1e,0x0c,0xe6,0x0f,0x01,0xf0,0xce,0x21,0xd0,0x1b,0x0c,0xe2,0x18,0x03,0x58,0x80,0x0c,0xa0,0x00,0x39,0xf0,0xc0,0x03,0x63,0xc1,0x80,0x88,0xc7,0x03,0x83,0x15,0x8c,0x07,0xfe,0x02,0x18,0x0d,0xf0,0x76,0x44,0x73,0x01,0x94,0x0c,0xa6,0x30,0x18,0x34,0x03,0x81,0x00,0xfe,0x7f,0xef,0xe6,0x74,}; | ||||
| const uint8_t *_I_Power_25x27[] = {_I_Power_25x27_0}; | ||||
| const uint8_t _I_Vol_down_25x27_0[] = {0x01,0x00,0x2c,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x3f,0x01,0xff,0x07,0xff,0x07,0x01,0xa0,0x5f,0xc0,0x7e,0x03,0x38,0x19,0x4c,0x60,0x30,0x68,0x07,0x02,0x01,0xfc,0xff,0xdf,0xcc,0xe8,}; | ||||
| const uint8_t *_I_Vol_down_25x27[] = {_I_Vol_down_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Vol_up_25x27_0[] = {0x01,0x00,0x2f,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x38,0x88,0x00,0xfc,0x06,0xbc,0x1f,0xfc,0x1c,0x06,0x81,0x7f,0x01,0xc1,0x0e,0xa0,0x65,0x31,0x80,0xc1,0xa0,0x1c,0x08,0x07,0xf3,0xff,0x7f,0x33,0xa0,}; | ||||
| const uint8_t *_I_Vol_up_25x27[] = {_I_Vol_up_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Up_25x27_0[] = {0x01,0x00,0x44,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x3c,0x88,0x00,0xca,0x70,0x03,0x2b,0xe0,0x0c,0xbf,0xc0,0x32,0xff,0x80,0x87,0x03,0xff,0x81,0xc0,0x78,0x3f,0xf8,0x3c,0x07,0xc3,0xff,0x87,0xc0,0x7e,0x3f,0xf8,0xf8,0x0d,0x06,0xfe,0x03,0x78,0x19,0x4c,0x60,0x30,0x68,0x07,0x02,0x01,0xfc,0xff,0xdf,0xcc,0xe8,}; | ||||
| const uint8_t *_I_Up_25x27[] = {_I_Up_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Back_15x10_0[] = {0x00,0x04,0x00,0x06,0x00,0xFF,0x0F,0x06,0x10,0x04,0x20,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x10,0xFE,0x0F,}; | ||||
| const uint8_t *_I_Back_15x10[] = {_I_Back_15x10_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaSend_128x64_0[] = {0x01,0x00,0xe2,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xfe,0x04,0x0e,0x05,0x82,0xd7,0x81,0xca,0x21,0x08,0x01,0x8c,0x10,0x0e,0x54,0x00,0x20,0xe0,0xa4,0x00,0xfb,0xb2,0x4e,0xb0,0xfa,0x0e,0x74,0xc7,0x0f,0x3b,0xce,0x4e,0xec,0xf0,0xe1,0x79,0xe4,0xe9,0x58,0x2d,0x3d,0x4a,0x95,0x41,0x89,0x52,0x31,0x59,0x40,0xfa,0x64,0x01,0xe3,0xa0,0xa9,0x5e,0x81,0xe7,0xf4,0x07,0xcc,0x28,0x1e,0x71,0x40,0x7a,0x58,0x01,0xe4,0x3f,0x1c,0x0c,0x4f,0x11,0x0b,0xb3,0x83,0xcc,0x00,0x94,0x20,0x2a,0x03,0xa0,0x1e,0xd0,0x34,0xdf,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x4c,0xf0,0x17,0x4c,0x81,0xa0,0x18,0x18,0x1f,0x39,0x90,0x6c,0x60,0x27,0x70,0xe9,0x3f,0x67,0x03,0x3c,0x80,0x83,0xde,0x81,0x4a,0x84,0xca,0x68,0xb8,0x2b,0xf0,0x3f,0x29,0x20,0xfe,0xa8,0xe0,0x85,0xf3,0x80,0xa5,0xc3,0xb8,0xf4,0xd8,0x11,0x3e,0x40,0x04,0x1b,0x23,0x7d,0x83,0xcd,0x1f,0x60,0x0f,0x00,0x78,0x03,0x7f,0x9f,0xf0,0x01,0xc0,0xc1,0xf1,0x04,0x02,0xa4,0x08,0x1f,0xe0,0xff,0x01,0x0f,0x00,0x70,0x9f,0xfe,0x20,0x10,0xe7,0xe0,0xf2,0x90,0x07,0xd7,0x89,0xdf,0xaa,0xd5,0x7b,0xa0,0xf3,0x8e,0x03,0xdb,0x54,0x00,0x29,0x70,0x3c,0xa2,0x40,0xf6,0xbf,0x87,0xc7,0xea,0x1f,0x12,0x30,0xc2,0x41,0xed,0xab,0x95,0x07,0xc6,0x75,0x02,0x10,0x0c,0x17,0xe0,0x47,0x18,0xff,0x82,0x07,0xc4,0xaf,0x8f,0xd2,0x43,0x80,0x82,0x56,0x01,0x03,0x35,0xfc,0x43,0xc7,0xe3,0x8a,0xc4,0x6a,0xa5,0x50,0x28,0x8d,0x02,0x05,0xa8,0x13,0x8c,0xaa,0xf9,0x1f,0xe2,0x5d,0xc2,0xc3,0x75,0x9f,0xe0,0xa1,0x14,0x08,0x0f,0x60,0x52,0x33,0x59,0xf4,0xf8,0x7e,0x32,0x2d,0x10,0xfc,0x70,0x58,0x89,0x04,0x06,0xd1,0xa0,0x0f,0x8f,0xfa,0x7e,0x3f,0x3e,0xa8,0x7c,0x69,0x1a,0x08,0x04,0xe2,0x80,0x1f,0x19,0xfd,0xf8,0xfe,0x92,0xa0,0x78,0xd0,0x20,0x19,0x8e,0x19,0xa8,0x7a,0xf7,0x51,0xfb,0x03,0xcb,0x11,0xc3,0xaa,0x4d,0x7a,0x76,0x51,0xf8,0x87,0xc8,0x7e,0x34,0x85,0xf0,0xe2,0x24,0x7a,0xe0,0xf9,0xaf,0xd0,0x9e,0x31,0x08,0x04,0x22,0x01,0x57,0x1f,0x9e,0xb8,0x7e,0x90,0x80,0x79,0x61,0x07,0xe2,0x5f,0x2f,0xfd,0xde,0xeb,0xf7,0x4f,0x8c,0x44,0x3a,0x30,0x8f,0xc0,0x7c,0x4f,0xe6,0x1f,0x29,0xda,0xbc,0x41,0xe5,0xc0,0xd7,0xa7,0xcd,0x8a,0x3d,0xdf,0xe8,0x7c,0x60,0x40,0xf2,0x80,0x55,0x97,0xe7,0xee,0x0f,0x0f,0xa9,0xfe,0x30,0x40,0x79,0x7c,0x05,0x43,0xe1,0x6f,0x88,0x7c,0x40,0x02,0x1f,0x18,0x01,0x3c,0x5d,0xe5,0x9f,0x80,0xbf,0xc4,0x1f,0x00,0x05,0x82,0x01,0x50,0x1e,0x28,0xf1,0x00,0x2c,0x90,0x1e,0xca,0xf1,0x00,0x2d,0x52,0x1e,0x0f,0x5c,0x00,0x7d,0xc1,0xed,0x00,0x25,0x08,0xff,0x00,0x46,0x00,0x3f,0xe1,0x7c,0xff,0xf0,0x30,0xc3,0xc0,0x3c,0x02,0x73,0xbc,0x00,0xcb,0xf0,0x18,0x4f,0xf8,0x3e,0x00,0x0c,0x0f,0xf0,}; | ||||
| const uint8_t *_I_IrdaSend_128x64[] = {_I_IrdaSend_128x64_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaSendShort_128x34_0[] = {0x01,0x00,0x42,0x01,0xfe,0x7f,0xc0,0x07,0x03,0x07,0xc4,0x10,0x0a,0x90,0x20,0x7f,0x83,0xfc,0x04,0x3c,0x01,0xc2,0x7f,0xf8,0x80,0x43,0x9f,0x83,0xca,0x40,0x1f,0x5e,0x27,0x7e,0xab,0x55,0xee,0x83,0xce,0x38,0x0f,0x6d,0x50,0x00,0xa5,0xc0,0xf2,0x89,0x03,0xda,0xfe,0x1f,0x1f,0xa8,0x7c,0x48,0xc3,0x09,0x07,0xb6,0xae,0x54,0x1f,0x19,0xd4,0x08,0x40,0x30,0x5f,0x81,0x1c,0x63,0xfe,0x08,0x1f,0x12,0xbe,0x3f,0x49,0x0e,0x02,0x09,0x58,0x04,0x0c,0xd7,0xf1,0x0f,0x1f,0x8e,0x2b,0x11,0xaa,0x95,0x40,0xa2,0x34,0x08,0x16,0xa0,0x4e,0x32,0xab,0xe4,0x7f,0x89,0x77,0x0b,0x0d,0xd6,0x7f,0x82,0x84,0x50,0x20,0x3d,0x81,0x48,0xcd,0x67,0xd3,0xe1,0xf8,0xc8,0xb4,0x43,0xf1,0xc1,0x62,0x24,0x10,0x1b,0x46,0x80,0x3e,0x3f,0xe9,0xf8,0xfc,0xfa,0xa1,0xf1,0xa4,0x68,0x20,0x13,0x8a,0x00,0x7c,0x67,0xf7,0xe3,0xfa,0x4a,0x81,0xe3,0x40,0x80,0x66,0x38,0x66,0xa1,0xeb,0xdd,0x47,0xec,0x0f,0x2c,0x47,0x0e,0xa9,0x35,0xe9,0xd9,0x47,0xe2,0x1f,0x21,0xf8,0xd2,0x17,0xc3,0x88,0x91,0xeb,0x83,0xe6,0xbf,0x42,0x78,0xc4,0x20,0x10,0x88,0x05,0x5c,0x7e,0x7a,0xe1,0xfa,0x42,0x01,0xe5,0x84,0x1f,0x89,0x7c,0xbf,0xf7,0x7b,0xaf,0xdd,0x3e,0x31,0x10,0xe8,0xc2,0x3f,0x01,0xf1,0x3f,0x98,0x7c,0xa7,0x6a,0xf1,0x07,0x97,0x03,0x5e,0x9f,0x36,0x28,0xf7,0x7f,0xa1,0xf1,0x81,0x03,0xca,0x01,0x56,0x5f,0x9f,0xb8,0x3c,0x3e,0xa7,0xf8,0xc1,0x01,0xe5,0xf0,0x15,0x0f,0x85,0xbe,0x21,0xf1,0x00,0x08,0x7c,0x60,0x04,0xf1,0x77,0x96,0x7e,0x02,0xff,0x10,0x7c,0x00,0x16,0x08,0x05,0x40,0x78,0xa3,0xc4,0x00,0xb2,0x40,0x7b,0x2b,0xc4,0x00,0xb5,0x48,0x78,0x3d,0x70,0x01,0xf7,0x07,0xb4,0x00,0x94,0x23,0xfc,0x01,0x18,0x00,0xff,0x85,0xf3,0xff,0xc0,0xc3,0x0f,0x00,0xf0,0x09,0xce,0xf0,0x03,0x2f,0xc0,0x61,0x3f,0xe0,0xf8,0x00,0x30,0x3f,0xc0,}; | ||||
| const uint8_t *_I_IrdaSendShort_128x34[] = {_I_IrdaSendShort_128x34_0}; | ||||
| const uint8_t _I_Up_hvr_25x27_0[] = {0x01,0x00,0x39,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x20,0x3c,0xf7,0x80,0xcb,0x8e,0x03,0x2c,0x18,0x0c,0x80,0x26,0x25,0x18,0x08,0xa4,0x7f,0x90,0x11,0x88,0xfe,0x20,0x31,0xf8,0x07,0xc2,0x03,0x0f,0x80,0x78,0x00,0x68,0x37,0xf0,0x1d,0x95,0xcc,0xbe,0x66,0x73,}; | ||||
| const uint8_t *_I_Up_hvr_25x27[] = {_I_Up_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Vol_up_hvr_25x27_0[] = {0x01,0x00,0x28,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x20,0x38,0xf7,0x80,0xfc,0x06,0xa2,0xd1,0xfc,0x00,0xd0,0x2f,0xe0,0x38,0x21,0xd8,0x0c,0x8a,0xe6,0x5f,0x33,0x39,0x80,}; | ||||
| const uint8_t *_I_Vol_up_hvr_25x27[] = {_I_Vol_up_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_KeySave_24x11_0[] = {0x01,0x00,0x1e,0x00,0xff,0x7f,0xff,0xf0,0x18,0x06,0x00,0x04,0x53,0x1c,0xbe,0x33,0x13,0x94,0xc9,0x64,0x72,0x99,0xed,0x0e,0x53,0x05,0x19,0xb3,0xe3,0x02,0x8a,0x1d,0x1b,0xf8,}; | ||||
| const uint8_t *_I_KeySave_24x11[] = {_I_KeySave_24x11_0}; | ||||
| const uint8_t _I_IrdaLearnShort_128x31_0[] = {0x01,0x00,0x10,0x01,0x00,0x47,0xfb,0xfe,0x00,0x38,0x38,0x3e,0x20,0x20,0x54,0x84,0x03,0x9f,0xc0,0x06,0x58,0x80,0x3d,0xf2,0x00,0x65,0x90,0x03,0xde,0x90,0x06,0x5a,0x07,0xc0,0x8a,0x70,0x1a,0x04,0x02,0x51,0x80,0x03,0x94,0x02,0x3f,0x40,0x20,0x24,0x0b,0x01,0x00,0x92,0x70,0x35,0x40,0x01,0xe0,0xdf,0xf0,0x10,0x40,0x71,0x58,0x20,0x90,0x88,0x0c,0x4a,0x81,0x55,0x00,0x0f,0x87,0xf7,0x00,0x82,0x43,0x36,0x16,0xdc,0x9c,0x12,0x21,0x01,0x85,0x70,0x3f,0xc1,0xf1,0xf8,0xfc,0x60,0x20,0xf5,0x90,0x40,0xa1,0x34,0x08,0x18,0x7c,0x7e,0x24,0x91,0x07,0x8c,0xc0,0x5e,0x52,0x28,0x14,0x17,0x81,0x01,0x0f,0x8f,0xe7,0xe3,0x03,0x1f,0x8e,0x02,0xdb,0x03,0x8e,0x49,0x20,0x50,0x2e,0x04,0x72,0xbd,0x55,0xdc,0xeb,0xa0,0x7c,0x4f,0x68,0xbc,0x60,0x72,0x40,0x79,0x50,0x23,0x9a,0x6d,0x56,0x66,0x5c,0x0f,0x21,0x78,0x9b,0x04,0x1e,0x28,0x21,0x8e,0x5c,0x43,0xe6,0x2f,0x10,0xf9,0x0b,0xc7,0x04,0x99,0x18,0x06,0xe0,0x7e,0x56,0x32,0x78,0x8f,0xc4,0x08,0x32,0x20,0x79,0x48,0x2b,0x85,0xf2,0xf8,0x83,0xc4,0x5c,0x3f,0x03,0x78,0xd0,0x81,0xe3,0xc0,0xdf,0x9f,0xcb,0xf3,0x04,0xc6,0x7d,0xfb,0xdf,0x34,0x78,0xd0,0x45,0xe5,0x7e,0x4f,0x97,0xe2,0x09,0x80,0x07,0x88,0xbc,0x61,0x00,0xf3,0xd8,0x2f,0xcb,0xe0,0xcf,0x60,0x68,0xd0,0x30,0x15,0xfa,0xac,0x36,0x3f,0x60,0x77,0xb3,0x80,0x5d,0xe6,0x4b,0x20,0x03,0x03,0xc4,0x01,0xd0,0x10,0x7f,0x40,0x81,0xfc,0xa7,0x10,0x06,0x99,0xd0,0x01,0x51,0x00,0x7f,0x48,0x01,0xfd,0xc0,0x43,0x98,0x00,0x8e,0xfe,0x00,0xf0,}; | ||||
| const uint8_t *_I_IrdaLearnShort_128x31[] = {_I_IrdaLearnShort_128x31_0}; | ||||
| 
 | ||||
| const uint8_t _I_KeyBackspaceSelected_16x9_0[] = {0x00,0xFE,0x7F,0xFF,0xFF,0xEF,0xFF,0xE7,0xFF,0x03,0xC0,0xE7,0xFF,0xEF,0xFF,0xFF,0xFF,0xFE,0x7F,}; | ||||
| const uint8_t *_I_KeyBackspaceSelected_16x9[] = {_I_KeyBackspaceSelected_16x9_0}; | ||||
| const uint8_t _I_IrdaSend_128x64_0[] = {0x01,0x00,0xe2,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xfe,0x04,0x0e,0x05,0x82,0xd7,0x81,0xca,0x21,0x08,0x01,0x8c,0x10,0x0e,0x54,0x00,0x20,0xe0,0xa4,0x00,0xfb,0xb2,0x4e,0xb0,0xfa,0x0e,0x74,0xc7,0x0f,0x3b,0xce,0x4e,0xec,0xf0,0xe1,0x79,0xe4,0xe9,0x58,0x2d,0x3d,0x4a,0x95,0x41,0x89,0x52,0x31,0x59,0x40,0xfa,0x64,0x01,0xe3,0xa0,0xa9,0x5e,0x81,0xe7,0xf4,0x07,0xcc,0x28,0x1e,0x71,0x40,0x7a,0x58,0x01,0xe4,0x3f,0x1c,0x0c,0x4f,0x11,0x0b,0xb3,0x83,0xcc,0x00,0x94,0x20,0x2a,0x03,0xa0,0x1e,0xd0,0x34,0xdf,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x4c,0xf0,0x17,0x4c,0x81,0xa0,0x18,0x18,0x1f,0x39,0x90,0x6c,0x60,0x27,0x70,0xe9,0x3f,0x67,0x03,0x3c,0x80,0x83,0xde,0x81,0x4a,0x84,0xca,0x68,0xb8,0x2b,0xf0,0x3f,0x29,0x20,0xfe,0xa8,0xe0,0x85,0xf3,0x80,0xa5,0xc3,0xb8,0xf4,0xd8,0x11,0x3e,0x40,0x04,0x1b,0x23,0x7d,0x83,0xcd,0x1f,0x60,0x0f,0x00,0x78,0x03,0x7f,0x9f,0xf0,0x01,0xc0,0xc1,0xf1,0x04,0x02,0xa4,0x08,0x1f,0xe0,0xff,0x01,0x0f,0x00,0x70,0x9f,0xfe,0x20,0x10,0xe7,0xe0,0xf2,0x90,0x07,0xd7,0x89,0xdf,0xaa,0xd5,0x7b,0xa0,0xf3,0x8e,0x03,0xdb,0x54,0x00,0x29,0x70,0x3c,0xa2,0x40,0xf6,0xbf,0x87,0xc7,0xea,0x1f,0x12,0x30,0xc2,0x41,0xed,0xab,0x95,0x07,0xc6,0x75,0x02,0x10,0x0c,0x17,0xe0,0x47,0x18,0xff,0x82,0x07,0xc4,0xaf,0x8f,0xd2,0x43,0x80,0x82,0x56,0x01,0x03,0x35,0xfc,0x43,0xc7,0xe3,0x8a,0xc4,0x6a,0xa5,0x50,0x28,0x8d,0x02,0x05,0xa8,0x13,0x8c,0xaa,0xf9,0x1f,0xe2,0x5d,0xc2,0xc3,0x75,0x9f,0xe0,0xa1,0x14,0x08,0x0f,0x60,0x52,0x33,0x59,0xf4,0xf8,0x7e,0x32,0x2d,0x10,0xfc,0x70,0x58,0x89,0x04,0x06,0xd1,0xa0,0x0f,0x8f,0xfa,0x7e,0x3f,0x3e,0xa8,0x7c,0x69,0x1a,0x08,0x04,0xe2,0x80,0x1f,0x19,0xfd,0xf8,0xfe,0x92,0xa0,0x78,0xd0,0x20,0x19,0x8e,0x19,0xa8,0x7a,0xf7,0x51,0xfb,0x03,0xcb,0x11,0xc3,0xaa,0x4d,0x7a,0x76,0x51,0xf8,0x87,0xc8,0x7e,0x34,0x85,0xf0,0xe2,0x24,0x7a,0xe0,0xf9,0xaf,0xd0,0x9e,0x31,0x08,0x04,0x22,0x01,0x57,0x1f,0x9e,0xb8,0x7e,0x90,0x80,0x79,0x61,0x07,0xe2,0x5f,0x2f,0xfd,0xde,0xeb,0xf7,0x4f,0x8c,0x44,0x3a,0x30,0x8f,0xc0,0x7c,0x4f,0xe6,0x1f,0x29,0xda,0xbc,0x41,0xe5,0xc0,0xd7,0xa7,0xcd,0x8a,0x3d,0xdf,0xe8,0x7c,0x60,0x40,0xf2,0x80,0x55,0x97,0xe7,0xee,0x0f,0x0f,0xa9,0xfe,0x30,0x40,0x79,0x7c,0x05,0x43,0xe1,0x6f,0x88,0x7c,0x40,0x02,0x1f,0x18,0x01,0x3c,0x5d,0xe5,0x9f,0x80,0xbf,0xc4,0x1f,0x00,0x05,0x82,0x01,0x50,0x1e,0x28,0xf1,0x00,0x2c,0x90,0x1e,0xca,0xf1,0x00,0x2d,0x52,0x1e,0x0f,0x5c,0x00,0x7d,0xc1,0xed,0x00,0x25,0x08,0xff,0x00,0x46,0x00,0x3f,0xe1,0x7c,0xff,0xf0,0x30,0xc3,0xc0,0x3c,0x02,0x73,0xbc,0x00,0xcb,0xf0,0x18,0x4f,0xf8,0x3e,0x00,0x0c,0x0f,0xf0,}; | ||||
| const uint8_t *_I_IrdaSend_128x64[] = {_I_IrdaSend_128x64_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinReadingSuccess_59x63_0[] = {0x01,0x00,0x19,0x01,0x00,0x1d,0x00,0x0f,0xd2,0x00,0x21,0xe0,0x3f,0xf0,0xf9,0x00,0x40,0xee,0x00,0x11,0x88,0x04,0x0e,0x18,0x11,0x18,0x8c,0x40,0x0e,0x50,0x30,0x10,0xc0,0xa1,0x01,0xe2,0x05,0x14,0x12,0x08,0x33,0x58,0x44,0x08,0x66,0xa1,0xe3,0x01,0x9c,0x83,0x00,0x24,0x11,0x11,0x06,0xc4,0x76,0x20,0x75,0x15,0x99,0x48,0xc0,0xe9,0x0f,0x03,0x95,0xfc,0x86,0x3c,0x09,0x80,0x1c,0x7c,0x00,0x91,0x81,0x48,0x2f,0xc1,0x41,0x8c,0xc0,0x20,0x30,0x1c,0x87,0xfc,0x0e,0x30,0x70,0x70,0x81,0xc7,0xe6,0x07,0x18,0x08,0x1c,0xb9,0x1e,0x38,0x0f,0x02,0x01,0xf0,0x03,0xa0,0xa4,0x7f,0x90,0x30,0x38,0xff,0xe0,0x28,0x21,0xff,0x06,0x44,0x0e,0x46,0xe1,0x01,0x8c,0x03,0x34,0x2f,0x25,0x18,0x80,0xc7,0x2a,0x03,0x2e,0x01,0x3c,0x70,0x12,0xa2,0x39,0x78,0x27,0xe0,0x31,0xea,0x82,0xc4,0x6c,0x31,0xf0,0x78,0xea,0xb0,0x22,0x31,0xfc,0x1a,0xc6,0x01,0x55,0x25,0x88,0xf8,0x4b,0x02,0x1f,0x13,0xe1,0x7f,0x97,0x85,0x15,0x03,0x90,0xf8,0xa0,0x10,0xa1,0xb1,0x0e,0x88,0x00,0x7f,0x0f,0xc0,0x7c,0x57,0x27,0x3c,0xb0,0x7f,0x5f,0xa9,0x1f,0xc0,0x6a,0xc5,0x05,0xc0,0xf0,0x11,0x46,0xac,0x18,0x3f,0xf9,0x54,0x75,0x00,0x73,0x1f,0x0f,0xfe,0xfe,0xc6,0x30,0x01,0xbc,0x48,0x00,0x84,0x82,0x00,0x1b,0x64,0xc0,0x07,0x60,0x03,0xb4,0x70,0x0c,0xbf,0x82,0x31,0x01,0x8d,0x0c,0x40,0x02,0x37,0x08,0x1d,0x74,0x00,0x76,0xa0,0x01,0xdb,0x01,0xfe,0x85,0x8b,0x96,0xaa,0x9b,0x30,0x01,0x6a,0xa3,0x40,0x75,0xaa,0x03,0xdb,0x50,0xbb,0x30,0x01,0x54,0x24,0x25,0xe6,0x51,0x08,0x1f,0x68,0x00,0x7f,0x03,0xf2,0x79,0xc0,0xf4,}; | ||||
| const uint8_t *_I_DolphinReadingSuccess_59x63[] = {_I_DolphinReadingSuccess_59x63_0}; | ||||
| 
 | ||||
| const uint8_t _I_Mute_hvr_25x27_0[] = {0x01,0x00,0x4a,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x20,0x21,0xfe,0x40,0x7b,0xf7,0xff,0x5c,0x07,0x7f,0xbf,0xf9,0xc0,0x6f,0xfd,0xff,0xd8,0x3c,0x7c,0x1f,0x90,0x38,0xff,0x7f,0x40,0x31,0xbd,0x82,0xc6,0xff,0xb7,0x01,0x97,0x3c,0x06,0xc0,0xb3,0x09,0x98,0x6c,0x84,0x68,0x2b,0x21,0x99,0x8e,0xcc,0x86,0x64,0xb5,0x01,0x89,0x5c,0xcb,0xe6,0x67,0x30,}; | ||||
| const uint8_t *_I_Mute_hvr_25x27[] = {_I_Mute_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Back_15x10_0[] = {0x00,0x04,0x00,0x06,0x00,0xFF,0x0F,0x06,0x10,0x04,0x20,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x10,0xFE,0x0F,}; | ||||
| const uint8_t *_I_Back_15x10[] = {_I_Back_15x10_0}; | ||||
| 
 | ||||
| const uint8_t _I_Up_25x27_0[] = {0x01,0x00,0x44,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x3c,0x88,0x00,0xca,0x70,0x03,0x2b,0xe0,0x0c,0xbf,0xc0,0x32,0xff,0x80,0x87,0x03,0xff,0x81,0xc0,0x78,0x3f,0xf8,0x3c,0x07,0xc3,0xff,0x87,0xc0,0x7e,0x3f,0xf8,0xf8,0x0d,0x06,0xfe,0x03,0x78,0x19,0x4c,0x60,0x30,0x68,0x07,0x02,0x01,0xfc,0xff,0xdf,0xcc,0xe8,}; | ||||
| const uint8_t *_I_Up_25x27[] = {_I_Up_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaArrowUp_4x8_0[] = {0x00,0x18,0x3C,0x7E,0xFF,}; | ||||
| const uint8_t *_I_IrdaArrowUp_4x8[] = {_I_IrdaArrowUp_4x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Mute_25x27_0[] = {0x01,0x00,0x51,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x20,0x31,0x81,0xc0,0x64,0x38,0x08,0xa4,0x06,0x83,0x40,0x86,0x40,0x70,0x32,0x08,0x20,0x3c,0x63,0xf0,0x60,0x38,0xc0,0xa0,0xa0,0x31,0xc2,0x02,0xc7,0x03,0x48,0x01,0x94,0xc0,0x06,0xc0,0xb3,0x09,0x98,0x6c,0x84,0x68,0x2b,0x21,0x99,0x8e,0xcc,0x86,0x64,0xb3,0x81,0x94,0xc6,0x03,0x06,0x80,0x70,0x20,0x1f,0xcf,0xfd,0xfc,0xce,0x80,}; | ||||
| const uint8_t *_I_Mute_25x27[] = {_I_Mute_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_Power_25x27_0[] = {0x01,0x00,0x54,0x00,0xfc,0x7f,0xe7,0xf0,0x08,0x24,0x02,0x81,0x00,0x81,0x40,0x30,0x10,0x08,0x08,0x38,0x60,0x30,0x18,0x80,0x0c,0xa7,0x00,0x35,0xc0,0xce,0x60,0x70,0x1e,0x0c,0xe6,0x0f,0x01,0xf0,0xce,0x21,0xd0,0x1b,0x0c,0xe2,0x18,0x03,0x58,0x80,0x0c,0xa0,0x00,0x39,0xf0,0xc0,0x03,0x63,0xc1,0x80,0x88,0xc7,0x03,0x83,0x15,0x8c,0x07,0xfe,0x02,0x18,0x0d,0xf0,0x76,0x44,0x73,0x01,0x94,0x0c,0xa6,0x30,0x18,0x34,0x03,0x81,0x00,0xfe,0x7f,0xef,0xe6,0x74,}; | ||||
| const uint8_t *_I_Power_25x27[] = {_I_Power_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaSendShort_128x34_0[] = {0x01,0x00,0x42,0x01,0xfe,0x7f,0xc0,0x07,0x03,0x07,0xc4,0x10,0x0a,0x90,0x20,0x7f,0x83,0xfc,0x04,0x3c,0x01,0xc2,0x7f,0xf8,0x80,0x43,0x9f,0x83,0xca,0x40,0x1f,0x5e,0x27,0x7e,0xab,0x55,0xee,0x83,0xce,0x38,0x0f,0x6d,0x50,0x00,0xa5,0xc0,0xf2,0x89,0x03,0xda,0xfe,0x1f,0x1f,0xa8,0x7c,0x48,0xc3,0x09,0x07,0xb6,0xae,0x54,0x1f,0x19,0xd4,0x08,0x40,0x30,0x5f,0x81,0x1c,0x63,0xfe,0x08,0x1f,0x12,0xbe,0x3f,0x49,0x0e,0x02,0x09,0x58,0x04,0x0c,0xd7,0xf1,0x0f,0x1f,0x8e,0x2b,0x11,0xaa,0x95,0x40,0xa2,0x34,0x08,0x16,0xa0,0x4e,0x32,0xab,0xe4,0x7f,0x89,0x77,0x0b,0x0d,0xd6,0x7f,0x82,0x84,0x50,0x20,0x3d,0x81,0x48,0xcd,0x67,0xd3,0xe1,0xf8,0xc8,0xb4,0x43,0xf1,0xc1,0x62,0x24,0x10,0x1b,0x46,0x80,0x3e,0x3f,0xe9,0xf8,0xfc,0xfa,0xa1,0xf1,0xa4,0x68,0x20,0x13,0x8a,0x00,0x7c,0x67,0xf7,0xe3,0xfa,0x4a,0x81,0xe3,0x40,0x80,0x66,0x38,0x66,0xa1,0xeb,0xdd,0x47,0xec,0x0f,0x2c,0x47,0x0e,0xa9,0x35,0xe9,0xd9,0x47,0xe2,0x1f,0x21,0xf8,0xd2,0x17,0xc3,0x88,0x91,0xeb,0x83,0xe6,0xbf,0x42,0x78,0xc4,0x20,0x10,0x88,0x05,0x5c,0x7e,0x7a,0xe1,0xfa,0x42,0x01,0xe5,0x84,0x1f,0x89,0x7c,0xbf,0xf7,0x7b,0xaf,0xdd,0x3e,0x31,0x10,0xe8,0xc2,0x3f,0x01,0xf1,0x3f,0x98,0x7c,0xa7,0x6a,0xf1,0x07,0x97,0x03,0x5e,0x9f,0x36,0x28,0xf7,0x7f,0xa1,0xf1,0x81,0x03,0xca,0x01,0x56,0x5f,0x9f,0xb8,0x3c,0x3e,0xa7,0xf8,0xc1,0x01,0xe5,0xf0,0x15,0x0f,0x85,0xbe,0x21,0xf1,0x00,0x08,0x7c,0x60,0x04,0xf1,0x77,0x96,0x7e,0x02,0xff,0x10,0x7c,0x00,0x16,0x08,0x05,0x40,0x78,0xa3,0xc4,0x00,0xb2,0x40,0x7b,0x2b,0xc4,0x00,0xb5,0x48,0x78,0x3d,0x70,0x01,0xf7,0x07,0xb4,0x00,0x94,0x23,0xfc,0x01,0x18,0x00,0xff,0x85,0xf3,0xff,0xc0,0xc3,0x0f,0x00,0xf0,0x09,0xce,0xf0,0x03,0x2f,0xc0,0x61,0x3f,0xe0,0xf8,0x00,0x30,0x3f,0xc0,}; | ||||
| const uint8_t *_I_IrdaSendShort_128x34[] = {_I_IrdaSendShort_128x34_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaArrowDown_4x8_0[] = {0x00,0xFF,0x7E,0x3C,0x18,}; | ||||
| const uint8_t *_I_IrdaArrowDown_4x8[] = {_I_IrdaArrowDown_4x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_IrdaLearn_128x64_0[] = {0x01,0x00,0xcc,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3f,0x01,0x07,0x82,0x41,0x21,0x20,0x73,0x00,0x8e,0x82,0x0f,0x00,0xa0,0x01,0x46,0x11,0x00,0x07,0xc0,0x28,0x41,0xe5,0xc8,0xba,0x63,0xa7,0x70,0x6b,0x3d,0xbb,0x99,0x19,0xee,0x68,0x71,0x16,0x3f,0x70,0x3c,0x64,0xf9,0x58,0x25,0x26,0x13,0x91,0xc9,0x64,0xa4,0x99,0x2d,0x06,0x1f,0x29,0x42,0x07,0x8c,0x80,0x1e,0x50,0xff,0x88,0x3c,0x67,0x80,0xf1,0xc1,0x03,0xde,0x03,0x11,0x07,0x8c,0x10,0x1e,0x38,0x40,0x79,0xf0,0x32,0x80,0xf1,0x83,0x58,0x72,0x58,0xc8,0xc6,0x73,0x40,0x3f,0x10,0x78,0x9e,0xf1,0x17,0xe9,0xcf,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x02,0x44,0x18,0xa3,0x80,0x82,0x32,0x06,0x44,0x0f,0xf0,0x73,0x5d,0xe3,0x92,0x7e,0xcf,0x06,0x3b,0xc3,0xa4,0xdd,0xfc,0xc8,0x35,0xca,0x44,0xa5,0x34,0x5c,0x16,0x92,0x89,0x4a,0x91,0x4a,0x60,0x20,0xf7,0xa4,0x83,0xc6,0x8e,0x0f,0xba,0x88,0x3c,0x68,0x00,0xf7,0x80,0x65,0xe3,0x9c,0x7a,0x6e,0x0a,0x49,0xc3,0xb8,0xc8,0xa4,0xc0,0xf5,0x00,0x08,0x1d,0xc0,0x0e,0x0f,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2f,0xfb,0xfe,0x00,0x38,0x39,0x97,0xa1,0x00,0xe7,0xf0,0x3b,0x1c,0x00,0xd9,0x00,0x32,0xc8,0x01,0xef,0x48,0x03,0x2d,0x03,0xe0,0x45,0x38,0x0d,0x02,0x01,0x28,0xc0,0x01,0xca,0x01,0x1f,0xa0,0x10,0x12,0x05,0x80,0x80,0x49,0x38,0x1a,0xa0,0x00,0xf0,0x6f,0xf8,0x08,0x20,0x38,0xac,0x10,0x48,0x44,0x06,0x25,0x40,0xaa,0x80,0x07,0xc3,0xfb,0x80,0x41,0x21,0x9b,0x0b,0x6e,0x4e,0x09,0x10,0x80,0xc2,0xb8,0x1f,0xe0,0xf8,0xfc,0x7e,0x30,0x10,0x7a,0xc8,0x20,0x50,0x9a,0x04,0x0c,0x3e,0x3f,0x12,0x48,0x83,0xc6,0x60,0x2f,0x29,0x14,0x0a,0x0b,0xc0,0x80,0x87,0xc7,0xf3,0xf1,0x81,0x8f,0xc7,0x01,0x6d,0x81,0xc7,0x24,0x90,0x28,0x17,0x02,0x39,0x5e,0xaa,0xee,0x75,0xd0,0x3e,0x27,0xb4,0x5e,0x30,0x39,0x20,0x3c,0xa8,0x11,0xcd,0x36,0xab,0x33,0x2e,0x07,0x90,0xbc,0x4d,0x82,0x0f,0x14,0x10,0xc7,0x2e,0x21,0xf3,0x17,0x88,0x7c,0x85,0xe3,0x82,0x4c,0x8c,0x03,0x70,0x3f,0x2b,0x19,0x3c,0x47,0xe2,0x04,0x19,0x10,0x3c,0xa4,0x15,0xc2,0xf9,0x7c,0x41,0xe2,0x2e,0x1f,0x81,0xbc,0x68,0x40,0xf1,0xe0,0x6f,0xcf,0xe5,0xf9,0x82,0x63,0x3e,0xfd,0xef,0x9a,0x3c,0x68,0x22,0xf2,0xbf,0x27,0xcb,0xf1,0x04,0xc0,0x03,0xc4,0x5e,0x30,0x80,0x79,0xec,0x17,0xe5,0xf0,0x67,0xb0,0x34,0x68,0x18,0x0a,0xfd,0x56,0x1b,0x1f,0xb0,0x3b,0xd9,0xc0,0x2e,0xf3,0x25,0x90,0x01,0x81,0xe2,0x00,0xe8,0x08,0x3f,0xa0,0x40,0xfe,0x53,0x88,0x03,0x4c,0xe8,0x00,0xa8,0x80,0x3f,0xa4,0x00,0xfe,0xe0,0x21,0xcc,0x00,0x47,0x7f,0x00,0x78,}; | ||||
| const uint8_t *_I_IrdaLearn_128x64[] = {_I_IrdaLearn_128x64_0}; | ||||
| 
 | ||||
| const uint8_t _I_Power_hvr_25x27_0[] = {0x01,0x00,0x4b,0x00,0xfc,0x7f,0xe7,0xf0,0x0f,0xe7,0xfe,0xff,0x00,0xff,0x7f,0xff,0xf0,0x00,0x10,0xff,0xe0,0x3f,0xff,0x78,0x0c,0xb8,0xe0,0x35,0xbf,0xf1,0xbf,0x90,0x19,0xff,0x1b,0xf1,0x01,0x8f,0xf1,0xfe,0x30,0x1c,0xff,0x1f,0xe6,0x03,0x5f,0x78,0x0c,0xbf,0xe0,0x39,0x8f,0xff,0xc3,0x63,0x3f,0xff,0x08,0xc6,0xff,0x7c,0x15,0x89,0x04,0x7f,0xc0,0x31,0xc1,0x8e,0xc8,0x8e,0x60,0x36,0x2b,0x99,0x7c,0xcc,0xe6,}; | ||||
| const uint8_t *_I_Power_hvr_25x27[] = {_I_Power_hvr_25x27_0}; | ||||
| 
 | ||||
| const uint8_t _I_KeySaveSelected_24x11_0[] = {0x01,0x00,0x1a,0x00,0xff,0x7f,0xc0,0x0d,0xcf,0xb4,0x7c,0xee,0xf6,0xbf,0x6d,0xbe,0xd7,0xe1,0xaf,0xda,0xff,0xbe,0x7c,0xc7,0xcc,0x28,0xa1,0xd1,0xbf,0x80,}; | ||||
| const uint8_t *_I_KeySaveSelected_24x11[] = {_I_KeySaveSelected_24x11_0}; | ||||
| @ -202,6 +199,12 @@ const uint8_t *_I_KeySaveSelected_24x11[] = {_I_KeySaveSelected_24x11_0}; | ||||
| const uint8_t _I_KeyBackspace_16x9_0[] = {0x00,0xFE,0x7F,0x01,0x80,0x11,0x80,0x19,0x80,0xFD,0xBF,0x19,0x80,0x11,0x80,0x01,0x80,0xFE,0x7F,}; | ||||
| const uint8_t *_I_KeyBackspace_16x9[] = {_I_KeyBackspace_16x9_0}; | ||||
| 
 | ||||
| const uint8_t _I_KeyBackspaceSelected_16x9_0[] = {0x00,0xFE,0x7F,0xFF,0xFF,0xEF,0xFF,0xE7,0xFF,0x03,0xC0,0xE7,0xFF,0xEF,0xFF,0xFF,0xFF,0xFE,0x7F,}; | ||||
| const uint8_t *_I_KeyBackspaceSelected_16x9[] = {_I_KeyBackspaceSelected_16x9_0}; | ||||
| 
 | ||||
| const uint8_t _I_KeySave_24x11_0[] = {0x01,0x00,0x1e,0x00,0xff,0x7f,0xff,0xf0,0x18,0x06,0x00,0x04,0x53,0x1c,0xbe,0x33,0x13,0x94,0xc9,0x64,0x72,0x99,0xed,0x0e,0x53,0x05,0x19,0xb3,0xe3,0x02,0x8a,0x1d,0x1b,0xf8,}; | ||||
| const uint8_t *_I_KeySave_24x11[] = {_I_KeySave_24x11_0}; | ||||
| 
 | ||||
| const uint8_t _A_125khz_14_0[] = {0x00,0x80,0x07,0x00,0x08,0x00,0x13,0x00,0x24,0x0E,0x28,0x71,0x28,0x85,0x21,0x01,0x02,0x62,0x02,0x92,0x02,0x92,0x02,0x64,0x02,0x04,0x01,0xF8,0x00,}; | ||||
| const uint8_t _A_125khz_14_1[] = {0x00,0x80,0x07,0x00,0x08,0x00,0x10,0x00,0x20,0x0E,0x20,0x71,0x20,0x85,0x21,0x01,0x02,0x62,0x02,0x92,0x02,0x92,0x02,0x64,0x02,0x04,0x01,0xF8,0x00,}; | ||||
| const uint8_t _A_125khz_14_2[] = {0x01,0x00,0x17,0x00,0x00,0x3c,0x3a,0x01,0x71,0x80,0x61,0x60,0x30,0x18,0x15,0x8a,0x05,0x92,0x00,0x95,0x92,0x05,0x04,0x80,0xfe,0x20,0x00,}; | ||||
| @ -344,45 +347,45 @@ const uint8_t *_I_Detailed_chip_17x13[] = {_I_Detailed_chip_17x13_0}; | ||||
| const uint8_t _I_Medium_chip_22x21_0[] = {0x01,0x00,0x35,0x00,0xfe,0x7f,0xe1,0xf0,0x28,0x04,0x43,0xf3,0xff,0x93,0xe1,0x6a,0x52,0x8e,0x2f,0xfe,0x51,0x25,0x80,0x4a,0x72,0xb6,0x79,0x55,0x76,0xc1,0x2e,0xaa,0xc0,0x25,0x51,0xdc,0x00,0x14,0x70,0x00,0x56,0xae,0x81,0x47,0x2b,0x7d,0x95,0x07,0x48,0x46,0x42,0x92,0x17,0x90,0xd4,0x87,0x64,}; | ||||
| const uint8_t *_I_Medium_chip_22x21[] = {_I_Medium_chip_22x21_0}; | ||||
| 
 | ||||
| const uint8_t _I_Health_16x16_0[] = {0x01,0x00,0x12,0x00,0x00,0x2f,0x02,0x03,0x40,0x00,0x95,0xe2,0x1f,0x08,0x84,0x00,0xc4,0x12,0x60,0xf1,0x0c,0xb8,}; | ||||
| const uint8_t *_I_Health_16x16[] = {_I_Health_16x16_0}; | ||||
| const uint8_t _I_BatteryBody_52x28_0[] = {0x01,0x00,0x45,0x00,0xe0,0x7f,0x3f,0xe0,0x02,0x87,0xf0,0x21,0xe0,0xc3,0x84,0x50,0x39,0xbf,0xff,0x27,0xfe,0xf3,0x09,0xe0,0x42,0x81,0xab,0x0d,0x03,0x1c,0x2b,0xfc,0x0d,0x48,0x55,0xdc,0x1a,0x90,0x8f,0x18,0x6d,0x41,0xaa,0x1b,0x71,0x4b,0x0d,0xd4,0x1b,0xe0,0xdf,0x1b,0xd5,0xfc,0x1a,0xa5,0x36,0x06,0xac,0x20,0xa7,0xe0,0xdc,0xa5,0x7c,0x7c,0xb7,0xff,0xb4,0x21,0x5c,0xcb,0xc6,}; | ||||
| const uint8_t *_I_BatteryBody_52x28[] = {_I_BatteryBody_52x28_0}; | ||||
| 
 | ||||
| const uint8_t _I_FaceCharging_29x14_0[] = {0x01,0x00,0x28,0x00,0xa0,0x00,0x86,0x05,0x60,0x01,0x8c,0x0e,0x61,0x00,0xc0,0x40,0x63,0x10,0x0e,0x04,0x03,0xf9,0x00,0xf0,0x41,0xc0,0x66,0x13,0xb8,0x40,0x94,0xc0,0x07,0x04,0x82,0x00,0xc6,0x11,0x02,0x01,0x8f,0xc2,0x03,0x00,}; | ||||
| const uint8_t *_I_FaceCharging_29x14[] = {_I_FaceCharging_29x14_0}; | ||||
| 
 | ||||
| const uint8_t _I_BatteryBody_52x28_0[] = {0x01,0x00,0x45,0x00,0xe0,0x7f,0x3f,0xe0,0x02,0x87,0xf0,0x21,0xe0,0xc3,0x84,0x50,0x39,0xbf,0xff,0x27,0xfe,0xf3,0x09,0xe0,0x42,0x81,0xab,0x0d,0x03,0x1c,0x2b,0xfc,0x0d,0x48,0x55,0xdc,0x1a,0x90,0x8f,0x18,0x6d,0x41,0xaa,0x1b,0x71,0x4b,0x0d,0xd4,0x1b,0xe0,0xdf,0x1b,0xd5,0xfc,0x1a,0xa5,0x36,0x06,0xac,0x20,0xa7,0xe0,0xdc,0xa5,0x7c,0x7c,0xb7,0xff,0xb4,0x21,0x5c,0xcb,0xc6,}; | ||||
| const uint8_t *_I_BatteryBody_52x28[] = {_I_BatteryBody_52x28_0}; | ||||
| 
 | ||||
| const uint8_t _I_Voltage_16x16_0[] = {0x01,0x00,0x1a,0x00,0x00,0x24,0x0a,0x01,0x03,0xc0,0x40,0x78,0x10,0x1f,0x04,0x03,0xe1,0x07,0xc0,0x40,0xc0,0xe3,0xc0,0x80,0x58,0x20,0x12,0x00,0xd3,0x00,}; | ||||
| const uint8_t *_I_Voltage_16x16[] = {_I_Voltage_16x16_0}; | ||||
| const uint8_t _I_Health_16x16_0[] = {0x01,0x00,0x12,0x00,0x00,0x2f,0x02,0x03,0x40,0x00,0x95,0xe2,0x1f,0x08,0x84,0x00,0xc4,0x12,0x60,0xf1,0x0c,0xb8,}; | ||||
| const uint8_t *_I_Health_16x16[] = {_I_Health_16x16_0}; | ||||
| 
 | ||||
| const uint8_t _I_Temperature_16x16_0[] = {0x01,0x00,0x12,0x00,0x00,0x1e,0x02,0x01,0x40,0x80,0x80,0x66,0x41,0x02,0xf0,0x40,0xc0,0x23,0xc0,0x80,0x86,0xd4,}; | ||||
| const uint8_t *_I_Temperature_16x16[] = {_I_Temperature_16x16_0}; | ||||
| 
 | ||||
| const uint8_t _I_FaceNopower_29x14_0[] = {0x01,0x00,0x24,0x00,0x00,0x1f,0x02,0x01,0x60,0x01,0xa7,0x80,0x02,0x57,0xe0,0x48,0xc3,0xe7,0xd0,0x0c,0x04,0x3c,0x39,0x1f,0x88,0x18,0x0c,0x61,0x90,0x60,0x18,0xff,0x82,0x44,0x03,0x38,0x74,0x38,0x2c,0x80,}; | ||||
| const uint8_t *_I_FaceNopower_29x14[] = {_I_FaceNopower_29x14_0}; | ||||
| 
 | ||||
| const uint8_t _I_FaceNormal_29x14_0[] = {0x01,0x00,0x1e,0x00,0x00,0x1c,0xf2,0x01,0x80,0x83,0xd7,0xa0,0x1c,0x08,0x5d,0xf8,0x06,0x30,0xf0,0x1b,0x84,0xcc,0x41,0x10,0x88,0x10,0x0e,0x62,0x10,0x10,0x18,0xf8,0x00,0x42,}; | ||||
| const uint8_t *_I_FaceNormal_29x14[] = {_I_FaceNormal_29x14_0}; | ||||
| 
 | ||||
| const uint8_t _I_Battery_16x16_0[] = {0x01,0x00,0x12,0x00,0x00,0x1e,0x02,0x03,0xc0,0x81,0xc8,0x20,0x80,0x11,0xd0,0x41,0x40,0x72,0x11,0x10,0xda,0x80,}; | ||||
| const uint8_t *_I_Battery_16x16[] = {_I_Battery_16x16_0}; | ||||
| 
 | ||||
| const uint8_t _I_FaceConfused_29x14_0[] = {0x01,0x00,0x30,0x00,0xc0,0x00,0x46,0x1f,0x38,0x80,0xd0,0x22,0x14,0x48,0x0c,0x82,0x0f,0x52,0x80,0xe8,0x21,0x14,0xa0,0x18,0xc2,0xa6,0x59,0x19,0x24,0x27,0x09,0x48,0xa1,0x41,0x2f,0x12,0x4c,0x0c,0x0c,0x51,0x1f,0xc8,0x78,0x0c,0x7f,0xd1,0xf0,0x18,0xc3,0xa3,0x00,0x74,}; | ||||
| const uint8_t *_I_FaceConfused_29x14[] = {_I_FaceConfused_29x14_0}; | ||||
| 
 | ||||
| const uint8_t _I_RFIDDolphinSuccess_108x57_0[] = {0x01,0x00,0xe7,0x01,0x00,0x0f,0x03,0xff,0x1f,0x06,0xd4,0xe2,0x01,0xe0,0x06,0xd4,0x18,0x04,0x30,0x30,0x64,0x60,0x20,0x20,0x31,0x86,0x03,0x62,0x80,0x03,0x28,0x80,0x36,0x24,0x00,0x36,0x00,0x28,0x5c,0xc3,0xe6,0x00,0x58,0x40,0xec,0xc1,0xb1,0x04,0x02,0x19,0x24,0x80,0x0b,0x02,0x02,0x40,0x37,0xc4,0x8c,0x2e,0x40,0x6f,0x93,0x8b,0x81,0x07,0x06,0xdc,0xc2,0x38,0x66,0x50,0x6a,0xe2,0x27,0xe0,0xd2,0xfc,0x08,0x09,0x0c,0x9c,0x4b,0x98,0x34,0xa0,0xe1,0xd5,0x06,0x8f,0x92,0xc2,0x05,0x1e,0x42,0xe1,0x81,0xa3,0xe2,0xf0,0xbc,0x4c,0x1a,0xff,0x2f,0x9b,0x80,0xd8,0xca,0x05,0x1f,0x97,0xfd,0xf8,0x60,0xd2,0x01,0x1e,0x00,0x1a,0x5c,0x00,0x08,0xc9,0xc1,0xab,0x40,0xf9,0x83,0x46,0x61,0x00,0xd8,0x4a,0x81,0xab,0xa0,0xf3,0x5f,0xc6,0x05,0x58,0x8a,0xa4,0x09,0x76,0x21,0xb1,0xf2,0x83,0x4f,0x5d,0x1a,0x01,0x8c,0x90,0x1a,0x31,0x0d,0x07,0xa9,0x16,0x50,0x0a,0xac,0x34,0xba,0x42,0xa1,0x88,0x50,0x23,0xaa,0x72,0xe0,0x6a,0xa1,0x4a,0x32,0x39,0x88,0x6c,0x60,0xc7,0x82,0xb0,0x55,0x60,0xa2,0x92,0x80,0xc0,0x43,0x63,0x03,0x25,0x96,0xe3,0x54,0x33,0x18,0xc4,0x90,0x22,0x21,0x81,0x81,0x03,0x4a,0xa9,0x55,0x7a,0x17,0xf3,0x82,0x9f,0x6d,0x5e,0xa9,0xb6,0x50,0x38,0x70,0x35,0x70,0x15,0x5a,0xa9,0xb8,0xa3,0x46,0x12,0x06,0x9f,0x83,0x54,0x8a,0x28,0x80,0x34,0xfc,0x08,0x93,0xaa,0xc7,0x40,0x83,0x83,0x81,0xd3,0xa1,0xd1,0x08,0x84,0x0c,0x24,0x3f,0xed,0x54,0x18,0x26,0x50,0x20,0xd9,0x42,0x21,0x90,0x4c,0x07,0xff,0xae,0x52,0x20,0x6a,0xc4,0x23,0x1f,0x88,0x3f,0xf0,0x1a,0x45,0x31,0xe7,0x03,0x4a,0x41,0xe0,0x69,0x0f,0xc2,0x1e,0x0d,0x19,0x80,0x48,0xa2,0x10,0xc5,0x68,0xdf,0x0a,0x82,0xb9,0x28,0x22,0x2c,0xe3,0x0a,0xd1,0x2b,0x0f,0x00,0x3c,0x22,0x91,0x53,0x9c,0x50,0x1a,0x30,0x08,0x39,0x1c,0x60,0x6d,0x12,0x3d,0x8c,0xc2,0x51,0x00,0x17,0x0c,0xe2,0x01,0xff,0x83,0x84,0xc6,0x40,0xb0,0x19,0x84,0xd0,0x1a,0x5c,0x08,0x1f,0xf8,0x8c,0x50,0x43,0x08,0xce,0x2d,0x06,0x71,0x5f,0x17,0xfe,0x12,0xdf,0x20,0x69,0x55,0x01,0xa6,0x00,0x18,0x40,0xa4,0x80,0x63,0x3c,0xb5,0x03,0x56,0x08,0x8b,0x20,0x10,0xcf,0x03,0x62,0x08,0x20,0x00,0x94,0xc6,0x01,0x70,0x01,0x0c,0xe8,0x36,0x20,0xd3,0xe0,0x00,0xcb,0x10,0x02,0x19,0xf3,0x9c,0x41,0xa3,0x15,0x31,0x90,0x00,0x70,0xc0,0x21,0xdd,0x86,0xc4,0x78,0x3e,0xa3,0x71,0xe0,0x30,0x20,0x31,0xbe,0x86,0xc4,0x1a,0x35,0x40,0x20,0x8d,0x89,0x28,0x5b,0xa0,0xd9,0xea,0x3d,0x44,0x42,0x87,0x83,0x48,0x36,0x49,0xe1,0xa0,0x75,0x67,0x8d,0x41,0x54,0x14,0x03,0xf5,0x2a,0x06,0x96,0x03,0x54,0xc4,0x14,0xd0,0x83,0x4a,0xfb,0x35,0x06,0x90,0x38,0x4e,0x46,0xb4,0x10,0xd9,0x81,0x49,0x72,0x40,0x01,0x0a,0x95,0xd4,0x36,0x20,0xd7,0x55,0x10,}; | ||||
| const uint8_t *_I_RFIDDolphinSuccess_108x57[] = {_I_RFIDDolphinSuccess_108x57_0}; | ||||
| const uint8_t _I_FaceNormal_29x14_0[] = {0x01,0x00,0x1e,0x00,0x00,0x1c,0xf2,0x01,0x80,0x83,0xd7,0xa0,0x1c,0x08,0x5d,0xf8,0x06,0x30,0xf0,0x1b,0x84,0xcc,0x41,0x10,0x88,0x10,0x0e,0x62,0x10,0x10,0x18,0xf8,0x00,0x42,}; | ||||
| const uint8_t *_I_FaceNormal_29x14[] = {_I_FaceNormal_29x14_0}; | ||||
| 
 | ||||
| const uint8_t _I_RFIDBigChip_37x36_0[] = {0x01,0x00,0x6e,0x00,0x83,0x01,0x0f,0xcd,0xff,0x00,0x0c,0x1e,0x24,0x08,0x28,0x47,0x24,0x12,0x51,0x39,0x28,0x24,0xa2,0x91,0x5e,0x07,0xab,0xfe,0x04,0x1c,0x04,0xaa,0x01,0x15,0x02,0x28,0x4c,0x81,0x2c,0x04,0x4e,0x05,0xfc,0x08,0x35,0x59,0x06,0x02,0x81,0x15,0xca,0xe4,0x26,0xf2,0x10,0x70,0xd7,0x66,0x11,0x70,0x70,0xd4,0x20,0x14,0x10,0x70,0xc7,0x68,0x13,0x70,0x70,0xd4,0x28,0x10,0x10,0x4a,0x84,0xc6,0x80,0x13,0x10,0xe8,0xd0,0x03,0xa2,0x27,0x19,0xf0,0x9c,0x46,0x28,0x3b,0x42,0xcf,0x96,0x6a,0xd4,0x13,0x6f,0x2a,0x2c,0xa2,0x90,0x54,0x59,0xfe,0x52,0xa7,0x02,0x4f,0x9f,0xf1,0x52,0x60,}; | ||||
| const uint8_t *_I_RFIDBigChip_37x36[] = {_I_RFIDBigChip_37x36_0}; | ||||
| const uint8_t _I_Voltage_16x16_0[] = {0x01,0x00,0x1a,0x00,0x00,0x24,0x0a,0x01,0x03,0xc0,0x40,0x78,0x10,0x1f,0x04,0x03,0xe1,0x07,0xc0,0x40,0xc0,0xe3,0xc0,0x80,0x58,0x20,0x12,0x00,0xd3,0x00,}; | ||||
| const uint8_t *_I_Voltage_16x16[] = {_I_Voltage_16x16_0}; | ||||
| 
 | ||||
| const uint8_t _I_FaceNopower_29x14_0[] = {0x01,0x00,0x24,0x00,0x00,0x1f,0x02,0x01,0x60,0x01,0xa7,0x80,0x02,0x57,0xe0,0x48,0xc3,0xe7,0xd0,0x0c,0x04,0x3c,0x39,0x1f,0x88,0x18,0x0c,0x61,0x90,0x60,0x18,0xff,0x82,0x44,0x03,0x38,0x74,0x38,0x2c,0x80,}; | ||||
| const uint8_t *_I_FaceNopower_29x14[] = {_I_FaceNopower_29x14_0}; | ||||
| 
 | ||||
| const uint8_t _I_RFIDDolphinSend_97x61_0[] = {0x01,0x00,0x8d,0x01,0x00,0x0f,0xfa,0x3e,0x04,0x2a,0x00,0x2d,0x78,0x10,0x1f,0x04,0x04,0x0a,0x38,0x00,0x62,0xcc,0x00,0x43,0x06,0x06,0x44,0x30,0x04,0x31,0x80,0x31,0x07,0x48,0x00,0x50,0x20,0x10,0xc8,0x01,0x64,0x0c,0x1d,0x04,0x28,0x24,0x83,0xd2,0x81,0x04,0xc4,0x18,0x42,0xc3,0x01,0x90,0x30,0xbe,0x05,0x51,0x29,0xa0,0x74,0x60,0x80,0xc1,0x84,0x0b,0x44,0x5e,0x43,0x73,0x82,0x41,0x20,0x1e,0x4a,0x68,0x31,0x27,0x90,0x48,0x84,0x20,0x18,0x31,0x7e,0x64,0x06,0x20,0x0c,0x2a,0x14,0x12,0x40,0x0c,0x28,0xa0,0xc4,0x41,0x87,0x81,0x17,0x08,0x30,0xa0,0xfd,0x08,0x0c,0x20,0xfc,0x38,0x08,0xc4,0x24,0x32,0x95,0x02,0x18,0xc2,0x61,0x18,0x09,0x20,0x31,0x03,0x25,0x84,0x1d,0x88,0x30,0x62,0x21,0x96,0xe2,0x44,0x22,0x00,0xc2,0x26,0xa0,0x64,0x68,0x80,0xc4,0x33,0x9e,0x92,0x9f,0x00,0xa3,0x48,0x24,0x00,0xc4,0x40,0xa4,0xa8,0x18,0xa9,0xb5,0x9b,0x48,0x28,0x05,0xa1,0x06,0x22,0xd4,0xa3,0x7e,0x05,0x98,0xe0,0x4f,0x22,0xcf,0x58,0x6f,0x80,0x10,0x34,0x24,0x31,0x3a,0x52,0x0f,0xe0,0x03,0x0c,0xf1,0xee,0x2d,0x63,0x00,0x0c,0x0f,0xe0,0x13,0x28,0xa0,0x31,0xa0,0x3f,0x08,0x18,0x10,0x45,0xa2,0xe3,0x40,0x00,0xf4,0x3f,0xe1,0xa1,0x84,0x02,0x94,0x18,0xb0,0xc0,0x63,0xc6,0x3f,0xe0,0x31,0x87,0x03,0x1e,0x11,0x3c,0x80,0x47,0xc1,0x90,0x56,0x1b,0x06,0x01,0xc0,0x20,0x06,0x17,0x88,0xf8,0x60,0xa0,0xc7,0x31,0x8a,0x58,0x60,0xe1,0x99,0x00,0x08,0x9a,0x01,0x06,0xd9,0x10,0x03,0x1f,0x44,0x19,0x43,0xc3,0x40,0xc4,0x2c,0x19,0x58,0x08,0x29,0xa0,0x60,0x0c,0xf2,0x00,0x27,0x02,0x05,0x20,0x06,0x4d,0x02,0x0b,0xc0,0x02,0x08,0x3c,0x80,0x09,0xa0,0x39,0x0a,0xd4,0x41,0x8f,0x50,0x05,0x09,0xa4,0x5b,0x4d,0x00,0xd8,0x23,0xc4,0x96,0x20,0xc7,0xac,0x40,0x2d,0x53,0x00,0x64,0x6b,0x20,0x1d,0x4a,0x08,0x32,0x2a,0x90,0x0d,0x46,0x0e,0x02,0x0c,0x79,0x51,0x08,0x61,0xf0,0x20,0x63,0xc5,0x4b,0x83,0x1e,0xfe,0x57,0xd3,0x51,0x40,0xbe,0xc0,0x08,0x42,0x00,0x53,0x30,0xe8,0x3f,0x50,0x14,0x73,0x80,0x0b,0xeb,0x07,0x61,0x40,0x00,0x7d,0x5f,0xf8,0x38,0x32,0x7a,0x03,0xf7,0x55,0xa6,0x78,0x19,0x54,0x0c,0xa8,0x32,0xa0,0x19,0xa0,0x65,0xc4,0x0b,0xe2,0x00,0x98,0x40,0x33,0xc1,0x92,0xfa,0x10,0x67,0x80,0x08,}; | ||||
| const uint8_t *_I_RFIDDolphinSend_97x61[] = {_I_RFIDDolphinSend_97x61_0}; | ||||
| 
 | ||||
| const uint8_t _I_RFIDDolphinSuccess_108x57_0[] = {0x01,0x00,0xe7,0x01,0x00,0x0f,0x03,0xff,0x1f,0x06,0xd4,0xe2,0x01,0xe0,0x06,0xd4,0x18,0x04,0x30,0x30,0x64,0x60,0x20,0x20,0x31,0x86,0x03,0x62,0x80,0x03,0x28,0x80,0x36,0x24,0x00,0x36,0x00,0x28,0x5c,0xc3,0xe6,0x00,0x58,0x40,0xec,0xc1,0xb1,0x04,0x02,0x19,0x24,0x80,0x0b,0x02,0x02,0x40,0x37,0xc4,0x8c,0x2e,0x40,0x6f,0x93,0x8b,0x81,0x07,0x06,0xdc,0xc2,0x38,0x66,0x50,0x6a,0xe2,0x27,0xe0,0xd2,0xfc,0x08,0x09,0x0c,0x9c,0x4b,0x98,0x34,0xa0,0xe1,0xd5,0x06,0x8f,0x92,0xc2,0x05,0x1e,0x42,0xe1,0x81,0xa3,0xe2,0xf0,0xbc,0x4c,0x1a,0xff,0x2f,0x9b,0x80,0xd8,0xca,0x05,0x1f,0x97,0xfd,0xf8,0x60,0xd2,0x01,0x1e,0x00,0x1a,0x5c,0x00,0x08,0xc9,0xc1,0xab,0x40,0xf9,0x83,0x46,0x61,0x00,0xd8,0x4a,0x81,0xab,0xa0,0xf3,0x5f,0xc6,0x05,0x58,0x8a,0xa4,0x09,0x76,0x21,0xb1,0xf2,0x83,0x4f,0x5d,0x1a,0x01,0x8c,0x90,0x1a,0x31,0x0d,0x07,0xa9,0x16,0x50,0x0a,0xac,0x34,0xba,0x42,0xa1,0x88,0x50,0x23,0xaa,0x72,0xe0,0x6a,0xa1,0x4a,0x32,0x39,0x88,0x6c,0x60,0xc7,0x82,0xb0,0x55,0x60,0xa2,0x92,0x80,0xc0,0x43,0x63,0x03,0x25,0x96,0xe3,0x54,0x33,0x18,0xc4,0x90,0x22,0x21,0x81,0x81,0x03,0x4a,0xa9,0x55,0x7a,0x17,0xf3,0x82,0x9f,0x6d,0x5e,0xa9,0xb6,0x50,0x38,0x70,0x35,0x70,0x15,0x5a,0xa9,0xb8,0xa3,0x46,0x12,0x06,0x9f,0x83,0x54,0x8a,0x28,0x80,0x34,0xfc,0x08,0x93,0xaa,0xc7,0x40,0x83,0x83,0x81,0xd3,0xa1,0xd1,0x08,0x84,0x0c,0x24,0x3f,0xed,0x54,0x18,0x26,0x50,0x20,0xd9,0x42,0x21,0x90,0x4c,0x07,0xff,0xae,0x52,0x20,0x6a,0xc4,0x23,0x1f,0x88,0x3f,0xf0,0x1a,0x45,0x31,0xe7,0x03,0x4a,0x41,0xe0,0x69,0x0f,0xc2,0x1e,0x0d,0x19,0x80,0x48,0xa2,0x10,0xc5,0x68,0xdf,0x0a,0x82,0xb9,0x28,0x22,0x2c,0xe3,0x0a,0xd1,0x2b,0x0f,0x00,0x3c,0x22,0x91,0x53,0x9c,0x50,0x1a,0x30,0x08,0x39,0x1c,0x60,0x6d,0x12,0x3d,0x8c,0xc2,0x51,0x00,0x17,0x0c,0xe2,0x01,0xff,0x83,0x84,0xc6,0x40,0xb0,0x19,0x84,0xd0,0x1a,0x5c,0x08,0x1f,0xf8,0x8c,0x50,0x43,0x08,0xce,0x2d,0x06,0x71,0x5f,0x17,0xfe,0x12,0xdf,0x20,0x69,0x55,0x01,0xa6,0x00,0x18,0x40,0xa4,0x80,0x63,0x3c,0xb5,0x03,0x56,0x08,0x8b,0x20,0x10,0xcf,0x03,0x62,0x08,0x20,0x00,0x94,0xc6,0x01,0x70,0x01,0x0c,0xe8,0x36,0x20,0xd3,0xe0,0x00,0xcb,0x10,0x02,0x19,0xf3,0x9c,0x41,0xa3,0x15,0x31,0x90,0x00,0x70,0xc0,0x21,0xdd,0x86,0xc4,0x78,0x3e,0xa3,0x71,0xe0,0x30,0x20,0x31,0xbe,0x86,0xc4,0x1a,0x35,0x40,0x20,0x8d,0x89,0x28,0x5b,0xa0,0xd9,0xea,0x3d,0x44,0x42,0x87,0x83,0x48,0x36,0x49,0xe1,0xa0,0x75,0x67,0x8d,0x41,0x54,0x14,0x03,0xf5,0x2a,0x06,0x96,0x03,0x54,0xc4,0x14,0xd0,0x83,0x4a,0xfb,0x35,0x06,0x90,0x38,0x4e,0x46,0xb4,0x10,0xd9,0x81,0x49,0x72,0x40,0x01,0x0a,0x95,0xd4,0x36,0x20,0xd7,0x55,0x10,}; | ||||
| const uint8_t *_I_RFIDDolphinSuccess_108x57[] = {_I_RFIDDolphinSuccess_108x57_0}; | ||||
| 
 | ||||
| const uint8_t _I_RFIDDolphinReceive_97x61_0[] = {0x01,0x00,0x87,0x01,0x00,0x0f,0xfa,0x3e,0x04,0x28,0x08,0x2d,0x78,0x10,0x1f,0x00,0x24,0x70,0x01,0x86,0x98,0x00,0x86,0x0c,0x0c,0x88,0x60,0x08,0x63,0x10,0x0a,0x00,0x31,0xa0,0x40,0x21,0x90,0x03,0x04,0x1a,0x5a,0x08,0x50,0xe9,0x01,0x23,0x20,0x07,0x88,0x30,0xc5,0xa6,0x03,0x10,0x61,0xfc,0x0a,0xa2,0x2d,0x48,0x0c,0x82,0x20,0x04,0x18,0x40,0x40,0x42,0x44,0x37,0x28,0x80,0x30,0xbc,0x94,0xd0,0x62,0x4f,0x20,0x91,0x08,0x44,0x12,0x01,0x17,0xe6,0x40,0x42,0x45,0x00,0xa1,0x03,0x08,0xa8,0x31,0x41,0x88,0x83,0x0f,0x03,0x08,0x06,0x1c,0x1f,0xa1,0x01,0x84,0x1f,0x8a,0x31,0x09,0x0c,0xa5,0x40,0x86,0x30,0x98,0x46,0x02,0x48,0x0c,0x40,0xc9,0x61,0x00,0xe2,0x0c,0x18,0x88,0x65,0xb8,0x85,0x51,0x06,0x21,0x34,0x83,0x23,0x44,0x06,0x29,0x1c,0xb4,0x94,0xf8,0x05,0x19,0x12,0x20,0xc2,0x40,0xb4,0xa8,0x18,0xa9,0xb5,0x9b,0x48,0x28,0x05,0xa1,0x06,0x22,0xd4,0xa3,0x7e,0x05,0x98,0xe0,0x62,0x0c,0xf6,0x86,0xf8,0x16,0x63,0x42,0x06,0x0b,0xa1,0x60,0xfe,0x06,0xe8,0xcf,0x23,0x0d,0x53,0x00,0x14,0x0f,0xe0,0xea,0x28,0xa0,0x31,0xa0,0x3f,0x08,0x18,0x10,0x45,0xa2,0x11,0x20,0x01,0xf4,0x3f,0xe0,0x81,0x84,0x02,0x94,0x18,0xb0,0xc0,0x63,0xc6,0x3f,0xe0,0x31,0x87,0x03,0x1e,0x11,0x3c,0x80,0x47,0xc1,0x91,0x18,0x80,0x58,0x30,0x0e,0x01,0x00,0x30,0xbc,0x47,0xc3,0x05,0x06,0x3c,0x52,0x00,0xe4,0x20,0xcc,0x80,0x04,0x4d,0x00,0x83,0x73,0x08,0x01,0x8f,0xa2,0x0c,0xa1,0xe1,0xa0,0x62,0x16,0x0c,0xac,0x04,0x14,0xd0,0x30,0x08,0x80,0x31,0xb8,0x10,0x27,0x89,0x03,0x1e,0x81,0x05,0xe0,0x01,0x04,0x1e,0x40,0x04,0xd0,0x1c,0x85,0x6a,0x20,0xc7,0xa8,0x02,0x84,0xd2,0x34,0x00,0x63,0x6c,0x11,0xe2,0x4b,0x10,0x63,0xd6,0x20,0x16,0xa9,0x80,0x32,0x35,0x90,0x0e,0xa5,0x04,0x19,0x15,0x48,0x06,0xa3,0x07,0x01,0x06,0x3c,0xa8,0x84,0x30,0xf8,0x10,0x31,0xe2,0xa5,0xc1,0x8f,0x7f,0x2b,0xe9,0xa8,0xa0,0x5f,0x60,0x04,0x21,0x00,0x29,0x98,0x74,0x1f,0xa8,0x0a,0x39,0xc0,0x05,0xf5,0x83,0xb0,0xa0,0x00,0x3e,0xaf,0xfc,0x1c,0x19,0x3d,0x01,0xfb,0xaa,0xd3,0x3c,0x0c,0xaa,0x06,0x54,0x19,0x50,0x0c,0xd0,0x32,0xe2,0x05,0xf1,0x00,0x4c,0x20,0x19,0xe0,0xc9,0x7d,0x08,0x33,0xc0,0x04,}; | ||||
| const uint8_t *_I_RFIDDolphinReceive_97x61[] = {_I_RFIDDolphinReceive_97x61_0}; | ||||
| 
 | ||||
| const uint8_t _I_RFIDBigChip_37x36_0[] = {0x01,0x00,0x6e,0x00,0x83,0x01,0x0f,0xcd,0xff,0x00,0x0c,0x1e,0x24,0x08,0x28,0x47,0x24,0x12,0x51,0x39,0x28,0x24,0xa2,0x91,0x5e,0x07,0xab,0xfe,0x04,0x1c,0x04,0xaa,0x01,0x15,0x02,0x28,0x4c,0x81,0x2c,0x04,0x4e,0x05,0xfc,0x08,0x35,0x59,0x06,0x02,0x81,0x15,0xca,0xe4,0x26,0xf2,0x10,0x70,0xd7,0x66,0x11,0x70,0x70,0xd4,0x20,0x14,0x10,0x70,0xc7,0x68,0x13,0x70,0x70,0xd4,0x28,0x10,0x10,0x4a,0x84,0xc6,0x80,0x13,0x10,0xe8,0xd0,0x03,0xa2,0x27,0x19,0xf0,0x9c,0x46,0x28,0x3b,0x42,0xcf,0x96,0x6a,0xd4,0x13,0x6f,0x2a,0x2c,0xa2,0x90,0x54,0x59,0xfe,0x52,0xa7,0x02,0x4f,0x9f,0xf1,0x52,0x60,}; | ||||
| const uint8_t *_I_RFIDBigChip_37x36[] = {_I_RFIDBigChip_37x36_0}; | ||||
| 
 | ||||
| const uint8_t _I_SDQuestion_35x43_0[] = {0x01,0x00,0x67,0x00,0xf8,0x7f,0xc0,0x03,0x03,0xfc,0x01,0x0a,0x0f,0x38,0xa4,0xe4,0xa4,0x80,0x4f,0x0c,0x20,0x13,0xc0,0x9f,0x80,0x02,0x15,0xfe,0x00,0x04,0x29,0xfc,0x03,0xfd,0x07,0xfa,0x47,0xe7,0xdf,0xc8,0x3f,0xea,0x1f,0x7f,0xfc,0x41,0xff,0xb8,0xff,0xf8,0x10,0x7f,0xe0,0x4e,0xef,0x86,0x08,0x68,0x33,0xf1,0x10,0xff,0x3f,0xf1,0xf1,0x60,0x81,0x06,0x1e,0x36,0x10,0x20,0xe1,0xc0,0x87,0xc7,0x02,0x0f,0xd3,0xff,0xe3,0x02,0x0f,0xe8,0x08,0x7f,0xd0,0x21,0x89,0xc4,0x08,0x9f,0x70,0x21,0x9a,0x08,0x08,0xc1,0x89,0x02,0x20,0x62,0x40,0x8f,0xfe,0x68,0x98,}; | ||||
| const uint8_t *_I_SDQuestion_35x43[] = {_I_SDQuestion_35x43_0}; | ||||
| 
 | ||||
| @ -392,14 +395,8 @@ const uint8_t *_I_SDError_43x35[] = {_I_SDError_43x35_0}; | ||||
| const uint8_t _I_Cry_dolph_55x52_0[] = {0x01,0x00,0xe8,0x00,0x00,0x0f,0xe3,0xff,0x01,0x03,0x1f,0xfb,0xff,0x0f,0x02,0x96,0x02,0x0f,0x00,0x9f,0x01,0x8b,0xc0,0x12,0x1f,0x80,0x18,0xae,0x00,0x21,0xe0,0x07,0x0a,0x30,0x0a,0x28,0x18,0x08,0x61,0x80,0x62,0x83,0x00,0x90,0x14,0x61,0x02,0x0c,0x16,0x00,0x76,0x60,0x66,0x98,0x0b,0x04,0x90,0x60,0x66,0xb0,0x00,0x48,0x0d,0x21,0x21,0x03,0x30,0x74,0x40,0xd3,0x80,0x03,0x34,0x04,0xc0,0x52,0x00,0x32,0xc7,0xa0,0x18,0x80,0x31,0x80,0x07,0xe1,0x01,0x37,0x18,0x50,0x80,0xc2,0x92,0x10,0x31,0xe8,0x23,0xe9,0x63,0x86,0x54,0x3f,0xe0,0xe1,0x0d,0x96,0x83,0xfc,0x06,0x40,0x69,0x6c,0x3c,0x60,0xd2,0xfc,0xc0,0x60,0x58,0x48,0x0c,0x1b,0x81,0x08,0x14,0x9c,0x1a,0x81,0x04,0x03,0x46,0x80,0x0c,0x50,0x26,0x21,0xc1,0x94,0x26,0x14,0x27,0x8a,0x40,0xc0,0xc2,0xe7,0x26,0x40,0x81,0x86,0xc0,0x6b,0x28,0x64,0x0f,0x01,0x10,0x4e,0x14,0x60,0x0c,0x29,0x02,0x48,0x8b,0x5c,0x45,0x22,0x01,0x10,0x31,0x3a,0x4c,0x0c,0x34,0x06,0xf1,0xd8,0x00,0xc5,0x1a,0x64,0x94,0x0c,0xc0,0x37,0x52,0x20,0x81,0x84,0x26,0x3e,0x88,0x0c,0x38,0x28,0x54,0x0e,0xac,0x1f,0xe1,0x3f,0x06,0x96,0x82,0x7e,0x29,0x4a,0xaf,0xfd,0x76,0x30,0x3a,0x41,0x14,0x7f,0xd0,0xf8,0x78,0x18,0xaa,0x9f,0xd4,0xe0,0x83,0x4f,0xf5,0xf7,0x38,0x0b,0x9c,0x6a,0x1f,0x5b,0x5c,0x00,}; | ||||
| const uint8_t *_I_Cry_dolph_55x52[] = {_I_Cry_dolph_55x52_0}; | ||||
| 
 | ||||
| const uint8_t _I_BadUsb_9x8_0[] = {0x00,0x01,0x01,0xBB,0x01,0xFE,0x00,0xFE,0x00,0xD6,0x00,0xD6,0x00,0x7C,0x00,0x38,0x00,}; | ||||
| const uint8_t *_I_BadUsb_9x8[] = {_I_BadUsb_9x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_PlaceholderR_30x13_0[] = {0x01,0x00,0x19,0x00,0xfe,0x7f,0xff,0xf0,0xf8,0x10,0x18,0x62,0x10,0x10,0x18,0xc8,0x00,0x7e,0x03,0xb8,0x18,0x0c,0x66,0x1f,0xe1,0x58,0xc7,0xc5,0xe6,}; | ||||
| const uint8_t *_I_PlaceholderR_30x13[] = {_I_PlaceholderR_30x13_0}; | ||||
| 
 | ||||
| const uint8_t _I_Background_128x8_0[] = {0x01,0x00,0x43,0x00,0xff,0x7f,0xc0,0x19,0x7f,0x80,0x87,0xb7,0x01,0x3d,0xfd,0xff,0x74,0xff,0xdf,0x7f,0x87,0x87,0xfd,0xfb,0xd3,0xe7,0xf7,0x9d,0xbf,0xff,0x35,0x41,0x09,0x8c,0x20,0x04,0x31,0xc8,0xe0,0x0c,0x62,0x18,0x08,0x10,0x10,0x70,0x99,0xde,0xfe,0xde,0xe7,0xf7,0xff,0x70,0xfc,0x3f,0x6d,0x7f,0x9e,0x6f,0xd9,0xfd,0xd9,0xf3,0x43,0xff,0x2f,0x68,0x00,0x4d,0xfe,}; | ||||
| const uint8_t *_I_Background_128x8[] = {_I_Background_128x8_0}; | ||||
| const uint8_t _I_Background_128x11_0[] = {0x01,0x00,0x70,0x00,0xff,0x40,0x40,0xc9,0xe0,0xff,0x80,0x06,0x1e,0x08,0x38,0x0c,0x0c,0x1e,0x93,0x00,0x19,0x46,0x01,0x07,0x7d,0x83,0x03,0xd2,0x31,0xff,0xdb,0xd5,0x66,0x20,0x83,0xc0,0xff,0x05,0x24,0x00,0x1c,0x78,0x28,0xbc,0x40,0x72,0xbf,0xcf,0x47,0xeb,0x40,0xdb,0x7a,0xbf,0xf0,0x40,0x39,0x60,0x28,0x3f,0xe0,0xa0,0xea,0x80,0x63,0x3f,0x0b,0x17,0xe4,0x3e,0x5a,0xbc,0xf9,0x99,0x70,0x1f,0x81,0x50,0xc0,0x80,0xe7,0x3e,0x1e,0x9d,0x57,0xfb,0x7f,0x23,0x15,0xb0,0x12,0x5b,0x5b,0x02,0x1d,0x8c,0xc3,0x80,0x24,0x9e,0x03,0x80,0x5e,0x40,0x00,0xa1,0x88,0x0e,0x98,0x00,0x7b,0x07,0x08,0xb2,0x44,0x41,}; | ||||
| const uint8_t *_I_Background_128x11[] = {_I_Background_128x11_0}; | ||||
| 
 | ||||
| const uint8_t _I_Lock_8x8_0[] = {0x00,0x3C,0x42,0x42,0xFF,0xFF,0xE7,0xFF,0xFF,}; | ||||
| const uint8_t *_I_Lock_8x8[] = {_I_Lock_8x8_0}; | ||||
| @ -407,129 +404,136 @@ const uint8_t *_I_Lock_8x8[] = {_I_Lock_8x8_0}; | ||||
| const uint8_t _I_Battery_26x8_0[] = {0x01,0x00,0x13,0x00,0xff,0x7f,0xef,0xf0,0x08,0x0c,0x03,0x00,0x03,0x38,0x18,0x0c,0xa0,0x40,0x36,0x05,0x98,0x6d,0x00,}; | ||||
| const uint8_t *_I_Battery_26x8[] = {_I_Battery_26x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_PlaceholderL_11x13_0[] = {0x01,0x00,0x10,0x00,0xfe,0x40,0x60,0x50,0x28,0x0c,0x10,0x03,0xb0,0x38,0x37,0xfe,0x07,0xfe,0x80,0x80,}; | ||||
| const uint8_t *_I_PlaceholderL_11x13[] = {_I_PlaceholderL_11x13_0}; | ||||
| 
 | ||||
| const uint8_t _I_Battery_19x8_0[] = {0x01,0x00,0x0f,0x00,0xff,0x7f,0xe0,0x30,0x18,0x04,0x08,0x04,0x90,0x60,0x12,0x02,0xcc,0x28,0x40,}; | ||||
| const uint8_t *_I_Battery_19x8[] = {_I_Battery_19x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_SDcardMounted_11x8_0[] = {0x01,0x00,0x09,0x00,0xff,0xc1,0xff,0xf0,0x40,0x1c,0xd9,0xe0,0x00,}; | ||||
| const uint8_t *_I_SDcardMounted_11x8[] = {_I_SDcardMounted_11x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_SDcardFail_11x8_0[] = {0x00,0xFF,0x07,0xB7,0x07,0xFF,0x07,0x87,0x07,0x7B,0x07,0xFF,0x07,0xFF,0x07,0x67,0x00,}; | ||||
| const uint8_t *_I_SDcardFail_11x8[] = {_I_SDcardFail_11x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_USBConnected_15x8_0[] = {0x00,0xF0,0x07,0x08,0x7C,0x04,0x44,0x07,0x54,0x07,0x54,0x04,0x44,0x08,0x7C,0xF0,0x07,}; | ||||
| const uint8_t *_I_USBConnected_15x8[] = {_I_USBConnected_15x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Bluetooth_5x8_0[] = {0x00,0x04,0x0D,0x16,0x0C,0x0C,0x16,0x0D,0x04,}; | ||||
| const uint8_t *_I_Bluetooth_5x8[] = {_I_Bluetooth_5x8_0}; | ||||
| const uint8_t _I_Background_128x8_0[] = {0x01,0x00,0x43,0x00,0xff,0x7f,0xc0,0x19,0x7f,0x80,0x87,0xb7,0x01,0x3d,0xfd,0xff,0x74,0xff,0xdf,0x7f,0x87,0x87,0xfd,0xfb,0xd3,0xe7,0xf7,0x9d,0xbf,0xff,0x35,0x41,0x09,0x8c,0x20,0x04,0x31,0xc8,0xe0,0x0c,0x62,0x18,0x08,0x10,0x10,0x70,0x99,0xde,0xfe,0xde,0xe7,0xf7,0xff,0x70,0xfc,0x3f,0x6d,0x7f,0x9e,0x6f,0xd9,0xfd,0xd9,0xf3,0x43,0xff,0x2f,0x68,0x00,0x4d,0xfe,}; | ||||
| const uint8_t *_I_Background_128x8[] = {_I_Background_128x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_BadUsb_9x8_0[] = {0x00,0x01,0x01,0xBB,0x01,0xFE,0x00,0xFE,0x00,0xD6,0x00,0xD6,0x00,0x7C,0x00,0x38,0x00,}; | ||||
| const uint8_t *_I_BadUsb_9x8[] = {_I_BadUsb_9x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_BT_Pair_9x8_0[] = {0x00,0x11,0x01,0x35,0x00,0x58,0x01,0x31,0x00,0x30,0x01,0x59,0x00,0x34,0x01,0x11,0x01,}; | ||||
| const uint8_t *_I_BT_Pair_9x8[] = {_I_BT_Pair_9x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Background_128x11_0[] = {0x01,0x00,0x70,0x00,0xff,0x40,0x40,0xc9,0xe0,0xff,0x80,0x06,0x1e,0x08,0x38,0x0c,0x0c,0x1e,0x93,0x00,0x19,0x46,0x01,0x07,0x7d,0x83,0x03,0xd2,0x31,0xff,0xdb,0xd5,0x66,0x20,0x83,0xc0,0xff,0x05,0x24,0x00,0x1c,0x78,0x28,0xbc,0x40,0x72,0xbf,0xcf,0x47,0xeb,0x40,0xdb,0x7a,0xbf,0xf0,0x40,0x39,0x60,0x28,0x3f,0xe0,0xa0,0xea,0x80,0x63,0x3f,0x0b,0x17,0xe4,0x3e,0x5a,0xbc,0xf9,0x99,0x70,0x1f,0x81,0x50,0xc0,0x80,0xe7,0x3e,0x1e,0x9d,0x57,0xfb,0x7f,0x23,0x15,0xb0,0x12,0x5b,0x5b,0x02,0x1d,0x8c,0xc3,0x80,0x24,0x9e,0x03,0x80,0x5e,0x40,0x00,0xa1,0x88,0x0e,0x98,0x00,0x7b,0x07,0x08,0xb2,0x44,0x41,}; | ||||
| const uint8_t *_I_Background_128x11[] = {_I_Background_128x11_0}; | ||||
| const uint8_t _I_PlaceholderL_11x13_0[] = {0x01,0x00,0x10,0x00,0xfe,0x40,0x60,0x50,0x28,0x0c,0x10,0x03,0xb0,0x38,0x37,0xfe,0x07,0xfe,0x80,0x80,}; | ||||
| const uint8_t *_I_PlaceholderL_11x13[] = {_I_PlaceholderL_11x13_0}; | ||||
| 
 | ||||
| const uint8_t _I_Scanning_123x52_0[] = {0x01,0x00,0xd3,0x01,0x00,0x78,0x03,0xc0,0x1f,0x00,0xe0,0x7f,0xc1,0xfb,0xf0,0x80,0x41,0xc0,0xc7,0x03,0x07,0xbe,0xb2,0x07,0x18,0x07,0xc4,0x40,0x06,0x55,0x68,0x2d,0x80,0x0a,0x58,0x08,0x10,0x3c,0xe1,0x00,0x32,0xc0,0xc2,0xb0,0x00,0xf8,0x82,0x02,0x0a,0x01,0x15,0x80,0x40,0x40,0xc3,0x40,0x07,0xa0,0x10,0xa8,0x10,0x09,0xc0,0x19,0x01,0xe9,0x82,0x01,0x0c,0x82,0x01,0x74,0x13,0x1d,0x03,0x04,0x24,0x28,0x05,0x04,0x1e,0x76,0x80,0x79,0xc8,0x30,0x50,0x28,0x30,0x14,0x64,0x26,0x23,0xe8,0x78,0x21,0xe0,0xf4,0x85,0x43,0x30,0x12,0x03,0x00,0x83,0xc7,0x41,0x1c,0x3b,0x10,0x3c,0xe2,0x98,0x08,0x80,0xa4,0x61,0x1e,0x0e,0x9c,0x0c,0x1e,0x51,0x00,0x7a,0x95,0x46,0x11,0x90,0xd3,0xd0,0x24,0x80,0xfb,0xe4,0x5f,0xf0,0x92,0x80,0x79,0x61,0x01,0xe3,0xff,0x07,0x9e,0x22,0xcf,0x3e,0xc4,0x03,0xd3,0xf5,0xff,0x07,0xa5,0x12,0xc9,0x2e,0x07,0xa7,0xf3,0x5f,0xff,0x8a,0x93,0xce,0x89,0xe4,0x97,0xe2,0x25,0x40,0xf1,0x8c,0x75,0x3b,0xf1,0xf1,0xf8,0x9b,0xc8,0x1e,0x55,0x0f,0xfc,0x03,0xfd,0x1f,0xf6,0x4f,0xc9,0xe2,0x8f,0x3a,0x27,0x12,0x5f,0xea,0x68,0x0c,0x06,0x35,0xfc,0x2f,0x92,0xbc,0xf0,0x98,0x89,0x7c,0x75,0x8e,0x37,0xd8,0xf1,0x7c,0xa3,0x0c,0xf3,0xc3,0x47,0xf8,0xcb,0x81,0xc2,0x5f,0x62,0xc0,0xf2,0x77,0xa5,0x1b,0xeb,0xc3,0x6c,0x8d,0x12,0x03,0x22,0x07,0x8c,0x30,0x18,0x2d,0x82,0xc3,0xc2,0xaf,0x84,0x42,0x81,0xc8,0xb1,0x01,0xb2,0x4e,0x08,0x08,0x68,0xb0,0x50,0x20,0xdf,0xb4,0x90,0x3a,0x10,0x3d,0x19,0x05,0x86,0x1e,0x8f,0x03,0x03,0xa5,0x83,0xd0,0xa1,0x10,0x30,0x79,0x00,0x0a,0x0a,0x02,0x19,0x84,0x03,0xa5,0xff,0xc0,0x8a,0x88,0x00,0x81,0xe1,0x80,0x12,0x07,0xa5,0x1f,0xc0,0x03,0xde,0x0b,0x80,0x80,0x0a,0x47,0xa3,0x1f,0x80,0x42,0x43,0xf1,0xe1,0x80,0x60,0x3d,0x30,0xf8,0x04,0x48,0x3e,0xf0,0x08,0xf1,0x40,0x7d,0x00,0xf1,0x56,0x08,0xfe,0x20,0x17,0x0f,0x70,0x3c,0x55,0x82,0x00,0x58,0x38,0x0c,0xa7,0x9f,0x90,0x78,0x80,0x1c,0xec,0x5a,0xac,0xff,0xc0,0x1f,0x30,0x1a,0x05,0x57,0xfb,0x5f,0xf8,0x45,0xc3,0xf3,0x80,0xf5,0x7f,0xe7,0xfe,0x00,0x7c,0x87,0xc7,0xab,0xff,0x8f,0x83,0xea,0x05,0x80,0xd5,0x7f,0xe1,0xfe,0x08,0x98,0x7e,0x60,0x15,0x5a,0xac,0x0f,0xe1,0x15,0x0f,0xc9,0x78,0x75,0x50,0x0d,0x84,0x28,0x3f,0x55,0x4b,0xac,0x02,0xb1,0x0d,0x0f,0xd6,0xa0,0xf8,0x3a,0x85,0x29,0xaf,0xde,0xf8,0x04,0x1a,0xe2,0x54,0x83,0xf0,0x00,0x2d,0x70,0xd4,0x43,0xf2,0x00,0x2e,0xb8,0x3a,0x20,0x05,0x93,0xc0,0x5e,0xc1,0xf2,0x79,0x3e,0x04,0x7c,0x1f,0x32,0xa0,0x19,0x7c,0x1e,0x86,0x00,0x6a,0xa8,0x0c,0xbf,0x84,0xe9,0x4e,0x88,0x0c,0x85,0xd5,0x00,}; | ||||
| const uint8_t *_I_Scanning_123x52[] = {_I_Scanning_123x52_0}; | ||||
| const uint8_t _I_SDcardFail_11x8_0[] = {0x00,0xFF,0x07,0xB7,0x07,0xFF,0x07,0x87,0x07,0x7B,0x07,0xFF,0x07,0xFF,0x07,0x67,0x00,}; | ||||
| const uint8_t *_I_SDcardFail_11x8[] = {_I_SDcardFail_11x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Bluetooth_5x8_0[] = {0x00,0x04,0x0D,0x16,0x0C,0x0C,0x16,0x0D,0x04,}; | ||||
| const uint8_t *_I_Bluetooth_5x8[] = {_I_Bluetooth_5x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_PlaceholderR_30x13_0[] = {0x01,0x00,0x19,0x00,0xfe,0x7f,0xff,0xf0,0xf8,0x10,0x18,0x62,0x10,0x10,0x18,0xc8,0x00,0x7e,0x03,0xb8,0x18,0x0c,0x66,0x1f,0xe1,0x58,0xc7,0xc5,0xe6,}; | ||||
| const uint8_t *_I_PlaceholderR_30x13[] = {_I_PlaceholderR_30x13_0}; | ||||
| 
 | ||||
| const uint8_t _I_SDcardMounted_11x8_0[] = {0x01,0x00,0x09,0x00,0xff,0xc1,0xff,0xf0,0x40,0x1c,0xd9,0xe0,0x00,}; | ||||
| const uint8_t *_I_SDcardMounted_11x8[] = {_I_SDcardMounted_11x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Quest_7x8_0[] = {0x00,0x1E,0x33,0x33,0x30,0x18,0x0C,0x00,0x0C,}; | ||||
| const uint8_t *_I_Quest_7x8[] = {_I_Quest_7x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Unlock_7x8_0[] = {0x00,0x1C,0x22,0x02,0x4F,0x67,0x73,0x79,0x3C,}; | ||||
| const uint8_t *_I_Unlock_7x8[] = {_I_Unlock_7x8_0}; | ||||
| const uint8_t _I_Lock_7x8_0[] = {0x00,0x1C,0x22,0x22,0x7F,0x7F,0x77,0x7F,0x3E,}; | ||||
| const uint8_t *_I_Lock_7x8[] = {_I_Lock_7x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_Scanning_123x52_0[] = {0x01,0x00,0xd3,0x01,0x00,0x78,0x03,0xc0,0x1f,0x00,0xe0,0x7f,0xc1,0xfb,0xf0,0x80,0x41,0xc0,0xc7,0x03,0x07,0xbe,0xb2,0x07,0x18,0x07,0xc4,0x40,0x06,0x55,0x68,0x2d,0x80,0x0a,0x58,0x08,0x10,0x3c,0xe1,0x00,0x32,0xc0,0xc2,0xb0,0x00,0xf8,0x82,0x02,0x0a,0x01,0x15,0x80,0x40,0x40,0xc3,0x40,0x07,0xa0,0x10,0xa8,0x10,0x09,0xc0,0x19,0x01,0xe9,0x82,0x01,0x0c,0x82,0x01,0x74,0x13,0x1d,0x03,0x04,0x24,0x28,0x05,0x04,0x1e,0x76,0x80,0x79,0xc8,0x30,0x50,0x28,0x30,0x14,0x64,0x26,0x23,0xe8,0x78,0x21,0xe0,0xf4,0x85,0x43,0x30,0x12,0x03,0x00,0x83,0xc7,0x41,0x1c,0x3b,0x10,0x3c,0xe2,0x98,0x08,0x80,0xa4,0x61,0x1e,0x0e,0x9c,0x0c,0x1e,0x51,0x00,0x7a,0x95,0x46,0x11,0x90,0xd3,0xd0,0x24,0x80,0xfb,0xe4,0x5f,0xf0,0x92,0x80,0x79,0x61,0x01,0xe3,0xff,0x07,0x9e,0x22,0xcf,0x3e,0xc4,0x03,0xd3,0xf5,0xff,0x07,0xa5,0x12,0xc9,0x2e,0x07,0xa7,0xf3,0x5f,0xff,0x8a,0x93,0xce,0x89,0xe4,0x97,0xe2,0x25,0x40,0xf1,0x8c,0x75,0x3b,0xf1,0xf1,0xf8,0x9b,0xc8,0x1e,0x55,0x0f,0xfc,0x03,0xfd,0x1f,0xf6,0x4f,0xc9,0xe2,0x8f,0x3a,0x27,0x12,0x5f,0xea,0x68,0x0c,0x06,0x35,0xfc,0x2f,0x92,0xbc,0xf0,0x98,0x89,0x7c,0x75,0x8e,0x37,0xd8,0xf1,0x7c,0xa3,0x0c,0xf3,0xc3,0x47,0xf8,0xcb,0x81,0xc2,0x5f,0x62,0xc0,0xf2,0x77,0xa5,0x1b,0xeb,0xc3,0x6c,0x8d,0x12,0x03,0x22,0x07,0x8c,0x30,0x18,0x2d,0x82,0xc3,0xc2,0xaf,0x84,0x42,0x81,0xc8,0xb1,0x01,0xb2,0x4e,0x08,0x08,0x68,0xb0,0x50,0x20,0xdf,0xb4,0x90,0x3a,0x10,0x3d,0x19,0x05,0x86,0x1e,0x8f,0x03,0x03,0xa5,0x83,0xd0,0xa1,0x10,0x30,0x79,0x00,0x0a,0x0a,0x02,0x19,0x84,0x03,0xa5,0xff,0xc0,0x8a,0x88,0x00,0x81,0xe1,0x80,0x12,0x07,0xa5,0x1f,0xc0,0x03,0xde,0x0b,0x80,0x80,0x0a,0x47,0xa3,0x1f,0x80,0x42,0x43,0xf1,0xe1,0x80,0x60,0x3d,0x30,0xf8,0x04,0x48,0x3e,0xf0,0x08,0xf1,0x40,0x7d,0x00,0xf1,0x56,0x08,0xfe,0x20,0x17,0x0f,0x70,0x3c,0x55,0x82,0x00,0x58,0x38,0x0c,0xa7,0x9f,0x90,0x78,0x80,0x1c,0xec,0x5a,0xac,0xff,0xc0,0x1f,0x30,0x1a,0x05,0x57,0xfb,0x5f,0xf8,0x45,0xc3,0xf3,0x80,0xf5,0x7f,0xe7,0xfe,0x00,0x7c,0x87,0xc7,0xab,0xff,0x8f,0x83,0xea,0x05,0x80,0xd5,0x7f,0xe1,0xfe,0x08,0x98,0x7e,0x60,0x15,0x5a,0xac,0x0f,0xe1,0x15,0x0f,0xc9,0x78,0x75,0x50,0x0d,0x84,0x28,0x3f,0x55,0x4b,0xac,0x02,0xb1,0x0d,0x0f,0xd6,0xa0,0xf8,0x3a,0x85,0x29,0xaf,0xde,0xf8,0x04,0x1a,0xe2,0x54,0x83,0xf0,0x00,0x2d,0x70,0xd4,0x43,0xf2,0x00,0x2e,0xb8,0x3a,0x20,0x05,0x93,0xc0,0x5e,0xc1,0xf2,0x79,0x3e,0x04,0x7c,0x1f,0x32,0xa0,0x19,0x7c,0x1e,0x86,0x00,0x6a,0xa8,0x0c,0xbf,0x84,0xe9,0x4e,0x88,0x0c,0x85,0xd5,0x00,}; | ||||
| const uint8_t *_I_Scanning_123x52[] = {_I_Scanning_123x52_0}; | ||||
| 
 | ||||
| const uint8_t _I_MHz_25x11_0[] = {0x01,0x00,0x21,0x00,0xe1,0xe1,0xa0,0x30,0x0f,0x38,0x0c,0xbf,0xe0,0x34,0xfe,0xc0,0x7b,0x7f,0xe0,0x19,0xf0,0x60,0x1d,0xbc,0x35,0x84,0x36,0x53,0x10,0x19,0x46,0x40,0x64,0x13,0x10,0x19,0x80,}; | ||||
| const uint8_t *_I_MHz_25x11[] = {_I_MHz_25x11_0}; | ||||
| 
 | ||||
| const uint8_t _I_Lock_7x8_0[] = {0x00,0x1C,0x22,0x22,0x7F,0x7F,0x77,0x7F,0x3E,}; | ||||
| const uint8_t *_I_Lock_7x8[] = {_I_Lock_7x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinMafia_115x62_0[] = {0x01,0x00,0x21,0x02,0x00,0x1e,0x02,0x06,0x0e,0xcb,0x04,0x10,0x1d,0x91,0x88,0x40,0x3b,0x20,0xc0,0xec,0xc0,0x40,0x62,0x03,0xac,0x80,0x03,0xb2,0x31,0x00,0x90,0x03,0xae,0x5e,0x0e,0xcf,0xc4,0x56,0x01,0x40,0x07,0x56,0xbe,0x14,0x0e,0x2f,0xf1,0x5e,0x2a,0xa1,0xd1,0xc0,0x7c,0x3f,0xf0,0x70,0x73,0x70,0x35,0x41,0xd1,0xc0,0x7f,0xff,0xf0,0xf0,0x73,0x50,0x03,0xa4,0x0d,0x10,0x74,0x07,0x46,0x55,0xe0,0x07,0x10,0xb1,0xc3,0xa3,0x55,0xfe,0x03,0x88,0x94,0xe1,0xd1,0xd5,0x03,0x4a,0x3e,0x59,0x9e,0xaf,0xfe,0xff,0x05,0x60,0x4e,0xab,0xf5,0xff,0x95,0xb4,0xa4,0x3a,0x3f,0xd0,0xe0,0xfa,0x20,0x20,0xf8,0xd5,0xff,0xb5,0xf0,0x0f,0x88,0x3a,0x6a,0xbf,0xf8,0xaf,0x82,0x6f,0x03,0x07,0x47,0xaf,0xff,0x0a,0xfe,0x5f,0xc1,0xd3,0xf6,0xbf,0xe0,0x7f,0xfe,0xf0,0x73,0x41,0x00,0x43,0xfa,0xd7,0xf8,0x27,0xfe,0xe0,0x73,0x40,0x80,0x43,0xfe,0xab,0xfe,0x21,0xfc,0xe5,0x9b,0x05,0x48,0xea,0x3f,0xc8,0xfa,0xc4,0x66,0x07,0x44,0x0e,0x8f,0x00,0xb0,0x2b,0x31,0x07,0x0f,0x00,0x1c,0x72,0x00,0x70,0xf8,0x37,0xe5,0x81,0xff,0x89,0x08,0xf2,0x71,0x80,0x20,0xfe,0x2b,0xf0,0x5f,0xc0,0x38,0xc8,0xa5,0x60,0xc3,0x00,0xc7,0xf9,0xaf,0x81,0x2d,0x04,0x34,0x40,0xe1,0x98,0x47,0x68,0x04,0x92,0xab,0xc0,0x7e,0xb7,0xf7,0x39,0x03,0x85,0x8e,0x24,0xf1,0xc0,0x7f,0xf5,0x78,0x0f,0x53,0xb4,0xbc,0x1f,0xb8,0x1a,0x0c,0x61,0xc5,0x82,0xab,0xc0,0x3e,0xa3,0xa2,0xfc,0x07,0x46,0x09,0x60,0x19,0x8f,0x80,0xec,0x38,0x08,0x52,0x6c,0xb8,0xdc,0x28,0x7c,0x10,0x2a,0x5f,0x0f,0xfc,0x5a,0x01,0x05,0x1a,0x8e,0x02,0x02,0x1d,0x1f,0x81,0xa8,0xbe,0x13,0xf8,0x52,0x2c,0x8c,0x62,0x77,0x42,0x11,0x40,0xe0,0xca,0x93,0x8e,0x03,0x8a,0x30,0x10,0x48,0x54,0x03,0x04,0xbb,0x2c,0x00,0x0c,0x64,0x80,0xe4,0x0e,0x88,0x38,0x7c,0x10,0x04,0x09,0x48,0x83,0xac,0x1b,0x18,0xf3,0x44,0xc1,0xca,0x1d,0x15,0x40,0x8e,0x05,0x02,0x20,0xe6,0x24,0x12,0x8c,0x8b,0x05,0x21,0x07,0x24,0x14,0x08,0x73,0x80,0x19,0x78,0x43,0xb2,0xff,0x15,0x30,0xc4,0x01,0x26,0x8f,0x14,0x61,0xa9,0x8a,0x09,0x10,0x02,0x12,0x1c,0x80,0x84,0xaf,0x10,0x71,0xaa,0xc4,0x00,0x3b,0x04,0xea,0x24,0x48,0x1c,0xbd,0x8f,0xf8,0x00,0x67,0xf0,0x09,0x40,0x20,0x61,0x00,0xe4,0xf6,0x07,0x4b,0xc1,0x1f,0x07,0x14,0x40,0x1c,0x9d,0x66,0x79,0x24,0xc6,0xa0,0x0e,0x32,0x51,0xfa,0xce,0xe7,0x50,0x07,0x1c,0x80,0x30,0x58,0x0e,0xa2,0xcc,0xa0,0x19,0x00,0x71,0x42,0x13,0x27,0x40,0xf5,0x45,0x41,0xc5,0x08,0xb0,0x80,0xc6,0x18,0xf2,0x28,0x04,0x83,0xe8,0x58,0x10,0x30,0xc2,0x2c,0x40,0x91,0x89,0x3c,0x88,0x62,0x21,0xd2,0xff,0x03,0x87,0xc8,0x12,0x19,0x08,0x39,0x3e,0x83,0xb2,0x4a,0x0e,0xa2,0x0d,0xc0,0xe0,0x50,0x06,0xa7,0xe8,0x2c,0x94,0xc2,0x09,0x50,0x8c,0xce,0x20,0x34,0x70,0x71,0x41,0x3e,0x85,0xe2,0xe0,0x41,0x38,0x1e,0x28,0x3c,0x19,0xc8,0x70,0x4f,0xc1,0xdc,0xe0,0x74,0x01,0xd8,0xc6,0x24,0x00,0x82,0x81,0x7c,0x12,0xa6,0x7e,0x10,0x28,0xd8,0x22,0x00,0xe3,0xfc,0x34,0x53,0x00,0x23,0x1c,0x04,0x44,0x0e,0x50,0x10,0xeb,0x17,0xca,0x1c,0x07,0x20,}; | ||||
| const uint8_t *_I_DolphinMafia_115x62[] = {_I_DolphinMafia_115x62_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinExcited_64x63_0[] = {0x01,0x00,0x36,0x01,0x00,0x25,0x00,0x0f,0xd2,0x00,0x3b,0xe0,0x00,0xeb,0x10,0x0c,0x34,0x40,0x30,0xd0,0x88,0x80,0x1d,0xa1,0x00,0x42,0xfc,0x7f,0xc0,0x63,0x04,0x01,0x0e,0x02,0x0f,0x00,0x00,0x8c,0x08,0x0e,0x37,0x00,0x10,0xc6,0x20,0x10,0x10,0xd9,0x11,0x92,0x1c,0x1a,0x3e,0x00,0x04,0x42,0x02,0x1a,0x20,0xb0,0xce,0x00,0x64,0x07,0x20,0x59,0x16,0x50,0x36,0x45,0x94,0x84,0x78,0x20,0x60,0x75,0x8e,0x43,0x06,0x63,0x3c,0x33,0x94,0x0c,0xd2,0x5c,0x30,0x38,0xe4,0x08,0x43,0x10,0xc0,0x5e,0x06,0x22,0x53,0x1a,0x02,0x08,0x7f,0xd0,0x32,0xc1,0x50,0x21,0x14,0x0e,0x70,0x1c,0x46,0xe2,0x07,0x19,0x06,0x3c,0xdc,0x20,0x91,0xae,0x01,0xcc,0xbe,0x30,0x09,0xfc,0x12,0x41,0xff,0x83,0xcc,0x0a,0xa3,0x1f,0x03,0x99,0xe8,0x7c,0x10,0xf8,0x25,0xa0,0x5e,0x50,0x0f,0x84,0x1e,0x09,0x54,0x03,0x9f,0xf2,0x07,0x02,0xd5,0x11,0xca,0x01,0xfe,0x80,0xc0,0xaa,0x9f,0xf0,0x39,0x5f,0xd0,0x43,0xaa,0x83,0x41,0x92,0xc3,0x1f,0x03,0x8d,0x52,0x02,0x2e,0x25,0xc9,0x6a,0x99,0x46,0xa6,0x2a,0xa0,0x1c,0xaf,0xca,0x62,0x94,0x28,0xcb,0x7e,0x0f,0x15,0x71,0xf8,0x3c,0x22,0x71,0x03,0x8a,0x84,0x67,0x18,0x0f,0xac,0x1c,0x0e,0x38,0x08,0x0c,0x3e,0x01,0xae,0xbd,0x13,0x0c,0x0e,0x35,0x8e,0xa8,0x1c,0xb0,0x1f,0xf8,0x06,0x83,0xf4,0x27,0x38,0x07,0xff,0xff,0x8f,0x03,0xa0,0x4c,0x80,0xed,0x60,0x03,0xb4,0x60,0x0e,0xd0,0x60,0x3a,0x87,0x84,0x0e,0xb7,0xc2,0xfa,0x18,0x05,0x44,0x20,0x73,0xff,0xf7,0xce,0xe4,0x07,0x2d,0x52,0x2c,0x80,0xe7,0x54,0xea,0x81,0xd7,0x50,0x0f,0x7a,0xaa,0x3d,0x41,0xe2,0x07,0x5a,0x80,0x3c,0xa0,0x40,0x72,0xd0,0x6a,0x80,0xa2,0x07,0x3a,0x05,0x54,0x8e,0x20,0x73,0xc0,0x03,0xd8,0x60,0x30,0x40,0x3a,0xc0,0x00,0xee,0xea,0x10,0x3b,0x80,}; | ||||
| const uint8_t *_I_DolphinExcited_64x63[] = {_I_DolphinExcited_64x63_0}; | ||||
| 
 | ||||
| const uint8_t _I_iButtonDolphinSuccess_109x60_0[] = {0x01,0x00,0xac,0x01,0x00,0x17,0xfe,0x1e,0x0c,0xaf,0x04,0x02,0xe0,0x0d,0xa8,0xf4,0x03,0x01,0x03,0x06,0x46,0x02,0x02,0x03,0x18,0xe0,0x36,0x2c,0x00,0x36,0x00,0x2c,0x40,0x3e,0x60,0xd8,0x84,0x01,0x0c,0x5a,0x40,0x05,0x82,0x01,0x0e,0x04,0x0d,0x70,0x42,0x04,0x90,0x49,0x02,0xe4,0x20,0x41,0x28,0xc0,0x07,0x40,0x06,0xf8,0x00,0xa4,0x00,0xd6,0x03,0xa8,0x37,0x44,0x2a,0x31,0x74,0xd3,0x83,0x57,0x80,0x0d,0xc7,0x18,0xa9,0xa8,0x36,0x2a,0x86,0x06,0x8d,0xfc,0x36,0x60,0xd7,0xc0,0x3b,0x8c,0x36,0xf0,0x4a,0x05,0xf9,0x6e,0x5e,0x06,0x23,0x41,0x24,0x1f,0xf6,0x01,0x74,0x01,0xb1,0xe3,0x82,0x81,0x47,0x40,0x0d,0x7c,0x87,0x8e,0x12,0x05,0x1a,0x84,0x0d,0xb6,0xa0,0xd2,0x85,0x86,0xc8,0x1a,0x50,0x40,0x69,0x40,0xb2,0x1f,0xf0,0x69,0x50,0x01,0xa5,0x08,0xfc,0x03,0x5f,0x60,0x0d,0x28,0x84,0x1a,0x07,0x18,0x06,0xaf,0x00,0x1a,0x3c,0x03,0xb8,0xc3,0x20,0xd0,0x28,0x87,0xfc,0x8a,0x50,0x08,0x78,0x08,0x70,0x77,0x0c,0x44,0x06,0x05,0x30,0xff,0x18,0x4a,0x01,0x30,0x01,0x0d,0x33,0x19,0x11,0x1b,0x8c,0xa2,0xf8,0x7d,0x27,0x71,0xd0,0x20,0x51,0x20,0x68,0xd5,0x00,0x42,0x0d,0x2c,0x00,0x08,0x64,0x10,0x19,0x20,0x28,0x75,0x07,0x53,0x3d,0x18,0x35,0x2a,0x9f,0xf4,0x9a,0x41,0x90,0x23,0x00,0x94,0x43,0xe0,0x5e,0xae,0x03,0x9d,0xb4,0xe0,0xd1,0x0d,0x8c,0xd0,0x52,0xb1,0x00,0xd9,0x83,0x46,0x34,0x45,0x41,0xa8,0x9f,0x86,0x01,0x14,0x05,0x08,0x08,0x81,0xa6,0x62,0x10,0x68,0xe5,0x20,0x70,0x41,0x80,0x80,0x10,0xc4,0x34,0x48,0x04,0x2a,0x38,0x0d,0x99,0x16,0x02,0x1a,0xd5,0x10,0x6c,0x5e,0x2e,0x0b,0xa1,0x4b,0x0a,0x60,0xc1,0xa7,0x84,0xfc,0x58,0x01,0xb5,0x02,0x82,0xb4,0xc4,0x16,0x22,0xa5,0x06,0x96,0x19,0x20,0x20,0xd7,0x30,0x8c,0x0f,0x08,0x05,0x10,0x68,0xa1,0x44,0x1a,0x98,0x08,0x14,0x11,0x28,0x21,0x91,0x1d,0x8f,0x83,0xfe,0x07,0x1b,0x00,0x34,0x61,0x00,0xd3,0x1d,0x8c,0x7a,0x01,0x7e,0x80,0x56,0x30,0x06,0xb1,0x4a,0x08,0xd4,0xbf,0xc1,0x31,0xc0,0x7f,0xe8,0xf0,0x08,0x3c,0x40,0x1a,0x80,0x04,0x5a,0x8c,0x10,0x80,0x40,0xd7,0x05,0x08,0x36,0xc0,0xe2,0x0d,0xb8,0x30,0x34,0x45,0x82,0x0d,0x72,0x49,0x03,0x5a,0x41,0x55,0xf8,0x7f,0xff,0xe8,0x72,0x06,0xae,0x03,0xf4,0x0c,0x1d,0xf8,0x18,0x60,0x40,0xd2,0x4b,0x9f,0xd0,0x1a,0x35,0x71,0x48,0xc0,0x95,0x42,0x0d,0x4d,0x50,0x70,0x75,0x40,0xd1,0x80,0x83,0x5a,0xa1,0x55,0x00,0x0c,0x05,0xa4,0x20,0xd2,}; | ||||
| const uint8_t *_I_iButtonDolphinSuccess_109x60[] = {_I_iButtonDolphinSuccess_109x60_0}; | ||||
| 
 | ||||
| const uint8_t _I_iButtonDolphinVerySuccess_108x52_0[] = {0x01,0x00,0xc2,0x01,0x00,0x0f,0xe2,0xfe,0x0d,0xb8,0x3e,0x02,0x06,0x0c,0x9f,0x00,0x08,0x61,0x80,0xd9,0x8c,0x00,0x86,0x60,0x0d,0x98,0x30,0x08,0x6a,0x00,0xd9,0x80,0x80,0x87,0x40,0x0c,0x8c,0x00,0x0c,0xa8,0x01,0x12,0x00,0x2d,0x00,0x22,0x70,0x20,0x6b,0xc8,0x02,0x26,0x62,0x88,0x80,0x6c,0xc9,0x24,0x0d,0x9a,0x07,0x17,0xfe,0x1d,0x68,0x40,0x6c,0xe7,0x48,0x04,0x28,0x10,0x34,0xe8,0x10,0xd1,0x11,0xc4,0x01,0xa5,0x04,0x06,0x96,0xa0,0xa6,0x24,0xc2,0x88,0x17,0x88,0x1a,0x7d,0x43,0x78,0x82,0x4a,0x40,0x03,0x20,0xb0,0xff,0x20,0x16,0xa3,0xb2,0x48,0x03,0xe4,0x0d,0x1f,0xfc,0x06,0x3a,0x0d,0x4a,0x00,0x34,0xf8,0x00,0xd1,0x37,0x0f,0x82,0x9e,0x95,0x58,0x17,0x83,0xff,0x81,0x1b,0x0f,0xf1,0xfe,0x71,0xe0,0x69,0x7c,0x3f,0xe0,0x82,0xff,0xcf,0xc0,0x85,0x61,0x80,0x43,0xb0,0x5f,0xa8,0x79,0xdc,0x81,0xa5,0x70,0xc0,0x68,0x3c,0x10,0x1a,0x17,0xd5,0x28,0x42,0xd1,0x8f,0x84,0x46,0x83,0xb0,0x8e,0x40,0x34,0x5f,0xa8,0x38,0x34,0x45,0xa2,0x0d,0x18,0x04,0x9b,0x50,0x03,0x1a,0x14,0x35,0x36,0x5f,0x8f,0xf8,0xb8,0xa4,0x19,0x40,0x18,0xe8,0xa0,0xca,0x22,0xfe,0x7f,0xc4,0x05,0x20,0xa5,0x80,0xc6,0x82,0xcb,0x3f,0xf3,0x44,0xfc,0x12,0x40,0x18,0xe8,0x51,0x82,0x52,0x28,0xfc,0x38,0x0a,0x3e,0x48,0x98,0x6c,0x8f,0x43,0x00,0xe0,0x63,0xe0,0x62,0xe2,0x91,0x90,0x0a,0x02,0x0d,0x2f,0x82,0x50,0x41,0xa3,0x80,0x90,0x41,0x04,0xc3,0x01,0xc0,0x83,0x46,0x71,0x30,0x06,0x95,0x82,0x21,0x02,0x6e,0x88,0x6c,0x43,0x83,0x1f,0x2f,0x88,0x34,0x62,0x00,0xd1,0x15,0x08,0x2c,0x60,0xcc,0x51,0x0f,0x08,0xcc,0x81,0xa2,0x12,0x10,0x68,0xc6,0x3f,0x06,0xc2,0x06,0x8e,0x02,0x16,0x41,0x20,0x10,0xf8,0x01,0x85,0x00,0x19,0x0d,0x82,0x18,0x07,0x20,0x81,0x00,0x0c,0x9c,0x31,0x08,0x42,0x74,0x81,0xab,0x80,0x03,0x0c,0x32,0x11,0x0b,0x06,0xb9,0xc0,0x43,0xa3,0x10,0x8b,0x83,0x5c,0xe0,0x20,0x81,0xc8,0x26,0x49,0x4c,0x40,0x02,0x86,0x0a,0xc5,0x22,0x32,0x50,0x6b,0x93,0x86,0xc0,0x0d,0x19,0x18,0x35,0x8c,0x84,0x79,0x1a,0x84,0x84,0x1a,0xdf,0xc2,0xe0,0x8a,0xc7,0x51,0x22,0x06,0xb5,0x5e,0x3f,0x00,0x77,0x0d,0x60,0x36,0xfa,0xa9,0xd7,0x00,0x08,0x3a,0xc9,0x02,0x48,0xc0,0x05,0x54,0xba,0x98,0x8a,0xa8,0xf1,0x20,0x6a,0x6a,0x3d,0x43,0x61,0x80,0x4a,0x81,0xaf,0x40,0xea,0x8d,0x86,0x01,0x56,0x06,0x93,0x60,0x80,0x05,0xea,0x01,0x94,0xac,0x1b,0x11,0x80,0x19,0x45,0x41,0x44,0x0d,0x58,0x33,0x18,0xa1,0x4f,0xf3,0x06,0x1f,0x01,0x76,0x58,0x00,0xd9,0x83,0x52,0x7c,0x11,0x38,0x51,0x40,0x80,}; | ||||
| const uint8_t *_I_iButtonDolphinVerySuccess_108x52[] = {_I_iButtonDolphinVerySuccess_108x52_0}; | ||||
| const uint8_t _I_Unlock_7x8_0[] = {0x00,0x1C,0x22,0x02,0x4F,0x67,0x73,0x79,0x3C,}; | ||||
| const uint8_t *_I_Unlock_7x8[] = {_I_Unlock_7x8_0}; | ||||
| 
 | ||||
| const uint8_t _I_iButtonKey_49x44_0[] = {0x01,0x00,0xb4,0x00,0x00,0x24,0xfc,0x0a,0x9c,0x0e,0x00,0x19,0x26,0x18,0x00,0x32,0x43,0x20,0x10,0x10,0x31,0xc0,0x80,0xc9,0x80,0x02,0x08,0x18,0xec,0x00,0x21,0x03,0x1c,0x40,0x1e,0x22,0x15,0xa0,0x08,0x56,0x40,0x06,0x30,0xc0,0x85,0x84,0x86,0x40,0x21,0x84,0x10,0xcc,0x04,0x30,0x40,0x31,0x02,0x88,0x3a,0x20,0x01,0x83,0x0d,0x94,0x06,0x26,0x03,0xf8,0x43,0xc5,0xe9,0x0c,0x11,0x08,0xbc,0xe0,0x64,0x21,0x23,0x09,0x38,0x80,0x22,0x28,0x20,0x58,0x99,0xc4,0x50,0x41,0xe1,0xc0,0x60,0xcc,0xab,0x47,0x21,0xa6,0x02,0x9e,0x06,0x22,0x70,0xf0,0x00,0xcb,0x40,0x03,0x18,0xb0,0x78,0x14,0xe0,0x32,0x58,0x28,0xa5,0x84,0xd0,0x51,0x80,0xc9,0x30,0x06,0xae,0x62,0x84,0x06,0x48,0x64,0x88,0x0c,0x90,0x29,0x08,0x19,0x30,0x31,0x13,0x71,0xb8,0xc4,0xea,0x70,0x6b,0xc5,0x01,0x4a,0x7f,0xc8,0x7c,0x81,0x4a,0x77,0x8a,0xac,0x45,0x4a,0x7f,0x08,0x54,0x39,0x4a,0x7e,0x0e,0xa9,0xf0,0xcb,0xe3,0x7f,0x6e,0x22,0x5c,0x59,0x44,0x00,0x28,0x7a,0xd4,0x40,0x07,0xf0,0x02,0xa0,}; | ||||
| const uint8_t *_I_iButtonKey_49x44[] = {_I_iButtonKey_49x44_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinNice_96x59_0[] = {0x01,0x00,0x8a,0x01,0x00,0x37,0xfa,0x3e,0x0a,0x8f,0x04,0x04,0x02,0x20,0xb7,0x8c,0x00,0x86,0x1c,0x0b,0x78,0x20,0x08,0x66,0x00,0xb7,0x81,0x00,0x86,0x80,0x0b,0x71,0x61,0x60,0x01,0x4c,0x07,0x41,0xe3,0x07,0xd0,0x4e,0x40,0xb8,0x1f,0x90,0x00,0xe4,0x00,0xba,0x88,0x01,0x0e,0x10,0x0a,0x48,0xf9,0x6c,0xbe,0x10,0x70,0x82,0x78,0x3c,0x15,0x82,0x18,0xc2,0x21,0x00,0xb4,0x02,0x0e,0xbc,0x86,0x30,0x48,0x80,0xd1,0x05,0x03,0x78,0x82,0xc0,0x3e,0x52,0x32,0x63,0x70,0x20,0x70,0x09,0xd4,0x98,0xb0,0xf0,0x60,0x58,0xc9,0xce,0x12,0x0b,0xbf,0xd4,0x9d,0x28,0x9e,0x24,0xa9,0x82,0xda,0x24,0x2d,0x10,0x00,0xfd,0x2a,0x60,0xb4,0x85,0x4e,0x00,0x85,0xf8,0xd4,0x82,0xd2,0x09,0xc0,0x12,0x14,0x12,0xad,0x81,0x29,0xa8,0x90,0xf5,0x01,0x75,0x80,0x46,0x00,0xa5,0x50,0x0b,0x90,0x1c,0x41,0x63,0x60,0x05,0x96,0xc0,0x2e,0x52,0x44,0x79,0x60,0x06,0x05,0x50,0x05,0x94,0x89,0x88,0x63,0x02,0x98,0x02,0xc7,0xc1,0x21,0x6a,0x98,0xa0,0x62,0x11,0x00,0x58,0xc6,0x02,0xe2,0xb8,0x21,0x80,0xc3,0x05,0x02,0x38,0x11,0x78,0xa5,0x0b,0x01,0x81,0x5a,0x88,0x2c,0x60,0x40,0xb1,0xc0,0x27,0x0a,0xfc,0x0f,0x28,0x04,0x06,0x50,0x05,0x18,0xa9,0x94,0xc1,0x67,0x48,0x02,0x8c,0xb8,0x16,0xf8,0x80,0x28,0xd6,0x16,0x86,0x0b,0x38,0x40,0xd4,0x76,0x0c,0xd4,0x05,0x94,0x10,0x9a,0x34,0x01,0x82,0x1f,0x06,0x05,0x02,0x98,0x01,0x47,0x54,0x18,0x35,0xc8,0xff,0x20,0x3c,0x00,0x58,0xd5,0x6a,0xa0,0xb3,0x81,0xa3,0x0a,0x0f,0x80,0xd5,0xea,0x81,0x67,0x07,0x46,0x14,0xe3,0xe1,0x55,0x18,0x18,0x2c,0x51,0x85,0xc0,0xef,0x85,0x8c,0x0c,0x30,0xf4,0x61,0x40,0x2d,0x46,0xb4,0x05,0x8b,0x04,0xb0,0x15,0x40,0x5a,0x50,0x23,0xe6,0x01,0x02,0x8c,0xa8,0x2e,0xb1,0xe5,0x40,0x81,0x46,0x6a,0x17,0x59,0xeb,0xe4,0xa8,0x11,0xa0,0x5a,0x68,0x27,0x4e,0xd3,0x59,0xad,0x82,0xfa,0xed,0x2a,0x04,0x28,0x2e,0xb7,0xa7,0x69,0xc3,0x42,0xeb,0xf5,0x1f,0x09,0x4c,0x42,0xed,0xea,0x01,0x8c,0x06,0x41,0x05,0x0b,0xbc,0x02,0x0d,0x80,0x83,0x05,0xe2,0x11,0x40,0x0b,0xb7,0x14,0x06,0x33,0x0c,0x83,0x89,0x02,0xe3,0xca,0x3d,0x95,0x01,0xe2,0x21,0x74,0xc2,0x81,0x0b,0x0e,0x17,0x6c,0x10,0x10,0xaf,0x09,0xe2,0x0b,0xbb,0xd0,0x42,0xeb,0x02,}; | ||||
| const uint8_t *_I_DolphinNice_96x59[] = {_I_DolphinNice_96x59_0}; | ||||
| const uint8_t _I_DolphinExcited_64x63_0[] = {0x01,0x00,0x36,0x01,0x00,0x25,0x00,0x0f,0xd2,0x00,0x3b,0xe0,0x00,0xeb,0x10,0x0c,0x34,0x40,0x30,0xd0,0x88,0x80,0x1d,0xa1,0x00,0x42,0xfc,0x7f,0xc0,0x63,0x04,0x01,0x0e,0x02,0x0f,0x00,0x00,0x8c,0x08,0x0e,0x37,0x00,0x10,0xc6,0x20,0x10,0x10,0xd9,0x11,0x92,0x1c,0x1a,0x3e,0x00,0x04,0x42,0x02,0x1a,0x20,0xb0,0xce,0x00,0x64,0x07,0x20,0x59,0x16,0x50,0x36,0x45,0x94,0x84,0x78,0x20,0x60,0x75,0x8e,0x43,0x06,0x63,0x3c,0x33,0x94,0x0c,0xd2,0x5c,0x30,0x38,0xe4,0x08,0x43,0x10,0xc0,0x5e,0x06,0x22,0x53,0x1a,0x02,0x08,0x7f,0xd0,0x32,0xc1,0x50,0x21,0x14,0x0e,0x70,0x1c,0x46,0xe2,0x07,0x19,0x06,0x3c,0xdc,0x20,0x91,0xae,0x01,0xcc,0xbe,0x30,0x09,0xfc,0x12,0x41,0xff,0x83,0xcc,0x0a,0xa3,0x1f,0x03,0x99,0xe8,0x7c,0x10,0xf8,0x25,0xa0,0x5e,0x50,0x0f,0x84,0x1e,0x09,0x54,0x03,0x9f,0xf2,0x07,0x02,0xd5,0x11,0xca,0x01,0xfe,0x80,0xc0,0xaa,0x9f,0xf0,0x39,0x5f,0xd0,0x43,0xaa,0x83,0x41,0x92,0xc3,0x1f,0x03,0x8d,0x52,0x02,0x2e,0x25,0xc9,0x6a,0x99,0x46,0xa6,0x2a,0xa0,0x1c,0xaf,0xca,0x62,0x94,0x28,0xcb,0x7e,0x0f,0x15,0x71,0xf8,0x3c,0x22,0x71,0x03,0x8a,0x84,0x67,0x18,0x0f,0xac,0x1c,0x0e,0x38,0x08,0x0c,0x3e,0x01,0xae,0xbd,0x13,0x0c,0x0e,0x35,0x8e,0xa8,0x1c,0xb0,0x1f,0xf8,0x06,0x83,0xf4,0x27,0x38,0x07,0xff,0xff,0x8f,0x03,0xa0,0x4c,0x80,0xed,0x60,0x03,0xb4,0x60,0x0e,0xd0,0x60,0x3a,0x87,0x84,0x0e,0xb7,0xc2,0xfa,0x18,0x05,0x44,0x20,0x73,0xff,0xf7,0xce,0xe4,0x07,0x2d,0x52,0x2c,0x80,0xe7,0x54,0xea,0x81,0xd7,0x50,0x0f,0x7a,0xaa,0x3d,0x41,0xe2,0x07,0x5a,0x80,0x3c,0xa0,0x40,0x72,0xd0,0x6a,0x80,0xa2,0x07,0x3a,0x05,0x54,0x8e,0x20,0x73,0xc0,0x03,0xd8,0x60,0x30,0x40,0x3a,0xc0,0x00,0xee,0xea,0x10,0x3b,0x80,}; | ||||
| const uint8_t *_I_DolphinExcited_64x63[] = {_I_DolphinExcited_64x63_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinWait_61x59_0[] = {0x01,0x00,0x56,0x01,0x00,0x17,0xfa,0x1e,0x06,0x4f,0x84,0x06,0xe0,0x07,0x48,0x64,0x03,0x01,0x01,0x03,0x9c,0x0c,0x04,0x30,0x60,0x31,0x70,0x00,0x65,0x08,0x01,0x94,0xc0,0x06,0x51,0x00,0x5b,0x48,0x00,0x65,0x04,0x01,0x95,0x00,0x82,0xd8,0x00,0x19,0x40,0x7e,0x00,0x75,0x1f,0x88,0xe0,0x88,0x02,0x1a,0x1f,0x94,0x14,0x0e,0xbf,0x98,0x58,0x5c,0x42,0x45,0x00,0x9e,0x99,0x87,0x01,0x02,0x11,0x94,0xf2,0x2e,0x03,0x18,0x39,0x28,0x70,0x1f,0xc0,0x3e,0x42,0x00,0xe5,0x80,0xff,0xdf,0xc0,0xe5,0xf8,0x85,0xd8,0x10,0x27,0x40,0xf9,0xc2,0x63,0x88,0x12,0x82,0x6a,0x20,0x50,0x41,0xe9,0x42,0x20,0x95,0x48,0x6e,0x0c,0xfa,0x9a,0xaf,0xf9,0x90,0xe2,0x10,0x2e,0xac,0xe0,0x0e,0x98,0x29,0x52,0x11,0x13,0x23,0x15,0x3e,0x20,0x3c,0x61,0x40,0x52,0xfc,0x4f,0xe2,0x10,0x38,0x68,0x1c,0xa0,0xfc,0x08,0xbe,0x04,0x1e,0x5e,0x01,0xb9,0x03,0xc5,0x60,0x24,0xf2,0x84,0x60,0x63,0x40,0x71,0x27,0x9c,0x0e,0x2b,0x04,0x6c,0xa4,0x06,0x15,0x08,0x6c,0x99,0x8c,0xa6,0x0f,0x81,0x00,0x0c,0x08,0xf0,0x3c,0x05,0x61,0xc0,0x40,0x86,0xd0,0x30,0x78,0x80,0x0c,0xc6,0x2b,0x92,0x00,0x0d,0x51,0xf0,0x2d,0x42,0x0a,0x8e,0xaa,0x34,0x0f,0x4a,0x85,0x55,0x6e,0x20,0xf3,0xd5,0x6a,0x84,0xa2,0x66,0x2a,0x05,0xf7,0xaa,0x07,0x18,0xaf,0xfb,0x7f,0xea,0xc1,0xef,0xc0,0xe3,0xea,0x80,0xf8,0x27,0xf0,0x0a,0xc0,0x1c,0x67,0xa2,0xd1,0xb1,0xc0,0x34,0x00,0x71,0x14,0x8f,0x00,0x98,0x34,0x02,0x69,0xd0,0x37,0x90,0x16,0xf1,0x00,0x06,0xe1,0x84,0x31,0x89,0x14,0xe9,0xdc,0x40,0x38,0xa4,0xc4,0x4c,0x3c,0x1f,0x88,0x8c,0x5b,0xc3,0x01,0xbc,0x40,0x3f,0xf0,0xf6,0x71,0x0c,0x0b,0xe0,0x07,0x3c,0x0a,0xf8,0xa3,0xf0,0x03,0xb8,0xd8,0x80,0xe8,0x87,0x1b,0xa8,0x1c,0x78,0x1f,0xf8,0x0e,0x7e,0x01,0x6a,0x03,0x94,0x0f,0xfd,0xa0,0x80,0x7d,0x49,0x04,0x4d,0x12,0xc0,0xfa,0x83,0x83,0xbe,0x26,0x8d,0x02,0x05,0xd5,0xff,0xff,0xeb,0xe9,0x31,0x90,0x40,0x80,}; | ||||
| const uint8_t *_I_DolphinWait_61x59[] = {_I_DolphinWait_61x59_0}; | ||||
| 
 | ||||
| const Icon I_Certification1_103x23 = {.width=103,.height=23,.frame_count=1,.frame_rate=0,.frames=_I_Certification1_103x23}; | ||||
| const uint8_t _I_iButtonDolphinVerySuccess_108x52_0[] = {0x01,0x00,0xc2,0x01,0x00,0x0f,0xe2,0xfe,0x0d,0xb8,0x3e,0x02,0x06,0x0c,0x9f,0x00,0x08,0x61,0x80,0xd9,0x8c,0x00,0x86,0x60,0x0d,0x98,0x30,0x08,0x6a,0x00,0xd9,0x80,0x80,0x87,0x40,0x0c,0x8c,0x00,0x0c,0xa8,0x01,0x12,0x00,0x2d,0x00,0x22,0x70,0x20,0x6b,0xc8,0x02,0x26,0x62,0x88,0x80,0x6c,0xc9,0x24,0x0d,0x9a,0x07,0x17,0xfe,0x1d,0x68,0x40,0x6c,0xe7,0x48,0x04,0x28,0x10,0x34,0xe8,0x10,0xd1,0x11,0xc4,0x01,0xa5,0x04,0x06,0x96,0xa0,0xa6,0x24,0xc2,0x88,0x17,0x88,0x1a,0x7d,0x43,0x78,0x82,0x4a,0x40,0x03,0x20,0xb0,0xff,0x20,0x16,0xa3,0xb2,0x48,0x03,0xe4,0x0d,0x1f,0xfc,0x06,0x3a,0x0d,0x4a,0x00,0x34,0xf8,0x00,0xd1,0x37,0x0f,0x82,0x9e,0x95,0x58,0x17,0x83,0xff,0x81,0x1b,0x0f,0xf1,0xfe,0x71,0xe0,0x69,0x7c,0x3f,0xe0,0x82,0xff,0xcf,0xc0,0x85,0x61,0x80,0x43,0xb0,0x5f,0xa8,0x79,0xdc,0x81,0xa5,0x70,0xc0,0x68,0x3c,0x10,0x1a,0x17,0xd5,0x28,0x42,0xd1,0x8f,0x84,0x46,0x83,0xb0,0x8e,0x40,0x34,0x5f,0xa8,0x38,0x34,0x45,0xa2,0x0d,0x18,0x04,0x9b,0x50,0x03,0x1a,0x14,0x35,0x36,0x5f,0x8f,0xf8,0xb8,0xa4,0x19,0x40,0x18,0xe8,0xa0,0xca,0x22,0xfe,0x7f,0xc4,0x05,0x20,0xa5,0x80,0xc6,0x82,0xcb,0x3f,0xf3,0x44,0xfc,0x12,0x40,0x18,0xe8,0x51,0x82,0x52,0x28,0xfc,0x38,0x0a,0x3e,0x48,0x98,0x6c,0x8f,0x43,0x00,0xe0,0x63,0xe0,0x62,0xe2,0x91,0x90,0x0a,0x02,0x0d,0x2f,0x82,0x50,0x41,0xa3,0x80,0x90,0x41,0x04,0xc3,0x01,0xc0,0x83,0x46,0x71,0x30,0x06,0x95,0x82,0x21,0x02,0x6e,0x88,0x6c,0x43,0x83,0x1f,0x2f,0x88,0x34,0x62,0x00,0xd1,0x15,0x08,0x2c,0x60,0xcc,0x51,0x0f,0x08,0xcc,0x81,0xa2,0x12,0x10,0x68,0xc6,0x3f,0x06,0xc2,0x06,0x8e,0x02,0x16,0x41,0x20,0x10,0xf8,0x01,0x85,0x00,0x19,0x0d,0x82,0x18,0x07,0x20,0x81,0x00,0x0c,0x9c,0x31,0x08,0x42,0x74,0x81,0xab,0x80,0x03,0x0c,0x32,0x11,0x0b,0x06,0xb9,0xc0,0x43,0xa3,0x10,0x8b,0x83,0x5c,0xe0,0x20,0x81,0xc8,0x26,0x49,0x4c,0x40,0x02,0x86,0x0a,0xc5,0x22,0x32,0x50,0x6b,0x93,0x86,0xc0,0x0d,0x19,0x18,0x35,0x8c,0x84,0x79,0x1a,0x84,0x84,0x1a,0xdf,0xc2,0xe0,0x8a,0xc7,0x51,0x22,0x06,0xb5,0x5e,0x3f,0x00,0x77,0x0d,0x60,0x36,0xfa,0xa9,0xd7,0x00,0x08,0x3a,0xc9,0x02,0x48,0xc0,0x05,0x54,0xba,0x98,0x8a,0xa8,0xf1,0x20,0x6a,0x6a,0x3d,0x43,0x61,0x80,0x4a,0x81,0xaf,0x40,0xea,0x8d,0x86,0x01,0x56,0x06,0x93,0x60,0x80,0x05,0xea,0x01,0x94,0xac,0x1b,0x11,0x80,0x19,0x45,0x41,0x44,0x0d,0x58,0x33,0x18,0xa1,0x4f,0xf3,0x06,0x1f,0x01,0x76,0x58,0x00,0xd9,0x83,0x52,0x7c,0x11,0x38,0x51,0x40,0x80,}; | ||||
| const uint8_t *_I_iButtonDolphinVerySuccess_108x52[] = {_I_iButtonDolphinVerySuccess_108x52_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinMafia_115x62_0[] = {0x01,0x00,0x21,0x02,0x00,0x1e,0x02,0x06,0x0e,0xcb,0x04,0x10,0x1d,0x91,0x88,0x40,0x3b,0x20,0xc0,0xec,0xc0,0x40,0x62,0x03,0xac,0x80,0x03,0xb2,0x31,0x00,0x90,0x03,0xae,0x5e,0x0e,0xcf,0xc4,0x56,0x01,0x40,0x07,0x56,0xbe,0x14,0x0e,0x2f,0xf1,0x5e,0x2a,0xa1,0xd1,0xc0,0x7c,0x3f,0xf0,0x70,0x73,0x70,0x35,0x41,0xd1,0xc0,0x7f,0xff,0xf0,0xf0,0x73,0x50,0x03,0xa4,0x0d,0x10,0x74,0x07,0x46,0x55,0xe0,0x07,0x10,0xb1,0xc3,0xa3,0x55,0xfe,0x03,0x88,0x94,0xe1,0xd1,0xd5,0x03,0x4a,0x3e,0x59,0x9e,0xaf,0xfe,0xff,0x05,0x60,0x4e,0xab,0xf5,0xff,0x95,0xb4,0xa4,0x3a,0x3f,0xd0,0xe0,0xfa,0x20,0x20,0xf8,0xd5,0xff,0xb5,0xf0,0x0f,0x88,0x3a,0x6a,0xbf,0xf8,0xaf,0x82,0x6f,0x03,0x07,0x47,0xaf,0xff,0x0a,0xfe,0x5f,0xc1,0xd3,0xf6,0xbf,0xe0,0x7f,0xfe,0xf0,0x73,0x41,0x00,0x43,0xfa,0xd7,0xf8,0x27,0xfe,0xe0,0x73,0x40,0x80,0x43,0xfe,0xab,0xfe,0x21,0xfc,0xe5,0x9b,0x05,0x48,0xea,0x3f,0xc8,0xfa,0xc4,0x66,0x07,0x44,0x0e,0x8f,0x00,0xb0,0x2b,0x31,0x07,0x0f,0x00,0x1c,0x72,0x00,0x70,0xf8,0x37,0xe5,0x81,0xff,0x89,0x08,0xf2,0x71,0x80,0x20,0xfe,0x2b,0xf0,0x5f,0xc0,0x38,0xc8,0xa5,0x60,0xc3,0x00,0xc7,0xf9,0xaf,0x81,0x2d,0x04,0x34,0x40,0xe1,0x98,0x47,0x68,0x04,0x92,0xab,0xc0,0x7e,0xb7,0xf7,0x39,0x03,0x85,0x8e,0x24,0xf1,0xc0,0x7f,0xf5,0x78,0x0f,0x53,0xb4,0xbc,0x1f,0xb8,0x1a,0x0c,0x61,0xc5,0x82,0xab,0xc0,0x3e,0xa3,0xa2,0xfc,0x07,0x46,0x09,0x60,0x19,0x8f,0x80,0xec,0x38,0x08,0x52,0x6c,0xb8,0xdc,0x28,0x7c,0x10,0x2a,0x5f,0x0f,0xfc,0x5a,0x01,0x05,0x1a,0x8e,0x02,0x02,0x1d,0x1f,0x81,0xa8,0xbe,0x13,0xf8,0x52,0x2c,0x8c,0x62,0x77,0x42,0x11,0x40,0xe0,0xca,0x93,0x8e,0x03,0x8a,0x30,0x10,0x48,0x54,0x03,0x04,0xbb,0x2c,0x00,0x0c,0x64,0x80,0xe4,0x0e,0x88,0x38,0x7c,0x10,0x04,0x09,0x48,0x83,0xac,0x1b,0x18,0xf3,0x44,0xc1,0xca,0x1d,0x15,0x40,0x8e,0x05,0x02,0x20,0xe6,0x24,0x12,0x8c,0x8b,0x05,0x21,0x07,0x24,0x14,0x08,0x73,0x80,0x19,0x78,0x43,0xb2,0xff,0x15,0x30,0xc4,0x01,0x26,0x8f,0x14,0x61,0xa9,0x8a,0x09,0x10,0x02,0x12,0x1c,0x80,0x84,0xaf,0x10,0x71,0xaa,0xc4,0x00,0x3b,0x04,0xea,0x24,0x48,0x1c,0xbd,0x8f,0xf8,0x00,0x67,0xf0,0x09,0x40,0x20,0x61,0x00,0xe4,0xf6,0x07,0x4b,0xc1,0x1f,0x07,0x14,0x40,0x1c,0x9d,0x66,0x79,0x24,0xc6,0xa0,0x0e,0x32,0x51,0xfa,0xce,0xe7,0x50,0x07,0x1c,0x80,0x30,0x58,0x0e,0xa2,0xcc,0xa0,0x19,0x00,0x71,0x42,0x13,0x27,0x40,0xf5,0x45,0x41,0xc5,0x08,0xb0,0x80,0xc6,0x18,0xf2,0x28,0x04,0x83,0xe8,0x58,0x10,0x30,0xc2,0x2c,0x40,0x91,0x89,0x3c,0x88,0x62,0x21,0xd2,0xff,0x03,0x87,0xc8,0x12,0x19,0x08,0x39,0x3e,0x83,0xb2,0x4a,0x0e,0xa2,0x0d,0xc0,0xe0,0x50,0x06,0xa7,0xe8,0x2c,0x94,0xc2,0x09,0x50,0x8c,0xce,0x20,0x34,0x70,0x71,0x41,0x3e,0x85,0xe2,0xe0,0x41,0x38,0x1e,0x28,0x3c,0x19,0xc8,0x70,0x4f,0xc1,0xdc,0xe0,0x74,0x01,0xd8,0xc6,0x24,0x00,0x82,0x81,0x7c,0x12,0xa6,0x7e,0x10,0x28,0xd8,0x22,0x00,0xe3,0xfc,0x34,0x53,0x00,0x23,0x1c,0x04,0x44,0x0e,0x50,0x10,0xeb,0x17,0xca,0x1c,0x07,0x20,}; | ||||
| const uint8_t *_I_DolphinMafia_115x62[] = {_I_DolphinMafia_115x62_0}; | ||||
| 
 | ||||
| const uint8_t _I_DolphinNice_96x59_0[] = {0x01,0x00,0x8a,0x01,0x00,0x37,0xfa,0x3e,0x0a,0x8f,0x04,0x04,0x02,0x20,0xb7,0x8c,0x00,0x86,0x1c,0x0b,0x78,0x20,0x08,0x66,0x00,0xb7,0x81,0x00,0x86,0x80,0x0b,0x71,0x61,0x60,0x01,0x4c,0x07,0x41,0xe3,0x07,0xd0,0x4e,0x40,0xb8,0x1f,0x90,0x00,0xe4,0x00,0xba,0x88,0x01,0x0e,0x10,0x0a,0x48,0xf9,0x6c,0xbe,0x10,0x70,0x82,0x78,0x3c,0x15,0x82,0x18,0xc2,0x21,0x00,0xb4,0x02,0x0e,0xbc,0x86,0x30,0x48,0x80,0xd1,0x05,0x03,0x78,0x82,0xc0,0x3e,0x52,0x32,0x63,0x70,0x20,0x70,0x09,0xd4,0x98,0xb0,0xf0,0x60,0x58,0xc9,0xce,0x12,0x0b,0xbf,0xd4,0x9d,0x28,0x9e,0x24,0xa9,0x82,0xda,0x24,0x2d,0x10,0x00,0xfd,0x2a,0x60,0xb4,0x85,0x4e,0x00,0x85,0xf8,0xd4,0x82,0xd2,0x09,0xc0,0x12,0x14,0x12,0xad,0x81,0x29,0xa8,0x90,0xf5,0x01,0x75,0x80,0x46,0x00,0xa5,0x50,0x0b,0x90,0x1c,0x41,0x63,0x60,0x05,0x96,0xc0,0x2e,0x52,0x44,0x79,0x60,0x06,0x05,0x50,0x05,0x94,0x89,0x88,0x63,0x02,0x98,0x02,0xc7,0xc1,0x21,0x6a,0x98,0xa0,0x62,0x11,0x00,0x58,0xc6,0x02,0xe2,0xb8,0x21,0x80,0xc3,0x05,0x02,0x38,0x11,0x78,0xa5,0x0b,0x01,0x81,0x5a,0x88,0x2c,0x60,0x40,0xb1,0xc0,0x27,0x0a,0xfc,0x0f,0x28,0x04,0x06,0x50,0x05,0x18,0xa9,0x94,0xc1,0x67,0x48,0x02,0x8c,0xb8,0x16,0xf8,0x80,0x28,0xd6,0x16,0x86,0x0b,0x38,0x40,0xd4,0x76,0x0c,0xd4,0x05,0x94,0x10,0x9a,0x34,0x01,0x82,0x1f,0x06,0x05,0x02,0x98,0x01,0x47,0x54,0x18,0x35,0xc8,0xff,0x20,0x3c,0x00,0x58,0xd5,0x6a,0xa0,0xb3,0x81,0xa3,0x0a,0x0f,0x80,0xd5,0xea,0x81,0x67,0x07,0x46,0x14,0xe3,0xe1,0x55,0x18,0x18,0x2c,0x51,0x85,0xc0,0xef,0x85,0x8c,0x0c,0x30,0xf4,0x61,0x40,0x2d,0x46,0xb4,0x05,0x8b,0x04,0xb0,0x15,0x40,0x5a,0x50,0x23,0xe6,0x01,0x02,0x8c,0xa8,0x2e,0xb1,0xe5,0x40,0x81,0x46,0x6a,0x17,0x59,0xeb,0xe4,0xa8,0x11,0xa0,0x5a,0x68,0x27,0x4e,0xd3,0x59,0xad,0x82,0xfa,0xed,0x2a,0x04,0x28,0x2e,0xb7,0xa7,0x69,0xc3,0x42,0xeb,0xf5,0x1f,0x09,0x4c,0x42,0xed,0xea,0x01,0x8c,0x06,0x41,0x05,0x0b,0xbc,0x02,0x0d,0x80,0x83,0x05,0xe2,0x11,0x40,0x0b,0xb7,0x14,0x06,0x33,0x0c,0x83,0x89,0x02,0xe3,0xca,0x3d,0x95,0x01,0xe2,0x21,0x74,0xc2,0x81,0x0b,0x0e,0x17,0x6c,0x10,0x10,0xaf,0x09,0xe2,0x0b,0xbb,0xd0,0x42,0xeb,0x02,}; | ||||
| const uint8_t *_I_DolphinNice_96x59[] = {_I_DolphinNice_96x59_0}; | ||||
| 
 | ||||
| const uint8_t _I_iButtonDolphinSuccess_109x60_0[] = {0x01,0x00,0xac,0x01,0x00,0x17,0xfe,0x1e,0x0c,0xaf,0x04,0x02,0xe0,0x0d,0xa8,0xf4,0x03,0x01,0x03,0x06,0x46,0x02,0x02,0x03,0x18,0xe0,0x36,0x2c,0x00,0x36,0x00,0x2c,0x40,0x3e,0x60,0xd8,0x84,0x01,0x0c,0x5a,0x40,0x05,0x82,0x01,0x0e,0x04,0x0d,0x70,0x42,0x04,0x90,0x49,0x02,0xe4,0x20,0x41,0x28,0xc0,0x07,0x40,0x06,0xf8,0x00,0xa4,0x00,0xd6,0x03,0xa8,0x37,0x44,0x2a,0x31,0x74,0xd3,0x83,0x57,0x80,0x0d,0xc7,0x18,0xa9,0xa8,0x36,0x2a,0x86,0x06,0x8d,0xfc,0x36,0x60,0xd7,0xc0,0x3b,0x8c,0x36,0xf0,0x4a,0x05,0xf9,0x6e,0x5e,0x06,0x23,0x41,0x24,0x1f,0xf6,0x01,0x74,0x01,0xb1,0xe3,0x82,0x81,0x47,0x40,0x0d,0x7c,0x87,0x8e,0x12,0x05,0x1a,0x84,0x0d,0xb6,0xa0,0xd2,0x85,0x86,0xc8,0x1a,0x50,0x40,0x69,0x40,0xb2,0x1f,0xf0,0x69,0x50,0x01,0xa5,0x08,0xfc,0x03,0x5f,0x60,0x0d,0x28,0x84,0x1a,0x07,0x18,0x06,0xaf,0x00,0x1a,0x3c,0x03,0xb8,0xc3,0x20,0xd0,0x28,0x87,0xfc,0x8a,0x50,0x08,0x78,0x08,0x70,0x77,0x0c,0x44,0x06,0x05,0x30,0xff,0x18,0x4a,0x01,0x30,0x01,0x0d,0x33,0x19,0x11,0x1b,0x8c,0xa2,0xf8,0x7d,0x27,0x71,0xd0,0x20,0x51,0x20,0x68,0xd5,0x00,0x42,0x0d,0x2c,0x00,0x08,0x64,0x10,0x19,0x20,0x28,0x75,0x07,0x53,0x3d,0x18,0x35,0x2a,0x9f,0xf4,0x9a,0x41,0x90,0x23,0x00,0x94,0x43,0xe0,0x5e,0xae,0x03,0x9d,0xb4,0xe0,0xd1,0x0d,0x8c,0xd0,0x52,0xb1,0x00,0xd9,0x83,0x46,0x34,0x45,0x41,0xa8,0x9f,0x86,0x01,0x14,0x05,0x08,0x08,0x81,0xa6,0x62,0x10,0x68,0xe5,0x20,0x70,0x41,0x80,0x80,0x10,0xc4,0x34,0x48,0x04,0x2a,0x38,0x0d,0x99,0x16,0x02,0x1a,0xd5,0x10,0x6c,0x5e,0x2e,0x0b,0xa1,0x4b,0x0a,0x60,0xc1,0xa7,0x84,0xfc,0x58,0x01,0xb5,0x02,0x82,0xb4,0xc4,0x16,0x22,0xa5,0x06,0x96,0x19,0x20,0x20,0xd7,0x30,0x8c,0x0f,0x08,0x05,0x10,0x68,0xa1,0x44,0x1a,0x98,0x08,0x14,0x11,0x28,0x21,0x91,0x1d,0x8f,0x83,0xfe,0x07,0x1b,0x00,0x34,0x61,0x00,0xd3,0x1d,0x8c,0x7a,0x01,0x7e,0x80,0x56,0x30,0x06,0xb1,0x4a,0x08,0xd4,0xbf,0xc1,0x31,0xc0,0x7f,0xe8,0xf0,0x08,0x3c,0x40,0x1a,0x80,0x04,0x5a,0x8c,0x10,0x80,0x40,0xd7,0x05,0x08,0x36,0xc0,0xe2,0x0d,0xb8,0x30,0x34,0x45,0x82,0x0d,0x72,0x49,0x03,0x5a,0x41,0x55,0xf8,0x7f,0xff,0xe8,0x72,0x06,0xae,0x03,0xf4,0x0c,0x1d,0xf8,0x18,0x60,0x40,0xd2,0x4b,0x9f,0xd0,0x1a,0x35,0x71,0x48,0xc0,0x95,0x42,0x0d,0x4d,0x50,0x70,0x75,0x40,0xd1,0x80,0x83,0x5a,0xa1,0x55,0x00,0x0c,0x05,0xa4,0x20,0xd2,}; | ||||
| const uint8_t *_I_iButtonDolphinSuccess_109x60[] = {_I_iButtonDolphinSuccess_109x60_0}; | ||||
| 
 | ||||
| const Icon I_Certification2_119x30 = {.width=119,.height=30,.frame_count=1,.frame_rate=0,.frames=_I_Certification2_119x30}; | ||||
| const Icon I_Certification1_103x23 = {.width=103,.height=23,.frame_count=1,.frame_rate=0,.frames=_I_Certification1_103x23}; | ||||
| const Icon A_WatchingTV_128x64 = {.width=128,.height=64,.frame_count=4,.frame_rate=1,.frames=_A_WatchingTV_128x64}; | ||||
| const Icon A_Wink_128x64 = {.width=128,.height=64,.frame_count=9,.frame_rate=1,.frames=_A_Wink_128x64}; | ||||
| const Icon I_dir_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_dir_10px}; | ||||
| const Icon I_Nfc_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_Nfc_10px}; | ||||
| const Icon I_sub1_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_sub1_10px}; | ||||
| const Icon I_ir_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_ir_10px}; | ||||
| const Icon I_ibutt_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_ibutt_10px}; | ||||
| const Icon I_unknown_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_unknown_10px}; | ||||
| const Icon I_ibutt_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_ibutt_10px}; | ||||
| const Icon I_Nfc_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_Nfc_10px}; | ||||
| const Icon I_ble_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_ble_10px}; | ||||
| const Icon I_125_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_125_10px}; | ||||
| const Icon I_dir_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_dir_10px}; | ||||
| const Icon I_BLE_Pairing_128x64 = {.width=128,.height=64,.frame_count=1,.frame_rate=0,.frames=_I_BLE_Pairing_128x64}; | ||||
| const Icon I_ButtonRightSmall_3x5 = {.width=3,.height=5,.frame_count=1,.frame_rate=0,.frames=_I_ButtonRightSmall_3x5}; | ||||
| const Icon I_ButtonLeft_4x7 = {.width=4,.height=7,.frame_count=1,.frame_rate=0,.frames=_I_ButtonLeft_4x7}; | ||||
| const Icon I_ButtonLeftSmall_3x5 = {.width=3,.height=5,.frame_count=1,.frame_rate=0,.frames=_I_ButtonLeftSmall_3x5}; | ||||
| const Icon I_DFU_128x50 = {.width=128,.height=50,.frame_count=1,.frame_rate=0,.frames=_I_DFU_128x50}; | ||||
| const Icon I_Warning_30x23 = {.width=30,.height=23,.frame_count=1,.frame_rate=0,.frames=_I_Warning_30x23}; | ||||
| const Icon I_ButtonDown_7x4 = {.width=7,.height=4,.frame_count=1,.frame_rate=0,.frames=_I_ButtonDown_7x4}; | ||||
| const Icon I_ButtonRight_4x7 = {.width=4,.height=7,.frame_count=1,.frame_rate=0,.frames=_I_ButtonRight_4x7}; | ||||
| const Icon I_ButtonCenter_7x7 = {.width=7,.height=7,.frame_count=1,.frame_rate=0,.frames=_I_ButtonCenter_7x7}; | ||||
| const Icon I_ButtonLeft_4x7 = {.width=4,.height=7,.frame_count=1,.frame_rate=0,.frames=_I_ButtonLeft_4x7}; | ||||
| const Icon I_ButtonUp_7x4 = {.width=7,.height=4,.frame_count=1,.frame_rate=0,.frames=_I_ButtonUp_7x4}; | ||||
| const Icon I_DolphinOkay_41x43 = {.width=41,.height=43,.frame_count=1,.frame_rate=0,.frames=_I_DolphinOkay_41x43}; | ||||
| const Icon I_DolphinFirstStart4_67x53 = {.width=67,.height=53,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart4_67x53}; | ||||
| const Icon I_DFU_128x50 = {.width=128,.height=50,.frame_count=1,.frame_rate=0,.frames=_I_DFU_128x50}; | ||||
| const Icon I_ButtonLeftSmall_3x5 = {.width=3,.height=5,.frame_count=1,.frame_rate=0,.frames=_I_ButtonLeftSmall_3x5}; | ||||
| const Icon I_ButtonRightSmall_3x5 = {.width=3,.height=5,.frame_count=1,.frame_rate=0,.frames=_I_ButtonRightSmall_3x5}; | ||||
| const Icon I_ButtonRight_4x7 = {.width=4,.height=7,.frame_count=1,.frame_rate=0,.frames=_I_ButtonRight_4x7}; | ||||
| const Icon I_Warning_30x23 = {.width=30,.height=23,.frame_count=1,.frame_rate=0,.frames=_I_Warning_30x23}; | ||||
| const Icon I_DolphinFirstStart2_59x51 = {.width=59,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart2_59x51}; | ||||
| const Icon I_DolphinFirstStart5_54x49 = {.width=54,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart5_54x49}; | ||||
| const Icon I_DolphinFirstStart0_70x53 = {.width=70,.height=53,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart0_70x53}; | ||||
| const Icon I_DolphinFirstStart6_58x54 = {.width=58,.height=54,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart6_58x54}; | ||||
| const Icon I_DolphinFirstStart1_59x53 = {.width=59,.height=53,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart1_59x53}; | ||||
| const Icon I_DolphinFirstStart8_56x51 = {.width=56,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart8_56x51}; | ||||
| const Icon I_DolphinFirstStart7_61x51 = {.width=61,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart7_61x51}; | ||||
| const Icon I_Flipper_young_80x60 = {.width=80,.height=60,.frame_count=1,.frame_rate=0,.frames=_I_Flipper_young_80x60}; | ||||
| const Icon I_DolphinFirstStart8_56x51 = {.width=56,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart8_56x51}; | ||||
| const Icon I_DolphinFirstStart1_59x53 = {.width=59,.height=53,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart1_59x53}; | ||||
| const Icon I_DolphinOkay_41x43 = {.width=41,.height=43,.frame_count=1,.frame_rate=0,.frames=_I_DolphinOkay_41x43}; | ||||
| const Icon I_DolphinFirstStart3_57x48 = {.width=57,.height=48,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart3_57x48}; | ||||
| const Icon I_DolphinFirstStart7_61x51 = {.width=61,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart7_61x51}; | ||||
| const Icon I_DolphinFirstStart0_70x53 = {.width=70,.height=53,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart0_70x53}; | ||||
| const Icon I_DolphinFirstStart4_67x53 = {.width=67,.height=53,.frame_count=1,.frame_rate=0,.frames=_I_DolphinFirstStart4_67x53}; | ||||
| const Icon I_PassportBottom_128x17 = {.width=128,.height=17,.frame_count=1,.frame_rate=0,.frames=_I_PassportBottom_128x17}; | ||||
| const Icon I_DoorLocked_10x56 = {.width=10,.height=56,.frame_count=1,.frame_rate=0,.frames=_I_DoorLocked_10x56}; | ||||
| const Icon I_DoorLeft_70x55 = {.width=70,.height=55,.frame_count=1,.frame_rate=0,.frames=_I_DoorLeft_70x55}; | ||||
| const Icon I_PassportLeft_6x47 = {.width=6,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_PassportLeft_6x47}; | ||||
| const Icon I_DoorRight_70x55 = {.width=70,.height=55,.frame_count=1,.frame_rate=0,.frames=_I_DoorRight_70x55}; | ||||
| const Icon I_DoorLocked_10x56 = {.width=10,.height=56,.frame_count=1,.frame_rate=0,.frames=_I_DoorLocked_10x56}; | ||||
| const Icon I_PassportLeft_6x47 = {.width=6,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_PassportLeft_6x47}; | ||||
| const Icon I_LockPopup_100x49 = {.width=100,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_LockPopup_100x49}; | ||||
| const Icon I_Mute_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Mute_25x27}; | ||||
| const Icon I_IrdaArrowUp_4x8 = {.width=8,.height=4,.frame_count=1,.frame_rate=0,.frames=_I_IrdaArrowUp_4x8}; | ||||
| const Icon I_Up_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Up_hvr_25x27}; | ||||
| const Icon I_Mute_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Mute_hvr_25x27}; | ||||
| const Icon I_Vol_down_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Vol_down_25x27}; | ||||
| const Icon I_Down_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Down_25x27}; | ||||
| const Icon I_Power_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Power_hvr_25x27}; | ||||
| const Icon I_IrdaLearnShort_128x31 = {.width=128,.height=31,.frame_count=1,.frame_rate=0,.frames=_I_IrdaLearnShort_128x31}; | ||||
| const Icon I_IrdaArrowDown_4x8 = {.width=8,.height=4,.frame_count=1,.frame_rate=0,.frames=_I_IrdaArrowDown_4x8}; | ||||
| const Icon I_Vol_down_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Vol_down_hvr_25x27}; | ||||
| const Icon I_IrdaLearn_128x64 = {.width=128,.height=64,.frame_count=1,.frame_rate=0,.frames=_I_IrdaLearn_128x64}; | ||||
| const Icon I_Down_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Down_hvr_25x27}; | ||||
| const Icon I_Vol_down_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Vol_down_hvr_25x27}; | ||||
| const Icon I_Down_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Down_25x27}; | ||||
| const Icon I_Fill_marker_7x7 = {.width=7,.height=7,.frame_count=1,.frame_rate=0,.frames=_I_Fill_marker_7x7}; | ||||
| const Icon I_Power_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Power_25x27}; | ||||
| const Icon I_Vol_down_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Vol_down_25x27}; | ||||
| const Icon I_Vol_up_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Vol_up_25x27}; | ||||
| const Icon I_Up_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Up_25x27}; | ||||
| const Icon I_Back_15x10 = {.width=15,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_Back_15x10}; | ||||
| const Icon I_IrdaSend_128x64 = {.width=128,.height=64,.frame_count=1,.frame_rate=0,.frames=_I_IrdaSend_128x64}; | ||||
| const Icon I_IrdaSendShort_128x34 = {.width=128,.height=34,.frame_count=1,.frame_rate=0,.frames=_I_IrdaSendShort_128x34}; | ||||
| const Icon I_Up_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Up_hvr_25x27}; | ||||
| const Icon I_Vol_up_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Vol_up_hvr_25x27}; | ||||
| const Icon I_KeySave_24x11 = {.width=24,.height=11,.frame_count=1,.frame_rate=0,.frames=_I_KeySave_24x11}; | ||||
| const Icon I_KeyBackspaceSelected_16x9 = {.width=16,.height=9,.frame_count=1,.frame_rate=0,.frames=_I_KeyBackspaceSelected_16x9}; | ||||
| const Icon I_IrdaLearnShort_128x31 = {.width=128,.height=31,.frame_count=1,.frame_rate=0,.frames=_I_IrdaLearnShort_128x31}; | ||||
| const Icon I_IrdaSend_128x64 = {.width=128,.height=64,.frame_count=1,.frame_rate=0,.frames=_I_IrdaSend_128x64}; | ||||
| const Icon I_DolphinReadingSuccess_59x63 = {.width=59,.height=63,.frame_count=1,.frame_rate=0,.frames=_I_DolphinReadingSuccess_59x63}; | ||||
| const Icon I_Mute_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Mute_hvr_25x27}; | ||||
| const Icon I_Back_15x10 = {.width=15,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_Back_15x10}; | ||||
| const Icon I_Up_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Up_25x27}; | ||||
| const Icon I_IrdaArrowUp_4x8 = {.width=8,.height=4,.frame_count=1,.frame_rate=0,.frames=_I_IrdaArrowUp_4x8}; | ||||
| const Icon I_Mute_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Mute_25x27}; | ||||
| const Icon I_Power_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Power_25x27}; | ||||
| const Icon I_IrdaSendShort_128x34 = {.width=128,.height=34,.frame_count=1,.frame_rate=0,.frames=_I_IrdaSendShort_128x34}; | ||||
| const Icon I_IrdaArrowDown_4x8 = {.width=8,.height=4,.frame_count=1,.frame_rate=0,.frames=_I_IrdaArrowDown_4x8}; | ||||
| const Icon I_IrdaLearn_128x64 = {.width=128,.height=64,.frame_count=1,.frame_rate=0,.frames=_I_IrdaLearn_128x64}; | ||||
| const Icon I_Power_hvr_25x27 = {.width=25,.height=27,.frame_count=1,.frame_rate=0,.frames=_I_Power_hvr_25x27}; | ||||
| const Icon I_KeySaveSelected_24x11 = {.width=24,.height=11,.frame_count=1,.frame_rate=0,.frames=_I_KeySaveSelected_24x11}; | ||||
| const Icon I_KeyBackspace_16x9 = {.width=16,.height=9,.frame_count=1,.frame_rate=0,.frames=_I_KeyBackspace_16x9}; | ||||
| const Icon I_KeyBackspaceSelected_16x9 = {.width=16,.height=9,.frame_count=1,.frame_rate=0,.frames=_I_KeyBackspaceSelected_16x9}; | ||||
| const Icon I_KeySave_24x11 = {.width=24,.height=11,.frame_count=1,.frame_rate=0,.frames=_I_KeySave_24x11}; | ||||
| const Icon A_125khz_14 = {.width=14,.height=14,.frame_count=4,.frame_rate=3,.frames=_A_125khz_14}; | ||||
| const Icon A_Bluetooth_14 = {.width=14,.height=14,.frame_count=6,.frame_rate=3,.frames=_A_Bluetooth_14}; | ||||
| const Icon A_Debug_14 = {.width=14,.height=14,.frame_count=4,.frame_rate=3,.frames=_A_Debug_14}; | ||||
| @ -548,45 +552,45 @@ const Icon A_U2F_14 = {.width=14,.height=14,.frame_count=4,.frame_rate=3,.frames | ||||
| const Icon A_iButton_14 = {.width=14,.height=14,.frame_count=7,.frame_rate=3,.frames=_A_iButton_14}; | ||||
| const Icon I_Detailed_chip_17x13 = {.width=17,.height=13,.frame_count=1,.frame_rate=0,.frames=_I_Detailed_chip_17x13}; | ||||
| const Icon I_Medium_chip_22x21 = {.width=22,.height=21,.frame_count=1,.frame_rate=0,.frames=_I_Medium_chip_22x21}; | ||||
| const Icon I_Health_16x16 = {.width=16,.height=16,.frame_count=1,.frame_rate=0,.frames=_I_Health_16x16}; | ||||
| const Icon I_FaceCharging_29x14 = {.width=29,.height=14,.frame_count=1,.frame_rate=0,.frames=_I_FaceCharging_29x14}; | ||||
| const Icon I_BatteryBody_52x28 = {.width=52,.height=28,.frame_count=1,.frame_rate=0,.frames=_I_BatteryBody_52x28}; | ||||
| const Icon I_Voltage_16x16 = {.width=16,.height=16,.frame_count=1,.frame_rate=0,.frames=_I_Voltage_16x16}; | ||||
| const Icon I_FaceCharging_29x14 = {.width=29,.height=14,.frame_count=1,.frame_rate=0,.frames=_I_FaceCharging_29x14}; | ||||
| const Icon I_Health_16x16 = {.width=16,.height=16,.frame_count=1,.frame_rate=0,.frames=_I_Health_16x16}; | ||||
| const Icon I_Temperature_16x16 = {.width=16,.height=16,.frame_count=1,.frame_rate=0,.frames=_I_Temperature_16x16}; | ||||
| const Icon I_FaceNopower_29x14 = {.width=29,.height=14,.frame_count=1,.frame_rate=0,.frames=_I_FaceNopower_29x14}; | ||||
| const Icon I_FaceNormal_29x14 = {.width=29,.height=14,.frame_count=1,.frame_rate=0,.frames=_I_FaceNormal_29x14}; | ||||
| const Icon I_Battery_16x16 = {.width=16,.height=16,.frame_count=1,.frame_rate=0,.frames=_I_Battery_16x16}; | ||||
| const Icon I_FaceConfused_29x14 = {.width=29,.height=14,.frame_count=1,.frame_rate=0,.frames=_I_FaceConfused_29x14}; | ||||
| const Icon I_RFIDDolphinSuccess_108x57 = {.width=108,.height=57,.frame_count=1,.frame_rate=0,.frames=_I_RFIDDolphinSuccess_108x57}; | ||||
| const Icon I_RFIDBigChip_37x36 = {.width=37,.height=36,.frame_count=1,.frame_rate=0,.frames=_I_RFIDBigChip_37x36}; | ||||
| const Icon I_FaceNormal_29x14 = {.width=29,.height=14,.frame_count=1,.frame_rate=0,.frames=_I_FaceNormal_29x14}; | ||||
| const Icon I_Voltage_16x16 = {.width=16,.height=16,.frame_count=1,.frame_rate=0,.frames=_I_Voltage_16x16}; | ||||
| const Icon I_FaceNopower_29x14 = {.width=29,.height=14,.frame_count=1,.frame_rate=0,.frames=_I_FaceNopower_29x14}; | ||||
| const Icon I_RFIDDolphinSend_97x61 = {.width=97,.height=61,.frame_count=1,.frame_rate=0,.frames=_I_RFIDDolphinSend_97x61}; | ||||
| const Icon I_RFIDDolphinSuccess_108x57 = {.width=108,.height=57,.frame_count=1,.frame_rate=0,.frames=_I_RFIDDolphinSuccess_108x57}; | ||||
| const Icon I_RFIDDolphinReceive_97x61 = {.width=97,.height=61,.frame_count=1,.frame_rate=0,.frames=_I_RFIDDolphinReceive_97x61}; | ||||
| const Icon I_RFIDBigChip_37x36 = {.width=37,.height=36,.frame_count=1,.frame_rate=0,.frames=_I_RFIDBigChip_37x36}; | ||||
| const Icon I_SDQuestion_35x43 = {.width=35,.height=43,.frame_count=1,.frame_rate=0,.frames=_I_SDQuestion_35x43}; | ||||
| const Icon I_SDError_43x35 = {.width=43,.height=35,.frame_count=1,.frame_rate=0,.frames=_I_SDError_43x35}; | ||||
| const Icon I_Cry_dolph_55x52 = {.width=55,.height=52,.frame_count=1,.frame_rate=0,.frames=_I_Cry_dolph_55x52}; | ||||
| const Icon I_BadUsb_9x8 = {.width=9,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_BadUsb_9x8}; | ||||
| const Icon I_PlaceholderR_30x13 = {.width=30,.height=13,.frame_count=1,.frame_rate=0,.frames=_I_PlaceholderR_30x13}; | ||||
| const Icon I_Background_128x8 = {.width=128,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Background_128x8}; | ||||
| const Icon I_Background_128x11 = {.width=128,.height=11,.frame_count=1,.frame_rate=0,.frames=_I_Background_128x11}; | ||||
| const Icon I_Lock_8x8 = {.width=8,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Lock_8x8}; | ||||
| const Icon I_Battery_26x8 = {.width=26,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Battery_26x8}; | ||||
| const Icon I_PlaceholderL_11x13 = {.width=11,.height=13,.frame_count=1,.frame_rate=0,.frames=_I_PlaceholderL_11x13}; | ||||
| const Icon I_Battery_19x8 = {.width=19,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Battery_19x8}; | ||||
| const Icon I_SDcardMounted_11x8 = {.width=11,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_SDcardMounted_11x8}; | ||||
| const Icon I_SDcardFail_11x8 = {.width=11,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_SDcardFail_11x8}; | ||||
| const Icon I_USBConnected_15x8 = {.width=15,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_USBConnected_15x8}; | ||||
| const Icon I_Bluetooth_5x8 = {.width=5,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Bluetooth_5x8}; | ||||
| const Icon I_Background_128x8 = {.width=128,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Background_128x8}; | ||||
| const Icon I_BadUsb_9x8 = {.width=9,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_BadUsb_9x8}; | ||||
| const Icon I_BT_Pair_9x8 = {.width=9,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_BT_Pair_9x8}; | ||||
| const Icon I_Background_128x11 = {.width=128,.height=11,.frame_count=1,.frame_rate=0,.frames=_I_Background_128x11}; | ||||
| const Icon I_Scanning_123x52 = {.width=123,.height=52,.frame_count=1,.frame_rate=0,.frames=_I_Scanning_123x52}; | ||||
| const Icon I_PlaceholderL_11x13 = {.width=11,.height=13,.frame_count=1,.frame_rate=0,.frames=_I_PlaceholderL_11x13}; | ||||
| const Icon I_SDcardFail_11x8 = {.width=11,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_SDcardFail_11x8}; | ||||
| const Icon I_Bluetooth_5x8 = {.width=5,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Bluetooth_5x8}; | ||||
| const Icon I_PlaceholderR_30x13 = {.width=30,.height=13,.frame_count=1,.frame_rate=0,.frames=_I_PlaceholderR_30x13}; | ||||
| const Icon I_SDcardMounted_11x8 = {.width=11,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_SDcardMounted_11x8}; | ||||
| const Icon I_Quest_7x8 = {.width=7,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Quest_7x8}; | ||||
| const Icon I_Unlock_7x8 = {.width=7,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Unlock_7x8}; | ||||
| const Icon I_MHz_25x11 = {.width=25,.height=11,.frame_count=1,.frame_rate=0,.frames=_I_MHz_25x11}; | ||||
| const Icon I_Lock_7x8 = {.width=7,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Lock_7x8}; | ||||
| const Icon I_DolphinMafia_115x62 = {.width=115,.height=62,.frame_count=1,.frame_rate=0,.frames=_I_DolphinMafia_115x62}; | ||||
| const Icon I_DolphinExcited_64x63 = {.width=64,.height=63,.frame_count=1,.frame_rate=0,.frames=_I_DolphinExcited_64x63}; | ||||
| const Icon I_iButtonDolphinSuccess_109x60 = {.width=109,.height=60,.frame_count=1,.frame_rate=0,.frames=_I_iButtonDolphinSuccess_109x60}; | ||||
| const Icon I_iButtonDolphinVerySuccess_108x52 = {.width=108,.height=52,.frame_count=1,.frame_rate=0,.frames=_I_iButtonDolphinVerySuccess_108x52}; | ||||
| const Icon I_Scanning_123x52 = {.width=123,.height=52,.frame_count=1,.frame_rate=0,.frames=_I_Scanning_123x52}; | ||||
| const Icon I_MHz_25x11 = {.width=25,.height=11,.frame_count=1,.frame_rate=0,.frames=_I_MHz_25x11}; | ||||
| const Icon I_Unlock_7x8 = {.width=7,.height=8,.frame_count=1,.frame_rate=0,.frames=_I_Unlock_7x8}; | ||||
| const Icon I_iButtonKey_49x44 = {.width=49,.height=44,.frame_count=1,.frame_rate=0,.frames=_I_iButtonKey_49x44}; | ||||
| const Icon I_DolphinNice_96x59 = {.width=96,.height=59,.frame_count=1,.frame_rate=0,.frames=_I_DolphinNice_96x59}; | ||||
| const Icon I_DolphinExcited_64x63 = {.width=64,.height=63,.frame_count=1,.frame_rate=0,.frames=_I_DolphinExcited_64x63}; | ||||
| const Icon I_DolphinWait_61x59 = {.width=61,.height=59,.frame_count=1,.frame_rate=0,.frames=_I_DolphinWait_61x59}; | ||||
| const Icon I_iButtonDolphinVerySuccess_108x52 = {.width=108,.height=52,.frame_count=1,.frame_rate=0,.frames=_I_iButtonDolphinVerySuccess_108x52}; | ||||
| const Icon I_DolphinMafia_115x62 = {.width=115,.height=62,.frame_count=1,.frame_rate=0,.frames=_I_DolphinMafia_115x62}; | ||||
| const Icon I_DolphinNice_96x59 = {.width=96,.height=59,.frame_count=1,.frame_rate=0,.frames=_I_DolphinNice_96x59}; | ||||
| const Icon I_iButtonDolphinSuccess_109x60 = {.width=109,.height=60,.frame_count=1,.frame_rate=0,.frames=_I_iButtonDolphinSuccess_109x60}; | ||||
| 
 | ||||
|  | ||||
| @ -1,69 +1,70 @@ | ||||
| #pragma once | ||||
| #include <gui/icon.h> | ||||
| 
 | ||||
| extern const Icon I_Certification1_103x23; | ||||
| extern const Icon I_Certification2_119x30; | ||||
| extern const Icon I_Certification1_103x23; | ||||
| extern const Icon A_WatchingTV_128x64; | ||||
| extern const Icon A_Wink_128x64; | ||||
| extern const Icon I_dir_10px; | ||||
| extern const Icon I_Nfc_10px; | ||||
| extern const Icon I_sub1_10px; | ||||
| extern const Icon I_ir_10px; | ||||
| extern const Icon I_ibutt_10px; | ||||
| extern const Icon I_unknown_10px; | ||||
| extern const Icon I_ibutt_10px; | ||||
| extern const Icon I_Nfc_10px; | ||||
| extern const Icon I_ble_10px; | ||||
| extern const Icon I_125_10px; | ||||
| extern const Icon I_dir_10px; | ||||
| extern const Icon I_BLE_Pairing_128x64; | ||||
| extern const Icon I_ButtonRightSmall_3x5; | ||||
| extern const Icon I_ButtonLeft_4x7; | ||||
| extern const Icon I_ButtonLeftSmall_3x5; | ||||
| extern const Icon I_DFU_128x50; | ||||
| extern const Icon I_Warning_30x23; | ||||
| extern const Icon I_ButtonDown_7x4; | ||||
| extern const Icon I_ButtonRight_4x7; | ||||
| extern const Icon I_ButtonCenter_7x7; | ||||
| extern const Icon I_ButtonLeft_4x7; | ||||
| extern const Icon I_ButtonUp_7x4; | ||||
| extern const Icon I_DolphinOkay_41x43; | ||||
| extern const Icon I_DolphinFirstStart4_67x53; | ||||
| extern const Icon I_DFU_128x50; | ||||
| extern const Icon I_ButtonLeftSmall_3x5; | ||||
| extern const Icon I_ButtonRightSmall_3x5; | ||||
| extern const Icon I_ButtonRight_4x7; | ||||
| extern const Icon I_Warning_30x23; | ||||
| extern const Icon I_DolphinFirstStart2_59x51; | ||||
| extern const Icon I_DolphinFirstStart5_54x49; | ||||
| extern const Icon I_DolphinFirstStart0_70x53; | ||||
| extern const Icon I_DolphinFirstStart6_58x54; | ||||
| extern const Icon I_DolphinFirstStart1_59x53; | ||||
| extern const Icon I_DolphinFirstStart8_56x51; | ||||
| extern const Icon I_DolphinFirstStart7_61x51; | ||||
| extern const Icon I_Flipper_young_80x60; | ||||
| extern const Icon I_DolphinFirstStart8_56x51; | ||||
| extern const Icon I_DolphinFirstStart1_59x53; | ||||
| extern const Icon I_DolphinOkay_41x43; | ||||
| extern const Icon I_DolphinFirstStart3_57x48; | ||||
| extern const Icon I_DolphinFirstStart7_61x51; | ||||
| extern const Icon I_DolphinFirstStart0_70x53; | ||||
| extern const Icon I_DolphinFirstStart4_67x53; | ||||
| extern const Icon I_PassportBottom_128x17; | ||||
| extern const Icon I_DoorLocked_10x56; | ||||
| extern const Icon I_DoorLeft_70x55; | ||||
| extern const Icon I_PassportLeft_6x47; | ||||
| extern const Icon I_DoorRight_70x55; | ||||
| extern const Icon I_DoorLocked_10x56; | ||||
| extern const Icon I_PassportLeft_6x47; | ||||
| extern const Icon I_LockPopup_100x49; | ||||
| extern const Icon I_Mute_25x27; | ||||
| extern const Icon I_IrdaArrowUp_4x8; | ||||
| extern const Icon I_Up_hvr_25x27; | ||||
| extern const Icon I_Mute_hvr_25x27; | ||||
| extern const Icon I_Vol_down_25x27; | ||||
| extern const Icon I_Down_25x27; | ||||
| extern const Icon I_Power_hvr_25x27; | ||||
| extern const Icon I_IrdaLearnShort_128x31; | ||||
| extern const Icon I_IrdaArrowDown_4x8; | ||||
| extern const Icon I_Vol_down_hvr_25x27; | ||||
| extern const Icon I_IrdaLearn_128x64; | ||||
| extern const Icon I_Down_hvr_25x27; | ||||
| extern const Icon I_Vol_down_hvr_25x27; | ||||
| extern const Icon I_Down_25x27; | ||||
| extern const Icon I_Fill_marker_7x7; | ||||
| extern const Icon I_Power_25x27; | ||||
| extern const Icon I_Vol_down_25x27; | ||||
| extern const Icon I_Vol_up_25x27; | ||||
| extern const Icon I_Up_25x27; | ||||
| extern const Icon I_Back_15x10; | ||||
| extern const Icon I_IrdaSend_128x64; | ||||
| extern const Icon I_IrdaSendShort_128x34; | ||||
| extern const Icon I_Up_hvr_25x27; | ||||
| extern const Icon I_Vol_up_hvr_25x27; | ||||
| extern const Icon I_KeySave_24x11; | ||||
| extern const Icon I_KeyBackspaceSelected_16x9; | ||||
| extern const Icon I_IrdaLearnShort_128x31; | ||||
| extern const Icon I_IrdaSend_128x64; | ||||
| extern const Icon I_DolphinReadingSuccess_59x63; | ||||
| extern const Icon I_Mute_hvr_25x27; | ||||
| extern const Icon I_Back_15x10; | ||||
| extern const Icon I_Up_25x27; | ||||
| extern const Icon I_IrdaArrowUp_4x8; | ||||
| extern const Icon I_Mute_25x27; | ||||
| extern const Icon I_Power_25x27; | ||||
| extern const Icon I_IrdaSendShort_128x34; | ||||
| extern const Icon I_IrdaArrowDown_4x8; | ||||
| extern const Icon I_IrdaLearn_128x64; | ||||
| extern const Icon I_Power_hvr_25x27; | ||||
| extern const Icon I_KeySaveSelected_24x11; | ||||
| extern const Icon I_KeyBackspace_16x9; | ||||
| extern const Icon I_KeyBackspaceSelected_16x9; | ||||
| extern const Icon I_KeySave_24x11; | ||||
| extern const Icon A_125khz_14; | ||||
| extern const Icon A_Bluetooth_14; | ||||
| extern const Icon A_Debug_14; | ||||
| @ -82,44 +83,44 @@ extern const Icon A_U2F_14; | ||||
| extern const Icon A_iButton_14; | ||||
| extern const Icon I_Detailed_chip_17x13; | ||||
| extern const Icon I_Medium_chip_22x21; | ||||
| extern const Icon I_Health_16x16; | ||||
| extern const Icon I_FaceCharging_29x14; | ||||
| extern const Icon I_BatteryBody_52x28; | ||||
| extern const Icon I_Voltage_16x16; | ||||
| extern const Icon I_FaceCharging_29x14; | ||||
| extern const Icon I_Health_16x16; | ||||
| extern const Icon I_Temperature_16x16; | ||||
| extern const Icon I_FaceNopower_29x14; | ||||
| extern const Icon I_FaceNormal_29x14; | ||||
| extern const Icon I_Battery_16x16; | ||||
| extern const Icon I_FaceConfused_29x14; | ||||
| extern const Icon I_RFIDDolphinSuccess_108x57; | ||||
| extern const Icon I_RFIDBigChip_37x36; | ||||
| extern const Icon I_FaceNormal_29x14; | ||||
| extern const Icon I_Voltage_16x16; | ||||
| extern const Icon I_FaceNopower_29x14; | ||||
| extern const Icon I_RFIDDolphinSend_97x61; | ||||
| extern const Icon I_RFIDDolphinSuccess_108x57; | ||||
| extern const Icon I_RFIDDolphinReceive_97x61; | ||||
| extern const Icon I_RFIDBigChip_37x36; | ||||
| extern const Icon I_SDQuestion_35x43; | ||||
| extern const Icon I_SDError_43x35; | ||||
| extern const Icon I_Cry_dolph_55x52; | ||||
| extern const Icon I_BadUsb_9x8; | ||||
| extern const Icon I_PlaceholderR_30x13; | ||||
| extern const Icon I_Background_128x8; | ||||
| extern const Icon I_Background_128x11; | ||||
| extern const Icon I_Lock_8x8; | ||||
| extern const Icon I_Battery_26x8; | ||||
| extern const Icon I_PlaceholderL_11x13; | ||||
| extern const Icon I_Battery_19x8; | ||||
| extern const Icon I_SDcardMounted_11x8; | ||||
| extern const Icon I_SDcardFail_11x8; | ||||
| extern const Icon I_USBConnected_15x8; | ||||
| extern const Icon I_Bluetooth_5x8; | ||||
| extern const Icon I_Background_128x8; | ||||
| extern const Icon I_BadUsb_9x8; | ||||
| extern const Icon I_BT_Pair_9x8; | ||||
| extern const Icon I_Background_128x11; | ||||
| extern const Icon I_Scanning_123x52; | ||||
| extern const Icon I_PlaceholderL_11x13; | ||||
| extern const Icon I_SDcardFail_11x8; | ||||
| extern const Icon I_Bluetooth_5x8; | ||||
| extern const Icon I_PlaceholderR_30x13; | ||||
| extern const Icon I_SDcardMounted_11x8; | ||||
| extern const Icon I_Quest_7x8; | ||||
| extern const Icon I_Unlock_7x8; | ||||
| extern const Icon I_MHz_25x11; | ||||
| extern const Icon I_Lock_7x8; | ||||
| extern const Icon I_DolphinMafia_115x62; | ||||
| extern const Icon I_DolphinExcited_64x63; | ||||
| extern const Icon I_iButtonDolphinSuccess_109x60; | ||||
| extern const Icon I_iButtonDolphinVerySuccess_108x52; | ||||
| extern const Icon I_Scanning_123x52; | ||||
| extern const Icon I_MHz_25x11; | ||||
| extern const Icon I_Unlock_7x8; | ||||
| extern const Icon I_iButtonKey_49x44; | ||||
| extern const Icon I_DolphinNice_96x59; | ||||
| extern const Icon I_DolphinExcited_64x63; | ||||
| extern const Icon I_DolphinWait_61x59; | ||||
| extern const Icon I_iButtonDolphinVerySuccess_108x52; | ||||
| extern const Icon I_DolphinMafia_115x62; | ||||
| extern const Icon I_DolphinNice_96x59; | ||||
| extern const Icon I_iButtonDolphinSuccess_109x60; | ||||
|  | ||||
| @ -7,6 +7,7 @@ | ||||
| #include "storage.pb.h" | ||||
| #include "status.pb.h" | ||||
| #include "application.pb.h" | ||||
| #include "gui.pb.h" | ||||
| 
 | ||||
| #if PB_PROTO_HEADER_VERSION != 40 | ||||
| #error Regenerate this file with the current version of nanopb generator. | ||||
| @ -15,12 +16,14 @@ | ||||
| /* Enum definitions */ | ||||
| typedef enum _PB_CommandStatus {  | ||||
|     PB_CommandStatus_OK = 0,  | ||||
|     /* *< Common Errors */ | ||||
|     PB_CommandStatus_ERROR = 1, /* *< Unknown error */ | ||||
|     PB_CommandStatus_ERROR_DECODE = 2, /* *< Command can't be decoded successfully - command_id in response may be wrong! */ | ||||
|     PB_CommandStatus_ERROR_NOT_IMPLEMENTED = 3, /* *< Command succesfully decoded, but not implemented (deprecated or not yet implemented) */ | ||||
|     PB_CommandStatus_ERROR_BUSY = 4, /* *< Somebody took global lock, so not all commands are available */ | ||||
|     PB_CommandStatus_ERROR_CONTINUOUS_COMMAND_INTERRUPTED = 14, /* *< Not received has_next == 0 */ | ||||
|     PB_CommandStatus_ERROR_INVALID_PARAMETERS = 15, /* *< not provided (or provided invalid) crucial parameters to perform rpc */ | ||||
|     /* *< Storage Errors */ | ||||
|     PB_CommandStatus_ERROR_STORAGE_NOT_READY = 5, /* *< FS not ready */ | ||||
|     PB_CommandStatus_ERROR_STORAGE_EXIST = 6, /* *< File/Dir alrady exist */ | ||||
|     PB_CommandStatus_ERROR_STORAGE_NOT_EXIST = 7, /* *< File/Dir does not exist */ | ||||
| @ -31,6 +34,7 @@ typedef enum _PB_CommandStatus { | ||||
|     PB_CommandStatus_ERROR_STORAGE_NOT_IMPLEMENTED = 12, /* *< Functon not implemented */ | ||||
|     PB_CommandStatus_ERROR_STORAGE_ALREADY_OPEN = 13, /* *< File/Dir already opened */ | ||||
|     PB_CommandStatus_ERROR_STORAGE_DIR_NOT_EMPTY = 18, /* *< Directory, you're going to remove is not empty */ | ||||
|     /* *< Application Errors */ | ||||
|     PB_CommandStatus_ERROR_APP_CANT_START = 16, /* *< Can't start app - internal error */ | ||||
|     PB_CommandStatus_ERROR_APP_SYSTEM_LOCKED = 17 /* *< Another app is running */ | ||||
| } PB_CommandStatus; | ||||
| @ -66,10 +70,16 @@ typedef struct _PB_Main { | ||||
|         PB_Storage_MkdirRequest storage_mkdir_request; | ||||
|         PB_Storage_Md5sumRequest storage_md5sum_request; | ||||
|         PB_Storage_Md5sumResponse storage_md5sum_response; | ||||
|         PB_App_Start app_start; | ||||
|         PB_App_StartRequest app_start_request; | ||||
|         PB_App_LockStatusRequest app_lock_status_request; | ||||
|         PB_App_LockStatusResponse app_lock_status_response; | ||||
|         PB_StopSession stop_session; | ||||
|         PB_Gui_StartScreenStreamRequest gui_start_screen_stream_request; | ||||
|         PB_Gui_StopScreenStreamRequest gui_stop_screen_stream_request; | ||||
|         PB_Gui_ScreenStreamFrame gui_screen_stream_frame; | ||||
|         PB_Gui_SendInputEventRequest gui_send_input_event_request; | ||||
|         PB_Storage_StatRequest storage_stat_request; | ||||
|         PB_Storage_StatResponse storage_stat_response; | ||||
|     } content;  | ||||
| } PB_Main; | ||||
| 
 | ||||
| @ -108,10 +118,16 @@ extern "C" { | ||||
| #define PB_Main_storage_mkdir_request_tag        13 | ||||
| #define PB_Main_storage_md5sum_request_tag       14 | ||||
| #define PB_Main_storage_md5sum_response_tag      15 | ||||
| #define PB_Main_app_start_tag                    16 | ||||
| #define PB_Main_app_start_request_tag            16 | ||||
| #define PB_Main_app_lock_status_request_tag      17 | ||||
| #define PB_Main_app_lock_status_response_tag     18 | ||||
| #define PB_Main_stop_session_tag                 19 | ||||
| #define PB_Main_gui_start_screen_stream_request_tag 20 | ||||
| #define PB_Main_gui_stop_screen_stream_request_tag 21 | ||||
| #define PB_Main_gui_screen_stream_frame_tag      22 | ||||
| #define PB_Main_gui_send_input_event_request_tag 23 | ||||
| #define PB_Main_storage_stat_request_tag         24 | ||||
| #define PB_Main_storage_stat_response_tag        25 | ||||
| 
 | ||||
| /* Struct field encoding specification for nanopb */ | ||||
| #define PB_Empty_FIELDLIST(X, a) \ | ||||
| @ -140,10 +156,16 @@ X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_delete_request,content.stora | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_mkdir_request,content.storage_mkdir_request),  13) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_md5sum_request,content.storage_md5sum_request),  14) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_md5sum_response,content.storage_md5sum_response),  15) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,app_start,content.app_start),  16) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,app_start_request,content.app_start_request),  16) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,app_lock_status_request,content.app_lock_status_request),  17) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,app_lock_status_response,content.app_lock_status_response),  18) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,stop_session,content.stop_session),  19) | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,stop_session,content.stop_session),  19) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_start_screen_stream_request,content.gui_start_screen_stream_request),  20) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_stop_screen_stream_request,content.gui_stop_screen_stream_request),  21) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_screen_stream_frame,content.gui_screen_stream_frame),  22) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_send_input_event_request,content.gui_send_input_event_request),  23) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_stat_request,content.storage_stat_request),  24) \ | ||||
| X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_stat_response,content.storage_stat_response),  25) | ||||
| #define PB_Main_CALLBACK NULL | ||||
| #define PB_Main_DEFAULT NULL | ||||
| #define PB_Main_content_empty_MSGTYPE PB_Empty | ||||
| @ -158,10 +180,16 @@ X(a, STATIC,   ONEOF,    MSG_W_CB, (content,stop_session,content.stop_session), | ||||
| #define PB_Main_content_storage_mkdir_request_MSGTYPE PB_Storage_MkdirRequest | ||||
| #define PB_Main_content_storage_md5sum_request_MSGTYPE PB_Storage_Md5sumRequest | ||||
| #define PB_Main_content_storage_md5sum_response_MSGTYPE PB_Storage_Md5sumResponse | ||||
| #define PB_Main_content_app_start_MSGTYPE PB_App_Start | ||||
| #define PB_Main_content_app_start_request_MSGTYPE PB_App_StartRequest | ||||
| #define PB_Main_content_app_lock_status_request_MSGTYPE PB_App_LockStatusRequest | ||||
| #define PB_Main_content_app_lock_status_response_MSGTYPE PB_App_LockStatusResponse | ||||
| #define PB_Main_content_stop_session_MSGTYPE PB_StopSession | ||||
| #define PB_Main_content_gui_start_screen_stream_request_MSGTYPE PB_Gui_StartScreenStreamRequest | ||||
| #define PB_Main_content_gui_stop_screen_stream_request_MSGTYPE PB_Gui_StopScreenStreamRequest | ||||
| #define PB_Main_content_gui_screen_stream_frame_MSGTYPE PB_Gui_ScreenStreamFrame | ||||
| #define PB_Main_content_gui_send_input_event_request_MSGTYPE PB_Gui_SendInputEventRequest | ||||
| #define PB_Main_content_storage_stat_request_MSGTYPE PB_Storage_StatRequest | ||||
| #define PB_Main_content_storage_stat_response_MSGTYPE PB_Storage_StatResponse | ||||
| 
 | ||||
| extern const pb_msgdesc_t PB_Empty_msg; | ||||
| extern const pb_msgdesc_t PB_StopSession_msg; | ||||
| @ -175,9 +203,9 @@ extern const pb_msgdesc_t PB_Main_msg; | ||||
| /* Maximum encoded size of messages (where known) */ | ||||
| #define PB_Empty_size                            0 | ||||
| #define PB_StopSession_size                      0 | ||||
| #if defined(PB_Storage_ListRequest_size) && defined(PB_Storage_ListResponse_size) && defined(PB_Storage_ReadRequest_size) && defined(PB_Storage_ReadResponse_size) && defined(PB_Storage_WriteRequest_size) && defined(PB_Storage_DeleteRequest_size) && defined(PB_Storage_MkdirRequest_size) && defined(PB_Storage_Md5sumRequest_size) && defined(PB_App_Start_size) | ||||
| #if defined(PB_Storage_ListRequest_size) && defined(PB_Storage_ListResponse_size) && defined(PB_Storage_ReadRequest_size) && defined(PB_Storage_ReadResponse_size) && defined(PB_Storage_WriteRequest_size) && defined(PB_Storage_DeleteRequest_size) && defined(PB_Storage_MkdirRequest_size) && defined(PB_Storage_Md5sumRequest_size) && defined(PB_App_StartRequest_size) && defined(PB_Gui_ScreenStreamFrame_size) && defined(PB_Storage_StatRequest_size) && defined(PB_Storage_StatResponse_size) | ||||
| #define PB_Main_size                             (10 + sizeof(union PB_Main_content_size_union)) | ||||
| union PB_Main_content_size_union {char f7[(6 + PB_Storage_ListRequest_size)]; char f8[(6 + PB_Storage_ListResponse_size)]; char f9[(6 + PB_Storage_ReadRequest_size)]; char f10[(6 + PB_Storage_ReadResponse_size)]; char f11[(6 + PB_Storage_WriteRequest_size)]; char f12[(6 + PB_Storage_DeleteRequest_size)]; char f13[(6 + PB_Storage_MkdirRequest_size)]; char f14[(6 + PB_Storage_Md5sumRequest_size)]; char f16[(7 + PB_App_Start_size)]; char f0[36];}; | ||||
| union PB_Main_content_size_union {char f7[(6 + PB_Storage_ListRequest_size)]; char f8[(6 + PB_Storage_ListResponse_size)]; char f9[(6 + PB_Storage_ReadRequest_size)]; char f10[(6 + PB_Storage_ReadResponse_size)]; char f11[(6 + PB_Storage_WriteRequest_size)]; char f12[(6 + PB_Storage_DeleteRequest_size)]; char f13[(6 + PB_Storage_MkdirRequest_size)]; char f14[(6 + PB_Storage_Md5sumRequest_size)]; char f16[(7 + PB_App_StartRequest_size)]; char f22[(7 + PB_Gui_ScreenStreamFrame_size)]; char f24[(7 + PB_Storage_StatRequest_size)]; char f25[(7 + PB_Storage_StatResponse_size)]; char f0[36];}; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  | ||||
							
								
								
									
										23
									
								
								assets/compiled/gui.pb.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								assets/compiled/gui.pb.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| /* Automatically generated nanopb constant definitions */ | ||||
| /* Generated by nanopb-0.4.5 */ | ||||
| 
 | ||||
| #include "gui.pb.h" | ||||
| #if PB_PROTO_HEADER_VERSION != 40 | ||||
| #error Regenerate this file with the current version of nanopb generator. | ||||
| #endif | ||||
| 
 | ||||
| PB_BIND(PB_Gui_StartScreenStreamRequest, PB_Gui_StartScreenStreamRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_Gui_StopScreenStreamRequest, PB_Gui_StopScreenStreamRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_Gui_ScreenStreamFrame, PB_Gui_ScreenStreamFrame, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_Gui_SendInputEventRequest, PB_Gui_SendInputEventRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										121
									
								
								assets/compiled/gui.pb.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								assets/compiled/gui.pb.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,121 @@ | ||||
| /* Automatically generated nanopb header */ | ||||
| /* Generated by nanopb-0.4.5 */ | ||||
| 
 | ||||
| #ifndef PB_PB_GUI_GUI_PB_H_INCLUDED | ||||
| #define PB_PB_GUI_GUI_PB_H_INCLUDED | ||||
| #include <pb.h> | ||||
| 
 | ||||
| #if PB_PROTO_HEADER_VERSION != 40 | ||||
| #error Regenerate this file with the current version of nanopb generator. | ||||
| #endif | ||||
| 
 | ||||
| /* Enum definitions */ | ||||
| typedef enum _PB_Gui_InputKey {  | ||||
|     PB_Gui_InputKey_UP = 0,  | ||||
|     PB_Gui_InputKey_DOWN = 1,  | ||||
|     PB_Gui_InputKey_RIGHT = 2,  | ||||
|     PB_Gui_InputKey_LEFT = 3,  | ||||
|     PB_Gui_InputKey_OK = 4,  | ||||
|     PB_Gui_InputKey_BACK = 5  | ||||
| } PB_Gui_InputKey; | ||||
| 
 | ||||
| typedef enum _PB_Gui_InputType {  | ||||
|     PB_Gui_InputType_PRESS = 0, /* *< Press event, emitted after debounce */ | ||||
|     PB_Gui_InputType_RELEASE = 1, /* *< Release event, emitted after debounce */ | ||||
|     PB_Gui_InputType_SHORT = 2, /* *< Short event, emitted after InputTypeRelease done withing INPUT_LONG_PRESS interval */ | ||||
|     PB_Gui_InputType_LONG = 3, /* *< Long event, emmited after INPUT_LONG_PRESS interval, asynchronouse to InputTypeRelease */ | ||||
|     PB_Gui_InputType_REPEAT = 4 /* *< Repeat event, emmited with INPUT_REPEATE_PRESS period after InputTypeLong event */ | ||||
| } PB_Gui_InputType; | ||||
| 
 | ||||
| /* Struct definitions */ | ||||
| typedef struct _PB_Gui_ScreenStreamFrame {  | ||||
|     pb_bytes_array_t *data;  | ||||
| } PB_Gui_ScreenStreamFrame; | ||||
| 
 | ||||
| typedef struct _PB_Gui_StartScreenStreamRequest {  | ||||
|     char dummy_field; | ||||
| } PB_Gui_StartScreenStreamRequest; | ||||
| 
 | ||||
| typedef struct _PB_Gui_StopScreenStreamRequest {  | ||||
|     char dummy_field; | ||||
| } PB_Gui_StopScreenStreamRequest; | ||||
| 
 | ||||
| typedef struct _PB_Gui_SendInputEventRequest {  | ||||
|     PB_Gui_InputKey key;  | ||||
|     PB_Gui_InputType type;  | ||||
| } PB_Gui_SendInputEventRequest; | ||||
| 
 | ||||
| 
 | ||||
| /* Helper constants for enums */ | ||||
| #define _PB_Gui_InputKey_MIN PB_Gui_InputKey_UP | ||||
| #define _PB_Gui_InputKey_MAX PB_Gui_InputKey_BACK | ||||
| #define _PB_Gui_InputKey_ARRAYSIZE ((PB_Gui_InputKey)(PB_Gui_InputKey_BACK+1)) | ||||
| 
 | ||||
| #define _PB_Gui_InputType_MIN PB_Gui_InputType_PRESS | ||||
| #define _PB_Gui_InputType_MAX PB_Gui_InputType_REPEAT | ||||
| #define _PB_Gui_InputType_ARRAYSIZE ((PB_Gui_InputType)(PB_Gui_InputType_REPEAT+1)) | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Initializer values for message structs */ | ||||
| #define PB_Gui_StartScreenStreamRequest_init_default {0} | ||||
| #define PB_Gui_StopScreenStreamRequest_init_default {0} | ||||
| #define PB_Gui_ScreenStreamFrame_init_default    {NULL} | ||||
| #define PB_Gui_SendInputEventRequest_init_default {_PB_Gui_InputKey_MIN, _PB_Gui_InputType_MIN} | ||||
| #define PB_Gui_StartScreenStreamRequest_init_zero {0} | ||||
| #define PB_Gui_StopScreenStreamRequest_init_zero {0} | ||||
| #define PB_Gui_ScreenStreamFrame_init_zero       {NULL} | ||||
| #define PB_Gui_SendInputEventRequest_init_zero   {_PB_Gui_InputKey_MIN, _PB_Gui_InputType_MIN} | ||||
| 
 | ||||
| /* Field tags (for use in manual encoding/decoding) */ | ||||
| #define PB_Gui_ScreenStreamFrame_data_tag        1 | ||||
| #define PB_Gui_SendInputEventRequest_key_tag     1 | ||||
| #define PB_Gui_SendInputEventRequest_type_tag    2 | ||||
| 
 | ||||
| /* Struct field encoding specification for nanopb */ | ||||
| #define PB_Gui_StartScreenStreamRequest_FIELDLIST(X, a) \ | ||||
| 
 | ||||
| #define PB_Gui_StartScreenStreamRequest_CALLBACK NULL | ||||
| #define PB_Gui_StartScreenStreamRequest_DEFAULT NULL | ||||
| 
 | ||||
| #define PB_Gui_StopScreenStreamRequest_FIELDLIST(X, a) \ | ||||
| 
 | ||||
| #define PB_Gui_StopScreenStreamRequest_CALLBACK NULL | ||||
| #define PB_Gui_StopScreenStreamRequest_DEFAULT NULL | ||||
| 
 | ||||
| #define PB_Gui_ScreenStreamFrame_FIELDLIST(X, a) \ | ||||
| X(a, POINTER,  SINGULAR, BYTES,    data,              1) | ||||
| #define PB_Gui_ScreenStreamFrame_CALLBACK NULL | ||||
| #define PB_Gui_ScreenStreamFrame_DEFAULT NULL | ||||
| 
 | ||||
| #define PB_Gui_SendInputEventRequest_FIELDLIST(X, a) \ | ||||
| X(a, STATIC,   SINGULAR, UENUM,    key,               1) \ | ||||
| X(a, STATIC,   SINGULAR, UENUM,    type,              2) | ||||
| #define PB_Gui_SendInputEventRequest_CALLBACK NULL | ||||
| #define PB_Gui_SendInputEventRequest_DEFAULT NULL | ||||
| 
 | ||||
| extern const pb_msgdesc_t PB_Gui_StartScreenStreamRequest_msg; | ||||
| extern const pb_msgdesc_t PB_Gui_StopScreenStreamRequest_msg; | ||||
| extern const pb_msgdesc_t PB_Gui_ScreenStreamFrame_msg; | ||||
| extern const pb_msgdesc_t PB_Gui_SendInputEventRequest_msg; | ||||
| 
 | ||||
| /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ | ||||
| #define PB_Gui_StartScreenStreamRequest_fields &PB_Gui_StartScreenStreamRequest_msg | ||||
| #define PB_Gui_StopScreenStreamRequest_fields &PB_Gui_StopScreenStreamRequest_msg | ||||
| #define PB_Gui_ScreenStreamFrame_fields &PB_Gui_ScreenStreamFrame_msg | ||||
| #define PB_Gui_SendInputEventRequest_fields &PB_Gui_SendInputEventRequest_msg | ||||
| 
 | ||||
| /* Maximum encoded size of messages (where known) */ | ||||
| /* PB_Gui_ScreenStreamFrame_size depends on runtime parameters */ | ||||
| #define PB_Gui_SendInputEventRequest_size        4 | ||||
| #define PB_Gui_StartScreenStreamRequest_size     0 | ||||
| #define PB_Gui_StopScreenStreamRequest_size      0 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } /* extern "C" */ | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										14
									
								
								assets/compiled/input.pb.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								assets/compiled/input.pb.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| /* Automatically generated nanopb constant definitions */ | ||||
| /* Generated by nanopb-0.4.5 */ | ||||
| 
 | ||||
| #include "input.pb.h" | ||||
| #if PB_PROTO_HEADER_VERSION != 40 | ||||
| #error Regenerate this file with the current version of nanopb generator. | ||||
| #endif | ||||
| 
 | ||||
| PB_BIND(PB_Input_SendEventRequest, PB_Input_SendEventRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										78
									
								
								assets/compiled/input.pb.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								assets/compiled/input.pb.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | ||||
| /* Automatically generated nanopb header */ | ||||
| /* Generated by nanopb-0.4.5 */ | ||||
| 
 | ||||
| #ifndef PB_PB_INPUT_INPUT_PB_H_INCLUDED | ||||
| #define PB_PB_INPUT_INPUT_PB_H_INCLUDED | ||||
| #include <pb.h> | ||||
| 
 | ||||
| #if PB_PROTO_HEADER_VERSION != 40 | ||||
| #error Regenerate this file with the current version of nanopb generator. | ||||
| #endif | ||||
| 
 | ||||
| /* Enum definitions */ | ||||
| typedef enum _PB_Input_Key {  | ||||
|     PB_Input_Key_UP = 0,  | ||||
|     PB_Input_Key_DOWN = 1,  | ||||
|     PB_Input_Key_RIGHT = 2,  | ||||
|     PB_Input_Key_LEFT = 3,  | ||||
|     PB_Input_Key_OK = 4,  | ||||
|     PB_Input_Key_BACK = 5  | ||||
| } PB_Input_Key; | ||||
| 
 | ||||
| typedef enum _PB_Input_Type {  | ||||
|     PB_Input_Type_PRESS = 0, /* *< Press event, emitted after debounce */ | ||||
|     PB_Input_Type_RELEASE = 1, /* *< Release event, emitted after debounce */ | ||||
|     PB_Input_Type_SHORT = 2, /* *< Short event, emitted after InputTypeRelease done withing INPUT_LONG_PRESS interval */ | ||||
|     PB_Input_Type_LONG = 3, /* *< Long event, emmited after INPUT_LONG_PRESS interval, asynchronouse to InputTypeRelease */ | ||||
|     PB_Input_Type_REPEAT = 4 /* *< Repeat event, emmited with INPUT_REPEATE_PRESS period after InputTypeLong event */ | ||||
| } PB_Input_Type; | ||||
| 
 | ||||
| /* Struct definitions */ | ||||
| typedef struct _PB_Input_SendEventRequest {  | ||||
|     PB_Input_Key key;  | ||||
|     PB_Input_Type type;  | ||||
| } PB_Input_SendEventRequest; | ||||
| 
 | ||||
| 
 | ||||
| /* Helper constants for enums */ | ||||
| #define _PB_Input_Key_MIN PB_Input_Key_UP | ||||
| #define _PB_Input_Key_MAX PB_Input_Key_BACK | ||||
| #define _PB_Input_Key_ARRAYSIZE ((PB_Input_Key)(PB_Input_Key_BACK+1)) | ||||
| 
 | ||||
| #define _PB_Input_Type_MIN PB_Input_Type_PRESS | ||||
| #define _PB_Input_Type_MAX PB_Input_Type_REPEAT | ||||
| #define _PB_Input_Type_ARRAYSIZE ((PB_Input_Type)(PB_Input_Type_REPEAT+1)) | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Initializer values for message structs */ | ||||
| #define PB_Input_SendEventRequest_init_default   {_PB_Input_Key_MIN, _PB_Input_Type_MIN} | ||||
| #define PB_Input_SendEventRequest_init_zero      {_PB_Input_Key_MIN, _PB_Input_Type_MIN} | ||||
| 
 | ||||
| /* Field tags (for use in manual encoding/decoding) */ | ||||
| #define PB_Input_SendEventRequest_key_tag        1 | ||||
| #define PB_Input_SendEventRequest_type_tag       2 | ||||
| 
 | ||||
| /* Struct field encoding specification for nanopb */ | ||||
| #define PB_Input_SendEventRequest_FIELDLIST(X, a) \ | ||||
| X(a, STATIC,   SINGULAR, UENUM,    key,               1) \ | ||||
| X(a, STATIC,   SINGULAR, UENUM,    type,              2) | ||||
| #define PB_Input_SendEventRequest_CALLBACK NULL | ||||
| #define PB_Input_SendEventRequest_DEFAULT NULL | ||||
| 
 | ||||
| extern const pb_msgdesc_t PB_Input_SendEventRequest_msg; | ||||
| 
 | ||||
| /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ | ||||
| #define PB_Input_SendEventRequest_fields &PB_Input_SendEventRequest_msg | ||||
| 
 | ||||
| /* Maximum encoded size of messages (where known) */ | ||||
| #define PB_Input_SendEventRequest_size           4 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } /* extern "C" */ | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										18
									
								
								assets/compiled/screen.pb.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								assets/compiled/screen.pb.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| /* Automatically generated nanopb constant definitions */ | ||||
| /* Generated by nanopb-0.4.5 */ | ||||
| 
 | ||||
| #include "screen.pb.h" | ||||
| #if PB_PROTO_HEADER_VERSION != 40 | ||||
| #error Regenerate this file with the current version of nanopb generator. | ||||
| #endif | ||||
| 
 | ||||
| PB_BIND(PB_Screen_StartStreamRequest, PB_Screen_StartStreamRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_Screen_StopStreamRequest, PB_Screen_StopStreamRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_Screen_StreamFrame, PB_Screen_StreamFrame, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										75
									
								
								assets/compiled/screen.pb.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								assets/compiled/screen.pb.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| /* Automatically generated nanopb header */ | ||||
| /* Generated by nanopb-0.4.5 */ | ||||
| 
 | ||||
| #ifndef PB_PB_SCREEN_SCREEN_PB_H_INCLUDED | ||||
| #define PB_PB_SCREEN_SCREEN_PB_H_INCLUDED | ||||
| #include <pb.h> | ||||
| 
 | ||||
| #if PB_PROTO_HEADER_VERSION != 40 | ||||
| #error Regenerate this file with the current version of nanopb generator. | ||||
| #endif | ||||
| 
 | ||||
| /* Struct definitions */ | ||||
| typedef struct _PB_Screen_StartStreamRequest {  | ||||
|     char dummy_field; | ||||
| } PB_Screen_StartStreamRequest; | ||||
| 
 | ||||
| typedef struct _PB_Screen_StopStreamRequest {  | ||||
|     char dummy_field; | ||||
| } PB_Screen_StopStreamRequest; | ||||
| 
 | ||||
| typedef struct _PB_Screen_StreamFrame {  | ||||
|     pb_bytes_array_t *data;  | ||||
| } PB_Screen_StreamFrame; | ||||
| 
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Initializer values for message structs */ | ||||
| #define PB_Screen_StartStreamRequest_init_default {0} | ||||
| #define PB_Screen_StopStreamRequest_init_default {0} | ||||
| #define PB_Screen_StreamFrame_init_default       {NULL} | ||||
| #define PB_Screen_StartStreamRequest_init_zero   {0} | ||||
| #define PB_Screen_StopStreamRequest_init_zero    {0} | ||||
| #define PB_Screen_StreamFrame_init_zero          {NULL} | ||||
| 
 | ||||
| /* Field tags (for use in manual encoding/decoding) */ | ||||
| #define PB_Screen_StreamFrame_data_tag           1 | ||||
| 
 | ||||
| /* Struct field encoding specification for nanopb */ | ||||
| #define PB_Screen_StartStreamRequest_FIELDLIST(X, a) \ | ||||
| 
 | ||||
| #define PB_Screen_StartStreamRequest_CALLBACK NULL | ||||
| #define PB_Screen_StartStreamRequest_DEFAULT NULL | ||||
| 
 | ||||
| #define PB_Screen_StopStreamRequest_FIELDLIST(X, a) \ | ||||
| 
 | ||||
| #define PB_Screen_StopStreamRequest_CALLBACK NULL | ||||
| #define PB_Screen_StopStreamRequest_DEFAULT NULL | ||||
| 
 | ||||
| #define PB_Screen_StreamFrame_FIELDLIST(X, a) \ | ||||
| X(a, POINTER,  SINGULAR, BYTES,    data,              1) | ||||
| #define PB_Screen_StreamFrame_CALLBACK NULL | ||||
| #define PB_Screen_StreamFrame_DEFAULT NULL | ||||
| 
 | ||||
| extern const pb_msgdesc_t PB_Screen_StartStreamRequest_msg; | ||||
| extern const pb_msgdesc_t PB_Screen_StopStreamRequest_msg; | ||||
| extern const pb_msgdesc_t PB_Screen_StreamFrame_msg; | ||||
| 
 | ||||
| /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ | ||||
| #define PB_Screen_StartStreamRequest_fields &PB_Screen_StartStreamRequest_msg | ||||
| #define PB_Screen_StopStreamRequest_fields &PB_Screen_StopStreamRequest_msg | ||||
| #define PB_Screen_StreamFrame_fields &PB_Screen_StreamFrame_msg | ||||
| 
 | ||||
| /* Maximum encoded size of messages (where known) */ | ||||
| /* PB_Screen_StreamFrame_size depends on runtime parameters */ | ||||
| #define PB_Screen_StartStreamRequest_size        0 | ||||
| #define PB_Screen_StopStreamRequest_size         0 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } /* extern "C" */ | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
| @ -9,6 +9,12 @@ | ||||
| PB_BIND(PB_Storage_File, PB_Storage_File, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_Storage_StatRequest, PB_Storage_StatRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_Storage_StatResponse, PB_Storage_StatResponse, AUTO) | ||||
| 
 | ||||
| 
 | ||||
| PB_BIND(PB_Storage_ListRequest, PB_Storage_ListRequest, AUTO) | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -32,6 +32,10 @@ typedef struct _PB_Storage_ReadRequest { | ||||
|     char *path;  | ||||
| } PB_Storage_ReadRequest; | ||||
| 
 | ||||
| typedef struct _PB_Storage_StatRequest {  | ||||
|     char *path;  | ||||
| } PB_Storage_StatRequest; | ||||
| 
 | ||||
| typedef struct _PB_Storage_DeleteRequest {  | ||||
|     char *path;  | ||||
|     bool recursive;  | ||||
| @ -58,6 +62,11 @@ typedef struct _PB_Storage_ReadResponse { | ||||
|     PB_Storage_File file;  | ||||
| } PB_Storage_ReadResponse; | ||||
| 
 | ||||
| typedef struct _PB_Storage_StatResponse {  | ||||
|     bool has_file; | ||||
|     PB_Storage_File file;  | ||||
| } PB_Storage_StatResponse; | ||||
| 
 | ||||
| typedef struct _PB_Storage_WriteRequest {  | ||||
|     char *path;  | ||||
|     bool has_file; | ||||
| @ -77,6 +86,8 @@ extern "C" { | ||||
| 
 | ||||
| /* Initializer values for message structs */ | ||||
| #define PB_Storage_File_init_default             {_PB_Storage_File_FileType_MIN, NULL, 0, NULL} | ||||
| #define PB_Storage_StatRequest_init_default      {NULL} | ||||
| #define PB_Storage_StatResponse_init_default     {false, PB_Storage_File_init_default} | ||||
| #define PB_Storage_ListRequest_init_default      {NULL} | ||||
| #define PB_Storage_ListResponse_init_default     {0, {PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default}} | ||||
| #define PB_Storage_ReadRequest_init_default      {NULL} | ||||
| @ -87,6 +98,8 @@ extern "C" { | ||||
| #define PB_Storage_Md5sumRequest_init_default    {NULL} | ||||
| #define PB_Storage_Md5sumResponse_init_default   {""} | ||||
| #define PB_Storage_File_init_zero                {_PB_Storage_File_FileType_MIN, NULL, 0, NULL} | ||||
| #define PB_Storage_StatRequest_init_zero         {NULL} | ||||
| #define PB_Storage_StatResponse_init_zero        {false, PB_Storage_File_init_zero} | ||||
| #define PB_Storage_ListRequest_init_zero         {NULL} | ||||
| #define PB_Storage_ListResponse_init_zero        {0, {PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero}} | ||||
| #define PB_Storage_ReadRequest_init_zero         {NULL} | ||||
| @ -102,6 +115,7 @@ extern "C" { | ||||
| #define PB_Storage_Md5sumRequest_path_tag        1 | ||||
| #define PB_Storage_MkdirRequest_path_tag         1 | ||||
| #define PB_Storage_ReadRequest_path_tag          1 | ||||
| #define PB_Storage_StatRequest_path_tag          1 | ||||
| #define PB_Storage_DeleteRequest_path_tag        1 | ||||
| #define PB_Storage_DeleteRequest_recursive_tag   2 | ||||
| #define PB_Storage_File_type_tag                 1 | ||||
| @ -111,6 +125,7 @@ extern "C" { | ||||
| #define PB_Storage_Md5sumResponse_md5sum_tag     1 | ||||
| #define PB_Storage_ListResponse_file_tag         1 | ||||
| #define PB_Storage_ReadResponse_file_tag         1 | ||||
| #define PB_Storage_StatResponse_file_tag         1 | ||||
| #define PB_Storage_WriteRequest_path_tag         1 | ||||
| #define PB_Storage_WriteRequest_file_tag         2 | ||||
| 
 | ||||
| @ -123,6 +138,17 @@ X(a, POINTER,  SINGULAR, BYTES,    data,              4) | ||||
| #define PB_Storage_File_CALLBACK NULL | ||||
| #define PB_Storage_File_DEFAULT NULL | ||||
| 
 | ||||
| #define PB_Storage_StatRequest_FIELDLIST(X, a) \ | ||||
| X(a, POINTER,  SINGULAR, STRING,   path,              1) | ||||
| #define PB_Storage_StatRequest_CALLBACK NULL | ||||
| #define PB_Storage_StatRequest_DEFAULT NULL | ||||
| 
 | ||||
| #define PB_Storage_StatResponse_FIELDLIST(X, a) \ | ||||
| X(a, STATIC,   OPTIONAL, MESSAGE,  file,              1) | ||||
| #define PB_Storage_StatResponse_CALLBACK NULL | ||||
| #define PB_Storage_StatResponse_DEFAULT NULL | ||||
| #define PB_Storage_StatResponse_file_MSGTYPE PB_Storage_File | ||||
| 
 | ||||
| #define PB_Storage_ListRequest_FIELDLIST(X, a) \ | ||||
| X(a, POINTER,  SINGULAR, STRING,   path,              1) | ||||
| #define PB_Storage_ListRequest_CALLBACK NULL | ||||
| @ -174,6 +200,8 @@ X(a, STATIC,   SINGULAR, STRING,   md5sum,            1) | ||||
| #define PB_Storage_Md5sumResponse_DEFAULT NULL | ||||
| 
 | ||||
| extern const pb_msgdesc_t PB_Storage_File_msg; | ||||
| extern const pb_msgdesc_t PB_Storage_StatRequest_msg; | ||||
| extern const pb_msgdesc_t PB_Storage_StatResponse_msg; | ||||
| extern const pb_msgdesc_t PB_Storage_ListRequest_msg; | ||||
| extern const pb_msgdesc_t PB_Storage_ListResponse_msg; | ||||
| extern const pb_msgdesc_t PB_Storage_ReadRequest_msg; | ||||
| @ -186,6 +214,8 @@ extern const pb_msgdesc_t PB_Storage_Md5sumResponse_msg; | ||||
| 
 | ||||
| /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ | ||||
| #define PB_Storage_File_fields &PB_Storage_File_msg | ||||
| #define PB_Storage_StatRequest_fields &PB_Storage_StatRequest_msg | ||||
| #define PB_Storage_StatResponse_fields &PB_Storage_StatResponse_msg | ||||
| #define PB_Storage_ListRequest_fields &PB_Storage_ListRequest_msg | ||||
| #define PB_Storage_ListResponse_fields &PB_Storage_ListResponse_msg | ||||
| #define PB_Storage_ReadRequest_fields &PB_Storage_ReadRequest_msg | ||||
| @ -198,6 +228,8 @@ extern const pb_msgdesc_t PB_Storage_Md5sumResponse_msg; | ||||
| 
 | ||||
| /* Maximum encoded size of messages (where known) */ | ||||
| /* PB_Storage_File_size depends on runtime parameters */ | ||||
| /* PB_Storage_StatRequest_size depends on runtime parameters */ | ||||
| /* PB_Storage_StatResponse_size depends on runtime parameters */ | ||||
| /* PB_Storage_ListRequest_size depends on runtime parameters */ | ||||
| /* PB_Storage_ListResponse_size depends on runtime parameters */ | ||||
| /* PB_Storage_ReadRequest_size depends on runtime parameters */ | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/icons/Irda/DolphinReadingSuccess_59x63.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/icons/Irda/DolphinReadingSuccess_59x63.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.1 KiB | 
| @ -1 +1 @@ | ||||
| Subproject commit 021ba48abb64d25c7094da13b752fe37d4bf6007 | ||||
| Subproject commit 0e6d374ab1a12f95a3cd04444376a261e7252db4 | ||||
							
								
								
									
										6
									
								
								assets/resources/subghz/came_atomo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								assets/resources/subghz/came_atomo
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| Filetype: Flipper SubGhz Keystore RAW File | ||||
| Version: 0 | ||||
| Encryption: 1 | ||||
| IV: 47 69 6D 6D 65 20 74 68 65 63 6F 6F 6B 69 65 73 | ||||
| Encrypt_data: RAW | ||||
| E0BDF15D68F29AE787E7FCEE6C3611C90A92305D677B8FFFBE225196F5DC04CAEAE1102B4AB830E76C9C14DBA7FA5BD1F30864ABAF51387222FDCC0BA87E4FF709812D5C59DD953859AFD698A0EA2ECEFA0DC49652861EF4CF1864843F135DB8680E0C5C9EEC3BC548E2EB696DC8CA1B0F627347D2C476B410CF03A0F4D1EFB36DFB0574FE8F48FB61910CA539EC04583CA170A51822225A1D3E86C07219FE92E5DE9F557A45E611D74028BAF56E7F2C53DBA8DC53DA89B642FAC0A9A0BAC1756BDA0833ACB09F56E0FA3080CBE9E6A04B235F3AC82BB955FBFD779C59725E6D1875E04E0E84ABD0C3C1C8FAB247EC2755ACEC9961244E0D79AE710E4C7D33E9 | ||||
							
								
								
									
										27
									
								
								assets/resources/subghz/keeloq_mfcodes
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								assets/resources/subghz/keeloq_mfcodes
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| Filetype: Flipper SubGhz Keystore File | ||||
| Version: 0 | ||||
| Encryption: 1 | ||||
| IV: 7A 44 FE 5D C3 B3 65 13 73 A6 F4 2D 1E B6 7D F0 | ||||
| 89153B35033574AAA06D7E792CB92A486B37A2CCDF0B0152BF1A563E321518C8 | ||||
| F6583A3E4148439E8A8D7ED6A095ACC0C3E22A48F1637E78DF023CAC9272934E | ||||
| AA0439E6B76CD43F3FCC27CF69C5F3B6508E8103B164E4ECDDF8B2FB222D46FF | ||||
| A9826C663033D25AE21CB8790406997ADCE84360B258F2B989D967009659859C | ||||
| 3474E7BBFA0173928F414CFD5EE19B27A558D9C171D96FE7B7840A01323A7E7446FAE3E98EA9A8C69B4A6B781BD7906A | ||||
| 2873939A8E0EAC16D748967E987BB0F1079C106E4235B7D35B4BF37F54B21F8E | ||||
| EF6F1DC0201FCB8CEBC5642A5194A1FDCFBE1FA772A79CEAD54D2F0DA3AC4F6C | ||||
| 3F595EAA0E81E96C5D6DB41799D314E3E81E7F4197E19A3341C55592B1B6C4B0 | ||||
| 7B2D75FE11B27E99CA7610E47D712C8CFB619EC69EBC976A70CFD9574C9F4FF8 | ||||
| 39735CF1D009D132A33B9C546D95FA6D3E69BF3A57EF219392E57C9560E7B037 | ||||
| D56FDDFB0C4E808143D3ED5F15D6FF47F6EDEBD01192FC7ACF3ACCE9FD5162FC297D0089D65ED2CBE3CE05DDA7B96446 | ||||
| 2750D4F0650061C3AF72C88FD080BE241F2BDD8D8C1B0EFE781120EBEFFE2C72D0EECC42CDDED50CFE4AC51C48AE68C6 | ||||
| F8CE64921CB73015F2672A9EF0A8359269CAE0E515D6DBB3130CFC9E5E1A98AD | ||||
| ACF6ADB9E02D67B44EB6C6F126BF64BDAB37926B8BE39E27F323E8F5A0F8FC38 | ||||
| FBB1302D697F94ECED681CE047819001EDE6E013850258F61E97091DD37D24F2 | ||||
| D8CD53AB5A94898EB53D4FF46546ADBAA24691181A396052A58AAC657D6817AB | ||||
| 43200E08C21747CABC59538888A259238E782545732A1A6EEE00A6929EC9DD97A8BA9812372374046AC66652CC561D60 | ||||
| C38CBE29F22D0E83E58A52E94AA2485DA8E702FBDB89D27249473CB8A19AEF61 | ||||
| 9F0EB580F7474985E8460E1682451E213778B77A9CAB4734B75C5386851050BF | ||||
| 2364EBB8237363B21226565675B9F478482CADAE41E795C27287E26137797C10 | ||||
| 775C9A28BA50D759FB438D0200121F01F7DB11986D44D3960F745EAA1E7A2CE2AD92AD718AFCD98BC3269C39F65ADC53 | ||||
| 6911E7EAFFAC15B4E3ABDAD271E92EAEFE1F2E288789EC7599AAA32986273306 | ||||
| 5387D67534234AFD8BAB90DC74BA39598B938526CBFAF14F75AA36A29C13836A31897A86D2E1178AE66191E771A7FEA4 | ||||
							
								
								
									
										11
									
								
								assets/resources/subghz/keeloq_mfcodes_user
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								assets/resources/subghz/keeloq_mfcodes_user
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| # for adding manufacture keys | ||||
| # AABBCCDDEEFFAABB:X:NAME\r\n | ||||
| # AABBCCDDEEFFAABB - man 64 bit | ||||
| # X - encryption method 1 - Simple Learning, 2 - Normal_Learning,  | ||||
| #   	0 - iterates over both previous and man in direct and reverse byte sequence | ||||
| # NAME - name (string without spaces) max 64 characters long | ||||
| Filetype: Flipper SubGhz Keystore File | ||||
| Version: 0 | ||||
| Encryption: 0 | ||||
| AABBCCDDEEFFAABB:1:Test1 | ||||
| AABBCCDDEEFFAABB:1:Test2 | ||||
							
								
								
									
										6
									
								
								assets/resources/subghz/nice_flor_s_rx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								assets/resources/subghz/nice_flor_s_rx
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								assets/resources/subghz/nice_flor_s_tx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								assets/resources/subghz/nice_flor_s_tx
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -1,5 +1,9 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <FreeRTOS.h> | ||||
| #include <timers.h> | ||||
| #include <task.h> | ||||
| 
 | ||||
| #include <cmsis_os2.h> | ||||
| 
 | ||||
| #include <furi/common_defines.h> | ||||
|  | ||||
| @ -387,6 +387,7 @@ void vPortFree(void* pv) { | ||||
|                     /* Add this block to the list of free blocks. */ | ||||
|                     xFreeBytesRemaining += pxLink->xBlockSize; | ||||
|                     traceFREE(pv, pxLink->xBlockSize); | ||||
|                     memset(pv, 0, pxLink->xBlockSize - xHeapStructSize); | ||||
|                     prvInsertBlockIntoFreeList(((BlockLink_t*)pxLink)); | ||||
|                 } | ||||
|                 (void)xTaskResumeAll(); | ||||
|  | ||||
| @ -1,88 +1,95 @@ | ||||
| #include "pubsub.h" | ||||
| #include <furi.h> | ||||
| #include "memmgr.h" | ||||
| #include "check.h" | ||||
| 
 | ||||
| #include <m-list.h> | ||||
| #include <cmsis_os2.h> | ||||
| 
 | ||||
| struct FuriPubSubSubscription { | ||||
|     FuriPubSubCallback callback; | ||||
|     void* callback_context; | ||||
| }; | ||||
| 
 | ||||
| LIST_DEF(FuriPubSubSubscriptionList, FuriPubSubSubscription, M_POD_OPLIST); | ||||
| 
 | ||||
| struct FuriPubSub { | ||||
|     FuriPubSubSubscriptionList_t items; | ||||
|     osMutexId_t mutex; | ||||
| }; | ||||
| 
 | ||||
| FuriPubSub* furi_pubsub_alloc() { | ||||
|     FuriPubSub* pubsub = furi_alloc(sizeof(FuriPubSub)); | ||||
| 
 | ||||
| bool init_pubsub(PubSub* pubsub) { | ||||
|     // mutex without name,
 | ||||
|     // no attributes (unfortunatly robust mutex is not supported by FreeRTOS),
 | ||||
|     // with dynamic memory allocation
 | ||||
|     pubsub->mutex = osMutexNew(NULL); | ||||
|     if(pubsub->mutex == NULL) return false; | ||||
|     furi_assert(pubsub->mutex); | ||||
| 
 | ||||
|     // construct list
 | ||||
|     list_pubsub_cb_init(pubsub->items); | ||||
|     FuriPubSubSubscriptionList_init(pubsub->items); | ||||
| 
 | ||||
|     return true; | ||||
|     return pubsub; | ||||
| } | ||||
| 
 | ||||
| bool delete_pubsub(PubSub* pubsub) { | ||||
|     if(osMutexAcquire(pubsub->mutex, osWaitForever) == osOK) { | ||||
|         bool result = osMutexDelete(pubsub->mutex) == osOK; | ||||
|         list_pubsub_cb_clear(pubsub->items); | ||||
|         return result; | ||||
|     } else { | ||||
|         return false; | ||||
|     } | ||||
| void furi_pubsub_free(FuriPubSub* pubsub) { | ||||
|     furi_assert(pubsub); | ||||
| 
 | ||||
|     furi_check(FuriPubSubSubscriptionList_size(pubsub->items) == 0); | ||||
| 
 | ||||
|     FuriPubSubSubscriptionList_clear(pubsub->items); | ||||
| 
 | ||||
|     furi_check(osMutexDelete(pubsub->mutex) == osOK); | ||||
| 
 | ||||
|     free(pubsub); | ||||
| } | ||||
| 
 | ||||
| PubSubItem* subscribe_pubsub(PubSub* pubsub, PubSubCallback cb, void* ctx) { | ||||
|     if(osMutexAcquire(pubsub->mutex, osWaitForever) == osOK) { | ||||
|         // put uninitialized item to the list
 | ||||
|         PubSubItem* item = list_pubsub_cb_push_raw(pubsub->items); | ||||
| FuriPubSubSubscription* | ||||
|     furi_pubsub_subscribe(FuriPubSub* pubsub, FuriPubSubCallback callback, void* callback_context) { | ||||
|     furi_check(osMutexAcquire(pubsub->mutex, osWaitForever) == osOK); | ||||
|     // put uninitialized item to the list
 | ||||
|     FuriPubSubSubscription* item = FuriPubSubSubscriptionList_push_raw(pubsub->items); | ||||
| 
 | ||||
|         // initialize item
 | ||||
|         item->cb = cb; | ||||
|         item->ctx = ctx; | ||||
|         item->self = pubsub; | ||||
|     // initialize item
 | ||||
|     item->callback = callback; | ||||
|     item->callback_context = callback_context; | ||||
| 
 | ||||
|         // TODO unsubscribe pubsub on app exit
 | ||||
|         //flapp_on_exit(unsubscribe_pubsub, item);
 | ||||
|     furi_check(osMutexRelease(pubsub->mutex) == osOK); | ||||
| 
 | ||||
|         osMutexRelease(pubsub->mutex); | ||||
| 
 | ||||
|         return item; | ||||
|     } else { | ||||
|         return NULL; | ||||
|     } | ||||
|     return item; | ||||
| } | ||||
| 
 | ||||
| bool unsubscribe_pubsub(PubSubItem* pubsub_id) { | ||||
|     if(osMutexAcquire(pubsub_id->self->mutex, osWaitForever) == osOK) { | ||||
|         bool result = false; | ||||
| void furi_pubsub_unsubscribe(FuriPubSub* pubsub, FuriPubSubSubscription* pubsub_subscription) { | ||||
|     furi_assert(pubsub); | ||||
|     furi_assert(pubsub_subscription); | ||||
| 
 | ||||
|         // iterate over items
 | ||||
|         list_pubsub_cb_it_t it; | ||||
|         for(list_pubsub_cb_it(it, pubsub_id->self->items); !list_pubsub_cb_end_p(it); | ||||
|             list_pubsub_cb_next(it)) { | ||||
|             const PubSubItem* item = list_pubsub_cb_cref(it); | ||||
|     furi_check(osMutexAcquire(pubsub->mutex, osWaitForever) == osOK); | ||||
|     bool result = false; | ||||
| 
 | ||||
|             // if the iterator is equal to our element
 | ||||
|             if(item == pubsub_id) { | ||||
|                 list_pubsub_cb_remove(pubsub_id->self->items, it); | ||||
|                 result = true; | ||||
|                 break; | ||||
|             } | ||||
|     // iterate over items
 | ||||
|     FuriPubSubSubscriptionList_it_t it; | ||||
|     for(FuriPubSubSubscriptionList_it(it, pubsub->items); !FuriPubSubSubscriptionList_end_p(it); | ||||
|         FuriPubSubSubscriptionList_next(it)) { | ||||
|         const FuriPubSubSubscription* item = FuriPubSubSubscriptionList_cref(it); | ||||
| 
 | ||||
|         // if the iterator is equal to our element
 | ||||
|         if(item == pubsub_subscription) { | ||||
|             FuriPubSubSubscriptionList_remove(pubsub->items, it); | ||||
|             result = true; | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         osMutexRelease(pubsub_id->self->mutex); | ||||
|         return result; | ||||
|     } else { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     furi_check(osMutexRelease(pubsub->mutex) == osOK); | ||||
|     furi_check(result); | ||||
| } | ||||
| 
 | ||||
| bool notify_pubsub(PubSub* pubsub, void* arg) { | ||||
|     if(osMutexAcquire(pubsub->mutex, osWaitForever) == osOK) { | ||||
|         // iterate over subscribers
 | ||||
|         list_pubsub_cb_it_t it; | ||||
|         for(list_pubsub_cb_it(it, pubsub->items); !list_pubsub_cb_end_p(it); | ||||
|             list_pubsub_cb_next(it)) { | ||||
|             const PubSubItem* item = list_pubsub_cb_cref(it); | ||||
|             item->cb(arg, item->ctx); | ||||
|         } | ||||
| void furi_pubsub_publish(FuriPubSub* pubsub, void* message) { | ||||
|     furi_check(osMutexAcquire(pubsub->mutex, osWaitForever) == osOK); | ||||
| 
 | ||||
|         osMutexRelease(pubsub->mutex); | ||||
|         return true; | ||||
|     } else { | ||||
|         return false; | ||||
|     // iterate over subscribers
 | ||||
|     FuriPubSubSubscriptionList_it_t it; | ||||
|     for(FuriPubSubSubscriptionList_it(it, pubsub->items); !FuriPubSubSubscriptionList_end_p(it); | ||||
|         FuriPubSubSubscriptionList_next(it)) { | ||||
|         const FuriPubSubSubscription* item = FuriPubSubSubscriptionList_cref(it); | ||||
|         item->callback(message, item->callback_context); | ||||
|     } | ||||
| 
 | ||||
|     furi_check(osMutexRelease(pubsub->mutex) == osOK); | ||||
| } | ||||
|  | ||||
| @ -1,95 +1,64 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include "cmsis_os.h" | ||||
| #include "m-list.h" | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
| == PubSub == | ||||
| /** FuriPubSub Callback type */ | ||||
| typedef void (*FuriPubSubCallback)(const void* message, void* context); | ||||
| 
 | ||||
|  * PubSub allows users to subscribe on notifies and notify subscribers. | ||||
|  * Notifier side can pass `void*` arg to subscriber callback, | ||||
|  * and also subscriber can set `void*` context pointer that pass into | ||||
|  * callback (you can see callback signature below). | ||||
| /** FuriPubSub type */ | ||||
| typedef struct FuriPubSub FuriPubSub; | ||||
| 
 | ||||
| /** FuriPubSubSubscription type */ | ||||
| typedef struct FuriPubSubSubscription FuriPubSubSubscription; | ||||
| 
 | ||||
| /** Allocate FuriPubSub
 | ||||
|  * | ||||
|  * Reentrable, Not threadsafe, one owner | ||||
|  * | ||||
|  * @return     pointer to FuriPubSub instance | ||||
|  */ | ||||
| FuriPubSub* furi_pubsub_alloc(); | ||||
| 
 | ||||
| typedef void (*PubSubCallback)(const void*, void*); | ||||
| typedef struct PubSubType PubSub; | ||||
| 
 | ||||
| typedef struct { | ||||
|     PubSubCallback cb; | ||||
|     void* ctx; | ||||
|     PubSub* self; | ||||
| } PubSubItem; | ||||
| 
 | ||||
| LIST_DEF(list_pubsub_cb, PubSubItem, M_POD_OPLIST); | ||||
| 
 | ||||
| struct PubSubType { | ||||
|     list_pubsub_cb_t items; | ||||
|     osMutexId_t mutex; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * To create PubSub you should create PubSub instance and call `init_pubsub`. | ||||
| /** Free FuriPubSub
 | ||||
|  *  | ||||
|  * @param      pubsub  FuriPubSub instance | ||||
|  */ | ||||
| bool init_pubsub(PubSub* pubsub); | ||||
| void furi_pubsub_free(FuriPubSub* pubsub); | ||||
| 
 | ||||
| /**
 | ||||
|  * Since we use dynamic memory - we must explicity delete pubsub | ||||
| /** Subscribe to FuriPubSub
 | ||||
|  *  | ||||
|  * Threadsafe, Reentrable | ||||
|  *  | ||||
|  * @param      pubsub            pointer to FuriPubSub instance | ||||
|  * @param[in]  callback          The callback | ||||
|  * @param      callback_context  The callback context | ||||
|  * | ||||
|  * @return     pointer to FuriPubSubSubscription instance | ||||
|  */ | ||||
| bool delete_pubsub(PubSub* pubsub); | ||||
| FuriPubSubSubscription* | ||||
|     furi_pubsub_subscribe(FuriPubSub* pubsub, FuriPubSubCallback callback, void* callback_context); | ||||
| 
 | ||||
| /**
 | ||||
|  * Use `subscribe_pubsub` to register your callback. | ||||
| /** Unsubscribe from FuriPubSub
 | ||||
|  *  | ||||
|  * No use of `pubsub_subscription` allowed after call of this method | ||||
|  * Threadsafe, Reentrable. | ||||
|  * | ||||
|  * @param      pubsub               pointer to FuriPubSub instance | ||||
|  * @param      pubsub_subscription  pointer to FuriPubSubSubscription instance | ||||
|  */ | ||||
| PubSubItem* subscribe_pubsub(PubSub* pubsub, PubSubCallback cb, void* ctx); | ||||
| void furi_pubsub_unsubscribe(FuriPubSub* pubsub, FuriPubSubSubscription* pubsub_subscription); | ||||
| 
 | ||||
| /**
 | ||||
|  * Use `unsubscribe_pubsub` to unregister callback. | ||||
| /** Publish message to FuriPubSub
 | ||||
|  * | ||||
|  * Threadsafe, Reentrable. | ||||
|  *  | ||||
|  * @param      pubsub   pointer to FuriPubSub instance | ||||
|  * @param      message  message pointer to publish | ||||
|  */ | ||||
| bool unsubscribe_pubsub(PubSubItem* pubsub_id); | ||||
| 
 | ||||
| /**
 | ||||
|  * Use `notify_pubsub` to notify subscribers. | ||||
|  */ | ||||
| bool notify_pubsub(PubSub* pubsub, void* arg); | ||||
| void furi_pubsub_publish(FuriPubSub* pubsub, void* message); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
| 
 | ||||
| ```C | ||||
| // MANIFEST
 | ||||
| // name="test"
 | ||||
| // stack=128
 | ||||
| 
 | ||||
| void example_pubsub_handler(void* arg, void* ctx) { | ||||
|     printf("get %d from %s\n", *(uint32_t*)arg, (const char*)ctx); | ||||
| } | ||||
| 
 | ||||
| void pubsub_test() { | ||||
|     const char* app_name = "test app"; | ||||
| 
 | ||||
|     PubSub example_pubsub; | ||||
|     init_pubsub(&example_pubsub); | ||||
| 
 | ||||
|     if(!subscribe_pubsub(&example_pubsub, example_pubsub_handler, (void*)app_name)) { | ||||
|         printf("critical error\n"); | ||||
|         flapp_exit(NULL); | ||||
|     } | ||||
| 
 | ||||
|     uint32_t counter = 0; | ||||
|     while(1) { | ||||
|         notify_pubsub(&example_pubsub, (void*)&counter); | ||||
|         counter++; | ||||
| 
 | ||||
|         osDelay(100); | ||||
|     } | ||||
| } | ||||
| ``` | ||||
| */ | ||||
|  | ||||
| @ -84,8 +84,8 @@ bool furi_record_destroy(const char* name) { | ||||
|     FuriRecordData* record_data = FuriRecordDataDict_get(furi_record->records, name_str); | ||||
|     furi_assert(record_data); | ||||
|     if(record_data->holders_count == 0) { | ||||
|         FuriRecordDataDict_erase(furi_record->records, name_str); | ||||
|         furi_check(osOK == osEventFlagsDelete(record_data->flags)); | ||||
|         FuriRecordDataDict_erase(furi_record->records, name_str); | ||||
|         ret = true; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -2,6 +2,9 @@ | ||||
| #include "check.h" | ||||
| #include "memmgr.h" | ||||
| 
 | ||||
| #include <FreeRTOS.h> | ||||
| #include <task.h> | ||||
| 
 | ||||
| #include <furi-hal.h> | ||||
| #include <m-dict.h> | ||||
| 
 | ||||
|  | ||||
| @ -22,6 +22,7 @@ import math | ||||
| import sys | ||||
| import struct | ||||
| import pkg_resources | ||||
| import fnmatch | ||||
| 
 | ||||
| from .svd import SVDFile | ||||
| 
 | ||||
| @ -101,13 +102,6 @@ class LoadSVD(gdb.Command): | ||||
|             raise gdb.GdbError("Could not load SVD file {} : {}...\n".format(f, e)) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     # This will also get executed by GDB | ||||
| 
 | ||||
|     # Create just the svd_load command | ||||
|     LoadSVD() | ||||
| 
 | ||||
| 
 | ||||
| class SVD(gdb.Command): | ||||
|     """The CMSIS SVD (System View Description) inspector command | ||||
| 
 | ||||
| @ -321,13 +315,19 @@ class SVD(gdb.Command): | ||||
|                 container = peripheral.name + " > " + register.name | ||||
| 
 | ||||
|                 self._print_register_fields(container, form, register) | ||||
| 
 | ||||
|             else: | ||||
|                 gdb.write( | ||||
|                     "Register/cluster {} in peripheral {} does not exist!\n".format( | ||||
|                         s[1], peripheral.name | ||||
|                 found = False | ||||
|                 for key in fnmatch.filter(peripheral.registers.keys(), s[1]): | ||||
|                     register = peripheral.registers[key] | ||||
|                     container = peripheral.name + " > " + register.name | ||||
|                     self._print_register_fields(container, form, register) | ||||
|                     found = True | ||||
|                 if not found: | ||||
|                     gdb.write( | ||||
|                         "Register/cluster {} in peripheral {} does not exist!\n".format( | ||||
|                             s[1], peripheral.name | ||||
|                         ) | ||||
|                     ) | ||||
|                 ) | ||||
|             return | ||||
| 
 | ||||
|         if len(s) == 3: | ||||
|  | ||||
							
								
								
									
										37019
									
								
								debug/STM32WB55_CM4.svd
									
									
									
									
									
								
							
							
						
						
									
										37019
									
								
								debug/STM32WB55_CM4.svd
									
									
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -427,16 +427,5 @@ typedef enum | ||||
| #define DBG_TRACE_MSG_QUEUE_SIZE 4096 | ||||
| #define MAX_DBG_TRACE_MSG_SIZE 1024 | ||||
| 
 | ||||
| /******************************************************************************
 | ||||
|  * FreeRTOS | ||||
|  ******************************************************************************/ | ||||
| #define CFG_SHCI_USER_EVT_PROCESS_NAME        "ble_shci_evt" | ||||
| #define CFG_SHCI_USER_EVT_PROCESS_ATTR_BITS   (0) | ||||
| #define CFG_SHCI_USER_EVT_PROCESS_CB_MEM      (0) | ||||
| #define CFG_SHCI_USER_EVT_PROCESS_CB_SIZE     (0) | ||||
| #define CFG_SHCI_USER_EVT_PROCESS_STACK_MEM   (0) | ||||
| #define CFG_SHCI_USER_EVT_PROCESS_PRIORITY    osPriorityNone | ||||
| #define CFG_SHCI_USER_EVT_PROCESS_STACK_SIZE  (128 * 7) | ||||
| 
 | ||||
| #define CFG_OTP_BASE_ADDRESS    OTP_AREA_BASE | ||||
| #define CFG_OTP_END_ADRESS      OTP_AREA_END_ADDR | ||||
|  | ||||
| @ -1,180 +0,0 @@ | ||||
| #include "app_common.h" | ||||
| #include "main.h" | ||||
| #include "app_entry.h" | ||||
| #include "ble_app.h" | ||||
| #include "ble.h" | ||||
| #include "tl.h" | ||||
| #include "cmsis_os.h" | ||||
| #include "shci_tl.h" | ||||
| #include "app_debug.h" | ||||
| #include <furi-hal.h> | ||||
| 
 | ||||
| extern RTC_HandleTypeDef hrtc; | ||||
| 
 | ||||
| #define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4U*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4U)) | ||||
| 
 | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE]; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U]; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255]; | ||||
| 
 | ||||
| osMutexId_t MtxShciId; | ||||
| osSemaphoreId_t SemShciId; | ||||
| osThreadId_t ShciUserEvtProcessId; | ||||
| 
 | ||||
| volatile static BleGlueStatus ble_glue_status = BleGlueStatusUninitialized; | ||||
| 
 | ||||
| const osThreadAttr_t ShciUserEvtProcess_attr = { | ||||
|     .name = CFG_SHCI_USER_EVT_PROCESS_NAME, | ||||
|     .attr_bits = CFG_SHCI_USER_EVT_PROCESS_ATTR_BITS, | ||||
|     .cb_mem = CFG_SHCI_USER_EVT_PROCESS_CB_MEM, | ||||
|     .cb_size = CFG_SHCI_USER_EVT_PROCESS_CB_SIZE, | ||||
|     .stack_mem = CFG_SHCI_USER_EVT_PROCESS_STACK_MEM, | ||||
|     .priority = CFG_SHCI_USER_EVT_PROCESS_PRIORITY, | ||||
|     .stack_size = CFG_SHCI_USER_EVT_PROCESS_STACK_SIZE | ||||
| }; | ||||
| 
 | ||||
| static void ShciUserEvtProcess(void *argument); | ||||
| static void SystemPower_Config( void ); | ||||
| static void appe_Tl_Init( void ); | ||||
| static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status ); | ||||
| static void APPE_SysUserEvtRx( void * pPayload ); | ||||
| 
 | ||||
| BleGlueStatus APPE_Status() { | ||||
|   return ble_glue_status; | ||||
| } | ||||
| 
 | ||||
| void APPE_Init() { | ||||
|   ble_glue_status = BleGlueStatusStartup; | ||||
|   SystemPower_Config(); /**< Configure the system Power Mode */ | ||||
| 
 | ||||
|   // APPD_Init();
 | ||||
|   furi_hal_power_insomnia_enter(); | ||||
| 
 | ||||
|   appe_Tl_Init();	/* Initialize all transport layers */ | ||||
| 
 | ||||
|   /**
 | ||||
|    * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready ) | ||||
|    * received on the system channel before starting the Stack | ||||
|    * This system event is received with APPE_SysUserEvtRx() | ||||
|    */ | ||||
| } | ||||
| 
 | ||||
| /*************************************************************
 | ||||
|  * | ||||
|  * LOCAL FUNCTIONS | ||||
|  * | ||||
|  *************************************************************/ | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief  Configure the system for power optimization | ||||
|  * | ||||
|  * @note  This API configures the system to be ready for low power mode | ||||
|  * | ||||
|  * @param  None | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SystemPower_Config(void) { | ||||
|   // Select HSI as system clock source after Wake Up from Stop mode
 | ||||
|   LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI); | ||||
| 
 | ||||
|   /* Initialize the CPU2 reset value before starting CPU2 with C2BOOT */ | ||||
|   LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); | ||||
| } | ||||
| 
 | ||||
| static void appe_Tl_Init( void ) { | ||||
|   TL_MM_Config_t tl_mm_config; | ||||
|   SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf; | ||||
|   /**< Reference table initialization */ | ||||
|   TL_Init(); | ||||
| 
 | ||||
|   MtxShciId = osMutexNew( NULL ); | ||||
|   SemShciId = osSemaphoreNew( 1, 0, NULL ); /*< Create the semaphore and make it busy at initialization */ | ||||
| 
 | ||||
|   /** FreeRTOS system task creation */ | ||||
|   ShciUserEvtProcessId = osThreadNew(ShciUserEvtProcess, NULL, &ShciUserEvtProcess_attr); | ||||
| 
 | ||||
|   /**< System channel initialization */ | ||||
|   SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer; | ||||
|   SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot; | ||||
|   shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf); | ||||
| 
 | ||||
|   /**< Memory Manager channel initialization */ | ||||
|   tl_mm_config.p_BleSpareEvtBuffer = BleSpareEvtBuffer; | ||||
|   tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer; | ||||
|   tl_mm_config.p_AsynchEvtPool = EvtPool; | ||||
|   tl_mm_config.AsynchEvtPoolSize = POOL_SIZE; | ||||
|   TL_MM_Init( &tl_mm_config ); | ||||
| 
 | ||||
|   TL_Enable(); | ||||
| } | ||||
| 
 | ||||
| static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status ) { | ||||
|   switch (status) { | ||||
|     case SHCI_TL_CmdBusy: | ||||
|       osMutexAcquire( MtxShciId, osWaitForever ); | ||||
|       break; | ||||
|     case SHCI_TL_CmdAvailable: | ||||
|       osMutexRelease( MtxShciId ); | ||||
|       break; | ||||
|     default: | ||||
|       break; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * The type of the payload for a system user event is tSHCI_UserEvtRxParam | ||||
|  * When the system event is both : | ||||
|  *    - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY) | ||||
|  *    - reported by the FUS (sysevt_ready_rsp == FUS_FW_RUNNING) | ||||
|  * The buffer shall not be released | ||||
|  * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable ) | ||||
|  * When the status is not filled, the buffer is released by default | ||||
|  */ | ||||
| static void APPE_SysUserEvtRx( void * pPayload ) { | ||||
|   UNUSED(pPayload); | ||||
|   /* Traces channel initialization */ | ||||
|   // APPD_EnableCPU2( );
 | ||||
|    | ||||
|   if(ble_app_init()) { | ||||
|     FURI_LOG_I("Core2", "BLE stack started"); | ||||
|     ble_glue_status = BleGlueStatusStarted; | ||||
|   } else { | ||||
|     FURI_LOG_E("Core2", "BLE stack startup failed"); | ||||
|     ble_glue_status = BleGlueStatusBroken; | ||||
|   } | ||||
|   furi_hal_power_insomnia_exit(); | ||||
| } | ||||
| 
 | ||||
| /*************************************************************
 | ||||
|  * | ||||
|  * FREERTOS WRAPPER FUNCTIONS | ||||
|  * | ||||
| *************************************************************/ | ||||
| static void ShciUserEvtProcess(void *argument) { | ||||
|   UNUSED(argument); | ||||
|   for(;;) { | ||||
|     osThreadFlagsWait(1, osFlagsWaitAny, osWaitForever); | ||||
|     shci_user_evt_proc(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /*************************************************************
 | ||||
|  * | ||||
|  * WRAP FUNCTIONS | ||||
|  * | ||||
|  *************************************************************/ | ||||
| void shci_notify_asynch_evt(void* pdata) { | ||||
|   UNUSED(pdata); | ||||
|   osThreadFlagsSet( ShciUserEvtProcessId, 1 ); | ||||
| } | ||||
| 
 | ||||
| void shci_cmd_resp_release(uint32_t flag) { | ||||
|   UNUSED(flag); | ||||
|   osSemaphoreRelease( SemShciId ); | ||||
| } | ||||
| 
 | ||||
| void shci_cmd_resp_wait(uint32_t timeout) { | ||||
|   UNUSED(timeout); | ||||
|   osSemaphoreAcquire( SemShciId, osWaitForever ); | ||||
| } | ||||
| @ -1,20 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| typedef enum { | ||||
|     BleGlueStatusUninitialized, | ||||
|     BleGlueStatusStartup, | ||||
|     BleGlueStatusBroken, | ||||
|     BleGlueStatusStarted | ||||
| } BleGlueStatus; | ||||
| 
 | ||||
| void APPE_Init(); | ||||
| 
 | ||||
| BleGlueStatus APPE_Status(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } /* extern "C" */ | ||||
| #endif | ||||
| @ -11,6 +11,7 @@ | ||||
| #define BLE_APP_TAG "ble app" | ||||
| 
 | ||||
| PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t ble_app_cmd_buffer; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint32_t ble_app_nvm[BLE_NVM_SRAM_SIZE]; | ||||
| 
 | ||||
| typedef struct { | ||||
|     osMutexId_t hci_mtx; | ||||
| @ -26,8 +27,8 @@ static void ble_app_hci_event_handler(void * pPayload); | ||||
| static void ble_app_hci_status_not_handler(HCI_TL_CmdStatus_t status); | ||||
| 
 | ||||
| bool ble_app_init() { | ||||
|     SHCI_CmdStatus_t status; | ||||
|     ble_app = furi_alloc(sizeof(BleApp)); | ||||
| 
 | ||||
|     // Allocate semafore and mutex for ble command buffer access
 | ||||
|     ble_app->hci_mtx = osMutexNew(NULL); | ||||
|     ble_app->hci_sem = osSemaphoreNew(1, 0, NULL); | ||||
| @ -43,6 +44,18 @@ bool ble_app_init() { | ||||
|     }; | ||||
|     hci_init(ble_app_hci_event_handler, (void*)&hci_tl_config); | ||||
| 
 | ||||
|     // Configure NVM store for pairing data
 | ||||
|     SHCI_C2_CONFIG_Cmd_Param_t config_param = { | ||||
|         .PayloadCmdSize = SHCI_C2_CONFIG_PAYLOAD_CMD_SIZE, | ||||
|         .Config1 =SHCI_C2_CONFIG_CONFIG1_BIT0_BLE_NVM_DATA_TO_SRAM, | ||||
|         .BleNvmRamAddress = (uint32_t)ble_app_nvm, | ||||
|         .EvtMask1 = SHCI_C2_CONFIG_EVTMASK1_BIT1_BLE_NVM_RAM_UPDATE_ENABLE, | ||||
|     }; | ||||
|     status = SHCI_C2_Config(&config_param); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(BLE_APP_TAG, "Failed to configure 2nd core: %d", status); | ||||
|     } | ||||
| 
 | ||||
|     // Start ble stack on 2nd core
 | ||||
|     SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet = { | ||||
|         .Header = {{0,0,0}}, // Header unused
 | ||||
| @ -67,13 +80,18 @@ bool ble_app_init() { | ||||
|             0, | ||||
|         } | ||||
|     }; | ||||
|     SHCI_CmdStatus_t status = SHCI_C2_BLE_Init(&ble_init_cmd_packet); | ||||
|     status = SHCI_C2_BLE_Init(&ble_init_cmd_packet); | ||||
|     if(status) { | ||||
|         FURI_LOG_E(BLE_APP_TAG, "Failed to start ble stack: %d", status); | ||||
|     } | ||||
|     return status == SHCI_Success; | ||||
| } | ||||
| 
 | ||||
| void ble_app_get_key_storage_buff(uint8_t** addr, uint16_t* size) { | ||||
|     *addr = (uint8_t*)ble_app_nvm; | ||||
|     *size = sizeof(ble_app_nvm); | ||||
| } | ||||
| 
 | ||||
| static void ble_app_hci_thread(void *arg) { | ||||
|     while(1) { | ||||
|         osThreadFlagsWait(1, osFlagsWaitAny, osWaitForever); | ||||
|  | ||||
| @ -5,8 +5,10 @@ extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| bool ble_app_init(); | ||||
| void ble_app_get_key_storage_buff(uint8_t** addr, uint16_t* size); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
|  | ||||
							
								
								
									
										173
									
								
								firmware/targets/f6/ble-glue/ble_glue.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								firmware/targets/f6/ble-glue/ble_glue.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,173 @@ | ||||
| #include "ble_glue.h" | ||||
| #include "app_common.h" | ||||
| #include "main.h" | ||||
| #include "ble_app.h" | ||||
| #include "ble.h" | ||||
| #include "tl.h" | ||||
| #include "shci.h" | ||||
| #include "cmsis_os.h" | ||||
| #include "shci_tl.h" | ||||
| #include "app_debug.h" | ||||
| #include <furi-hal.h> | ||||
| 
 | ||||
| #define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4U*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4U)) | ||||
| 
 | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ble_glue_event_pool[POOL_SIZE]; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ble_glue_system_cmd_buff; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ble_glue_system_spare_event_buff[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U]; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ble_glue_ble_spare_event_buff[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255]; | ||||
| 
 | ||||
| typedef struct { | ||||
|     osMutexId_t shci_mtx; | ||||
|     osSemaphoreId_t shci_sem; | ||||
|     osThreadId_t shci_user_event_thread_id; | ||||
|     osThreadAttr_t shci_user_event_thread_attr; | ||||
|     BleGlueStatus status; | ||||
|     BleGlueKeyStorageChangedCallback callback; | ||||
|     void* context; | ||||
| } BleGlue; | ||||
| 
 | ||||
| static BleGlue* ble_glue = NULL; | ||||
| 
 | ||||
| static void ble_glue_user_event_thread(void *argument); | ||||
| static void ble_glue_sys_status_not_callback(SHCI_TL_CmdStatus_t status); | ||||
| static void ble_glue_sys_user_event_callback(void* pPayload); | ||||
| 
 | ||||
| BleGlueStatus ble_glue_get_status() { | ||||
|     if(!ble_glue) { | ||||
|         return BleGlueStatusUninitialized; | ||||
|     } | ||||
|     return ble_glue->status; | ||||
| } | ||||
| 
 | ||||
| void ble_glue_set_key_storage_changed_callback(BleGlueKeyStorageChangedCallback callback, void* context) { | ||||
|     furi_assert(ble_glue); | ||||
|     furi_assert(callback); | ||||
|     ble_glue->callback = callback; | ||||
|     ble_glue->context = context; | ||||
| } | ||||
| 
 | ||||
| void ble_glue_init() { | ||||
|     ble_glue = furi_alloc(sizeof(BleGlue)); | ||||
|     ble_glue->status = BleGlueStatusStartup; | ||||
|     ble_glue->shci_user_event_thread_attr.name = "ble_shci_evt"; | ||||
|     ble_glue->shci_user_event_thread_attr.stack_size = 1024; | ||||
| 
 | ||||
|     // Configure the system Power Mode
 | ||||
|     // Select HSI as system clock source after Wake Up from Stop mode
 | ||||
|     LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI); | ||||
|     /* Initialize the CPU2 reset value before starting CPU2 with C2BOOT */ | ||||
|     LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); | ||||
|     furi_hal_power_insomnia_enter(); | ||||
| 
 | ||||
|     // APPD_Init();
 | ||||
| 
 | ||||
|     // Initialize all transport layers
 | ||||
|     TL_MM_Config_t tl_mm_config; | ||||
|     SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf; | ||||
|     // Reference table initialization
 | ||||
|     TL_Init(); | ||||
| 
 | ||||
|     ble_glue->shci_mtx = osMutexNew(NULL); | ||||
|     ble_glue->shci_sem = osSemaphoreNew(1, 0, NULL); | ||||
| 
 | ||||
|     // FreeRTOS system task creation
 | ||||
|     ble_glue->shci_user_event_thread_id = osThreadNew(ble_glue_user_event_thread, NULL, &ble_glue->shci_user_event_thread_attr); | ||||
| 
 | ||||
|     // System channel initialization
 | ||||
|     SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&ble_glue_system_cmd_buff; | ||||
|     SHci_Tl_Init_Conf.StatusNotCallBack = ble_glue_sys_status_not_callback; | ||||
|     shci_init(ble_glue_sys_user_event_callback, (void*) &SHci_Tl_Init_Conf); | ||||
| 
 | ||||
|     /**< Memory Manager channel initialization */ | ||||
|     tl_mm_config.p_BleSpareEvtBuffer = ble_glue_ble_spare_event_buff; | ||||
|     tl_mm_config.p_SystemSpareEvtBuffer = ble_glue_system_spare_event_buff; | ||||
|     tl_mm_config.p_AsynchEvtPool = ble_glue_event_pool; | ||||
|     tl_mm_config.AsynchEvtPoolSize = POOL_SIZE; | ||||
|     TL_MM_Init( &tl_mm_config ); | ||||
|     TL_Enable(); | ||||
| 
 | ||||
|     /*
 | ||||
|      * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready ) | ||||
|      * received on the system channel before starting the Stack | ||||
|      * This system event is received with ble_glue_sys_user_event_callback() | ||||
|      */ | ||||
| } | ||||
| 
 | ||||
| static void ble_glue_sys_status_not_callback(SHCI_TL_CmdStatus_t status) { | ||||
|     switch (status) { | ||||
|     case SHCI_TL_CmdBusy: | ||||
|         osMutexAcquire( ble_glue->shci_mtx, osWaitForever ); | ||||
|         break; | ||||
|     case SHCI_TL_CmdAvailable: | ||||
|         osMutexRelease( ble_glue->shci_mtx ); | ||||
|         break; | ||||
|     default: | ||||
|         break; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * The type of the payload for a system user event is tSHCI_UserEvtRxParam | ||||
|  * When the system event is both : | ||||
|  *    - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY) | ||||
|  *    - reported by the FUS (sysevt_ready_rsp == FUS_FW_RUNNING) | ||||
|  * The buffer shall not be released | ||||
|  * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable ) | ||||
|  * When the status is not filled, the buffer is released by default | ||||
|  */ | ||||
| static void ble_glue_sys_user_event_callback( void * pPayload ) { | ||||
|     UNUSED(pPayload); | ||||
|     /* Traces channel initialization */ | ||||
|     // APPD_EnableCPU2( );
 | ||||
| 
 | ||||
|     TL_AsynchEvt_t *p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload); | ||||
|      | ||||
|     if(p_sys_event->subevtcode == SHCI_SUB_EVT_CODE_READY) { | ||||
|         if(ble_app_init()) { | ||||
|             FURI_LOG_I("Core2", "BLE stack started"); | ||||
|             ble_glue->status = BleGlueStatusStarted; | ||||
|             if(SHCI_C2_SetFlashActivityControl(FLASH_ACTIVITY_CONTROL_SEM7) == SHCI_Success) { | ||||
|                 FURI_LOG_I("Core2", "Flash activity control switched to SEM7"); | ||||
|             } else { | ||||
|                 FURI_LOG_E("Core2", "Failed to switch flash activity control to SEM7"); | ||||
|             } | ||||
|         } else { | ||||
|             FURI_LOG_E("Core2", "BLE stack startup failed"); | ||||
|             ble_glue->status = BleGlueStatusBleStackMissing; | ||||
|         } | ||||
|         furi_hal_power_insomnia_exit(); | ||||
|     } else if(p_sys_event->subevtcode == SHCI_SUB_EVT_ERROR_NOTIF) { | ||||
|         FURI_LOG_E("Core2", "Error during initialization"); | ||||
|         furi_hal_power_insomnia_exit(); | ||||
|     } else if(p_sys_event->subevtcode == SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE) { | ||||
|         SHCI_C2_BleNvmRamUpdate_Evt_t* p_sys_ble_nvm_ram_update_event = (SHCI_C2_BleNvmRamUpdate_Evt_t*)p_sys_event->payload; | ||||
|         if(ble_glue->callback) { | ||||
|             ble_glue->callback((uint8_t*)p_sys_ble_nvm_ram_update_event->StartAddress, p_sys_ble_nvm_ram_update_event->Size, ble_glue->context); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // Wrap functions
 | ||||
| static void ble_glue_user_event_thread(void *argument) { | ||||
|     UNUSED(argument); | ||||
|     for(;;) { | ||||
|         osThreadFlagsWait(1, osFlagsWaitAny, osWaitForever); | ||||
|         shci_user_evt_proc(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void shci_notify_asynch_evt(void* pdata) { | ||||
|     UNUSED(pdata); | ||||
|     osThreadFlagsSet(ble_glue->shci_user_event_thread_id, 1); | ||||
| } | ||||
| 
 | ||||
| void shci_cmd_resp_release(uint32_t flag) { | ||||
|     UNUSED(flag); | ||||
|     osSemaphoreRelease(ble_glue->shci_sem); | ||||
| } | ||||
| 
 | ||||
| void shci_cmd_resp_wait(uint32_t timeout) { | ||||
|     UNUSED(timeout); | ||||
|     osSemaphoreAcquire(ble_glue->shci_sem, osWaitForever); | ||||
| } | ||||
							
								
								
									
										26
									
								
								firmware/targets/f6/ble-glue/ble_glue.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								firmware/targets/f6/ble-glue/ble_glue.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| typedef void(*BleGlueKeyStorageChangedCallback)(uint8_t* change_addr_start, uint16_t size, void* context); | ||||
| 
 | ||||
| typedef enum { | ||||
|     BleGlueStatusUninitialized, | ||||
|     BleGlueStatusStartup, | ||||
|     BleGlueStatusBleStackMissing, | ||||
|     BleGlueStatusStarted | ||||
| } BleGlueStatus; | ||||
| 
 | ||||
| void ble_glue_init(); | ||||
| 
 | ||||
| BleGlueStatus ble_glue_get_status(); | ||||
| 
 | ||||
| void ble_glue_set_key_storage_changed_callback(BleGlueKeyStorageChangedCallback callback, void* context); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,6 +1,5 @@ | ||||
| #include "gap.h" | ||||
| 
 | ||||
| #include "app_entry.h" | ||||
| #include "ble.h" | ||||
| 
 | ||||
| #include "cmsis_os.h" | ||||
| @ -375,7 +374,7 @@ static void gap_advetise_timer_callback(void* context) { | ||||
| } | ||||
| 
 | ||||
| bool gap_init(BleEventCallback on_event_cb, void* context) { | ||||
|     if (APPE_Status() != BleGlueStatusStarted) { | ||||
|     if (ble_glue_get_status() != BleGlueStatusStarted) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -29,6 +29,37 @@ | ||||
|  * Semaphores | ||||
|  * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+ | ||||
|  *****************************************************************************/ | ||||
| /**
 | ||||
| * Index of the semaphore used the prevent conflicts after standby sleep. | ||||
| * Each CPUs takes this semaphore at standby wakeup until conclicting elements are restored. | ||||
| */ | ||||
| #define CFG_HW_PWR_STANDBY_SEMID                               10 | ||||
| /**
 | ||||
| *  The CPU2 may be configured to store the Thread persistent data either in internal NVM storage on CPU2 or in | ||||
| *  SRAM2 buffer provided by the user application. This can be configured with the system command SHCI_C2_Config() | ||||
| *  When the CPU2 is requested to store persistent data in SRAM2, it can write data in this buffer at any time when needed. | ||||
| *  In order to read consistent data with the CPU1 from the SRAM2 buffer, the flow should be: | ||||
| *  + CPU1 takes CFG_HW_THREAD_NVM_SRAM_SEMID semaphore | ||||
| *  + CPU1 reads all persistent data from SRAM2 (most of the time, the goal is to write these data into an NVM managed by CPU1) | ||||
| *  + CPU1 releases CFG_HW_THREAD_NVM_SRAM_SEMID semaphore | ||||
| *  CFG_HW_THREAD_NVM_SRAM_SEMID semaphore makes sure CPU2 does not update the persistent data in SRAM2 at the same time CPU1 is reading them. | ||||
| *  There is no timing constraint on how long this semaphore can be kept. | ||||
| */ | ||||
| #define CFG_HW_THREAD_NVM_SRAM_SEMID                           9 | ||||
| 
 | ||||
| /**
 | ||||
| *  The CPU2 may be configured to store the BLE persistent data either in internal NVM storage on CPU2 or in | ||||
| *  SRAM2 buffer provided by the user application. This can be configured with the system command SHCI_C2_Config() | ||||
| *  When the CPU2 is requested to store persistent data in SRAM2, it can write data in this buffer at any time when needed. | ||||
| *  In order to read consistent data with the CPU1 from the SRAM2 buffer, the flow should be: | ||||
| *  + CPU1 takes CFG_HW_BLE_NVM_SRAM_SEMID semaphore | ||||
| *  + CPU1 reads all persistent data from SRAM2 (most of the time, the goal is to write these data into an NVM managed by CPU1) | ||||
| *  + CPU1 releases CFG_HW_BLE_NVM_SRAM_SEMID semaphore | ||||
| *  CFG_HW_BLE_NVM_SRAM_SEMID semaphore makes sure CPU2 does not update the persistent data in SRAM2 at the same time CPU1 is reading them. | ||||
| *  There is no timing constraint on how long this semaphore can be kept. | ||||
| */ | ||||
| #define CFG_HW_BLE_NVM_SRAM_SEMID                              8 | ||||
| 
 | ||||
| /**
 | ||||
| *  Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash | ||||
| *  The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2 | ||||
|  | ||||
| @ -1,5 +1,4 @@ | ||||
| #include <furi-hal-bt.h> | ||||
| #include <app_entry.h> | ||||
| #include <ble.h> | ||||
| #include <stm32wbxx.h> | ||||
| #include <shci.h> | ||||
| @ -7,11 +6,37 @@ | ||||
| 
 | ||||
| #include <furi.h> | ||||
| 
 | ||||
| osMutexId_t furi_hal_bt_core2_mtx = NULL; | ||||
| 
 | ||||
| void furi_hal_bt_init() { | ||||
|     furi_hal_bt_core2_mtx = osMutexNew(NULL); | ||||
| } | ||||
| 
 | ||||
| static bool furi_hal_bt_wait_startup() { | ||||
|     uint16_t counter = 0; | ||||
|     while (!(ble_glue_get_status() == BleGlueStatusStarted || ble_glue_get_status() == BleGlueStatusBleStackMissing)) { | ||||
|         osDelay(10); | ||||
|         counter++; | ||||
|         if (counter > 1000) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_bt_start_core2() { | ||||
|     furi_assert(furi_hal_bt_core2_mtx); | ||||
| 
 | ||||
|     bool ret = false; | ||||
|     osMutexAcquire(furi_hal_bt_core2_mtx, osWaitForever); | ||||
|     // Explicitly tell that we are in charge of CLK48 domain
 | ||||
|     HAL_HSEM_FastTake(CFG_HW_CLK48_CONFIG_SEMID); | ||||
|     // Start Core2, init HCI and start GAP/GATT
 | ||||
|     APPE_Init(); | ||||
|     // Start Core2
 | ||||
|     ble_glue_init(); | ||||
|     // Wait for Core2 start
 | ||||
|     ret = furi_hal_bt_wait_startup(); | ||||
|     osMutexRelease(furi_hal_bt_core2_mtx); | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_bt_init_app(BleEventCallback event_cb, void* context) { | ||||
| @ -45,8 +70,33 @@ bool furi_hal_bt_tx(uint8_t* data, uint16_t size) { | ||||
|     return serial_svc_update_tx(data, size); | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_bt_get_key_storage_buff(uint8_t** key_buff_addr, uint16_t* key_buff_size) { | ||||
|     bool ret = false; | ||||
|     BleGlueStatus status = ble_glue_get_status(); | ||||
|     if(status == BleGlueStatusUninitialized || BleGlueStatusStarted) { | ||||
|         ble_app_get_key_storage_buff(key_buff_addr, key_buff_size); | ||||
|         ret = true; | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| void furi_hal_bt_set_key_storage_change_callback(BleGlueKeyStorageChangedCallback callback, void* context) { | ||||
|     furi_assert(callback); | ||||
|     ble_glue_set_key_storage_changed_callback(callback, context); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_bt_nvm_sram_sem_acquire() { | ||||
|     while(HAL_HSEM_FastTake(CFG_HW_BLE_NVM_SRAM_SEMID) != HAL_OK) { | ||||
|         osDelay(1); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void furi_hal_bt_nvm_sram_sem_release() { | ||||
|     HAL_HSEM_Release(CFG_HW_BLE_NVM_SRAM_SEMID, 0); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_bt_dump_state(string_t buffer) { | ||||
|     BleGlueStatus status = APPE_Status(); | ||||
|     BleGlueStatus status = ble_glue_get_status(); | ||||
|     if (status == BleGlueStatusStarted) { | ||||
|         uint8_t HCI_Version; | ||||
|         uint16_t HCI_Revision; | ||||
| @ -68,56 +118,97 @@ void furi_hal_bt_dump_state(string_t buffer) { | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_bt_is_alive() { | ||||
|     BleGlueStatus status = APPE_Status(); | ||||
|     return (status == BleGlueStatusBroken) || (status == BleGlueStatusStarted); | ||||
|     BleGlueStatus status = ble_glue_get_status(); | ||||
|     return (status == BleGlueStatusBleStackMissing) || (status == BleGlueStatusStarted); | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_bt_is_active() { | ||||
|     return gap_get_state() > GapStateIdle; | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_bt_wait_startup() { | ||||
|     uint16_t counter = 0; | ||||
|     while (!(APPE_Status() == BleGlueStatusStarted || APPE_Status() == BleGlueStatusBroken)) { | ||||
|         osDelay(10); | ||||
|         counter++; | ||||
|         if (counter > 1000) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool furi_hal_bt_lock_flash(bool erase_flag) { | ||||
|     if (!furi_hal_bt_wait_startup()) { | ||||
|         return false; | ||||
|     } | ||||
|      | ||||
| static void furi_hal_bt_lock_flash_core2(bool erase_flag) { | ||||
|     // Take flash controller ownership 
 | ||||
|     while (HAL_HSEM_FastTake(CFG_HW_FLASH_SEMID) != HAL_OK) { | ||||
|         osDelay(1); | ||||
|         taskYIELD(); | ||||
|     } | ||||
| 
 | ||||
|     // Unlock flash operation
 | ||||
|     HAL_FLASH_Unlock(); | ||||
| 
 | ||||
|     // Erase activity notification
 | ||||
|     if(erase_flag) SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_ON); | ||||
| 
 | ||||
|     while(LL_FLASH_IsActiveFlag_OperationSuspended()) { | ||||
|         osDelay(1); | ||||
|     }; | ||||
|     while(true) { | ||||
|         // Wait till flash controller become usable
 | ||||
|         while(LL_FLASH_IsActiveFlag_OperationSuspended()) { | ||||
|             taskYIELD(); | ||||
|         }; | ||||
| 
 | ||||
|     __disable_irq(); | ||||
|         // Just a little more love
 | ||||
|         taskENTER_CRITICAL(); | ||||
| 
 | ||||
|     return true; | ||||
|         // Actually we already have mutex for it, but specification is specification
 | ||||
|         if (HAL_HSEM_IsSemTaken(CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID)) { | ||||
|             taskEXIT_CRITICAL(); | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
|         // Take sempahopre and prevent core2 from anyting funky
 | ||||
|         if (HAL_HSEM_FastTake(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID) != HAL_OK) { | ||||
|             taskEXIT_CRITICAL(); | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void furi_hal_bt_lock_flash(bool erase_flag) { | ||||
|     // Acquire dangerous ops mutex
 | ||||
|     osMutexAcquire(furi_hal_bt_core2_mtx, osWaitForever); | ||||
| 
 | ||||
|     // If Core2 is running use IPC locking
 | ||||
|     BleGlueStatus status = ble_glue_get_status(); | ||||
|     if(status == BleGlueStatusStarted || status == BleGlueStatusBleStackMissing) { | ||||
|         furi_hal_bt_lock_flash_core2(erase_flag); | ||||
|     } else {  | ||||
|         HAL_FLASH_Unlock(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static void furi_hal_bt_unlock_flash_core2(bool erase_flag) { | ||||
|     // Funky ops are ok at this point
 | ||||
|     HAL_HSEM_Release(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, 0); | ||||
| 
 | ||||
|     // Task switching is ok
 | ||||
|     taskEXIT_CRITICAL(); | ||||
| 
 | ||||
|     // Doesn't make much sense, does it?
 | ||||
|     while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) { | ||||
|         taskYIELD(); | ||||
|     } | ||||
| 
 | ||||
|     // Erase activity over, core2 can continue
 | ||||
|     if(erase_flag) SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF); | ||||
| 
 | ||||
|     // Lock flash controller
 | ||||
|     HAL_FLASH_Lock(); | ||||
| 
 | ||||
|     // Release flash controller ownership
 | ||||
|     HAL_HSEM_Release(CFG_HW_FLASH_SEMID, 0); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_bt_unlock_flash(bool erase_flag) { | ||||
|     __enable_irq(); | ||||
|     // If Core2 is running use IPC locking
 | ||||
|     BleGlueStatus status = ble_glue_get_status(); | ||||
|     if(status == BleGlueStatusStarted || status == BleGlueStatusBleStackMissing) { | ||||
|         furi_hal_bt_unlock_flash_core2(erase_flag); | ||||
|     } else {  | ||||
|         HAL_FLASH_Lock(); | ||||
|     } | ||||
| 
 | ||||
|     if(erase_flag) SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF); | ||||
| 
 | ||||
|     HAL_FLASH_Lock(); | ||||
| 
 | ||||
|     HAL_HSEM_Release(CFG_HW_FLASH_SEMID, HSEM_CPU1_COREID); | ||||
|     // Release dangerous ops mutex
 | ||||
|     osMutexRelease(furi_hal_bt_core2_mtx); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_bt_start_tone_tx(uint8_t channel, uint8_t power) { | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Aleksandr Kutuzov
						Aleksandr Kutuzov