diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..59ab7a1d8 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @xMasterX \ No newline at end of file diff --git a/.vscode/example/launch.json b/.vscode/example/launch.json index f9470a740..7cb2542de 100644 --- a/.vscode/example/launch.json +++ b/.vscode/example/launch.json @@ -9,6 +9,10 @@ "type": "command", "command": "shellCommand.execute", "args": { + "useSingleResult": true, + "env": { + "PATH": "${workspaceFolder};${env:PATH}" + }, "command": "./fbt get_blackmagic", "description": "Get Blackmagic device", } diff --git a/.vscode/example/settings.json b/.vscode/example/settings.json index d2917a90e..d84707e07 100644 --- a/.vscode/example/settings.json +++ b/.vscode/example/settings.json @@ -22,4 +22,4 @@ "SConstruct": "python", "*.fam": "python", } -} \ No newline at end of file +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cf0089b4..97389f6c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,20 @@ ### New changes -* Picopass plugin fixed (bug with mbedtls lib fixed by hedger in OFW PR 1742) -* PR: Fix SubGHz last used settings (PR 70 by derskythe) -* PR: Random UID for detect reader mode - changes each time when you exit NFC app and launch it (PR 69 by h4sh5) -* OFW PR: Dummy mode (aka dumb mode) (OFW PR 1739 by nminaylov) -* OFW PR: picopass se identify (OFW PR 1701 by pcunning) -* OFW PR: faploader api extension and lib fixes (OFW PR 1742 by hedger) +* Infrared: Updated universal remote assets (by @Amec0e) +* OFW PR: SubGHz: Read RAW - datetime in default names (+ format changed) (OFW PR 1772 by Skorpionm) +* OFW: Text input overwrite max size template +* OFW: Remove unused headers +* OFW: ELF-Loader: C++ plugin support, loader overhaul. +* OFW: Core: simplify record container -#### **DFU files no longer included in releases to avoid issues with wrong manual installation of assets - use web updater or microSD update package** +#### **DFU files no longer included in releases to avoid issues with wrong manual installation of assets - use .tgz file with qFlipper, or install automatically via web updater or use microSD update package** -**Note: To avoid issues prefer installing using web updater or by self update package, all needed assets will be installed** +[- How to install](https://github.com/Eng1n33r/flipperzero-firmware/blob/dev/documentation/HowToInstall.md) -Self-update package (update from microSD) - `flipper-z-f7-update-(version).zip` or `.tgz` for iOS mobile app +[- Download qFlipper 1.2.0 (allows .tgz installation) (official link)](https://update.flipperzero.one/builds/qFlipper/1.2.0/) -DFU for update using qFlipper is no longer included in releases to avoid issues with assets - Use Web Updater or self-update package! +**Note: To avoid issues with .dfu, prefer installing using .tgz with qFlipper, web updater or by self update package, all needed assets will be installed** + +Self-update package (update from microSD) - `flipper-z-f7-update-(version).zip` or download `.tgz` for iOS mobile app / qFlipper + +Update using qFlipper (1.2.0) is now possible with `.tgz` update package! Also you can use Web Updater or self-update package. diff --git a/ReadMe.md b/ReadMe.md index f3eaba888..fbc97304f 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -49,7 +49,7 @@ See changelog in releases for latest updates! - Keeloq [Not ALL systems supported yet!] - Nice Flor S - Security+ v1 & v2 -- Star Line +- Star Line (saving only) ## Support us so we can buy equipment and develop new features * ETH/BSC/ERC20-Tokens: `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a` @@ -87,7 +87,6 @@ Games: - BadUSB -> Keyboard layouts [(by rien > dummy-decoy)](https://github.com/dummy-decoy/flipperzero-firmware/tree/dummy_decoy/bad_usb_keyboard_layout) - SubGHz -> New frequency analyzer - [(by ClusterM)](https://github.com/ClusterM) - SubGHz -> Detect RAW feature - [(by perspecdev)](https://github.com/RogueMaster/flipperzero-firmware-wPlugins/pull/152) -- SubGHz -> Save last used config settings - [(by derskythe)](https://github.com/Eng1n33r/flipperzero-firmware/pull/67) # Instructions ## [- How to install firmware](https://github.com/Eng1n33r/flipperzero-firmware/blob/dev/documentation/HowToInstall.md) @@ -167,4 +166,4 @@ Games: - `site_scons` - Build helpers - `scripts` - Supplementary scripts and python libraries home -Also pay attention to `ReadMe.md` files inside of those directories. +Also pay attention to `ReadMe.md` files inside those directories. diff --git a/SConstruct b/SConstruct index f39bba686..5ad2ac3c8 100644 --- a/SConstruct +++ b/SConstruct @@ -44,6 +44,8 @@ distenv = coreenv.Clone( "target extended-remote ${GDBREMOTE}", "-ex", "set confirm off", + "-ex", + "set pagination off", ], GDBOPTS_BLACKMAGIC=[ "-ex", @@ -234,10 +236,19 @@ distenv.PhonyTarget( distenv.PhonyTarget( "debug_other", "${GDBPYCOM}", - GDBPYOPTS='-ex "source debug/PyCortexMDebug/PyCortexMDebug.py" ', + GDBOPTS="${GDBOPTS_BASE}", GDBREMOTE="${OPENOCD_GDB_PIPE}", + GDBPYOPTS='-ex "source debug/PyCortexMDebug/PyCortexMDebug.py" ', ) +distenv.PhonyTarget( + "debug_other_blackmagic", + "${GDBPYCOM}", + GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}", + GDBREMOTE="$${BLACKMAGIC_ADDR}", +) + + # Just start OpenOCD distenv.PhonyTarget( "openocd", diff --git a/applications/debug/unit_tests/nfc/nfc_test.c b/applications/debug/unit_tests/nfc/nfc_test.c index e81199920..580943f24 100644 --- a/applications/debug/unit_tests/nfc/nfc_test.c +++ b/applications/debug/unit_tests/nfc/nfc_test.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -170,10 +171,59 @@ MU_TEST(nfc_digital_signal_test) { "NFC long digital signal test failed\r\n"); } +MU_TEST(mf_classic_dict_test) { + MfClassicDict* instance = NULL; + uint64_t key = 0; + string_t temp_str; + string_init(temp_str); + + instance = mf_classic_dict_alloc(MfClassicDictTypeUnitTest); + mu_assert(instance != NULL, "mf_classic_dict_alloc\r\n"); + + mu_assert( + mf_classic_dict_get_total_keys(instance) == 0, + "mf_classic_dict_get_total_keys == 0 assert failed\r\n"); + + string_set(temp_str, "2196FAD8115B"); + mu_assert( + mf_classic_dict_add_key_str(instance, temp_str), + "mf_classic_dict_add_key == true assert failed\r\n"); + + mu_assert( + mf_classic_dict_get_total_keys(instance) == 1, + "mf_classic_dict_get_total_keys == 1 assert failed\r\n"); + + mu_assert(mf_classic_dict_rewind(instance), "mf_classic_dict_rewind == 1 assert failed\r\n"); + + mu_assert( + mf_classic_dict_get_key_at_index_str(instance, temp_str, 0), + "mf_classic_dict_get_key_at_index_str == true assert failed\r\n"); + mu_assert( + string_cmp(temp_str, "2196FAD8115B") == 0, + "string_cmp(temp_str, \"2196FAD8115B\") == 0 assert failed\r\n"); + + mu_assert(mf_classic_dict_rewind(instance), "mf_classic_dict_rewind == 1 assert failed\r\n"); + + mu_assert( + mf_classic_dict_get_key_at_index(instance, &key, 0), + "mf_classic_dict_get_key_at_index == true assert failed\r\n"); + mu_assert(key == 0x2196FAD8115B, "key == 0x2196FAD8115B assert failed\r\n"); + + mu_assert(mf_classic_dict_rewind(instance), "mf_classic_dict_rewind == 1 assert failed\r\n"); + + mu_assert( + mf_classic_dict_delete_index(instance, 0), + "mf_classic_dict_delete_index == true assert failed\r\n"); + + mf_classic_dict_free(instance); + string_clear(temp_str); +} + MU_TEST_SUITE(nfc) { nfc_test_alloc(); MU_RUN_TEST(nfc_digital_signal_test); + MU_RUN_TEST(mf_classic_dict_test); nfc_test_free(); } diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index df269ed04..36f5b94c2 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -13,7 +13,7 @@ #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") #define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s") #define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub") -#define TEST_RANDOM_COUNT_PARSE 232 +#define TEST_RANDOM_COUNT_PARSE 233 #define TEST_TIMEOUT 10000 static SubGhzEnvironment* environment_handler; @@ -434,6 +434,13 @@ MU_TEST(subghz_decoder_clemsa_test) { "Test decoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n"); } +MU_TEST(subghz_decoder_oregon2_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/oregon2_raw.sub"), SUBGHZ_PROTOCOL_OREGON2_NAME), + "Test decoder " SUBGHZ_PROTOCOL_OREGON2_NAME " error\r\n"); +} + //test encoders MU_TEST(subghz_encoder_princeton_test) { mu_assert( @@ -595,6 +602,7 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_decoder_magellen_test); MU_RUN_TEST(subghz_decoder_intertechno_v3_test); MU_RUN_TEST(subghz_decoder_clemsa_test); + MU_RUN_TEST(subghz_decoder_oregon2_test); MU_RUN_TEST(subghz_encoder_princeton_test); MU_RUN_TEST(subghz_encoder_came_test); diff --git a/applications/main/application.fam b/applications/main/application.fam index e6fca441b..a3d310093 100644 --- a/applications/main/application.fam +++ b/applications/main/application.fam @@ -15,6 +15,23 @@ App( "archive", "clock", "unirfremix", - "spectrum_analyzer", + ], +) + +App( + appid="main_apps_default", + name="Basic applications for main menu", + apptype=FlipperAppType.METAPACKAGE, + provides=[ + "gpio", + #"ibutton", + "infrared", + "lfrfid", + "nfc", + "subghz", + #"bad_usb", + #"u2f", + "fap_loader", + "archive", ], ) diff --git a/applications/main/archive/helpers/archive_browser.h b/applications/main/archive/helpers/archive_browser.h index ad64a9845..de4bb9382 100644 --- a/applications/main/archive/helpers/archive_browser.h +++ b/applications/main/archive/helpers/archive_browser.h @@ -16,6 +16,7 @@ static const char* tab_default_paths[] = { [ArchiveTabInfrared] = ANY_PATH("infrared"), [ArchiveTabBadUsb] = ANY_PATH("badusb"), [ArchiveTabU2f] = "/app:u2f", + [ArchiveTabApps] = ANY_PATH("apps"), [ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX, }; @@ -27,6 +28,7 @@ static const char* known_ext[] = { [ArchiveFileTypeInfrared] = ".ir", [ArchiveFileTypeBadUsb] = ".txt", [ArchiveFileTypeU2f] = "?", + [ArchiveFileTypeApps] = ".fap", [ArchiveFileTypeUpdateManifest] = ".fuf", [ArchiveFileTypeFolder] = "?", [ArchiveFileTypeUnknown] = "*", @@ -41,6 +43,7 @@ static const ArchiveFileTypeEnum known_type[] = { [ArchiveTabInfrared] = ArchiveFileTypeInfrared, [ArchiveTabBadUsb] = ArchiveFileTypeBadUsb, [ArchiveTabU2f] = ArchiveFileTypeU2f, + [ArchiveTabApps] = ArchiveFileTypeApps, [ArchiveTabBrowser] = ArchiveFileTypeUnknown, }; diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index d4df327a9..de07a2e19 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -13,6 +13,7 @@ typedef enum { ArchiveFileTypeInfrared, ArchiveFileTypeBadUsb, ArchiveFileTypeU2f, + ArchiveFileTypeApps, ArchiveFileTypeUpdateManifest, ArchiveFileTypeFolder, ArchiveFileTypeUnknown, diff --git a/applications/main/archive/helpers/archive_menu.h b/applications/main/archive/helpers/archive_menu.h index 5df6a1ca2..201333987 100644 --- a/applications/main/archive/helpers/archive_menu.h +++ b/applications/main/archive/helpers/archive_menu.h @@ -42,10 +42,7 @@ ARRAY_DEF( #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-function" // Using in applications/archive/views/archive_browser_view.c -static void archive_menu_add_item( - ArchiveContextMenuItem_t* obj, - string_t text, - uint32_t event) { +static void archive_menu_add_item(ArchiveContextMenuItem_t* obj, string_t text, uint32_t event) { string_init_move(obj->text, text); obj->event = event; } diff --git a/applications/main/archive/scenes/archive_scene_browser.c b/applications/main/archive/scenes/archive_scene_browser.c index 3e7ac231d..552a6557e 100644 --- a/applications/main/archive/scenes/archive_scene_browser.c +++ b/applications/main/archive/scenes/archive_scene_browser.c @@ -19,6 +19,7 @@ static const char* flipper_app_name[] = { [ArchiveFileTypeInfrared] = "Infrared", [ArchiveFileTypeBadUsb] = "Bad USB", [ArchiveFileTypeU2f] = "U2F", + [ArchiveFileTypeApps] = "Applications", [ArchiveFileTypeUpdateManifest] = "UpdaterApp", }; @@ -132,7 +133,7 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { case ArchiveBrowserEventFileMenuRename: if(favorites) { browser->callback(ArchiveBrowserEventEnterFavMove, browser->context); - //} else if((archive_is_known_app(selected->type)) && (selected->is_app == false)) { + //} else if((archive_is_known_app(selected->type)) && (selected->is_app == false)) { } else { // Added ability to rename files and folders archive_show_file_menu(browser, false); diff --git a/applications/main/archive/scenes/archive_scene_info.c b/applications/main/archive/scenes/archive_scene_info.c index b6fae4bca..08c403b4b 100644 --- a/applications/main/archive/scenes/archive_scene_info.c +++ b/applications/main/archive/scenes/archive_scene_info.c @@ -37,7 +37,11 @@ void archive_scene_info_on_enter(void* context) { // Directory path path_extract_dirname(string_get_cstr(current->path), dirname); - string_replace_str(dirname, STORAGE_ANY_PATH_PREFIX, ""); + if(strcmp(string_get_cstr(dirname), "/any") == 0) { + string_replace_str(dirname, STORAGE_ANY_PATH_PREFIX, "/"); + } else { + string_replace_str(dirname, STORAGE_ANY_PATH_PREFIX, ""); + } // File size FileInfo fileinfo; @@ -60,7 +64,7 @@ void archive_scene_info_on_enter(void* context) { string_get_cstr(dirname)); } widget_add_text_box_element( - instance->widget, 0, 25, 128, 25, AlignLeft, AlignCenter, file_info_message, false); + instance->widget, 0, 25, 128, 25, AlignLeft, AlignCenter, file_info_message, true); // This one to return and cursor select this file path_extract_filename_no_ext(string_get_cstr(current->path), filename); diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 5fa21d150..d82145bea 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -16,6 +16,7 @@ static const char* ArchiveTabNames[] = { [ArchiveTabInfrared] = "Infrared", [ArchiveTabBadUsb] = "Bad USB", [ArchiveTabU2f] = "U2F", + [ArchiveTabApps] = "Apps", [ArchiveTabBrowser] = "Browser", }; @@ -27,6 +28,7 @@ static const Icon* ArchiveItemIcons[] = { [ArchiveFileTypeInfrared] = &I_ir_10px, [ArchiveFileTypeBadUsb] = &I_badusb_10px, [ArchiveFileTypeU2f] = &I_u2f_10px, + [ArchiveFileTypeApps] = &I_Apps_10px, [ArchiveFileTypeUpdateManifest] = &I_update_10px, [ArchiveFileTypeFolder] = &I_dir_10px, [ArchiveFileTypeUnknown] = &I_unknown_10px, diff --git a/applications/main/archive/views/archive_browser_view.h b/applications/main/archive/views/archive_browser_view.h index e20bd62d3..c19ccab84 100644 --- a/applications/main/archive/views/archive_browser_view.h +++ b/applications/main/archive/views/archive_browser_view.h @@ -27,6 +27,7 @@ typedef enum { ArchiveTabIButton, ArchiveTabBadUsb, ArchiveTabU2f, + ArchiveTabApps, ArchiveTabBrowser, ArchiveTabTotal, } ArchiveTabEnum; diff --git a/applications/main/clock_app/clock_settings.h b/applications/main/clock_app/clock_settings.h index d05f986ef..b2970f659 100644 --- a/applications/main/clock_app/clock_settings.h +++ b/applications/main/clock_app/clock_settings.h @@ -33,5 +33,4 @@ typedef enum { typedef struct { TimeFormat time_format; DateFormat date_format; - uint8_t increment_precision; } ClockSettings; \ No newline at end of file diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index 14da2f320..9050ddf78 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -25,7 +25,7 @@ static bool FlipperApplication* app = flipper_application_alloc(loader->storage, &hashtable_api_interface); FlipperApplicationPreloadStatus preload_res = - flipper_application_preload(app, string_get_cstr(path)); + flipper_application_preload_manifest(app, string_get_cstr(path)); bool load_success = false; diff --git a/applications/main/infrared/scenes/common/infrared_scene_universal_common.c b/applications/main/infrared/scenes/common/infrared_scene_universal_common.c index 1072549ff..86f3260fd 100644 --- a/applications/main/infrared/scenes/common/infrared_scene_universal_common.c +++ b/applications/main/infrared/scenes/common/infrared_scene_universal_common.c @@ -33,8 +33,6 @@ static void infrared_scene_universal_common_hide_popup(Infrared* infrared) { void infrared_scene_universal_common_on_enter(void* context) { Infrared* infrared = context; - infrared_brute_force_clear_records(infrared->brute_force); - button_panel_reset_selection(infrared->button_panel); view_stack_add_view(infrared->view_stack, button_panel_get_view(infrared->button_panel)); } @@ -89,5 +87,6 @@ void infrared_scene_universal_common_on_exit(void* context) { Infrared* infrared = context; ButtonPanel* button_panel = infrared->button_panel; view_stack_remove_view(infrared->view_stack, button_panel_get_view(button_panel)); + infrared_brute_force_clear_records(infrared->brute_force); button_panel_reset(button_panel); } diff --git a/applications/main/lfrfid/views/lfrfid_view_read.c b/applications/main/lfrfid/views/lfrfid_view_read.c index 2b63175da..66caf8df7 100644 --- a/applications/main/lfrfid/views/lfrfid_view_read.c +++ b/applications/main/lfrfid/views/lfrfid_view_read.c @@ -16,7 +16,7 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) { LfRfidReadViewModel* model = _model; canvas_set_color(canvas, ColorBlack); - canvas_draw_icon(canvas, 0, 8, &I_NFC_manual); + canvas_draw_icon(canvas, 0, 8, &I_NFC_manual_60x50); canvas_set_font(canvas, FontPrimary); diff --git a/applications/main/nfc/nfc.c b/applications/main/nfc/nfc.c index 432630204..f47a5bac2 100644 --- a/applications/main/nfc/nfc.c +++ b/applications/main/nfc/nfc.c @@ -231,7 +231,30 @@ void nfc_show_loading_popup(void* context, bool show) { } } +static bool nfc_is_hal_ready() { + if(!furi_hal_nfc_is_init()) { + // No connection to the chip, show an error screen + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_text( + message, + "Error!\nNFC chip failed to start\n\n\nSend a photo of this to:\nsupport@flipperzero.one", + 0, + 0, + AlignLeft, + AlignTop); + dialog_message_show(dialogs, message); + dialog_message_free(message); + furi_record_close(RECORD_DIALOGS); + return false; + } else { + return true; + } +} + int32_t nfc_app(void* p) { + if(!nfc_is_hal_ready()) return 0; + Nfc* nfc = nfc_alloc(); char* args = p; diff --git a/applications/main/nfc/nfc_i.h b/applications/main/nfc/nfc_i.h index b5d284d5b..15ea5348f 100644 --- a/applications/main/nfc/nfc_i.h +++ b/applications/main/nfc/nfc_i.h @@ -33,8 +33,14 @@ #include #include +#include + #include "rpc/rpc_app.h" +#include + +ARRAY_DEF(MfClassicUserKeys, char*, M_PTR_OPLIST); + #define NFC_TEXT_STORE_SIZE 128 typedef enum { @@ -58,6 +64,7 @@ struct Nfc { char text_store[NFC_TEXT_STORE_SIZE + 1]; string_t text_box_store; uint8_t byte_input_store[6]; + MfClassicUserKeys_t mfc_key_strs; // Used in MFC key listing void* rpc_ctx; NfcRpcState rpc_state; diff --git a/applications/main/nfc/scenes/nfc_scene_config.h b/applications/main/nfc/scenes/nfc_scene_config.h index 540fe1098..a25850c84 100644 --- a/applications/main/nfc/scenes/nfc_scene_config.h +++ b/applications/main/nfc/scenes/nfc_scene_config.h @@ -32,6 +32,9 @@ ADD_SCENE(nfc, mf_classic_menu, MfClassicMenu) ADD_SCENE(nfc, mf_classic_emulate, MfClassicEmulate) ADD_SCENE(nfc, mf_classic_keys, MfClassicKeys) ADD_SCENE(nfc, mf_classic_keys_add, MfClassicKeysAdd) +ADD_SCENE(nfc, mf_classic_keys_list, MfClassicKeysList) +ADD_SCENE(nfc, mf_classic_keys_delete, MfClassicKeysDelete) +ADD_SCENE(nfc, mf_classic_keys_warn_duplicate, MfClassicKeysWarnDuplicate) ADD_SCENE(nfc, mf_classic_dict_attack, MfClassicDictAttack) ADD_SCENE(nfc, emv_read_success, EmvReadSuccess) ADD_SCENE(nfc, emv_menu, EmvMenu) diff --git a/applications/main/nfc/scenes/nfc_scene_delete_success.c b/applications/main/nfc/scenes/nfc_scene_delete_success.c index 713b99ebf..1664a9e5b 100644 --- a/applications/main/nfc/scenes/nfc_scene_delete_success.c +++ b/applications/main/nfc/scenes/nfc_scene_delete_success.c @@ -25,8 +25,13 @@ bool nfc_scene_delete_success_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == NfcCustomEventViewExit) { - consumed = scene_manager_search_and_switch_to_previous_scene( - nfc->scene_manager, NfcSceneFileSelect); + if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneMfClassicKeys)) { + consumed = scene_manager_search_and_switch_to_previous_scene( + nfc->scene_manager, NfcSceneMfClassicKeys); + } else { + consumed = scene_manager_search_and_switch_to_previous_scene( + nfc->scene_manager, NfcSceneStart); + } } } return consumed; diff --git a/applications/main/nfc/scenes/nfc_scene_device_info.c b/applications/main/nfc/scenes/nfc_scene_device_info.c index 8228c7ea3..245aea5c5 100644 --- a/applications/main/nfc/scenes/nfc_scene_device_info.c +++ b/applications/main/nfc/scenes/nfc_scene_device_info.c @@ -47,7 +47,9 @@ void nfc_scene_device_info_on_enter(void* context) { } string_clear(country_name); } - } else if(dev_data->protocol == NfcDeviceProtocolMifareClassic) { + } else if( + dev_data->protocol == NfcDeviceProtocolMifareClassic || + dev_data->protocol == NfcDeviceProtocolMifareUl) { string_set(temp_str, nfc->dev->dev_data.parsed_data); } diff --git a/applications/main/nfc/scenes/nfc_scene_dict_not_found.c b/applications/main/nfc/scenes/nfc_scene_dict_not_found.c index dc21b08b1..781c5a932 100644 --- a/applications/main/nfc/scenes/nfc_scene_dict_not_found.c +++ b/applications/main/nfc/scenes/nfc_scene_dict_not_found.c @@ -31,7 +31,10 @@ bool nfc_scene_dict_not_found_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == NfcCustomEventViewExit) { - if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneExtraActions)) { + if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneMfClassicKeys)) { + consumed = scene_manager_search_and_switch_to_previous_scene( + nfc->scene_manager, NfcSceneMfClassicKeys); + } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneExtraActions)) { consumed = scene_manager_search_and_switch_to_previous_scene( nfc->scene_manager, NfcSceneExtraActions); } else { diff --git a/applications/main/nfc/scenes/nfc_scene_extra_actions.c b/applications/main/nfc/scenes/nfc_scene_extra_actions.c index 43e49e5a0..e888e9d35 100644 --- a/applications/main/nfc/scenes/nfc_scene_extra_actions.c +++ b/applications/main/nfc/scenes/nfc_scene_extra_actions.c @@ -17,7 +17,7 @@ void nfc_scene_extra_actions_on_enter(void* context) { submenu_add_item( submenu, - "Mf Classic Keys", + "Mifare Classic Keys", SubmenuIndexMfClassicKeys, nfc_scene_extra_actions_submenu_callback, nfc); diff --git a/applications/main/nfc/scenes/nfc_scene_mf_classic_keys.c b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys.c index fcb8bc189..a2e6ae745 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_classic_keys.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys.c @@ -26,15 +26,25 @@ void nfc_scene_mf_classic_keys_on_enter(void* context) { } widget_add_string_element( - nfc->widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "MF Classic Keys"); + nfc->widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "Mifare Classic Keys"); char temp_str[32]; - snprintf(temp_str, sizeof(temp_str), "Flipper dict: %ld", flipper_dict_keys_total); + snprintf(temp_str, sizeof(temp_str), "Flipper list: %ld", flipper_dict_keys_total); widget_add_string_element(nfc->widget, 0, 20, AlignLeft, AlignTop, FontSecondary, temp_str); - snprintf(temp_str, sizeof(temp_str), "User dict: %ld", user_dict_keys_total); + snprintf(temp_str, sizeof(temp_str), "User list: %ld", user_dict_keys_total); widget_add_string_element(nfc->widget, 0, 32, AlignLeft, AlignTop, FontSecondary, temp_str); widget_add_button_element( nfc->widget, GuiButtonTypeCenter, "Add", nfc_scene_mf_classic_keys_widget_callback, nfc); - widget_add_icon_element(nfc->widget, 90, 12, &I_Keychain); + widget_add_button_element( + nfc->widget, GuiButtonTypeLeft, "Back", nfc_scene_mf_classic_keys_widget_callback, nfc); + widget_add_icon_element(nfc->widget, 87, 13, &I_Keychain_39x36); + if(user_dict_keys_total > 0) { + widget_add_button_element( + nfc->widget, + GuiButtonTypeRight, + "List", + nfc_scene_mf_classic_keys_widget_callback, + nfc); + } view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); } @@ -47,6 +57,12 @@ bool nfc_scene_mf_classic_keys_on_event(void* context, SceneManagerEvent event) if(event.event == GuiButtonTypeCenter) { scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicKeysAdd); consumed = true; + } else if(event.event == GuiButtonTypeLeft) { + scene_manager_previous_scene(nfc->scene_manager); + consumed = true; + } else if(event.event == GuiButtonTypeRight) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicKeysList); + consumed = true; } } diff --git a/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_add.c b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_add.c index 9f56b0f45..2921d21c9 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_add.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_add.c @@ -29,15 +29,16 @@ bool nfc_scene_mf_classic_keys_add_on_event(void* context, SceneManagerEvent eve if(event.type == SceneManagerEventTypeCustom) { if(event.event == NfcCustomEventByteInputDone) { // Add key to dict - bool key_added = false; MfClassicDict* dict = mf_classic_dict_alloc(MfClassicDictTypeUser); if(dict) { - if(mf_classic_dict_add_key(dict, nfc->byte_input_store)) { - key_added = true; + if(mf_classic_dict_is_key_present(dict, nfc->byte_input_store)) { + scene_manager_next_scene( + nfc->scene_manager, NfcSceneMfClassicKeysWarnDuplicate); + } else if(mf_classic_dict_add_key(dict, nfc->byte_input_store)) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveSuccess); + } else { + scene_manager_next_scene(nfc->scene_manager, NfcSceneDictNotFound); } - } - if(key_added) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveSuccess); } else { scene_manager_next_scene(nfc->scene_manager, NfcSceneDictNotFound); } diff --git a/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_delete.c b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_delete.c new file mode 100644 index 000000000..16a189da6 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_delete.c @@ -0,0 +1,77 @@ +#include "../nfc_i.h" + +void nfc_scene_mf_classic_keys_delete_widget_callback( + GuiButtonType result, + InputType type, + void* context) { + Nfc* nfc = context; + if(type == InputTypeShort) { + view_dispatcher_send_custom_event(nfc->view_dispatcher, result); + } +} + +void nfc_scene_mf_classic_keys_delete_on_enter(void* context) { + Nfc* nfc = context; + MfClassicDict* dict = mf_classic_dict_alloc(MfClassicDictTypeUser); + uint32_t key_index = + scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfClassicKeysDelete); + // Setup Custom Widget view + string_t key_str; + string_init(key_str); + + widget_add_string_element( + nfc->widget, 64, 0, AlignCenter, AlignTop, FontPrimary, "Delete this key?"); + widget_add_button_element( + nfc->widget, + GuiButtonTypeLeft, + "Cancel", + nfc_scene_mf_classic_keys_delete_widget_callback, + nfc); + widget_add_button_element( + nfc->widget, + GuiButtonTypeRight, + "Delete", + nfc_scene_mf_classic_keys_delete_widget_callback, + nfc); + + mf_classic_dict_get_key_at_index_str(dict, key_str, key_index); + widget_add_string_element( + nfc->widget, 64, 32, AlignCenter, AlignCenter, FontSecondary, string_get_cstr(key_str)); + + string_clear(key_str); + mf_classic_dict_free(dict); + + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); +} + +bool nfc_scene_mf_classic_keys_delete_on_event(void* context, SceneManagerEvent event) { + Nfc* nfc = context; + bool consumed = false; + uint32_t key_index = + scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfClassicKeysDelete); + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == GuiButtonTypeLeft) { + consumed = scene_manager_search_and_switch_to_previous_scene( + nfc->scene_manager, NfcSceneMfClassicKeys); + } else if(event.event == GuiButtonTypeRight) { + MfClassicDict* dict = mf_classic_dict_alloc(MfClassicDictTypeUser); + if(mf_classic_dict_delete_index(dict, key_index)) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneDeleteSuccess); + } else { + scene_manager_search_and_switch_to_previous_scene( + nfc->scene_manager, NfcSceneMfClassicKeys); + } + mf_classic_dict_free(dict); + consumed = true; + } + } + + return consumed; +} + +void nfc_scene_mf_classic_keys_delete_on_exit(void* context) { + Nfc* nfc = context; + + widget_reset(nfc->widget); +} diff --git a/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_list.c b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_list.c new file mode 100644 index 000000000..6670ae132 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_list.c @@ -0,0 +1,100 @@ +#include "../nfc_i.h" + +#define NFC_SCENE_MF_CLASSIC_KEYS_LIST_MAX (100) + +void nfc_scene_mf_classic_keys_list_submenu_callback(void* context, uint32_t index) { + furi_assert(context); + + Nfc* nfc = context; + view_dispatcher_send_custom_event(nfc->view_dispatcher, index); +} + +void nfc_scene_mf_classic_keys_list_popup_callback(void* context) { + furi_assert(context); + + Nfc* nfc = context; + view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventViewExit); +} + +void nfc_scene_mf_classic_keys_list_prepare(Nfc* nfc, MfClassicDict* dict) { + Submenu* submenu = nfc->submenu; + uint32_t index = 0; + string_t temp_key; + string_init(temp_key); + + submenu_set_header(submenu, "Select key to delete:"); + while(mf_classic_dict_get_next_key_str(dict, temp_key)) { + char* current_key = (char*)malloc(sizeof(char) * 13); + strncpy(current_key, string_get_cstr(temp_key), 12); + MfClassicUserKeys_push_back(nfc->mfc_key_strs, current_key); + FURI_LOG_D("ListKeys", "Key %d: %s", index, current_key); + submenu_add_item( + submenu, current_key, index++, nfc_scene_mf_classic_keys_list_submenu_callback, nfc); + } + string_clear(temp_key); +} + +void nfc_scene_mf_classic_keys_list_on_enter(void* context) { + Nfc* nfc = context; + MfClassicDict* dict = mf_classic_dict_alloc(MfClassicDictTypeUser); + MfClassicUserKeys_init(nfc->mfc_key_strs); + if(dict) { + uint32_t total_user_keys = mf_classic_dict_get_total_keys(dict); + if(total_user_keys < NFC_SCENE_MF_CLASSIC_KEYS_LIST_MAX) { + nfc_scene_mf_classic_keys_list_prepare(nfc, dict); + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); + } else { + popup_set_header(nfc->popup, "Too many keys!", 64, 0, AlignCenter, AlignTop); + popup_set_text( + nfc->popup, + "Edit user dictionary\nwith file browser", + 64, + 12, + AlignCenter, + AlignTop); + popup_set_callback(nfc->popup, nfc_scene_mf_classic_keys_list_popup_callback); + popup_set_context(nfc->popup, nfc); + popup_set_timeout(nfc->popup, 3000); + popup_enable_timeout(nfc->popup); + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); + } + mf_classic_dict_free(dict); + } else { + popup_set_header( + nfc->popup, "Failed to load dictionary", 64, 32, AlignCenter, AlignCenter); + popup_set_callback(nfc->popup, nfc_scene_mf_classic_keys_list_popup_callback); + popup_set_context(nfc->popup, nfc); + popup_set_timeout(nfc->popup, 3000); + popup_enable_timeout(nfc->popup); + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); + } +} + +bool nfc_scene_mf_classic_keys_list_on_event(void* context, SceneManagerEvent event) { + Nfc* nfc = context; + bool consumed = false; + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == NfcCustomEventViewExit) { + consumed = scene_manager_previous_scene(nfc->scene_manager); + } else { + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneMfClassicKeysDelete, event.event); + scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicKeysDelete); + consumed = true; + } + } + return consumed; +} + +void nfc_scene_mf_classic_keys_list_on_exit(void* context) { + Nfc* nfc = context; + + MfClassicUserKeys_it_t it; + for(MfClassicUserKeys_it(it, nfc->mfc_key_strs); !MfClassicUserKeys_end_p(it); + MfClassicUserKeys_next(it)) { + free(*MfClassicUserKeys_ref(it)); + } + MfClassicUserKeys_clear(nfc->mfc_key_strs); + submenu_reset(nfc->submenu); + popup_reset(nfc->popup); +} diff --git a/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_warn_duplicate.c b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_warn_duplicate.c new file mode 100644 index 000000000..ab41989b2 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_mf_classic_keys_warn_duplicate.c @@ -0,0 +1,47 @@ +#include "../nfc_i.h" + +void nfc_scene_mf_classic_keys_warn_duplicate_popup_callback(void* context) { + Nfc* nfc = context; + view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventViewExit); +} + +void nfc_scene_mf_classic_keys_warn_duplicate_on_enter(void* context) { + Nfc* nfc = context; + + // Setup view + Popup* popup = nfc->popup; + popup_set_icon(popup, 72, 16, &I_DolphinCommon_56x48); + popup_set_header(popup, "Key already exists!", 64, 3, AlignCenter, AlignTop); + popup_set_text( + popup, + "Please enter a\n" + "different key.", + 4, + 24, + AlignLeft, + AlignTop); + popup_set_timeout(popup, 5000); + popup_set_context(popup, nfc); + popup_set_callback(popup, nfc_scene_mf_classic_keys_warn_duplicate_popup_callback); + popup_enable_timeout(popup); + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); +} + +bool nfc_scene_mf_classic_keys_warn_duplicate_on_event(void* context, SceneManagerEvent event) { + Nfc* nfc = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == NfcCustomEventViewExit) { + consumed = scene_manager_search_and_switch_to_previous_scene( + nfc->scene_manager, NfcSceneMfClassicKeysAdd); + } + } + return consumed; +} + +void nfc_scene_mf_classic_keys_warn_duplicate_on_exit(void* context) { + Nfc* nfc = context; + + popup_reset(nfc->popup); +} diff --git a/applications/main/nfc/scenes/nfc_scene_mf_desfire_app.c b/applications/main/nfc/scenes/nfc_scene_mf_desfire_app.c index 7faafdcf0..dd8424641 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_desfire_app.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_desfire_app.c @@ -7,6 +7,13 @@ enum SubmenuIndex { SubmenuIndexDynamic, // dynamic indexes start here }; +void nfc_scene_mf_desfire_popup_callback(void* context) { + furi_assert(context); + + Nfc* nfc = context; + view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventViewExit); +} + MifareDesfireApplication* nfc_scene_mf_desfire_app_get_app(Nfc* nfc) { uint32_t app_idx = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfDesfireApp) >> 1; @@ -25,46 +32,45 @@ void nfc_scene_mf_desfire_app_submenu_callback(void* context, uint32_t index) { void nfc_scene_mf_desfire_app_on_enter(void* context) { Nfc* nfc = context; - Submenu* submenu = nfc->submenu; MifareDesfireApplication* app = nfc_scene_mf_desfire_app_get_app(nfc); if(!app) { popup_set_icon(nfc->popup, 5, 5, &I_WarningDolphin_45x42); - popup_set_header(nfc->popup, "Internal Error!", 55, 12, AlignLeft, AlignBottom); - popup_set_text( - nfc->popup, - "No app selected.\nThis should\nnever happen,\nplease file a bug.", - 55, - 15, - AlignLeft, - AlignTop); + popup_set_header(nfc->popup, "Empty card!", 55, 12, AlignLeft, AlignBottom); + popup_set_callback(nfc->popup, nfc_scene_mf_desfire_popup_callback); + popup_set_context(nfc->popup, nfc); + popup_set_timeout(nfc->popup, 3000); + popup_enable_timeout(nfc->popup); + popup_set_text(nfc->popup, "No application\nfound.", 55, 15, AlignLeft, AlignTop); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); - FURI_LOG_E(TAG, "Bad state. No app selected?"); - return; - } + } else { + text_box_set_font(nfc->text_box, TextBoxFontHex); + submenu_add_item( + nfc->submenu, + "App info", + SubmenuIndexAppInfo, + nfc_scene_mf_desfire_app_submenu_callback, + nfc); - text_box_set_font(nfc->text_box, TextBoxFontHex); - - submenu_add_item( - submenu, "App info", SubmenuIndexAppInfo, nfc_scene_mf_desfire_app_submenu_callback, nfc); - - uint16_t cap = NFC_TEXT_STORE_SIZE; - char* buf = nfc->text_store; - int idx = SubmenuIndexDynamic; - for(MifareDesfireFile* file = app->file_head; file; file = file->next) { - int size = snprintf(buf, cap, "File %d", file->id); - if(size < 0 || size >= cap) { - FURI_LOG_W( - TAG, - "Exceeded NFC_TEXT_STORE_SIZE when preparing file id strings; menu truncated"); - break; + uint16_t cap = NFC_TEXT_STORE_SIZE; + char* buf = nfc->text_store; + int idx = SubmenuIndexDynamic; + for(MifareDesfireFile* file = app->file_head; file; file = file->next) { + int size = snprintf(buf, cap, "File %d", file->id); + if(size < 0 || size >= cap) { + FURI_LOG_W( + TAG, + "Exceeded NFC_TEXT_STORE_SIZE when preparing file id strings; menu truncated"); + break; + } + char* label = buf; + cap -= size + 1; + buf += size + 1; + submenu_add_item( + nfc->submenu, label, idx++, nfc_scene_mf_desfire_app_submenu_callback, nfc); } - char* label = buf; - cap -= size + 1; - buf += size + 1; - submenu_add_item(submenu, label, idx++, nfc_scene_mf_desfire_app_submenu_callback, nfc); - } - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); + } } bool nfc_scene_mf_desfire_app_on_event(void* context, SceneManagerEvent event) { @@ -73,26 +79,30 @@ bool nfc_scene_mf_desfire_app_on_event(void* context, SceneManagerEvent event) { uint32_t state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfDesfireApp); if(event.type == SceneManagerEventTypeCustom) { - MifareDesfireApplication* app = nfc_scene_mf_desfire_app_get_app(nfc); - TextBox* text_box = nfc->text_box; - string_reset(nfc->text_box_store); - if(event.event == SubmenuIndexAppInfo) { - mf_df_cat_application_info(app, nfc->text_box_store); + if(event.event == NfcCustomEventViewExit) { + consumed = scene_manager_previous_scene(nfc->scene_manager); } else { - uint16_t index = event.event - SubmenuIndexDynamic; - MifareDesfireFile* file = app->file_head; - for(int i = 0; file && i < index; i++) { - file = file->next; + MifareDesfireApplication* app = nfc_scene_mf_desfire_app_get_app(nfc); + TextBox* text_box = nfc->text_box; + string_reset(nfc->text_box_store); + if(event.event == SubmenuIndexAppInfo) { + mf_df_cat_application_info(app, nfc->text_box_store); + } else { + uint16_t index = event.event - SubmenuIndexDynamic; + MifareDesfireFile* file = app->file_head; + for(int i = 0; file && i < index; i++) { + file = file->next; + } + if(!file) { + return false; + } + mf_df_cat_file(file, nfc->text_box_store); } - if(!file) { - return false; - } - mf_df_cat_file(file, nfc->text_box_store); + text_box_set_text(text_box, string_get_cstr(nfc->text_box_store)); + scene_manager_set_scene_state(nfc->scene_manager, NfcSceneMfDesfireApp, state | 1); + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox); + consumed = true; } - text_box_set_text(text_box, string_get_cstr(nfc->text_box_store)); - scene_manager_set_scene_state(nfc->scene_manager, NfcSceneMfDesfireApp, state | 1); - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox); - consumed = true; } else if(event.type == SceneManagerEventTypeBack) { if(state & 1) { view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); @@ -108,6 +118,7 @@ void nfc_scene_mf_desfire_app_on_exit(void* context) { Nfc* nfc = context; // Clear views + popup_reset(nfc->popup); text_box_reset(nfc->text_box); string_reset(nfc->text_box_store); submenu_reset(nfc->submenu); diff --git a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_read_auth.c b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_read_auth.c index 1a106bdb4..25008004b 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_read_auth.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_read_auth.c @@ -27,7 +27,7 @@ void nfc_scene_mf_ultralight_read_auth_set_state(Nfc* nfc, NfcSceneMfUlReadState popup_reset(nfc->popup); popup_set_text( nfc->popup, "Apply card to\nFlipper's back", 97, 24, AlignCenter, AlignTop); - popup_set_icon(nfc->popup, 0, 8, &I_NFC_manual); + popup_set_icon(nfc->popup, 0, 8, &I_NFC_manual_60x50); } else if(state == NfcSceneMfUlReadStateReading) { popup_reset(nfc->popup); popup_set_header( diff --git a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_read_success.c b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_read_success.c index 56fa20578..f6dc5984e 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_read_success.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_read_success.c @@ -34,15 +34,19 @@ void nfc_scene_mf_ultralight_read_success_on_enter(void* context) { nfc); string_t temp_str; - string_init_printf(temp_str, "\e#%s\n", nfc_mf_ul_type(mf_ul_data->type, true)); - string_cat_printf(temp_str, "UID:"); - for(size_t i = 0; i < data->uid_len; i++) { - string_cat_printf(temp_str, " %02X", data->uid[i]); - } - string_cat_printf( - temp_str, "\nPages Read: %d/%d", mf_ul_data->data_read / 4, mf_ul_data->data_size / 4); - if(mf_ul_data->data_read != mf_ul_data->data_size) { - string_cat_printf(temp_str, "\nPassword-protected pages!"); + if(string_size(nfc->dev->dev_data.parsed_data)) { + string_init_set(temp_str, nfc->dev->dev_data.parsed_data); + } else { + string_init_printf(temp_str, "\e#%s\n", nfc_mf_ul_type(mf_ul_data->type, true)); + string_cat_printf(temp_str, "UID:"); + for(size_t i = 0; i < data->uid_len; i++) { + string_cat_printf(temp_str, " %02X", data->uid[i]); + } + string_cat_printf( + temp_str, "\nPages Read: %d/%d", mf_ul_data->data_read / 4, mf_ul_data->data_size / 4); + if(mf_ul_data->data_read != mf_ul_data->data_size) { + string_cat_printf(temp_str, "\nPassword-protected pages!"); + } } widget_add_text_scroll_element(widget, 0, 0, 128, 52, string_get_cstr(temp_str)); string_clear(temp_str); diff --git a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_menu.c b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_menu.c index 13e3af3eb..3d5ecca24 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_menu.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_menu.c @@ -20,7 +20,7 @@ void nfc_scene_mf_ultralight_unlock_menu_on_enter(void* context) { scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfUltralightUnlockMenu); submenu_add_item( submenu, - "Enter Password Manually", + "Enter PWD Manually", SubmenuIndexMfUlUnlockMenuManual, nfc_scene_mf_ultralight_unlock_menu_submenu_callback, nfc); diff --git a/applications/main/nfc/scenes/nfc_scene_read.c b/applications/main/nfc/scenes/nfc_scene_read.c index da21b9f3d..e6df476f0 100644 --- a/applications/main/nfc/scenes/nfc_scene_read.c +++ b/applications/main/nfc/scenes/nfc_scene_read.c @@ -26,7 +26,7 @@ void nfc_scene_read_set_state(Nfc* nfc, NfcSceneReadState state) { popup_reset(nfc->popup); popup_set_text( nfc->popup, "Apply card to\nFlipper's back", 97, 24, AlignCenter, AlignTop); - popup_set_icon(nfc->popup, 0, 8, &I_NFC_manual); + popup_set_icon(nfc->popup, 0, 8, &I_NFC_manual_60x50); } else if(state == NfcSceneReadStateReading) { popup_reset(nfc->popup); popup_set_header( diff --git a/applications/main/nfc/scenes/nfc_scene_restore_original_confirm.c b/applications/main/nfc/scenes/nfc_scene_restore_original_confirm.c index 2c12749df..730dd41e8 100644 --- a/applications/main/nfc/scenes/nfc_scene_restore_original_confirm.c +++ b/applications/main/nfc/scenes/nfc_scene_restore_original_confirm.c @@ -11,7 +11,7 @@ void nfc_scene_restore_original_confirm_on_enter(void* context) { DialogEx* dialog_ex = nfc->dialog_ex; dialog_ex_set_header(dialog_ex, "Restore Card Data?", 64, 0, AlignCenter, AlignTop); - dialog_ex_set_icon(dialog_ex, 5, 15, &I_Restoring); + dialog_ex_set_icon(dialog_ex, 5, 15, &I_Restoring_38x32); dialog_ex_set_text( dialog_ex, "It will be returned\nto its original state.", 47, 21, AlignLeft, AlignTop); dialog_ex_set_left_button_text(dialog_ex, "Cancel"); diff --git a/applications/main/nfc/scenes/nfc_scene_save_success.c b/applications/main/nfc/scenes/nfc_scene_save_success.c index a3b17451f..dcd2519f1 100644 --- a/applications/main/nfc/scenes/nfc_scene_save_success.c +++ b/applications/main/nfc/scenes/nfc_scene_save_success.c @@ -27,7 +27,10 @@ bool nfc_scene_save_success_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == NfcCustomEventViewExit) { - if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) { + if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneMfClassicKeys)) { + consumed = scene_manager_search_and_switch_to_previous_scene( + nfc->scene_manager, NfcSceneMfClassicKeys); + } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) { consumed = scene_manager_search_and_switch_to_previous_scene( nfc->scene_manager, NfcSceneSavedMenu); } else { diff --git a/applications/main/nfc/scenes/nfc_scene_saved_menu.c b/applications/main/nfc/scenes/nfc_scene_saved_menu.c index c7aec5d87..c1043b3a7 100644 --- a/applications/main/nfc/scenes/nfc_scene_saved_menu.c +++ b/applications/main/nfc/scenes/nfc_scene_saved_menu.c @@ -91,7 +91,9 @@ bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { bool application_info_present = false; if(dev_data->protocol == NfcDeviceProtocolEMV) { application_info_present = true; - } else if(dev_data->protocol == NfcDeviceProtocolMifareClassic) { + } else if( + dev_data->protocol == NfcDeviceProtocolMifareClassic || + dev_data->protocol == NfcDeviceProtocolMifareUl) { application_info_present = nfc_supported_card_verify_and_parse(dev_data); } diff --git a/applications/main/subghz/scenes/subghz_scene_decode_raw.c b/applications/main/subghz/scenes/subghz_scene_decode_raw.c index 4c7ffd05f..7593d3aec 100644 --- a/applications/main/subghz/scenes/subghz_scene_decode_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_decode_raw.c @@ -181,7 +181,7 @@ void subghz_scene_decode_raw_on_enter(void* context) { subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), false); subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); - + if(decode_raw_state == SubGhzDecodeRawStateStart) { //Decode RAW to history subghz_history_reset(subghz->txrx->history); @@ -225,6 +225,8 @@ bool subghz_scene_decode_raw_on_event(void* context, SceneManagerEvent event) { subghz_file_encoder_worker_free(file_worker_encoder); subghz->state_notifications = SubGhzNotificationStateIDLE; + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet); scene_manager_search_and_switch_to_previous_scene( subghz->scene_manager, SubGhzSceneMoreRAW); consumed = true; diff --git a/applications/main/subghz/scenes/subghz_scene_need_saving.c b/applications/main/subghz/scenes/subghz_scene_need_saving.c index 1fa81b09a..53bffedc8 100644 --- a/applications/main/subghz/scenes/subghz_scene_need_saving.c +++ b/applications/main/subghz/scenes/subghz_scene_need_saving.c @@ -50,8 +50,8 @@ bool subghz_scene_need_saving_on_event(void* context, SceneManagerEvent event) { subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; subghz_preset_init( subghz, - string_get_cstr(subghz->last_setting->preset_name), - subghz->last_setting->frequency, + "AM650", + subghz_setting_get_default_frequency(subghz->setting), NULL, 0); scene_manager_search_and_switch_to_previous_scene( diff --git a/applications/main/subghz/scenes/subghz_scene_read_raw.c b/applications/main/subghz/scenes/subghz_scene_read_raw.c index 86c9d88e5..60783b060 100644 --- a/applications/main/subghz/scenes/subghz_scene_read_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_read_raw.c @@ -113,12 +113,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case SubGhzCustomEventViewReadRAWBack: - // Check if return from config save values - if(subghz->current_scene == SubGhzSceneReceiverConfig) { - //FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); - subghz_last_setting_save( - subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt")); - } //Stop TX if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) { subghz_tx_stop(subghz); @@ -137,14 +131,13 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { if((subghz->txrx->rx_key_state == SubGhzRxKeyStateAddKey) || (subghz->txrx->rx_key_state == SubGhzRxKeyStateBack)) { subghz->txrx->rx_key_state = SubGhzRxKeyStateExit; - subghz->current_scene = SubGhzSceneNeedSaving; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving); } else { //Restore default setting subghz_preset_init( subghz, - string_get_cstr(subghz->last_setting->preset_name), - subghz->last_setting->frequency, + "AM650", + subghz_setting_get_default_frequency(subghz->setting), NULL, 0); if(!scene_manager_search_and_switch_to_previous_scene( @@ -153,11 +146,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { subghz->scene_manager, SubGhzSceneStart)) { scene_manager_stop(subghz->scene_manager); view_dispatcher_stop(subghz->view_dispatcher); - } else { - subghz->current_scene = SubGhzSceneStart; } - } else { - subghz->current_scene = SubGhzSceneSaved; } } consumed = true; @@ -181,8 +170,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { case SubGhzCustomEventViewReadRAWConfig: scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet); - subghz->current_scene = SubGhzSceneReceiverConfig; - //FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig); consumed = true; break; @@ -204,7 +191,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet); subghz->txrx->rx_key_state = SubGhzRxKeyStateRAWLoad; - subghz->current_scene = SubGhzSceneMoreRAW; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneMoreRAW); consumed = true; } else { @@ -224,7 +210,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) { subghz->txrx->rx_key_state = SubGhzRxKeyStateBack; - subghz->current_scene = SubGhzSceneShowOnlyRx; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); } else { DOLPHIN_DEED(DolphinDeedSubGhzSend); @@ -284,7 +269,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { case SubGhzCustomEventViewReadRAWREC: if(subghz->txrx->rx_key_state != SubGhzRxKeyStateIDLE) { - subghz->current_scene = SubGhzSceneNeedSaving; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving); } else { //subghz_get_preset_name(subghz, subghz->error_str); @@ -305,7 +289,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { subghz->txrx->rx_key_state = SubGhzRxKeyStateAddKey; } else { string_set_str(subghz->error_str, "Function requires\nan SD card."); - subghz->current_scene = SubGhzSceneShowError; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); } } @@ -317,7 +300,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSetRAW); subghz->txrx->rx_key_state = SubGhzRxKeyStateBack; - subghz->current_scene = SubGhzSceneSaveName; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); } consumed = true; diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index 2d0fcd861..a58777d15 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -1,8 +1,6 @@ #include "../subghz_i.h" #include "../views/receiver.h" -#define TAG "SubGhzSceneReceiver" - const NotificationSequence subghz_sequence_rx = { &message_green_255, @@ -100,18 +98,12 @@ static void subghz_scene_add_to_history_callback( void subghz_scene_receiver_on_enter(void* context) { SubGhz* subghz = context; - subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver); - string_t str_buff; string_init(str_buff); if(subghz->txrx->rx_key_state == SubGhzRxKeyStateIDLE) { subghz_preset_init( - subghz, - string_get_cstr(subghz->last_setting->preset_name), - subghz->last_setting->frequency, - NULL, - 0); + subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0); subghz_history_reset(subghz->txrx->history); subghz->txrx->rx_key_state = SubGhzRxKeyStateStart; } @@ -143,8 +135,6 @@ void subghz_scene_receiver_on_enter(void* context) { } if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { - // Set values that can be reset after using DetectRAW Scene - subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver); subghz_begin( subghz, subghz_setting_get_preset_data_by_name( @@ -162,12 +152,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case SubGhzCustomEventViewReceiverBack: - // Check if return from config save values - if(subghz->current_scene == SubGhzSceneReceiverConfig) { - //FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); - subghz_last_setting_save( - subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt")); - } // Stop CC1101 Rx subghz->state_notifications = SubGhzNotificationStateIDLE; if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) { @@ -180,17 +164,15 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { if(subghz->txrx->rx_key_state == SubGhzRxKeyStateAddKey) { subghz->txrx->rx_key_state = SubGhzRxKeyStateExit; - subghz->current_scene = SubGhzSceneNeedSaving; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving); } else { subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; subghz_preset_init( subghz, - string_get_cstr(subghz->last_setting->preset_name), - subghz->last_setting->frequency, + "AM650", + subghz_setting_get_default_frequency(subghz->setting), NULL, 0); - subghz->current_scene = SubGhzSceneStart; scene_manager_search_and_switch_to_previous_scene( subghz->scene_manager, SubGhzSceneStart); } @@ -199,7 +181,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { case SubGhzCustomEventViewReceiverOK: subghz->txrx->idx_menu_chosen = subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); - subghz->current_scene = SubGhzSceneReceiverInfo; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverInfo); consumed = true; break; @@ -207,10 +188,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { subghz->state_notifications = SubGhzNotificationStateIDLE; subghz->txrx->idx_menu_chosen = subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzViewIdReceiver, SubGhzCustomEventManagerSet); - subghz->current_scene = SubGhzSceneReceiverConfig; - //FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig); consumed = true; break; @@ -250,8 +227,5 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { } void subghz_scene_receiver_on_exit(void* context) { - SubGhz* subghz = context; - - //filter restoration - subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); + UNUSED(context); } diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index d5fc9fd75..d565666a1 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -2,8 +2,6 @@ #include -#define TAG "SubGhzSceneReceiverConfig" - enum SubGhzSettingIndex { SubGhzSettingIndexFrequency, SubGhzSettingIndexHopping, @@ -147,8 +145,6 @@ static void subghz_scene_receiver_config_set_frequency(VariableItem* item) { (subghz_setting_get_frequency(subghz->setting, index) % 1000000) / 10000); variable_item_set_current_value_text(item, text_buf); subghz->txrx->preset->frequency = subghz_setting_get_frequency(subghz->setting, index); - subghz->last_setting->frequency = subghz->txrx->preset->frequency; - subghz_setting_set_default_frequency(subghz->setting, subghz->txrx->preset->frequency); } else { variable_item_set_current_value_index( item, subghz_setting_get_frequency_default_index(subghz->setting)); @@ -158,13 +154,11 @@ static void subghz_scene_receiver_config_set_frequency(VariableItem* item) { static void subghz_scene_receiver_config_set_preset(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); - const char* preset_name = subghz_setting_get_preset_name(subghz->setting, index); - variable_item_set_current_value_text(item, preset_name); - string_set_str(subghz->last_setting->preset_name, preset_name); - + variable_item_set_current_value_text( + item, subghz_setting_get_preset_name(subghz->setting, index)); subghz_preset_init( subghz, - preset_name, + subghz_setting_get_preset_name(subghz->setting, index), subghz->txrx->preset->frequency, subghz_setting_get_preset_data(subghz->setting, index), subghz_setting_get_preset_data_size(subghz->setting, index)); @@ -179,7 +173,6 @@ static void subghz_scene_receiver_config_set_rssi_threshold(VariableItem* item) subghz_receiver_search_decoder_base_by_name( subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), rssi_threshold_value[index]); - subghz->last_setting->rssi_threshold = rssi_threshold_value[index]; } static void subghz_scene_receiver_config_set_detect_raw(VariableItem* item) { @@ -188,7 +181,6 @@ static void subghz_scene_receiver_config_set_detect_raw(VariableItem* item) { variable_item_set_current_value_text(item, detect_raw_text[index]); subghz_receiver_set_filter(subghz->txrx->receiver, detect_raw_value[index]); - subghz->last_setting->detect_raw = detect_raw_value[index]; subghz_protocol_decoder_raw_set_auto_mode( subghz_receiver_search_decoder_base_by_name( @@ -230,7 +222,6 @@ static void subghz_scene_receiver_config_set_hopping_running(VariableItem* item) } subghz->txrx->hopper_state = hopping_value[index]; - subghz->last_setting->hopping = hopping_value[index]; } static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) { @@ -244,9 +235,6 @@ static void subghz_scene_receiver_config_var_list_enter_callback(void* context, void subghz_scene_receiver_config_on_enter(void* context) { SubGhz* subghz = context; - - subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver); - VariableItem* item; uint8_t value_index; @@ -270,6 +258,20 @@ void subghz_scene_receiver_config_on_enter(void* context) { (subghz_setting_get_frequency(subghz->setting, value_index) % 1000000) / 10000); variable_item_set_current_value_text(item, text_buf); + if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != + SubGhzCustomEventManagerSet) { + item = variable_item_list_add( + subghz->variable_item_list, + "Hopping:", + HOPPING_COUNT, + subghz_scene_receiver_config_set_hopping_running, + subghz); + value_index = subghz_scene_receiver_config_hopper_value_index( + subghz->txrx->hopper_state, hopping_value, HOPPING_COUNT, subghz); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, hopping_text[value_index]); + } + item = variable_item_list_add( subghz->variable_item_list, "Modulation:", @@ -284,17 +286,6 @@ void subghz_scene_receiver_config_on_enter(void* context) { if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != SubGhzCustomEventManagerSet) { - item = variable_item_list_add( - subghz->variable_item_list, - "Hopping:", - HOPPING_COUNT, - subghz_scene_receiver_config_set_hopping_running, - subghz); - value_index = subghz_scene_receiver_config_hopper_value_index( - subghz->txrx->hopper_state, hopping_value, HOPPING_COUNT, subghz); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, hopping_text[value_index]); - item = variable_item_list_add( subghz->variable_item_list, "Detect Raw:", @@ -307,7 +298,10 @@ void subghz_scene_receiver_config_on_enter(void* context) { DETECT_RAW_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, detect_raw_text[value_index]); + } + if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != + SubGhzCustomEventManagerSet) { item = variable_item_list_add( subghz->variable_item_list, "RSSI for Raw:", @@ -321,7 +315,10 @@ void subghz_scene_receiver_config_on_enter(void* context) { RSSI_THRESHOLD_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, rssi_threshold_text[value_index]); + } + if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != + SubGhzCustomEventManagerSet) { variable_item_list_add(subghz->variable_item_list, "Lock Keyboard", 1, NULL, NULL); variable_item_list_set_enter_callback( subghz->variable_item_list, @@ -348,6 +345,7 @@ bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent even void subghz_scene_receiver_config_on_exit(void* context) { SubGhz* subghz = context; + variable_item_list_set_selected_item(subghz->variable_item_list, 0); variable_item_list_reset(subghz->variable_item_list); scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet); diff --git a/applications/main/subghz/scenes/subghz_scene_save_name.c b/applications/main/subghz/scenes/subghz_scene_save_name.c index 662ff3d69..4b779228d 100644 --- a/applications/main/subghz/scenes/subghz_scene_save_name.c +++ b/applications/main/subghz/scenes/subghz_scene_save_name.c @@ -14,6 +14,22 @@ void subghz_scene_save_name_text_input_callback(void* context) { view_dispatcher_send_custom_event(subghz->view_dispatcher, SubGhzCustomEventSceneSaveName); } +void subghz_scene_save_name_get_timefilename(string_t name, uint32_t frequency) { + FuriHalRtcDateTime datetime = {0}; + furi_hal_rtc_get_datetime(&datetime); + string_printf( + name, + "RAW_%.4d.%.2d.%.2d-%.2d.%.2d.%.2d-%d.%.2dMHz", + datetime.year, + datetime.month, + datetime.day, + datetime.hour, + datetime.minute, + datetime.second, + frequency / 1000000, + (frequency / 10000) % 100); +} + void subghz_scene_save_name_on_enter(void* context) { SubGhz* subghz = context; @@ -42,9 +58,9 @@ void subghz_scene_save_name_on_enter(void* context) { if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) == SubGhzCustomEventManagerSetRAW) { dev_name_empty = true; - subghz_get_next_name_file(subghz, SUBGHZ_MAX_LEN_NAME); + subghz_scene_save_name_get_timefilename( + file_name, subghz->txrx->preset->frequency); } - path_extract_filename(subghz->file_path, file_name, true); } string_set(subghz->file_path, dir_name); } diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index f37ccae9e..35c7ecb9c 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -1,5 +1,7 @@ #include "../subghz_i.h" +#include + enum SubmenuIndex { SubmenuIndexRead = 10, SubmenuIndexSaved, @@ -19,6 +21,12 @@ void subghz_scene_start_on_enter(void* context) { if(subghz->state_notifications == SubGhzNotificationStateStarting) { subghz->state_notifications = SubGhzNotificationStateIDLE; } + subghz_protocol_decoder_raw_set_auto_mode( + subghz_receiver_search_decoder_base_by_name( + subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), + false); + subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); + submenu_add_item( subghz->submenu, "Read", SubmenuIndexRead, subghz_scene_start_submenu_callback, subghz); submenu_add_item( diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index 84c775c3a..08de91f91 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -174,25 +174,16 @@ SubGhz* subghz_alloc() { subghz->setting = subghz_setting_alloc(); subghz_setting_load(subghz->setting, EXT_PATH("subghz/assets/setting_user")); - // Load last used values for Read, Read RAW, etc. or default - subghz->last_setting = subghz_last_setting_alloc(); - subghz_last_setting_load(subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt")); - subghz_setting_set_default_frequency(subghz->setting, subghz->last_setting->frequency); - //init Worker & Protocol & History & KeyBoard subghz->lock = SubGhzLockOff; subghz->txrx = malloc(sizeof(SubGhzTxRx)); subghz->txrx->preset = malloc(sizeof(SubGhzPresetDefinition)); string_init(subghz->txrx->preset->name); subghz_preset_init( - subghz, - string_get_cstr(subghz->last_setting->preset_name), - subghz->last_setting->frequency, - NULL, - 0); + subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0); subghz->txrx->txrx_state = SubGhzTxRxStateSleep; - subghz->txrx->hopper_state = subghz->last_setting->hopping; + subghz->txrx->hopper_state = SubGhzHopperStateOFF; subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; subghz->txrx->history = subghz_history_alloc(); subghz->txrx->worker = subghz_worker_alloc(); @@ -205,8 +196,6 @@ SubGhz* subghz_alloc() { subghz_environment_set_nice_flor_s_rainbow_table_file_name( subghz->txrx->environment, EXT_PATH("subghz/assets/nice_flor_s")); subghz->txrx->receiver = subghz_receiver_alloc_init(subghz->txrx->environment); - - // Setup values subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); subghz_worker_set_overrun_callback( @@ -299,9 +288,6 @@ void subghz_free(SubGhz* subghz) { //setting subghz_setting_free(subghz->setting); - // Last setting - subghz_last_setting_free(subghz->last_setting); - //Worker & Protocol & History subghz_receiver_free(subghz->txrx->receiver); subghz_environment_free(subghz->txrx->environment); diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index a4906eb73..0af8c0a15 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -1,5 +1,7 @@ #include "subghz_history.h" #include +#include +#include #define SUBGHZ_HISTORY_MAX 65 #define TAG "SubGhzHistory" @@ -37,9 +39,15 @@ SubGhzHistory* subghz_history_alloc(void) { void subghz_history_free(SubGhzHistory* instance) { furi_assert(instance); - - // Call method instead of code duplicate - subghz_history_reset(instance); + string_clear(instance->tmp_string); + for + M_EACH(item, instance->history->data, SubGhzHistoryItemArray_t) { + string_clear(item->item_str); + string_clear(item->preset->name); + free(item->preset); + flipper_format_free(item->flipper_string); + item->type = 0; + } SubGhzHistoryItemArray_clear(instance->history->data); free(instance->history); free(instance); @@ -133,22 +141,16 @@ bool subghz_history_add_to_history( furi_assert(instance); furi_assert(context); - if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) { - FURI_LOG_W(TAG, "Out of history slots!"); - return false; - } + if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) return false; SubGhzProtocolDecoderBase* decoder_base = context; if((instance->code_last_hash_data == subghz_protocol_decoder_base_get_hash_data(decoder_base)) && ((furi_get_tick() - instance->last_update_timestamp) < 500)) { - //FURI_LOG_W(TAG, "Too short period for add"); instance->last_update_timestamp = furi_get_tick(); return false; } - //FURI_LOG_I(TAG, "Add to history. Total: %d", instance->last_index_write + 1); - instance->code_last_hash_data = subghz_protocol_decoder_base_get_hash_data(decoder_base); instance->last_update_timestamp = furi_get_tick(); diff --git a/applications/main/subghz/subghz_i.h b/applications/main/subghz/subghz_i.h index 16c3838c5..945228a45 100644 --- a/applications/main/subghz/subghz_i.h +++ b/applications/main/subghz/subghz_i.h @@ -33,7 +33,6 @@ #include "subghz_history.h" #include "subghz_setting.h" -#include "subghz_last_setting.h" #include #include @@ -101,11 +100,10 @@ struct SubGhz { SubGhzTestPacket* subghz_test_packet; string_t error_str; SubGhzSetting* setting; - SubGhzLastSetting* last_setting; SubGhzLock lock; bool in_decoder_scene; - SubGhzScene current_scene; + void* rpc_ctx; }; diff --git a/applications/main/subghz/subghz_last_setting.c b/applications/main/subghz/subghz_last_setting.c deleted file mode 100644 index 82ddb26d8..000000000 --- a/applications/main/subghz/subghz_last_setting.c +++ /dev/null @@ -1,140 +0,0 @@ -#include "subghz_setting.h" -#include "subghz_i.h" -#include "subghz_last_setting.h" - -#include -#include -#include -#include -#include - -#define TAG "SubGhzLastSetting" - -#define SUBGHZ_LAST_SETTING_FILE_TYPE "Flipper SubGhz Last Setting File" -#define SUBGHZ_LAST_SETTING_FILE_VERSION 1 -#define SUBGHZ_LAST_SETTING_DEFAULT_PRESET "AM650" -#define SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY 433920000 - -SubGhzLastSetting* subghz_last_setting_alloc(void) { - SubGhzLastSetting* instance = malloc(sizeof(SubGhzLastSetting)); - string_init(instance->preset_name); - - return instance; -} - -void subghz_last_setting_free(SubGhzLastSetting* instance) { - furi_assert(instance); - - string_clear(instance->preset_name); - free(instance); -} - -void subghz_last_setting_load(SubGhzLastSetting* instance, const char* file_path) { - furi_assert(instance); - string_init(instance->preset_name); - - Storage* storage = furi_record_open(RECORD_STORAGE); - FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); - - string_t temp_preset; - string_init(temp_preset); - uint32_t temp_frequency = 0; // Default 433920000 - uint32_t temp_hopping = 0; // Default 0 - uint32_t temp_detect_raw = 0; // Default 2 - int32_t temp_rssi_threshold = 0; // Default -72 - - if(FSE_OK == storage_sd_status(storage) && file_path && - flipper_format_file_open_existing(fff_data_file, file_path)) { - flipper_format_read_string(fff_data_file, "Preset", temp_preset); - flipper_format_read_uint32(fff_data_file, "Frequency", (uint32_t*)&temp_frequency, 1); - flipper_format_read_uint32(fff_data_file, "Hopping", (uint32_t*)&temp_hopping, 1); - flipper_format_read_uint32(fff_data_file, "DetectRaw", (uint32_t*)&temp_detect_raw, 1); - flipper_format_read_int32(fff_data_file, "Rssi", (int32_t*)&temp_rssi_threshold, 1); - } else { - FURI_LOG_E(TAG, "Error open file %s", file_path); - } - - if(string_empty_p(temp_preset)) { - FURI_LOG_D(TAG, "Last used preset not found"); - string_set(instance->preset_name, SUBGHZ_LAST_SETTING_DEFAULT_PRESET); - } else { - string_set(instance->preset_name, temp_preset); - } - - if(temp_frequency == 0 || !furi_hal_subghz_is_tx_allowed(temp_frequency)) { - FURI_LOG_D(TAG, "Last used frequency not found or can't be used!"); - instance->frequency = SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY; - } else { - instance->frequency = temp_frequency; - } - - if(temp_detect_raw == 0) { - instance->detect_raw = SubGhzProtocolFlag_Decodable; - } else { - instance->detect_raw = temp_detect_raw; - } - - if(temp_rssi_threshold == 0) { - instance->rssi_threshold = -72; - } else { - instance->rssi_threshold = temp_rssi_threshold; - } - instance->hopping = temp_hopping; - - string_clear(temp_preset); - flipper_format_free(fff_data_file); - furi_record_close(RECORD_STORAGE); -} - -bool subghz_last_setting_save(SubGhzLastSetting* instance, const char* file_path) { - furi_assert(instance); - - bool saved = false; - Storage* storage = furi_record_open(RECORD_STORAGE); - FlipperFormat* file = flipper_format_file_alloc(storage); - - do { - if(FSE_OK != storage_sd_status(storage)) break; - - // Open file - if(!flipper_format_file_open_always(file, file_path)) break; - - // Write header - if(!flipper_format_write_header_cstr( - file, SUBGHZ_LAST_SETTING_FILE_TYPE, SUBGHZ_LAST_SETTING_FILE_VERSION)) - break; - - //FURI_LOG_D(TAG, "Preset %s", string_get_cstr(instance->preset_name)); - if(!flipper_format_insert_or_update_string_cstr( - file, "Preset", string_get_cstr(instance->preset_name))) - break; - if(!flipper_format_insert_or_update_uint32(file, "Frequency", &instance->frequency, 1)) - break; - if(!flipper_format_insert_or_update_uint32(file, "Hopping", &instance->hopping, 1)) break; - if(!flipper_format_insert_or_update_uint32(file, "DetectRaw", &instance->detect_raw, 1)) - break; - if(!flipper_format_insert_or_update_int32(file, "Rssi", &instance->rssi_threshold, 1)) - break; - - saved = true; - } while(0); - - if(!saved) { - FURI_LOG_E(TAG, "Error save file %s", file_path); - } - - flipper_format_free(file); - furi_record_close(RECORD_STORAGE); - - return saved; -} - -void subghz_last_setting_set_receiver_values(SubGhzLastSetting* instance, SubGhzReceiver* receiver) { - SubGhzProtocolDecoderBase* protocolDecoderBase = - subghz_receiver_search_decoder_base_by_name(receiver, SUBGHZ_PROTOCOL_RAW_NAME); - - subghz_receiver_set_filter(receiver, instance->detect_raw); - subghz_protocol_decoder_raw_set_auto_mode( - protocolDecoderBase, (instance->detect_raw != SubGhzProtocolFlag_Decodable)); - subghz_protocol_decoder_raw_set_rssi_threshold(protocolDecoderBase, instance->rssi_threshold); -} \ No newline at end of file diff --git a/applications/main/subghz/subghz_last_setting.h b/applications/main/subghz/subghz_last_setting.h deleted file mode 100644 index 2c20944be..000000000 --- a/applications/main/subghz/subghz_last_setting.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -typedef struct { - string_t preset_name; - uint32_t frequency; - uint32_t hopping; - uint32_t detect_raw; - int32_t rssi_threshold; -} SubGhzLastSetting; - -SubGhzLastSetting* subghz_last_setting_alloc(void); - -void subghz_last_setting_free(SubGhzLastSetting* instance); - -void subghz_last_setting_load(SubGhzLastSetting* instance, const char* file_path); - -bool subghz_last_setting_save(SubGhzLastSetting* instance, const char* file_path); - -void subghz_last_setting_set_receiver_values(SubGhzLastSetting* instance, SubGhzReceiver* receiver); \ No newline at end of file diff --git a/applications/main/subghz/subghz_setting.c b/applications/main/subghz/subghz_setting.c index b065f4ab3..b8f3794eb 100644 --- a/applications/main/subghz/subghz_setting.c +++ b/applications/main/subghz/subghz_setting.c @@ -260,7 +260,13 @@ void subghz_setting_load(SubGhzSetting* instance, const char* file_path) { break; } if(flipper_format_read_uint32(fff_data_file, "Default_frequency", &temp_data32, 1)) { - subghz_setting_set_default_frequency(instance, temp_data32); + for + M_EACH(frequency, instance->frequencies, FrequencyList_t) { + *frequency &= FREQUENCY_MASK; + if(*frequency == temp_data32) { + *frequency |= FREQUENCY_FLAG_DEFAULT; + } + } } // custom preset (optional) @@ -288,16 +294,6 @@ void subghz_setting_load(SubGhzSetting* instance, const char* file_path) { } } -void subghz_setting_set_default_frequency(SubGhzSetting* instance, uint32_t frequency_to_setup) { - for - M_EACH(frequency, instance->frequencies, FrequencyList_t) { - *frequency &= FREQUENCY_MASK; - if(*frequency == frequency_to_setup) { - *frequency |= FREQUENCY_FLAG_DEFAULT; - } - } -} - size_t subghz_setting_get_frequency_count(SubGhzSetting* instance) { furi_assert(instance); return FrequencyList_size(instance->frequencies); diff --git a/applications/main/subghz/subghz_setting.h b/applications/main/subghz/subghz_setting.h index 2f3d6eb36..0590cf499 100644 --- a/applications/main/subghz/subghz_setting.h +++ b/applications/main/subghz/subghz_setting.h @@ -46,5 +46,3 @@ uint32_t subghz_setting_get_hopper_frequency(SubGhzSetting* instance, size_t idx uint32_t subghz_setting_get_frequency_default_index(SubGhzSetting* instance); uint32_t subghz_setting_get_default_frequency(SubGhzSetting* instance); - -void subghz_setting_set_default_frequency(SubGhzSetting* instance, uint32_t frequency_to_setup); \ No newline at end of file diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index dd141084a..5736ceb7a 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -340,7 +340,6 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) { return true; }); } else if(event->key == InputKeyLeft && event->type == InputTypeShort) { - //Config receiver subghz_receiver->callback(SubGhzCustomEventViewReceiverConfig, subghz_receiver->context); } else if(event->key == InputKeyOk && event->type == InputTypeShort) { with_view_model( diff --git a/applications/main/subghz/views/transmitter.c b/applications/main/subghz/views/transmitter.c index be9c0fe09..2055180a6 100644 --- a/applications/main/subghz/views/transmitter.c +++ b/applications/main/subghz/views/transmitter.c @@ -45,7 +45,7 @@ void subghz_view_transmitter_add_data_to_show( } static void subghz_view_transmitter_button_right(Canvas* canvas, const char* str) { - const uint8_t button_height = 13; + const uint8_t button_height = 12; const uint8_t vertical_offset = 3; const uint8_t horizontal_offset = 1; const uint8_t string_width = canvas_string_width(canvas, str); @@ -69,7 +69,10 @@ static void subghz_view_transmitter_button_right(Canvas* canvas, const char* str canvas_invert_color(canvas); canvas_draw_icon( - canvas, x + horizontal_offset, y - button_height + vertical_offset, &I_ButtonCenter_7x7); + canvas, + x + horizontal_offset, + y - button_height + vertical_offset - 1, + &I_ButtonCenter_7x7); canvas_draw_str( canvas, x + horizontal_offset + icon_width_with_offset, y - vertical_offset, str); canvas_invert_color(canvas); diff --git a/applications/main/unirfremix/unirfremix_app.c b/applications/main/unirfremix/unirfremix_app.c index 08bb5801f..7e6797fbd 100644 --- a/applications/main/unirfremix/unirfremix_app.c +++ b/applications/main/unirfremix/unirfremix_app.c @@ -790,7 +790,7 @@ static void render_callback(Canvas* canvas, void* ctx) { break; case 1: canvas_draw_icon(canvas, 113, 15, &I_Pin_cell_13x13); - canvas_draw_icon(canvas, 116, 17, &I_Pin_arrow_up7x9); + canvas_draw_icon(canvas, 116, 17, &I_Pin_arrow_up_7x9); break; case 2: canvas_draw_icon(canvas, 113, 15, &I_Pin_cell_13x13); @@ -845,6 +845,8 @@ void unirfremix_subghz_alloc(UniRFRemix* app) { UniRFRemix* unirfremix_alloc(void) { UniRFRemix* app = malloc(sizeof(UniRFRemix)); + furi_hal_power_suppress_charge_enter(); + app->model_mutex = furi_mutex_alloc(FuriMutexTypeNormal); app->input_queue = furi_message_queue_alloc(32, sizeof(InputEvent)); @@ -862,7 +864,9 @@ UniRFRemix* unirfremix_alloc(void) { return app; } -void unirfremix_free(UniRFRemix* app) { +void unirfremix_free(UniRFRemix* app, bool with_subghz) { + furi_hal_power_suppress_charge_exit(); + string_clear(app->up_file); string_clear(app->down_file); string_clear(app->left_file); @@ -888,10 +892,12 @@ void unirfremix_free(UniRFRemix* app) { furi_mutex_free(app->model_mutex); - furi_hal_subghz_sleep(); - subghz_setting_free(app->setting); - subghz_receiver_free(app->subghz_receiver); - subghz_environment_free(app->environment); + if(with_subghz) { + furi_hal_subghz_sleep(); + subghz_setting_free(app->setting); + subghz_receiver_free(app->subghz_receiver); + subghz_environment_free(app->environment); + } furi_record_close(RECORD_NOTIFICATION); app->notification = NULL; @@ -939,6 +945,8 @@ int32_t unirfremix_app(void* p) { furi_record_close(RECORD_DIALOGS); if(!res) { FURI_LOG_E(TAG, "No file selected"); + unirfremix_free(app, false); + return 255; } else { //check map and population variables unirfremix_cfg_set_check(app, app->file_path); @@ -970,8 +978,6 @@ int32_t unirfremix_app(void* p) { furi_mutex_release(app->model_mutex); view_port_update(app->view_port); - furi_hal_power_suppress_charge_enter(); - //input detect loop start InputEvent input; while(1) { @@ -1164,9 +1170,7 @@ int32_t unirfremix_app(void* p) { } // remove & free all stuff created by app - unirfremix_free(app); - - furi_hal_power_suppress_charge_exit(); + unirfremix_free(app, true); return 0; } \ No newline at end of file diff --git a/applications/plugins/bt_hid_app/views/bt_hid_keyboard.c b/applications/plugins/bt_hid_app/views/bt_hid_keyboard.c index 1088e2959..3617dc0f1 100644 --- a/applications/plugins/bt_hid_app/views/bt_hid_keyboard.c +++ b/applications/plugins/bt_hid_app/views/bt_hid_keyboard.c @@ -109,7 +109,7 @@ const BtHidKeyboardKey bt_hid_keyboard_keyset[ROW_COUNT][COLUMN_COUNT] = { {.width = 1, .icon = NULL, .key = "-", .shift_key = "_", .value = HID_KEYBOARD_MINUS}, }, { - {.width = 1, .icon = &I_Pin_arrow_up7x9, .value = HID_KEYBOARD_L_SHIFT}, + {.width = 1, .icon = &I_Pin_arrow_up_7x9, .value = HID_KEYBOARD_L_SHIFT}, {.width = 1, .icon = NULL, .key = ",", .shift_key = "<", .value = HID_KEYPAD_COMMA}, {.width = 1, .icon = NULL, .key = ".", .shift_key = ">", .value = HID_KEYBOARD_DOT}, {.width = 4, .icon = NULL, .key = " ", .value = HID_KEYBOARD_SPACEBAR}, diff --git a/applications/plugins/bt_hid_app/views/bt_hid_mouse.c b/applications/plugins/bt_hid_app/views/bt_hid_mouse.c index f9d84f9fb..395cb52c9 100644 --- a/applications/plugins/bt_hid_app/views/bt_hid_mouse.c +++ b/applications/plugins/bt_hid_app/views/bt_hid_mouse.c @@ -53,7 +53,7 @@ static void bt_hid_mouse_draw_callback(Canvas* canvas, void* context) { canvas_set_bitmap_mode(canvas, 0); canvas_set_color(canvas, ColorWhite); } - canvas_draw_icon(canvas, 84, 10, &I_Pin_arrow_up7x9); + canvas_draw_icon(canvas, 84, 10, &I_Pin_arrow_up_7x9); canvas_set_color(canvas, ColorBlack); // Down diff --git a/applications/plugins/flipfrid/README.md b/applications/plugins/flipfrid/README.md index 51ed2fa67..69fdb3e66 100644 --- a/applications/plugins/flipfrid/README.md +++ b/applications/plugins/flipfrid/README.md @@ -1,21 +1,35 @@ # Flipfrid -Basic EM4100 Fuzzer +Basic EM4100 and HIDProx Fuzzer. ## Why Flipfrid is a simple Rfid fuzzer using EM4100 protocol (125khz). Objective is to provide a simple to use fuzzer to test readers by emulating various cards. -EM4100 cards use a 1 byte customer id and 4 bytes card id. +- EM4100 cards use a 1 byte customer id and 4 bytes card id. +- HIDProx cards use a 2 byte customer id and 3 byte card id. ## How -There is 4 modes : -- Default key loop over 16 factory/default keys and emulate each one after one ; -- BF customer id. just an iteration from 0X00 to 0XFF on the first byte ; -- Load Dump file : Load an existing EM4100 dump generated by Flipperzero, select an index and bruteforce from 0X00 to 0XFF; -- Uids list: loop over a text file (one uid per line) +1) Select the Protocol with the left and right arrows +2) Select the Mode with the up and down arrows + +### Info + +There are 2 Protocols: +- EM4100 +- HIDProx + +There are 4 modes: +- Default Values: Try factory/default keys and emulate one after the other. +- BF customer id: An iteration from 0X00 to 0XFF on the first byte. +- Load Dump file: Load an existing dump (.rfid) generated by Flipperzero, select an index and bruteforce from 0X00 to 0XFF; +- Uids list: Iterate over an input text file (one uid per line) and emulate one after the other. + + + TODO : - blank screen on back press +- Add second byte test to `BF customer id` diff --git a/applications/plugins/flipfrid/flipfrid.c b/applications/plugins/flipfrid/flipfrid.c index 1dab3cae1..ba059ff7f 100644 --- a/applications/plugins/flipfrid/flipfrid.c +++ b/applications/plugins/flipfrid/flipfrid.c @@ -64,6 +64,7 @@ FlipFridState* flipfrid_alloc() { flipfrid->is_attacking = false; flipfrid->key_index = 0; flipfrid->menu_index = 0; + flipfrid->menu_proto_index = 0; flipfrid->attack = FlipFridAttackDefaultValues; flipfrid->notify = furi_record_open(RECORD_NOTIFICATION); @@ -73,12 +74,14 @@ FlipFridState* flipfrid_alloc() { flipfrid->data[2] = 0x00; flipfrid->data[3] = 0x00; flipfrid->data[4] = 0x00; + flipfrid->data[5] = 0x00; flipfrid->payload[0] = 0x00; flipfrid->payload[1] = 0x00; flipfrid->payload[2] = 0x00; flipfrid->payload[3] = 0x00; flipfrid->payload[4] = 0x00; + flipfrid->payload[5] = 0x00; //Dialog flipfrid->dialogs = furi_record_open(RECORD_DIALOGS); diff --git a/applications/plugins/flipfrid/flipfrid.h b/applications/plugins/flipfrid/flipfrid.h index 44756f26e..5417817e9 100644 --- a/applications/plugins/flipfrid/flipfrid.h +++ b/applications/plugins/flipfrid/flipfrid.h @@ -28,6 +28,11 @@ typedef enum { FlipFridAttackLoadFileCustomUids, } FlipFridAttacks; +typedef enum { + EM4100, + HIDProx, +} FlipFridProtos; + typedef enum { NoneScene, SceneEntryPoint, @@ -56,13 +61,16 @@ typedef struct { FlipFridScene previous_scene; NotificationApp* notify; u_int8_t menu_index; + u_int8_t menu_proto_index; string_t data_str; - uint8_t data[5]; - uint8_t payload[5]; + uint8_t data[6]; + uint8_t payload[6]; uint8_t attack_step; FlipFridAttacks attack; + FlipFridProtos proto; string_t attack_name; + string_t proto_name; DialogsApp* dialogs; string_t notification_msg; diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_entrypoint.c b/applications/plugins/flipfrid/scene/flipfrid_scene_entrypoint.c index f30bb8e1d..c709572e3 100644 --- a/applications/plugins/flipfrid/scene/flipfrid_scene_entrypoint.c +++ b/applications/plugins/flipfrid/scene/flipfrid_scene_entrypoint.c @@ -1,8 +1,12 @@ #include "flipfrid_scene_entrypoint.h" string_t menu_items[4]; +string_t menu_proto_items[2]; -void flipfrid_scene_entrypoint_menu_callback(FlipFridState* context, uint32_t index) { +void flipfrid_scene_entrypoint_menu_callback( + FlipFridState* context, + uint32_t index, + uint32_t proto_index) { switch(index) { case FlipFridAttackDefaultValues: context->attack = FlipFridAttackDefaultValues; @@ -27,6 +31,19 @@ void flipfrid_scene_entrypoint_menu_callback(FlipFridState* context, uint32_t in default: break; } + + switch(proto_index) { + case EM4100: + context->proto = EM4100; + string_set_str(context->proto_name, "EM4100"); + break; + case HIDProx: + context->proto = HIDProx; + string_set_str(context->proto_name, "HIDProx"); + break; + default: + break; + } } void flipfrid_scene_entrypoint_on_enter(FlipFridState* context) { @@ -36,6 +53,7 @@ void flipfrid_scene_entrypoint_on_enter(FlipFridState* context) { context->payload[2] = 0x00; context->payload[3] = 0x00; context->payload[4] = 0x00; + context->payload[5] = 0x00; context->menu_index = 0; for(uint32_t i = 0; i < 4; i++) { @@ -46,6 +64,14 @@ void flipfrid_scene_entrypoint_on_enter(FlipFridState* context) { string_set(menu_items[1], "BF Customer ID"); string_set(menu_items[2], "Load File"); string_set(menu_items[3], "Load uids from file"); + + context->menu_proto_index = 0; + for(uint32_t i = 0; i < 2; i++) { + string_init(menu_proto_items[i]); + } + + string_set(menu_proto_items[0], "EM4100"); + string_set(menu_proto_items[1], "HIDProx"); } void flipfrid_scene_entrypoint_on_exit(FlipFridState* context) { @@ -53,6 +79,10 @@ void flipfrid_scene_entrypoint_on_exit(FlipFridState* context) { for(uint32_t i = 0; i < 4; i++) { string_clear(menu_items[i]); } + + for(uint32_t i = 0; i < 2; i++) { + string_clear(menu_proto_items[i]); + } } void flipfrid_scene_entrypoint_on_tick(FlipFridState* context) { @@ -74,10 +104,18 @@ void flipfrid_scene_entrypoint_on_event(FlipFridEvent event, FlipFridState* cont } break; case InputKeyLeft: + if(context->menu_proto_index > EM4100) { + context->menu_proto_index--; + } + break; case InputKeyRight: + if(context->menu_proto_index < HIDProx) { + context->menu_proto_index++; + } break; case InputKeyOk: - flipfrid_scene_entrypoint_menu_callback(context, context->menu_index); + flipfrid_scene_entrypoint_menu_callback( + context, context->menu_index, context->menu_proto_index); break; case InputKeyBack: context->is_running = false; @@ -91,10 +129,6 @@ void flipfrid_scene_entrypoint_on_draw(Canvas* canvas, FlipFridState* context) { canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); - // Title - canvas_set_font(canvas, FontPrimary); - canvas_draw_str_aligned(canvas, 64, 6, AlignCenter, AlignTop, "RFID Fuzzer"); - if(context->menu_index > FlipFridAttackDefaultValues) { canvas_set_font(canvas, FontSecondary); canvas_draw_str_aligned( @@ -120,4 +154,41 @@ void flipfrid_scene_entrypoint_on_draw(Canvas* canvas, FlipFridState* context) { AlignTop, string_get_cstr(menu_items[context->menu_index + 1])); } + + if(context->menu_proto_index > EM4100) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned( + canvas, + 64, + -12, + AlignCenter, + AlignTop, + string_get_cstr(menu_proto_items[context->menu_proto_index - 1])); + } + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned(canvas, 34, 4, AlignCenter, AlignTop, "<"); + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned( + canvas, + 64, + 4, + AlignCenter, + AlignTop, + string_get_cstr(menu_proto_items[context->menu_proto_index])); + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned(canvas, 94, 4, AlignCenter, AlignTop, ">"); + + if(context->menu_proto_index < HIDProx) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned( + canvas, + 64, + -12, + AlignCenter, + AlignTop, + string_get_cstr(menu_proto_items[context->menu_proto_index + 1])); + } } \ No newline at end of file diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c b/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c index 072185ccf..687a861c9 100644 --- a/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c +++ b/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c @@ -36,11 +36,21 @@ bool flipfrid_load(FlipFridState* context, const char* file_path) { break; } else { FURI_LOG_I(TAG, "Key type: %s", string_get_cstr(temp_str)); - if(strcmp(string_get_cstr(temp_str), "EM4100") != 0) { - FURI_LOG_E(TAG, "Unsupported Key type"); - string_reset(context->notification_msg); - string_set_str(context->notification_msg, "Unsupported Key type"); - break; + + if(context->proto == EM4100) { + if(strcmp(string_get_cstr(temp_str), "EM4100") != 0) { + FURI_LOG_E(TAG, "Unsupported Key type"); + string_reset(context->notification_msg); + string_set_str(context->notification_msg, "Unsupported Key type"); + break; + } + } else { + if(strcmp(string_get_cstr(temp_str), "HIDProx") != 0) { + FURI_LOG_E(TAG, "Unsupported Key type"); + string_reset(context->notification_msg); + string_set_str(context->notification_msg, "Unsupported Key type"); + break; + } } } @@ -53,15 +63,24 @@ bool flipfrid_load(FlipFridState* context, const char* file_path) { } else { FURI_LOG_I(TAG, "Key: %s", string_get_cstr(context->data_str)); - // Check data size - if(string_size(context->data_str) != 14) { - FURI_LOG_E(TAG, "Incorrect Key length"); - string_reset(context->notification_msg); - string_set_str(context->notification_msg, "Incorrect Key length"); - break; + if(context->proto == EM4100) { + if(string_size(context->data_str) != 14) { + FURI_LOG_E(TAG, "Incorrect Key length"); + string_reset(context->notification_msg); + string_set_str(context->notification_msg, "Incorrect Key length"); + break; + } + } else { + if(string_size(context->data_str) != 17) { + FURI_LOG_E(TAG, "Incorrect Key length"); + string_reset(context->notification_msg); + string_set_str(context->notification_msg, "Incorrect Key length"); + break; + } } + // String to uint8_t - for(uint8_t i = 0; i < 5; i++) { + for(uint8_t i = 0; i < 6; i++) { char temp_str2[3]; temp_str2[0] = string_get_cstr(context->data_str)[i * 3]; temp_str2[1] = string_get_cstr(context->data_str)[i * 3 + 1]; diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_run_attack.c b/applications/plugins/flipfrid/scene/flipfrid_scene_run_attack.c index e34cb8986..9d30f4faa 100644 --- a/applications/plugins/flipfrid/scene/flipfrid_scene_run_attack.c +++ b/applications/plugins/flipfrid/scene/flipfrid_scene_run_attack.c @@ -2,8 +2,8 @@ #include uint8_t counter = 0; -#define TIME_BETWEEN_CARDS 5 -uint8_t id_list[16][5] = { +#define TIME_BETWEEN_CARDS 6 +uint8_t id_list[17][5] = { {0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF {0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11 @@ -16,17 +16,39 @@ uint8_t id_list[16][5] = { {0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88 {0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99 {0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID + {0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID {0x04, 0xd0, 0x9b, 0x0d, 0x6a}, // From arha {0x34, 0x00, 0x29, 0x3d, 0x9e}, // From arha {0x04, 0xdf, 0x00, 0x00, 0x01}, // From arha {0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha }; +uint8_t id_list_hid[14][6] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF + {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11 + {0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22 + {0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33 + {0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44 + {0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55 + {0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66 + {0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77 + {0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88 + {0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99 + {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}, // Incremental UID + {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID + {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha +}; + void flipfrid_scene_run_attack_on_enter(FlipFridState* context) { context->attack_step = 0; context->dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); context->worker = lfrfid_worker_alloc(context->dict); - context->protocol = protocol_dict_get_protocol_by_name(context->dict, "EM4100"); + if(context->proto == HIDProx) { + context->protocol = protocol_dict_get_protocol_by_name(context->dict, "HIDProx"); + } else { + context->protocol = protocol_dict_get_protocol_by_name(context->dict, "EM4100"); + } } void flipfrid_scene_run_attack_on_exit(FlipFridState* context) { @@ -40,7 +62,7 @@ void flipfrid_scene_run_attack_on_exit(FlipFridState* context) { void flipfrid_scene_run_attack_on_tick(FlipFridState* context) { if(context->is_attacking) { if(1 == counter) { - protocol_dict_set_data(context->dict, context->protocol, context->payload, 5); + protocol_dict_set_data(context->dict, context->protocol, context->payload, 6); lfrfid_worker_free(context->worker); context->worker = lfrfid_worker_alloc(context->dict); lfrfid_worker_start_thread(context->worker); @@ -50,87 +72,180 @@ void flipfrid_scene_run_attack_on_tick(FlipFridState* context) { lfrfid_worker_stop_thread(context->worker); switch(context->attack) { case FlipFridAttackDefaultValues: - context->payload[0] = id_list[context->attack_step][0]; - context->payload[1] = id_list[context->attack_step][1]; - context->payload[2] = id_list[context->attack_step][2]; - context->payload[3] = id_list[context->attack_step][3]; - context->payload[4] = id_list[context->attack_step][4]; + if(context->proto == EM4100) { + context->payload[0] = id_list[context->attack_step][0]; + context->payload[1] = id_list[context->attack_step][1]; + context->payload[2] = id_list[context->attack_step][2]; + context->payload[3] = id_list[context->attack_step][3]; + context->payload[4] = id_list[context->attack_step][4]; - if(context->attack_step == 15) { - context->attack_step = 0; - counter = 0; - context->is_attacking = false; - notification_message(context->notify, &sequence_blink_stop); - notification_message(context->notify, &sequence_single_vibro); - - } else { - context->attack_step++; - } - break; - - case FlipFridAttackBfCustomerId: - context->payload[0] = context->attack_step; - context->payload[1] = 0x00; - context->payload[2] = 0x00; - context->payload[3] = 0x00; - context->payload[4] = 0x00; - - if(context->attack_step == 255) { - context->attack_step = 0; - counter = 0; - context->is_attacking = false; - notification_message(context->notify, &sequence_blink_stop); - notification_message(context->notify, &sequence_single_vibro); - } else { - context->attack_step++; - } - break; - case FlipFridAttackLoadFile: - context->payload[0] = context->data[0]; - context->payload[1] = context->data[1]; - context->payload[2] = context->data[2]; - context->payload[3] = context->data[3]; - context->payload[4] = context->data[4]; - - context->payload[context->key_index] = context->attack_step; - - if(context->attack_step == 255) { - context->attack_step = 0; - counter = 0; - context->is_attacking = false; - notification_message(context->notify, &sequence_blink_stop); - notification_message(context->notify, &sequence_single_vibro); + if(context->attack_step == 15) { + context->attack_step = 0; + counter = 0; + context->is_attacking = false; + notification_message(context->notify, &sequence_blink_stop); + notification_message(context->notify, &sequence_single_vibro); + } else { + context->attack_step++; + } break; } else { - context->attack_step++; + context->payload[0] = id_list_hid[context->attack_step][0]; + context->payload[1] = id_list_hid[context->attack_step][1]; + context->payload[2] = id_list_hid[context->attack_step][2]; + context->payload[3] = id_list_hid[context->attack_step][3]; + context->payload[4] = id_list_hid[context->attack_step][4]; + context->payload[5] = id_list_hid[context->attack_step][5]; + + if(context->attack_step == 15) { + context->attack_step = 0; + counter = 0; + context->is_attacking = false; + notification_message(context->notify, &sequence_blink_stop); + notification_message(context->notify, &sequence_single_vibro); + + } else { + context->attack_step++; + } + break; } - break; - case FlipFridAttackLoadFileCustomUids: - while(true) { - string_reset(context->data_str); - if(!stream_read_line(context->uids_stream, context->data_str)) { + + case FlipFridAttackBfCustomerId: + if(context->proto == EM4100) { + context->payload[0] = context->attack_step; + context->payload[1] = 0x00; + context->payload[2] = 0x00; + context->payload[3] = 0x00; + context->payload[4] = 0x00; + + if(context->attack_step == 255) { + context->attack_step = 0; + counter = 0; + context->is_attacking = false; + notification_message(context->notify, &sequence_blink_stop); + notification_message(context->notify, &sequence_single_vibro); + } else { + context->attack_step++; + } + break; + } else { + context->payload[0] = context->attack_step; + context->payload[1] = 0x00; + context->payload[2] = 0x00; + context->payload[3] = 0x00; + context->payload[4] = 0x00; + context->payload[5] = 0x00; + + if(context->attack_step == 255) { + context->attack_step = 0; + counter = 0; + context->is_attacking = false; + notification_message(context->notify, &sequence_blink_stop); + notification_message(context->notify, &sequence_single_vibro); + } else { + context->attack_step++; + } + break; + } + + case FlipFridAttackLoadFile: + if(context->proto == EM4100) { + context->payload[0] = context->data[0]; + context->payload[1] = context->data[1]; + context->payload[2] = context->data[2]; + context->payload[3] = context->data[3]; + context->payload[4] = context->data[4]; + + context->payload[context->key_index] = context->attack_step; + + if(context->attack_step == 255) { context->attack_step = 0; counter = 0; context->is_attacking = false; notification_message(context->notify, &sequence_blink_stop); notification_message(context->notify, &sequence_single_vibro); break; - }; - if(string_get_char(context->data_str, 0) == '#') continue; - if(string_size(context->data_str) != 11) continue; + } else { + context->attack_step++; + } + break; + } else { + context->payload[0] = context->data[0]; + context->payload[1] = context->data[1]; + context->payload[2] = context->data[2]; + context->payload[3] = context->data[3]; + context->payload[4] = context->data[4]; + context->payload[5] = context->data[5]; + + context->payload[context->key_index] = context->attack_step; + + if(context->attack_step == 255) { + context->attack_step = 0; + counter = 0; + context->is_attacking = false; + notification_message(context->notify, &sequence_blink_stop); + notification_message(context->notify, &sequence_single_vibro); + break; + } else { + context->attack_step++; + } break; } - FURI_LOG_D(TAG, string_get_cstr(context->data_str)); - // string is valid, parse it in context->payload - for(uint8_t i = 0; i < 5; i++) { - char temp_str[3]; - temp_str[0] = string_get_cstr(context->data_str)[i * 2]; - temp_str[1] = string_get_cstr(context->data_str)[i * 2 + 1]; - temp_str[2] = '\0'; - context->payload[i] = (uint8_t)strtol(temp_str, NULL, 16); + case FlipFridAttackLoadFileCustomUids: + if(context->proto == EM4100) { + while(true) { + string_reset(context->data_str); + if(!stream_read_line(context->uids_stream, context->data_str)) { + context->attack_step = 0; + counter = 0; + context->is_attacking = false; + notification_message(context->notify, &sequence_blink_stop); + notification_message(context->notify, &sequence_single_vibro); + break; + }; + if(string_get_char(context->data_str, 0) == '#') continue; + if(string_size(context->data_str) != 11) continue; + break; + } + FURI_LOG_D(TAG, string_get_cstr(context->data_str)); + + // string is valid, parse it in context->payload + for(uint8_t i = 0; i < 5; i++) { + char temp_str[3]; + temp_str[0] = string_get_cstr(context->data_str)[i * 2]; + temp_str[1] = string_get_cstr(context->data_str)[i * 2 + 1]; + temp_str[2] = '\0'; + context->payload[i] = (uint8_t)strtol(temp_str, NULL, 16); + } + break; + } else { + while(true) { + string_reset(context->data_str); + if(!stream_read_line(context->uids_stream, context->data_str)) { + context->attack_step = 0; + counter = 0; + context->is_attacking = false; + notification_message(context->notify, &sequence_blink_stop); + notification_message(context->notify, &sequence_single_vibro); + break; + }; + if(string_get_char(context->data_str, 0) == '#') continue; + if(string_size(context->data_str) != 13) continue; + break; + } + FURI_LOG_D(TAG, string_get_cstr(context->data_str)); + + // string is valid, parse it in context->payload + for(uint8_t i = 0; i < 6; i++) { + char temp_str[3]; + temp_str[0] = string_get_cstr(context->data_str)[i * 2]; + temp_str[1] = string_get_cstr(context->data_str)[i * 2 + 1]; + temp_str[2] = '\0'; + context->payload[i] = (uint8_t)strtol(temp_str, NULL, 16); + } + break; } - break; } } @@ -190,16 +305,30 @@ void flipfrid_scene_run_attack_on_draw(Canvas* canvas, FlipFridState* context) { canvas_draw_str_aligned( canvas, 64, 8, AlignCenter, AlignTop, string_get_cstr(context->attack_name)); - char uid[16]; - snprintf( - uid, - sizeof(uid), - "%02X:%02X:%02X:%02X:%02X", - context->payload[0], - context->payload[1], - context->payload[2], - context->payload[3], - context->payload[4]); + char uid[18]; + if(context->proto == HIDProx) { + snprintf( + uid, + sizeof(uid), + "%02X:%02X:%02X:%02X:%02X:%02X", + context->payload[0], + context->payload[1], + context->payload[2], + context->payload[3], + context->payload[4], + context->payload[5]); + } else { + snprintf( + uid, + sizeof(uid), + "%02X:%02X:%02X:%02X:%02X", + context->payload[0], + context->payload[1], + context->payload[2], + context->payload[3], + context->payload[4]); + } + canvas_draw_str_aligned(canvas, 64, 24, AlignCenter, AlignTop, uid); canvas_set_font(canvas, FontSecondary); diff --git a/applications/plugins/mousejacker/mousejacker.c b/applications/plugins/mousejacker/mousejacker.c index f86b69719..99fade1c5 100644 --- a/applications/plugins/mousejacker/mousejacker.c +++ b/applications/plugins/mousejacker/mousejacker.c @@ -47,7 +47,8 @@ static void render_callback(Canvas* const canvas, void* ctx) { canvas_draw_frame(canvas, 0, 0, 128, 64); canvas_set_font(canvas, FontSecondary); - if(!plugin_state->addr_err && !plugin_state->ducky_err && !plugin_state->is_thread_running) { + if(!plugin_state->addr_err && !plugin_state->ducky_err && !plugin_state->is_thread_running && + !plugin_state->is_ducky_running) { snprintf(target_text, sizeof(target_text), target_fmt_text, target_address_str); canvas_draw_str_aligned(canvas, 7, 10, AlignLeft, AlignBottom, target_text); canvas_draw_str_aligned(canvas, 22, 20, AlignLeft, AlignBottom, "<- select address ->"); @@ -66,7 +67,10 @@ static void render_callback(Canvas* const canvas, void* ctx) { canvas, 3, 10, AlignLeft, AlignBottom, "Error: No mousejacker folder"); canvas_draw_str_aligned(canvas, 3, 20, AlignLeft, AlignBottom, "or duckyscript file"); canvas_draw_str_aligned(canvas, 3, 30, AlignLeft, AlignBottom, "loading error"); - } else if(plugin_state->is_thread_running) { + } else if(plugin_state->is_thread_running && !plugin_state->is_ducky_running) { + canvas_draw_str_aligned(canvas, 3, 10, AlignLeft, AlignBottom, "Loading..."); + canvas_draw_str_aligned(canvas, 3, 20, AlignLeft, AlignBottom, "Please wait!"); + } else if(plugin_state->is_thread_running && plugin_state->is_ducky_running) { canvas_draw_str_aligned(canvas, 3, 10, AlignLeft, AlignBottom, "Running duckyscript"); canvas_draw_str_aligned(canvas, 3, 20, AlignLeft, AlignBottom, "Please wait!"); canvas_draw_str_aligned( @@ -97,7 +101,7 @@ static void hexlify(uint8_t* in, uint8_t size, char* out) { snprintf(out + strlen(out), sizeof(out + strlen(out)), "%02X", in[i]); } -static bool open_ducky_script(Stream* stream) { +static bool open_ducky_script(Stream* stream, PluginState* plugin_state) { DialogsApp* dialogs = furi_record_open("dialogs"); bool result = false; string_t path; @@ -120,6 +124,9 @@ static bool open_ducky_script(Stream* stream) { } } string_clear(path); + + plugin_state->is_ducky_running = true; + return result; } @@ -160,10 +167,11 @@ static bool process_ducky_file( uint8_t* file_buf; bool loaded = false; FURI_LOG_D(TAG, "opening ducky script"); - if(open_ducky_script(file_stream)) { + if(open_ducky_script(file_stream, plugin_state)) { file_size = stream_size(file_stream); if(file_size == (size_t)0) { FURI_LOG_D(TAG, "load failed. file_size: %d", file_size); + plugin_state->is_ducky_running = false; return loaded; } file_buf = malloc(file_size); @@ -180,6 +188,7 @@ static bool process_ducky_file( } free(file_buf); } + plugin_state->is_ducky_running = false; return loaded; } diff --git a/applications/plugins/mousejacker/mousejacker_ducky.h b/applications/plugins/mousejacker/mousejacker_ducky.h index a70a771e8..b4922ed38 100644 --- a/applications/plugins/mousejacker/mousejacker_ducky.h +++ b/applications/plugins/mousejacker/mousejacker_ducky.h @@ -24,6 +24,7 @@ typedef struct { bool ducky_err; bool addr_err; bool is_thread_running; + bool is_ducky_running; bool close_thread_please; Storage* storage; FuriThread* mjthread; diff --git a/applications/plugins/picopass/application.fam b/applications/plugins/picopass/application.fam index 887d0324c..7a81e0804 100644 --- a/applications/plugins/picopass/application.fam +++ b/applications/plugins/picopass/application.fam @@ -1,7 +1,7 @@ App( appid="picopass", name="PicoPass Reader", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="picopass_app", requires=[ "storage", diff --git a/applications/main/spectrum_analyzer/application.fam b/applications/plugins/spectrum_analyzer/application.fam similarity index 68% rename from applications/main/spectrum_analyzer/application.fam rename to applications/plugins/spectrum_analyzer/application.fam index 563e3d614..5028c999b 100644 --- a/applications/main/spectrum_analyzer/application.fam +++ b/applications/plugins/spectrum_analyzer/application.fam @@ -1,11 +1,12 @@ App( appid="spectrum_analyzer", name="Spectrum Analyzer", - apptype=FlipperAppType.APP, + apptype=FlipperAppType.EXTERNAL, entry_point="spectrum_analyzer_app", cdefines=["APP_SPECTRUM_ANALYZER"], requires=["gui"], - icon="A_SpectrumAnalyzer_14", stack_size=2 * 1024, order=12, + fap_icon="spectrum_10px.png", + fap_category="Tools", ) diff --git a/applications/plugins/spectrum_analyzer/spectrum_10px.png b/applications/plugins/spectrum_analyzer/spectrum_10px.png new file mode 100644 index 000000000..743c2460b Binary files /dev/null and b/applications/plugins/spectrum_analyzer/spectrum_10px.png differ diff --git a/applications/main/spectrum_analyzer/spectrum_analyzer.c b/applications/plugins/spectrum_analyzer/spectrum_analyzer.c similarity index 100% rename from applications/main/spectrum_analyzer/spectrum_analyzer.c rename to applications/plugins/spectrum_analyzer/spectrum_analyzer.c diff --git a/applications/main/spectrum_analyzer/spectrum_analyzer.h b/applications/plugins/spectrum_analyzer/spectrum_analyzer.h similarity index 100% rename from applications/main/spectrum_analyzer/spectrum_analyzer.h rename to applications/plugins/spectrum_analyzer/spectrum_analyzer.h diff --git a/applications/main/spectrum_analyzer/spectrum_analyzer_worker.c b/applications/plugins/spectrum_analyzer/spectrum_analyzer_worker.c similarity index 100% rename from applications/main/spectrum_analyzer/spectrum_analyzer_worker.c rename to applications/plugins/spectrum_analyzer/spectrum_analyzer_worker.c diff --git a/applications/main/spectrum_analyzer/spectrum_analyzer_worker.h b/applications/plugins/spectrum_analyzer/spectrum_analyzer_worker.h similarity index 100% rename from applications/main/spectrum_analyzer/spectrum_analyzer_worker.h rename to applications/plugins/spectrum_analyzer/spectrum_analyzer_worker.h diff --git a/applications/services/desktop/scenes/desktop_scene_slideshow.c b/applications/services/desktop/scenes/desktop_scene_slideshow.c index cab7bf62b..012aff751 100644 --- a/applications/services/desktop/scenes/desktop_scene_slideshow.c +++ b/applications/services/desktop/scenes/desktop_scene_slideshow.c @@ -22,15 +22,11 @@ void desktop_scene_slideshow_on_enter(void* context) { bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) { Desktop* desktop = (Desktop*)context; bool consumed = false; - Storage* storage = NULL; Power* power = NULL; if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case DesktopSlideshowCompleted: - storage = furi_record_open(RECORD_STORAGE); - storage_common_remove(storage, SLIDESHOW_FS_PATH); - furi_record_close(RECORD_STORAGE); scene_manager_previous_scene(desktop->scene_manager); consumed = true; break; @@ -50,4 +46,8 @@ bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) { void desktop_scene_slideshow_on_exit(void* context) { UNUSED(context); + + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_remove(storage, SLIDESHOW_FS_PATH); + furi_record_close(RECORD_STORAGE); } diff --git a/applications/services/desktop/views/desktop_view_pin_input.c b/applications/services/desktop/views/desktop_view_pin_input.c index 5502d5f6d..bf05f06b9 100644 --- a/applications/services/desktop/views/desktop_view_pin_input.c +++ b/applications/services/desktop/views/desktop_view_pin_input.c @@ -117,7 +117,7 @@ static void desktop_view_pin_input_draw_cells(Canvas* canvas, DesktopViewPinInpu canvas_draw_icon(canvas, x + 3, y + 2, &I_Pin_arrow_down_7x9); break; case InputKeyUp: - canvas_draw_icon(canvas, x + 3, y + 2, &I_Pin_arrow_up7x9); + canvas_draw_icon(canvas, x + 3, y + 2, &I_Pin_arrow_up_7x9); break; case InputKeyLeft: canvas_draw_icon(canvas, x + 2, y + 3, &I_Pin_arrow_left_9x7); diff --git a/applications/services/gui/modules/button_panel.c b/applications/services/gui/modules/button_panel.c index ff52ebd8c..66e8f36a3 100644 --- a/applications/services/gui/modules/button_panel.c +++ b/applications/services/gui/modules/button_panel.c @@ -142,6 +142,8 @@ void button_panel_reset(ButtonPanel* button_panel) { } model->reserve_x = 0; model->reserve_y = 0; + model->selected_item_x = 0; + model->selected_item_y = 0; LabelList_reset(model->labels); ButtonMatrix_reset(model->button_matrix); return true; diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index b8098a3b9..58d7ecab0 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -318,15 +318,17 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b } } else if(selected == BACKSPACE_KEY) { text_input_backspace_cb(model); - } else if(text_length < (model->text_buffer_size - 1)) { + } else { if(model->clear_default_text) { text_length = 0; } - if(text_length == 0 && char_is_lowercase(selected)) { - selected = char_to_uppercase(selected); + if(text_length < (model->text_buffer_size - 1)) { + if(text_length == 0 && char_is_lowercase(selected)) { + selected = char_to_uppercase(selected); + } + model->text_buffer[text_length] = selected; + model->text_buffer[text_length + 1] = 0; } - model->text_buffer[text_length] = selected; - model->text_buffer[text_length + 1] = 0; } model->clear_default_text = false; } diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 566dfae58..072d03b9b 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -1,11 +1,8 @@ #include "power_i.h" -#include "views/power_off.h" #include "desktop/desktop_settings.h" #include #include -#include -#include #define POWER_OFF_TIMEOUT 90 diff --git a/applications/settings/notification_settings/notification_settings_app.c b/applications/settings/notification_settings/notification_settings_app.c index bfda689ea..db9a1a01f 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -60,19 +60,8 @@ const char* const delay_text[DELAY_COUNT] = { "10min", "30min", }; -const uint32_t delay_value[DELAY_COUNT] = { - 1000, - 5000, - 10000, - 15000, - 30000, - 60000, - 90000, - 120000, - 300000, - 600000, - 1800000 -}; +const uint32_t delay_value[DELAY_COUNT] = + {1000, 5000, 10000, 15000, 30000, 60000, 90000, 120000, 300000, 600000, 1800000}; #define VIBRO_COUNT 2 const char* const vibro_text[VIBRO_COUNT] = { diff --git a/assets/SConscript b/assets/SConscript index 9776b3fdb..47713d1a6 100644 --- a/assets/SConscript +++ b/assets/SConscript @@ -1,16 +1,5 @@ Import("env") -from fbt.version import get_fast_git_version_id - -# HACHHACK -# Currently injected to CPPPATH by libs - since they are built earlier and depend on assets -# env.Append( -# CPPPATH=[ -# Dir("./compiled"), -# ] -# ) -version_value = Value(get_fast_git_version_id()) - assetsenv = env.Clone( tools=["fbt_assets"], FW_LIB_NAME="assets", @@ -77,7 +66,6 @@ assetsenv.Alias("proto_ver", proto_ver) # Gather everything into a static lib assets_parts = (icons, proto, dolphin_blocking, dolphin_internal, proto_ver) -assetsenv.Depends(assets_parts, version_value) assetslib = assetsenv.Library("${FW_LIB_NAME}", assets_parts) assetsenv.Install("${LIB_DIST_DIR}", assetslib) @@ -113,6 +101,7 @@ if assetsenv["IS_BASE_FIRMWARE"]: ) # Exporting resources node to external environment + env["FW_ASSETS_HEADERS"] = assets_parts env["FW_RESOURCES"] = resources assetsenv.Alias("resources", resources) diff --git a/assets/dolphin/external/L3_Fireplace_128x64/meta.txt b/assets/dolphin/external/L3_Fireplace_128x64/meta.txt index de4425127..7f4d20a0f 100644 --- a/assets/dolphin/external/L3_Fireplace_128x64/meta.txt +++ b/assets/dolphin/external/L3_Fireplace_128x64/meta.txt @@ -7,7 +7,7 @@ Passive frames: 8 Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 Active cycles: 0 -Frame rate: 4 +Frame rate: 3 Duration: 3600 Active cooldown: 0 diff --git a/assets/icons/Archive/Apps_10px.png b/assets/icons/Archive/Apps_10px.png new file mode 100644 index 000000000..cb3a2e688 Binary files /dev/null and b/assets/icons/Archive/Apps_10px.png differ diff --git a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_0.png b/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_0.png deleted file mode 100644 index f2fc132ed..000000000 Binary files a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_0.png and /dev/null differ diff --git a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_1.png b/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_1.png deleted file mode 100644 index 7bb4f3895..000000000 Binary files a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_1.png and /dev/null differ diff --git a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_2.png b/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_2.png deleted file mode 100644 index 3a27b10b2..000000000 Binary files a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_2.png and /dev/null differ diff --git a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_3.png b/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_3.png deleted file mode 100644 index 72e9b7f83..000000000 Binary files a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_3.png and /dev/null differ diff --git a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_4.png b/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_4.png deleted file mode 100644 index 3a27b10b2..000000000 Binary files a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_4.png and /dev/null differ diff --git a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_5.png b/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_5.png deleted file mode 100644 index 7bb4f3895..000000000 Binary files a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_5.png and /dev/null differ diff --git a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_rate b/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_rate deleted file mode 100644 index bf0d87ab1..000000000 --- a/assets/icons/MainMenu/SpectrumAnalyzer_14/frame_rate +++ /dev/null @@ -1 +0,0 @@ -4 \ No newline at end of file diff --git a/assets/icons/NFC/Keychain.png b/assets/icons/NFC/Keychain.png deleted file mode 100644 index 7ba1b11da..000000000 Binary files a/assets/icons/NFC/Keychain.png and /dev/null differ diff --git a/assets/icons/NFC/Keychain_39x36.png b/assets/icons/NFC/Keychain_39x36.png new file mode 100644 index 000000000..d15850b5b Binary files /dev/null and b/assets/icons/NFC/Keychain_39x36.png differ diff --git a/assets/icons/NFC/NFC_manual.png b/assets/icons/NFC/NFC_manual_60x50.png similarity index 100% rename from assets/icons/NFC/NFC_manual.png rename to assets/icons/NFC/NFC_manual_60x50.png diff --git a/assets/icons/NFC/Restoring.png b/assets/icons/NFC/Restoring_38x32.png similarity index 100% rename from assets/icons/NFC/Restoring.png rename to assets/icons/NFC/Restoring_38x32.png diff --git a/assets/icons/PIN/Pin_arrow_up7x9.png b/assets/icons/PIN/Pin_arrow_up_7x9.png similarity index 100% rename from assets/icons/PIN/Pin_arrow_up7x9.png rename to assets/icons/PIN/Pin_arrow_up_7x9.png diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/meta.txt b/assets/resources/dolphin/L3_Fireplace_128x64/meta.txt index de4425127..7f4d20a0f 100644 --- a/assets/resources/dolphin/L3_Fireplace_128x64/meta.txt +++ b/assets/resources/dolphin/L3_Fireplace_128x64/meta.txt @@ -7,7 +7,7 @@ Passive frames: 8 Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 Active cycles: 0 -Frame rate: 4 +Frame rate: 3 Duration: 3600 Active cooldown: 0 diff --git a/assets/resources/infrared/assets/ac.ir b/assets/resources/infrared/assets/ac.ir index 643755360..8f219bb14 100644 --- a/assets/resources/infrared/assets/ac.ir +++ b/assets/resources/infrared/assets/ac.ir @@ -1,7 +1,43 @@ Filetype: IR library file Version: 1 -# Last Updated 15th Sept, 2022 -# +# Last Updated 20th Sept, 2022 +# +# ON +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3129 1587 494 1175 494 1176 493 369 465 370 464 370 464 1178 491 371 463 370 464 1179 490 1179 490 371 463 1180 489 373 461 346 488 1180 489 1180 489 374 460 1181 488 1182 487 348 496 337 487 1182 497 338 496 338 486 1183 496 339 495 339 495 338 486 348 496 338 496 339 495 339 495 339 495 339 495 338 496 339 495 339 495 339 495 339 495 339 495 340 494 340 494 1174 495 340 494 340 494 1175 494 341 493 341 493 1174 495 1175 494 342 492 342 492 342 492 343 491 341 493 342 492 1177 492 343 491 343 491 1177 492 343 491 342 492 342 492 342 492 342 492 343 491 343 491 343 491 342 492 342 492 342 492 342 492 342 492 343 491 343 491 342 492 342 492 342 492 342 492 342 492 342 492 343 491 342 492 342 492 342 492 342 492 342 492 342 492 343 491 341 493 342 492 342 492 342 492 342 492 342 492 342 492 341 493 341 493 342 492 1175 494 341 493 342 492 1176 493 1176 493 1176 493 343 491 1177 492 1177 492 343 491 342 492 342 492 342 492 +# +name: TEMP+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3130 1588 493 1178 491 1178 491 345 489 346 488 373 461 1180 489 348 486 349 485 1182 487 1183 496 340 494 1174 495 341 493 342 492 1175 494 1176 493 344 490 1177 492 1179 490 373 461 373 461 1180 489 374 460 374 460 1181 488 349 485 376 458 377 457 376 458 376 458 350 484 377 467 367 467 368 466 368 466 367 467 368 466 342 492 342 492 343 491 343 491 343 491 1177 492 371 463 371 463 1178 491 346 488 372 462 1180 489 1179 490 347 487 374 460 375 459 375 459 376 458 376 458 349 485 376 458 377 467 1172 486 377 467 367 467 368 466 368 466 342 492 369 465 368 466 342 492 342 492 369 465 344 490 370 464 344 490 370 464 344 490 344 490 345 489 372 462 346 488 346 488 345 489 345 489 372 462 346 488 347 487 374 460 373 461 373 461 373 461 374 460 375 459 375 459 375 459 348 486 348 486 376 458 1183 486 348 486 377 457 1184 495 339 485 351 493 1174 495 1175 494 1175 494 343 491 1176 493 1177 492 344 490 345 489 344 490 345 489 +# +name: TEMP- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3121 1597 494 1177 492 1178 491 343 491 343 491 344 490 1179 490 345 489 346 488 1181 488 1182 487 348 486 1183 486 349 485 349 485 1186 493 1177 491 342 492 1177 491 1179 490 345 489 345 489 1180 489 346 488 346 488 1182 487 348 486 349 485 349 485 350 494 339 485 350 484 350 494 340 494 341 493 341 493 342 492 341 493 341 493 342 492 342 492 343 491 343 491 1179 490 345 489 344 490 1180 489 346 488 346 488 1182 487 1184 485 348 486 349 485 349 485 350 494 340 494 340 494 1176 492 342 492 342 492 1177 491 343 491 344 490 344 490 344 490 343 491 344 490 344 490 345 489 345 489 346 488 345 489 345 489 346 488 346 488 347 487 347 487 348 486 346 488 347 487 347 487 347 487 348 486 348 486 349 485 348 486 348 486 348 486 349 485 349 485 350 494 340 494 339 485 350 494 340 494 341 493 341 493 342 492 342 492 342 492 1178 490 344 490 343 491 1178 491 1180 489 1181 488 346 488 1181 487 1182 487 347 487 348 486 349 485 349 485 +# +name: SWING +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3120 1599 492 1177 491 1179 490 345 489 344 490 345 489 1180 488 345 489 346 488 1181 487 1182 487 347 487 1182 487 348 486 348 486 1184 495 1175 493 340 494 1175 494 1176 493 342 492 341 493 1177 492 343 491 343 491 1177 491 343 491 344 490 344 490 345 489 345 489 344 490 344 490 345 489 345 489 345 489 346 488 346 488 345 489 345 489 346 488 346 488 346 488 1181 488 347 487 347 487 1182 487 348 486 349 485 1183 486 1184 484 350 494 339 485 350 484 350 484 350 494 340 484 1185 494 341 493 341 493 1176 493 342 492 342 492 343 491 343 491 344 490 342 492 343 491 1178 491 1178 491 1179 490 344 490 344 490 345 489 345 489 345 489 344 490 344 490 345 489 345 489 345 489 345 489 346 488 345 489 345 489 345 489 345 489 346 488 346 488 346 488 345 489 345 489 345 489 346 488 346 488 346 488 346 488 345 489 345 489 346 488 1180 489 345 489 346 488 1180 489 1180 489 1181 488 347 487 1181 488 347 487 347 487 346 488 1182 487 347 487 +# +name: MODE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3130 1587 494 1177 492 1178 491 370 464 370 464 371 463 1179 490 371 463 373 461 1180 489 1181 488 374 460 1182 487 375 469 365 469 1174 494 1175 494 367 467 1175 493 1176 493 369 465 369 465 1178 491 371 463 370 464 1179 490 372 462 372 462 373 461 373 461 372 462 373 461 374 460 374 460 375 469 365 469 364 460 375 469 365 469 365 469 366 468 366 468 339 495 1174 495 367 467 367 467 1175 493 368 466 342 492 368 466 1177 492 370 464 344 490 343 491 343 491 344 490 344 490 371 463 344 490 344 490 1179 490 372 462 373 461 372 462 372 462 373 461 347 487 346 488 1182 487 1182 487 1183 496 366 468 339 495 366 468 339 495 339 495 340 494 367 467 341 493 368 466 368 466 341 493 368 466 368 466 369 465 370 464 344 490 343 491 370 464 370 464 371 463 371 463 372 462 372 462 371 463 372 462 373 461 1181 488 373 461 375 459 1183 496 365 469 366 468 1174 495 1174 495 367 467 367 467 1176 492 369 465 369 465 369 465 1178 491 370 464 +# POWER ON +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3218 1528 453 354 439 1134 453 366 427 354 439 1133 454 354 439 1158 429 365 428 365 428 1159 428 1159 428 1159 428 365 428 1158 429 365 428 1158 429 1158 429 1158 429 365 458 354 495 353 385 354 465 1102 486 1100 487 353 438 1102 459 1128 459 354 439 354 439 1128 458 354 439 353 440 1129 457 353 440 354 439 1132 455 1132 455 354 439 1132 455 1133 454 1133 454 1133 454 354 439 1133 454 1133 454 1133 454 1133 454 354 439 354 439 354 439 1133 454 353 440 354 439 354 439 354 439 1134 453 1133 454 1133 454 1134 453 354 439 353 440 1134 453 1134 453 353 440 354 439 354 439 354 439 1134 453 1134 453 353 440 354 439 1134 453 353 440 1134 453 1135 452 354 440 354 439 354 439 354 439 1136 451 1135 452 354 440 354 439 1135 452 1135 452 1136 451 1136 451 353 440 # TIMER ON name: TIMER type: raw @@ -44,469 +80,469 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4463 4417 539 1598 546 495 546 1591 543 1592 542 501 540 502 539 1597 547 496 545 496 545 1591 543 499 542 500 541 1594 540 1597 547 494 547 1590 544 497 544 499 542 1593 541 1596 538 1597 547 1589 545 1590 544 1593 541 1594 540 1597 547 494 547 496 545 496 545 497 544 497 544 499 542 500 541 500 541 1596 538 503 538 504 547 494 547 495 546 495 546 1590 544 1591 543 499 542 1593 541 1595 539 1596 538 1599 545 1589 545 5190 4441 4412 544 1591 543 500 541 1594 540 1596 538 503 538 505 546 1588 546 497 544 499 542 1592 542 500 541 500 541 1595 539 1595 539 504 547 1586 548 494 547 495 546 1589 545 1590 544 1592 542 1594 540 1597 547 1587 547 1589 545 1589 545 498 543 498 543 499 542 499 542 501 540 502 539 501 540 503 538 1596 538 504 547 493 537 505 546 495 546 494 547 1589 545 1590 544 497 544 1591 543 1593 541 1594 540 1597 547 1589 545 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 447 442 417 417 442 446 413 449 421 414 445 25361 3456 1743 422 1275 444 418 441 447 412 449 421 1303 416 445 414 448 411 450 420 415 444 1306 413 449 421 1302 417 1307 412 422 448 1276 443 1281 438 1285 444 1306 413 1311 418 416 443 418 441 1310 419 442 417 417 442 419 440 421 449 440 419 443 416 445 414 420 439 422 448 441 418 1305 414 421 438 1312 418 444 415 446 413 448 422 1302 417 1280 439 422 448 441 418 416 443 446 413 421 438 450 420 442 417 444 415 419 440 449 421 441 418 416 443 445 414 447 412 450 420 415 444 1306 413 1310 419 1304 415 447 412 1311 418 444 415 1308 421 1302 417 34793 3458 1713 441 1310 419 415 444 417 442 447 412 1311 418 443 416 445 414 448 411 423 447 1304 415 446 413 1311 418 1305 414 421 438 1312 417 1279 440 1310 419 1305 414 1282 447 441 418 417 442 1308 422 440 419 442 417 444 415 447 412 449 421 441 418 443 416 445 414 447 412 423 447 415 444 1306 413 448 422 440 419 442 417 418 441 1309 421 441 418 443 416 445 414 448 411 450 420 415 444 444 415 419 440 448 422 440 419 443 416 445 414 447 412 449 421 441 418 443 416 445 414 421 438 450 420 1277 442 446 413 1310 419 416 443 1307 412 422 448 34789 3464 1735 419 1277 442 447 412 449 421 414 445 1278 441 448 411 450 420 442 417 444 415 1308 421 414 445 1305 414 1309 420 415 444 1306 413 1283 446 1304 415 1309 421 1303 416 446 413 421 438 1312 417 417 442 447 412 449 421 414 445 443 416 445 414 448 411 450 420 442 417 444 415 446 413 422 448 440 419 443 416 445 414 447 412 449 421 414 445 1305 414 421 438 450 420 1277 442 1309 420 1303 416 418 441 420 439 450 420 1304 415 446 413 1310 419 442 417 1307 412 449 421 414 445 444 415 419 440 448 411 450 420 442 417 444 415 447 412 449 421 1303 416 1280 439 1312 417 1306 413 1310 419 1305 414 1309 420 441 418 444 415 446 413 448 422 440 419 442 417 445 414 447 412 449 421 441 418 416 443 446 413 448 411 450 420 442 417 444 415 446 413 449 421 1303 416 1307 412 450 420 415 444 444 415 419 440 449 421 440 419 443 416 445 414 447 412 449 421 1303 416 1308 421 440 419 415 444 445 414 447 412 449 421 441 418 443 416 446 413 448 411 450 420 442 417 444 415 447 412 449 421 441 418 443 416 445 414 448 411 450 420 442 417 444 415 446 413 449 421 1302 417 1307 412 449 421 441 418 444 415 446 413 448 422 413 446 443 416 445 414 447 412 449 421 441 418 443 416 446 413 448 411 450 420 442 417 444 415 1309 420 441 418 1305 414 1309 420 442 417 417 442 446 413 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 439 422 448 441 418 443 416 419 440 421 438 25369 3459 1739 415 1281 449 413 446 443 416 445 414 1309 421 441 418 443 416 419 440 448 411 1312 418 417 442 1308 421 1302 417 418 441 1309 421 1303 416 1307 412 1312 418 1306 413 421 449 440 419 1277 442 447 412 449 421 441 418 443 416 445 414 447 412 450 420 441 418 444 415 446 413 1283 447 415 444 1306 413 449 421 414 445 443 416 1307 412 1312 417 417 442 419 440 421 438 450 420 442 417 444 415 446 413 449 421 440 419 443 416 445 414 447 412 449 421 441 418 443 416 418 441 1309 420 1303 416 1281 438 450 420 1304 415 447 412 1311 419 1278 441 34795 3459 1740 414 1283 447 415 444 444 415 419 440 1310 420 442 417 417 442 420 439 449 421 1276 443 445 414 1309 421 1276 443 446 413 1310 420 1304 415 1308 421 1302 417 1280 439 449 421 414 445 1305 414 421 438 450 420 415 444 417 442 446 413 421 438 450 420 442 417 444 415 420 439 449 421 1303 416 418 441 420 439 422 448 441 418 1305 414 421 438 450 420 442 417 444 415 446 413 448 411 450 420 442 417 444 415 446 413 449 421 441 418 443 416 445 414 447 412 422 448 441 418 443 416 445 414 1310 420 441 418 1306 413 421 438 1312 418 417 442 34795 3459 1712 442 1308 422 413 446 443 416 418 441 1309 421 441 418 416 443 445 414 448 411 1312 418 444 415 1308 421 1302 417 418 441 1309 421 1276 443 1307 412 1312 418 1306 413 449 421 414 445 1305 414 447 412 450 420 441 418 444 415 446 413 421 438 450 420 442 417 444 415 446 413 449 421 440 419 443 416 445 414 447 412 449 421 441 418 443 416 1307 412 423 447 415 444 1279 440 1310 419 1304 415 447 412 422 448 441 418 443 416 418 441 1309 421 414 445 1306 413 421 438 423 447 442 417 417 442 446 413 449 421 441 418 443 416 445 414 447 412 1311 419 1305 414 1283 446 1277 442 1281 449 1303 416 1280 439 422 448 414 445 417 442 446 413 448 411 450 420 442 417 444 415 420 439 449 421 441 418 443 416 418 441 447 412 449 421 441 418 416 443 418 441 1310 419 1304 415 419 440 421 449 440 419 442 417 418 441 420 439 422 448 441 418 443 416 445 414 1309 421 1303 416 446 413 448 411 423 447 442 417 417 442 446 413 422 448 440 419 442 417 444 415 447 412 449 421 414 445 443 416 445 414 447 412 449 421 441 418 443 416 445 414 448 411 450 420 442 417 1306 413 1310 420 415 444 444 415 420 439 422 448 414 445 443 416 445 414 447 412 450 420 441 418 417 442 446 413 448 411 450 420 442 417 444 415 446 413 449 421 441 418 1305 414 1309 421 414 445 444 415 446 413 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 447 415 444 417 442 419 440 421 438 423 447 25361 3456 1742 412 1312 418 417 442 446 413 448 411 1286 443 445 414 420 439 449 421 414 445 1278 441 447 412 1285 444 1279 440 448 411 1286 443 1280 439 1311 418 1305 414 1310 419 415 444 417 442 1282 448 414 445 443 416 445 414 420 439 449 421 414 445 443 416 446 413 448 411 423 447 1304 415 446 413 1284 445 443 416 418 441 420 439 1311 419 1306 413 421 438 450 420 415 444 417 442 446 413 448 422 413 446 416 443 445 414 447 412 449 421 441 418 443 416 445 414 448 411 450 420 1304 415 1281 449 1302 417 418 441 1282 447 414 445 1305 414 1310 419 34790 3463 1709 445 1305 414 421 438 423 447 442 417 1306 413 448 422 413 446 443 416 418 441 1309 421 441 418 1278 441 1283 446 415 444 1306 413 1311 419 1305 414 1282 447 1303 416 446 413 421 449 1275 444 418 441 420 439 449 421 441 418 443 416 445 414 421 438 423 447 442 417 444 415 446 413 1283 446 442 417 418 441 447 412 422 448 1303 416 446 413 448 411 450 420 442 417 444 415 446 413 449 421 441 418 443 416 445 414 447 412 450 420 441 418 444 415 446 413 448 411 451 419 442 417 445 414 1309 420 414 445 1278 441 421 438 1312 417 444 415 34795 3457 1741 413 1311 419 416 443 445 414 420 439 1285 444 444 415 419 440 448 422 440 419 1304 415 420 439 1311 419 1305 414 448 411 1312 417 1279 440 1284 445 1278 441 1282 447 415 444 444 415 1308 421 414 445 443 416 418 441 420 439 449 421 414 445 444 415 446 413 448 422 440 419 416 443 445 414 420 439 449 421 441 418 443 416 446 413 421 438 1312 417 444 415 419 440 1311 419 1305 414 1309 420 414 445 417 442 419 440 448 411 450 420 1304 415 447 412 1311 419 443 416 445 414 421 438 450 420 442 417 444 415 446 413 448 422 440 419 442 417 1307 412 1284 445 1305 414 1283 446 1304 415 1308 421 1302 417 418 441 447 412 449 421 441 418 444 415 446 413 448 411 450 420 442 417 444 415 447 412 449 421 414 445 443 416 445 414 447 412 450 420 442 417 1306 413 1310 420 442 417 417 442 447 412 449 421 441 418 443 416 445 414 447 412 450 420 442 417 1306 413 1310 419 415 444 445 414 447 412 449 421 441 418 443 416 446 413 448 411 450 420 442 417 444 415 447 412 449 421 441 418 443 416 445 414 447 412 450 420 442 417 444 415 446 413 448 411 451 419 1304 415 1309 421 441 418 416 443 445 414 447 412 450 420 442 417 444 415 446 413 448 422 440 419 442 417 445 414 447 412 449 421 441 418 443 416 446 413 448 411 450 420 1304 415 1281 449 413 446 416 443 418 441 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3027 9039 538 1530 514 558 490 557 491 582 486 560 488 559 488 584 464 583 464 582 486 1554 490 583 485 562 486 1554 490 584 484 1556 488 1554 510 562 485 1555 509 1531 533 1535 509 1558 569 1473 591 1475 517 1550 566 1475 517 556 492 581 487 559 488 558 490 557 491 582 486 560 487 559 488 558 489 583 464 582 486 560 508 565 482 1584 460 1556 508 1558 517 1524 572 1495 518 1551 513 1527 517 555 493 581 487 559 488 558 510 562 485 561 486 560 487 1579 485 1557 518 1523 541 1526 466 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 6239 515 2191 4487 590 562 536 589 540 559 560 1665 563 563 566 560 538 587 532 567 562 1663 565 561 558 567 542 1658 590 561 537 1662 586 1665 563 1663 565 586 533 566 563 1663 565 1661 618 507 561 565 564 561 538 588 541 1658 560 592 537 563 566 559 540 586 533 567 562 563 535 590 539 561 558 568 541 1657 591 1662 566 1659 559 1667 591 1660 558 1668 560 591 538 561 568 558 540 585 534 565 564 562 536 1688 560 1665 563 1663 565 1661 587 1664 564 1661 567 584 535 565 564 561 538 588 541 559 560 565 534 592 537 562 567 559 539 1685 563 563 536 1663 585 1667 561 537 592 1660 568 558 561 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8916 4491 586 1666 562 589 540 559 560 1692 536 563 566 560 538 587 532 567 562 1663 565 561 558 567 542 1684 564 1661 567 1658 560 592 537 562 567 559 540 1659 589 1663 565 1660 558 593 536 564 565 560 538 587 532 1667 561 591 538 561 568 558 540 585 534 565 564 562 536 589 540 559 560 566 533 1666 593 1659 559 1667 561 1664 584 1667 561 1664 564 588 541 558 561 565 534 591 538 562 567 558 540 1685 564 1662 566 1659 559 1667 592 1659 559 1667 561 590 539 560 559 567 542 584 535 564 565 561 538 588 541 558 561 564 535 1664 595 558 540 1659 589 1662 566 559 560 1666 562 562 567 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8913 4494 593 1658 560 566 563 562 536 1689 559 566 533 593 536 563 566 560 539 587 532 567 562 563 536 1663 585 1667 561 564 565 561 538 1661 587 538 561 1665 594 1658 560 1666 562 589 540 559 560 566 533 593 536 1663 565 560 559 541 588 564 535 591 538 561 568 558 541 585 534 565 564 561 538 1661 587 1665 563 1663 565 1660 588 1663 565 1660 558 594 535 564 565 560 539 587 542 557 562 564 535 1664 595 1658 560 1665 563 1662 586 1666 562 1663 565 586 533 566 563 563 536 590 539 560 559 567 532 594 535 564 565 560 539 1687 562 564 535 1665 594 1658 560 565 564 1662 566 559 560 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 8943 4491 586 565 534 1692 567 559 539 1660 588 1663 565 561 568 557 542 584 535 1664 564 588 541 558 561 1664 564 562 567 559 540 1659 589 563 535 1664 584 1667 561 1664 564 1661 587 564 535 591 538 562 567 558 540 1659 589 562 537 589 540 560 559 566 533 593 536 564 565 560 538 587 532 567 562 1663 565 1661 567 1658 590 1662 566 1659 559 1666 593 559 540 586 533 567 562 563 536 590 539 560 559 1692 536 1664 564 1661 587 1664 564 1662 566 1659 589 562 536 589 540 560 559 566 533 593 536 564 565 560 538 587 532 567 562 1663 565 561 568 1657 561 1665 563 588 541 1658 560 592 537 -# +# name: TEMP+ type: parsed protocol: NEC address: 80 00 00 00 command: 94 00 00 00 -# +# name: TEMP- type: parsed protocol: NEC address: 80 00 00 00 command: 95 00 00 00 -# +# name: TIMER type: parsed protocol: NEC address: 20 00 00 00 command: 19 00 00 00 -# +# name: SWING type: raw frequency: 38000 duty_cycle: 0.330000 data: 8918 4489 568 584 535 1664 564 588 541 1658 560 1666 593 558 540 1659 589 562 537 1663 585 566 533 593 536 1664 564 1661 587 564 535 591 538 1661 567 1658 590 1662 566 1659 559 1667 592 559 539 586 533 567 562 563 536 1664 584 567 542 584 535 564 565 560 539 587 542 558 561 564 535 591 538 561 568 1658 560 1666 562 1663 586 1666 562 1663 565 1660 588 563 536 590 539 560 559 567 542 584 535 564 565 1660 568 1658 560 1665 594 1658 560 1666 562 1663 585 566 533 593 536 563 566 559 540 586 533 567 562 563 536 590 539 560 559 1667 561 564 565 1661 567 1658 560 591 538 1662 566 585 534 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4482 4413 596 1596 594 527 562 1602 588 1603 587 535 565 530 570 1595 595 526 563 532 568 1597 593 528 561 534 566 1599 591 1599 591 531 569 1596 594 1597 593 528 561 1603 587 1604 596 1595 595 1596 594 1597 593 1598 592 529 560 1604 596 525 564 531 569 526 563 532 568 527 562 533 567 1598 592 1599 591 530 570 1595 595 526 563 532 568 527 562 506 594 528 561 507 593 1598 592 529 571 1595 595 1596 594 1597 593 1598 592 5251 4505 4417 592 1599 591 530 570 1595 595 1596 594 527 562 533 567 1598 592 529 561 535 565 1600 590 531 569 526 563 1602 588 1603 587 534 566 1599 591 1600 590 531 569 1596 594 1597 593 1598 592 1599 591 1600 590 1601 589 532 568 1597 593 529 561 534 566 503 597 499 590 504 596 500 589 1601 589 1602 588 533 567 1599 591 530 570 499 591 504 596 526 563 505 595 501 589 1602 588 533 567 1598 592 1599 591 1600 590 1601 589 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1305 435 1280 432 415 1255 1307 432 1272 439 418 1252 442 1255 1307 431 416 1255 439 1258 447 1251 443 8174 1302 437 1278 433 414 1255 1307 432 1273 438 419 1250 444 1254 1298 440 417 1253 441 1256 438 1259 445 8170 1306 433 1271 439 418 1251 1301 438 1277 434 413 1256 449 1249 1303 435 412 1258 446 1251 443 1254 440 8176 1300 438 1277 434 413 1283 1279 433 1271 440 417 1278 416 1255 1307 431 416 1253 441 1257 447 1250 444 8171 1305 433 1272 439 418 1278 1274 438 1277 433 414 1282 412 1259 1303 434 413 1256 448 1249 445 1252 442 8173 1303 435 1270 440 417 1279 1273 438 1277 433 414 1282 412 1258 1304 433 414 1282 412 1258 446 1250 444 8171 1305 433 1272 438 419 1276 1276 435 1270 441 416 1252 442 1255 1297 440 417 1279 415 1255 439 1257 447 8168 1297 439 1276 434 413 1256 1306 431 1273 436 411 1258 446 1250 1302 409 438 1284 421 1249 445 1252 442 -# +# name: POWER type: parsed protocol: NEC address: 81 00 00 00 command: 6B 00 00 00 -# +# name: TEMP+ type: parsed protocol: NEC address: 81 00 00 00 command: 65 00 00 00 -# +# name: TEMP- type: parsed protocol: NEC address: 81 00 00 00 command: 68 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 198 131341 3063 3026 3054 4297 600 1676 575 560 571 1691 571 697 568 568 573 1688 574 562 569 1824 573 563 599 1676 575 1686 576 1817 569 567 574 562 569 567 574 1819 567 569 572 563 599 1676 575 692 574 562 569 1693 569 567 574 1819 567 568 573 563 567 1694 599 682 573 563 568 568 573 1688 574 694 571 564 567 569 572 564 567 701 596 1679 572 1688 574 563 567 700 576 560 570 1690 572 565 576 691 574 561 601 549 571 565 576 691 574 561 569 567 574 1686 576 692 573 562 569 568 594 1681 570 697 568 567 574 562 568 567 574 694 571 564 567 569 572 564 598 707 569 1692 570 1691 571 566 575 716 570 1691 571 565 576 1686 576 1685 597 -# +# name: MODE type: parsed protocol: NEC address: 81 00 00 00 command: 66 00 00 00 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 9013 4502 575 560 574 562 572 1671 565 569 565 570 543 592 542 540 594 567 546 1697 571 1672 575 560 574 1695 541 1702 545 1671 597 1673 574 563 1670 1703 575 560 542 592 542 540 593 568 545 590 544 564 569 565 548 587 547 1670 566 1702 566 1677 570 1674 573 1670 598 1698 538 1704 543 39972 9017 2251 568 96272 9021 2249 570 96268 9013 2256 574 96264 9015 2254 56 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 5050 2165 361 1803 367 716 363 718 361 721 358 1806 364 718 362 720 359 723 367 715 364 1800 359 722 368 1797 362 1802 368 714 365 1799 360 1803 367 1798 361 1803 367 1797 362 720 359 1805 365 717 363 719 360 722 368 714 365 717 362 719 360 1804 366 1798 361 721 358 723 367 715 364 718 361 720 359 1805 365 717 362 720 359 722 368 714 365 717 362 719 361 722 368 714 365 716 363 719 360 721 358 724 366 716 363 718 361 1803 367 1797 362 1802 368 1797 362 719 360 722 368 714 365 29579 5061 2156 360 1804 366 717 362 719 360 722 357 1806 364 719 360 721 358 724 366 716 363 1801 358 723 367 1798 361 1802 368 715 364 1800 359 1804 366 1799 360 1804 366 1798 361 721 359 1806 364 718 362 721 359 723 367 715 364 718 362 720 359 1805 365 1799 360 722 368 714 365 717 362 719 361 721 358 724 366 716 363 719 361 721 358 724 366 716 363 1801 358 1806 364 718 361 721 358 1805 365 1800 359 1805 365 717 362 720 359 722 368 714 365 717 362 719 360 722 368 714 365 717 362 1802 368 714 365 717 362 719 361 722 368 1796 363 719 360 721 358 724 366 716 363 719 360 721 358 724 366 716 363 718 362 721 359 723 367 715 364 718 361 720 360 723 367 715 364 718 362 720 359 722 368 715 364 1799 360 1805 365 1799 360 722 368 714 365 716 363 1801 358 724 366 1799 360 721 358 1806 364 718 361 721 358 723 367 716 363 718 362 721 359 723 367 715 364 718 362 720 359 723 367 715 364 718 362 720 359 723 367 715 364 1800 359 722 368 714 365 1799 360 1804 366 1799 360 1804 366 1799 360 1804 366 1798 361 1803 367 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9823 9795 9821 9799 4615 2493 385 343 389 924 386 931 389 348 384 929 381 355 387 345 387 357 386 343 379 934 386 350 382 350 382 354 388 929 381 355 387 357 386 343 379 357 386 350 382 928 382 931 379 938 382 355 388 356 387 919 381 355 387 349 383 927 383 930 380 356 386 346 386 358 384 344 388 348 384 352 380 352 380 933 387 348 384 351 381 363 379 349 383 353 379 357 386 347 385 927 383 354 388 344 388 356 386 919 381 355 388 349 383 350 382 353 379 938 382 354 389 356 386 919 381 355 387 930 380 934 386 349 383 934 386 350 382 358 385 20350 4620 -# +# name: TEMP+ type: parsed protocol: NECext address: 48 12 00 00 command: 88 09 00 00 -# +# name: MODE type: parsed protocol: NECext address: 48 44 00 00 command: 88 08 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 5618 5586 563 557 564 554 567 553 568 552 569 550 571 548 563 1675 568 1674 569 549 562 556 565 1674 569 1670 563 1679 564 1676 567 552 569 555 566 1669 564 554 567 1672 571 1668 565 556 565 554 567 1672 571 551 570 1665 568 1672 571 1668 565 1673 570 550 571 547 564 1675 568 557 564 1671 562 555 566 1672 571 576 535 557 564 1675 568 552 569 580 541 548 563 555 566 553 568 551 570 1668 565 1675 568 1671 562 1681 562 1673 570 550 561 1677 566 1701 542 551 570 1668 565 555 566 1674 569 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 5617 5586 563 558 563 555 566 554 567 551 570 550 571 574 537 1676 567 1676 567 1667 566 555 566 1673 570 1668 565 1675 568 1671 562 558 563 586 535 1673 570 550 571 1667 566 1673 570 575 536 558 563 1675 568 556 565 1668 565 1676 567 1672 571 1667 566 553 568 553 568 1670 563 562 570 1664 569 552 569 1669 564 557 564 555 566 1672 571 549 562 560 561 554 567 1673 570 1669 564 555 566 1672 561 559 562 556 565 1678 565 552 569 549 562 1704 539 581 540 1672 571 547 564 1676 567 553 568 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 5626 5579 569 549 562 582 539 581 540 578 543 577 544 575 536 1702 541 1703 540 549 562 557 564 1700 543 1670 563 1677 566 1698 545 547 564 586 535 1674 569 550 571 1668 565 1674 569 578 543 550 571 1670 563 587 545 1665 568 1671 562 1677 566 1700 543 577 544 548 563 1704 539 557 564 1698 545 574 537 1677 566 552 569 577 544 1668 565 554 567 583 538 1670 563 1702 541 1671 572 547 564 583 538 553 568 552 569 1700 543 545 566 582 539 1698 535 558 563 557 564 554 567 1671 562 585 536 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3302 1644 408 419 410 416 413 1233 405 423 406 1239 409 419 410 417 412 415 414 1232 406 1241 407 419 410 417 412 416 413 1233 405 1241 407 394 435 419 410 417 412 416 413 387 432 422 407 420 409 418 411 416 413 415 404 423 406 421 408 420 409 1237 411 416 413 413 406 422 407 420 409 418 411 417 412 415 414 1232 406 421 408 420 409 418 411 416 413 1232 406 1240 408 1238 410 1236 412 1234 414 1232 406 1240 408 1238 410 417 412 416 413 1233 405 422 407 421 408 419 410 417 412 414 404 397 432 421 408 420 409 1237 411 1234 414 387 432 422 407 1239 409 418 411 416 413 414 405 423 406 1240 408 1237 411 417 412 415 414 414 405 422 407 421 408 418 411 416 413 414 405 423 406 421 408 419 410 417 412 416 413 414 405 422 407 421 408 419 410 416 413 414 405 423 406 421 408 419 410 417 412 416 413 414 404 423 406 421 408 419 410 417 412 414 405 423 406 421 408 419 410 417 412 416 413 414 404 423 406 421 408 419 410 417 412 416 413 413 406 422 407 420 409 418 411 416 413 1233 405 422 407 421 408 1237 411 1235 413 1206 432 1240 408 420 409 418 411 1235 413 415 414 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8523 4238 543 1597 536 1578 544 1595 538 571 511 1576 546 563 519 1594 518 1596 537 4245 515 1598 545 1594 539 544 517 1596 547 563 488 568 514 570 512 571 593 19276 8526 4262 540 1600 512 1601 542 1598 535 548 513 1600 543 567 514 1598 514 1601 542 4214 546 1594 539 1575 537 572 520 1619 514 543 518 565 516 567 515 542 622 19299 8524 4239 542 1598 545 1595 517 1598 545 564 518 1596 516 567 515 1625 518 1570 542 4239 542 1572 540 1600 543 565 485 1602 541 568 513 544 517 566 516 568 596 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8523 4266 545 1595 537 1576 546 1593 539 544 517 1596 547 536 545 1568 544 1595 537 4217 542 1597 546 537 513 543 538 1601 542 541 520 536 545 538 543 539 625 19293 8525 4234 546 1594 548 1591 520 1593 539 543 538 1575 547 535 546 1594 538 1574 548 4234 515 1599 544 539 542 540 521 1592 540 542 539 543 518 539 542 540 624 19297 8521 4241 539 1601 542 1572 540 1600 543 540 541 1572 540 544 548 1592 520 1593 539 4243 516 1597 545 538 543 512 549 1591 541 541 540 516 545 538 543 539 625 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8521 4271 540 1600 512 1602 540 1599 512 570 511 1603 539 569 492 1596 546 1593 539 4217 542 566 515 568 493 564 517 1622 510 546 515 569 512 571 510 546 618 19303 8523 4238 542 1598 544 1569 542 1597 545 563 508 1579 543 566 515 1598 514 1600 542 4240 519 563 518 564 517 566 484 1602 540 568 513 543 518 566 515 567 597 19272 8523 4264 547 1593 539 1574 538 1603 540 569 492 1596 546 562 519 1569 542 1597 545 4211 538 571 521 562 509 547 514 1600 542 566 515 541 520 563 518 564 600 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 8523 4266 544 1595 516 1597 545 1594 538 544 516 1597 545 564 486 1601 541 1599 543 4213 545 1594 538 1576 545 563 518 565 516 540 521 563 518 565 516 540 624 19269 8522 4265 545 1595 537 1576 546 1594 538 571 489 1623 519 564 517 1595 516 1597 545 4209 539 1600 542 1597 514 568 513 569 512 571 490 567 514 568 513 570 594 19272 8519 4266 544 1595 516 1597 545 1593 539 543 518 1621 521 562 488 1598 544 1595 537 4217 541 1598 544 1569 542 566 515 568 513 543 518 565 516 567 514 542 622 -# +# name: POWER type: parsed protocol: NECext address: 98 6F 00 00 command: 19 E6 00 00 -# +# name: TEMP+ type: parsed protocol: NECext address: 98 6F 00 00 command: 05 FA 00 00 -# +# name: TEMP- type: parsed protocol: NECext address: 98 6F 00 00 command: 09 F6 00 00 -# +# name: MODE type: parsed protocol: NECext address: 98 6F 00 00 command: 08 F7 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8963 4401 561 543 558 545 566 537 564 540 561 542 559 1652 561 1650 563 540 561 543 558 545 567 537 564 1647 566 1645 558 1654 559 544 567 536 565 1646 567 1644 559 545 567 537 564 1647 566 537 564 540 561 542 559 545 567 537 564 539 562 541 560 544 567 536 565 538 563 541 560 543 558 545 567 538 563 540 561 542 559 545 567 537 564 539 562 542 559 544 568 536 565 539 562 541 560 543 569 536 565 538 563 541 560 543 558 545 566 538 563 540 561 542 559 545 566 537 564 539 562 542 559 544 567 536 565 539 562 541 560 544 568 536 565 538 563 541 560 543 558 545 567 538 563 540 561 543 558 545 567 537 564 540 561 542 559 544 568 536 565 539 562 541 560 570 542 536 565 538 563 541 560 543 558 546 565 538 563 540 561 543 558 571 541 537 564 540 561 542 559 545 567 537 564 539 562 542 559 544 568 536 565 539 562 541 560 544 568 536 565 538 563 541 560 543 569 535 566 538 563 541 560 543 569 535 566 538 563 541 560 543 569 536 565 538 563 541 560 544 567 536 565 539 562 542 559 544 567 537 564 539 562 542 559 544 568 537 564 539 562 542 559 544 568 537 564 539 562 542 559 545 567 537 564 540 561 542 559 545 566 537 564 540 561 543 558 545 567 538 563 541 560 543 569 536 565 538 563 541 560 544 568 536 565 539 562 542 559 544 568 1645 558 546 566 1646 567 537 564 540 561 1651 562 541 560 544 568 563 538 539 562 541 560 544 567 536 565 539 562 541 560 544 567 537 564 539 562 542 559 544 568 537 564 540 561 542 559 545 566 1645 558 546 566 1646 567 537 564 540 561 1651 562 541 560 544 588 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 8955 4430 563 541 560 543 558 545 567 537 564 539 562 1649 564 1648 565 537 564 540 561 542 559 544 568 1644 559 1653 560 1651 562 541 560 543 558 1653 560 1652 561 542 559 544 568 1644 559 545 567 537 564 539 562 541 560 543 558 545 567 537 564 539 562 541 560 543 558 546 566 538 563 540 561 542 559 544 568 536 565 539 562 541 560 543 558 546 566 538 563 540 561 542 559 545 567 536 565 539 562 541 560 543 558 545 567 537 564 540 561 542 559 544 568 536 565 538 563 541 560 543 558 545 567 537 564 539 562 541 560 543 569 535 566 538 563 540 561 542 559 544 568 536 565 539 562 541 560 543 558 545 567 537 564 539 562 542 559 544 568 536 565 538 563 541 560 543 558 545 567 537 564 540 561 542 559 544 568 537 564 539 562 541 560 544 568 536 565 538 563 541 560 543 558 546 566 538 563 540 561 542 559 545 567 537 564 539 562 541 560 544 568 536 565 538 563 540 561 543 558 545 567 538 563 540 561 543 558 545 567 537 564 540 561 542 559 544 568 537 564 539 562 542 559 544 568 536 565 539 562 541 560 544 568 536 565 539 562 541 560 544 568 536 565 538 563 541 560 543 569 536 565 538 563 541 560 543 569 536 565 538 563 541 560 543 558 546 566 538 563 541 560 543 558 546 566 538 563 541 560 543 569 536 565 538 563 541 560 543 558 546 566 1646 567 1645 568 536 565 539 562 542 559 544 568 536 565 539 562 541 560 544 568 536 565 539 562 541 560 544 568 536 565 539 562 541 560 544 568 536 565 539 562 541 560 544 568 536 565 539 562 1649 564 1649 564 539 562 542 559 545 567 537 564 540 592 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8952 4436 568 536 565 538 563 540 561 542 559 544 568 1645 558 1654 559 544 568 536 565 539 562 541 560 1652 561 1651 562 1650 563 540 561 542 559 1654 559 1653 560 543 558 545 567 1646 567 537 564 539 562 541 560 544 568 536 565 538 563 540 561 543 558 545 567 537 564 540 561 543 558 545 567 537 564 540 561 542 559 544 568 563 538 539 562 541 560 544 557 546 566 564 537 540 561 543 558 545 567 537 564 540 561 542 559 545 567 537 564 539 562 542 559 544 568 536 565 538 563 541 560 543 558 546 566 538 563 541 560 543 558 546 566 538 563 541 560 543 558 546 566 538 563 541 560 543 558 546 566 538 563 541 560 543 558 546 566 538 563 567 534 544 568 536 565 538 563 541 560 544 568 536 565 538 563 541 560 544 568 536 565 539 562 541 560 544 568 562 539 539 562 542 559 570 542 537 564 539 562 542 559 545 566 537 564 540 561 543 558 545 567 538 563 540 561 569 532 572 540 538 563 540 561 543 558 546 566 538 563 541 560 543 569 536 565 539 562 541 560 544 568 536 565 539 562 542 559 544 568 537 564 540 561 543 558 571 541 538 563 541 560 543 558 546 566 538 563 541 560 570 542 536 565 565 536 541 560 544 568 536 565 539 562 542 559 544 568 537 564 540 561 543 558 545 567 538 563 541 560 543 558 546 566 538 563 541 560 544 568 1645 568 536 565 539 562 541 560 544 568 536 565 539 562 542 559 545 567 538 563 540 561 543 558 546 566 538 563 541 560 544 568 536 565 539 562 542 559 545 567 537 564 540 562 543 558 545 567 1647 566 538 563 541 560 544 568 536 565 539 562 541 560 544 588 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8954 4428 565 539 562 542 559 544 567 537 564 540 561 1650 563 1650 563 540 561 543 558 546 566 538 563 1649 564 1649 564 1648 565 539 562 542 559 1653 560 1652 561 543 558 546 565 1647 566 537 564 540 561 543 558 545 566 537 564 540 561 542 559 545 567 537 564 539 562 542 559 544 568 537 564 539 562 542 559 544 567 537 564 539 562 542 559 544 568 537 564 539 562 542 559 544 568 536 565 539 562 542 559 544 568 537 564 539 562 542 559 544 568 537 564 539 562 542 559 545 567 537 564 540 561 542 559 545 567 537 564 540 561 543 558 546 565 538 563 541 560 544 568 536 565 539 562 542 559 544 568 537 564 540 561 542 559 545 567 538 563 540 561 543 558 546 566 538 563 541 560 544 568 536 565 539 562 542 559 545 567 537 564 540 561 543 558 546 566 538 563 541 560 544 567 537 564 539 562 542 559 545 566 538 563 541 560 543 558 546 566 565 536 542 559 544 568 537 564 540 561 543 558 545 567 538 563 541 560 544 568 537 564 539 562 542 559 545 567 538 563 541 560 544 568 536 565 539 562 542 559 545 566 538 563 541 560 544 568 536 565 539 562 542 559 545 567 538 563 541 560 544 568 537 564 540 561 543 558 545 567 538 563 541 560 544 568 536 565 539 562 542 559 545 566 538 563 541 560 544 568 537 564 540 561 543 558 545 566 538 563 541 560 1653 560 543 558 547 565 539 562 542 559 545 567 537 564 540 561 543 569 536 565 539 562 542 559 544 568 537 564 540 561 543 558 546 566 538 563 541 560 544 568 537 564 540 561 543 558 546 566 1647 566 538 563 541 560 544 568 537 564 540 561 542 590 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4421 4375 565 1616 560 560 533 1626 560 1621 565 554 539 556 537 1617 559 564 539 557 536 1622 564 556 537 558 535 1619 567 1614 562 558 535 1625 561 561 542 1613 563 1618 620 1560 564 1616 560 560 533 1625 561 1622 564 1622 564 555 538 556 537 558 535 559 534 1619 567 553 540 557 536 1623 563 1618 558 1622 564 556 537 557 536 558 535 559 534 562 541 554 539 555 538 556 537 1621 565 1616 560 1620 566 1614 562 1619 557 5232 4422 4363 567 1614 562 557 536 1648 538 1616 560 560 533 561 532 1622 564 558 535 561 532 1626 560 560 533 561 532 1622 564 1616 560 560 533 1653 533 563 540 1639 537 1618 568 1613 563 1617 559 561 532 1652 534 1623 563 1622 564 556 537 557 536 558 535 559 534 1645 541 553 540 556 537 1622 564 1617 559 1621 565 554 539 555 538 556 537 557 536 560 533 563 540 553 540 554 539 1645 541 1612 564 1617 559 1622 564 1618 558 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4420 4379 561 1618 558 536 567 1617 559 1621 565 529 564 530 563 1617 559 537 566 556 537 1621 565 529 564 530 563 1617 559 1621 565 529 564 1649 537 532 561 560 533 561 532 1622 564 1616 560 1620 566 1614 562 1646 540 1620 566 1614 562 1619 567 553 540 528 565 529 564 530 563 533 560 562 541 1617 559 535 558 536 567 1612 564 556 537 531 562 560 533 1623 563 556 537 1621 565 1614 562 558 535 1623 563 1643 533 1622 564 5224 4420 4364 566 1613 563 531 562 1622 564 1616 560 533 560 534 559 1622 564 531 562 534 559 1625 561 532 561 533 560 1620 566 1614 562 532 561 1651 535 561 532 535 568 526 567 1614 562 1618 558 1622 564 1616 560 1622 564 1622 564 1616 560 1620 566 527 566 528 565 529 564 556 537 533 560 536 567 1617 559 560 533 535 558 1622 564 530 563 530 563 533 560 1622 564 530 563 1620 566 1614 562 558 535 1624 562 1643 533 1624 562 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4424 4381 559 1621 565 529 564 1647 539 1615 561 533 560 534 559 1648 538 532 561 535 1627 559 560 533 535 568 1639 537 1617 559 535 568 1618 568 554 539 556 537 531 562 1618 558 1649 537 1617 559 1621 565 1644 532 1628 558 1622 564 1616 560 534 559 562 541 552 541 527 566 557 536 560 533 1625 561 559 534 1625 561 1619 567 553 540 528 565 532 561 1621 565 529 564 1647 539 528 565 556 537 1617 559 1621 565 1616 560 5229 4425 4363 567 1613 563 557 536 1622 564 1617 559 561 532 562 541 1613 563 559 534 562 541 1617 559 535 568 552 541 1613 563 1617 559 562 541 1618 568 528 565 529 564 556 537 1618 558 1622 564 1616 560 1646 540 1642 534 1627 559 1647 539 1615 561 533 560 561 532 562 541 527 566 556 537 559 534 1624 562 558 535 1623 563 1643 533 561 542 526 567 555 538 1619 567 527 566 1618 558 536 567 527 566 1641 535 1619 567 1617 559 -# +# name: POWER type: parsed protocol: NECext address: 08 F5 00 00 command: 11 EE 00 00 -# +# name: TEMP+ type: parsed protocol: NECext address: 08 F5 00 00 command: 0E F1 00 00 -# +# name: MODE type: parsed protocol: NECext address: 01 FF 00 00 command: 02 FD 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8445 4206 542 1566 541 539 519 534 514 541 517 1564 543 537 521 533 515 539 519 534 514 540 518 536 512 542 516 537 521 532 516 538 520 534 514 1568 539 541 517 536 522 1560 547 533 515 1567 540 540 518 536 512 1570 547 1561 546 534 514 1568 539 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 8976 4374 594 1635 593 1638 590 533 591 536 599 531 593 539 596 541 594 1642 597 517 597 1632 597 1634 594 531 593 537 598 535 600 535 590 534 590 1635 593 526 598 523 591 535 600 529 596 537 598 538 597 529 595 521 593 527 597 1635 593 534 601 528 596 536 599 537 598 529 595 521 593 528 597 527 597 528 596 533 591 542 593 546 599 528 596 521 593 526 598 525 599 526 598 531 593 539 596 541 594 514 590 7877 600 516 598 521 593 529 595 531 593 537 598 534 591 1654 595 1641 598 517 597 521 593 530 594 533 591 538 597 536 599 539 596 531 593 523 601 519 595 528 596 529 596 532 592 539 596 538 597 525 589 523 591 525 599 520 594 530 594 533 591 540 595 541 594 531 593 520 594 524 590 531 593 530 594 531 593 537 598 536 599 525 599 516 598 522 592 530 594 532 592 537 598 536 599 538 597 529 595 519 595 524 600 522 592 532 592 537 598 534 590 544 591 536 599 1626 592 526 598 1633 595 529 595 534 601 533 591 1655 594 1625 593 7883 595 522 592 530 594 529 595 532 592 537 598 536 599 537 598 528 596 518 596 1634 594 1642 597 528 597 533 591 541 594 543 592 535 600 516 598 521 593 528 596 528 597 531 593 538 597 538 597 528 597 519 595 523 591 529 595 529 595 532 592 538 597 538 597 1641 598 518 596 524 590 532 592 1642 597 1644 595 1652 597 540 595 532 592 525 599 521 593 530 594 532 592 537 598 536 599 538 597 530 594 521 593 1641 598 1638 590 1647 592 1650 599 1647 592 545 600 1622 596 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8971 4413 598 1634 595 1641 599 526 599 529 596 533 592 541 594 541 594 1646 594 525 600 1633 596 1645 595 533 592 540 595 538 597 539 596 528 597 1629 600 520 594 526 599 526 599 530 595 537 598 538 597 530 595 523 591 1639 601 524 601 527 598 1643 597 537 598 539 596 531 594 522 592 528 597 527 598 530 595 536 599 534 591 546 600 526 599 517 597 521 593 528 597 528 597 532 593 541 594 544 591 519 595 7883 598 520 594 525 600 524 590 535 600 529 596 539 596 1651 599 1639 601 515 599 522 592 531 594 532 593 538 597 536 599 538 597 528 597 518 596 525 600 523 591 534 591 537 598 533 592 546 600 527 598 518 596 523 591 531 594 531 594 536 599 534 591 545 601 526 599 517 597 521 593 529 596 530 595 536 599 532 593 542 593 532 593 522 592 526 599 522 592 535 600 532 593 540 595 541 594 533 592 524 601 519 595 528 597 529 596 535 600 534 601 537 598 527 598 1627 592 1637 592 531 594 533 592 1652 598 537 598 1652 598 1623 596 7882 599 519 595 525 600 522 592 534 591 538 597 535 590 547 599 528 597 518 596 1634 595 1639 601 525 600 530 595 539 596 541 594 532 593 523 591 529 596 527 598 528 597 533 592 541 594 542 593 532 593 525 600 522 592 531 594 533 592 538 597 535 600 537 598 527 598 518 596 522 592 530 595 1646 594 1652 598 1650 600 538 597 530 595 521 593 527 598 526 599 529 596 534 591 543 592 546 600 527 598 519 595 1636 593 1640 600 1639 601 1644 596 1651 599 539 596 514 590 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8916 4470 593 1635 594 1638 591 530 595 531 594 536 599 534 591 544 591 1644 596 519 595 1638 591 1643 597 530 595 534 601 533 592 544 591 534 591 1635 594 526 599 525 600 528 597 532 593 540 595 541 594 533 592 524 590 1639 590 533 592 534 591 539 596 1648 592 545 590 536 599 516 599 521 593 529 596 529 596 533 592 541 594 541 594 532 593 524 591 529 596 527 598 528 597 531 594 538 597 538 597 509 595 7878 592 525 600 520 594 528 597 531 594 534 591 541 594 1653 597 1643 597 521 593 528 597 527 598 529 596 534 591 543 592 545 590 536 599 517 597 521 593 529 596 531 594 536 599 535 600 537 598 528 597 518 596 522 592 530 595 532 593 537 598 535 590 546 589 536 599 517 597 523 591 533 592 534 601 529 596 538 597 540 595 533 592 524 590 528 597 525 600 526 599 531 594 538 597 540 595 530 595 520 594 524 590 530 595 531 594 536 599 533 592 543 592 534 591 1638 591 1642 598 526 599 529 596 535 600 1644 596 1655 595 1624 595 7885 596 520 594 524 591 532 593 534 591 539 596 536 599 536 599 526 599 516 598 1631 598 525 600 528 597 533 592 543 592 544 591 536 599 516 598 521 593 529 596 530 595 535 600 532 593 544 591 534 591 525 600 519 595 526 599 527 598 532 593 541 594 542 593 532 593 522 592 526 599 525 600 1638 591 1648 592 1654 596 541 594 534 591 525 590 528 597 527 598 529 596 534 591 543 592 545 601 526 599 517 597 1632 597 526 599 1642 598 1647 593 1653 597 540 595 513 591 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 9007 4379 601 1628 591 1643 597 526 599 529 596 537 598 535 600 538 597 1641 599 517 597 1632 597 1639 590 535 600 529 596 537 598 536 599 526 599 1630 599 521 593 533 592 535 600 531 594 541 594 543 592 534 591 525 600 1630 599 525 600 530 595 1647 593 540 595 543 592 533 592 524 590 528 597 526 599 528 597 533 592 540 595 543 592 535 600 517 597 522 592 530 595 532 593 535 590 542 593 543 592 516 598 7876 594 523 591 528 597 528 597 531 594 538 597 537 598 1651 599 1639 590 525 600 520 594 529 596 531 594 535 590 543 592 544 591 534 591 524 590 529 596 526 599 527 598 531 594 539 596 540 595 529 596 520 594 525 600 522 592 533 592 538 597 536 599 538 597 529 596 519 595 525 600 523 591 535 600 531 594 539 596 541 594 533 592 524 590 528 597 524 590 536 599 531 594 538 597 540 595 531 594 523 591 530 595 529 596 530 595 536 599 534 591 547 599 528 597 1632 597 1637 592 532 593 536 599 1641 599 535 600 1651 599 1623 596 7879 591 526 599 520 594 527 598 528 597 532 593 538 597 538 597 528 597 519 595 1636 593 529 596 533 592 538 597 537 598 541 594 534 591 527 598 523 591 532 593 533 592 540 595 538 597 540 595 532 593 524 601 519 595 528 597 529 596 534 591 544 591 547 599 529 596 520 594 526 599 524 590 1645 595 1646 594 1653 597 541 594 534 591 525 600 519 595 528 597 529 596 535 600 533 592 546 600 528 597 520 594 1637 592 532 593 1647 593 1649 591 1656 594 543 592 518 596 -# +# name: POWER type: parsed protocol: NECext address: 81 66 00 00 command: 81 7E 00 00 -# +# name: TEMP- type: parsed protocol: NECext address: 81 66 00 00 command: 8A 75 00 00 -# +# name: TEMP+ type: parsed protocol: NECext address: 81 66 00 00 command: 85 7A 00 00 -# +# name: POWER type: parsed protocol: NECext address: 10 E7 00 00 command: 00 FF 00 00 -# +# name: TEMP+ type: parsed protocol: NECext address: 10 E7 00 00 command: 15 EA 00 00 -# +# name: TEMP- type: parsed protocol: NECext address: 10 E7 00 00 command: 0D F2 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4459 4369 593 1562 590 487 599 1555 597 481 595 482 594 483 593 485 591 1563 599 1555 596 481 595 482 594 484 592 485 591 486 590 1565 597 479 596 481 594 1559 593 1562 590 1565 597 1557 595 482 594 484 592 485 591 1564 598 1556 596 1559 593 1561 591 1564 598 1556 596 1558 594 1561 591 1564 598 1556 595 1559 593 1561 591 1564 598 1556 596 1559 593 1561 591 486 590 1565 597 1557 595 1559 593 1562 590 488 598 478 598 479 597 5158 4453 4375 597 480 595 1558 594 484 592 1563 589 1565 597 1558 594 1560 592 485 591 487 589 1565 597 1557 594 1560 592 1562 590 1565 597 479 596 1558 594 1561 591 486 590 488 598 478 598 480 596 1558 594 1561 591 1563 599 478 598 479 596 481 595 482 594 484 592 485 591 486 600 478 598 479 597 480 595 481 595 483 593 484 592 485 591 487 589 488 598 1555 596 481 594 483 593 484 592 485 591 1564 598 1556 596 1559 593 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4428 4402 570 1584 568 510 566 1588 564 513 563 514 562 542 544 507 569 1586 566 1588 564 513 563 541 535 542 544 533 543 535 541 1588 564 513 563 541 545 1583 569 1586 565 1589 563 514 562 542 544 1584 568 536 540 1589 563 1592 570 1584 568 1587 564 1591 561 1594 568 1586 566 1590 572 1582 570 1585 567 1588 564 1591 561 1594 568 1586 566 1589 573 1592 533 543 1586 566 1589 562 1592 570 533 543 1586 565 1589 563 1592 570 5186 4456 4374 567 510 566 1589 563 541 535 1593 569 1586 565 1589 563 1592 570 533 542 535 541 1587 565 1591 560 1594 568 1586 566 1589 563 541 535 1594 568 1586 566 538 538 539 537 541 535 1593 569 1586 566 537 539 1589 562 515 560 543 543 534 541 536 540 537 539 539 537 514 562 542 544 533 542 534 541 536 540 537 539 539 537 540 546 531 545 533 542 1586 566 537 539 512 564 540 536 1593 569 534 541 536 540 537 539 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4426 4404 568 1587 564 538 538 1591 561 543 543 534 542 536 539 537 539 1589 563 1618 544 533 543 535 541 536 540 538 538 539 537 1591 561 543 543 534 542 1586 565 1616 536 1593 569 534 542 536 540 1614 538 1617 545 1583 569 1587 564 1616 536 1593 569 1585 567 1588 564 1591 561 1594 568 1586 566 1588 564 1591 561 1594 568 1587 565 1589 563 1592 570 1585 567 536 540 1589 562 1592 570 1584 568 536 540 1589 563 1591 571 533 542 5187 4424 4405 567 536 540 1588 563 541 535 1593 569 1585 567 1588 574 1581 571 533 542 535 541 1587 565 1616 536 1592 570 1585 567 1588 564 539 537 1592 570 1584 568 536 540 538 538 539 537 1618 544 1610 542 536 540 538 538 539 537 541 545 532 544 533 543 535 541 536 540 537 539 539 537 540 536 542 534 543 543 534 542 536 540 537 539 539 537 540 546 1608 544 534 542 535 541 537 539 1615 537 541 535 543 543 1584 568 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4408 4423 570 1585 567 537 539 1590 561 542 544 533 542 535 541 537 539 1589 563 1593 569 534 541 1588 563 539 537 541 545 532 543 534 541 536 539 537 539 1590 562 1593 569 1586 566 538 538 539 537 1592 570 1585 567 1587 565 1590 561 1594 568 1586 565 1590 561 1593 569 1586 566 1589 562 1592 570 1584 568 1587 564 1590 561 1594 568 1586 565 1590 572 1583 568 534 541 1588 564 540 536 1593 569 534 541 1587 564 539 537 1592 570 5186 4455 4374 567 537 539 1590 561 542 544 1584 567 1588 563 1591 560 1594 568 535 541 537 539 1590 561 541 545 1584 568 1587 564 1590 561 1593 569 1586 565 1589 562 540 536 542 544 533 542 1586 566 1588 563 540 536 542 544 533 542 535 540 537 539 538 538 539 537 541 535 542 544 534 541 535 540 537 539 538 537 540 536 541 545 532 543 534 541 536 539 1589 562 540 536 1593 569 534 541 1588 563 540 535 1593 569 534 541 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3472 1691 441 1285 464 1265 443 451 408 459 410 456 434 1266 462 404 434 431 459 1271 437 1317 432 410 459 1293 435 407 431 436 433 1321 428 1273 435 432 458 1270 438 1314 414 426 433 432 458 1296 412 427 463 408 441 1312 406 432 437 432 437 456 434 411 438 425 465 404 434 433 457 414 455 414 455 414 434 430 460 410 439 423 436 432 458 411 438 425 434 459 410 430 439 428 462 405 433 1317 411 427 463 430 408 432 468 439 441 406 432 1318 431 1268 440 425 454 416 463 404 434 1291 437 1284 455 443 437 1265 432 434 456 413 435 436 433 432 437 456 434 1296 432 1266 462 409 460 1265 463 1309 409 429 461 410 439 1287 441 1284 434 433 436 429 440 424 435 1317 411 1312 406 459 431 414 435 1286 463 1265 463 408 441 1280 459 1269 439 1311 407 434 435 460 430 413 435 434 435 427 463 411 438 427 442 423 436 431 438 428 441 450 409 434 435 456 434 413 456 411 437 428 431 460 409 433 436 431 438 429 440 427 442 422 437 426 433 445 435 457 412 432 437 428 441 452 407 436 464 403 456 413 466 407 441 428 441 428 462 411 437 426 464 405 433 434 435 429 440 427 442 425 434 429 440 426 433 434 435 432 437 434 456 416 432 432 458 409 440 1288 440 1283 435 1288 441 429 440 453 406 1295 433 1290 439 426 443 17056 3607 1696 457 1271 437 1291 438 429 461 411 469 407 462 1292 405 461 408 433 436 1287 462 1265 432 435 434 1289 460 411 458 409 439 1286 463 1267 441 426 433 1319 409 1314 414 455 414 453 406 1295 433 431 459 435 434 1269 460 410 459 410 439 452 438 405 433 430 439 427 463 407 441 421 438 429 440 426 433 435 455 412 436 428 462 409 460 409 440 425 434 460 409 457 412 431 438 427 432 1293 435 429 440 425 434 429 440 426 433 430 439 1284 434 1315 413 425 465 405 433 434 435 1286 463 1264 464 407 462 1266 442 425 465 405 464 409 440 425 434 458 432 1271 457 1270 438 429 461 1298 410 1318 410 454 436 410 438 1282 457 1271 437 430 439 430 439 430 460 1270 438 1288 440 426 433 463 437 1266 442 1282 457 415 433 1290 439 1282 436 1290 438 452 407 430 439 428 441 421 438 429 440 427 463 406 442 421 459 410 459 408 461 408 440 426 433 456 413 430 470 408 440 450 430 422 457 414 434 431 438 428 441 424 455 413 435 432 437 430 439 425 465 407 441 449 410 431 459 408 461 417 463 409 439 425 434 433 436 431 438 427 463 406 463 410 439 431 438 424 435 432 437 452 438 405 433 460 409 454 436 409 439 427 442 449 431 417 442 429 440 1281 437 1286 432 1291 458 413 435 432 468 1277 431 1295 464 402 457 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3469 1701 462 1263 434 1289 439 428 441 426 464 407 441 1311 428 441 407 431 438 1287 462 1290 407 457 433 1267 441 424 455 414 455 1274 465 1290 407 435 455 1297 431 1299 429 416 463 432 406 1317 411 429 461 406 442 1281 437 430 460 409 460 407 441 450 429 417 462 405 464 407 441 426 433 432 437 427 442 425 434 460 409 431 438 427 432 437 463 404 465 402 436 431 438 427 442 425 465 1306 433 437 411 455 435 406 442 425 434 435 455 1275 443 1307 442 405 433 461 429 422 457 412 457 410 438 1313 436 1268 440 438 462 436 412 425 465 403 435 458 442 1294 434 1268 440 451 439 1269 459 1292 436 431 407 438 462 1270 438 1288 461 432 437 430 408 443 457 1295 433 1293 435 431 438 1287 431 1295 433 1297 431 411 458 1270 438 1317 411 1312 437 405 433 436 433 458 432 409 440 428 441 423 436 429 440 436 464 403 435 434 456 437 411 427 432 438 462 407 431 438 462 409 439 430 439 432 458 413 435 430 460 433 415 425 434 431 438 455 414 427 442 423 436 429 461 408 440 451 408 439 461 410 438 426 433 435 434 432 437 428 462 407 462 409 460 407 462 405 433 434 435 434 435 434 456 411 437 454 415 423 456 413 435 429 440 429 440 425 434 1318 431 438 410 432 458 1273 434 443 457 1268 460 1266 462 406 463 17223 3603 1724 408 1318 410 1287 441 449 410 455 414 425 434 1316 412 426 464 429 409 1290 438 1285 433 432 437 1313 436 407 441 423 436 1316 412 1314 414 428 441 1285 464 1263 465 428 410 431 459 1269 439 452 407 434 466 1273 455 413 456 416 463 403 435 456 434 407 462 412 457 412 436 432 437 432 437 432 437 428 441 452 407 434 435 432 458 411 437 454 436 409 439 428 462 414 455 411 458 1268 440 427 442 451 408 433 457 410 459 412 457 1295 413 1311 407 462 438 405 433 434 456 411 437 429 440 1314 435 1265 432 458 442 436 412 455 435 417 462 433 436 1265 463 1291 437 403 435 1315 434 1300 408 433 457 410 438 1314 414 1283 435 458 411 432 437 430 460 1294 414 1310 439 403 435 1289 439 1310 439 1267 461 419 440 1310 408 1289 439 1286 442 427 463 408 461 410 438 427 463 404 434 433 436 429 461 406 432 435 434 430 439 426 464 405 433 432 437 436 464 408 440 450 409 432 437 430 470 410 459 412 457 410 438 428 431 441 438 428 441 428 441 426 433 432 437 428 441 425 465 403 435 434 435 432 458 411 437 427 442 449 410 433 457 413 456 413 435 432 437 429 440 451 408 437 442 425 465 409 439 436 464 405 433 432 437 427 442 425 434 1316 412 433 457 410 459 1269 459 407 462 1292 415 1284 434 433 436 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3467 1703 460 1266 441 1281 437 430 439 455 435 410 438 1287 462 407 441 450 409 1290 459 1266 442 450 430 1269 439 453 406 437 463 1267 461 1266 442 454 436 1266 441 1310 429 412 457 436 433 1295 433 409 439 428 431 1321 428 414 465 402 436 436 433 445 455 416 432 432 437 430 439 428 462 418 461 410 459 434 414 426 433 439 440 453 406 437 432 435 434 430 439 426 433 434 456 437 411 1290 438 453 437 404 434 435 434 435 434 435 465 1262 456 1296 411 453 406 438 441 423 436 1316 433 1293 435 409 439 1289 439 428 462 409 439 454 415 426 433 434 435 1290 438 1287 441 424 435 1288 440 1283 435 468 432 408 440 1283 456 1272 436 458 432 418 461 408 440 1308 431 1269 459 407 462 1303 415 1285 433 1292 436 429 440 1283 435 1293 456 1270 438 455 414 425 434 457 412 431 438 429 440 429 440 425 434 431 438 428 462 445 434 406 463 409 439 425 434 431 459 408 440 427 432 437 442 425 434 431 438 426 433 461 429 412 436 432 437 430 460 409 439 452 407 432 437 432 458 411 458 411 437 429 440 427 442 423 436 435 434 433 457 417 431 444 456 414 434 430 439 452 407 434 435 458 411 429 440 454 405 438 431 438 441 423 456 411 437 429 461 413 435 434 435 434 435 1287 462 432 406 1293 456 1271 457 412 436 17062 3577 1724 460 1266 442 1308 410 457 433 408 440 425 434 1293 456 416 432 459 431 1268 440 1284 455 412 436 1289 439 430 439 430 439 1310 408 1289 439 428 462 1268 440 1286 442 422 457 412 457 1297 411 428 441 426 433 1293 456 411 437 430 439 428 462 409 439 428 441 423 436 429 461 409 439 429 440 429 440 451 408 435 455 415 433 433 436 431 459 408 440 425 454 414 465 406 463 404 465 1260 437 430 439 428 441 426 464 403 466 406 432 1292 457 1269 459 408 440 451 408 435 455 1272 456 1278 461 407 462 1265 442 451 408 459 410 431 438 431 438 429 440 1309 409 1288 440 425 454 1271 457 1268 460 411 437 430 439 1295 454 1271 437 431 438 429 440 427 442 1283 455 1272 436 434 456 1296 412 1285 464 1262 435 431 459 1267 461 1264 433 1291 458 413 435 429 461 409 439 430 439 452 407 434 435 456 413 454 415 423 456 411 458 408 440 429 461 406 442 449 410 457 433 415 433 436 433 436 433 436 433 436 433 458 411 429 440 427 432 435 465 404 434 431 459 412 436 431 469 407 462 405 464 402 436 431 438 431 438 458 432 408 440 425 434 457 433 410 438 453 406 437 432 433 436 455 414 426 433 432 458 409 439 454 436 407 462 407 441 428 431 436 433 434 435 458 432 1269 439 431 438 1287 462 1266 442 425 434 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3467 1697 456 1270 458 1306 412 424 456 440 408 432 437 1315 413 427 442 451 408 1321 438 1293 435 405 433 1319 430 411 437 455 414 1312 416 1307 432 435 413 1286 463 1291 417 422 437 457 412 1313 436 438 410 454 405 1292 436 431 438 424 435 432 458 438 410 432 437 454 436 410 438 452 407 430 439 430 460 409 460 411 437 427 442 425 434 431 459 415 433 458 432 417 442 432 458 414 434 1315 413 423 436 458 411 434 456 417 442 432 437 456 413 1308 431 412 436 427 463 406 463 404 465 404 434 433 436 1314 435 410 438 426 464 432 406 434 435 432 437 1287 462 405 433 462 407 1318 410 1316 433 438 410 430 439 1285 433 1292 436 431 459 412 436 431 459 1269 439 1316 412 428 431 1321 407 1318 410 1316 433 409 440 1308 431 1298 430 1297 431 436 412 428 462 436 412 428 431 436 464 405 433 432 437 432 437 429 461 448 411 428 462 412 436 428 441 448 431 411 437 456 413 454 405 436 433 460 409 427 432 436 464 405 433 436 433 458 432 413 435 429 440 423 436 433 457 413 456 415 433 431 438 429 440 425 454 419 440 425 465 411 437 436 464 407 441 424 435 428 441 452 407 436 433 432 437 432 437 456 434 411 437 425 465 404 434 433 457 1276 463 409 439 429 461 1294 434 1293 414 450 409 1317 411 456 413 17057 3603 1727 415 1310 408 1318 431 436 433 407 462 412 436 1287 431 462 438 405 433 1319 440 1290 407 461 429 1299 408 432 458 411 437 1289 439 1310 429 443 416 1305 434 1297 431 435 413 452 438 1292 436 411 437 453 416 1293 456 444 415 432 437 456 413 425 434 458 411 456 413 427 442 449 430 415 433 431 459 415 433 442 458 414 434 430 460 433 405 436 464 416 463 410 438 429 440 451 428 1301 438 436 412 426 433 437 432 432 437 432 437 430 439 1313 405 434 435 434 435 460 409 432 437 430 439 423 456 1298 430 410 438 429 440 427 432 433 436 431 438 1314 414 448 431 409 460 1294 413 1284 434 459 431 438 410 1289 460 1270 437 458 432 413 435 434 435 1315 434 1268 460 406 463 1291 416 1307 411 1313 436 409 439 1312 406 1318 410 1317 432 409 439 427 432 462 407 436 464 405 464 402 457 413 435 456 413 429 440 431 438 427 432 435 434 431 459 408 440 427 442 425 434 431 438 428 441 424 435 432 437 430 439 454 436 407 462 405 433 436 464 406 432 432 437 432 458 410 459 412 436 428 441 422 437 430 439 430 439 452 407 436 433 434 456 415 433 430 460 409 439 428 462 409 460 409 460 409 439 425 465 405 433 429 440 454 436 407 441 1308 410 457 412 429 440 1312 406 1319 409 429 440 1288 461 408 461 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9026 4518 591 1706 564 1709 561 581 564 579 566 579 566 580 565 1686 595 1708 562 1709 561 1711 569 1705 565 578 567 1683 587 1690 591 1687 593 577 568 573 562 579 566 577 568 575 560 584 561 1689 591 1686 594 1682 588 579 566 576 569 574 561 582 563 581 564 582 563 558 587 583 562 579 566 575 560 583 562 581 564 580 565 1686 594 1683 587 583 562 579 566 576 569 574 561 582 563 581 564 582 563 558 587 582 563 578 567 575 560 582 563 580 565 579 566 1684 586 561 594 575 560 581 564 578 567 576 559 584 561 583 562 558 587 560 585 584 561 580 565 577 568 574 561 582 563 581 564 556 589 558 587 582 563 578 567 575 560 582 563 580 565 579 566 1684 586 561 594 576 559 582 563 578 567 576 559 584 561 583 562 558 587 560 595 574 561 1711 559 582 563 1711 559 584 561 583 562 557 588 559 586 584 561 1711 559 1713 567 1705 565 1710 560 1689 591 1686 594 552 593 1706 564 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9031 4513 585 1712 568 1705 565 578 567 576 569 576 559 561 594 1683 587 1689 591 1707 563 1710 560 1714 566 577 568 1682 588 1689 591 1687 593 577 568 573 562 580 565 577 568 576 569 575 560 1691 589 1663 617 1685 595 572 563 579 566 577 568 575 560 584 561 583 562 558 587 1690 590 577 568 573 562 581 564 579 566 578 567 1658 612 1666 614 582 563 578 567 574 561 582 563 580 565 579 566 554 591 556 589 581 564 577 568 574 561 581 564 579 566 578 567 1685 585 535 620 576 569 572 563 579 566 576 569 575 560 584 561 559 586 561 594 575 570 571 564 578 567 576 569 574 561 583 562 582 563 558 587 583 562 579 566 576 569 574 561 582 563 581 564 1688 592 554 591 579 566 575 560 582 563 579 566 577 568 576 569 551 594 527 618 578 567 575 560 582 563 579 566 578 567 577 568 552 593 554 591 579 566 576 569 1705 565 577 568 1706 564 1687 593 1684 586 560 595 572 563 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 9032 4512 586 1711 569 1704 566 577 568 575 560 585 560 560 595 1656 614 1689 591 1707 563 1709 561 1713 567 576 569 1682 588 1689 591 1687 593 576 569 573 562 580 565 578 567 576 569 575 560 1691 589 1689 591 1685 595 572 563 579 566 576 569 574 561 583 562 558 587 561 594 575 560 582 563 578 567 576 569 574 561 583 562 1689 591 1686 594 576 569 573 562 580 565 577 568 576 569 575 560 560 595 552 593 577 568 574 561 580 565 578 567 577 568 576 569 1682 588 559 586 584 561 580 565 577 568 575 560 584 561 583 562 558 587 560 595 575 560 581 564 578 567 575 560 584 561 583 562 582 563 558 587 583 562 579 566 576 569 574 561 582 563 581 564 1687 593 554 591 579 566 575 560 582 563 580 565 578 567 577 568 553 592 555 590 579 566 1707 563 579 566 576 569 575 560 584 561 559 586 561 594 575 560 1712 568 1705 565 578 567 1707 563 1687 593 1684 586 561 594 1705 565 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 608 17795 3020 8937 519 502 495 1493 492 475 522 472 525 469 518 476 521 472 525 469 518 476 521 1493 492 503 494 499 498 1490 495 500 517 503 494 1493 492 1497 498 1463 521 1467 517 1470 525 470 517 503 494 500 497 497 490 504 493 501 496 497 490 504 493 528 469 498 519 474 513 481 516 505 492 501 496 498 499 468 519 502 495 499 498 468 519 502 495 499 498 496 491 503 494 499 498 496 491 530 467 500 497 496 521 500 487 480 517 503 494 473 524 1464 521 1467 517 1471 524 1491 493 2972 2993 8939 517 1523 472 495 492 502 495 499 518 502 495 499 488 506 491 503 494 472 525 1490 495 472 525 496 491 1470 525 496 491 1497 498 1517 467 1494 490 1497 518 1470 514 1474 521 473 524 470 517 503 494 473 524 470 517 504 493 474 523 497 490 504 493 501 496 498 489 504 493 528 469 525 462 504 513 508 489 478 519 501 496 498 499 468 519 475 522 498 499 495 492 475 522 471 526 495 492 502 495 499 498 495 492 502 495 526 471 522 465 529 468 499 518 475 522 499 498 2967 2998 8933 523 1464 520 474 523 470 517 477 520 474 523 497 490 504 493 501 496 498 489 1499 496 525 493 474 513 1502 493 474 523 1465 519 1468 516 478 519 1468 517 1499 496 1492 493 1522 462 1499 496 1492 493 1495 520 1468 516 478 519 474 523 471 516 1472 523 1465 519 1469 526 495 492 502 495 498 499 495 492 529 468 499 498 495 492 529 488 1473 522 1466 518 475 522 472 525 1463 522 1466 518 502 495 499 498 496 491 503 494 499 498 496 491 503 494 1494 521 1493 492 1470 525 1463 521 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 603 17909 2988 8942 524 496 491 1523 472 496 491 530 467 526 471 496 521 499 488 506 491 503 494 1467 518 503 494 500 497 1463 522 500 497 497 490 1498 497 1491 493 1494 490 1498 497 1491 514 507 490 504 493 501 496 498 499 494 493 501 496 498 489 505 492 502 495 498 499 495 492 502 495 499 498 495 492 529 468 526 471 523 494 499 488 506 491 503 494 499 498 496 491 503 494 500 497 496 491 503 494 500 497 497 490 504 493 500 497 497 490 504 493 1495 489 1498 517 1471 514 1475 520 2947 3018 8939 517 1471 524 497 490 504 493 500 497 497 490 504 493 501 496 498 489 505 492 1495 489 531 486 508 489 505 492 1469 515 1472 523 1466 518 502 495 1466 518 1470 525 1463 522 1467 517 1497 498 1491 514 1474 521 1467 517 503 494 499 498 496 491 1470 525 1463 522 1468 517 503 494 500 497 497 490 504 493 528 469 524 463 531 486 508 489 1471 524 1465 519 501 496 498 499 495 492 502 495 498 499 495 492 1496 499 495 492 502 495 499 498 523 464 1496 519 1470 515 1474 521 1467 517 -# +# name: POWER type: parsed protocol: NEC address: 80 00 00 00 command: 9C 00 00 00 -# +# name: MODE type: parsed protocol: NEC address: 80 00 00 00 command: 9D 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 01 FF 00 00 command: 12 ED 00 00 -# +# name: TEMP+ type: parsed protocol: NECext address: 01 FF 00 00 command: 1A E5 00 00 -# +# name: TEMP- type: parsed protocol: NECext address: 01 FF 00 00 command: 13 EC 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4384 4380 522 1611 551 1609 553 1607 555 1605 557 523 547 533 548 1612 550 530 551 529 552 528 553 527 554 526 555 1605 557 1603 549 531 550 1610 552 528 553 527 554 527 554 526 555 525 556 524 546 1613 549 1611 551 1609 553 1607 555 1605 557 1603 548 1611 551 1609 553 527 554 527 554 526 555 525 556 524 557 523 547 533 548 532 549 531 550 1609 553 527 554 1606 556 1604 547 533 548 532 549 531 550 530 551 529 552 528 553 527 554 526 555 525 556 524 557 523 547 532 549 1611 551 529 552 528 553 528 553 527 554 526 555 525 556 524 546 533 548 532 549 1611 551 1609 553 527 554 526 555 525 556 524 557 523 547 7458 4392 4345 556 1604 547 1612 550 1611 551 1609 553 527 554 526 555 1605 557 523 547 533 548 532 549 531 550 530 551 1609 553 1607 555 525 556 1604 547 532 549 532 549 531 550 530 551 529 552 528 553 1607 555 1605 557 1603 548 1611 551 1610 552 1608 554 1606 556 1604 547 533 548 532 549 532 549 531 550 530 551 529 552 528 553 527 554 526 555 1604 547 533 548 1612 550 1610 552 528 553 528 553 527 554 526 555 525 556 524 557 523 547 533 548 532 549 531 550 530 551 529 552 1607 555 525 556 525 556 524 557 523 547 533 548 532 549 531 550 530 551 529 552 1607 555 1605 557 523 547 533 548 532 549 531 550 530 551 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4386 4350 550 1611 550 1609 552 1607 554 1606 555 524 556 524 556 1603 548 532 549 531 550 530 551 530 550 529 552 1608 553 1606 555 524 556 1603 548 532 549 532 548 531 550 530 551 530 550 529 551 1608 553 1606 555 1604 557 1602 549 1611 550 1610 551 1608 553 1607 554 525 555 525 555 524 556 524 556 523 547 533 547 532 549 531 549 531 550 1609 552 528 552 1607 554 1605 556 1603 548 533 548 532 548 531 550 531 549 530 551 529 552 529 552 528 552 527 553 526 554 525 555 1604 547 533 548 532 548 531 550 531 550 530 551 529 552 528 552 527 553 527 553 1605 556 1603 548 1612 549 531 549 530 551 530 550 529 552 7452 4385 4352 548 1612 549 1610 551 1609 552 1607 554 526 554 525 555 1605 556 523 547 533 547 532 548 532 548 531 549 1610 551 1608 553 526 554 1606 555 524 556 524 556 523 547 533 547 533 548 532 548 1610 551 1608 553 1607 554 1605 556 1604 547 1613 548 1611 550 1610 551 529 551 528 553 527 553 527 553 526 554 526 554 525 555 524 556 524 546 1613 548 531 549 1610 551 1608 553 1607 554 526 554 525 555 525 555 524 556 524 556 523 547 533 547 532 548 531 550 531 550 530 550 1608 553 527 553 526 554 526 554 525 555 525 555 524 556 523 547 533 547 532 548 1611 550 1609 552 1607 554 526 554 526 554 525 555 525 555 -# +# name: TEMP- type: raw frequency: 38000 @@ -536,259 +572,259 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4406 4356 571 1574 563 509 564 1581 566 506 567 504 569 529 544 501 562 1582 565 1580 567 505 568 503 570 1575 562 510 563 508 565 1580 567 1604 543 529 544 1574 563 1582 565 507 566 1579 568 1577 570 1575 572 500 563 1582 565 1579 568 1577 570 1575 572 1573 564 1581 566 1579 568 1577 570 1575 572 1573 564 1581 566 1579 568 1577 570 1575 572 1573 564 1582 565 506 567 1578 569 1576 571 1574 563 1582 565 1580 567 505 568 503 570 5162 4408 4354 562 535 538 1581 566 505 568 1577 570 1575 572 1573 564 1581 566 506 567 505 568 1576 571 1573 564 509 564 1580 567 1578 569 503 570 501 562 1583 564 507 566 506 567 1577 570 502 571 500 563 509 564 1580 567 505 568 503 570 501 572 499 564 508 565 506 567 531 542 503 570 501 562 536 537 534 539 506 567 504 569 529 544 527 536 510 564 1580 567 505 568 503 570 501 572 526 537 508 565 1579 568 1577 570 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1347 405 1322 422 410 1332 1300 448 1289 480 383 1303 445 1298 439 1331 417 1299 438 1332 416 1302 1320 6834 1292 456 1292 450 413 1304 1328 445 1292 452 411 1302 446 1297 440 1303 445 1298 439 1303 445 1301 1321 6806 1320 453 1295 422 441 1301 1321 454 1294 422 441 1301 436 1305 443 1300 448 1295 442 1301 447 1298 1324 6802 1324 451 1297 420 443 1299 1323 424 1324 419 444 1298 439 1304 444 1298 439 1304 444 1299 438 1306 1326 6815 1321 453 1295 421 442 1302 1320 426 1322 421 442 1301 436 1306 442 1301 447 1296 441 1301 447 1299 1323 6802 1324 424 1324 418 445 1300 1322 424 1324 419 444 1298 439 1304 444 1299 438 1304 444 1299 438 1306 1326 6809 1328 420 1317 424 439 1306 1326 419 1318 424 439 1304 444 1299 438 1305 443 1299 438 1305 443 1302 1320 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 782 708 2923 2885 777 2176 748 2232 775 2152 782 736 752 2176 779 711 777 2179 776 2178 746 2181 774 744 754 737 771 720 778 713 775 716 782 737 751 740 779 712 828 717 833 657 779 713 775 2180 775 716 782 2173 772 720 778 2177 778 713 775 2180 775 716 772 2183 751 740 748 2180 775 715 835 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 775 718 2933 2878 773 2183 750 2179 775 2207 778 742 756 2172 782 2175 779 2150 783 737 750 743 775 743 755 764 723 743 755 738 749 743 776 744 754 739 748 744 754 739 779 2229 756 736 751 2178 776 744 754 2176 778 716 782 2174 780 740 747 2182 751 742 776 2179 754 2176 778 742 756 2174 780 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 746 745 2927 2882 748 2180 774 2207 778 2202 752 740 747 2181 752 2229 725 2203 751 2204 729 736 772 747 751 741 746 745 753 739 748 743 776 742 756 736 751 740 747 745 805 2202 752 740 747 2181 773 746 752 2176 778 715 772 2182 772 720 777 2177 746 746 772 2182 751 2178 776 742 756 736 803 -# +# name: MODE type: parsed protocol: NECext address: 81 66 00 00 command: 9B 64 00 00 -# +# name: TEMP- type: parsed protocol: NECext address: 01 08 00 00 command: 31 00 00 00 -# +# name: TEMP+ type: parsed protocol: NECext address: 01 08 00 00 command: 32 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 01 08 00 00 command: 3F 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 20 00 00 00 command: 02 00 00 00 -# +# name: TEMP+ type: parsed protocol: NEC address: 20 00 00 00 command: 0A 00 00 00 -# +# name: TEMP- type: parsed protocol: NEC address: 20 00 00 00 command: 11 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8917 4491 587 565 534 1665 594 559 540 1659 589 1688 540 534 585 1666 562 1664 564 1661 587 564 535 591 538 1661 567 585 534 1665 563 588 541 559 560 1665 563 563 566 559 540 586 533 1692 536 564 565 534 585 567 532 1667 592 534 565 587 542 531 588 564 535 591 538 561 568 558 540 585 534 565 564 1687 541 1658 560 1667 592 1660 558 1667 561 1664 584 567 542 558 561 564 565 561 538 588 541 558 561 1690 538 1661 567 1659 589 1662 566 1659 559 1667 591 559 540 587 532 541 588 564 535 591 538 561 558 567 542 584 535 565 564 1687 541 532 587 1664 564 1662 566 585 534 1691 537 589 540 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8971 4489 568 584 535 564 565 561 537 588 541 558 561 565 534 592 537 562 567 1659 559 566 563 563 536 1664 584 567 542 584 535 1664 564 587 542 558 561 564 535 591 538 562 567 558 541 585 534 566 563 562 537 589 540 559 560 566 533 593 536 563 566 560 539 587 532 567 562 564 535 591 538 1661 567 1658 590 1662 566 1659 559 1667 592 1660 558 567 562 563 536 590 539 561 558 567 542 584 535 1664 564 1662 586 1665 563 1662 566 1659 589 1663 565 560 559 566 533 593 536 564 565 560 538 587 542 557 562 564 535 591 538 1661 567 585 534 1666 562 1663 585 566 533 1667 592 560 538 -# +# name: POWER type: parsed protocol: NEC address: 80 00 00 00 command: 9B 00 00 00 -# +# name: TIMER type: parsed protocol: NEC address: 80 00 00 00 command: 9F 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4481 4414 595 1596 594 527 562 1602 588 1604 586 535 565 530 570 1594 596 526 563 532 568 1596 594 528 561 534 566 1598 592 1600 590 531 569 1596 594 527 562 1603 587 1604 586 1605 648 1543 594 527 562 1603 587 1604 586 1605 595 525 564 531 569 526 563 532 568 1596 594 528 561 534 566 1598 592 1600 590 1601 589 532 568 527 562 533 567 528 561 534 566 529 560 535 565 530 570 1594 596 1596 594 1597 593 1598 592 1599 591 5252 4503 4418 590 1601 589 532 568 1597 593 1598 592 529 560 535 565 1600 590 531 569 526 563 1602 588 533 567 529 560 1604 596 1595 595 526 563 1602 588 533 567 1598 592 1599 591 1600 590 1601 589 532 568 1598 592 1599 591 1600 590 531 569 527 562 532 568 528 561 1603 587 534 566 530 559 1605 595 1596 594 1597 593 528 561 534 566 529 560 535 565 530 570 525 564 531 569 527 562 1602 588 1603 587 1604 596 1595 595 1596 594 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1307 407 1308 406 441 1257 1305 435 1279 408 439 1259 1303 410 447 1251 443 1255 449 1249 445 1253 441 8177 1308 405 1299 413 444 1254 1308 405 1299 413 444 1253 1309 404 443 1255 439 1259 445 1252 442 1256 448 8169 1306 406 1309 404 443 1254 1308 405 1299 413 444 1253 1298 413 444 1253 441 1257 447 1250 444 1254 440 8176 1299 413 1302 410 447 1250 1301 411 1304 408 439 1259 1303 409 448 1249 445 1252 442 1256 448 1249 445 8171 1304 408 1307 405 442 1256 1306 406 1298 413 444 1253 1299 413 444 1253 441 1257 447 1250 444 1253 441 8175 1300 412 1303 409 448 1249 1302 409 1306 406 441 1256 1306 406 441 1256 448 1249 445 1252 442 1255 439 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9577 4536 622 576 621 577 620 577 620 578 619 578 619 578 619 579 618 1667 625 1660 622 1664 618 1668 624 1662 620 1666 616 1670 622 1664 618 580 617 581 616 1669 623 575 622 575 622 1664 618 580 617 580 617 581 616 1669 623 575 622 1664 618 1668 624 573 624 1662 620 1666 616 1670 622 39798 9556 2250 626 96841 9564 2245 620 96843 9560 2253 622 96836 9569 2244 621 96844 9571 2244 621 96843 9573 2247 619 96844 9572 2248 617 96847 9570 2248 617 96848 9568 2250 626 96833 9564 2251 625 96834 9564 2252 624 96843 9595 2223 653 96809 9597 2221 644 96822 9604 2215 650 96814 9591 2226 650 96813 9591 2225 650 96811 9600 2218 647 96816 9597 2221 654 96812 9601 2219 646 96815 9598 2220 645 96813 9601 2216 649 96815 9599 2219 657 96809 9565 2252 624 96842 9564 2254 622 96841 9565 2254 622 96838 9568 2249 616 96844 9571 2247 619 96842 9574 2245 620 96840 9566 2251 625 96838 9567 2251 625 96835 9570 2250 615 96848 9566 2254 621 96843 9572 2247 618 96847 9567 2253 623 96842 9572 2249 616 96843 9572 2247 618 96843 9572 2249 616 96849 9576 2245 621 96842 9574 2246 619 96842 9575 2246 619 96843 9573 2248 617 96843 9572 2249 616 96847 9571 2249 617 96839 9569 2251 625 96837 9569 2251 624 96837 9568 2250 626 96835 9572 2248 618 96844 9572 2246 619 96843 9564 2253 623 96834 9572 2245 620 96835 9569 2246 619 -# +# name: SWING type: raw frequency: 38000 duty_cycle: 0.330000 data: 9542 4537 620 578 619 578 619 578 619 577 620 577 620 577 620 577 620 1666 616 1669 623 1662 620 1666 616 1670 622 1663 619 1667 615 1671 621 575 622 574 623 1663 619 1666 616 580 617 579 618 578 619 577 620 576 621 1665 617 579 618 577 620 1665 617 1668 614 1671 621 1664 618 1666 616 39847 9511 2253 622 96974 9541 2253 622 97001 9553 2256 619 96996 9567 2256 619 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9611 4510 657 544 653 548 649 552 655 544 653 547 650 550 657 544 653 1637 624 1664 618 1669 623 1663 618 1668 654 1635 647 1642 650 1640 652 550 647 1644 627 1663 619 1669 623 1665 617 1671 621 577 620 578 619 580 617 581 616 581 616 580 617 579 618 578 619 1668 624 1663 619 1669 623 39867 9578 2250 615 96998 9539 2257 618 96975 9513 2250 615 -# +# name: TIMER type: parsed protocol: NEC address: 81 00 00 00 command: 69 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 10 E7 00 00 command: 05 FA 00 00 -# +# name: TIMER type: parsed protocol: NECext address: 10 E7 00 00 command: 01 FE 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 5055 2191 335 1799 360 752 338 714 365 716 364 1800 359 723 367 715 365 718 361 720 359 1805 365 747 332 1802 357 1806 364 719 360 1803 367 1798 361 1803 367 1797 362 1802 368 744 335 1799 360 721 369 714 365 716 363 719 360 721 369 713 366 1798 361 1802 368 715 364 717 362 720 359 723 367 715 364 1799 360 722 368 714 365 717 363 719 361 722 368 714 365 716 363 719 360 721 369 713 366 716 363 718 361 721 359 723 367 1797 362 1802 368 1796 363 1801 358 754 336 716 363 719 361 29583 5057 2160 366 1798 361 750 329 723 367 715 364 1800 359 753 337 715 364 717 363 720 359 1804 366 747 332 1801 358 1806 364 718 361 1803 356 1798 1802 368 1797 362 1802 368 714 365 1799 360 722 368 714 365 717 362 719 360 722 368 714 365 1798 361 1803 367 715 364 718 362 721 359 723 367 715 364 718 361 720 359 723 367 715 364 717 362 720 360 1804 366 1799 360 721 369 714 365 1798 361 1803 367 1798 361 720 359 723 367 715 364 718 361 720 360 723 367 715 364 717 362 720 359 722 368 714 365 717 362 719 360 722 368 1796 363 719 360 721 369 714 365 716 363 719 361 721 369 713 366 716 363 718 361 721 358 723 367 716 363 718 362 720 359 723 367 715 364 718 361 720 359 723 367 715 364 1799 360 1804 366 1799 360 721 369 714 365 716 363 1801 358 754 336 1798 361 720 360 1805 365 748 331 720 359 723 367 715 364 717 363 720 360 722 368 714 365 717 362 720 359 722 368 714 365 717 363 719 361 722 368 714 365 1798 361 751 339 713 366 716 363 1801 359 1805 365 1800 359 1805 365 1800 359 1805 365 1799 360 -# +# name: POWER type: parsed protocol: NECext address: 48 12 00 00 command: 88 08 00 00 -# +# name: TIMER type: parsed protocol: NECext address: 48 44 00 00 command: C8 08 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 5624 5582 567 553 568 550 571 550 561 557 564 584 537 554 567 1672 571 1671 562 554 567 553 568 1696 537 1676 567 1673 570 1668 565 554 567 556 565 1671 562 557 564 1676 567 1671 562 584 537 555 566 1673 570 552 569 1666 567 1671 562 1676 567 1671 572 548 563 556 565 1672 571 554 567 547 564 556 565 1674 569 549 562 558 563 1676 567 551 570 554 568 548 563 557 564 555 566 554 567 1672 571 1667 566 1674 569 1673 570 545 566 554 567 1671 572 1667 566 554 567 1672 561 557 564 1677 566 -# +# name: POWER type: parsed protocol: NECext address: 01 FF 00 00 command: 0A F5 00 00 -# +# name: TIMER type: parsed protocol: NECext address: 01 FF 00 00 command: 1B E4 00 00 -# +# name: TEMP- type: parsed protocol: NECext address: 08 F5 00 00 command: 0D F2 00 00 -# +# name: TIMER type: parsed protocol: NECext address: 08 F5 00 00 command: 06 F9 00 00 -# +# name: POWER type: parsed protocol: NECext address: 08 F5 00 00 command: 00 FF 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3302 1618 435 393 436 391 438 1207 431 396 433 1213 435 392 437 391 438 388 441 1206 432 1214 434 392 437 389 440 388 431 1215 433 1213 435 392 437 390 439 388 431 396 433 395 434 392 437 390 439 388 431 396 433 394 435 392 437 390 439 388 441 1205 433 395 434 392 437 389 440 388 431 396 433 394 435 392 437 1209 439 388 431 397 432 394 435 393 436 1210 438 387 432 396 433 394 435 392 437 390 439 388 431 1215 433 394 435 1211 437 1208 440 1205 433 1213 435 1211 437 1209 439 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8956 4420 563 568 533 545 566 537 564 539 562 541 560 1650 563 1648 565 539 562 542 559 544 567 536 565 1671 542 1643 560 1652 561 543 558 545 566 1645 568 1643 560 544 568 536 565 1646 567 537 564 539 562 541 560 543 558 545 566 537 564 540 561 542 559 544 568 536 565 538 563 540 561 542 559 544 567 536 565 539 562 541 560 543 569 535 566 537 564 540 561 542 559 544 568 536 565 538 563 541 560 543 558 545 567 537 564 539 562 541 560 544 568 535 566 538 563 540 561 542 559 544 568 536 565 539 562 541 560 543 569 536 565 538 563 540 561 543 558 545 566 537 564 540 561 542 559 544 568 536 565 538 563 541 560 543 558 545 567 537 564 540 561 542 559 544 567 537 564 539 562 541 560 544 568 535 566 538 563 540 561 542 559 545 566 537 564 539 562 542 559 544 568 536 565 538 563 540 561 543 558 545 566 537 564 539 562 542 559 544 568 536 565 538 563 541 560 543 558 545 567 537 564 540 561 542 559 544 567 536 565 539 562 541 560 543 569 535 566 538 563 540 561 542 559 545 567 537 564 539 562 541 560 544 568 536 565 538 563 541 560 543 558 545 567 538 563 540 561 542 559 545 567 537 564 539 562 542 559 544 568 536 565 538 563 541 560 543 558 572 540 538 563 540 561 542 559 545 566 537 564 539 562 542 559 544 568 536 565 538 563 1649 564 540 561 1651 562 541 560 544 557 546 566 538 563 541 560 543 558 546 565 538 563 540 561 542 559 545 567 537 564 539 562 542 559 544 567 536 565 539 562 541 560 544 557 546 566 538 563 1649 564 539 583 1630 563 541 591 513 557 546 566 565 536 541 591 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8961 4409 563 541 570 533 568 535 566 537 564 539 562 1649 564 1648 565 539 562 541 570 533 568 536 565 1645 568 1644 569 1643 570 534 567 536 565 1646 567 1645 568 536 565 565 536 1648 565 540 572 558 543 560 541 562 539 564 537 566 546 558 543 560 541 563 538 565 536 567 544 559 542 562 539 564 537 566 546 558 543 561 540 563 538 565 536 568 544 560 541 562 539 564 537 566 546 558 543 561 540 563 538 565 536 568 544 560 541 562 539 564 537 567 545 559 542 561 540 563 538 566 545 558 543 561 540 563 538 565 536 568 544 560 541 562 539 565 536 567 544 559 542 561 540 564 537 566 545 558 543 561 540 563 538 565 536 568 543 560 541 562 539 564 537 566 545 532 569 534 567 537 564 539 562 541 571 560 541 536 565 538 563 540 572 532 569 535 566 537 564 539 573 531 570 534 567 536 565 539 562 541 571 533 568 535 566 538 563 540 572 532 569 535 566 537 564 540 572 532 569 534 567 537 564 539 573 532 569 534 567 536 565 539 562 541 571 533 568 536 565 538 563 541 571 533 568 535 566 538 563 540 572 532 569 535 566 537 564 540 572 532 569 534 567 537 564 539 562 542 570 534 567 536 565 539 562 541 570 534 567 536 565 539 562 542 570 534 567 536 565 539 562 542 570 534 567 536 565 539 562 542 570 534 567 536 565 539 562 542 570 1641 572 1640 563 543 569 535 566 538 563 540 561 543 569 535 566 538 563 540 561 543 569 535 566 538 563 541 571 533 568 536 565 539 562 541 571 534 567 537 564 539 562 542 570 534 567 537 564 1646 567 1646 567 539 562 542 570 534 567 537 564 540 561 542 590 -# +# name: SWING type: parsed protocol: NECext address: 10 E7 00 00 command: 06 F9 00 00 -# +# name: TIMER type: parsed protocol: NECext address: 81 66 00 00 command: 9F 60 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8455 4196 542 1566 541 539 519 535 513 541 517 1565 541 538 520 534 514 540 518 1563 544 1565 542 538 520 533 515 539 519 535 513 541 517 536 522 532 516 538 520 533 515 539 519 535 513 1569 538 542 516 1566 541 539 519 534 514 540 518 1564 542 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8923 4452 599 1629 589 1643 596 527 597 530 594 538 597 536 599 536 599 1640 599 519 595 1641 598 1639 590 535 600 532 592 541 594 543 592 533 591 1638 591 1642 597 527 598 1645 594 538 597 541 594 542 593 532 592 1637 591 1642 597 526 599 530 594 536 599 534 590 546 599 527 598 519 595 525 600 525 600 528 597 533 591 542 593 545 600 528 597 520 594 526 599 526 599 528 597 534 590 544 591 547 598 511 593 7894 594 524 590 530 595 529 595 533 592 539 596 538 597 1655 594 1648 591 527 597 525 600 524 600 526 599 531 593 541 594 543 592 535 600 517 597 523 591 533 591 536 599 532 592 542 593 546 599 530 594 525 600 522 592 533 591 536 599 533 591 542 593 543 592 535 590 526 599 522 592 530 594 533 591 539 596 539 596 541 594 533 592 525 600 521 593 531 593 533 591 540 595 540 595 543 592 536 599 519 595 527 597 528 597 530 594 534 590 543 592 545 600 528 597 521 593 527 598 525 599 1638 591 540 595 540 595 1653 596 1626 592 7894 594 525 600 521 593 531 593 536 599 530 594 537 598 539 596 531 593 525 600 520 594 530 594 533 592 540 595 537 598 538 597 529 595 522 592 528 597 527 598 529 596 534 590 542 593 544 591 537 598 519 595 526 599 526 599 529 596 535 600 534 601 537 598 1646 593 525 600 522 592 532 592 1648 601 1646 593 1655 594 546 599 530 594 522 592 527 598 526 599 529 595 535 600 535 600 537 598 531 593 524 601 519 595 529 596 1641 598 1648 591 1655 594 545 600 1625 593 -# +# name: SWING type: raw frequency: 38000 duty_cycle: 0.330000 data: 8929 4464 598 1633 595 1637 591 535 600 529 595 537 598 540 595 542 593 1643 596 521 593 1640 599 1637 591 538 597 535 600 536 599 540 595 532 592 1635 593 1636 592 531 593 1646 593 537 598 536 599 542 593 1649 600 1631 597 1635 593 531 593 533 602 530 594 539 596 542 593 535 600 517 597 523 591 532 592 532 592 538 597 535 600 536 599 527 597 517 597 523 591 531 593 532 592 536 599 535 600 538 597 513 601 7879 598 519 595 526 598 526 599 530 594 537 598 534 590 1658 591 1648 591 525 599 521 593 531 593 534 590 540 595 538 597 540 595 532 592 525 600 522 592 532 592 535 600 532 592 543 592 1655 594 533 591 527 597 525 600 525 599 529 595 536 599 536 599 539 596 530 594 521 593 526 598 525 600 528 597 535 600 534 590 547 598 530 594 524 601 521 593 531 593 534 601 530 594 540 595 542 593 534 590 526 598 522 592 530 594 532 592 539 596 539 596 541 594 533 591 524 590 529 595 529 596 1642 597 534 590 542 593 545 600 510 594 7889 599 519 595 524 590 533 591 534 590 538 597 536 599 537 598 529 595 1631 598 1635 593 1644 595 534 601 532 592 541 594 543 592 536 599 519 595 525 599 524 600 526 598 530 594 537 598 538 597 529 595 521 593 526 598 525 600 527 597 531 593 541 594 545 600 1641 598 521 593 527 597 526 598 1643 596 1646 593 1658 591 547 598 530 594 524 601 522 592 533 591 535 600 531 593 540 595 543 592 535 600 1628 601 1631 598 1641 598 1642 597 1647 592 1655 594 542 593 1626 592 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8912 4459 593 1636 593 1640 599 525 600 528 597 533 602 532 593 544 601 1637 592 523 591 1639 600 1636 593 535 600 529 596 538 597 541 594 534 601 1629 600 1634 595 531 1719 1649 532 593 541 594 543 602 526 599 519 595 1640 599 525 600 529 596 1649 601 534 601 537 598 529 596 522 603 519 595 529 596 533 602 528 597 538 597 540 595 532 593 523 602 518 596 527 598 528 597 535 600 533 592 545 601 509 595 7882 598 519 595 524 601 521 593 535 600 530 595 538 597 1650 600 1637 602 514 600 517 597 526 599 527 598 532 593 541 594 544 601 525 600 515 599 519 595 527 598 529 596 534 601 532 593 545 600 526 599 519 595 551 574 524 601 526 599 533 602 532 593 545 600 526 599 517 597 523 602 522 603 525 600 532 593 541 594 543 602 525 600 516 598 522 592 530 595 533 602 529 596 539 596 541 594 532 593 524 601 518 596 527 598 528 597 533 602 531 594 543 592 533 602 1625 593 526 599 523 602 1636 603 1639 600 533 592 1657 593 1628 601 7882 597 521 593 527 598 526 599 529 596 535 600 535 600 538 597 531 594 1634 595 1641 598 527 598 531 594 535 600 532 593 542 593 535 600 518 596 524 601 521 593 533 602 528 597 537 598 539 596 528 597 520 594 525 600 521 593 533 602 528 597 536 599 537 598 527 598 517 597 522 603 521 593 1644 595 1646 593 1651 599 537 598 526 599 516 598 520 594 527 598 528 597 532 593 539 596 540 595 531 594 1638 601 1633 596 528 597 1645 594 1652 598 1649 601 535 600 509 595 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4454 4377 594 1560 591 486 589 1565 597 480 595 482 593 484 591 485 590 1564 598 1557 594 1560 591 1563 588 489 597 480 595 482 593 483 592 485 590 487 588 1565 597 1558 593 1562 589 487 588 489 597 1558 593 1561 590 1564 598 1557 594 1560 591 1563 588 1567 595 1560 591 1563 588 1566 596 1559 592 1562 589 1565 597 1558 593 1562 589 1565 597 1557 594 1561 590 486 590 488 598 479 596 1558 593 484 591 1563 588 489 597 1557 594 5161 4459 4371 601 476 589 1565 597 481 594 1560 592 1562 589 1565 597 1558 593 484 591 485 590 487 589 488 598 1556 595 1559 592 1563 588 1566 596 1559 592 1562 589 488 587 489 597 480 595 1559 592 1562 589 488 598 479 596 480 595 482 593 484 591 485 601 476 589 488 598 480 595 481 594 483 592 484 591 486 590 487 588 489 597 480 595 481 594 483 592 1562 589 1565 597 1558 593 483 592 1562 589 488 587 1567 595 482 593 -# +# name: POWER type: raw frequency: 38000 @@ -800,199 +836,199 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3199 1594 380 414 380 1208 379 415 389 405 389 1201 386 407 386 1202 385 409 384 408 385 1203 384 1203 384 1204 383 410 383 1206 381 412 382 1208 379 1207 380 1209 389 404 390 406 387 405 389 406 387 1201 386 1202 385 408 385 1204 383 409 384 1204 383 1205 382 412 382 411 382 413 380 1206 382 414 380 1208 379 414 379 416 388 1201 386 1201 386 1201 386 408 385 1202 385 1204 383 1204 383 1206 381 1205 382 1207 380 1207 380 1208 390 405 388 405 389 406 387 406 387 406 387 407 386 408 385 1202 385 1204 383 1203 384 411 382 1205 382 1205 382 1207 380 1207 381 414 390 404 379 414 380 1210 388 406 387 408 385 406 387 408 385 1202 385 1203 384 409 384 1205 382 1205 382 1206 381 1206 381 1208 379 415 389 404 389 1199 388 407 386 406 387 407 386 408 385 409 384 1202 385 1204 383 1204 383 1204 383 1205 382 412 381 1208 379 1208 379 415 389 404 390 406 387 406 387 407 386 1200 387 409 384 408 385 1202 385 1205 383 410 383 1205 382 1205 382 412 381 1207 380 1207 380 415 389 404 379 1209 389 406 387 405 388 1200 387 408 385 408 385 1202 385 1204 383 1204 383 1204 383 1208 379 1207 380 1207 380 1208 379 416 388 405 388 407 386 407 386 407 386 407 386 407 386 408 385 408 385 1204 383 1204 383 1205 382 1205 382 1207 380 1208 379 414 379 1210 388 406 387 406 387 406 387 407 386 407 386 409 384 1203 384 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3198 1595 389 404 379 1209 389 405 388 406 387 1200 387 407 386 1202 385 409 384 410 383 1203 384 1204 383 1179 408 413 380 1207 380 414 379 1209 389 1172 415 1200 387 406 387 409 384 408 385 409 384 1204 383 1205 382 410 383 1206 381 412 381 1206 381 1183 415 404 389 405 388 406 387 1200 387 406 387 1202 385 408 385 409 384 1204 383 1204 383 1205 382 412 381 1206 381 1181 406 414 390 1199 388 1173 414 1175 412 1175 412 1177 410 409 384 409 384 1205 382 410 383 411 382 412 381 412 382 412 381 1207 380 1209 389 405 389 1199 388 1174 413 1175 412 1175 412 1177 410 410 383 409 384 1205 382 412 381 412 381 413 380 413 380 1208 379 1207 380 414 379 1209 389 1173 414 1176 411 1177 410 1178 409 409 384 410 383 1206 381 411 382 412 381 412 382 413 381 413 380 1208 379 1208 379 1183 415 1173 414 1175 412 407 386 1203 384 1177 410 410 383 412 381 412 381 412 381 412 381 1207 380 414 379 414 379 1208 390 1199 388 405 388 1199 388 1200 387 409 384 1202 385 1177 410 410 383 412 381 1206 381 411 382 413 380 1207 380 413 380 414 380 1208 390 1199 388 1175 412 1175 412 1176 411 1179 408 1178 409 1179 408 412 381 413 380 414 379 414 379 415 389 404 379 414 379 416 388 405 389 1201 386 1200 387 1201 386 1177 410 1177 410 1179 408 411 382 1208 379 413 380 413 381 413 380 415 389 404 389 405 389 1199 388 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3200 1592 382 412 381 1206 381 414 379 414 379 1208 379 416 388 1200 387 406 387 407 386 1202 385 1176 411 1178 409 410 383 1179 408 411 382 1182 416 1172 415 1172 415 404 389 406 387 407 386 408 385 1201 386 1177 410 409 384 1179 408 412 381 1179 408 1181 406 413 380 413 380 414 379 1209 389 405 388 1199 388 406 387 408 385 1202 385 1179 408 1178 409 412 381 1180 407 1182 405 414 379 1182 416 1174 413 1174 413 1176 411 1176 411 410 383 410 383 1204 383 412 381 412 381 412 381 413 380 1209 389 1172 415 1174 413 406 387 1174 413 1177 410 1177 410 1179 408 410 383 412 381 413 380 1206 381 413 380 414 379 414 379 415 389 1199 388 1175 412 407 386 1177 410 1178 409 1178 409 1179 408 1180 407 413 380 414 379 1208 379 415 389 405 388 407 386 406 387 407 386 1201 386 1177 410 1178 409 1179 408 1180 407 412 381 1180 407 1182 405 416 388 405 388 406 387 407 386 407 386 1201 386 409 384 409 384 1204 383 1179 408 411 382 1180 407 1182 405 416 388 1172 415 1173 414 406 387 407 386 1201 386 409 384 410 383 1203 384 410 383 412 381 1206 381 1183 415 1173 414 1173 414 1174 413 1175 412 1178 409 1178 409 410 383 411 382 411 382 412 381 412 381 413 380 413 380 416 388 403 380 1208 379 1184 414 1175 412 1175 412 1176 411 1177 410 411 382 1178 409 411 382 412 381 413 380 413 380 413 380 413 380 1208 379 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3472 1744 416 457 415 1306 418 463 419 466 416 473 419 474 418 478 414 457 415 458 414 463 419 462 420 465 417 472 420 1316 418 479 413 458 414 459 413 464 418 463 419 466 416 473 419 1318 416 1324 420 1295 418 454 418 459 413 1312 422 463 419 470 422 471 421 475 417 454 418 455 417 460 422 459 413 472 420 469 413 480 412 485 417 453 419 454 418 459 413 468 414 471 421 468 414 479 413 484 418 452 420 453 419 458 414 468 414 471 421 467 415 478 414 483 419 451 421 453 419 1301 412 1312 422 463 419 470 422 471 421 476 416 433 418 10535 3469 1746 414 459 413 1308 415 465 417 468 414 475 417 476 416 481 421 449 413 461 421 455 417 465 417 467 415 474 418 1319 415 482 420 450 422 451 421 457 415 466 416 469 413 476 416 1320 414 1327 417 1297 416 457 415 462 420 1305 419 466 416 473 419 474 418 478 414 457 415 458 414 463 419 462 420 465 417 472 420 473 419 477 415 456 416 1301 412 464 418 463 419 1310 413 1319 415 1321 413 485 417 453 419 454 418 459 413 1312 422 1307 416 472 420 1317 416 480 412 459 413 460 412 465 417 464 418 467 415 474 418 475 417 479 413 1302 422 1295 418 1302 421 1303 421 1308 415 473 419 1318 416 481 421 1293 420 1296 417 460 412 1313 421 1307 416 473 419 473 419 478 414 457 415 458 414 463 419 462 420 465 417 472 420 473 419 477 415 456 416 457 415 1306 418 1307 416 1312 422 467 415 478 414 483 419 451 421 452 420 457 415 467 415 469 413 476 416 1321 413 1328 416 1298 415 458 414 463 419 462 420 465 417 472 420 472 420 477 415 456 416 457 415 462 420 461 421 464 418 470 422 471 421 476 416 454 418 1299 414 463 419 461 421 464 418 471 421 472 420 477 415 1299 414 459 413 464 418 463 419 466 416 473 419 473 419 478 414 457 415 458 414 463 419 462 420 465 417 472 420 473 419 477 415 456 416 457 415 1306 417 1307 416 468 414 1319 415 478 414 483 419 430 421 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3473 1716 444 455 417 1304 420 461 421 464 418 471 421 471 421 476 416 455 417 456 416 461 421 460 412 473 419 469 413 1324 420 477 415 455 417 457 415 462 420 461 421 463 419 470 422 1315 419 1321 413 1302 422 451 421 456 416 1309 414 470 422 467 415 478 414 482 420 451 421 452 420 457 415 466 416 469 413 476 416 477 415 481 421 450 412 461 421 456 416 465 417 468 414 474 418 475 417 480 412 458 414 459 413 464 418 463 419 466 416 473 419 474 418 478 414 457 415 458 414 1307 417 1308 416 469 413 476 416 477 415 481 421 428 413 10540 3465 1751 419 454 418 1302 422 459 413 472 420 469 413 480 412 485 417 453 419 454 418 459 413 468 414 471 421 468 414 1322 422 475 417 454 418 455 417 460 412 469 413 472 420 468 414 1323 421 1320 414 1300 413 460 412 465 417 1307 417 468 414 475 417 476 416 481 421 449 413 460 422 455 417 464 418 467 415 474 418 474 418 479 413 458 414 459 413 464 418 463 419 1309 415 1318 416 1321 413 484 418 452 420 453 419 458 414 1311 413 1316 418 471 421 1315 419 478 414 457 415 458 414 463 419 462 420 465 417 472 420 472 420 477 415 1299 414 1302 422 1299 414 1310 414 1315 419 470 422 1315 419 478 414 1300 413 1303 421 456 416 1309 415 1314 420 469 413 480 412 485 417 453 419 454 418 459 413 468 414 471 421 468 414 479 413 484 418 452 420 453 419 1302 422 1303 421 1307 417 473 419 473 419 478 414 457 415 458 414 463 419 462 420 465 417 471 421 1316 418 1322 422 1293 420 452 420 457 415 466 416 469 413 476 416 477 415 482 420 450 422 451 421 456 416 465 417 468 414 475 417 476 416 480 412 459 413 1304 420 457 415 466 416 469 413 476 416 477 415 481 421 1293 420 453 419 458 414 467 415 470 412 477 415 477 415 482 420 450 422 451 421 456 416 465 417 468 414 475 417 476 416 481 421 449 413 1304 420 457 415 1310 414 471 421 1311 413 481 421 475 417 432 419 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3466 1750 420 453 419 1302 422 459 413 472 420 469 413 480 412 485 417 453 419 455 417 460 412 469 413 472 420 469 413 1324 420 476 416 455 417 456 416 461 421 460 422 463 419 470 422 1315 419 1322 412 1302 422 452 420 457 415 1310 414 471 421 468 414 479 413 484 418 452 420 453 419 458 414 468 414 471 421 467 415 478 414 483 419 452 420 453 419 458 414 467 415 470 412 477 415 478 414 483 419 451 421 452 420 457 415 466 416 469 413 476 416 477 415 482 420 450 422 451 421 1300 413 1312 412 473 419 470 412 481 421 475 417 432 419 10572 3473 1743 417 456 416 1305 419 462 420 465 417 472 420 473 419 477 415 456 416 457 415 463 419 461 421 464 418 471 421 1316 418 479 413 457 415 459 413 464 418 463 419 466 416 473 419 1317 417 1324 420 1294 419 454 418 459 413 1312 422 463 419 470 422 471 421 476 416 454 418 455 417 461 421 460 412 473 419 469 413 480 422 475 417 453 419 1298 415 462 420 461 421 1308 415 1317 417 1320 414 483 419 451 421 452 420 1301 412 1312 422 1307 417 473 419 1317 417 480 422 449 412 1304 419 1301 412 1312 422 1307 416 1316 418 1319 415 1326 418 453 419 1298 415 462 420 461 421 464 418 1314 420 1317 417 480 422 449 412 460 422 1299 414 467 415 1313 421 468 414 480 412 484 418 453 419 454 418 459 413 468 414 471 421 468 414 479 413 484 418 452 420 453 419 1302 422 1303 421 1308 415 474 418 474 418 479 413 458 414 459 413 464 418 463 419 466 416 473 419 1318 416 1324 420 1295 418 454 418 459 413 468 414 471 421 468 414 479 413 484 418 452 420 454 418 459 413 468 414 471 421 467 415 478 414 483 419 452 420 1297 416 460 422 459 413 472 420 469 413 480 412 484 418 1297 416 456 416 461 421 460 422 463 419 470 422 471 421 476 416 454 418 455 417 460 422 459 413 472 420 469 413 480 412 485 417 453 419 454 418 1303 421 1304 420 466 416 1316 418 476 416 480 422 1271 412 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3474 1742 417 456 416 1305 418 462 420 465 417 472 420 473 419 478 414 456 416 458 414 463 419 462 420 465 417 472 420 1316 418 479 413 458 414 459 413 464 418 463 419 466 416 474 418 1318 416 1325 419 1296 417 455 417 460 422 1303 421 464 418 471 421 472 420 477 415 456 416 457 415 462 420 461 421 464 418 471 421 472 420 477 415 455 417 456 416 462 420 461 421 464 418 471 421 471 421 476 416 455 417 456 416 461 421 460 422 463 419 470 422 471 421 476 416 454 418 456 416 1305 419 1306 417 467 415 474 418 475 417 480 412 437 414 10576 3468 1747 413 461 421 1299 414 467 415 470 422 467 415 478 414 483 419 451 421 452 420 458 414 467 415 470 412 477 415 1321 413 485 417 453 419 454 418 459 413 469 413 472 420 469 413 1323 421 1320 414 1301 412 460 422 456 416 1309 414 470 422 467 415 478 414 483 419 451 421 452 420 457 415 467 415 470 412 477 415 478 414 482 420 451 421 1296 417 459 413 468 414 1315 419 1314 420 1317 417 480 422 449 412 460 422 455 417 1308 415 1313 421 469 413 1323 421 476 416 455 417 1300 413 1308 415 1309 414 1314 420 1313 421 1316 418 1323 421 450 422 1295 418 458 414 468 414 471 421 1311 413 1324 420 477 415 456 415 457 415 1306 417 464 418 1311 412 476 416 477 415 482 420 450 422 451 421 456 416 466 416 469 413 476 416 477 415 481 421 450 422 451 421 1300 413 1311 412 1316 418 472 420 473 419 477 415 456 416 457 415 463 419 462 420 465 417 472 420 1316 418 1323 421 1294 419 453 419 458 414 468 414 471 421 467 415 478 414 483 419 452 420 453 419 458 414 467 415 471 421 467 415 478 414 483 419 452 420 1297 416 460 422 459 413 472 420 469 413 480 412 485 417 1297 416 457 415 462 420 461 421 464 418 471 421 472 420 477 415 455 417 457 415 462 420 461 421 464 418 471 421 471 421 476 416 455 417 456 416 461 421 1304 419 465 417 1316 418 476 416 480 422 1271 422 -# +# name: POWER type: parsed protocol: NECext address: 86 6B 00 00 command: 12 ED 00 00 -# +# name: TEMP+ type: parsed protocol: NECext address: 86 6B 00 00 command: 1A E5 00 00 -# +# name: TEMP- type: parsed protocol: NECext address: 86 6B 00 00 command: 1E E1 00 00 -# +# name: SWING type: parsed protocol: NECext address: 86 6B 00 00 command: 00 FF 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9026 4519 590 1654 616 1657 623 574 561 582 563 582 563 583 562 1688 592 1656 675 1627 593 1650 620 1654 677 521 563 1660 620 1656 614 1664 616 581 564 578 567 575 560 582 563 581 564 579 566 1684 596 1655 615 1661 619 577 568 574 561 581 564 580 565 579 566 580 565 582 563 581 564 577 568 574 561 582 563 580 565 579 566 1657 613 1664 616 582 563 578 567 575 560 583 562 581 564 580 565 582 563 584 561 582 563 578 567 575 560 583 562 581 564 580 565 1659 621 579 566 578 567 574 561 581 564 579 566 577 568 576 569 577 568 579 566 578 567 574 561 580 565 578 567 576 569 575 560 587 568 579 566 577 568 573 562 580 565 578 567 576 569 575 560 586 569 552 593 577 568 573 562 580 565 577 568 576 559 585 560 586 569 552 593 576 569 1703 567 575 560 1713 567 577 568 576 569 577 568 553 592 578 567 1704 566 1707 563 1656 614 1662 618 1659 621 577 568 553 592 1706 564 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 270 18152 3021 8955 523 499 495 1497 492 504 500 468 526 496 498 498 496 499 495 501 493 502 492 1499 500 496 498 524 470 1521 498 497 497 499 495 1496 492 1499 500 1491 497 1494 494 1497 502 494 500 495 499 497 497 498 496 500 494 528 466 530 464 531 473 522 493 503 491 504 500 495 499 497 497 498 496 500 494 501 493 503 491 504 500 495 499 496 498 498 496 499 495 501 493 529 465 531 473 522 472 523 492 504 490 505 499 496 498 498 496 499 495 1496 492 1499 500 1492 496 1494 525 2947 2999 8953 525 1519 469 499 516 507 497 498 496 500 494 501 493 503 491 504 500 495 499 1492 496 499 495 501 493 1498 501 495 499 1492 496 1522 466 1524 496 1496 492 1499 500 1492 496 499 495 500 494 502 492 504 500 495 499 496 498 498 496 499 495 500 494 502 492 530 474 521 473 523 523 472 522 474 489 506 498 497 497 499 495 500 494 502 492 503 501 494 500 496 498 497 497 499 495 500 494 502 492 503 501 521 473 523 471 524 522 474 520 475 498 497 497 499 495 500 494 2978 2999 8952 525 1492 496 499 495 501 493 503 491 504 500 495 499 497 497 525 469 526 468 1524 516 479 494 501 493 503 491 504 500 495 499 497 497 1494 494 1497 492 1500 499 1492 496 499 495 1497 491 531 473 1518 522 1469 499 496 498 498 496 500 494 1497 491 1500 499 1492 496 499 495 501 493 502 492 504 500 495 499 523 471 525 469 526 520 1472 516 1475 493 502 492 504 500 495 499 1492 496 499 495 501 493 502 492 504 500 495 499 496 498 498 496 1522 466 1525 525 1466 491 1500 499 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 451 18082 2995 8958 519 529 465 1527 472 524 491 504 490 506 498 497 497 499 495 501 493 502 492 1500 499 497 497 498 496 1496 492 503 501 494 500 1492 496 1522 466 1525 494 1497 491 1500 498 498 496 499 495 501 493 503 501 494 500 495 499 497 497 499 495 500 494 502 492 503 501 495 499 523 471 525 469 526 468 528 497 498 496 500 494 502 492 503 501 495 499 496 498 498 496 499 495 501 493 502 492 504 500 495 499 497 497 499 495 527 467 529 465 1500 519 1499 489 1502 497 1495 493 2979 2997 8955 522 1469 519 503 501 494 500 496 498 497 497 499 495 501 493 529 465 531 473 1518 491 505 489 506 498 498 496 1495 493 1498 501 1491 497 499 495 1496 492 1500 499 1492 496 527 467 1525 494 501 493 1498 490 1502 497 499 495 500 494 502 492 1499 500 1492 496 1496 492 503 501 494 500 496 498 524 470 526 468 527 519 1446 522 1497 491 1500 499 1493 495 501 493 502 492 504 500 495 499 497 497 1494 494 501 493 503 501 521 473 523 471 524 522 1470 498 1494 494 1497 502 1490 498 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 701 17814 3056 8923 554 441 522 1496 492 504 490 505 499 497 497 498 496 500 494 502 492 503 501 1491 497 498 496 500 494 1497 502 494 500 523 471 1520 468 1523 496 1496 492 1499 500 1492 496 499 495 501 493 503 501 494 500 496 498 497 497 499 495 501 493 502 492 531 473 522 472 524 470 525 490 506 498 498 496 499 495 501 493 503 491 504 500 495 499 497 497 499 495 500 494 502 492 504 500 495 499 497 497 525 469 527 467 528 466 530 495 501 493 1498 501 1491 497 1494 494 1498 500 2972 3004 8948 518 1500 499 470 524 498 496 500 494 529 465 531 473 522 493 530 464 505 489 1502 497 499 495 501 493 1498 501 1491 497 1494 494 1498 501 495 499 1492 496 1522 497 1495 493 502 492 1500 499 497 497 1494 494 1497 502 495 499 496 498 498 496 1496 492 1499 500 1518 470 526 468 527 498 498 496 500 494 501 493 503 491 505 499 1492 496 1495 493 1498 501 495 499 497 497 499 495 500 494 502 492 1527 472 523 523 473 490 506 498 497 497 499 495 1497 491 1500 499 1492 496 1496 492 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 606 17832 2994 8936 520 501 496 1491 494 501 496 498 489 532 465 529 488 505 492 502 495 499 488 1499 496 499 498 495 492 1496 499 1463 522 499 498 1463 522 1467 517 1469 526 1491 493 1495 520 500 487 507 490 504 493 500 497 497 490 504 493 501 496 498 489 505 492 501 496 498 499 495 492 502 495 499 498 522 465 529 468 526 492 502 495 499 488 506 491 503 494 499 498 496 491 503 494 500 497 497 490 504 493 500 497 497 490 504 493 500 497 497 490 531 466 528 469 1518 487 1475 520 2947 3018 8939 517 1471 524 496 491 503 494 500 497 497 490 504 493 500 497 497 490 504 493 1521 464 530 467 527 491 1471 514 507 490 1471 524 1465 519 1468 517 1472 523 1465 520 1468 517 477 520 501 496 497 490 531 466 528 469 525 493 501 496 498 489 505 492 502 495 498 499 495 492 502 495 499 498 495 492 502 495 499 498 496 491 502 495 499 498 496 491 529 468 526 471 523 495 499 488 506 491 503 494 499 498 496 491 503 494 500 497 496 491 503 494 500 497 497 490 503 494 2973 2992 8939 517 1469 526 522 465 529 488 506 491 503 494 499 488 506 491 503 494 500 497 1490 495 499 498 496 491 1497 498 1464 520 1468 517 1470 525 524 463 1498 517 1471 524 1465 520 1468 517 1471 524 1465 520 1468 517 1472 523 497 490 504 493 501 496 1491 494 1496 519 1469 516 504 493 501 496 498 489 505 492 501 496 498 499 495 492 502 495 1492 493 1469 526 495 492 529 468 1492 513 1476 519 502 495 498 489 505 492 502 495 499 498 496 491 503 494 499 498 496 491 1497 498 1464 541 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4387 4349 553 1609 553 1607 555 1605 546 1613 549 531 550 530 551 1610 552 527 554 526 555 526 555 525 556 524 557 1602 549 1611 551 529 552 1608 554 526 555 525 556 525 556 524 546 533 548 532 549 1611 551 1608 554 1606 556 1604 558 1603 548 1611 551 1609 553 1607 555 525 556 525 556 524 557 523 547 533 548 533 548 532 549 531 550 530 551 1607 555 526 555 1605 557 1603 548 531 550 531 550 530 551 529 552 528 553 527 554 526 555 526 555 525 556 524 546 1612 550 1610 552 1608 554 527 554 526 555 526 555 525 556 524 557 523 547 533 548 532 549 531 550 1609 553 1607 555 525 556 525 556 1603 548 1612 550 530 551 7454 4385 4352 549 1611 551 1609 553 1608 554 1606 556 525 556 524 557 1602 549 531 550 531 550 530 551 530 551 529 552 1633 529 1604 558 523 558 1601 550 531 550 530 551 530 551 529 552 528 553 527 554 1604 558 1603 548 1611 551 1609 553 1608 554 1606 556 1604 558 1602 549 532 549 531 550 530 551 530 551 529 552 528 553 527 554 526 555 525 556 1603 548 532 549 1610 552 1608 554 527 554 527 554 526 555 525 556 524 557 523 547 533 548 532 549 531 550 530 551 1608 554 1606 556 1604 558 523 547 533 548 532 549 531 550 530 551 529 552 528 553 527 554 526 555 1605 557 1602 549 531 550 531 550 1609 553 1607 555 526 555 -# +# name: SWING type: raw frequency: 38000 duty_cycle: 0.330000 data: 4391 4345 555 1605 556 1604 547 1613 548 1611 550 530 550 529 551 1609 552 527 553 527 553 526 554 526 554 525 555 1604 547 1613 548 531 549 1611 550 529 551 529 551 529 551 528 552 527 553 526 554 1605 556 1603 548 1612 549 1611 550 1609 552 1608 553 1607 554 1605 556 524 556 524 556 523 547 533 547 533 547 532 548 531 549 530 550 529 551 1608 553 527 553 1606 555 1605 556 523 547 533 547 533 547 533 547 532 548 531 549 530 550 1609 552 527 553 527 553 527 553 526 554 1605 556 523 557 523 547 533 547 533 547 532 548 531 549 530 550 530 550 529 551 1608 553 526 554 526 554 526 554 525 555 524 556 523 547 7457 4390 4347 553 1608 553 1606 555 1605 556 1604 547 533 547 532 548 1612 549 530 550 530 550 529 551 529 552 528 552 1607 554 1605 556 524 556 1603 548 532 548 532 548 532 548 531 549 530 550 529 551 1608 553 1606 555 1605 556 1604 547 1613 548 1611 550 1610 551 1609 552 527 553 527 553 527 553 526 554 526 554 525 555 524 556 524 556 523 547 1612 549 531 549 1610 551 1609 552 527 553 527 553 527 553 526 554 526 554 525 555 524 556 1603 548 532 548 532 548 532 548 531 549 1610 551 528 552 528 552 528 552 527 553 526 554 525 555 525 555 524 556 523 547 1613 548 531 549 531 549 531 549 530 550 529 551 528 552 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4413 4375 541 1579 568 504 569 1576 571 501 562 510 563 534 539 507 566 1578 569 1577 570 1575 572 500 563 509 564 508 565 506 567 1578 569 502 571 501 562 1583 564 1581 566 1579 568 504 569 503 570 1574 563 510 563 1607 540 506 567 505 568 503 570 502 571 1573 564 508 565 1580 567 1578 569 503 570 502 571 500 563 535 538 507 566 1579 568 1577 570 502 571 500 563 536 537 1581 566 506 567 504 569 503 570 1574 563 5170 4409 4379 537 509 564 1581 566 506 567 1577 570 1575 572 1573 564 1582 565 507 566 505 568 504 569 1575 572 1573 564 1582 565 1580 567 505 568 1576 571 1574 563 509 564 508 565 532 541 1577 570 1575 572 500 563 1582 565 507 566 1578 569 1576 571 1574 562 1583 564 508 565 1579 568 504 569 502 571 1574 563 1582 565 1580 567 1578 569 1576 571 501 562 510 563 1581 566 1579 568 1577 570 501 572 1573 564 1581 566 1579 568 504 569 -# +# name: SWING type: raw frequency: 38000 duty_cycle: 0.330000 data: 4413 4349 566 1580 567 505 568 1577 570 502 571 501 572 526 537 1582 565 507 566 506 567 504 569 503 570 501 562 510 563 535 538 507 566 1579 568 1577 570 1575 572 1573 564 1582 565 1581 566 1579 568 1578 569 1576 571 1574 563 1583 564 1582 565 1580 567 1578 569 1577 570 1575 572 1573 564 1582 565 1581 566 1579 568 1578 569 1576 571 1574 563 1583 564 1581 566 506 567 1604 543 1576 571 1574 563 1583 564 1581 566 506 567 505 568 5164 4405 4357 569 502 571 1574 563 510 563 1582 565 1580 567 1578 569 503 570 1575 572 1573 564 1582 565 1580 567 1579 568 1577 570 1575 572 1573 564 509 564 508 565 506 567 505 568 503 570 502 571 526 537 509 564 508 565 506 567 505 568 503 570 501 572 500 563 509 564 507 566 506 567 504 569 503 570 501 572 499 564 508 565 507 566 505 568 504 569 1575 572 500 563 509 564 507 566 506 567 504 569 1576 571 1574 563 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1296 454 1294 422 441 1304 1318 427 1321 422 441 1302 446 1297 440 1305 1317 426 437 1306 442 1301 436 7690 1321 424 1324 419 444 1301 1321 424 1324 420 443 1299 438 1304 444 1302 1320 423 440 1302 446 1297 440 7686 1325 420 1317 426 437 1308 1324 420 1317 426 437 1305 443 1300 437 1308 1324 419 444 1298 439 1304 444 7682 1318 427 1321 422 441 1304 1318 427 1321 423 471 1271 466 1277 471 1274 1317 427 467 1275 472 1270 467 7675 1325 420 1317 426 468 1277 1324 421 1316 427 436 1306 442 1301 467 1278 1323 420 443 1300 437 1305 474 7653 1316 429 1319 425 438 1306 1326 420 1317 425 438 1305 443 1300 437 1308 1324 419 444 1298 439 1304 443 7682 1318 427 1321 423 440 1305 1317 428 1320 423 471 1272 465 1277 439 1306 1316 427 467 1276 440 1302 446 7680 1320 426 1322 421 473 1272 1318 426 1322 422 472 1270 467 1276 472 1273 1317 426 468 1274 474 1269 468 7658 1321 424 1324 420 464 1281 1320 425 1354 389 464 1279 469 1274 474 1272 1318 424 470 1273 464 1279 468 7657 1322 423 1325 418 466 1280 1352 392 1345 400 463 1278 469 1273 464 1281 1351 394 469 1271 466 1277 470 7656 1323 422 1315 427 467 1278 1344 401 1347 399 464 1276 471 1272 465 1280 1321 422 472 1270 467 1276 472 7654 1325 421 1316 426 437 1308 1324 421 1316 427 436 1307 441 1302 445 1299 1323 421 442 1300 468 1274 474 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 781 710 2930 2876 775 716 781 735 752 2175 779 711 776 2177 746 745 773 2232 753 2173 749 768 750 2177 745 745 773 743 754 737 750 741 746 744 754 737 771 746 751 739 748 2178 776 742 755 2172 771 719 778 2227 747 744 754 2200 754 737 750 2203 751 741 746 2181 773 744 753 737 750 741 746 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3027 9036 541 1580 484 588 491 556 492 555 482 564 484 589 459 587 481 565 483 564 484 1583 492 555 482 564 484 589 479 1561 514 1527 517 583 485 1555 489 1552 513 1581 484 1531 513 534 514 585 463 584 484 562 486 561 486 560 488 585 483 589 479 567 512 561 486 560 488 559 489 558 490 583 485 561 487 560 488 558 490 1578 486 1580 484 562 517 1577 487 559 489 558 490 583 485 1555 509 564 484 563 485 1582 483 1532 543 1576 488 559 489 584 464 583 485 587 492 555 482 564 432 1924 2973 9041 536 1531 513 559 489 584 484 563 516 557 491 556 481 591 488 559 489 558 490 1577 487 559 489 558 490 1577 487 1580 484 1530 514 1553 512 562 485 1555 509 1531 513 1555 509 1558 507 1534 510 1557 518 1524 509 1557 518 555 493 555 513 559 488 558 490 583 485 561 486 560 488 559 489 584 484 562 486 561 486 560 487 585 483 1557 487 1554 510 1557 507 1533 511 1557 538 1528 516 1578 455 591 488 559 489 558 489 557 491 582 486 560 487 559 488 584 484 562 517 1524 509 1558 465 -# +# name: MODE type: parsed protocol: NEC address: 20 00 00 00 command: 09 00 00 00 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1303 438 1287 429 418 1254 1308 434 1281 434 423 1250 444 1255 439 1259 1303 439 418 1254 440 1258 446 8172 1313 428 1276 411 446 1252 1310 404 1311 403 444 1255 439 1259 445 1253 1309 405 442 1257 447 1250 444 8173 1302 412 1303 410 447 1251 1300 439 1276 410 447 1251 443 1255 439 1259 1303 437 420 1250 496 1202 439 8177 1308 434 1281 433 414 1256 1306 435 1280 434 413 1284 420 1251 443 1255 1307 433 414 1283 421 1250 444 8173 1302 438 1277 436 421 1276 1275 438 1277 436 421 1275 419 1252 442 1256 1306 434 413 1284 420 1250 444 8173 1302 438 1277 436 421 1276 1275 437 1278 435 412 1285 419 1278 416 1281 1281 432 415 1282 412 1285 419 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3197 1595 390 404 379 1210 388 406 388 406 388 1201 386 407 386 1202 386 408 385 409 384 1205 383 1204 383 1206 382 412 381 1206 381 413 381 1207 381 1208 380 1209 389 405 389 406 387 405 389 407 387 1200 388 1201 386 408 385 1203 384 412 382 1205 383 1204 384 412 382 412 382 412 382 1207 381 413 381 1208 380 414 380 414 380 1209 389 1199 389 1201 386 1200 387 1202 385 408 385 409 384 1204 384 1205 383 1205 382 1205 383 412 382 413 380 1207 381 1209 389 406 388 405 389 405 389 405 389 1200 387 1203 384 1201 386 409 384 1203 384 1205 382 1205 383 1205 383 411 383 412 382 412 382 1207 380 414 380 415 389 404 379 417 387 1199 389 1199 389 1201 386 1204 384 1203 384 1203 384 1203 384 1204 384 411 382 412 382 412 382 412 382 413 380 413 381 414 380 414 380 1209 389 1199 389 1199 389 1200 387 1201 386 408 385 1203 385 1203 384 409 384 412 381 410 383 413 381 411 383 1206 382 413 381 413 380 1207 381 1209 389 404 379 1209 389 1199 389 407 386 1201 386 1202 385 408 385 410 384 1203 384 410 383 411 383 1204 384 412 382 412 382 1206 381 1207 380 1208 379 1211 387 1199 389 1201 386 1201 386 1202 385 408 385 410 383 409 385 409 385 410 384 410 384 410 383 411 383 412 382 1207 381 1206 382 1209 389 1197 380 1210 388 1199 389 406 387 1200 387 408 385 407 386 408 385 409 384 408 385 409 384 1204 384 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3467 1749 420 452 420 1301 412 468 414 472 420 468 414 479 413 484 418 453 419 454 418 459 413 469 413 472 420 469 413 1323 421 476 416 455 417 457 415 462 420 461 421 464 418 471 421 1315 419 1322 422 1293 420 452 420 458 414 1311 412 472 420 469 413 480 412 485 417 453 419 455 417 460 422 459 413 472 420 469 413 480 412 485 417 453 419 455 417 460 412 469 413 472 420 469 413 480 412 485 417 453 419 455 417 460 422 459 413 472 420 469 413 480 412 485 417 453 419 455 417 1304 419 1305 418 466 416 473 419 474 418 479 413 436 415 10538 3465 1751 419 454 418 1303 420 461 421 464 418 471 421 472 420 477 415 455 417 457 415 462 420 461 421 464 418 471 421 1315 418 479 413 457 415 459 412 464 418 463 419 466 416 473 419 1318 415 1325 419 1295 418 455 416 461 421 1303 420 465 417 472 420 473 419 478 414 456 416 458 414 463 419 462 420 465 417 472 420 473 419 478 414 456 416 1301 412 465 417 464 418 1311 412 476 416 477 415 482 420 451 421 452 420 457 415 1310 413 471 421 468 414 1323 421 476 416 455 417 456 416 462 420 461 421 464 418 471 421 471 421 476 416 1299 414 1302 421 1299 414 1311 412 1316 417 471 421 1316 417 479 413 1302 421 1295 418 459 412 1312 421 1307 416 472 420 473 419 478 414 457 415 458 414 464 418 463 419 466 416 473 419 473 419 478 414 457 415 458 414 1307 416 1309 414 1314 419 469 413 480 422 475 417 454 418 455 417 460 422 459 413 473 419 469 413 1324 420 1321 412 1302 421 452 420 457 415 466 416 469 413 476 416 477 415 482 420 451 421 452 420 457 414 467 415 470 412 477 415 478 414 483 419 451 421 1296 417 460 412 469 413 472 420 469 413 480 412 485 417 1297 416 457 415 462 420 461 421 464 418 471 421 472 420 477 415 456 416 457 414 462 420 461 421 464 418 471 421 472 420 477 415 456 416 457 414 1306 417 1307 416 1312 421 1311 412 481 421 1319 414 1279 414 -# +# name: MODE type: parsed protocol: NECext address: 86 6B 00 00 command: 02 FD 00 00 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 552 17959 3004 8946 521 530 474 1490 519 477 517 505 499 497 497 498 496 500 494 501 493 503 501 1464 524 497 497 499 495 1470 518 504 500 495 499 1493 495 1496 492 1499 520 1472 516 1475 524 498 496 500 494 501 493 503 501 494 500 496 498 497 497 499 495 501 493 502 492 531 473 522 472 524 470 525 490 506 498 497 497 499 495 501 493 502 492 504 500 495 499 497 497 498 496 500 494 501 493 503 501 494 500 496 498 524 470 526 468 527 467 529 496 1469 519 1472 527 1465 523 1468 520 2979 2997 8954 523 1469 519 502 492 504 500 495 499 524 470 525 469 527 467 528 497 499 495 1470 518 503 501 495 499 1466 522 500 494 1471 528 1464 524 497 497 1468 520 1446 604 1440 496 525 469 1496 523 499 495 1470 518 1473 526 497 497 498 496 500 494 1471 528 1464 524 1467 521 501 493 529 465 531 473 522 472 524 491 1474 525 497 497 1469 519 502 492 1474 525 1466 522 500 494 1471 528 494 500 496 498 1494 494 528 466 529 475 521 494 502 492 503 491 1474 525 1467 521 1470 518 1474 525 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3062 3028 3062 4288 599 1678 573 563 567 1694 568 700 576 560 570 1691 570 565 576 1817 569 1692 601 549 571 564 567 1826 570 566 575 1686 576 1686 576 692 574 562 568 568 594 1680 571 697 568 567 574 1687 575 561 570 1824 572 563 567 568 573 1689 593 687 568 568 573 563 567 1693 568 1825 571 564 566 570 571 565 576 692 594 1680 571 1689 572 564 566 701 575 561 570 1692 570 566 575 692 573 563 599 550 570 566 575 693 572 563 567 568 573 1687 574 693 572 564 567 569 603 1672 569 698 567 569 572 564 566 569 572 696 569 566 575 561 569 566 596 709 567 1694 567 1693 568 1693 568 1849 568 568 573 563 567 568 573 1689 593 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3055 3033 3056 4296 600 1676 575 560 570 1692 569 698 567 568 573 1689 572 564 566 1826 570 1691 601 548 572 564 577 691 574 561 569 1692 569 1692 569 1824 572 563 567 569 603 1672 568 699 577 559 623 1638 571 564 577 1817 569 566 575 561 569 1692 600 681 574 562 568 567 574 1688 573 1820 576 559 571 564 577 559 571 696 600 1675 576 1685 576 560 570 697 568 567 574 1688 573 562 568 699 577 559 603 547 573 562 568 700 576 560 570 565 576 1685 576 692 573 562 568 567 595 1681 570 697 568 568 573 562 568 568 573 694 571 565 576 560 570 565 597 708 568 1694 567 1694 567 1694 567 724 572 564 566 569 572 1690 571 564 598 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3054 3034 3055 4297 599 1677 574 562 568 1693 568 700 576 560 570 1690 571 565 576 1817 569 1693 599 550 570 566 575 693 572 564 566 569 572 1689 572 696 569 566 575 561 600 1674 577 691 574 562 568 567 574 562 568 700 576 560 570 565 576 560 601 680 575 560 570 566 575 561 569 698 567 568 573 563 567 568 573 695 601 1673 567 1693 568 568 573 695 570 566 575 1686 575 561 569 698 567 568 593 556 574 561 569 699 566 569 572 564 566 1695 566 701 575 561 569 567 594 554 576 691 574 562 568 567 574 562 568 699 577 560 570 565 576 560 601 704 572 1688 573 563 567 1694 567 1850 567 569 572 565 576 1685 576 1685 597 -# +# name: SWING type: raw frequency: 38000 duty_cycle: 0.330000 data: 3055 3034 3056 4296 600 1676 575 561 569 1692 569 698 567 569 572 1690 571 564 566 1827 569 1692 600 549 571 565 576 692 573 1687 574 1687 574 562 568 1824 572 564 566 1695 597 1677 574 694 571 565 576 560 570 565 576 692 573 562 568 568 573 562 600 682 573 562 568 568 573 563 567 700 576 560 570 565 576 560 570 697 599 1675 576 1685 576 559 571 697 568 567 574 1687 574 562 568 699 566 569 603 547 573 563 567 700 576 560 570 565 576 1685 566 701 575 561 569 567 595 555 576 692 573 562 568 567 574 562 568 699 566 570 571 564 566 570 602 703 573 1687 574 1687 574 1687 574 1843 574 1687 574 1687 574 1687 574 562 599 -# +# name: POWER type: raw frequency: 38000 @@ -1010,7 +1046,7 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4456 4417 538 1597 547 494 547 1589 545 1590 544 498 543 499 541 1593 541 501 539 502 539 1595 539 501 539 502 538 1596 538 1595 538 503 538 1597 547 493 537 504 547 495 546 1587 547 1587 547 1588 545 1588 546 1588 545 1589 545 1590 544 1590 544 497 544 498 543 497 544 498 543 498 543 497 544 1591 543 1592 542 1591 543 1592 542 499 542 498 543 499 542 1592 542 500 541 499 541 499 542 500 541 1591 543 1591 543 1591 543 5185 4434 4411 544 1591 543 498 543 1590 544 1590 544 497 543 497 544 1590 544 497 544 498 543 1589 545 496 545 497 544 1588 545 1588 546 495 545 1587 547 494 547 495 546 494 536 1597 547 1586 547 1585 538 1596 538 1596 537 1596 538 1594 540 1594 539 502 539 501 540 501 540 501 540 500 540 500 540 1593 541 1591 543 1591 543 1591 542 497 544 498 543 498 542 1591 543 496 545 497 544 497 544 496 545 1588 546 1588 546 1586 547 -# +# name: POWER type: raw frequency: 38000 @@ -1022,13 +1058,13 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4412 4354 570 1575 568 504 572 1574 569 503 563 510 567 505 572 527 539 1580 563 509 568 505 572 1574 569 503 563 509 568 505 572 527 539 507 569 503 563 1582 571 500 566 507 569 503 563 535 542 505 561 511 566 1579 564 1582 571 1574 569 1576 567 1578 565 1581 562 1583 570 1575 568 1577 566 1580 563 1582 571 1574 569 1576 567 1579 564 1581 562 1583 570 1575 568 1577 566 1579 564 509 568 1577 566 1580 563 1582 571 501 565 5165 4412 4352 572 500 566 1579 564 509 568 1577 566 1579 564 1581 562 1583 570 502 564 1581 562 1582 571 501 565 1580 563 1582 571 1574 569 1576 567 1578 565 1579 564 509 567 1577 566 1579 564 1581 562 1583 570 1575 568 1577 566 506 571 501 565 534 542 529 537 535 542 531 535 537 539 532 545 527 539 507 569 529 537 509 568 504 562 510 566 532 544 527 539 507 569 528 538 534 542 1576 567 504 562 510 566 506 571 1574 569 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4411 4378 546 1573 570 502 564 1582 571 500 566 507 570 528 538 508 569 1576 567 1578 565 507 569 1575 568 504 562 510 567 532 544 527 539 507 569 528 538 1580 563 509 568 505 571 501 565 533 543 528 538 1580 563 1582 571 1573 570 1575 568 1577 566 1578 565 1580 563 1582 571 1573 570 1575 568 1577 566 1579 564 1580 563 1582 571 1574 569 1575 568 1577 566 506 570 1574 569 1576 567 505 571 1573 570 1575 568 1577 566 1578 565 5165 4412 4350 563 508 568 1576 567 506 571 1574 569 1575 568 1577 566 1579 564 508 568 504 562 1582 571 501 565 1579 564 1581 562 1583 570 1574 569 1575 568 1577 566 506 570 1574 569 1576 567 1578 565 1580 563 1582 571 500 566 506 570 502 564 534 542 504 562 535 541 531 535 511 565 532 544 528 538 507 569 503 563 509 568 530 536 509 568 531 535 537 540 1578 565 507 569 503 563 1581 562 510 566 506 571 502 564 507 569 -# +# name: TEMP- type: raw frequency: 38000 @@ -1046,19 +1082,19 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9830 9789 9825 9795 4618 2487 381 348 384 929 381 936 384 353 379 934 386 350 382 350 382 362 380 349 383 929 381 355 387 346 386 926 384 353 379 354 388 355 387 918 382 354 388 348 384 349 383 353 379 357 385 924 386 358 384 921 389 347 385 351 381 929 381 932 388 348 384 349 383 361 381 347 385 351 381 355 387 345 387 925 385 352 380 353 379 365 388 340 382 354 388 348 384 349 383 929 381 355 387 346 386 358 384 921 379 357 385 351 381 352 380 356 386 930 380 357 385 358 385 344 388 348 384 933 387 349 383 353 379 938 382 354 388 352 380 20353 4625 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 5623 5581 567 552 569 551 570 549 562 557 564 582 539 580 541 1672 571 1671 572 545 566 553 568 1698 545 1668 564 1676 567 1700 543 549 562 589 543 1667 566 552 569 1671 561 1677 566 554 567 552 569 1670 562 561 571 1665 568 1671 572 1667 566 1673 570 550 571 549 562 1676 567 583 538 1671 561 583 538 1674 569 552 569 1670 562 1676 567 579 542 556 565 1669 563 557 564 1700 543 549 562 585 536 1676 567 553 568 1676 567 574 537 1675 568 551 570 551 570 1669 564 1674 569 1669 564 558 563 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3296 1651 412 415 414 414 405 1240 408 420 409 1237 411 416 413 415 414 413 406 1240 408 1238 410 419 410 417 412 415 414 1232 406 1214 434 420 409 418 411 417 412 415 414 413 406 423 406 421 408 419 410 418 411 416 413 414 405 423 406 421 408 1237 411 416 413 415 414 414 405 423 406 421 408 419 410 417 412 1234 414 413 406 422 407 420 409 418 411 1235 413 1233 415 1205 433 1214 434 1212 436 1210 438 1208 440 1207 431 423 406 421 408 1238 410 417 412 415 414 414 405 422 407 420 409 419 410 418 411 416 413 1232 406 1241 407 420 409 418 411 417 412 415 414 413 406 422 407 421 408 1237 411 1235 413 414 415 413 406 422 407 420 409 418 411 416 413 414 405 424 405 422 407 420 409 419 410 417 412 415 414 413 406 422 407 420 409 418 411 416 413 414 405 424 405 422 407 420 409 418 411 416 413 415 404 423 406 421 408 419 410 418 411 416 413 414 405 424 405 422 407 420 409 418 411 416 413 414 405 423 406 421 408 419 410 417 412 415 414 414 405 423 406 421 408 420 409 1236 412 415 414 414 405 422 407 420 409 419 410 417 412 1233 405 424 405 1240 408 420 409 -# +# name: MODE type: raw frequency: 38000 @@ -1082,37 +1118,37 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4415 4348 568 1578 569 503 570 1575 572 500 563 510 563 508 565 533 540 1578 569 1576 571 527 546 500 563 509 564 533 540 532 541 1603 544 502 571 500 563 1582 565 1580 567 1578 569 504 569 502 571 1574 563 509 564 1581 566 506 567 504 569 529 544 501 572 500 563 509 564 1580 567 1578 569 529 544 501 572 500 563 509 564 507 566 1578 569 1576 571 501 572 1573 564 508 565 1606 541 504 569 1576 571 501 572 1573 564 5169 4410 4351 565 507 566 1579 568 504 569 1575 572 1573 564 1582 565 1580 567 505 568 503 570 1575 572 1573 564 1581 566 1580 567 1578 569 503 570 1575 572 1573 564 534 539 507 566 505 568 1577 570 1575 572 500 563 1582 565 507 566 1579 568 1577 570 1575 572 1573 564 1582 565 1580 567 505 568 504 569 1576 571 1574 563 1582 565 1580 567 1579 568 504 569 503 570 1574 563 509 564 1581 566 506 567 1578 569 503 570 1574 563 510 563 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3455 1584 486 347 483 348 482 347 482 348 480 350 430 401 429 1229 432 401 429 400 430 400 430 399 431 399 431 398 432 398 432 399 431 399 456 375 455 377 453 1207 453 378 452 1209 452 379 451 379 451 379 451 379 451 379 451 379 452 379 451 379 451 379 451 403 427 1233 427 1234 427 380 450 1234 426 1234 427 403 427 1233 427 403 427 1234 427 403 427 1234 426 404 426 403 427 403 427 403 427 403 427 1234 427 403 427 403 427 403 427 403 427 403 427 1234 427 403 427 403 427 403 427 403 427 403 427 1234 427 403 427 1234 426 1234 427 1234 426 1234 427 1234 427 403 427 403 427 403 427 1234 427 404 426 403 427 403 427 403 427 403 427 403 427 403 428 403 427 403 427 403 427 403 427 403 427 403 427 403 427 1234 427 1234 427 404 426 404 426 404 426 404 426 1234 426 404 427 404 426 404 426 1234 426 404 426 404 426 1234 427 404 426 404 426 404 426 404 426 404 426 404 426 1235 426 1235 426 1235 426 404 426 1235 425 405 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 427 404 426 404 426 404 426 404 427 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 404 426 1235 426 1235 426 1235 426 404 426 1235 426 404 426 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4532 4226 685 1459 685 388 683 1458 686 414 657 414 657 415 656 415 656 1487 656 415 603 469 602 469 602 469 602 1541 602 469 602 469 602 469 602 469 602 1541 602 468 603 468 603 468 603 1540 603 1541 602 470 601 1543 600 1544 600 1545 599 1546 598 1547 597 1570 574 1570 574 1570 574 1570 574 1570 574 1570 574 1570 574 1570 574 1570 574 1570 573 1570 574 1570 574 1570 574 498 573 1570 573 498 573 498 573 498 573 498 573 5130 4444 4312 598 473 598 1546 597 473 598 1545 598 1545 599 1545 622 1521 623 448 623 1520 623 1519 624 1520 599 1544 624 448 598 1545 623 1520 624 1520 624 1520 622 448 599 1544 624 1520 623 1520 623 447 624 447 624 1519 624 447 624 447 624 447 624 447 624 447 624 448 623 448 623 447 624 447 624 447 624 448 623 447 624 447 624 447 624 447 624 447 624 448 623 448 623 1520 623 448 623 1520 623 1520 623 1520 623 1520 623 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4502 4254 656 1488 657 415 657 1487 657 387 684 414 603 469 602 469 602 1541 602 1541 603 469 602 469 602 469 602 1541 602 469 602 469 602 469 602 468 603 1540 603 468 603 468 603 1540 603 468 603 468 603 1541 602 1542 602 1543 600 1544 600 1544 599 1544 600 1545 599 1544 600 1545 599 1545 599 1545 599 1545 599 1545 599 1545 599 1545 599 1545 599 1545 599 472 599 1544 600 472 599 1544 599 1544 600 472 599 1544 599 1544 600 5129 4473 4285 624 446 625 1518 626 446 625 1519 625 1519 625 1519 625 1519 625 446 625 446 625 1519 625 1519 625 1519 625 446 625 1519 625 1519 625 1519 625 1519 625 446 626 1519 624 1519 625 447 624 1519 625 1519 625 447 624 447 624 446 625 447 624 447 624 447 624 447 624 447 624 447 624 447 624 447 624 447 624 447 624 447 624 447 624 447 624 447 624 1519 625 447 624 1520 624 447 624 447 624 1519 624 447 624 447 624 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4525 4234 680 1462 682 390 681 1461 683 392 679 391 680 391 680 391 680 1461 683 1461 683 391 680 392 679 415 601 1515 629 469 602 469 602 470 627 444 627 1516 627 444 626 445 626 1519 624 447 624 447 624 447 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 1520 624 448 623 1520 624 447 624 1520 624 1520 624 448 623 1520 624 448 623 5105 4467 4290 623 448 624 1520 624 448 623 1521 622 1521 623 1521 623 1521 623 448 623 448 623 1521 623 1521 623 1521 623 448 623 1521 623 1521 623 1521 623 1521 623 448 623 1521 623 1521 623 449 622 1521 623 1521 623 1521 623 449 622 448 623 448 623 448 623 449 622 448 623 449 622 448 623 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 1521 623 449 622 1521 623 449 622 449 622 1521 623 449 622 1522 622 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4470 4287 627 1518 626 448 624 1518 626 447 625 447 624 448 623 447 624 1517 627 1517 627 446 625 447 624 446 625 470 601 470 601 470 601 1518 652 444 627 1517 627 445 625 446 625 1520 624 447 624 448 623 448 623 1521 623 1521 623 1520 624 1521 623 1521 623 1521 623 1521 623 1521 623 1521 623 1521 623 1521 623 1521 623 1521 623 1521 623 1521 623 1521 623 448 623 1521 623 448 624 1521 623 448 623 1521 623 1521 623 1521 623 5107 4467 4291 623 448 623 1521 623 448 623 1521 623 1521 623 1521 623 1521 623 449 623 448 623 1521 623 1521 623 1521 623 1522 622 1521 623 1522 622 449 622 1521 623 449 623 1521 623 1522 622 449 622 1522 622 1522 622 1522 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 622 449 623 1522 622 449 622 1522 622 449 622 1522 622 450 621 449 622 449 622 -# +# name: SWING type: raw frequency: 38000 @@ -1124,28 +1160,76 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4528 4233 682 1461 684 389 683 1461 684 390 737 335 681 391 681 390 682 1461 683 1461 684 1461 683 1461 683 392 626 468 603 469 603 468 603 469 628 443 629 1515 629 443 628 444 627 445 626 1518 626 1519 625 1519 626 1519 626 446 626 446 625 446 625 446 626 446 625 1519 625 1519 626 1519 626 446 626 446 625 446 626 446 625 446 626 446 626 1519 625 446 625 446 626 446 625 446 625 1519 625 447 625 1519 626 446 626 5105 4471 4290 625 447 625 1520 625 447 625 1519 625 1520 624 1520 625 1520 625 447 625 447 625 447 624 447 624 1519 625 1520 625 1520 624 1520 625 1520 624 1520 625 447 625 1520 624 1520 624 1520 625 447 625 447 625 447 624 447 625 1520 624 1520 624 1520 624 1520 624 1520 624 447 625 447 625 447 625 1520 624 1520 625 1520 624 1521 624 1520 624 1521 624 447 624 1520 624 1521 624 1521 623 1520 624 448 624 1520 624 448 624 1521 624 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3089 3684 1991 910 1011 1854 983 847 1992 911 982 965 956 874 984 938 982 939 973 1866 1889 948 973 950 972 950 972 859 971 950 972 950 972 954 968 887 943 979 943 979 943 979 943 887 944 979 943 979 943 979 943 887 943 979 943 950 972 979 943 1803 1952 977 3051 3724 1951 978 943 1894 943 888 1951 978 943 979 943 888 942 980 942 979 943 1895 1859 978 943 979 943 979 943 888 943 979 943 979 943 980 942 888 943 980 942 980 942 980 942 888 942 980 942 980 942 980 942 888 943 979 943 980 942 980 942 1804 1950 978 3050 3725 1950 978 942 1896 941 889 1950 979 941 980 942 888 942 980 942 980 942 1896 1858 979 942 980 942 980 942 889 941 980 942 981 941 980 942 889 942 980 942 981 941 981 941 889 941 981 941 981 941 981 941 889 941 981 941 981 941 981 941 1805 1949 980 3964 -# +# name: TEMP+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3093 2739 1010 912 1010 914 1008 1829 1009 845 1995 912 1004 919 1004 846 984 942 973 944 975 1867 1889 945 974 1893 1955 886 941 1008 914 980 942 1008 914 857 974 1008 914 1008 914 1008 914 916 914 1008 914 1008 914 1008 914 916 914 1008 914 1008 914 1008 914 1771 1985 1005 3024 2835 913 1008 914 1008 914 1923 915 916 1924 1005 914 1008 914 916 914 1008 914 1008 914 1897 1859 978 942 1896 1951 886 942 981 941 980 942 980 942 889 942 980 941 980 942 980 942 888 943 980 942 981 941 980 942 888 942 980 942 980 942 980 942 1803 1953 977 3052 2807 942 980 942 980 942 1895 943 888 1952 977 942 979 943 888 942 980 942 979 943 1895 1861 977 942 1895 1953 885 943 979 943 979 943 979 943 888 943 979 943 979 943 979 943 888 942 979 943 979 943 980 942 888 942 980 942 980 942 980 942 1803 1952 977 3969 -# +# name: TEMP- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3093 2764 985 937 985 909 1013 1852 985 845 1995 934 958 963 983 847 986 936 984 938 974 1863 1892 945 975 1863 1984 884 944 979 943 979 943 977 945 886 945 979 943 978 944 979 943 887 943 978 944 979 943 979 943 888 943 979 943 948 974 948 974 1804 1952 977 3052 2776 973 950 972 980 942 1895 942 887 1953 977 942 980 942 889 942 980 942 980 942 1896 1860 978 941 1896 1951 887 941 981 941 980 942 981 941 889 941 981 941 982 940 981 941 890 941 979 943 981 941 982 940 917 914 982 940 1008 914 1008 914 1806 1950 1005 3024 2835 913 1008 914 1008 914 1924 914 917 1923 1006 913 1008 914 917 913 1008 914 1008 914 1924 1832 1006 913 1924 1923 914 914 1009 913 1009 913 1009 913 917 913 1009 913 1009 913 1009 913 917 914 1009 913 1009 913 1009 913 917 914 1009 913 1009 913 1009 913 1833 1923 1006 3939 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3122 2736 1012 912 1010 1828 2019 819 1009 936 985 936 984 938 984 846 983 938 951 972 974 1862 1894 944 975 1863 1985 854 973 948 974 978 944 979 943 888 943 980 942 979 943 979 943 888 942 979 943 979 943 979 943 888 942 979 943 979 943 979 943 1804 1952 976 3053 2807 942 979 943 1895 1952 885 943 979 943 979 943 979 943 888 943 980 942 981 941 1896 1860 977 942 1894 1953 887 940 981 941 980 942 981 941 917 914 980 942 980 942 980 942 888 943 980 942 981 941 980 942 889 941 981 941 981 941 981 941 1832 1924 978 3051 2835 913 1009 913 1924 1924 914 914 1008 914 1008 914 1008 914 917 914 1008 914 1008 914 1924 1832 1006 913 1924 1924 914 914 1009 913 1009 913 1009 913 917 914 1009 913 1009 913 1009 914 917 913 1009 913 1008 914 1009 913 917 914 1008 914 1009 913 1009 913 1833 1923 1006 3940 -# +# POWER OFF +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3195 1551 429 365 428 1158 429 365 429 365 428 1158 429 365 428 1158 429 366 428 365 428 1159 428 1158 429 1159 428 364 429 1158 429 366 428 1158 429 1158 429 1158 429 365 428 365 428 365 429 365 428 1158 429 1158 429 365 428 1158 429 1158 458 354 440 353 441 1128 459 353 494 353 386 1128 486 353 441 353 440 1101 459 1128 459 353 440 1128 459 1127 460 1128 459 1128 459 353 440 1129 457 1129 458 1130 457 1131 456 353 440 354 439 354 439 1132 455 354 439 353 440 354 439 354 439 1132 455 1132 455 1132 455 1132 455 354 440 354 439 1133 454 1133 454 354 439 353 440 354 439 353 440 1133 454 1133 454 353 440 353 440 1133 454 353 440 1133 454 1133 454 1133 454 353 440 353 440 353 440 1133 454 1133 454 353 440 353 440 354 439 1133 454 1133 454 1133 454 354 439 +# +name: TEMP+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3197 1548 430 365 428 1158 429 365 428 365 428 1128 459 365 428 1130 457 365 428 365 428 1157 430 1158 429 1158 429 365 429 1158 429 364 429 1158 429 1158 429 1158 429 364 429 364 429 364 429 364 430 1158 429 1157 430 364 429 1157 430 1158 429 364 429 364 429 1158 429 364 429 364 459 1128 459 353 440 353 440 1128 458 1129 430 364 429 1157 430 1157 430 1157 430 1157 430 363 430 1157 457 1130 457 1130 457 1131 456 353 440 352 441 352 441 1132 455 352 441 353 440 353 440 353 440 1132 455 1132 455 1132 455 1132 455 352 442 353 440 1133 454 1133 454 352 441 352 441 353 440 353 440 1132 455 1132 455 353 440 353 440 1132 455 353 440 1132 455 1132 455 353 441 1132 455 1132 455 1133 454 353 440 1132 455 353 440 353 440 1132 455 352 441 353 440 353 440 1132 455 +# +name: TEMP- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3196 1549 429 365 428 1157 430 364 429 365 429 1157 430 365 428 1158 429 364 429 364 429 1157 430 1158 429 1157 430 364 429 1129 458 364 429 1158 429 1158 429 1158 429 364 429 364 429 364 429 364 429 1158 429 1158 429 364 429 1158 429 1158 429 364 429 364 429 1158 429 364 429 364 459 1128 459 353 440 353 440 1128 459 1128 459 352 440 1129 430 1157 430 1156 431 1157 430 363 430 1157 457 1129 458 1129 458 1130 457 352 441 352 441 352 441 1132 455 353 440 352 441 353 440 353 440 1132 455 1132 455 1133 454 1133 454 353 440 352 441 1132 455 1132 455 352 441 352 442 353 440 352 441 1132 455 1132 455 353 440 353 440 1132 455 352 441 1132 455 1132 455 352 441 353 440 352 441 352 441 1132 455 1132 455 352 441 353 440 1132 455 1132 455 1132 455 1132 455 353 440 +# +name: MODE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3197 1520 458 364 429 1158 429 364 429 364 429 1130 457 364 429 1157 430 365 428 365 428 1130 457 1157 430 1158 429 364 429 1158 429 364 429 1157 430 1157 430 1157 430 364 429 364 429 364 429 363 430 1157 430 1157 430 364 429 1157 430 1157 430 363 430 364 429 1157 430 364 459 352 442 1127 460 352 441 352 441 1128 459 1128 459 353 439 1129 430 1157 458 1129 458 1129 458 352 441 1129 458 1129 458 1129 458 1130 457 352 441 352 441 352 441 1131 456 352 441 352 441 352 441 352 441 1131 456 1131 456 1131 456 1131 456 352 441 352 441 1131 456 1132 455 352 442 352 441 352 441 352 441 1131 456 1131 456 352 441 352 441 1131 456 1131 456 1131 456 352 441 352 441 352 441 352 441 352 441 1131 456 352 442 352 441 1131 456 1131 456 1132 455 1131 456 1131 456 352 442 +# +name: SWING +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3551 3406 939 800 939 2540 939 800 939 801 938 802 964 2517 962 803 935 2544 933 807 930 2577 901 839 900 839 900 839 900 2579 900 839 900 2579 900 839 901 2578 901 839 900 839 901 2579 900 2579 900 839 901 839 900 839 900 2579 900 839 900 839 901 2579 900 2579 900 839 900 839 3514 3446 900 840 899 2580 899 840 900 840 899 840 900 2580 899 840 899 2580 900 840 899 2580 899 840 900 840 899 840 899 2580 899 840 899 2580 899 841 898 2580 899 841 898 841 899 2581 898 2581 898 841 899 841 898 841 899 2581 898 841 898 841 899 2581 898 2581 899 841 899 841 3512 3449 897 842 897 2582 897 842 897 842 898 842 897 2583 896 843 896 2607 872 843 896 2584 895 868 871 868 871 868 872 2608 871 868 871 2608 871 868 871 2608 872 868 871 868 871 2608 871 2608 872 868 871 868 871 868 872 2608 872 868 871 868 871 2608 871 2609 871 868 871 868 3485 3475 871 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3545 3410 937 803 936 2542 937 803 936 832 907 832 933 2545 933 2546 931 809 928 813 925 2580 899 839 900 840 900 839 900 2580 899 2580 899 840 899 840 900 2580 899 840 900 840 900 839 900 840 899 840 900 840 899 840 900 2580 899 840 899 840 899 840 900 840 900 840 899 840 3511 3449 898 841 898 2581 898 840 900 840 899 841 898 2581 898 2581 899 840 899 841 898 2581 898 841 898 841 898 841 898 2581 898 2581 898 841 898 841 898 2581 899 841 898 841 898 841 899 841 898 841 898 842 898 841 898 2581 898 841 898 842 897 842 897 842 897 842 898 842 3509 3450 897 13896 3509 3451 896 842 897 843 897 843 896 843 896 2583 896 843 897 843 896 2583 896 844 895 844 895 868 871 869 871 2609 870 869 871 869 870 2609 870 869 871 2609 870 2609 870 869 871 2609 870 2609 870 869 870 869 870 869 870 2609 870 2609 870 869 871 2609 870 2610 869 870 869 870 3482 3478 869 870 869 870 869 870 870 870 869 2610 869 870 869 870 870 2610 869 871 869 871 869 871 868 871 869 2611 868 871 868 871 869 2611 868 872 867 2611 869 2611 868 871 868 2612 867 2612 868 872 867 897 842 897 843 2637 843 2637 842 897 843 2637 843 2637 842 898 842 898 3454 3506 841 +# OFF +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3120 1593 488 1180 489 1177 492 342 492 342 492 367 467 1174 485 349 485 349 485 1181 488 1179 490 343 491 1177 492 341 493 366 458 1183 486 1181 488 346 488 1179 490 1177 492 342 492 341 493 1174 485 349 485 347 487 1180 489 345 489 344 490 370 464 368 466 341 493 341 483 376 458 375 459 348 486 374 460 372 462 345 489 370 464 369 465 368 466 341 493 367 457 348 486 374 460 348 486 1179 490 343 491 343 491 1176 493 1174 485 349 485 349 485 374 460 373 461 373 461 346 488 371 463 371 463 369 465 1175 484 350 484 350 484 348 486 374 460 346 488 372 462 345 489 371 463 370 464 368 466 340 484 376 458 376 458 375 459 348 486 347 487 345 489 370 464 370 464 369 465 342 492 368 466 367 457 375 459 348 486 374 460 347 487 372 462 345 489 371 463 343 491 368 466 341 493 367 457 376 458 375 459 1181 488 346 488 345 489 1178 491 342 492 342 492 1175 494 1173 486 1182 487 346 488 346 488 1179 490 343 491 342 492 368 466 367 457 +# +name: SWING +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 92 00 00 00 +# diff --git a/assets/resources/infrared/assets/audio.ir b/assets/resources/infrared/assets/audio.ir index 540320f0e..4e70779ce 100644 --- a/assets/resources/infrared/assets/audio.ir +++ b/assets/resources/infrared/assets/audio.ir @@ -1,1378 +1,1492 @@ Filetype: IR library file Version: 1 -# Last Updated 11th Sept, 2022 +# Last Updated 25th Sept, 2022 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9150 4435 643 1608 643 468 644 469 642 364 749 468 643 447 665 449 663 469 643 452 660 470 642 450 662 442 670 449 662 469 643 1579 672 1608 642 1580 671 1609 641 1607 643 1578 672 1607 643 1608 642 1606 644 1606 644 1606 644 1607 643 1576 675 1579 671 1605 674 438 645 466 673 438 646 466 674 437 673 439 672 439 673 438 646 1604 673 1577 673 1578 673 1577 674 1577 673 23799 9095 4485 616 # +name: VOL+ +type: parsed +protocol: NEC42 +address: 01 00 00 00 +command: 0C 00 00 00 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9151 4434 644 1608 643 376 737 379 733 446 666 449 663 468 644 469 643 468 644 468 644 468 644 447 665 448 664 468 644 450 662 1608 643 1607 644 1576 676 1607 644 1608 643 1578 674 1608 643 1577 674 1579 672 1607 643 1608 643 1607 644 1607 644 1608 643 448 664 1608 643 448 664 468 644 469 643 380 732 468 644 469 643 1607 644 468 644 1608 643 1608 644 1609 643 1608 643 23837 9152 4434 642 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8968 4344 670 460 670 460 670 1566 669 462 668 486 643 487 642 489 641 1595 640 490 640 491 640 1596 640 491 640 1596 640 1596 640 1596 640 491 640 1596 640 1596 640 1596 640 1596 640 1596 640 1596 640 1596 640 1622 640 491 640 491 640 491 640 491 640 491 640 491 640 491 640 491 639 +# name: POWER type: parsed protocol: SIRC address: 10 00 00 00 command: 2E 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 00 FD 00 00 command: 01 FE 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 00 FD 00 00 command: 03 FC 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 00 FD 00 00 command: 09 F6 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 00 FD 00 00 command: 07 F8 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1042 1461 540 1460 541 1460 541 1460 541 1459 542 1459 542 454 536 460 540 456 544 452 538 458 542 454 546 450 540 456 544 1457 544 1456 545 1448 542 50531 1041 1462 539 1462 539 1461 540 1461 540 1460 541 1460 541 455 545 451 539 457 543 480 510 459 541 481 519 451 539 457 543 1457 543 1457 544 1449 541 50515 1037 1467 544 1456 545 1456 545 1455 546 1455 535 1465 536 486 514 483 517 479 511 485 515 481 509 487 513 483 517 478 512 1462 539 1462 539 1454 536 50537 1035 1467 544 1457 544 1457 544 1456 545 1456 544 1456 545 477 513 483 517 479 511 486 514 481 519 477 513 484 516 479 511 1464 536 1463 538 1455 546 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1010 1491 509 1490 510 1488 512 487 513 487 513 1486 514 1485 515 484 516 1483 517 482 518 482 518 1481 509 1489 511 488 512 487 513 1486 514 484 516 50963 1011 1489 511 1488 512 1487 513 485 515 486 514 1485 515 1484 516 484 516 1483 517 482 518 482 518 1481 509 1489 511 489 511 489 511 1487 513 486 514 50986 1008 1492 518 1480 510 1488 512 487 513 487 513 1486 514 1484 516 484 516 1483 517 482 518 481 519 1480 510 1488 512 487 513 487 513 1486 514 484 516 50972 1012 1488 512 1486 514 1484 516 483 517 483 517 1482 518 1480 510 489 511 1487 513 486 514 486 514 1485 515 1483 517 483 517 483 517 1481 509 490 510 50976 1008 1491 509 1489 511 1487 513 485 515 485 515 1484 516 1481 509 491 509 1489 511 488 512 488 512 1487 513 1485 515 484 516 484 516 1483 517 481 509 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1011 1479 517 477 516 481 512 1480 516 1473 513 482 511 485 518 1473 513 482 511 1481 515 1474 512 482 511 485 518 1473 513 1477 509 486 517 1473 513 50728 1014 1475 511 484 509 487 516 1475 511 1479 517 477 516 480 513 1478 508 487 516 1475 511 1479 517 478 514 480 513 1479 517 1473 513 508 484 1479 517 50725 1016 1473 513 481 512 484 519 1473 513 1477 509 485 518 478 515 1476 510 485 518 1473 513 1477 509 486 517 478 515 1476 510 1480 516 479 514 1476 510 50735 1069 1421 513 481 512 484 509 1483 513 1477 509 486 517 479 514 1477 509 486 517 1474 512 1479 507 488 515 480 513 1479 507 1483 513 482 511 1479 517 50733 1011 1478 508 513 490 506 486 1478 508 1483 513 508 485 511 482 1482 514 508 485 1480 516 1473 513 508 485 511 482 1483 513 1477 509 512 491 1473 513 50735 1008 1480 516 479 514 508 485 1480 516 1474 512 509 484 486 517 1472 514 508 485 1480 516 1474 512 509 484 512 481 1482 514 1477 509 512 491 1472 514 50738 1006 1509 487 508 485 486 507 1509 487 1503 483 513 490 505 488 1502 484 512 491 1473 513 1503 483 512 491 505 488 1476 510 1507 489 506 487 1503 483 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1010 1479 517 1474 512 509 484 512 491 505 488 507 486 510 483 512 491 505 488 508 485 1505 491 1474 512 1478 508 1483 513 1477 509 1482 514 1475 511 50713 1005 1483 513 1475 511 511 482 513 490 505 488 507 486 483 510 511 482 487 516 505 488 1501 485 1478 508 1483 513 1476 510 1479 507 1483 513 1474 512 50707 1012 1501 485 1479 506 513 490 505 488 507 486 509 484 511 482 487 516 505 488 508 485 1504 482 1482 514 1476 592 1396 590 1400 513 1476 510 1478 508 50715 1015 1473 513 1476 510 484 508 513 490 504 489 480 513 508 485 483 510 511 482 488 515 1473 513 1477 509 1480 516 1474 512 1477 591 1397 516 1472 514 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1041 1462 538 1462 538 485 515 481 519 478 512 484 516 1458 542 1458 542 1459 541 481 519 1481 519 1455 545 1482 518 1456 544 479 511 486 514 474 516 50532 1039 1464 536 1490 510 487 513 483 517 480 510 486 514 1460 540 1486 514 1460 540 483 517 1457 543 1484 516 1458 542 1458 542 481 519 477 513 476 513 50534 1036 1467 543 1457 543 480 509 460 540 483 517 479 511 1463 537 1463 537 1464 536 486 514 1487 513 1461 539 1461 539 1462 538 484 516 481 519 469 510 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 1042 1461 539 457 543 1458 542 1458 542 1458 542 1458 542 454 536 461 539 457 543 1457 543 453 537 460 540 456 544 452 538 1463 537 1463 537 1456 544 50530 1065 1438 572 424 566 1434 566 1435 565 1435 565 1436 544 452 537 459 572 424 545 1456 544 451 539 458 542 454 536 460 540 1461 539 1461 539 1454 536 50538 1036 1467 543 452 537 1464 536 1464 536 1464 536 1465 545 450 540 456 544 452 537 1464 536 460 540 455 545 452 538 458 542 1459 541 1460 540 1452 538 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1044 1456 544 455 545 455 534 1464 536 1462 538 1460 540 1458 542 1456 544 1455 545 1453 537 1461 539 460 540 459 541 459 561 437 542 457 543 456 544 50915 1016 1483 517 482 518 482 518 1481 509 1489 511 1487 513 1486 514 1485 515 1483 517 1482 508 1490 510 489 511 488 512 487 513 487 513 486 514 485 515 50956 1047 1452 538 462 538 462 538 1461 539 1460 540 1458 542 1457 543 1456 544 1454 546 1453 547 1451 539 461 539 460 540 460 540 459 541 459 541 457 543 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 1017 1484 516 1482 518 481 519 1480 510 1489 511 1487 513 1486 514 1485 515 1483 517 482 518 1480 510 490 510 489 511 489 511 488 512 488 512 486 514 50956 1015 1486 514 1484 516 484 516 1483 517 1482 518 1480 510 1489 511 1488 512 1486 514 486 514 1485 515 484 516 484 516 483 517 483 517 482 518 481 509 50960 1011 1488 512 1486 514 486 514 1485 515 1483 517 1482 518 1480 510 1488 512 1486 514 486 514 1484 516 483 517 483 517 482 518 481 519 481 508 489 511 50961 1040 1461 539 1459 541 459 541 1458 542 1456 544 1455 545 1454 546 1452 538 1460 540 460 540 1458 542 457 543 456 544 456 544 455 545 455 545 453 547 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1006 1485 511 1479 517 1473 513 509 484 511 482 514 489 506 487 508 485 511 482 513 490 505 488 1477 509 1481 515 1475 511 1480 516 1474 512 1477 509 50734 1007 1483 513 1477 509 1482 514 507 486 509 484 511 492 503 490 506 487 508 485 510 483 513 490 1474 512 1479 517 1473 513 1477 509 1481 515 1474 512 50729 1012 1477 509 1481 515 1474 512 509 484 512 491 504 489 506 487 508 485 511 482 513 490 506 487 1477 509 1481 515 1475 511 1479 517 1473 513 1476 510 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 1012 1503 483 514 489 1475 511 483 510 486 517 478 515 481 512 483 510 486 517 1473 513 508 485 1480 516 1475 511 1479 507 1483 513 1477 509 1480 588 50646 1012 1476 510 512 491 1473 513 508 485 485 508 488 515 480 513 482 511 512 481 1482 514 482 511 1480 516 1473 513 1478 508 1482 514 1476 510 1479 590 50651 1007 1507 489 507 485 1478 508 514 489 506 487 509 484 485 508 488 515 506 487 1503 483 513 490 1474 512 1478 508 1483 513 1477 509 1481 515 1473 513 50721 1009 1505 491 478 515 1475 511 510 483 486 517 478 515 507 486 483 510 512 491 1472 514 508 485 1505 491 1473 513 1477 509 1481 587 1403 510 1478 508 50733 1008 1506 490 479 514 1477 509 512 481 514 489 506 487 508 485 484 509 513 490 1473 513 509 483 1481 515 1474 512 1479 507 1482 514 1476 510 1478 590 50642 1006 1508 488 508 485 1478 508 487 516 479 514 481 512 510 483 486 517 504 489 1474 512 510 483 1482 514 1475 511 1479 507 1483 513 1477 509 1480 516 -# +# name: POWER type: parsed protocol: NEC address: 20 00 00 00 command: 09 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 20 00 00 00 command: 1F 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 20 00 00 00 command: 0E 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 20 00 00 00 command: 1A 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 20 00 00 00 command: 02 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 20 00 00 00 command: 05 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 20 00 00 00 command: 0C 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 20 00 00 00 command: 08 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 00 00 00 00 command: 12 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 00 00 00 00 command: 1E 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 00 00 00 00 command: 03 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 00 00 00 00 command: 01 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 00 00 00 00 command: 1F 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 00 00 00 00 command: 09 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 10 E7 00 00 command: 01 FE 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 10 E7 00 00 command: 00 FF 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 10 E7 00 00 command: 2B D4 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 78 0E 00 00 command: 09 F6 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 78 0E 00 00 command: 01 FE 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 78 0E 00 00 command: 02 FD 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 00 00 00 00 command: 06 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 02 00 00 00 command: 0A 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 02 00 00 00 command: 0D 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 02 00 00 00 command: 1C 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 02 00 00 00 command: 07 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 00 00 00 00 command: 14 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 00 00 00 00 command: 08 00 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 86 FF 00 00 command: 14 EB 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 86 FF 00 00 command: 13 EC 00 00 -# +# name: POWER type: parsed protocol: NECext address: 86 FF 00 00 command: 1B E4 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 86 FF 00 00 command: 2A D5 00 00 -# +# name: POWER type: parsed protocol: NEC address: 00 00 00 00 command: 07 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 00 00 00 00 command: 00 00 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 40 AF 00 00 command: 19 E6 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 02 BD 00 00 command: 26 D9 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 02 BD 00 00 command: 28 D7 00 00 -# +# name: POWER type: parsed protocol: NECext address: 02 BD 00 00 command: 53 AC 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 02 BD 00 00 command: AD 52 00 00 -# +# name: POWER type: parsed protocol: SIRC address: 10 00 00 00 command: 2F 00 00 00 -# +# name: VOL+ type: parsed protocol: SIRC address: 10 00 00 00 command: 12 00 00 00 -# +# name: VOL- type: parsed protocol: SIRC address: 10 00 00 00 command: 13 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 85 23 00 00 command: 99 66 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 85 23 00 00 command: 97 68 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 85 23 00 00 command: 57 A8 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 85 23 00 00 command: 47 B8 00 00 -# +# name: POWER type: parsed protocol: NEC address: 08 00 00 00 command: 10 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 08 00 00 00 command: 16 00 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 86 FF 00 00 command: 21 DE 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 86 FF 00 00 command: 2B D4 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: BA 4B 00 00 command: 03 FC 00 00 -# +# name: VOL- type: parsed protocol: NECext address: BA 4B 00 00 command: 02 FD 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: BA A0 00 00 command: 03 FC 00 00 -# +# name: VOL- type: parsed protocol: NECext address: BA A0 00 00 command: 02 FD 00 00 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1014 1477 517 478 514 509 483 487 515 480 512 484 508 488 514 1479 515 1476 508 1483 511 1481 513 1478 516 1475 509 1482 512 1479 515 480 512 483 509 50775 1014 1477 517 504 488 508 484 513 489 506 486 510 482 514 488 1478 516 1475 509 1483 511 1480 514 1477 517 1474 510 1482 512 1478 516 505 487 509 483 50770 1009 1481 513 508 484 512 490 506 486 510 482 514 488 508 484 1481 513 1478 516 1475 509 1483 511 1480 514 1477 517 1475 509 1482 512 509 483 513 489 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 1010 1508 486 509 483 513 489 507 485 512 490 505 487 510 482 1509 485 511 491 1501 483 1509 485 1507 487 1504 490 1502 482 1509 485 511 491 1500 484 50779 1010 1506 488 508 484 512 490 505 487 509 483 513 489 506 486 1506 488 507 485 1506 488 1503 481 1510 484 1508 486 1505 489 1503 481 514 488 1503 491 -# +# name: POWER type: parsed protocol: NECext address: BA A0 00 00 command: 4C B3 00 00 -# +# name: MUTE type: parsed protocol: NECext address: BA A0 00 00 command: 01 FD 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1004 1513 481 515 487 1478 516 505 487 510 482 1484 510 1481 513 508 484 512 490 1475 509 513 489 1477 507 1484 510 511 481 515 487 1479 515 1474 510 50774 1005 1484 510 513 489 1476 508 513 489 508 484 1482 512 1479 515 506 486 511 481 1483 511 512 490 1475 509 1483 511 510 482 515 487 1504 490 1475 509 50777 1013 1503 491 506 486 1505 489 507 485 512 490 1501 483 1508 486 510 482 514 488 1503 481 515 487 1504 490 1500 484 512 490 506 486 1506 488 1502 482 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1014 1477 507 514 488 508 484 512 490 505 487 509 483 513 489 507 485 1480 514 1477 517 1475 509 1483 511 1480 514 1477 517 1475 509 1482 512 508 484 50774 1004 1486 508 513 489 507 485 511 491 504 488 508 484 513 489 505 487 1479 515 1476 508 1484 510 1481 513 1478 516 1475 509 1482 512 1480 514 507 485 50771 1007 1507 487 509 483 513 489 507 485 511 481 515 487 508 484 513 489 1502 482 1483 511 1481 513 1479 515 1476 508 1484 510 1481 513 1478 516 506 486 -# +# name: POWER type: parsed protocol: NECext address: BA 4B 00 00 command: 4C B3 00 00 -# +# name: MUTE type: parsed protocol: NECext address: BA 4B 00 00 command: 01 FE 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 83 22 00 00 command: 0A F5 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 83 22 00 00 command: 01 FE 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 35 00 00 00 command: 45 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 35 00 00 00 command: 1B 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 35 00 00 00 command: 09 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 35 00 00 00 command: 51 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 83 22 00 00 command: 08 F7 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 0A 1D 00 00 command: 08 F7 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 0A 1D 00 00 command: 0A F5 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 0A 1D 00 00 command: 03 FC 00 00 -# +# name: POWER type: parsed protocol: NECext address: 0A 1D 00 00 command: 01 FE 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 20 00 00 00 command: 06 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 20 00 00 00 command: 07 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 20 00 00 00 command: 1E 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 80 00 00 00 command: 01 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 80 00 00 00 command: 03 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 80 00 00 00 command: 06 00 00 00 -# +# name: VOL+ type: parsed protocol: Samsung32 address: 2C 00 00 00 command: 17 00 00 00 -# +# name: VOL- type: parsed protocol: Samsung32 address: 2C 00 00 00 command: 16 00 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 83 22 00 00 command: 16 E9 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 83 22 00 00 command: 0F F0 00 00 -# +# name: POWER type: parsed protocol: NECext address: 83 22 00 00 command: 0C F3 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 83 22 00 00 command: 15 EA 00 00 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3492 1750 416 454 425 1313 424 446 422 447 421 448 420 450 418 451 417 452 416 453 415 455 424 445 423 446 422 447 421 1290 447 450 418 451 417 452 416 453 415 455 424 445 423 447 421 1290 447 422 446 1319 418 452 416 426 442 454 425 445 423 446 422 447 421 421 447 449 419 450 418 451 417 452 416 453 415 454 425 1314 423 446 422 447 421 448 420 449 419 450 418 451 417 452 416 454 425 444 424 1315 422 74926 3488 1754 422 447 421 1317 420 422 446 451 417 452 416 453 415 454 425 444 424 445 423 446 422 447 421 448 420 449 419 1292 445 452 416 453 415 454 425 445 423 446 422 447 421 448 420 1318 419 450 418 1293 444 453 415 454 425 445 423 446 422 447 421 448 420 449 419 450 418 451 417 452 416 453 415 455 424 445 423 1315 422 448 420 449 419 450 418 424 444 452 416 453 415 454 425 445 423 446 422 1289 448 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3486 1756 420 449 419 1291 446 424 444 452 416 453 415 454 425 444 424 445 423 446 422 446 422 447 421 448 420 449 419 1319 418 452 416 453 415 426 453 444 424 445 423 446 422 447 421 1290 447 422 446 1319 418 451 417 452 416 454 425 444 424 445 423 446 422 447 421 420 448 1317 420 449 419 450 418 452 416 453 415 1322 425 417 451 445 423 1315 422 447 421 448 420 449 419 450 418 451 417 452 416 1322 415 74922 3492 1722 444 452 416 1321 416 426 453 444 424 445 423 446 422 447 421 447 421 448 420 449 419 450 418 451 417 452 416 1294 443 453 415 454 425 445 423 445 423 446 422 447 421 448 420 1317 420 450 418 1319 418 451 417 425 443 453 415 454 425 444 424 418 450 446 422 447 421 1317 420 449 419 450 418 451 417 452 416 1322 425 444 424 445 423 1315 422 420 448 448 420 448 420 422 446 450 418 451 417 1321 416 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3491 1751 415 454 425 1314 423 446 422 448 420 449 419 450 418 451 417 452 416 453 415 454 425 445 423 446 422 447 421 1317 420 449 419 451 417 452 416 453 415 454 425 444 424 445 423 1316 421 448 420 1318 419 451 417 452 416 453 415 454 425 445 423 446 422 447 421 448 420 1318 419 451 417 1321 416 1322 425 1313 424 1314 423 419 449 447 421 1290 447 450 418 1320 417 1321 416 1322 425 444 424 445 423 1288 449 74914 3491 1751 415 427 452 1314 423 446 422 447 421 448 420 449 419 450 418 451 417 452 416 453 415 454 425 445 423 446 422 1316 421 449 419 450 418 451 417 452 416 453 415 454 425 445 423 1315 422 448 420 1318 419 451 417 452 416 453 415 454 425 445 423 446 422 447 421 448 420 1318 419 451 417 1321 416 1322 415 1295 452 1286 451 446 422 447 421 1317 420 450 418 1320 417 1321 416 1295 442 454 425 445 423 1315 422 74905 3491 1752 424 445 423 1315 422 447 421 448 420 422 446 451 417 452 416 453 415 454 425 445 423 446 422 447 421 448 420 1318 419 451 417 452 416 453 415 454 425 445 423 446 422 447 421 1317 420 450 418 1293 444 452 416 454 425 444 424 446 422 447 421 448 420 449 419 450 418 1320 417 453 415 1323 424 1314 423 1315 422 1288 449 448 420 450 418 1293 444 453 415 1323 424 1313 424 1314 423 447 421 448 420 1318 419 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3486 1728 448 448 420 1318 419 423 445 451 417 452 416 454 425 444 424 445 423 446 422 447 421 448 420 421 447 449 419 1319 418 451 417 453 415 453 426 444 424 445 423 446 422 447 421 1317 420 449 419 1319 418 451 417 452 416 453 415 454 425 445 423 446 422 447 421 447 421 421 447 1291 446 423 445 425 443 1322 415 1322 425 444 424 445 423 446 422 1289 448 448 420 422 446 1292 445 451 417 452 416 1322 415 74924 3486 1755 421 447 421 1317 420 449 419 450 418 451 417 452 416 453 415 454 425 417 451 445 423 446 422 420 448 448 420 1317 420 450 418 451 417 452 416 426 442 427 452 444 424 445 423 1315 422 447 421 1317 420 449 419 450 418 451 417 425 443 453 415 454 425 444 424 418 450 446 422 1315 422 448 420 421 447 1291 446 1319 418 451 417 452 416 454 414 1323 424 445 423 419 449 1316 421 422 446 450 418 1293 444 74912 3487 1755 421 448 420 1290 447 423 445 451 417 452 416 453 415 454 425 445 423 446 422 446 422 447 421 421 447 449 419 1319 418 452 416 426 442 454 425 444 424 445 423 446 422 447 421 1290 447 449 419 1319 418 452 416 452 416 453 415 427 451 445 423 446 422 447 421 448 420 449 419 1319 418 424 444 452 416 1322 415 1323 424 444 424 445 423 446 422 1317 420 449 419 423 445 1320 417 453 415 427 452 1313 424 -# +# name: POWER type: parsed protocol: NECext address: C8 91 00 00 command: 00 FF 00 00 -# +# name: MUTE type: parsed protocol: NECext address: C8 91 00 00 command: 20 DF 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: C8 91 00 00 command: 1E E1 00 00 -# +# name: VOL- type: parsed protocol: NECext address: C8 91 00 00 command: 1F E0 00 00 -# +# name: VOL+ type: parsed protocol: RC6 address: 10 00 00 00 command: 10 00 00 00 -# +# name: VOL- type: parsed protocol: RC6 address: 10 00 00 00 command: 11 00 00 00 -# +# name: POWER type: parsed protocol: RC6 address: 10 00 00 00 command: 0C 00 00 00 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4559 4461 546 490 515 495 521 490 515 495 489 1484 516 1482 550 486 519 491 493 1480 520 1478 522 1477 523 1475 546 490 515 495 521 490 515 495 489 4493 545 491 525 486 519 491 514 496 488 1484 516 1483 517 1481 551 486 488 1485 515 1483 517 1482 550 486 519 491 525 486 519 491 493 1479 542 494 522 489 516 467 517 1482 550 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4550 4469 548 462 543 467 549 461 544 466 518 1481 520 1479 542 468 548 462 522 1477 523 1476 514 1485 515 1483 549 461 544 466 550 461 544 466 518 4491 547 463 542 468 548 462 543 467 549 462 543 467 549 461 523 1476 514 1485 515 1484 516 1482 550 461 513 1486 514 1485 515 1483 549 461 544 466 550 461 544 493 491 1481 540 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4496 4442 513 503 488 502 489 501 490 500 491 1505 487 1508 484 505 486 504 487 1508 484 1511 492 1503 489 1499 514 484 486 504 487 502 489 501 490 4449 517 499 492 499 492 497 483 507 484 1511 492 1504 488 1499 514 483 487 1509 483 1512 491 1504 488 503 488 501 490 500 491 499 492 1504 488 501 490 500 491 492 509 1494 488 55126 4496 4446 541 482 488 502 489 501 490 500 491 1505 487 1508 484 505 486 504 487 1508 484 1503 510 1493 489 1480 512 504 487 503 488 502 489 500 491 4449 517 498 493 497 483 507 484 505 486 1502 511 1492 490 1504 488 502 489 1507 485 1509 483 1512 491 473 518 498 493 496 484 505 486 1510 483 499 512 484 486 504 487 1508 484 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4492 4434 510 505 486 505 486 504 487 503 488 1481 511 1484 518 499 492 498 493 1476 516 1479 513 1483 519 1469 596 402 516 500 491 499 492 498 493 4447 518 498 493 497 483 507 484 506 485 504 487 503 488 494 517 1485 486 1483 519 1476 516 1480 512 504 486 1508 484 1486 517 1479 565 425 513 502 488 501 490 492 509 1467 515 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4500 4436 516 504 486 510 490 505 485 510 490 1500 491 1474 517 505 485 484 516 1501 490 1501 490 1501 490 1501 490 505 485 511 489 506 484 485 515 4449 513 482 508 513 487 508 482 514 486 1504 487 1504 487 1504 487 482 508 1509 482 1509 492 1499 492 504 486 509 491 504 486 509 491 1500 491 504 486 510 490 478 512 1505 486 55017 4492 4444 508 512 488 508 482 513 487 508 482 1508 483 1482 509 513 487 508 482 1509 482 1509 482 1483 508 1483 508 513 487 508 482 514 486 509 481 4457 515 506 484 511 489 506 484 511 489 1501 490 1475 516 1501 490 506 484 1480 511 1507 484 1480 511 511 489 506 484 512 488 507 483 1507 484 512 488 507 483 512 488 1503 488 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4493 4443 509 512 488 507 483 512 488 507 483 1482 509 1482 509 512 488 507 483 1482 509 1482 509 1482 509 1482 509 512 488 507 483 513 487 508 482 4457 516 505 485 510 490 505 485 510 490 505 485 511 489 505 485 1480 511 1480 511 1480 511 1481 510 484 516 1476 515 1476 515 1476 515 481 509 486 514 481 509 486 514 1476 515 55014 4498 4438 514 482 508 487 513 482 508 488 512 1477 514 1477 514 482 508 487 513 1477 514 1477 514 1477 514 1477 514 482 518 477 513 482 518 477 513 4451 511 485 515 479 511 485 515 480 510 485 515 480 510 485 515 1475 516 1475 516 1476 515 1476 515 480 510 1481 510 1481 510 1481 510 486 514 481 509 486 514 481 509 1482 509 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4524 4473 512 516 491 511 486 516 491 511 496 1482 522 1482 522 506 491 512 495 1483 521 1483 521 1483 521 1483 521 506 491 512 495 507 490 512 495 4475 521 507 490 513 494 508 489 513 494 1484 520 1484 520 1483 521 507 490 1488 516 1488 516 1488 516 511 496 506 491 511 496 506 491 1488 516 511 496 506 491 512 495 1483 521 55356 4533 4463 512 516 491 511 486 516 491 511 496 1507 487 1492 512 515 492 510 487 1492 512 1492 512 1491 513 1491 513 515 492 510 487 515 492 510 487 4484 512 516 491 511 496 506 491 512 495 1483 521 1482 522 1482 522 506 491 1488 516 1487 517 1487 517 511 496 506 491 512 495 506 491 1488 516 512 495 507 490 512 495 1483 521 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4533 4464 521 507 490 512 495 507 490 513 494 1484 520 1484 520 508 489 513 494 1484 520 1484 520 1483 521 1483 521 506 491 511 496 506 491 512 495 4475 521 507 490 512 495 507 490 513 494 508 489 513 494 508 489 1490 514 1490 514 1490 514 1490 514 514 493 1485 519 1485 519 1485 519 509 488 515 492 510 487 516 491 1487 517 55369 4531 4465 520 508 489 514 493 509 488 515 492 1486 518 1486 518 509 488 514 493 1486 518 1485 519 1485 519 1485 519 509 488 514 493 509 488 515 492 4478 518 511 486 516 491 511 496 506 491 512 495 507 490 512 495 1483 521 1483 521 1483 521 1483 521 507 490 1488 516 1488 516 1488 516 512 495 507 490 513 494 508 489 1490 514 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4530 4465 521 507 490 513 494 507 490 513 494 1509 496 1483 521 506 491 512 495 1508 486 1492 512 1492 513 1491 513 514 493 509 488 514 493 509 488 4483 513 514 493 509 488 515 492 510 487 515 492 510 487 515 492 510 487 1517 488 1491 513 1490 515 513 494 1510 494 1484 520 1483 521 1483 521 506 491 512 495 506 491 1487 517 55357 4528 4468 518 510 487 515 492 510 487 515 492 1512 493 1485 519 509 488 514 493 1510 494 1483 522 1483 521 1482 512 516 491 511 486 516 491 511 486 4484 512 516 491 511 486 516 491 511 486 516 491 511 486 516 491 511 496 1507 487 1491 513 1491 514 514 493 1510 495 1484 521 1483 522 1483 522 506 491 511 486 516 491 1513 491 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4495 4440 512 509 491 504 486 509 491 504 486 1478 513 1479 512 509 491 504 486 1478 513 1479 512 1479 512 1479 512 509 491 504 486 509 491 504 486 4452 511 511 489 506 484 511 489 506 484 511 489 506 484 511 489 506 484 1480 511 1480 511 1480 511 510 491 1500 491 1475 516 1475 516 1475 516 504 486 510 490 505 485 1479 512 55017 4497 4439 513 507 483 513 487 507 483 513 487 1476 515 1477 514 507 483 513 487 1476 515 1476 515 1477 514 1477 514 481 509 512 488 507 483 512 488 4451 512 509 491 504 486 509 491 504 486 483 517 504 486 509 492 504 486 1504 487 1504 487 1478 513 508 482 1509 482 1509 482 1509 482 1483 508 513 487 508 482 513 487 1504 487 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4501 4435 517 504 486 510 490 505 485 510 490 1475 516 1475 516 506 484 511 489 1476 515 1476 515 1476 515 1477 514 507 483 512 488 507 483 513 487 4451 511 510 490 479 511 484 516 506 484 1481 510 511 489 506 484 511 489 1476 515 1476 515 1477 514 507 483 512 488 1477 514 1477 514 1478 513 508 482 513 487 508 482 1484 517 55011 4496 4440 512 509 491 478 512 483 517 504 486 1480 511 1480 511 484 516 505 485 1480 511 1480 511 1481 510 1481 510 484 516 506 484 511 489 506 484 4455 517 504 486 509 491 504 486 483 517 1474 517 505 485 510 490 505 485 1480 511 1480 511 1481 510 511 489 480 510 1481 510 1481 510 1482 509 485 515 507 483 512 488 1477 514 -# +# name: POWER type: parsed protocol: Samsung32 address: 2C 00 00 00 command: 1E 00 00 00 -# +# name: MUTE type: parsed protocol: Samsung32 address: 2C 00 00 00 command: 1F 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4504 4432 511 509 492 504 486 509 492 504 486 1478 514 1477 515 507 484 512 489 1476 516 1475 517 1475 517 1474 518 503 487 509 492 503 487 508 493 4446 508 513 488 507 483 512 489 507 483 512 489 506 484 511 490 506 484 1481 511 1480 512 1479 513 509 492 1473 519 1473 519 1472 509 1482 510 511 490 506 484 511 490 1475 517 54985 4498 4437 517 504 486 509 492 504 486 509 492 1473 519 1472 509 512 489 506 484 1481 511 1480 512 1480 512 1479 513 508 493 502 488 507 483 512 489 4449 516 506 485 511 490 505 485 510 491 505 485 510 491 504 486 509 492 1473 519 1473 508 1483 561 434 515 1476 516 1475 517 1474 518 1473 519 502 488 507 483 512 489 1476 516 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4531 4406 516 478 512 484 538 457 544 452 538 1453 518 1473 519 476 546 450 540 1451 509 1482 510 1481 511 1480 512 483 539 457 544 452 538 457 544 4420 513 482 540 456 545 450 540 455 546 1445 547 449 541 454 536 458 543 1449 543 1449 543 1448 544 451 539 456 545 1445 547 1445 547 1444 537 458 543 453 537 457 544 1448 544 54957 4495 4440 514 481 520 477 513 482 519 476 514 1476 516 1475 517 478 512 484 517 1474 518 1473 519 1472 520 1471 521 474 516 479 511 484 517 479 511 4452 512 509 492 503 487 508 493 503 487 1477 515 507 483 512 489 506 484 1481 511 1481 511 1480 512 509 492 503 487 1478 514 1478 514 1477 515 506 484 511 490 505 485 1480 512 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4551 4468 549 461 544 493 523 460 545 466 518 1480 520 1479 542 468 548 489 495 1477 523 1475 515 1484 516 1483 549 461 544 493 523 487 518 466 518 4490 548 462 543 493 523 488 517 466 550 461 544 466 550 460 545 465 519 1480 520 1478 522 1477 544 465 519 1480 520 1479 521 1477 523 1476 545 464 541 496 520 490 494 1479 542 55901 4554 4465 542 494 522 489 516 494 522 488 496 1477 523 1476 545 490 515 495 489 1484 516 1483 517 1481 519 1479 542 494 522 489 516 494 522 488 496 4487 541 495 521 490 515 495 521 489 516 494 522 488 517 493 523 488 496 1476 525 1475 515 1483 549 488 496 1476 524 1475 515 1484 516 1482 550 486 519 491 525 486 488 1485 547 55897 4548 4470 548 462 543 468 548 462 543 467 517 1482 518 1480 541 469 547 490 494 1478 575 1423 515 1485 515 1483 549 461 544 466 550 461 544 466 518 4491 547 462 543 467 549 462 543 467 549 461 544 466 539 497 519 492 492 1480 520 1478 522 1477 544 465 519 1480 520 1479 521 1477 513 1486 546 464 541 469 547 464 520 1478 543 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4553 4467 550 459 546 464 541 469 547 464 520 1479 521 1477 544 492 524 486 498 1475 515 1484 516 1482 518 1481 540 496 520 490 515 495 521 490 494 4488 550 486 519 491 525 486 519 491 493 1479 542 494 522 489 516 494 490 1482 518 1481 519 1480 541 494 522 489 495 1478 522 1476 514 1485 547 489 516 494 522 489 495 1477 544 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4555 4483 516 516 488 519 495 512 492 515 489 1525 493 1519 489 518 496 511 493 1521 487 1525 493 1520 488 1524 494 513 491 517 487 520 494 514 490 4501 519 513 491 516 488 520 494 513 491 517 487 521 493 514 490 518 486 1527 491 1522 496 1517 491 516 488 1525 493 1520 488 1525 493 1520 488 519 495 512 492 516 488 1525 493 -# +# name: VOL+ type: parsed protocol: RC5 address: 13 00 00 00 command: 0D 00 00 00 -# +# name: VOL- type: parsed protocol: RC5 address: 13 00 00 00 command: 0E 00 00 00 -# +# name: POWER type: parsed protocol: RC5 address: 13 00 00 00 command: 0B 00 00 00 -# +# name: MUTE type: parsed protocol: RC5 address: 13 00 00 00 command: 0C 00 00 00 -# +# name: VOL+ type: parsed protocol: SIRC address: 01 00 00 00 command: 12 00 00 00 -# +# name: VOL- type: parsed protocol: SIRC address: 01 00 00 00 command: 13 00 00 00 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4552 4468 574 436 566 444 568 442 570 441 540 1458 546 1453 572 439 573 437 544 1455 539 1460 544 1456 548 1450 575 436 566 444 568 442 570 440 541 4468 594 416 565 445 567 443 569 441 540 1459 545 1453 541 1459 566 444 547 1452 542 1457 547 1452 593 417 564 446 566 444 568 442 539 1460 565 446 566 444 568 442 539 1460 565 55957 4581 4437 543 467 545 466 546 464 538 472 519 1480 514 1485 540 471 541 469 512 1486 518 1481 513 1486 518 1481 575 436 566 444 568 442 570 440 541 4468 543 468 544 465 547 464 538 472 519 1480 514 1485 519 1479 546 465 516 1483 511 1488 516 1483 542 468 544 466 546 464 538 473 519 1480 545 466 546 464 538 472 519 1480 545 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4546 4473 538 473 539 470 542 469 543 467 514 1484 520 1479 545 465 547 463 518 1481 513 1486 518 1481 513 1487 538 472 540 470 542 469 543 466 515 4495 546 463 539 472 540 470 542 468 544 466 546 491 521 462 519 1480 513 1485 519 1480 514 1486 539 472 519 1479 515 1484 520 1479 546 464 548 463 539 471 541 469 512 1487 548 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4549 4469 542 468 544 467 545 465 537 473 519 1481 513 1485 540 471 541 469 512 1487 517 1482 512 1487 517 1482 543 467 545 465 547 463 539 472 519 4489 543 468 544 466 546 464 538 473 539 470 542 468 544 466 546 465 516 1482 512 1487 517 1482 543 468 513 1485 519 1480 514 1485 519 1480 545 465 547 463 539 472 520 1479 546 55899 4549 4470 541 469 574 436 566 445 546 463 549 1450 513 1486 539 471 572 438 543 1456 548 1451 543 1456 548 1451 574 436 566 445 567 443 569 441 540 4469 573 437 575 435 567 443 569 441 571 439 573 437 565 445 567 443 549 1451 543 1456 548 1451 574 436 545 1454 540 1459 545 1454 540 1459 566 444 568 442 570 440 541 1458 567 55878 4580 4439 572 439 573 437 565 445 567 443 548 1451 543 1456 569 441 571 439 542 1457 547 1452 542 1457 547 1452 573 437 575 435 567 443 569 442 539 4469 573 438 574 436 566 444 568 442 570 440 572 438 574 436 566 444 547 1452 542 1457 547 1452 573 437 544 1455 539 1460 544 1455 539 1460 575 435 567 444 568 442 539 1459 566 55879 4578 4442 569 441 571 439 573 437 575 435 546 1453 541 1458 567 444 568 441 540 1459 545 1454 540 1459 545 1454 571 439 573 437 575 435 567 444 548 4461 571 440 572 438 574 436 566 444 568 442 570 440 572 438 574 436 545 1454 540 1459 545 1454 571 439 542 1457 547 1452 542 1457 547 1452 573 437 575 435 567 444 547 1451 574 55871 4554 4465 546 464 538 473 539 471 541 469 512 1487 517 1481 544 467 545 465 516 1483 511 1488 516 1483 511 1488 547 463 539 472 540 470 542 468 513 4496 546 464 538 472 540 470 542 468 544 466 546 464 538 473 539 471 510 1488 516 1483 511 1488 547 463 518 1481 513 1486 518 1481 513 1486 539 472 540 470 542 467 514 1485 540 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4555 4465 546 464 538 472 540 470 542 468 513 1486 518 1481 544 467 545 465 516 1483 511 1488 516 1483 511 1488 537 473 539 472 540 470 542 468 513 4496 546 464 538 473 539 471 541 469 512 1487 538 472 540 470 542 469 512 1486 518 1481 544 1455 570 441 571 439 542 1457 547 1452 542 1457 568 442 570 440 572 438 543 1456 569 55920 4555 4464 547 464 538 472 540 470 542 468 513 1486 518 1481 544 466 546 464 517 1482 512 1487 517 1482 512 1487 538 473 539 471 541 469 543 467 514 4495 547 463 539 472 540 470 542 468 513 1486 539 471 541 469 543 467 514 1485 519 1479 515 1485 540 470 542 468 513 1486 518 1481 513 1486 539 471 541 469 543 467 514 1485 540 -# +# name: POWER type: parsed protocol: SIRC15 address: 10 00 00 00 command: 15 00 00 00 -# +# name: POWER type: parsed protocol: SIRC address: 01 00 00 00 command: 15 00 00 00 -# +# name: MUTE type: parsed protocol: SIRC address: 01 00 00 00 command: 14 00 00 00 -# +# name: POWER type: parsed protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 -# +# name: POWER type: parsed protocol: SIRC15 address: 30 00 00 00 command: 15 00 00 00 -# +# name: MUTE type: parsed protocol: SIRC15 address: 30 00 00 00 command: 14 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 86 FF 00 00 command: 1C E3 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 86 FF 00 00 command: 1D E2 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 80 00 00 00 command: 0D 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 80 00 00 00 command: 08 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 80 00 00 00 command: 12 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 80 00 00 00 command: 1E 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: EF 01 00 00 command: 25 DA 00 00 -# +# name: VOL- type: parsed protocol: NECext address: EF 01 00 00 command: 14 EB 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: EF 01 00 00 command: 13 EC 00 00 -# +# name: MUTE type: parsed protocol: NECext address: EF 01 00 00 command: 28 D7 00 00 -# +# name: POWER type: parsed protocol: NEC address: 00 00 00 00 command: 40 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 00 00 00 00 command: 41 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 00 00 00 00 command: 45 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 00 00 00 00 command: 48 00 00 00 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1048 580 597 1165 596 582 595 1167 594 875 599 578 599 1455 593 585 592 1171 600 577 600 576 601 13191 1042 586 591 1170 601 576 601 1161 600 869 595 582 595 1459 599 578 599 1163 598 580 597 579 598 13195 1048 580 597 1165 596 581 596 1167 594 875 599 578 599 1456 592 585 592 1171 600 577 600 577 600 13192 1052 576 601 1162 599 578 599 1163 598 871 593 584 593 1462 596 581 596 1166 595 582 595 582 595 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 1048 553 624 1138 623 554 623 1139 622 848 626 551 626 1427 621 556 652 1403 655 522 655 814 650 12579 1050 552 656 1106 624 553 624 1138 623 847 627 550 627 1427 621 556 621 1434 624 553 624 845 619 12612 1079 523 623 1139 622 555 622 1139 622 848 626 550 627 1427 621 556 621 1434 624 553 624 845 619 12613 1047 556 621 1141 620 556 621 1141 620 850 624 552 625 1429 619 558 619 1435 623 554 623 846 628 12600 1050 552 625 1137 624 553 624 1137 624 846 618 558 619 1435 623 554 623 1431 627 550 627 842 622 12609 1051 551 626 1136 625 551 626 1136 625 844 620 557 620 1434 624 554 623 1431 627 550 627 843 621 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1073 528 649 1114 647 530 647 1116 645 825 649 527 650 1405 653 1402 625 552 646 1409 649 1113 648 11417 1077 524 653 1110 651 526 651 1112 649 820 654 523 654 1400 648 1407 651 526 651 1404 654 1109 652 11414 1079 523 654 1109 652 524 653 1111 650 819 624 554 654 1401 647 1408 650 529 648 1406 652 1111 650 11416 1077 525 652 1110 651 526 651 1112 649 820 654 523 654 1401 647 1408 650 528 649 1405 622 1141 651 11414 1080 521 646 1116 624 553 645 1117 654 816 648 529 648 1406 652 1403 655 523 644 1410 648 1114 647 11418 1075 526 651 1111 650 527 650 1112 649 820 623 554 654 1400 648 1407 651 526 651 1403 655 1107 654 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1051 550 627 1135 626 551 626 1136 625 845 619 850 624 553 675 794 629 842 622 555 622 555 622 13780 1047 555 622 1140 621 557 620 1141 620 850 624 845 619 558 619 850 624 846 618 559 618 559 618 13782 1045 558 619 1143 618 559 618 1144 627 842 622 847 627 550 627 842 622 848 626 551 626 551 626 13774 1053 549 618 1144 627 550 627 1135 626 843 621 849 625 551 626 844 620 850 624 553 624 552 625 13776 1051 551 626 1137 624 553 624 1138 623 846 618 851 623 554 623 846 628 841 623 554 623 554 623 13776 1051 551 626 1136 625 552 625 1137 624 845 619 850 624 553 624 846 618 852 622 555 622 554 623 13778 1049 554 623 1139 622 555 622 1140 621 849 625 844 620 557 620 850 624 846 618 559 618 558 619 -# +# name: POWER type: parsed protocol: NEC address: 78 00 00 00 command: CC 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 78 00 00 00 command: 9C 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 7E 00 00 00 command: 2A 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 7A 00 00 00 command: 1C 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 274 789 254 1792 275 814 250 787 246 816 248 1798 279 784 249 813 251 785 248 788 245 1827 281 1791 275 1825 272 790 253 783 250 43886 277 786 278 1795 272 791 252 783 281 782 251 785 269 1804 273 1800 277 1822 275 1798 279 783 270 766 277 759 274 1825 272 1800 277 43886 277 759 274 1825 272 764 279 756 277 786 278 1795 282 781 272 763 280 755 278 785 279 1794 273 1827 270 1802 275 761 272 791 273 43888 276 761 272 1800 277 786 278 758 275 760 273 790 274 1799 278 1821 276 1796 281 1792 275 788 276 760 273 789 275 1798 279 1794 273 43889 278 785 248 1825 272 790 253 782 272 764 279 1793 274 790 274 761 282 781 273 763 280 1793 273 1825 272 1800 277 813 220 789 275 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 270 793 250 1795 272 818 246 791 252 809 244 766 277 1795 282 781 272 790 253 809 224 1822 275 1797 280 1820 277 785 248 788 245 43889 273 790 274 1799 278 785 248 788 276 787 246 1826 271 792 251 1794 273 1827 270 1802 275 788 245 791 273 790 253 1819 278 1794 273 43889 274 789 254 1818 269 767 276 786 247 789 275 788 245 1827 270 792 251 785 248 814 250 1796 281 1819 248 1825 272 790 253 783 271 43889 245 791 273 1799 278 786 278 784 249 787 246 1827 281 781 252 1821 276 1796 281 1792 274 814 250 786 247 789 244 1829 279 1793 274 43888 275 815 218 1828 280 783 250 786 278 785 248 788 245 1827 280 782 251 785 268 794 249 1797 280 1819 278 1794 272 791 252 810 254 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 277 759 274 1799 278 784 280 783 250 812 242 1804 273 816 227 808 246 791 252 1819 248 1825 273 1826 251 1822 276 786 247 789 244 43888 274 815 249 1797 280 783 250 812 252 784 249 813 241 1805 272 1827 250 1822 275 787 246 816 217 819 255 807 226 1820 278 1795 272 43888 273 789 254 1817 270 793 251 785 248 814 250 1795 282 807 247 790 253 783 250 1822 276 1796 281 1818 249 1824 274 814 229 807 247 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 275 762 271 1800 277 786 278 784 249 813 241 795 248 1824 253 784 270 792 251 1821 246 1826 272 1801 276 1823 275 762 271 790 243 43889 274 789 275 1797 280 783 250 812 252 784 249 1823 275 762 271 1827 250 1822 276 787 246 816 217 818 246 790 253 1819 268 1804 273 43886 277 786 247 1825 273 764 280 783 250 811 253 784 249 1822 276 761 272 816 228 1819 279 1794 273 1826 251 1821 277 786 247 815 249 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 275 762 271 1800 277 786 278 784 249 813 241 795 248 814 219 817 247 789 254 1818 249 1824 274 1798 279 1820 278 759 274 788 245 43887 274 789 275 1798 279 783 250 812 252 784 249 1823 274 1798 279 1820 247 1826 271 765 278 809 224 812 252 784 249 1823 275 1798 279 43880 281 782 251 1821 277 760 273 789 244 818 246 790 253 808 246 791 252 809 224 1822 275 1797 280 1819 248 1825 273 790 253 808 246 -# +# name: POWER type: raw frequency: 39105 duty_cycle: 0.330000 data: 5396 53113 8899 4450 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 563 563 563 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 38358 8899 2225 563 95052 -# +# name: VOL+ type: raw frequency: 39105 duty_cycle: 0.330000 data: 5472 53216 8899 4450 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 563 563 1662 563 1662 563 1662 563 563 563 38358 8899 2199 563 95052 -# +# name: VOL- type: raw frequency: 39105 duty_cycle: 0.330000 data: 5472 53344 8899 4424 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 1662 563 1662 563 563 563 563 563 563 563 1662 563 1662 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 563 563 38358 8899 2225 563 95052 -# +# name: MUTE type: raw frequency: 39105 duty_cycle: 0.330000 data: 5498 53523 8899 4450 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 1662 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 563 563 1662 563 563 563 1662 563 1662 563 563 563 38358 8899 2199 563 95052 -# +# name: POWER type: parsed protocol: NECext address: D2 6C 00 00 command: CB 34 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: D2 6D 00 00 command: 02 FD 00 00 -# +# name: VOL- type: parsed protocol: NECext address: D2 6D 00 00 command: 03 FC 00 00 -# +# name: MUTE type: parsed protocol: NECext address: D2 6D 00 00 command: 05 FA 00 00 -# +# name: POWER type: parsed protocol: NECext address: D2 03 00 00 command: 04 FB 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: D2 03 00 00 command: 02 FD 00 00 -# +# name: VOL- type: parsed protocol: NECext address: D2 03 00 00 command: 03 FC 00 00 -# +# name: MUTE type: parsed protocol: NECext address: D2 03 00 00 command: 05 FA 00 00 -# +# name: POWER type: parsed protocol: RC5 address: 14 00 00 00 command: 0C 00 00 00 -# +# name: VOL- type: parsed protocol: RC5 address: 14 00 00 00 command: 11 00 00 00 -# +# name: VOL+ type: parsed protocol: RC5 address: 14 00 00 00 command: 10 00 00 00 -# +# name: MUTE type: parsed protocol: RC5 address: 10 00 00 00 command: 0D 00 00 00 -# +# name: VOL+ type: parsed protocol: RC5 address: 10 00 00 00 command: 10 00 00 00 -# +# name: VOL- type: parsed protocol: RC5 address: 10 00 00 00 command: 11 00 00 00 -# +# name: POWER type: parsed protocol: SIRC15 address: 10 00 00 00 command: 60 00 00 00 -# +# name: VOL+ type: parsed protocol: SIRC15 address: 30 00 00 00 command: 12 00 00 00 -# +# name: VOL- type: parsed protocol: SIRC15 address: 30 00 00 00 command: 13 00 00 00 -# +# name: VOL+ type: parsed protocol: SIRC15 address: 10 00 00 00 command: 12 00 00 00 -# +# name: VOL- type: parsed protocol: SIRC15 address: 10 00 00 00 command: 13 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 7E 81 00 00 command: 2A D4 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 7A 85 00 00 command: 1C E2 00 00 -# +# name: POWER type: parsed protocol: NEC address: 78 00 00 00 command: 0F 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 78 00 00 00 command: 4F 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 7A 00 00 00 command: 1A 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 7A 00 00 00 command: 1B 00 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 7A 85 00 00 command: 1A E4 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 7A 85 00 00 command: 1B E5 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 78 00 00 00 command: 1E 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 78 00 00 00 command: 1F 00 00 00 -# +# name: MUTE type: parsed protocol: RC5X address: 0A 00 00 00 command: 2F 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 00 00 00 00 command: 15 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8437 4188 538 1565 539 1565 539 513 544 508 538 513 544 1559 545 507 539 1564 540 1564 540 1563 541 1563 541 511 546 1557 547 505 542 511 546 505 542 20497 597 1507 545 1559 545 507 539 512 545 507 539 1564 540 512 545 1558 546 1558 546 1558 546 1557 547 505 542 1562 542 510 547 505 542 510 547 20492 540 1564 540 1564 540 512 545 506 540 511 546 1558 546 505 542 1562 542 1562 542 1562 542 1561 543 509 548 1555 538 514 543 509 537 514 543 20495 547 1558 546 1557 547 505 541 511 546 505 542 1562 542 510 547 1556 548 1556 548 1556 548 1556 537 514 543 1560 544 508 538 514 543 508 538 20501 541 1562 542 1562 542 510 547 505 541 510 547 1556 548 504 543 1561 543 1561 543 1560 544 1560 544 508 538 1565 539 513 544 507 539 513 544 20494 548 1556 548 1556 548 504 543 509 548 504 543 1560 544 508 539 1565 539 1565 539 1564 540 1564 540 512 545 1559 545 506 540 512 545 506 540 20499 543 1560 544 1560 544 508 539 513 544 508 538 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 541 1563 541 510 547 505 542 510 547 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8430 4194 542 1562 542 1562 542 510 547 505 541 510 547 1556 548 504 542 1561 543 509 548 1556 548 1556 548 1556 548 1556 548 504 542 509 537 514 543 20496 545 1559 545 1559 545 507 539 512 545 507 539 1564 540 512 545 1559 545 507 539 1564 540 1564 540 1563 541 1563 541 511 546 506 540 511 546 20494 546 1557 547 1557 547 505 541 510 547 505 541 1562 542 510 547 1556 548 505 541 1562 542 1562 542 1561 543 1561 543 509 548 504 542 509 537 20501 540 1565 539 1565 539 512 545 507 539 512 545 1559 545 507 539 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 540 511 546 506 540 20498 543 1562 542 1562 542 510 547 505 541 510 547 1557 547 505 541 1562 542 509 548 1556 548 1556 548 1556 548 1556 548 504 542 509 548 504 542 20497 543 1560 544 1560 544 508 538 513 544 508 538 1565 539 513 544 1560 544 508 538 1565 539 1565 539 1565 539 1564 540 513 544 507 539 512 545 20495 545 1558 546 1558 546 506 540 511 546 506 540 1563 541 511 546 1558 546 506 540 1563 541 1563 541 1563 541 1562 542 510 547 505 541 510 547 20493 548 1556 548 1556 548 504 542 509 548 504 542 1561 543 509 537 1566 538 514 543 1560 544 1560 544 1560 544 1560 544 508 538 513 544 508 538 20501 539 1564 540 1564 540 512 545 507 539 512 545 1559 545 507 539 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 540 511 546 506 540 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8434 4191 545 1559 545 1559 545 534 512 513 544 507 539 1564 540 538 519 1559 545 1558 546 1558 546 1558 546 1558 546 1558 546 533 513 511 546 506 540 19446 547 1557 547 1557 547 532 514 511 546 532 514 1562 593 459 546 1557 547 1557 547 1557 547 1557 547 1557 547 1557 547 531 515 510 547 505 541 19446 548 1556 548 1556 548 530 516 509 548 504 543 1561 543 535 512 1566 538 1565 539 1565 539 1565 539 1565 539 1565 539 540 517 509 537 514 543 19444 539 1565 539 1565 539 513 544 508 538 513 544 1559 545 534 512 1564 540 1564 540 1564 540 1564 540 1564 540 1564 540 539 518 507 539 513 544 19442 541 1563 541 1563 541 538 519 507 539 512 545 1558 546 506 540 1563 541 1563 541 1563 541 1563 541 1563 541 1562 542 537 520 505 541 511 546 19440 595 1509 543 1561 543 536 521 504 542 509 548 1555 538 540 517 1560 544 1560 544 1560 544 1560 544 1560 544 1560 544 534 512 513 544 508 538 19448 546 1559 545 1559 545 533 513 512 545 507 539 1563 541 538 519 1558 546 1558 546 1558 546 1557 547 1558 546 1558 546 533 513 512 545 506 540 19447 546 1557 547 1557 547 532 514 511 546 506 540 1562 542 537 520 1557 547 1557 547 1557 547 1557 547 1557 547 1557 547 505 542 510 547 505 541 19445 548 1556 548 1556 548 531 515 510 547 504 542 1561 543 536 521 1555 538 1566 538 1566 538 1566 538 1566 538 1565 539 514 543 509 537 514 543 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 8435 4189 547 1557 547 1557 547 505 541 510 547 505 541 1562 542 510 547 1557 547 505 541 510 547 1557 546 1557 547 1557 547 505 541 510 547 505 541 21550 547 1558 545 1558 546 506 540 511 546 506 540 1563 541 511 546 1558 545 506 540 511 546 1558 546 1558 546 1558 546 506 540 511 546 506 540 21551 546 1558 546 1558 546 506 540 512 545 506 540 1563 540 512 545 1558 546 506 540 512 545 1558 546 1558 546 1558 546 506 540 512 545 506 540 21551 546 1559 545 1559 545 507 539 512 545 507 539 1564 539 512 545 1559 545 507 539 512 545 1559 545 1559 545 1559 545 507 539 512 545 507 539 21552 545 1559 545 1559 545 507 539 513 544 507 539 1564 540 512 545 1559 545 507 539 512 545 1559 545 1559 545 1559 545 507 539 512 545 507 539 21552 545 1559 545 1559 545 507 539 513 544 507 539 1565 538 513 544 1559 545 507 539 513 544 1559 545 1559 544 1559 545 534 512 513 544 507 539 21553 544 1560 544 1560 544 534 512 513 544 508 538 1565 539 539 518 1560 544 534 512 513 544 1560 544 1560 544 1560 544 534 512 513 544 508 538 -# +# name: POWER type: parsed protocol: NEC address: 20 00 00 00 command: 41 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 20 00 00 00 command: 42 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 20 00 00 00 command: 43 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 20 00 00 00 command: 1B 00 00 00 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8498 4205 651 1471 576 530 550 1572 547 535 545 536 544 1578 541 540 550 1572 547 535 545 1576 543 539 541 1580 549 1572 547 534 546 1576 543 539 541 540 550 1571 548 533 547 1574 545 537 543 539 541 541 549 532 548 1574 545 536 544 1578 541 540 550 1571 548 1572 547 1574 545 1576 543 26533 8497 4203 653 1468 569 538 542 1579 550 531 549 533 547 1573 546 535 545 1576 543 538 542 1579 550 531 549 1571 548 1573 546 536 544 1576 543 539 541 540 550 1571 548 533 547 1574 545 536 544 538 542 540 550 530 550 1572 547 534 546 1575 544 537 543 1578 541 1579 550 1570 549 1572 547 26524 8496 4207 576 1570 549 533 547 1574 545 537 543 539 541 1580 549 532 548 1573 546 536 544 1577 542 539 551 1570 549 1572 547 534 546 1575 544 538 542 540 550 1571 548 534 546 1575 544 538 542 540 550 531 549 533 547 1575 544 537 543 1579 550 531 549 1571 548 1572 547 1574 545 1576 543 26529 8491 4211 573 1573 546 535 545 1576 543 539 551 530 550 1571 548 533 547 1574 545 536 544 1578 541 540 550 1570 549 1572 547 534 546 1575 544 538 542 539 541 1580 549 532 548 1572 547 535 545 537 543 539 541 540 550 1571 548 533 547 1574 545 537 543 1578 541 1579 550 1571 548 1574 545 26522 8498 4202 571 1574 545 537 543 1578 541 541 549 532 548 1573 546 534 546 1575 544 537 543 1577 542 540 550 1570 549 1571 548 533 547 1574 545 537 543 538 542 1579 550 531 549 1572 547 534 546 536 544 537 543 538 542 1579 550 531 549 1572 547 535 545 1575 544 1577 542 1579 550 1571 548 26522 8498 4203 570 1575 544 537 543 1578 541 541 549 532 548 1573 546 535 545 1575 544 538 542 1579 550 531 549 1571 548 1572 547 535 545 1575 544 538 542 539 541 1580 549 532 548 1572 547 534 546 536 544 537 543 539 541 1579 550 531 549 1571 548 533 547 1573 546 1574 545 1575 544 1577 542 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8490 4211 573 1573 546 535 545 1576 543 539 541 540 550 1571 548 532 548 1573 546 535 545 1576 543 539 541 1579 550 1571 548 533 547 1574 545 536 544 1576 543 1578 541 540 550 1570 549 533 547 534 546 536 544 537 543 539 541 540 550 1570 549 532 548 1572 547 1573 546 1574 545 1576 543 26528 8492 4208 648 1475 572 534 546 1575 544 537 543 539 541 1580 549 532 548 1573 546 535 545 1576 543 538 542 1579 550 1571 548 533 547 1575 544 537 543 1577 542 1579 550 532 548 1573 546 535 545 537 543 539 541 541 549 532 548 533 547 1575 544 537 543 1578 541 1579 550 1571 548 1573 546 26523 8496 4203 622 1499 569 537 543 1578 541 541 549 532 548 1572 547 534 546 1574 545 537 543 1578 541 540 550 1570 549 1571 548 534 546 1575 544 538 542 1578 541 1580 549 532 548 1573 546 536 544 538 542 540 550 532 548 533 547 535 545 1576 543 539 541 1579 550 1571 548 1573 546 1574 545 26521 8498 4201 572 1573 546 536 544 1577 542 540 550 531 549 1571 548 533 547 1573 546 536 544 1576 543 539 541 1579 550 1570 549 532 548 1573 546 535 545 1576 543 1578 541 540 550 1571 548 533 547 535 545 537 543 538 542 540 550 531 549 1572 547 534 546 1575 544 1576 543 1577 542 1579 550 26522 8498 4203 570 1575 544 538 542 1579 550 532 548 533 547 1575 544 537 543 1578 541 540 550 1570 549 533 547 1573 546 1575 544 537 543 1578 541 540 550 1571 548 1573 546 536 544 1578 551 531 549 533 547 535 545 537 543 539 541 540 550 1571 548 533 547 1575 544 1576 543 1578 541 1580 549 26521 8498 4203 570 1576 543 538 542 1580 549 532 548 533 547 1574 545 536 544 1577 542 540 550 1570 549 533 547 1573 546 1575 544 538 542 1579 550 531 549 1571 548 1573 546 536 544 1576 543 539 551 531 549 532 548 534 546 536 544 538 542 1579 550 531 549 1572 547 1573 546 1574 545 1576 543 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8500 4203 653 1468 569 538 542 1579 550 532 548 534 546 1575 544 536 544 1578 541 540 550 1572 547 534 546 1575 544 1577 542 539 541 1580 550 532 548 534 546 535 545 1576 543 1577 542 1579 551 532 548 534 546 536 544 1577 542 1578 552 531 549 533 547 534 546 1574 545 1575 544 1577 542 26533 8492 4211 573 1573 546 535 545 1576 543 539 551 530 550 1571 548 533 547 1574 545 536 544 1577 542 540 550 1570 549 1572 547 534 546 1576 543 539 541 541 549 532 548 1573 546 1574 545 1576 543 539 551 531 549 533 547 1573 546 1576 543 539 541 541 549 532 548 1573 546 1574 545 1576 543 26532 8493 4209 575 1571 548 533 547 1575 544 537 543 539 541 1580 550 531 549 1572 547 534 546 1576 543 538 542 1579 551 1570 549 532 548 1574 545 537 543 538 542 540 550 1570 549 1572 547 1575 544 537 543 539 541 540 550 1571 548 1573 546 536 544 538 542 539 551 1570 549 1572 547 1574 545 26530 8496 4207 567 1579 551 531 549 1572 547 535 545 536 544 1576 543 538 542 1579 551 530 550 1571 548 534 546 1574 545 1576 543 538 542 1579 551 532 548 533 547 534 546 1576 543 1577 542 1579 551 532 548 534 546 535 545 1576 543 1578 541 540 550 532 548 533 547 1574 545 1575 544 1577 542 26531 8495 4210 574 1571 548 534 546 1575 544 538 542 539 551 1569 550 531 549 1572 547 535 545 1576 543 539 541 1579 550 1571 548 534 546 1575 544 538 542 540 550 531 549 1572 547 1549 570 1551 568 539 551 531 549 532 548 1573 546 1550 569 538 542 540 550 531 549 1571 548 1548 571 1550 569 -# +# name: POWER type: parsed protocol: NECext address: 00 EF 00 00 command: 1C E3 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 00 EF 00 00 command: 00 FF 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 00 EF 00 00 command: 04 FB 00 00 -# +# name: POWER type: parsed protocol: NEC42 address: 6E 00 00 00 command: 00 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC42 address: 6E 00 00 00 command: 4D 00 00 00 -# +# name: VOL- type: parsed protocol: NEC42 address: 6E 00 00 00 command: 4E 00 00 00 -# +# name: POWER type: parsed protocol: NEC42 address: 6E 00 00 00 command: 0E 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8441 4184 542 1562 541 1562 542 511 546 506 540 511 546 1557 546 506 540 1563 541 1563 540 1563 541 512 545 507 539 512 545 507 539 512 545 507 539 22605 538 1565 539 1565 538 514 543 509 537 514 543 1560 543 509 548 1555 548 1556 548 1556 547 504 542 510 547 505 541 510 547 505 541 510 547 22597 546 1559 544 1559 545 507 539 513 544 507 539 1564 539 513 544 1559 544 1559 545 545 508 549 513 508 538 513 544 508 538 513 544 22601 542 1562 542 1561 543 510 547 505 541 510 547 1557 547 505 541 1562 542 1562 542 1562 542 510 547 505 541 510 547 505 541 511 546 505 541 22603 540 1564 539 1565 538 513 544 508 538 513 544 1560 544 508 538 1565 538 1565 538 1566 537 514 543 509 548 504 542 509 548 504 542 509 548 22597 546 1558 546 1558 546 506 540 512 545 507 539 1564 540 512 545 1559 545 1559 544 1559 544 507 539 513 544 508 538 513 544 508 538 513 544 22600 543 1561 542 1562 542 510 547 505 541 510 547 1557 547 505 541 1562 541 1563 540 1563 541 511 546 506 540 511 546 506 540 511 546 506 540 22604 539 1565 538 1566 537 514 543 509 548 504 542 1561 543 509 548 1556 548 1556 548 1556 547 504 542 510 547 505 541 510 547 505 541 510 547 22598 545 1559 544 1559 545 507 539 512 545 507 539 1564 540 512 545 1559 544 1559 545 1559 545 508 538 513 544 508 538 513 544 508 538 513 544 22601 542 1562 542 1562 542 511 546 505 541 511 546 1557 546 506 540 1563 541 1563 540 1563 541 511 546 506 540 511 546 506 540 512 545 506 540 22604 539 1565 538 1566 537 514 543 509 548 504 542 1561 543 509 548 1556 547 1556 547 1556 548 504 542 510 547 505 541 510 547 505 541 510 547 -# +# name: POWER type: parsed protocol: SIRC address: 10 00 00 00 command: 60 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 08 00 00 00 command: 0E 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 08 00 00 00 command: 1A 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 00 00 00 00 command: 57 00 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 06 F9 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 47 B8 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 41 BE 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 04 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 05 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 02 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 03 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 00 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 19 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 16 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 44 00 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 12 36 00 00 +command: 0A F5 00 00 # +name: VOL- +type: parsed +protocol: NECext +address: 12 36 00 00 +command: 0B F4 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 12 36 00 00 +command: 09 F6 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 12 36 00 00 +command: 01 FE 00 00 +# diff --git a/assets/resources/infrared/assets/fans.ir b/assets/resources/infrared/assets/fans.ir index 0fae27154..83c37d275 100644 --- a/assets/resources/infrared/assets/fans.ir +++ b/assets/resources/infrared/assets/fans.ir @@ -1,757 +1,788 @@ Filetype: IR library file Version: 1 -# Last Updated 7th Sep, 2022 -# +# Last Updated 22th Sept, 2022 +# +# TIMER UP +name: TIMER +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 07 00 00 00 +# +name: SPEED+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1367 345 1338 347 491 1170 1361 349 1334 350 488 1198 489 1198 488 1199 488 1199 487 1200 1334 352 486 7953 1333 353 1332 353 486 1200 1333 353 1332 353 486 1200 486 1201 486 1200 486 1200 487 1201 1332 353 486 7953 1332 353 1333 353 485 1201 1332 353 1332 353 485 1201 485 1201 485 1201 486 1200 486 1200 1333 353 486 7953 1333 353 1332 354 485 1201 1332 353 1332 353 485 1201 486 1201 485 1201 485 1201 486 1201 1332 354 484 7954 1332 353 1332 353 485 1201 1332 354 1331 354 485 1201 485 1201 486 1201 486 1201 486 1201 1333 354 484 7954 1332 354 1331 354 485 1201 1332 355 1331 354 484 1201 485 1201 486 1202 485 1201 486 1201 1331 355 484 7953 1332 354 1331 354 484 1201 1332 355 1330 355 483 1202 484 1201 486 1201 485 1202 484 1202 1331 355 484 7954 1331 354 1331 354 484 1202 1331 355 1330 354 484 1202 485 1201 485 1202 484 1202 485 1202 1330 355 484 +# +name: TIMER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1367 335 1349 346 492 1166 1365 346 1338 347 491 1170 516 1172 514 1173 1359 349 489 1197 489 1198 488 7950 1334 352 1332 352 486 1200 1333 352 1333 352 486 1200 486 1200 486 1200 1333 352 486 1200 486 1200 487 7953 1332 352 1333 353 485 1200 1333 353 1332 353 485 1200 486 1200 486 1200 1333 353 485 1200 486 1200 487 7951 1333 353 1332 352 486 1200 1333 353 1332 353 486 1200 486 1200 486 1200 1333 353 486 1200 486 1200 486 7952 1333 352 1333 353 485 1200 1333 353 1332 353 486 1200 486 1200 486 1200 1333 353 485 1200 486 1200 486 7952 1332 353 1332 353 485 1200 1333 353 1331 353 485 1200 486 1201 485 1201 1332 353 485 1201 485 1201 486 7952 1331 353 1332 354 484 1201 1332 354 1331 354 484 1201 485 1202 484 1201 1332 354 484 1202 484 1202 485 +# +name: ROTATE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1337 374 1311 374 464 1194 1339 373 1340 345 493 1165 521 1165 1365 347 492 1167 519 1168 518 1168 518 7920 1363 347 1336 349 489 1197 1334 352 1333 353 485 1200 486 1200 1333 352 486 1200 486 1200 486 1200 486 +# name: POWER type: parsed protocol: NECext address: BA F0 00 00 command: 03 FC 00 00 -# +# name: SPEED+ type: parsed protocol: NECext address: BA F0 00 00 command: 50 AF 00 00 -# +# name: SPEED- type: parsed protocol: NECext address: BA F0 00 00 command: 41 BE 00 00 -# +# name: TIMER type: parsed protocol: NECext address: BA F0 00 00 command: 40 BF 00 00 -# +# name: POWER type: parsed protocol: NECext address: BA F0 00 00 command: 53 AC 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9069 4477 591 1695 622 528 625 525 618 505 617 532 621 527 626 497 625 525 618 532 621 1661 615 1640 595 1688 599 1684 613 1643 592 1691 626 1656 620 1636 620 1663 624 526 617 505 628 523 620 529 624 525 618 504 618 531 622 527 616 1643 623 1662 625 1658 618 1637 598 1685 622 1659 627 1655 570 1685 622 528 625 523 620 502 620 529 624 524 619 503 588 561 623 526 617 1667 619 1639 627 1654 622 1660 616 1638 617 1664 622 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9014 4522 597 1687 610 512 590 559 594 555 619 503 599 550 593 556 597 551 613 509 593 1688 588 1692 615 1639 596 1684 592 1689 587 1666 590 1691 595 1685 591 1689 566 1689 597 551 592 557 638 485 596 553 590 558 595 527 595 554 589 559 594 1686 611 1643 592 1688 588 1692 646 1607 597 1684 592 1688 619 1634 591 558 595 553 590 532 590 558 595 553 590 559 615 506 596 553 590 1693 594 1685 571 1683 593 1686 590 1690 565 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 9066 4476 623 1662 625 525 618 504 587 561 623 526 617 531 622 501 621 528 625 524 619 1661 564 1692 625 1655 621 1660 565 1690 627 1654 622 1659 586 1668 618 1663 623 1657 619 1636 620 529 624 524 619 502 620 529 624 524 619 529 614 509 624 525 618 1663 613 1640 626 1655 621 1659 617 1637 619 1662 625 1656 620 1633 623 527 626 523 620 529 614 508 625 524 619 530 623 499 593 557 617 1663 623 1657 619 1635 621 1660 616 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9038 4530 589 1665 590 559 594 555 598 551 613 510 592 558 595 553 590 532 590 559 594 1686 590 1690 617 1637 598 1683 593 1687 620 1634 591 1691 595 1685 622 1632 593 557 596 1684 592 530 592 557 596 552 591 558 616 506 596 553 590 1690 596 526 596 1684 592 1688 588 1692 563 1690 596 1684 592 1687 620 503 589 1691 595 553 621 501 591 558 595 553 590 532 590 558 595 1689 597 551 623 1630 595 1686 590 1689 587 1666 589 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4609 4601 539 1515 545 1511 539 1518 542 1514 546 1510 540 1517 543 2559 541 1515 545 1511 539 2563 537 1519 541 2561 539 1516 544 1512 548 2554 546 1510 540 1515 4604 4605 545 1509 541 1515 545 1538 512 1518 542 1514 546 1511 539 2563 537 1519 541 1515 545 2557 543 1513 547 2555 545 1510 540 1516 544 2559 541 1514 546 13748 9234 2298 545 52033 9228 2304 539 52041 9230 2303 540 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4605 4603 547 1508 541 1515 545 1511 539 1518 542 1514 546 1511 539 2562 538 1518 542 1515 545 1511 538 2564 547 1509 541 1517 543 1513 547 2555 545 2556 544 1512 4607 4603 547 1508 542 1515 545 1511 539 1518 542 1514 546 1511 538 2564 546 1510 539 1517 543 1514 546 2557 543 1513 547 1510 540 1517 543 2559 541 2561 539 13755 9237 2297 546 52031 9229 2306 547 52033 9237 2297 546 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4608 4604 546 1509 541 1516 544 1513 547 1509 540 1516 544 1513 547 2555 545 1512 537 2565 545 1511 539 1518 542 2561 539 1516 544 1513 547 1510 539 2563 537 1517 4612 4599 541 1514 546 1511 539 1518 542 1514 546 1511 539 1518 542 2561 539 1518 542 2561 539 1517 543 1514 546 2557 543 1513 547 1510 540 1516 544 2559 541 13755 9237 2298 545 52044 9237 2298 545 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4606 4604 546 1509 541 1516 544 1512 548 1509 541 1516 544 1512 548 2554 546 1510 540 1517 543 2559 541 1515 545 2557 543 2558 542 1514 546 1511 539 1517 543 1512 4607 4601 539 1516 544 1513 547 1509 541 1516 544 1512 548 1508 542 2561 539 1516 544 1513 547 2555 545 1511 538 2589 522 2555 545 1511 539 1518 542 1515 545 13389 9233 2301 542 51673 9227 2306 547 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1273 401 1272 426 416 1232 1273 427 1247 426 405 1242 442 1231 442 1231 1274 426 405 1242 431 1242 431 7968 1274 400 1273 426 416 1232 1273 426 1247 426 405 1241 432 1241 432 1241 1275 425 406 1267 406 1240 433 7967 1275 398 1275 424 407 1240 1276 424 1249 424 407 1239 434 1238 435 1238 1278 422 409 1237 436 1237 436 7963 1279 394 1279 420 411 1262 1243 430 1243 430 412 1234 439 1234 439 1233 1272 428 414 1232 441 1232 441 7958 1273 426 1248 426 405 1241 1275 426 1248 425 406 1266 407 1240 433 1240 1276 424 407 1265 408 1238 435 7965 1277 422 1251 423 408 1238 1278 423 1250 423 408 1264 409 1238 435 1264 1251 422 409 1264 409 1237 436 7964 1278 422 1251 422 409 1264 1251 422 1251 422 409 1263 410 1262 411 1262 1254 420 411 1262 411 1235 438 7961 1270 429 1244 429 413 1260 1245 428 1245 427 415 1258 415 1231 432 1241 1274 425 406 1267 406 1240 433 7965 1277 423 1250 423 408 1265 1250 423 1250 423 408 1264 409 1237 436 1237 1278 421 410 1262 411 1262 411 7961 1270 429 1244 429 413 1260 1245 429 1244 429 413 1260 413 1233 440 1259 1246 427 415 1259 414 1258 415 7959 1272 427 1246 427 415 1259 1246 427 1246 427 415 1257 406 1267 406 1241 1274 425 406 1266 407 1266 407 7965 1277 422 1251 422 409 1264 1251 421 1252 421 410 1262 411 1261 412 1235 1270 429 413 1260 413 1233 440 7958 1273 426 1247 425 406 1267 1249 425 1248 424 407 1266 407 1265 408 1265 1250 423 408 1264 409 1263 410 7962 1280 420 1253 420 411 1261 1244 430 1243 429 413 1259 414 1232 441 1231 1274 427 415 1257 406 1240 433 7965 1277 423 1250 423 408 1264 1251 422 1251 422 409 1262 411 1235 438 1235 1280 420 411 1260 413 1232 441 7957 1274 426 1247 425 406 1266 1250 425 1248 424 407 1265 408 1238 435 1264 1251 423 408 1263 410 1236 437 -# +# Osc +name: ROTATE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1338 374 1311 374 464 1194 1339 374 1311 374 464 1194 492 1194 492 1194 520 1165 1368 346 492 1167 519 7918 1364 347 1337 348 490 1195 1336 351 1333 352 486 1200 486 1201 485 1201 486 1201 1332 353 485 1201 485 7952 1332 353 1332 353 485 1200 1333 353 1332 353 485 1201 485 1201 485 1201 485 1201 1332 354 485 1201 485 7954 1331 354 1331 354 485 1201 1332 354 1331 354 485 1201 485 1202 485 1202 485 1202 1331 354 485 1201 485 7954 1331 354 1331 354 484 1202 1331 355 1330 355 483 1202 484 1203 483 1203 484 1203 1330 355 484 1203 483 +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1280 394 1280 420 411 1236 1269 430 1254 419 412 1235 438 1234 439 1233 440 1233 440 1233 1272 427 415 8311 1279 395 1278 420 411 1236 1269 430 1243 430 412 1234 439 1234 439 1233 440 1233 440 1233 1272 427 415 8312 1277 396 1277 422 409 1264 1252 421 1252 421 410 1236 437 1235 438 1233 440 1259 414 1259 1246 427 415 8312 1277 422 1251 423 408 1264 1251 423 1250 423 408 1238 435 1237 436 1237 436 1263 410 1237 1278 421 410 8315 1274 425 1248 425 406 1240 1276 424 1249 424 407 1265 408 1238 435 1264 409 1237 436 1237 1279 421 410 8318 1271 402 1271 428 414 1233 1272 427 1246 427 415 1231 432 1241 432 1240 433 1240 433 1240 1276 424 407 8319 1271 429 1245 428 414 1233 1272 428 1245 427 415 1231 442 1231 432 1240 433 1240 433 1239 1277 423 408 8318 1271 401 1272 427 415 1232 1273 427 1246 426 405 1267 406 1240 433 1239 434 1238 435 1238 1278 422 409 8317 1272 401 1272 426 405 1242 1274 426 1248 425 406 1240 433 1239 434 1238 435 1238 435 1238 1278 421 410 8317 1272 401 1272 426 405 1242 1274 425 1249 425 406 1240 434 1239 434 1238 435 1238 435 1238 1278 421 410 8316 1273 400 1273 426 405 1241 1275 425 1248 425 406 1239 434 1239 434 1238 435 1238 435 1238 1278 421 410 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1341 395 1311 395 455 1220 1341 395 1311 396 454 1248 456 1248 457 1248 456 1247 457 1247 457 1247 1338 7184 1335 399 1307 399 450 1254 1307 399 1307 400 449 1255 450 1255 450 1254 450 1254 450 1254 450 1254 1307 8332 1306 401 1306 400 449 1256 1306 400 1306 401 449 1255 450 1255 449 1255 449 1255 449 1255 449 1255 1306 7214 1306 400 1307 400 450 1255 1306 400 1306 400 450 1255 449 1255 449 1255 449 1255 449 1255 449 1256 1306 8333 1306 401 1307 401 449 1256 1307 402 1306 402 448 1256 449 1256 448 1256 448 1256 448 1256 448 1256 1307 7215 1305 401 1306 402 448 1256 1306 402 1305 402 448 1257 447 1257 447 1257 447 1256 448 1256 448 1257 1305 8333 1304 402 1305 402 448 1257 1304 402 1304 403 447 1257 447 1257 448 1257 447 1257 447 1257 447 1257 1304 7216 1304 403 1303 403 446 1257 1304 403 1304 403 446 1258 447 1258 446 1257 447 1257 447 1258 447 1257 1304 8334 1304 402 1305 403 446 1257 1304 403 1303 403 447 1258 446 1257 448 1258 446 1258 446 1258 446 1258 1303 7217 1303 404 1303 404 445 1259 1302 404 1302 428 421 1259 446 1283 421 1259 445 1283 421 1283 421 1284 1278 8361 1277 429 1278 429 420 1284 1278 429 1277 429 420 1284 420 1284 420 1284 420 1284 420 1284 419 1285 1277 7243 1277 429 1277 429 421 1284 1277 429 1277 429 420 1284 420 1284 420 1284 420 1284 420 1284 420 1284 1277 8361 1277 430 1276 430 420 1285 1276 430 1277 430 419 1285 419 1285 419 1285 420 1284 420 1285 420 1285 1276 7244 1276 431 1276 430 419 1286 1276 430 1276 431 418 1286 418 1286 418 1286 418 1286 418 1285 419 1285 1276 8363 1275 431 1276 431 418 1286 1275 431 1276 432 417 1286 418 1286 418 1286 418 1286 419 1286 418 1286 1275 7246 1275 432 1275 432 417 1288 1274 457 1249 457 392 1312 392 1312 392 1289 415 1312 392 1312 392 1313 1249 8390 1248 458 1249 458 391 1313 1249 458 1248 458 391 1313 391 1314 390 1313 391 1314 390 1314 390 1314 1248 7273 1247 459 1223 484 390 1315 1247 460 1222 510 339 1365 364 1315 365 1339 390 1315 388 1341 339 1340 1222 8415 1222 484 1222 510 339 1365 1197 510 1197 510 339 1365 340 1365 339 1365 339 1365 339 1365 339 1365 1197 7324 1196 511 1196 511 338 1366 1196 511 1195 511 338 1366 338 1367 337 1367 337 1367 337 1367 337 1367 1195 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1341 368 1338 392 457 1219 1370 364 1341 364 485 1190 540 1164 513 1190 513 1191 512 1194 1365 366 481 8031 1338 370 1336 371 477 1226 1335 371 1335 371 477 1226 477 1226 477 1226 477 1226 477 1226 1334 371 477 9153 1334 371 1334 371 477 1226 1334 371 1335 371 477 1227 476 1227 476 1227 476 1227 476 1227 1334 372 476 8036 1334 372 1333 372 476 1227 1333 372 1333 372 476 1227 476 1227 476 1227 476 1227 476 1227 1334 373 475 9154 1334 373 1333 373 475 1228 1332 373 1332 373 475 1229 475 1228 475 1229 474 1229 474 1229 1331 374 474 8038 1331 374 1332 374 474 1229 1331 374 1331 398 450 1253 450 1253 450 1253 450 1253 450 1253 1307 398 450 9179 1307 398 1307 398 450 1253 1307 399 1306 398 450 1254 449 1254 449 1253 450 1254 449 1254 1306 398 450 8063 1306 398 1307 399 449 1254 1306 399 1306 399 449 1254 449 1254 449 1254 449 1254 449 1254 1307 399 449 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1372 339 1369 363 486 1190 1374 363 1344 363 486 1190 515 1191 513 1191 513 1192 1370 365 483 1220 484 8036 1339 371 1337 371 478 1227 1337 371 1337 371 478 1227 478 1227 478 1227 478 1227 1336 371 478 1227 478 9159 1336 372 1336 371 478 1227 1336 371 1336 372 477 1227 478 1227 477 1227 477 1227 1336 372 477 1228 477 8041 1335 372 1335 372 477 1227 1336 372 1335 372 477 1228 477 1228 477 1228 477 1228 1335 373 476 1228 477 9160 1335 373 1334 373 476 1228 1335 373 1334 373 476 1229 475 1229 476 1229 475 1229 1334 374 475 1229 475 8042 1334 375 1331 398 451 1230 1333 398 1309 398 451 1254 450 1254 451 1253 451 1253 1308 398 450 1254 450 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1342 366 1370 339 511 1191 1373 364 1343 364 511 1165 540 1165 514 1192 1371 364 484 1219 485 1220 484 8036 1339 370 1337 371 478 1227 1336 371 1336 371 478 1227 478 1227 478 1227 1336 372 477 1227 478 1227 478 9162 1336 372 1335 372 477 1228 1335 372 1335 373 476 1228 477 1228 477 1228 1336 372 477 1228 477 1228 476 8044 1336 372 1335 373 476 1228 1335 398 1309 398 451 1254 451 1254 451 1255 1308 400 449 1255 450 1256 449 9188 1306 403 1304 428 421 1260 1303 428 1279 429 419 1284 421 1284 420 1284 1279 429 420 1285 420 1284 420 8099 1276 457 1250 457 391 1313 1225 483 1224 484 364 1338 366 1338 392 1313 1225 484 364 1339 366 1339 390 9244 1225 509 1198 510 338 1366 1197 510 1197 537 311 1367 338 1393 311 1394 1169 591 256 11618 1170 539 1168 565 282 1395 1169 565 1142 538 310 1341 365 1312 419 1259 1305 400 449 1254 450 1255 449 9186 1307 400 1306 400 448 1255 1307 399 1307 400 448 1255 449 1255 449 1255 1307 400 448 1255 449 1255 449 8068 1306 400 1306 400 448 1256 1306 400 1306 401 447 1256 448 1256 448 1256 1306 401 447 1256 448 1257 447 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 170 535 1281 413 1276 418 436 1259 1275 423 1276 444 410 1258 431 1264 435 1260 439 1256 433 1262 437 1258 1276 6529 173 475 1280 414 1275 419 435 1260 1274 450 1249 419 435 1259 430 1265 434 1261 438 1257 432 1263 436 1259 1275 7177 1280 414 1275 445 410 1260 1274 450 1249 445 410 1259 430 1266 433 1262 437 1258 431 1264 435 1260 1274 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1280 415 1274 447 407 1288 1256 442 1247 448 406 1288 411 1284 405 1291 408 1287 412 1283 1251 444 411 8009 1282 413 1276 445 409 1286 1248 450 1249 446 408 1286 403 1292 407 1262 437 1285 404 1291 1253 442 413 8007 1274 446 1253 442 402 1292 1252 447 1252 442 402 1292 407 1288 411 1284 405 1264 435 1286 1248 447 407 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1278 444 1255 439 405 1289 1255 444 1255 439 405 1290 409 1259 1275 447 407 1288 411 1257 432 1263 436 8009 1282 440 1249 446 408 1286 1248 451 1248 446 408 1286 413 1256 1278 444 410 1284 405 1264 435 1261 438 8008 1283 439 1250 444 410 1284 1250 450 1249 445 409 1284 405 1265 1279 442 412 1282 407 1262 437 1258 431 8015 1276 445 1254 440 404 1292 1252 446 1253 441 403 1292 407 1288 1256 439 405 1290 409 1286 403 1292 407 8012 1279 416 1273 448 406 1289 1255 443 1246 449 405 1289 410 1285 1249 446 408 1287 412 1283 406 1289 410 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1278 417 1282 439 405 1290 1254 444 1255 439 405 1289 410 1285 404 1292 1252 442 412 1283 406 1289 410 8010 1280 414 1275 446 408 1287 1247 451 1248 446 408 1286 413 1282 407 1263 1281 440 404 1291 408 1261 438 8007 1273 421 1278 443 411 1284 1249 449 1250 444 410 1258 431 1291 408 1288 1256 439 405 1289 410 1286 403 8017 1273 421 1278 443 411 1284 1249 449 1250 444 410 1285 404 1291 408 1262 1282 440 404 1264 435 1260 439 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1282 413 1276 445 409 1260 1274 450 1249 445 410 1259 430 1265 434 1261 438 1258 1276 445 409 1285 404 8017 1274 420 1279 442 412 1283 1251 448 1251 443 411 1283 406 1290 409 1260 439 1256 1278 443 411 1284 405 8015 1276 418 1281 440 404 1291 1253 446 1253 440 404 1291 408 1287 412 1283 406 1263 1281 440 404 1291 408 8011 1280 414 1275 446 408 1287 1247 452 1247 447 407 1261 438 1283 406 1289 410 1259 1275 447 407 1287 412 8006 1275 446 1253 441 403 1292 1252 447 1252 442 402 1292 407 1288 411 1284 405 1291 1253 442 402 1292 407 -# +# name: POWER type: parsed protocol: NEC address: 30 00 00 00 command: 97 00 00 00 -# +# name: MODE type: parsed protocol: NEC address: 30 00 00 00 command: 87 00 00 00 -# +# name: SPEED+ type: parsed protocol: NEC address: 30 00 00 00 command: 86 00 00 00 -# +# name: TIMER type: parsed protocol: NEC address: 30 00 00 00 command: 9C 00 00 00 -# +# name: ROTATE type: parsed protocol: NEC address: 30 00 00 00 command: 95 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 00 00 00 00 command: 45 00 00 00 -# +# name: SPEED+ type: parsed protocol: NEC address: 00 00 00 00 command: 47 00 00 00 -# +# name: TIMER type: parsed protocol: NEC address: 00 00 00 00 command: 19 00 00 00 -# +# name: ROTATE type: parsed protocol: NEC address: 00 00 00 00 command: 1C 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2229 716 749 747 728 715 750 720 756 714 751 719 757 1447 751 719 756 714 751 1453 755 742 723 747 729 742 754 716 749 721 754 715 729 741 724 1454 754 1450 758 1445 753 1451 757 714 751 50967 2228 717 748 1455 753 51028 2198 746 730 1449 749 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 2225 719 756 741 724 720 755 715 750 720 755 716 749 1456 752 719 746 726 749 1456 731 741 755 1451 757 714 751 1455 753 718 757 1448 750 1456 752 720 755 715 750 721 754 1452 756 1449 759 51509 2201 743 732 1473 756 51069 2202 717 758 1448 750 -# +# name: SPEED- type: raw frequency: 38000 duty_cycle: 0.330000 data: 2234 712 752 743 732 713 751 720 755 716 749 722 753 1453 754 716 759 712 752 1453 754 718 757 1449 758 713 751 1455 752 1454 753 718 757 741 723 748 727 745 730 1449 758 739 725 1455 752 51252 2234 713 751 1454 753 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2229 714 750 747 727 717 757 713 751 719 755 715 749 1455 751 719 755 715 749 1455 751 1453 753 717 757 714 750 1454 752 718 756 714 750 746 728 742 722 722 752 1452 754 716 758 1445 751 50982 2229 716 727 1479 748 51048 2205 712 752 1450 756 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2258 688 781 718 751 694 775 696 784 687 782 690 779 1427 782 690 779 693 776 1431 778 721 748 724 756 716 753 719 750 722 747 725 744 727 773 1407 781 1426 783 1425 774 1433 776 696 773 51015 2224 748 721 1458 783 51084 2249 697 783 1425 784 51089 2253 694 775 1432 756 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2212 836 751 1591 749 825 752 817 750 1577 753 806 750 804 752 796 750 857 751 828 749 825 752 816 751 813 743 816 751 803 743 805 752 102392 2214 834 743 1599 751 823 744 825 752 1575 745 840 727 801 745 804 752 854 744 835 752 822 745 824 743 821 746 813 743 810 746 802 744 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2214 838 748 1596 751 824 751 819 746 1584 753 807 747 807 747 803 751 857 750 830 745 830 745 825 750 814 751 810 745 1574 752 798 746 101740 2213 838 748 1597 750 824 751 819 746 1583 754 806 748 807 747 802 752 856 751 830 745 829 746 824 751 814 751 809 745 1574 753 797 747 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 2216 836 750 1594 754 821 754 816 749 1580 747 813 752 803 751 798 746 1626 753 827 748 1591 746 824 751 1578 749 811 754 1566 750 799 745 99411 2218 833 753 1591 746 829 746 823 752 1577 749 810 755 800 754 795 749 1623 745 835 751 1588 749 821 754 1574 752 807 747 1572 755 795 749 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2219 732 750 729 753 722 749 1384 755 1374 755 705 746 708 753 697 754 754 749 731 751 723 749 721 750 715 746 713 748 1370 749 701 749 99627 2216 735 747 732 750 725 747 1387 753 1376 753 706 755 700 751 698 753 755 748 732 750 725 747 722 749 716 745 714 747 1372 747 702 749 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2215 735 746 730 751 722 749 1383 745 1381 747 711 749 704 746 702 748 1422 748 730 751 722 749 720 751 712 748 1373 745 1372 746 702 748 102284 2218 732 749 729 752 720 751 1380 748 1378 750 709 751 701 749 700 750 1420 750 728 753 719 752 717 754 709 752 1370 748 1369 749 699 751 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 2221 729 752 725 746 727 754 1377 751 1375 753 706 755 699 751 697 753 753 749 729 752 1384 755 1377 751 713 747 711 749 1367 751 1361 746 101691 2216 734 747 731 750 723 748 1383 745 1381 747 711 749 705 745 703 747 759 754 725 746 1390 749 1383 756 708 752 706 754 1362 745 1366 752 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2220 831 751 1618 729 820 751 818 753 1575 751 835 726 829 721 802 748 885 728 851 720 854 728 815 756 809 752 807 754 1565 750 825 725 101743 2220 830 752 1618 729 819 752 844 727 1574 752 835 726 802 748 801 749 884 729 850 721 827 755 815 746 845 726 806 755 1590 725 798 752 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 2218 857 725 1592 754 846 725 844 727 1574 752 834 727 827 723 826 724 883 720 1597 750 851 720 1586 750 840 721 1577 749 831 730 1557 748 99247 2221 854 728 1590 746 854 728 841 720 1583 753 832 729 825 725 824 726 881 722 1596 751 849 722 1585 751 839 722 1576 750 831 719 1568 747 -# +# name: SPEED- type: raw frequency: 38000 duty_cycle: 0.330000 data: 2217 832 750 1594 753 821 750 819 752 1576 750 809 804 750 800 748 750 1622 756 1587 749 1589 747 1586 750 1578 748 1575 751 1568 747 802 748 101181 2218 831 751 1592 755 819 752 817 754 1574 752 808 753 801 749 800 751 1620 748 1596 751 1587 749 1584 752 1576 750 1574 752 1566 749 800 803 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2274 662 756 711 749 718 752 715 797 669 801 1399 749 718 783 684 797 670 800 1400 748 720 750 716 754 713 747 720 750 718 752 714 777 718 752 1448 752 714 756 711 749 1450 750 1423 777 51569 2192 718 752 1447 753 50954 2223 712 748 1423 798 50911 2245 661 746 1451 749 50917 2218 715 755 1415 754 50965 2191 716 754 1445 755 50923 2223 710 750 1421 800 50893 2190 717 753 1445 776 50902 2242 664 796 1402 777 50907 2217 717 753 1418 803 50880 2223 710 750 1421 800 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2225 712 747 719 751 716 754 713 757 711 748 1451 748 718 752 715 754 712 747 1451 748 718 752 716 754 1445 754 1444 724 1449 750 716 754 713 746 1453 746 720 749 1450 749 1451 727 1446 753 50693 2219 717 752 1445 754 50927 2194 714 756 1442 747 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2216 733 744 734 754 1382 751 1381 752 712 744 714 753 700 746 702 754 753 745 733 755 719 748 720 747 717 750 709 747 706 750 1361 751 99476 2211 738 749 729 748 1389 754 1377 745 718 748 710 746 707 749 699 747 760 748 730 747 726 751 718 748 715 752 706 750 703 753 1359 753 49283 2217 670 745 1350 751 50661 2212 676 749 1345 746 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2213 737 751 727 750 1387 746 1385 748 716 751 707 749 704 752 696 750 1420 754 724 753 720 747 721 746 718 749 1373 749 1367 745 703 753 102141 2215 735 753 726 751 1385 747 1384 748 715 752 706 750 704 752 695 751 1419 755 723 754 720 747 721 746 718 749 1399 723 1367 755 693 753 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 33 2223 753 725 720 748 750 728 743 725 746 722 1458 750 749 750 722 726 747 721 1460 748 724 755 744 724 721 747 724 754 744 724 747 752 720 748 1458 750 722 756 715 753 718 750 1456 752 51488 2221 727 721 1460 748 51156 2203 744 724 1456 752 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 33 2225 718 750 719 749 721 747 722 746 723 745 1458 750 720 748 722 726 744 724 1452 756 741 727 742 726 1451 746 1457 750 1454 754 716 752 717 720 1483 725 745 723 1454 754 1450 747 1456 752 50811 2199 744 745 1433 754 51049 2229 715 743 1435 752 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 2221 721 727 1450 779 1452 756 714 744 1487 721 723 756 714 754 715 774 774 726 1505 724 772 748 1482 726 770 751 1454 754 1477 721 1484 745 101867 2197 745 723 1453 776 1455 722 748 720 1483 756 713 755 714 744 725 775 774 726 1478 751 771 729 1475 754 769 720 1483 756 1448 750 1481 727 50476 2201 714 755 1448 781 50602 2221 720 748 1454 775 50604 2250 743 694 1456 773 50628 2226 715 743 1433 775 50652 2191 748 720 1430 778 -# +# name: SPEED- type: raw frequency: 38000 duty_cycle: 0.330000 data: 2193 750 729 1421 777 1454 754 715 753 1478 751 719 728 715 753 716 773 1510 729 1501 728 1477 752 1505 755 1475 754 1477 721 749 751 772 696 102110 2246 748 720 1455 774 1430 747 723 746 1484 724 745 723 720 748 721 779 1477 752 1478 751 1480 749 1508 752 1478 751 1479 729 741 748 748 721 50743 2195 747 721 1454 775 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 2247 750 729 1447 782 1450 748 722 726 1506 723 720 748 722 757 713 776 772 728 769 751 1505 755 1476 753 1452 756 740 749 747 753 1452 756 101517 2220 749 719 1457 772 1433 754 715 753 1478 719 750 729 715 753 716 773 776 724 772 748 1508 752 1479 750 1481 727 769 731 739 750 1454 754 50114 2228 742 726 1450 779 50645 2197 746 722 1454 775 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1275 434 1253 430 408 1275 1251 431 1257 427 411 1272 415 1241 436 1248 439 1244 433 1250 437 1247 1279 7142 1276 433 1255 428 410 1247 1279 430 1247 435 414 1269 408 1249 438 1272 415 1241 436 1248 439 1244 1282 8244 1274 434 1253 429 409 1274 1252 430 1247 435 414 1242 435 1275 412 1270 407 1277 411 1246 441 1242 1274 7146 1282 426 1251 431 407 1276 1250 432 1255 426 412 1271 406 1276 411 1272 415 1242 435 1248 439 1244 1282 8243 1275 433 1255 428 410 1272 1254 429 1248 434 415 1267 410 1273 414 1269 408 1275 412 1245 432 1251 1275 7144 1273 435 1252 430 408 1274 1252 430 1247 436 413 1269 408 1249 438 1245 442 1267 410 1274 413 1270 1256 8241 1277 431 1257 425 413 1270 1256 425 1252 430 408 1275 412 1270 407 1276 411 1246 441 1267 410 1247 1279 7140 1277 431 1256 426 412 1270 1256 425 1252 430 408 1274 413 1270 407 1276 411 1245 442 1267 410 1247 1279 8245 1273 435 1252 430 408 1274 1252 430 1247 435 414 1269 408 1275 412 1270 407 1277 410 1246 441 1268 1248 7145 1273 435 1252 430 408 1274 1252 430 1247 435 414 1242 435 1248 439 1244 433 1250 437 1246 441 1242 1274 8249 1279 403 1274 434 415 1242 1274 434 1253 429 409 1247 440 1242 435 1248 439 1244 433 1250 437 1246 1280 7138 1279 403 1274 434 415 1268 1247 434 1253 429 409 1246 441 1268 409 1248 439 1244 433 1250 437 1245 1281 8241 1277 405 1283 426 412 1270 1256 426 1251 430 408 1274 413 1270 407 1276 411 1271 416 1267 410 1246 1280 7138 1279 429 1248 434 415 1268 1247 434 1274 407 442 1240 416 1267 410 1247 440 1243 434 1249 438 1271 1255 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1279 430 1247 436 413 1270 1256 427 1250 432 406 1277 410 1273 414 1269 408 1275 1251 432 406 1277 410 7983 1284 425 1252 430 408 1275 1251 431 1256 426 412 1270 407 1250 437 1272 415 1242 1274 435 414 1270 407 9092 1275 433 1254 428 410 1273 1253 428 1249 434 415 1268 409 1274 413 1269 408 1276 1250 432 406 1277 410 7984 1283 425 1252 431 407 1275 1251 431 1256 426 412 1270 407 1276 411 1272 415 1241 1275 435 414 1269 408 9090 1277 431 1256 426 412 1270 1256 426 1251 431 407 1275 412 1270 407 1276 411 1272 1254 428 410 1273 414 7978 1278 430 1247 435 414 1269 1247 435 1252 430 408 1274 413 1243 434 1275 412 1271 1255 427 411 1272 415 9082 1275 434 1253 428 410 1273 1253 428 1249 433 405 1277 410 1272 415 1268 409 1274 1252 430 408 1275 412 7980 1276 432 1255 427 411 1271 1255 427 1250 432 406 1276 411 1271 416 1267 410 1247 1279 430 408 1275 412 9085 1282 426 1251 431 407 1276 1250 432 1255 426 412 1270 407 1276 411 1272 415 1268 1247 435 414 1269 408 7985 1282 427 1250 432 406 1277 1249 433 1254 428 410 1272 415 1267 410 1274 413 1269 1257 426 412 1271 406 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9204 4469 604 562 604 562 604 562 604 563 603 564 602 565 601 567 599 568 598 1642 598 1643 607 1634 606 1634 606 1634 606 1635 605 1636 604 1637 603 1638 602 565 601 1641 599 568 598 569 607 560 606 1635 605 588 578 562 604 1637 603 563 603 1638 602 1639 601 1641 599 594 572 1643 607 39280 9217 2212 601 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9225 4468 605 563 603 564 602 565 601 566 600 568 598 569 597 570 606 561 605 1636 604 1638 602 1640 600 1641 599 1643 607 1634 606 1636 603 1637 603 1639 601 1640 600 1641 599 595 571 568 598 569 597 1645 605 588 578 562 604 563 603 564 602 1639 601 1641 599 1643 597 596 580 1635 605 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 9214 4475 598 568 598 597 579 560 606 588 578 589 577 563 603 590 576 564 602 1666 574 1667 573 1641 599 1669 571 1643 597 1644 606 1635 605 1663 577 563 603 564 602 591 575 592 574 592 574 593 573 1668 572 594 572 1669 571 1669 571 1670 570 1644 606 1635 605 1636 604 590 576 1637 603 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9275 4475 608 560 606 563 603 565 601 568 598 570 606 563 603 565 601 567 599 1645 605 1638 602 1642 598 1645 605 1639 601 1642 598 1645 605 1637 603 1641 599 569 607 561 605 1639 601 1642 608 560 606 563 603 565 601 568 598 1644 606 1637 603 565 601 567 599 1644 606 1636 604 1639 601 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1279 428 1246 434 413 1265 1246 434 1250 430 407 1271 413 1240 434 1245 439 1240 434 1245 439 1240 1271 7282 1276 430 1244 436 411 1267 1255 426 1248 432 405 1248 437 1243 431 1248 436 1243 431 1248 436 1243 1279 7276 1272 434 1250 430 407 1271 1251 430 1244 436 411 1267 407 1247 437 1241 433 1246 438 1241 433 1246 1276 7279 1279 427 1247 433 404 1248 1274 433 1251 429 408 1271 413 1239 435 1245 440 1239 435 1244 430 1249 1273 7282 1276 430 1244 436 411 1267 1244 436 1248 432 405 1273 411 1242 432 1247 437 1241 433 1247 437 1241 1281 7274 1274 432 1252 428 409 1270 1252 428 1246 434 413 1266 408 1244 441 1239 435 1244 440 1239 435 1244 1278 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1275 405 1279 401 436 1243 1279 401 1273 407 440 1238 436 1244 1278 429 408 1244 440 1239 435 1244 440 8113 1272 434 1250 430 407 1246 1276 430 1254 426 411 1242 432 1247 1275 432 405 1247 437 1242 432 1247 437 8115 1280 426 1248 432 405 1248 1274 433 1251 428 409 1244 440 1239 1272 434 413 1239 435 1245 439 1239 435 8118 1277 429 1245 435 412 1240 1271 436 1248 431 406 1247 437 1242 1280 427 410 1242 432 1247 437 1242 432 8121 1274 406 1278 428 409 1244 1278 402 1272 408 439 1240 434 1245 1277 404 433 1246 438 1240 434 1245 439 8114 1281 399 1275 405 432 1247 1275 406 1278 401 436 1244 430 1249 1273 407 440 1240 434 1245 439 1239 435 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1248 412 1274 438 405 1284 1245 445 1251 435 408 1281 405 1282 404 1285 411 1251 435 1253 1276 437 406 8011 1242 445 1251 435 408 1255 1274 442 1244 443 410 1278 408 1280 406 1282 435 1254 411 1277 1242 445 408 8011 1242 443 1243 444 409 1279 1250 440 1246 441 412 1277 409 1279 407 1281 405 1282 404 1286 1243 443 410 8008 1245 442 1244 443 410 1278 1251 440 1246 441 402 1286 410 1278 408 1280 406 1256 430 1284 1276 411 411 8006 1247 439 1247 439 404 1285 1244 446 1250 437 406 1282 404 1283 403 1285 411 1278 408 1254 1275 438 405 8013 1251 436 1250 410 433 1282 1247 443 1243 443 410 1279 407 1281 405 1282 404 1258 438 1276 1243 444 409 7981 1272 414 1272 441 412 1250 1269 448 1248 438 405 1257 429 1259 437 1277 429 1232 433 1281 1248 412 431 7986 1267 446 1250 436 407 1255 1274 443 1243 443 410 1253 433 1280 406 1282 404 1258 428 1287 1273 387 435 7981 1272 414 1272 415 438 1276 1243 447 1249 411 432 1282 435 1228 489 1198 436 1278 408 1280 1249 411 432 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1281 410 1289 429 415 1276 1257 435 1264 428 416 1248 440 1250 438 1253 435 1282 1261 404 440 1277 411 8127 1288 404 1284 434 410 1281 1262 403 1285 432 412 1280 408 1256 443 1249 439 1278 1265 401 443 1275 413 8125 1289 429 1260 432 412 1253 1291 401 1287 431 413 1251 437 1253 446 1246 442 1249 1284 435 409 1256 443 8122 1282 437 1262 429 415 1277 1256 409 1290 428 416 1249 439 1251 437 1254 445 1247 1286 433 411 1254 445 8120 1283 409 1290 428 416 1275 1258 434 1254 437 418 1274 414 1249 439 1252 436 1281 1262 404 440 1251 437 8128 1286 432 1256 436 408 1257 1286 405 1283 435 409 1282 417 1247 441 1250 438 1253 1290 428 416 1249 439 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1286 406 1282 438 416 1275 1257 435 1263 430 1258 434 410 1282 416 1276 412 1254 444 1248 1284 436 1262 7278 1288 403 1285 435 408 1257 1285 433 1255 438 1260 431 413 1279 409 1283 415 1250 438 1254 1288 405 1283 7285 1281 411 1287 432 412 1253 1289 430 1258 435 1263 429 415 1250 438 1254 444 1248 440 1252 1290 429 1259 7283 1283 408 1290 428 416 1249 1283 436 1262 431 1257 435 408 1256 442 1250 438 1255 443 1248 1284 436 1262 7278 1288 430 1258 435 408 1256 1286 433 1255 437 1261 431 413 1252 436 1282 416 1249 439 1254 1288 404 1284 7282 1284 408 1290 428 416 1249 1283 436 1262 430 1258 434 410 1255 443 1249 439 1253 445 1247 1285 408 1290 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1276 403 1271 435 412 1241 1270 409 1276 431 1254 427 410 1242 1280 427 1247 433 404 1249 1273 407 430 8123 1273 433 1251 429 408 1245 1277 429 1245 435 1250 430 407 1272 1250 430 1255 426 411 1268 1254 426 411 8117 1279 401 1273 433 404 1249 1273 433 1251 429 1245 435 412 1240 1271 435 1249 431 406 1246 1276 431 406 8122 1274 406 1278 427 410 1270 1252 428 1246 434 1251 429 408 1271 1251 403 1271 436 411 1267 1244 436 411 8116 1279 427 1247 433 404 1275 1247 433 1251 429 1245 434 413 1266 1245 435 1250 430 407 1272 1250 431 406 8121 1274 431 1254 427 410 1269 1253 427 1247 433 1251 429 408 1271 1251 429 1245 434 413 1266 1245 435 412 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1280 457 1229 426 468 1236 1282 456 1230 427 468 1236 470 1235 471 1235 471 1235 471 1235 492 1240 1289 7171 1290 422 1284 399 464 1238 1291 422 1284 399 464 1239 467 1238 468 1238 468 1238 489 1217 500 1233 1285 7176 1285 426 1280 403 471 1232 1286 426 1281 403 471 1232 464 1242 496 1210 496 1237 469 1236 470 1236 1282 7206 1286 399 1287 422 441 1262 1287 398 1288 449 435 1215 491 1241 465 1240 466 1240 466 1240 466 1240 1289 7199 1283 429 1257 426 469 1235 1283 428 1258 426 469 1234 473 1234 472 1234 472 1233 474 1233 463 1243 1306 7182 1289 448 1258 398 465 1238 1291 448 1258 425 438 1239 467 1238 468 1238 468 1237 490 1216 490 1242 1287 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1289 448 1227 454 441 1238 1280 457 1228 454 441 1238 468 1239 1289 448 436 1215 491 1242 475 1233 473 8012 1281 457 1249 406 468 1237 1281 457 1260 396 467 1238 468 1239 1290 448 436 1242 475 1233 473 1234 472 8013 1291 421 1285 397 466 1238 1291 421 1285 398 465 1239 467 1240 1288 423 472 1233 473 1233 473 1234 472 8014 1289 449 1257 398 465 1239 1289 422 1284 398 465 1239 467 1240 1309 403 471 1233 473 1234 472 1235 471 8015 1309 402 1283 426 437 1241 1308 403 1283 427 436 1241 496 1237 1281 404 470 1235 471 1235 471 1236 491 8021 1282 402 1284 452 443 1235 1283 402 1284 452 443 1209 497 1236 1282 402 472 1233 463 1243 495 1212 494 8019 1284 427 1258 450 445 1233 1285 426 1259 450 444 1233 473 1233 1285 426 437 1240 497 1209 497 1236 470 8016 1288 450 1225 431 464 1241 1288 451 1255 402 472 1232 474 1232 1286 452 443 1235 523 1183 471 1235 471 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1286 424 1251 430 465 1241 1287 423 1252 457 437 1241 465 1242 464 1243 474 1234 472 1235 1314 423 440 8017 1286 451 1255 401 462 1242 1286 452 1254 402 472 1232 474 1233 473 1234 472 1234 493 1241 1287 424 439 8014 1289 422 1284 426 437 1241 1287 451 1255 403 471 1234 472 1234 472 1235 492 1215 491 1242 1286 399 464 8018 1285 426 1280 403 471 1234 1284 454 1252 404 470 1235 471 1236 491 1215 491 1243 526 1181 1285 427 436 8019 1315 423 1262 395 468 1236 1313 400 1286 424 439 1238 489 1218 499 1235 471 1236 470 1236 1282 430 464 8019 1284 401 1284 426 468 1236 1282 404 1281 456 438 1240 466 1240 466 1241 465 1241 465 1242 1286 426 468 8015 1288 424 1261 448 436 1242 1286 426 1259 451 444 1234 472 1234 472 1235 471 1235 471 1236 1282 456 438 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9090 4295 561 1708 570 561 563 569 565 567 567 565 569 563 561 570 564 568 566 565 569 1701 567 1702 566 1703 565 1705 563 1706 562 1707 561 1708 570 1699 569 1700 568 564 570 562 562 570 564 567 567 565 569 1700 568 563 591 563 561 1708 571 1699 569 1700 568 1702 566 1703 565 565 569 40667 9086 2139 562 97339 9092 2132 569 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9092 4292 563 1732 536 569 565 567 567 591 543 589 534 597 537 595 539 566 568 564 570 1699 569 1700 568 1702 566 1703 565 1705 563 1707 561 1708 570 1700 568 1701 567 591 543 1700 568 564 570 588 535 570 564 1732 556 571 563 568 566 1703 565 567 567 1702 566 1703 565 1705 563 567 567 40657 9086 2135 566 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9091 4292 564 1706 562 569 565 567 567 565 569 562 561 570 564 568 566 565 569 562 561 1708 570 1698 570 1700 568 1728 540 1703 565 1705 563 1706 562 1708 570 1699 569 1700 568 563 571 561 562 569 565 566 568 1701 587 566 568 563 571 561 562 1706 562 1707 561 1708 570 1699 569 562 561 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9000 4466 564 1681 564 566 572 559 569 561 567 564 564 567 571 558 570 560 568 563 565 1678 567 1679 566 1681 564 1682 564 1679 566 1678 567 1686 570 1676 569 1674 571 559 569 563 565 1679 566 564 564 566 572 550 567 563 565 565 563 1679 566 1677 568 563 565 1678 567 1676 569 1681 564 1680 565 1680 565 565 563 569 569 1674 571 560 567 563 565 555 573 558 570 559 569 1674 571 1670 565 564 564 1678 567 1676 569 1675 570 12978 9003 2207 566 96147 9000 2203 570 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9005 4459 570 1701 544 560 568 563 565 566 572 559 569 563 565 566 572 559 569 561 567 1678 567 1676 569 1675 570 1673 572 1671 564 1680 565 1685 571 1671 564 1677 568 561 567 562 566 564 564 565 563 565 563 557 571 557 571 557 571 1670 565 1678 567 1674 571 1668 567 1671 564 1686 570 1670 565 1675 570 559 569 560 568 561 567 562 566 563 565 553 564 563 565 564 564 1677 569 1673 573 1671 564 1678 567 1674 571 1671 564 13005 8998 2203 570 96194 8995 2204 569 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 9004 4451 568 1683 573 558 570 561 567 565 563 568 570 560 568 562 566 564 564 566 572 1680 565 1688 568 1685 571 1685 571 1684 572 1683 573 1674 571 1681 564 567 571 1679 566 1686 570 561 566 565 563 567 571 551 566 563 565 1690 566 565 563 569 569 1684 572 1682 563 1690 566 1681 564 1689 567 564 564 1689 567 1687 569 563 565 566 572 559 569 551 566 563 565 1684 572 558 570 560 567 1682 563 1687 569 1683 562 1688 568 12989 8992 2208 565 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 9005 4457 572 1673 572 559 569 561 567 563 565 566 562 567 571 558 570 560 568 562 566 1676 569 1673 572 1698 537 1708 537 1704 541 1703 542 1708 537 567 571 1669 566 1701 544 558 570 560 568 561 567 564 564 557 571 1671 564 565 563 566 572 1670 565 1703 542 1673 562 1678 567 1683 562 566 562 1677 568 1701 544 559 569 561 567 563 565 565 563 557 571 1668 567 563 565 563 565 1676 569 1699 546 1669 566 1678 567 1676 569 -# +# name: POWER type: parsed protocol: NEC address: 30 00 00 00 command: 8C 00 00 00 -# +# name: SPEED- type: parsed protocol: NEC address: 30 00 00 00 command: 83 00 00 00 -# +# name: SPEED+ type: parsed protocol: NEC address: 30 00 00 00 command: 85 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8958 4439 570 1663 563 561 562 563 560 564 569 556 567 557 566 558 565 559 564 560 563 1669 567 1663 563 1670 566 1665 561 1670 566 1666 560 1680 567 1665 561 1670 566 558 565 560 563 1669 567 557 566 559 564 552 561 563 560 565 568 1663 563 1668 568 556 567 1665 561 1670 566 1674 562 1668 568 1663 563 561 562 562 561 1670 566 558 565 559 564 552 561 563 560 564 569 1661 565 1667 569 555 568 1664 562 1668 568 1663 563 12896 8966 2197 565 95701 8962 2200 562 95719 8975 2194 568 95705 8970 2195 567 95693 8970 2196 566 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8965 4443 566 1668 568 557 566 559 564 562 561 564 569 583 540 559 564 561 562 563 560 1673 563 1671 565 1669 567 1666 560 1673 563 1670 566 1676 560 1673 563 1670 566 558 565 561 562 564 569 556 567 559 564 553 560 565 568 558 565 1668 568 1666 570 1663 563 1670 566 1667 569 1671 565 1668 568 1665 561 564 569 557 566 559 564 562 561 564 569 547 566 560 563 562 561 1672 564 1669 567 1666 570 1664 562 1671 565 1668 568 12942 8972 2198 564 95779 8964 2201 561 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 8970 4439 570 1665 561 564 569 556 567 558 565 561 562 563 560 566 567 557 566 559 564 1669 567 1667 569 1665 561 1672 564 1670 566 1668 569 1674 562 563 560 1673 563 1671 565 561 562 564 569 556 567 559 564 553 560 1673 563 563 560 566 567 1667 569 1664 562 1672 564 1669 567 1676 560 566 567 1667 569 1664 562 563 570 555 568 558 565 560 563 553 560 1674 562 563 560 565 569 1667 570 1664 562 1671 565 1667 569 1663 563 12935 8969 2204 568 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 8963 4430 569 1673 563 561 562 562 561 564 570 555 568 557 566 559 564 561 562 563 560 1680 567 1674 562 1680 567 1675 561 1681 566 1676 561 1671 565 1675 562 563 560 1682 565 1678 569 557 566 559 564 562 561 555 568 557 566 1675 562 564 569 555 568 1674 563 1678 569 1673 564 1670 566 1675 561 563 570 1672 564 1677 570 555 568 558 565 560 563 552 561 564 559 1682 565 560 563 563 560 1681 566 1675 561 1681 566 1676 561 12950 8975 2195 567 95870 8966 2201 561 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8973 4429 570 1673 563 562 561 565 568 557 566 559 564 561 562 564 569 557 566 559 564 1679 568 1674 562 1680 567 1676 560 1682 565 1676 571 1663 563 1679 568 558 565 1677 570 1673 563 562 561 565 568 557 566 1667 559 565 568 1673 563 563 560 565 568 1674 562 1679 568 1675 561 556 567 1675 561 564 569 1672 564 1677 570 556 567 559 564 561 562 1670 566 559 564 1676 571 555 568 557 566 1675 562 1680 567 1675 561 564 569 12939 8975 2197 565 -# +# name: SPEED- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8972 4427 561 1681 566 560 563 562 561 565 568 557 566 559 564 561 562 563 560 565 568 1673 563 1676 571 1671 565 1676 571 1672 564 1677 570 1664 562 1679 568 1674 562 562 561 1680 567 558 565 560 563 562 561 555 568 556 567 558 565 1676 560 564 569 1670 566 1675 561 1680 567 1665 561 1680 567 1675 561 564 569 1673 563 562 561 564 569 556 567 548 565 561 562 562 561 1680 567 558 565 1677 570 1672 564 1678 569 1673 563 12942 8971 2195 567 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9024 4477 566 1725 541 537 575 530 572 534 568 537 565 540 572 533 569 537 565 540 572 1690 566 1697 569 1720 546 1690 566 1697 569 1694 572 1691 565 1698 568 1694 572 533 569 537 565 540 572 533 569 536 566 540 572 532 570 536 566 1696 570 1692 574 1715 541 1696 570 1693 573 1689 567 1696 570 1693 573 532 570 536 566 539 573 532 570 535 567 538 574 531 571 534 568 1695 571 1691 565 1725 541 1695 571 1692 574 1688 568 11738 9017 2223 574 95995 9023 2216 570 95998 9020 2219 567 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9025 4477 576 1687 569 564 548 531 571 534 568 537 565 540 572 533 569 536 566 539 573 1689 567 1696 570 1693 573 1689 567 1696 570 1693 573 1690 566 1697 569 1694 572 560 542 1694 572 560 542 537 565 540 572 533 569 536 566 539 573 1689 567 565 547 1689 567 1696 570 1692 574 1689 567 1696 570 1693 573 559 543 1693 573 559 543 536 566 539 573 532 570 535 567 538 574 1688 568 564 548 1688 568 1695 572 1691 575 1688 568 11738 9016 2223 574 95995 9022 2216 570 96000 9019 2219 630 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9022 4480 573 1691 565 540 572 533 569 537 565 540 572 533 569 536 566 540 572 532 570 1693 573 1690 566 1697 569 1694 572 1717 539 1724 542 1721 545 1718 548 1715 541 1722 544 535 567 538 574 531 571 535 567 538 574 531 571 534 568 538 564 1698 568 1695 571 1692 574 1689 567 1722 544 1719 547 1716 540 1723 543 536 566 540 572 533 569 536 566 539 573 532 570 536 566 539 573 1689 567 1696 570 1693 573 1690 566 1724 542 11737 9015 2224 572 95995 9025 2215 571 95997 9020 2219 567 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 9021 4481 572 1692 574 531 571 535 567 538 574 531 571 534 568 538 564 541 571 534 568 1694 572 1691 575 1688 568 1722 544 1719 547 1690 566 1697 569 1694 572 1691 565 540 572 533 569 1694 572 533 569 537 565 540 572 533 569 537 565 1698 568 1694 572 533 569 1695 571 1692 574 1715 541 1722 544 1693 573 531 571 535 567 1696 570 535 567 539 573 532 570 535 567 538 574 1689 567 1696 570 535 567 1696 570 1693 573 1716 540 11739 9024 2216 570 95999 9020 2219 567 96001 9020 2220 566 -# +# name: POWER type: parsed protocol: NEC address: 80 00 00 00 command: 92 00 00 00 -# +# name: SPEED+ type: parsed protocol: NEC address: 80 00 00 00 command: 89 00 00 00 -# +# name: SPEED- type: parsed protocol: NEC address: 80 00 00 00 command: 9F 00 00 00 -# +# name: ROTATE type: parsed protocol: NEC address: 80 00 00 00 command: 87 00 00 00 -# +# name: MODE type: parsed protocol: NEC address: 80 00 00 00 command: 81 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1286 402 1289 426 414 1241 1280 408 1283 431 409 1245 435 1246 434 1247 433 1249 442 1239 441 1240 1281 7121 1281 404 1276 436 414 1239 1282 429 1251 433 407 1246 434 1246 434 1247 433 1247 433 1247 433 1247 1284 8216 1275 408 1283 428 412 1267 1253 430 1250 432 408 1245 435 1244 436 1244 436 1244 436 1244 436 1243 1277 7120 1282 401 1279 403 437 1243 1277 404 1276 407 433 1247 433 1246 434 1246 434 1246 434 1246 434 1245 1275 8224 1277 405 1275 407 433 1247 1273 409 1282 400 440 1240 440 1239 441 1239 441 1239 441 1238 442 1238 1282 7115 1276 405 1275 407 433 1247 1273 409 1281 400 440 1240 440 1239 441 1239 441 1239 441 1238 432 1248 1283 8216 1275 407 1283 399 441 1238 1282 400 1280 402 438 1241 439 1241 439 1240 440 1239 441 1239 441 1238 1282 7114 1277 405 1275 406 434 1246 1274 407 1273 408 432 1248 432 1247 433 1247 1246 434 1245 435 1245 1275 8223 1279 403 1277 404 436 1244 1276 406 1274 407 433 1247 433 1246 434 1245 435 1245 435 1244 436 1244 1276 7120 1282 400 1280 401 439 1241 1279 402 1278 404 436 1244 436 1243 437 1243 437 1242 438 1241 439 1241 1279 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1286 401 1279 434 406 1249 1282 404 1276 436 414 1240 440 1241 1280 432 408 1247 433 1248 432 1248 443 7955 1277 408 1283 430 410 1244 1276 408 1283 429 411 1243 437 1243 1278 408 432 1248 432 1249 441 1265 415 9057 1286 400 1280 431 409 1271 1250 435 1256 429 411 1243 437 1243 1278 433 407 1248 432 1248 432 1248 432 7966 1277 407 1284 427 413 1241 1280 431 1249 435 405 1249 442 1239 1282 402 438 1243 437 1243 437 1243 437 9062 1280 404 1276 435 405 1248 1283 401 1279 432 408 1245 435 1246 1275 436 414 1239 441 1239 441 1239 441 7956 1276 407 1284 427 413 1241 1280 404 1276 434 406 1247 433 1247 1284 400 440 1240 440 1240 440 1240 440 9058 1284 399 1281 429 411 1243 1278 432 1248 435 405 1249 431 1248 1283 401 439 1241 439 1241 439 1241 439 7957 1275 408 1283 401 439 1241 1280 430 1250 406 434 1246 434 1246 1275 409 441 1238 432 1249 431 1248 432 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1292 403 1288 431 409 1246 1285 406 1285 432 408 1247 433 1249 442 1240 1280 407 443 1239 441 1267 413 7957 1286 401 1279 434 406 1248 1283 404 1287 427 413 1241 439 1241 439 1241 1280 407 433 1248 432 1248 443 9055 1277 409 1282 431 409 1244 1276 409 1282 431 409 1244 436 1245 435 1245 1286 426 414 1267 413 1241 439 7956 1276 409 1282 430 410 1244 1277 408 1283 429 411 1269 411 1243 437 1243 1278 407 433 1248 432 1248 432 9065 1277 407 1284 428 412 1242 1278 406 1285 427 413 1241 439 1241 439 1241 1280 406 434 1247 433 1247 433 7962 1281 405 1275 436 414 1266 1254 431 1249 436 414 1265 415 1239 441 1240 1280 432 408 1246 434 1247 433 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1274 408 1283 426 414 1239 1282 427 1253 428 412 1241 439 1240 440 1240 440 1239 1281 427 413 1267 413 7957 1275 434 1246 436 404 1275 1256 427 1253 429 411 1267 413 1267 413 1240 440 1240 1280 428 412 1267 413 9060 1282 400 1280 428 412 1267 1253 429 1251 430 410 1243 437 1243 437 1242 438 1242 1278 429 411 1241 439 7958 1274 434 1246 436 414 1264 1256 426 1254 428 412 1266 414 1240 492 1188 440 1240 1280 428 412 1240 440 9059 1272 436 1254 426 414 1239 1281 426 1254 427 413 1240 440 1239 441 1239 441 1238 1282 426 414 1239 441 7955 1277 405 1275 407 433 1246 1274 408 1282 399 441 1239 441 1239 441 1239 441 1239 1281 400 440 1240 440 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1309 376 1276 409 433 1252 1305 379 1273 410 463 1222 441 1244 460 1221 463 1221 442 1242 462 1222 1283 7692 1310 375 1309 377 464 1220 1305 379 1273 410 463 1223 460 1222 441 1242 462 1221 431 1252 463 1220 1305 7668 1281 401 1303 378 432 1252 1284 399 1305 378 464 1220 464 1217 466 1216 467 1215 468 1214 459 1223 1303 7665 1305 379 1304 381 440 1244 1282 405 1278 409 433 1254 440 1246 437 1248 467 1219 433 1252 463 1224 1312 7687 1304 385 1309 380 461 1227 1278 410 1305 382 439 1250 433 1253 462 1228 466 1222 461 1226 468 1219 1306 7689 1313 375 1308 380 441 1248 1309 379 1284 402 460 1228 466 1222 441 1248 467 1222 462 1227 467 1222 1304 7688 1283 403 1312 374 468 1219 1306 382 1312 377 464 1224 439 1249 434 1252 442 1245 459 1228 435 1253 1304 7683 1277 411 1304 383 438 1249 1308 380 1303 381 461 1225 438 1248 435 1252 442 1247 436 1252 442 1246 1311 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1274 436 1247 436 406 1277 1249 437 1257 427 415 1269 415 1270 413 1272 1254 432 410 1274 410 1271 413 8525 1277 431 1253 430 412 1272 1254 430 1254 428 413 1270 414 1271 413 1272 1254 430 412 1271 413 1272 412 8537 1275 435 1249 437 415 1270 1256 427 1257 427 415 1268 405 1279 415 1268 1247 437 404 1279 415 1269 415 8528 1274 433 1251 432 410 1272 1254 430 1254 431 411 1273 411 1271 413 1244 1282 429 413 1271 413 1271 413 8532 1281 429 1255 430 412 1272 1254 429 1255 428 414 1271 413 1245 439 1273 1253 432 410 1274 410 1273 411 8539 1273 435 1249 433 409 1273 1253 429 1255 430 412 1271 413 1270 414 1267 1248 434 408 1274 410 1273 410 8532 1280 428 1256 427 414 1268 1247 436 1248 436 406 1250 434 1275 409 1272 1254 429 413 1270 414 1270 414 8534 1278 431 1253 433 409 1273 1253 429 1255 429 413 1269 415 1267 406 1277 1249 436 405 1277 407 1249 435 8531 1281 427 1246 436 406 1275 1251 434 1250 433 409 1272 412 1270 414 1269 1246 436 405 1277 407 1274 410 8537 1275 435 1249 435 407 1278 1248 437 1257 428 414 1268 405 1277 407 1276 1250 434 408 1274 410 1272 412 8531 1281 429 1255 429 413 1243 1283 427 1257 428 414 1271 413 1272 412 1272 1254 432 410 1273 411 1247 437 8536 1276 432 1252 432 410 1273 1253 432 1252 433 409 1275 409 1275 409 1275 1251 435 407 1278 405 1277 407 8535 1278 430 1254 428 414 1268 1247 436 1248 435 406 1276 408 1277 407 1277 1249 435 407 1277 407 1277 407 8540 1273 435 1249 434 408 1273 1253 429 1255 429 413 1271 413 1270 414 1270 1256 430 412 1271 413 1271 413 8538 1275 435 1249 435 407 1275 1251 432 1252 433 409 1275 409 1274 410 1274 1252 432 410 1275 409 1276 408 8542 1281 429 1255 431 411 1273 1253 431 1253 432 410 1273 411 1271 413 1271 1255 431 411 1273 411 1272 412 8529 1273 436 1258 427 415 1268 1258 427 1257 429 413 1272 412 1273 411 1249 1277 436 406 1279 415 1268 415 8536 1276 432 1252 430 412 1271 1255 431 1253 432 410 1275 409 1274 410 1273 1253 432 410 1274 410 1272 412 8527 1275 435 1249 435 407 1276 1250 433 1251 434 408 1277 407 1279 415 1269 1257 427 415 1271 413 1270 413 8556 1277 436 1258 431 411 1277 1259 430 1254 436 406 1280 414 1272 412 1275 1251 438 414 1272 412 1272 412 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1280 431 1253 432 410 1275 1250 433 1251 434 408 1277 406 1280 414 1272 412 1274 410 1276 1250 436 405 8543 1331 352 1280 432 410 1275 1251 433 1251 435 407 1275 409 1272 412 1271 413 1272 412 1273 1253 432 410 8527 1275 435 1249 436 405 1276 1250 431 1253 429 413 1270 413 1270 413 1269 414 1269 415 1268 1247 436 405 8534 1278 430 1253 428 414 1268 1247 435 1248 435 407 1277 406 1276 408 1274 410 1274 410 1248 1277 436 405 8558 1275 438 1256 431 411 1277 1259 428 1256 431 411 1275 409 1278 416 1271 413 1273 411 1277 1259 429 413 8559 1285 428 1256 430 412 1273 1253 433 1251 434 408 1277 406 1280 414 1274 410 1279 415 1273 1253 437 415 8550 1283 430 1254 433 409 1279 1257 431 1253 434 408 1279 415 1274 410 1278 416 1274 410 1278 1258 431 411 8553 1280 432 1252 435 407 1279 1257 427 1256 427 404 1277 406 1276 408 1248 435 1274 410 1273 1253 430 412 8535 1277 433 1251 435 406 1279 1257 429 1255 431 411 1275 409 1277 406 1278 416 1271 413 1272 1254 431 411 8545 1278 433 1251 434 408 1278 1258 428 1255 432 410 1274 410 1279 415 1273 411 1278 416 1273 1253 437 415 8557 1286 429 1254 437 415 1274 1252 436 1258 430 412 1277 406 1283 411 1278 405 1282 412 1275 1250 438 414 8561 1282 433 1251 438 414 1274 1252 438 1256 433 409 1277 407 1280 414 1272 412 1275 409 1278 1258 429 413 8549 1284 430 1254 434 408 1279 1257 429 1255 433 409 1279 415 1273 411 1277 407 1280 414 1274 1252 436 405 8557 1276 436 1258 431 411 1274 1252 434 1250 437 415 1272 412 1275 408 1280 414 1275 409 1280 1256 433 409 8558 1285 428 1256 431 411 1276 1250 438 1256 432 410 1278 416 1272 412 1273 411 1273 411 1273 1253 432 410 8539 1273 437 1247 436 405 1277 1249 434 1250 435 406 1276 408 1275 409 1275 409 1275 409 1275 1251 435 406 8543 1280 430 1254 431 411 1274 1252 431 1253 431 411 1273 410 1272 412 1273 411 1274 410 1276 1250 434 408 8542 1280 432 1252 434 408 1279 1257 430 1254 433 408 1277 407 1278 416 1270 413 1272 412 1275 1251 435 406 8540 1283 427 1257 429 413 1272 1254 431 1253 432 410 1275 409 1276 408 1278 406 1277 406 1276 1250 435 407 8538 1274 434 1250 434 408 1277 1249 436 1258 428 414 1273 411 1272 412 1270 414 1271 412 1273 1253 433 409 8535 1277 433 1251 436 406 1282 1254 433 1250 438 414 1274 410 1278 405 1280 414 1271 413 1276 1260 429 412 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1280 433 1251 436 405 1281 1255 431 1253 434 408 1278 405 1279 1257 431 411 1277 407 1280 414 1274 410 8547 1275 437 1257 428 413 1270 1255 430 1254 430 412 1273 411 1275 1251 436 405 1280 414 1271 412 1273 410 8550 1283 431 1253 434 408 1278 1258 427 1256 428 414 1271 412 1272 1254 434 408 1279 415 1271 412 1247 436 8544 1279 433 1251 435 407 1279 1257 430 1254 434 407 1278 405 1277 1249 437 415 1269 414 1269 415 1269 415 8537 1275 435 1248 435 406 1276 1250 436 1248 436 406 1278 406 1277 1248 437 404 1280 414 1269 414 1271 412 8532 1280 428 1255 428 413 1269 1246 437 1246 435 406 1276 408 1277 1248 436 406 1278 406 1279 415 1268 416 8538 1274 436 1258 427 415 1269 1257 427 1257 430 412 1272 412 1273 1252 434 408 1277 407 1280 414 1272 412 8553 1280 405 1279 434 408 1276 1250 435 1259 429 413 1273 411 1274 1252 434 408 1277 407 1279 415 1270 414 8548 1275 436 1258 428 414 1272 1254 433 1250 435 406 1277 406 1278 1258 429 413 1272 412 1275 409 1277 406 8549 1284 427 1257 430 412 1274 1251 433 1251 434 407 1277 406 1278 1248 437 415 1269 415 1271 412 1273 410 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8982 4433 598 1657 570 519 594 547 566 522 591 549 575 540 573 541 572 542 571 543 570 1659 568 1635 592 1637 600 1655 572 1657 570 1660 566 1636 601 1654 572 1630 597 517 596 545 568 520 593 547 566 548 576 539 574 540 573 540 573 1629 598 1631 596 1633 593 1635 592 1637 600 1629 597 1631 596 1633 593 521 592 522 591 549 575 540 573 514 599 542 571 543 570 544 569 1659 568 1635 592 1637 600 1628 598 1630 597 1632 595 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8990 4430 601 1628 598 517 596 519 594 547 566 549 574 540 573 542 571 544 569 546 567 1663 574 1628 598 1658 568 1662 575 1654 572 1658 568 1660 566 1663 574 1656 570 544 569 1660 566 548 575 539 574 541 572 542 571 544 569 545 568 1662 575 539 574 1656 570 1658 568 1661 565 1664 573 1656 570 1659 567 548 565 1664 573 542 571 543 570 545 568 546 567 548 565 549 574 1655 571 543 570 1659 567 1661 576 1628 598 1658 568 -# +# name: SPEED+ type: parsed protocol: NEC address: 00 00 00 00 command: 11 00 00 00 -# +# name: ROTATE type: parsed protocol: NEC address: 00 00 00 00 command: 0E 00 00 00 -# +# name: TIMER type: parsed protocol: NEC address: 00 00 00 00 command: 05 00 00 00 -# +# name: ROTATE type: parsed protocol: NEC address: 00 00 00 00 command: 18 00 00 00 -# +# name: TIMER type: parsed protocol: NEC address: 00 00 00 00 command: 40 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1313 407 1306 414 432 1273 1306 415 1308 447 409 1275 438 1275 437 1275 438 1273 1306 449 407 1278 434 7939 1307 438 1285 408 427 1278 1312 409 1304 424 484 1229 432 1280 433 1280 433 1277 1313 415 431 1282 430 7925 1310 408 1304 414 432 1274 1305 415 1308 420 426 1286 427 1285 428 1284 429 1282 1308 420 426 1286 427 7944 1312 407 1306 413 433 1272 1307 413 1310 418 428 1284 429 1283 481 1230 431 1279 1311 417 429 1283 430 7922 1313 406 1307 412 434 1271 1308 412 1311 416 430 1283 429 1282 431 1281 432 1277 1313 415 431 1281 431 7935 1310 409 1365 353 482 1222 1306 415 1308 420 426 1285 428 1284 429 1283 429 1280 1310 418 428 1284 429 7922 1303 415 1308 411 435 1270 1310 411 1312 415 431 1280 432 1279 433 1278 435 1274 1305 423 433 1278 435 7930 1305 413 1310 409 426 1277 1313 408 1305 422 434 1277 436 1275 427 1284 429 1280 1310 418 428 1283 430 7918 1307 411 1312 407 428 1275 1304 416 1307 420 436 1275 427 1283 430 1281 431 1277 1313 414 432 1279 433 7928 1307 411 1312 406 429 1274 1305 414 1309 419 427 1283 430 1281 432 1279 434 1275 1304 449 407 1277 435 7909 1305 412 1311 408 427 1276 1303 416 1307 421 435 1275 427 1283 430 1281 431 1277 1313 414 432 1279 433 7925 1310 408 1305 414 432 1271 1308 412 1311 417 429 1281 431 1279 433 1276 436 1272 1308 420 426 1284 429 7914 1311 407 1368 351 433 1271 1308 412 1311 416 430 1281 431 1278 434 1276 426 1281 1309 419 427 1283 430 7928 1307 410 1364 354 481 1221 1307 414 1309 418 428 1282 431 1280 433 1277 436 1272 1307 420 436 1274 428 7913 1312 406 1307 412 434 1269 1310 410 1313 414 432 1278 434 1275 427 1282 431 1277 1313 415 431 1279 433 7922 1313 405 1307 411 435 1268 1311 409 1304 423 433 1277 435 1274 428 1281 431 1276 1314 414 432 1278 434 7905 1310 409 1314 404 431 1271 1308 412 1311 417 429 1280 432 1277 436 1274 428 1279 1311 417 429 1280 432 7922 1313 432 1281 438 408 1267 1312 435 1288 440 406 1277 436 1273 429 1280 432 1275 1315 413 433 1278 434 7903 1311 409 1314 404 431 1269 1310 413 1310 418 428 1306 407 1276 437 1273 429 1278 1312 419 427 1306 407 7921 1315 406 1307 412 434 1292 1287 410 1313 415 431 1302 411 1298 404 1279 434 1274 1316 415 431 1302 411 7901 1314 407 1306 413 433 1294 1285 411 1312 417 429 1304 409 1300 402 1281 432 1275 1315 416 430 1303 410 7917 1308 412 1311 409 426 1274 1305 417 1306 422 434 1274 428 1280 432 1277 436 1297 1283 421 435 1273 429 7906 1309 411 1312 407 428 1274 1306 416 1307 422 434 1274 428 1280 433 1276 426 1281 1309 421 435 1273 429 7901 1313 407 1306 414 432 1270 1310 412 1311 418 428 1280 433 1276 426 1282 431 1276 1314 416 430 1278 435 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1310 411 1312 407 428 1300 1279 417 1306 419 1304 423 433 1302 410 1302 400 1282 1307 421 1302 425 431 7882 1312 409 1304 414 432 1296 1283 413 1310 415 1308 445 401 1308 404 1280 432 1276 1314 414 1309 418 428 7849 1314 406 1306 412 434 1293 1286 410 1302 422 1311 416 430 1304 409 1276 437 1272 1307 420 1303 423 433 7876 1307 413 1309 408 427 1300 1279 416 1307 418 1305 421 435 1299 403 1281 431 1277 1313 415 1308 418 428 7844 1308 411 1302 416 430 1297 1282 413 1310 415 1308 418 428 1305 407 1303 409 1271 1308 419 1304 422 434 7869 1304 416 1307 411 424 1302 1277 418 1305 419 1304 422 434 1299 403 1306 407 1275 1304 422 1301 425 431 7837 1305 414 1309 408 427 1299 1280 414 1309 415 1307 418 428 1305 408 1301 401 1280 1309 416 1307 419 427 7874 1309 410 1303 414 432 1294 1285 409 1303 446 1277 423 433 1299 403 1305 407 1273 1306 420 1303 423 433 7830 1312 407 1305 412 434 1292 1277 417 1306 418 1305 421 425 1307 406 1303 409 1271 1308 417 1305 420 426 7871 1312 407 1306 411 424 1275 1304 416 1307 417 1306 419 427 1280 432 1275 427 1279 1311 415 1308 417 429 7833 1309 410 1303 414 432 1268 1311 408 1305 419 1304 421 425 1282 430 1277 436 1296 1283 416 1307 419 427 7868 1305 414 1309 408 427 1272 1307 412 1310 413 1310 416 430 1277 425 1282 430 1301 1278 421 1302 424 432 7829 1303 415 1308 409 426 1274 1305 414 1308 415 1308 418 428 1279 433 1274 428 1278 1311 413 1310 416 430 7866 1307 411 1301 415 431 1270 1309 410 1303 421 1302 423 433 1275 427 1279 433 1273 1306 419 1304 422 434 7826 1306 413 1310 407 428 1272 1307 412 1311 413 1310 416 430 1277 425 1282 430 1275 1304 421 1302 424 432 7844 1308 410 1302 415 430 1269 1310 410 1302 421 1302 424 432 1274 428 1279 433 1299 1280 419 1304 422 434 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1306 440 1282 436 410 1269 1310 437 1286 442 404 1283 429 1282 430 1282 430 1283 429 1281 1308 419 427 7925 1309 436 1286 406 429 1275 1304 417 1306 447 409 1277 435 1276 436 1276 426 1286 426 1284 1305 448 408 7898 1305 440 1283 435 411 1268 1311 435 1277 450 406 1279 433 1278 434 1277 435 1276 436 1273 1306 448 408 7914 1309 435 1277 440 406 1272 1307 440 1283 444 402 1283 429 1282 430 1281 431 1280 432 1277 1312 442 404 7898 1305 440 1283 436 410 1267 1312 435 1288 440 406 1278 434 1277 435 1276 436 1274 428 1282 1307 446 410 7910 1313 431 1281 437 409 1268 1311 436 1287 440 406 1278 434 1277 435 1275 427 1284 428 1281 1308 445 401 7899 1304 441 1282 436 410 1267 1312 435 1288 439 407 1278 434 1276 436 1275 427 1283 429 1280 1309 444 401 7914 1309 436 1287 431 404 1272 1307 439 1283 443 403 1281 431 1279 433 1277 435 1275 427 1281 1308 445 401 7898 1305 439 1284 434 401 1275 1304 442 1280 446 410 1273 429 1281 431 1279 433 1278 434 1273 1306 448 408 7905 1308 437 1286 432 403 1273 1306 440 1283 444 402 1281 431 1279 433 1276 436 1274 428 1280 1309 444 401 7894 1309 435 1288 430 405 1271 1308 438 1285 442 404 1278 434 1275 437 1273 429 1280 432 1276 1313 440 406 7905 1308 437 1286 431 404 1272 1307 439 1284 442 403 1279 433 1276 436 1273 429 1280 432 1275 1314 439 407 7885 1307 437 1286 431 404 1271 1308 438 1285 442 404 1278 434 1274 428 1282 430 1279 433 1274 1305 448 408 7901 1312 432 1280 436 410 1266 1313 432 1280 446 410 1272 430 1278 434 1275 427 1282 430 1276 1314 440 406 7906 1307 436 1286 431 404 1270 1309 437 1286 440 406 1276 436 1273 429 1279 433 1276 426 1280 1309 444 402 7882 1311 434 1278 438 408 1267 1312 434 1278 447 409 1273 429 1279 433 1275 427 1281 431 1276 1313 439 407 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1316 405 1307 412 434 1270 1309 413 1310 416 1307 421 435 1276 436 1276 436 1275 427 1283 1307 421 1312 7037 1310 411 1312 407 428 1274 1305 418 1305 420 1303 425 431 1278 434 1277 435 1276 436 1274 1305 423 1310 7006 1310 411 1312 406 429 1274 1305 416 1306 419 1304 423 433 1303 409 1275 427 1284 428 1281 1308 420 1303 7043 1314 407 1305 412 434 1295 1284 412 1310 414 1309 419 427 1308 404 1280 432 1279 433 1275 1314 413 1310 7003 1313 407 1305 413 433 1294 1285 411 1301 424 1309 418 428 1306 406 1304 408 1276 436 1273 1306 421 1302 7041 1306 414 1309 410 425 1301 1278 418 1305 420 1303 424 432 1302 400 1310 402 1282 430 1277 1312 415 1307 7003 1313 407 1305 413 433 1294 1285 410 1302 423 1310 416 430 1304 408 1302 400 1284 428 1279 1310 417 1306 7033 1314 406 1307 412 434 1292 1287 408 1304 420 1303 424 432 1301 401 1308 404 1279 433 1274 1305 422 1311 6995 1311 410 1302 415 431 1295 1284 411 1301 423 1310 416 430 1303 409 1299 403 1280 432 1275 1304 422 1301 7034 1313 406 1307 411 424 1301 1278 417 1305 419 1303 423 433 1299 403 1305 407 1275 427 1281 1308 418 1304 6997 1309 411 1301 416 430 1295 1284 411 1301 422 1301 425 431 1301 401 1307 405 1277 435 1271 1308 418 1305 7028 1308 411 1301 415 431 1294 1285 410 1302 422 1301 425 431 1300 402 1306 406 1276 426 1280 1309 416 1307 6993 1312 407 1305 412 434 1291 1278 416 1307 417 1306 420 426 1306 406 1301 401 1281 431 1275 1304 422 1301 7029 1308 411 1301 415 431 1268 1311 409 1303 420 1303 423 433 1273 429 1278 434 1274 428 1277 1312 414 1309 6989 1306 412 1310 406 429 1270 1309 411 1301 422 1301 424 432 1274 428 1279 433 1275 427 1278 1311 414 1309 7019 1307 411 1301 415 431 1268 1311 408 1304 419 1304 421 435 1271 431 1276 426 1282 430 1275 1304 421 1302 6994 1312 406 1306 410 425 1274 1305 414 1309 414 1339 386 429 1277 425 1281 431 1276 426 1305 1284 414 1309 7018 1308 409 1303 413 433 1267 1302 417 1337 386 1337 388 458 1248 433 1273 429 1278 434 1271 1308 416 1338 6956 1308 410 1333 382 464 1236 1333 386 1337 386 1337 388 458 1248 454 1252 429 1277 435 1270 1340 384 1338 6949 1336 382 1330 386 460 1239 1330 388 1335 388 1335 391 455 1250 462 1244 458 1249 463 1241 1338 386 1336 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1289 402 1282 405 442 1268 1263 400 1284 403 433 1276 418 1242 442 1245 439 1248 446 1240 444 1243 1288 7090 1288 402 1282 405 442 1268 1263 400 1284 402 434 1276 418 1241 443 1244 440 1247 447 1240 444 1243 1288 7090 1288 402 1282 405 442 1269 1262 400 1284 402 445 1267 417 1243 441 1246 438 1249 445 1242 442 1245 1286 7092 1286 403 1291 395 441 1244 1287 402 1282 404 443 1242 442 1245 439 1249 445 1242 442 1245 439 1248 1293 7086 1292 398 1286 401 435 1248 1283 407 1287 399 437 1247 437 1250 444 1243 441 1246 438 1249 445 1242 1289 7090 1288 402 1282 405 442 1269 1262 401 1283 403 444 1268 416 1244 440 1247 437 1250 444 1243 441 1247 1284 7096 1293 397 1287 401 435 1275 1256 407 1287 400 436 1274 410 1250 444 1243 441 1247 437 1250 444 1243 1288 7092 1286 404 1280 408 439 1272 1259 403 1281 406 441 1270 414 1246 438 1250 444 1243 441 1246 438 1250 1291 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1291 399 1285 404 443 1243 1288 401 1283 404 443 1243 441 1245 439 1249 1282 407 440 1246 438 1249 445 7935 1291 401 1283 404 443 1268 1263 400 1284 403 444 1268 416 1245 439 1248 1283 408 439 1272 412 1249 445 7935 1291 400 1284 403 444 1268 1263 400 1284 403 433 1277 417 1244 440 1274 1257 407 440 1272 412 1248 446 7935 1290 401 1283 404 443 1242 1289 400 1284 404 443 1242 442 1245 439 1275 1256 407 440 1246 438 1249 445 7936 1290 400 1284 404 443 1243 1288 400 1284 404 443 1243 441 1245 439 1248 1283 407 440 1246 438 1249 445 7935 1290 401 1283 404 443 1268 1263 401 1283 404 443 1268 416 1245 439 1248 1283 408 439 1273 411 1250 444 7937 1288 403 1281 406 441 1271 1260 403 1281 406 441 1270 414 1247 447 1241 1290 400 436 1275 419 1241 443 7940 1286 405 1289 398 438 1273 1258 404 1280 408 439 1272 412 1249 445 1242 1289 402 435 1276 418 1242 442 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1293 395 1289 398 438 1248 1293 395 1289 398 438 1248 446 1241 443 1245 439 1249 1292 396 440 1245 439 7942 1294 395 1289 398 438 1247 1284 404 1290 397 439 1246 438 1250 444 1243 440 1247 1284 405 442 1244 440 7940 1285 404 1290 396 440 1246 1285 403 1291 396 440 1245 438 1249 445 1242 442 1245 1286 403 444 1242 442 7939 1286 402 1292 395 441 1245 1286 402 1292 394 442 1244 440 1248 446 1241 443 1245 1286 402 445 1242 442 7941 1284 404 1290 397 439 1248 1293 395 1289 398 438 1248 446 1242 442 1246 438 1250 1291 396 440 1247 447 7934 1291 398 1286 401 446 1241 1290 399 1285 402 445 1242 442 1246 438 1250 444 1244 1287 401 446 1241 443 7940 1285 403 1291 396 440 1247 1284 404 1290 397 439 1247 437 1251 443 1245 439 1249 1292 396 440 1246 438 7945 1291 398 1286 401 446 1240 1291 398 1286 401 446 1240 444 1244 439 1248 446 1242 1289 399 437 1249 445 -# +# name: POWER type: parsed protocol: NEC address: 00 00 00 00 command: 46 00 00 00 -# +# name: SPEED+ type: parsed protocol: NEC address: 00 00 00 00 command: 44 00 00 00 -# +# name: ROTATE type: parsed protocol: NEC address: 00 00 00 00 command: 43 00 00 00 -# +# name: TIMER type: parsed protocol: NEC address: 00 00 00 00 command: 16 00 00 00 -# +# name: MODE type: parsed protocol: NEC address: 00 00 00 00 command: 0D 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1308 408 1311 402 442 1250 1314 412 1307 405 449 1242 446 1250 449 1246 453 1243 445 1250 449 1248 1316 7148 1306 411 1308 405 449 1242 1311 415 1304 408 446 1246 453 1244 444 1251 448 1247 451 1244 444 1252 1312 7154 1309 406 1303 410 444 1247 1306 420 1309 404 450 1241 447 1249 450 1247 451 1244 444 1252 447 1249 1315 7150 1314 403 1306 407 447 1245 1308 417 1302 412 442 1250 449 1248 450 1246 442 1254 444 1251 448 1249 1304 7160 1314 429 1280 433 421 1248 1305 445 1284 429 415 1252 447 1250 449 1247 441 1254 445 1252 447 1250 1303 7164 1310 404 1305 410 444 1251 1302 420 1309 404 440 1257 441 1255 443 1252 447 1250 449 1248 440 1256 1307 7159 1304 409 1310 403 441 1254 1309 413 1306 407 447 1248 440 1255 443 1252 446 1249 450 1246 442 1253 1362 7102 1310 404 1305 409 445 1251 1302 420 1310 403 441 1254 444 1251 447 1248 440 1255 443 1253 446 1250 1303 7163 1311 403 1306 408 446 1249 1304 418 1301 412 442 1253 446 1250 449 1248 440 1256 442 1254 445 1251 1302 7162 1302 413 1306 407 447 1248 1305 417 1302 412 442 1254 445 1251 448 1248 440 1256 442 1253 446 1249 1304 7155 1308 405 1304 409 445 1251 1302 420 1309 404 440 1255 443 1253 445 1250 448 1248 440 1255 495 1202 1310 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1317 406 1313 409 445 1250 1324 410 1319 403 451 1243 445 1252 447 1250 500 1196 1316 408 446 1248 451 7997 1311 408 1311 407 447 1245 1319 411 1308 408 446 1248 450 1247 452 1246 453 1244 1309 411 443 1251 448 8000 1308 411 1308 408 446 1247 1317 412 1307 410 444 1248 451 1246 442 1253 446 1251 1313 407 447 1246 452 7995 1313 406 1313 404 450 1244 1320 410 1309 409 445 1248 451 1245 454 1243 445 1251 1313 434 420 1245 453 7992 1317 430 1279 437 417 1251 1313 442 1277 439 415 1252 447 1250 449 1248 451 1247 1317 411 454 1241 447 8003 1315 402 1307 407 447 1244 1309 417 1302 411 443 1249 450 1246 442 1253 446 1251 1313 406 448 1272 416 8004 1315 404 1305 410 444 1277 1286 413 1306 408 446 1274 425 1272 416 1253 446 1278 1286 408 446 1274 425 7994 1314 406 1313 406 448 1273 1291 415 1314 406 448 1274 425 1273 415 1253 446 1252 1312 411 443 1278 421 7997 1312 410 1309 409 445 1275 1289 413 1306 412 442 1279 420 1277 422 1275 424 1273 1280 414 440 1253 446 7999 1309 411 1308 409 445 1250 1303 422 1308 409 445 1250 449 1247 441 1255 444 1252 1312 407 447 1248 440 8004 1315 404 1305 412 442 1253 1311 414 1305 410 444 1250 449 1246 442 1253 446 1250 1314 404 440 1257 442 8001 1307 411 1308 408 446 1248 1305 421 1308 407 447 1247 441 1254 445 1252 447 1250 1314 404 440 1257 442 8005 1314 404 1305 413 441 1254 1310 416 1303 413 441 1254 445 1251 448 1248 440 1257 1307 410 444 1252 447 7998 1310 407 1312 405 439 1255 1309 416 1303 411 443 1251 448 1248 440 1254 445 1250 1303 411 443 1251 448 7994 1304 414 1305 411 443 1251 1302 422 1308 408 446 1248 440 1254 445 1251 448 1248 1305 411 443 1253 446 7997 1312 406 1303 413 441 1253 1311 413 1306 408 446 1248 440 1255 444 1253 446 1251 1313 404 440 1256 443 8002 1307 411 1308 408 446 1248 1305 419 1300 414 440 1254 445 1250 449 1247 441 1255 1309 409 445 1249 450 -# +# name: SPEED+ type: raw frequency: 38000 @@ -762,136 +793,190 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1313 405 1314 405 449 1250 1313 420 1320 406 448 1252 447 1253 446 1254 445 1255 443 1255 1319 404 450 8002 1316 406 1313 409 445 1253 1311 422 1318 407 499 1202 445 1253 446 1253 445 1254 445 1254 1320 404 450 7999 1309 408 1311 406 448 1248 1305 421 1308 411 443 1253 446 1251 447 1249 449 1248 440 1257 1306 409 445 8000 1308 408 1311 405 449 1247 1306 418 1311 405 449 1248 440 1256 443 1253 446 1251 448 1250 1313 404 450 7996 1312 436 1283 407 447 1250 1313 414 1315 405 449 1250 448 1249 449 1248 450 1246 442 1255 1319 402 452 7991 1307 439 1280 412 442 1255 1308 420 1309 411 443 1255 444 1254 445 1253 446 1253 446 1253 1321 406 448 7998 1320 406 1323 403 451 1249 1314 421 1319 408 446 1254 444 1255 443 1255 443 1256 442 1256 1318 408 446 8004 1314 412 1317 409 445 1255 1318 417 1323 404 450 1250 448 1251 447 1252 447 1253 445 1255 1319 407 447 8003 1315 410 1319 407 447 1252 1322 414 1315 410 444 1256 453 1247 451 1248 450 1247 441 1256 1307 438 416 8002 1316 431 1288 429 415 1252 1311 444 1285 431 423 1241 447 1249 449 1247 451 1248 450 1246 1317 402 442 8002 1316 403 1306 411 443 1251 1312 416 1313 404 450 1244 444 1252 447 1251 447 1249 449 1247 1316 402 442 8002 1316 403 1306 410 444 1250 1313 414 1305 410 444 1249 450 1246 452 1244 444 1253 446 1252 1311 407 447 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1292 433 1265 432 406 1261 1286 438 1260 436 413 1255 443 1253 444 1252 435 1260 438 1259 439 1257 1290 7192 1288 436 1262 434 415 1279 1257 440 1258 438 411 1284 414 1256 442 1254 444 1253 445 1252 435 1261 1286 7196 1284 440 1258 438 411 1257 1290 434 1264 432 417 1252 435 1260 438 1259 439 1257 441 1255 443 1253 1283 7198 1292 431 1256 440 409 1259 1288 436 1262 434 415 1253 434 1261 437 1259 439 1257 441 1255 443 1253 1283 7198 1292 431 1256 439 410 1258 1289 435 1263 433 416 1252 435 1261 437 1258 440 1256 442 1254 444 1252 1284 7198 1292 405 1282 440 409 1258 1289 435 1263 433 416 1252 435 1260 438 1258 440 1256 442 1254 444 1252 1284 7196 1284 440 1258 438 411 1257 1290 433 1265 431 407 1260 438 1284 414 1256 442 1254 444 1252 435 1260 1287 7195 1285 438 1260 436 413 1255 1292 405 1282 440 409 1259 439 1257 441 1255 443 1254 444 1252 435 1260 1287 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1287 410 1288 435 414 1281 1255 414 1284 439 410 1259 439 1283 415 1254 444 1252 435 1261 1286 437 412 8042 1287 410 1288 434 415 1255 1281 440 1258 438 411 1258 440 1255 443 1253 434 1261 437 1259 1288 408 441 8039 1290 406 1292 431 407 1262 1285 411 1287 435 414 1256 442 1253 445 1251 436 1260 438 1258 1289 434 415 8039 1290 406 1281 441 408 1287 1260 409 1289 434 415 1254 433 1261 437 1259 439 1283 415 1255 1292 405 433 8046 1283 413 1285 438 411 1285 1262 434 1264 431 407 1288 410 1259 439 1257 441 441 1253 1283 413 436 8044 1285 412 1286 436 413 1257 1290 405 1282 440 409 1287 411 1284 414 1281 417 1253 434 1261 1286 437 412 8042 1287 436 1262 434 415 1281 1256 440 1258 411 438 1258 440 1255 443 1253 434 1261 437 1258 1289 434 415 8039 1290 406 1281 440 409 1287 1260 409 1289 433 416 1253 434 1261 437 1259 439 1256 442 1254 1293 404 434 8046 1283 413 1285 411 438 1257 1290 406 1281 414 435 1287 411 1257 441 1255 443 1253 434 1261 1286 438 411 8042 1287 409 1289 433 416 1280 1257 439 1259 436 413 1256 442 1253 445 1251 436 1286 412 1283 1264 433 416 8037 1292 404 1283 412 437 1285 1262 408 1290 432 417 1278 409 1259 439 1257 441 1255 443 1253 1283 439 410 8043 1285 437 1261 435 414 1281 1255 440 1258 438 411 1283 415 1254 444 1252 435 1260 438 1258 1289 434 414 8038 1291 432 1255 440 409 1286 1261 435 1263 433 416 1251 436 1259 439 1257 441 1255 443 1253 1283 440 409 8044 1284 411 1287 436 413 1254 1293 431 1256 439 410 1257 441 1281 417 1253 434 1261 437 1259 1288 435 413 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1288 437 1260 435 414 1254 1292 431 1256 440 409 1259 438 1258 1288 435 413 1255 442 1253 444 1252 435 8046 1292 431 1256 440 409 1259 1288 436 1261 434 414 1254 443 1253 1283 440 409 1259 438 1258 439 1256 441 8040 1287 436 1261 434 414 1254 1292 431 1256 439 409 1258 491 1204 1291 433 415 1253 434 1261 436 1260 438 8044 1284 440 1257 438 410 1257 1290 434 1263 432 417 1251 436 1259 1287 436 412 1255 442 1254 443 1252 435 8045 1293 431 1256 439 410 1258 1289 435 1262 433 416 1253 434 1261 1285 439 410 1258 440 1256 442 1255 442 8038 1290 433 1264 431 407 1260 1287 437 1261 435 413 1254 443 1253 1283 440 408 1259 439 1257 440 1255 442 8038 1289 434 1263 432 417 1251 1285 438 1260 436 413 1255 442 1253 1283 441 408 1260 438 1258 440 1256 442 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1289 408 1289 434 414 1245 1291 433 1264 432 416 1270 417 1243 444 1243 444 1243 444 1244 443 1244 1292 7134 1291 405 1292 431 417 1242 1294 429 1268 427 411 1248 439 1248 439 1274 413 1247 440 1247 440 1247 1289 8241 1295 400 1287 436 412 1247 1289 434 1263 432 416 1242 445 1242 445 1242 445 1241 446 1241 435 1251 1295 7130 1295 400 1287 436 412 1246 1290 406 1291 431 417 1268 419 1241 446 1241 435 1251 436 1277 410 1250 1286 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1369 328 1296 427 411 1275 1261 436 1261 434 414 1245 442 1245 442 1244 443 1244 443 1244 1291 431 417 7972 1291 404 1293 429 409 1251 1295 400 1287 436 412 1273 414 1246 441 1245 442 1245 442 1245 1290 405 443 9076 1287 408 1289 433 415 1271 1264 430 1267 428 410 1276 411 1249 438 1248 439 1248 439 1274 1261 434 414 7974 1289 406 1291 431 417 1242 1294 428 1259 436 412 1273 414 1273 414 1245 442 1245 442 1244 1292 430 418 -# +# name: POWER type: parsed protocol: NECext address: 00 FC 00 00 command: 80 7F 00 00 -# +# name: SPEED+ type: parsed protocol: NECext address: 00 FC 00 00 command: 85 7A 00 00 -# +# name: MODE type: parsed protocol: NECext address: 00 FC 00 00 command: 81 7E 00 00 -# +# name: TIMER type: parsed protocol: NECext address: 00 FC 00 00 command: 86 79 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1299 409 1271 412 433 1211 1293 416 1274 409 436 1207 462 1207 462 1208 461 1208 461 1209 460 1209 1296 7131 1300 410 1270 386 459 1210 1294 389 1301 382 463 1206 464 1206 463 1207 463 1208 462 1208 461 1209 1295 8208 1302 382 1298 385 460 1208 1297 387 1293 390 455 1213 456 1214 466 1205 465 1205 464 1206 463 1206 1298 7129 1302 382 1298 385 460 1208 1297 387 1293 390 455 1213 457 1213 467 1204 465 1205 464 1205 464 1206 1298 8207 1293 391 1299 383 452 1218 1297 386 1294 388 457 1213 456 1214 455 1215 454 1216 454 1216 453 1217 1298 7130 1290 415 1275 406 429 1219 1296 409 1271 411 434 1212 457 1213 456 1213 456 1214 455 1188 481 1215 1299 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1296 386 1294 414 431 1212 1292 416 1274 409 436 1206 463 1207 462 1207 463 1207 463 1208 1297 411 434 7953 1292 417 1273 408 437 1206 1298 411 1269 413 432 1210 459 1210 459 1211 458 1211 458 1211 1293 415 430 9123 1293 389 1301 407 438 1205 1299 410 1269 412 433 1209 460 1210 459 1210 459 1210 459 1210 1294 388 457 7957 1298 410 1270 413 432 1211 1293 389 1301 408 437 1205 464 1206 463 1206 463 1207 463 1207 1297 385 460 9120 1296 387 1293 416 429 1214 1301 381 1299 410 435 1208 461 1209 460 1209 460 1210 459 1210 1294 414 431 7958 1297 385 1295 414 431 1212 1303 380 1300 409 436 1207 462 1207 463 1207 462 1209 460 1208 1296 386 459 -# +# name: SPEED- type: raw frequency: 38000 duty_cycle: 0.330000 data: 1295 410 1270 411 434 1210 1294 412 1268 414 431 1238 431 1212 1302 405 429 1214 455 1266 1249 406 428 7959 1296 410 1270 412 433 1210 1294 413 1267 414 431 1213 456 1213 1301 405 429 1214 455 1266 1249 406 428 9065 1299 406 1274 408 437 1207 1297 409 1271 411 434 1236 433 1210 1294 412 433 1211 458 1264 1240 414 431 7958 1297 409 1271 411 434 1209 1295 412 1268 414 431 1238 431 1212 1302 405 429 1214 455 1267 1248 407 427 9067 1298 383 1297 410 435 1209 1295 412 1268 414 431 1238 431 1212 1292 415 430 1214 455 1266 1249 407 427 7962 1293 414 1276 406 428 1215 1300 408 1272 410 435 1235 434 1209 1295 411 434 1210 459 1262 1242 413 432 -# +# name: MODE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1300 381 1299 410 435 1208 1296 413 1267 415 430 1213 456 1213 456 1214 455 1214 1301 408 437 1207 462 7950 1295 413 1267 416 429 1214 1301 381 1299 410 435 1208 461 1208 461 1208 461 1208 1296 386 459 1211 458 9008 1296 387 1293 415 430 1213 1301 407 1273 410 435 1208 461 1208 461 1208 461 1208 1296 386 459 1210 459 7952 1293 416 1274 408 437 1206 1298 384 1296 413 432 1211 458 1211 458 1211 458 1211 1304 405 429 1214 455 9013 1301 407 1273 410 435 1259 1245 412 1268 415 430 1264 405 1213 456 1213 456 1213 1301 407 438 1256 403 7958 1297 410 1270 413 432 1262 1253 405 1275 407 427 1267 402 1216 453 1216 453 1216 1298 409 436 1259 410 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1294 412 1268 415 430 1265 1250 408 1272 411 434 1260 409 1210 1294 413 432 1264 405 1213 456 1215 454 7959 1296 411 1269 415 430 1265 1250 408 1271 410 435 1260 409 1234 1270 413 432 1264 405 1238 431 1214 455 9016 1298 410 1270 414 431 1264 1251 407 1273 409 436 1260 409 1260 1244 413 432 1263 406 1237 433 1213 456 7959 1296 412 1268 415 430 1265 1250 407 1273 410 435 1260 409 1234 1270 414 431 1264 405 1214 455 1215 454 9017 1297 411 1269 414 431 1264 1251 407 1273 410 435 1260 409 1209 1295 387 458 1237 432 1213 456 1214 456 7959 1296 413 1267 416 429 1239 1276 409 1271 412 433 1235 434 1211 1304 379 455 1239 430 1215 454 1216 453 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1294 388 1291 390 455 1215 1289 392 1298 384 451 1220 460 1210 459 1210 1294 388 457 1212 457 1212 457 7954 1301 382 1298 384 461 1207 1297 387 1293 389 456 1212 457 1212 457 1213 1291 392 463 1205 465 1205 464 9263 1295 414 1266 417 428 1214 1301 409 1271 412 433 1209 460 1209 460 1210 1294 415 430 1213 456 1213 456 7959 1296 413 1267 415 430 1213 1302 408 1271 411 434 1208 461 1209 460 1209 1295 414 431 1212 457 1213 456 9272 1297 412 1268 415 430 1212 1292 417 1273 410 435 1207 462 1208 461 1208 1296 413 432 1211 458 1211 458 7956 1299 410 1270 413 432 1210 1294 390 1300 409 436 1206 463 1207 463 1207 1298 387 458 1210 459 1211 458 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1251 410 1245 415 407 1252 1246 415 1250 410 412 1247 408 1252 413 1247 408 1252 413 1247 408 1252 1246 7350 1248 438 1227 433 389 1245 1253 434 1221 439 383 1250 415 1245 410 1250 405 1255 410 1249 406 1255 1253 7340 1247 439 1226 407 415 1245 1253 433 1222 412 410 1250 405 1255 410 1249 406 1254 411 1249 406 1254 1254 7340 1247 412 1253 407 415 1245 1253 407 1248 412 410 1250 405 1255 410 1249 406 1254 411 1248 407 1253 1245 7349 1249 411 1254 406 405 1254 1254 406 1249 411 411 1248 407 1252 413 1246 409 1251 414 1245 410 1250 1248 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1250 409 1246 441 381 1252 1246 414 1252 435 387 1246 409 1250 405 1255 1243 417 405 1281 384 1275 380 8188 1244 416 1249 437 385 1249 1249 437 1218 443 379 1253 412 1248 407 1253 1245 415 407 1252 413 1246 409 8186 1246 414 1251 435 387 1272 1226 408 1247 439 383 1276 379 1281 384 1249 1249 437 385 1248 407 1253 412 8181 1251 409 1246 440 382 1277 1221 439 1226 434 378 1255 410 1249 406 1254 1244 416 406 1253 412 1247 408 8187 1245 441 1225 435 387 1273 1225 435 1220 440 382 1251 414 1245 410 1250 1248 412 410 1249 406 1254 411 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1243 444 1221 438 384 1276 1222 438 1217 443 379 1254 411 1274 381 1252 413 1246 409 1251 1247 413 409 8185 1247 440 1225 435 387 1246 1252 408 1247 440 382 1277 388 1245 410 1276 379 1280 385 1249 1249 411 411 8184 1248 412 1243 444 378 1282 1216 444 1221 439 383 1250 405 1254 411 1248 407 1253 412 1248 1250 410 412 8182 1250 410 1245 442 380 1253 1245 415 1250 437 385 1247 408 1252 413 1272 383 1251 414 1272 1226 408 414 8180 1252 409 1246 440 382 1252 1246 440 1225 435 387 1272 383 1250 405 1254 411 1249 406 1254 1244 416 406 8188 1244 416 1249 437 385 1249 1249 411 1244 443 379 1253 412 1273 382 1278 387 1246 409 1251 1247 413 409 -# +# name: SPEED+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1305 379 1283 402 434 1251 431 1253 1276 408 1275 411 435 1249 1280 404 432 1253 1276 408 438 1247 1282 7144 1281 404 1279 407 439 1247 435 1250 1310 375 1307 379 467 1218 1311 374 431 1254 1306 379 436 1249 1311 7119 1305 380 1302 382 464 1222 460 1224 1305 380 1302 382 464 1221 1308 377 469 1217 1302 383 463 1222 1307 7121 1303 380 1303 382 464 1221 462 1223 1306 378 1305 381 465 1220 1309 375 430 1254 1306 380 435 1250 1279 7148 1276 408 1274 411 435 1250 432 1252 1277 408 1274 410 436 1249 1280 404 432 1253 1276 408 438 1247 1282 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1282 402 1281 404 432 1252 430 1254 1275 408 1275 410 436 1248 435 1249 434 1251 1278 405 431 1254 439 7984 1277 407 1276 408 438 1246 436 1248 1281 402 1281 403 433 1251 432 1253 430 1254 1275 408 438 1246 437 7985 1276 407 1276 408 438 1246 436 1248 1281 402 1281 403 433 1252 431 1253 440 1245 1274 409 437 1248 435 7990 1333 351 1332 352 433 1252 431 1254 1326 358 1335 349 436 1249 434 1250 433 1252 1328 355 440 1244 438 7984 1328 355 1328 356 439 1245 438 1247 1333 350 1333 351 434 1250 433 1252 431 1253 1327 357 438 1246 437 7988 1273 410 1273 411 435 1249 434 1250 1279 405 1278 406 440 1244 439 1246 436 1247 1282 402 434 1251 432 -# +# name: TIMER type: raw frequency: 38000 duty_cycle: 0.330000 data: 1282 403 1279 405 431 1254 439 1246 1273 412 434 1251 432 1254 1275 410 436 1249 433 1251 431 1254 1275 7152 1283 402 1281 405 431 1254 439 1246 1273 412 434 1251 432 1254 1305 379 436 1249 433 1252 430 1254 1306 7122 1302 382 1311 374 462 1223 459 1226 1303 381 465 1221 461 1223 1306 379 467 1218 464 1221 461 1224 1305 7123 1312 373 1310 375 461 1224 469 1216 1303 381 465 1221 461 1223 1306 379 467 1218 464 1221 461 1224 1305 7123 1312 374 1308 376 460 1225 468 1218 1311 374 462 1223 459 1226 1303 382 464 1222 460 1224 469 1217 1302 7128 1306 379 1303 382 464 1221 461 1224 1305 380 466 1219 463 1221 1277 408 469 1217 465 1219 463 1222 1307 7122 1282 403 1279 405 462 1223 459 1226 1283 402 465 1221 461 1224 1274 410 467 1218 464 1221 461 1224 1274 7155 1280 405 1278 408 438 1247 435 1250 1279 406 440 1245 437 1249 1280 405 431 1255 438 1249 433 1252 1277 -# +# name: ROTATE type: raw frequency: 38000 duty_cycle: 0.330000 data: 1279 406 1307 377 438 1246 436 1249 1311 373 463 1221 462 1224 469 1216 466 1218 465 1220 463 1222 460 7967 1304 380 1303 382 464 1221 462 1223 1276 409 468 1217 466 1220 463 1223 459 1225 468 1217 465 1220 462 7966 1275 410 1303 382 464 1220 463 1222 1276 409 468 1218 465 1220 463 1223 459 1225 468 1217 435 1250 463 7965 1306 378 1304 381 465 1220 463 1222 1307 378 468 1217 465 1219 433 1253 440 1245 437 1248 434 1251 462 7966 1275 411 1282 404 432 1254 439 1248 1281 404 432 1254 439 1247 436 1250 433 1253 440 1246 437 1248 435 7995 1276 409 1284 402 434 1252 431 1255 1274 411 435 1251 431 1254 439 1247 436 1250 433 1253 440 1246 436 7992 1279 407 1276 410 436 1249 433 1252 1277 409 447 1238 434 1252 431 1254 439 1247 435 1250 433 1253 440 7990 1281 404 1278 406 440 1245 438 1249 1280 405 441 1245 437 1248 435 1251 432 1254 439 1247 435 1250 433 +# +name: POWER +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 01 00 00 00 +# +name: SPEED+ +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 05 00 00 00 +# +name: SPEED- +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 1B 00 00 00 +# TIMER DOWN +name: TIMER +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 09 00 00 00 +# Swing +name: ROTATE +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 03 00 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1397 357 1370 357 500 1188 1427 331 1343 383 473 1240 476 1240 476 1240 475 1240 475 1240 475 1240 1370 7358 1367 361 1366 361 496 1220 1366 361 1366 361 496 1220 495 1220 495 1220 495 1221 494 1220 495 1220 1366 7361 1365 361 1366 361 495 1221 1365 362 1365 362 494 1221 494 1221 494 1220 495 1220 495 1221 494 1220 1365 7361 1364 361 1366 362 494 1221 1365 362 1365 362 494 1221 494 1221 494 1221 494 1221 494 1221 494 1221 1365 7361 1364 362 1364 362 494 1221 1364 362 1365 362 495 1221 494 1221 494 1221 494 1221 494 1221 494 1221 1364 7361 1364 363 1364 363 493 1222 1364 363 1363 363 493 1223 492 1223 492 1223 492 1247 468 1223 492 1247 1339 7386 1338 388 1338 388 468 1247 1339 388 1338 388 468 1248 467 1247 468 1247 468 1247 468 1248 467 1247 1338 7387 1337 389 1338 389 467 1248 1338 389 1337 389 467 1248 467 1248 467 1248 467 1248 467 1248 467 1248 1337 7388 1336 389 1337 389 467 1249 1336 390 1337 390 466 1249 466 1249 466 1249 466 1249 466 1249 466 1248 1337 7388 1312 414 1312 414 465 1251 1335 391 1337 390 441 1274 441 1274 465 1249 464 1250 442 1274 441 1273 1337 7388 1311 414 1312 415 441 1274 1311 415 1311 415 441 1274 441 1274 441 1274 441 1274 441 1274 441 1274 1311 7413 1311 415 1312 415 441 1274 1311 415 1311 416 440 1275 440 1275 440 1275 440 1275 440 1275 439 1275 1310 7414 1309 416 1310 417 439 1276 1310 417 1309 417 438 1277 438 1277 438 1277 438 1301 413 1301 414 1301 1285 7439 1284 442 1284 442 414 1301 1284 443 1283 443 413 1302 413 1302 413 1302 413 1302 412 1302 413 1302 1283 7441 1283 443 1284 443 412 1303 1283 444 1282 444 412 1303 411 1303 412 1303 412 1303 412 1303 412 1303 1283 7441 1282 445 1281 445 411 1304 1282 470 1256 471 385 1330 385 1330 385 1330 385 1330 385 1330 385 1330 1256 7468 1255 471 1256 471 384 1331 1255 471 1255 472 383 1331 384 1331 383 1332 383 1332 383 1331 383 1332 1254 7470 1253 498 1228 499 356 1358 1228 499 1227 499 356 1359 356 1359 356 1359 356 1359 355 1360 355 1359 1227 7497 1226 526 1200 527 327 1387 1200 527 1199 554 300 1414 301 1415 299 1415 299 1415 300 1416 299 1415 1172 7553 1170 609 1117 583 270 1471 1117 637 1089 692 118 10334 871 +# Osc +name: ROTATE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1395 358 1369 358 499 1215 1399 331 1341 384 472 1241 474 1240 475 1240 1345 383 473 1240 474 1240 474 8239 1366 387 1339 387 469 1246 1339 388 1339 387 469 1246 469 1246 469 1246 1339 388 469 1246 469 1246 469 8242 1339 387 1339 387 469 1246 1339 387 1339 387 469 1246 469 1246 469 1246 1339 387 469 1246 469 1246 468 8243 1338 388 1338 388 469 1246 1339 388 1338 388 468 1246 468 1246 469 1247 1338 388 468 1246 468 1247 468 8243 1338 388 1338 388 468 1246 1338 388 1338 388 468 1246 469 1246 468 1246 1339 387 469 1246 468 1246 468 8218 1363 363 1363 363 493 1222 1363 363 1363 363 493 1222 493 1222 492 1222 1363 363 493 1221 493 1222 493 8217 1363 363 1363 363 493 1222 1363 363 1363 363 493 1246 468 1223 492 1223 1361 375 481 1247 467 1247 467 8243 1337 388 1338 388 468 1247 1337 389 1337 388 468 1247 468 1247 468 1247 1337 389 467 1248 466 1248 466 8243 1337 389 1337 389 467 1248 1336 389 1337 390 466 1248 466 1248 466 1248 1336 390 466 1248 466 1248 466 8244 1336 390 1311 415 465 1249 1336 390 1336 391 465 1250 465 1249 465 1250 1310 415 465 1250 464 1250 439 8270 1310 416 1310 416 440 1275 1310 417 1309 417 438 1300 414 1301 413 1301 1284 442 414 1301 413 1301 413 8297 1284 442 1284 442 413 1301 1284 443 1283 443 413 1302 412 1302 412 1302 1282 443 413 1302 412 1302 412 8298 1282 443 1283 443 413 1302 1283 443 1283 444 412 1303 411 1303 411 1303 1282 444 412 1303 411 1303 411 8299 1280 445 1281 470 385 1329 1255 470 1256 471 384 1330 384 1329 385 1329 1255 471 385 1330 384 1330 384 8326 1253 472 1254 472 384 1331 1253 473 1253 499 356 1357 357 1358 356 1358 1226 499 356 1358 356 1359 355 8355 1224 502 1224 501 355 1385 1199 527 1199 527 328 1386 328 1386 328 1386 1199 527 328 1387 327 1387 327 8409 1171 554 1172 555 300 1414 1172 555 1171 555 300 1416 299 1416 298 1415 1171 556 298 1442 272 1442 272 8438 1143 583 1143 583 271 1471 1115 611 1115 664 179 1536 178 1563 122 1619 1006 +# +name: SPEED+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1395 359 1367 358 499 1213 1368 359 1366 359 473 1239 474 1239 474 1238 475 1238 1368 360 497 1215 497 8209 1362 364 1361 366 492 1221 1360 366 1359 366 491 1222 492 1222 491 1221 493 1245 1336 366 492 1222 492 8213 1360 366 1359 389 468 1222 1359 367 1358 390 467 1246 468 1246 468 1245 468 1246 1335 390 467 1246 467 8238 1335 390 1335 390 468 1246 1335 390 1335 390 467 1246 467 1246 468 1246 467 1246 1335 390 467 1246 467 8238 1334 390 1335 390 467 1247 1334 390 1335 391 466 1247 466 1247 466 1247 466 1247 1334 390 467 1247 466 8239 1334 391 1334 391 466 1247 1334 391 1334 391 467 1247 466 1247 466 1247 466 1248 1333 391 466 1248 465 8239 1333 392 1333 392 466 1248 1333 392 1333 392 465 1248 465 1248 465 1248 465 1248 1333 392 465 1248 465 8240 1332 392 1333 392 465 1248 1333 393 1332 393 464 1249 464 1249 464 1249 464 1249 1331 393 465 1249 464 8241 1331 393 1332 393 464 1250 1331 394 1331 394 463 1250 463 1251 462 1250 463 1251 1329 396 462 1251 462 8243 1305 420 1305 444 436 1277 1280 444 1281 445 435 1277 412 1301 436 1277 435 1277 1280 445 436 1277 436 8268 1280 445 1279 445 412 1301 1280 445 1280 445 411 1302 411 1302 411 1302 411 1302 1279 446 411 1302 411 8293 1278 446 1279 446 411 1303 1278 447 1277 447 410 1303 410 1304 409 1329 384 1329 1252 472 385 1329 384 8320 1252 473 1251 473 383 1330 1251 473 1252 473 384 1330 383 1330 383 1330 383 1330 1251 474 382 1330 383 8321 1250 474 1251 475 381 1331 1250 500 1224 500 356 1358 355 1358 355 1358 355 1358 1223 501 355 1358 355 8349 1223 502 1222 528 327 1386 1196 528 1196 530 326 1386 327 1387 326 1386 327 1413 1169 556 299 1414 299 8404 1169 556 1168 584 271 1441 1141 611 1113 637 216 1498 215 1524 178 1562 122 1564 1058 11171 970 # +name: TIMER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1366 359 1366 360 496 1214 1367 360 1395 331 524 1185 474 1239 474 1238 475 1238 475 1238 1343 383 498 8205 1366 386 1338 386 470 1244 1338 386 1339 386 470 1243 470 1244 469 1244 469 1243 470 1244 1338 386 470 8234 1338 386 1339 386 469 1244 1338 386 1339 386 470 1243 470 1220 493 1219 494 1243 470 1244 1338 362 494 8233 1339 362 1363 386 469 1244 1338 386 1339 386 469 1244 469 1244 469 1244 469 1244 469 1244 1338 387 468 8234 1338 386 1338 387 468 1244 1338 387 1337 387 468 1244 469 1244 468 1245 469 1244 469 1244 1338 387 468 8234 1337 387 1338 387 465 1247 1338 387 1338 387 468 1245 468 1244 444 1269 468 1246 467 1245 1337 387 468 8235 1337 387 1337 388 468 1245 1336 388 1336 388 466 1246 467 1245 468 1245 467 1247 467 1245 1312 412 467 8235 1312 412 1312 412 443 1270 1335 390 1311 412 468 1246 466 1246 467 1246 467 1246 467 1246 1311 412 467 8236 1311 413 1311 413 442 1271 1311 413 1311 413 442 1271 466 1247 466 1246 442 1271 442 1271 1311 413 442 8260 1311 413 1311 413 442 1271 1311 413 1311 414 441 1271 442 1271 465 1248 464 1249 465 1247 1310 414 441 8261 1334 390 1310 414 466 1247 1335 390 1333 391 465 1248 465 1248 465 1248 465 1248 465 1248 1334 390 465 8237 1334 391 1333 390 465 1248 1309 415 1309 416 464 1249 464 1249 463 1250 462 1275 438 1274 1307 394 438 8287 1283 441 1283 441 438 1274 1283 441 1283 442 436 1276 414 1299 438 1275 413 1300 412 1300 1282 442 413 8289 1282 443 1281 443 412 1301 1281 443 1281 443 412 1301 411 1302 411 1302 410 1327 385 1327 1255 469 386 8316 1255 470 1254 470 385 1327 1255 470 1254 470 385 1327 385 1328 384 1328 385 1328 385 1328 1254 470 385 8317 1253 471 1253 470 385 1329 1253 471 1253 471 384 1329 383 1330 382 1330 382 1330 383 1330 1252 473 382 8344 1226 498 1226 498 357 1356 1226 498 1226 498 356 1356 356 1356 356 1356 356 1356 356 1356 1226 499 355 8346 1224 499 1225 525 329 1384 1198 526 1198 525 329 1384 328 1384 328 1384 328 1384 329 1384 1198 526 328 8373 1198 526 1198 527 327 1385 1197 553 1171 553 301 1412 300 1412 300 1412 300 1386 327 1412 1170 554 299 8401 1170 554 1170 555 298 1414 1169 581 1143 582 271 1440 272 1440 272 1440 272 1441 271 1441 1142 609 244 8458 1113 636 1088 663 178 1507 1088 691 1033 +# diff --git a/assets/resources/infrared/assets/projectors.ir b/assets/resources/infrared/assets/projectors.ir index 1e4f6f01e..3f9a5f8a4 100644 --- a/assets/resources/infrared/assets/projectors.ir +++ b/assets/resources/infrared/assets/projectors.ir @@ -1,332 +1,356 @@ Filetype: IR library file Version: 1 -# Last Updated 8th Sep, 2022 -# +# Last Updated 17th Sept, 2022 +# +# ON +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 529 7218 126 6585 219 703 180 5362 427 18618 177 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9069 4362 622 486 621 487 621 491 622 1608 623 1603 622 487 621 487 621 491 622 1604 621 487 622 491 622 1604 621 491 622 1608 622 1609 621 1604 622 486 622 487 621 491 621 1605 621 487 621 491 622 1604 622 491 621 1609 621 1609 621 1604 622 491 621 1609 622 1604 621 491 621 1604 622 487 621 487 622 486 622 487 621 488 621 487 621 488 620 491 621 1609 622 1609 620 1609 621 1609 621 1609 621 1609 621 1609 621 1618 621 14330 9047 2137 620 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9047 4362 621 486 622 463 645 490 622 1609 622 1604 622 487 620 487 621 491 622 1604 622 484 625 490 621 1605 649 463 621 1609 620 1611 621 1608 622 1605 621 486 622 491 622 1604 621 487 621 492 620 1604 621 488 621 492 620 1609 622 1604 621 492 622 1609 620 1605 621 491 622 1603 622 488 621 488 620 488 620 488 621 488 620 487 622 485 621 492 596 1635 621 1609 622 1585 643 1611 620 1608 621 1610 619 1611 620 1619 619 14332 9074 2109 647 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9073 4336 648 461 647 484 624 489 623 1607 623 1603 622 486 622 486 622 491 622 1604 621 487 621 491 622 1604 622 491 621 1609 621 1609 621 1609 621 1608 622 1609 621 1604 621 486 622 486 622 491 622 1604 622 486 622 487 621 487 621 491 622 1608 622 1609 621 1604 622 491 621 1604 621 487 621 486 622 487 621 487 621 487 621 487 621 487 621 491 622 1608 622 1608 622 1609 621 1608 622 1608 622 1608 622 1609 621 1617 622 14330 9047 2137 620 # ON name: POWER type: parsed protocol: NECext address: 83 F4 00 00 command: 4F B0 00 00 -# +# name: POWER type: parsed protocol: NECext address: 80 19 00 00 command: 10 EF 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 80 19 00 00 command: 1C E3 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 80 19 00 00 command: 46 B9 00 00 -# +# name: POWER type: parsed protocol: NEC address: 80 00 00 00 command: 51 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 40 40 00 00 command: 0A F5 00 00 -# +# name: POWER type: parsed protocol: NECext address: 00 30 00 00 command: 4E B1 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 00 30 00 00 command: 0E F1 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 00 30 00 00 command: 0D F2 00 00 -# +# name: POWER type: parsed protocol: NECext address: 00 30 00 00 command: 4F B0 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 00 30 00 00 command: 14 EB 00 00 -# +# name: POWER type: parsed protocol: NECext address: 08 16 00 00 command: 87 78 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 08 16 00 00 command: C8 37 00 00 -# +# name: POWER type: parsed protocol: NEC address: 01 00 00 00 command: 01 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 01 00 00 00 command: 02 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 01 00 00 00 command: 28 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 01 00 00 00 command: 29 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 84 F4 00 00 command: 0B F4 00 00 -# +# name: POWER type: parsed protocol: NECext address: 33 00 00 00 command: 00 FF 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 33 00 00 00 command: 1E E1 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 33 00 00 00 command: 1D E2 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 33 00 00 00 command: 0B F4 00 00 -# +# name: POWER type: parsed protocol: NECext address: 83 55 00 00 command: 90 6F 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 83 55 00 00 command: 99 66 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 83 55 00 00 command: 98 67 00 00 -# +# name: POWER type: parsed protocol: NECext address: 00 DF 00 00 command: 1C E3 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 00 DF 00 00 command: 4F B0 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 00 DF 00 00 command: 4B B4 00 00 -# +# name: POWER type: parsed protocol: NEC address: 32 00 00 00 command: 02 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 32 00 00 00 command: 2E 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 32 00 00 00 command: 52 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 20 00 00 00 command: 41 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 20 00 00 00 command: 51 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 20 00 00 00 command: 56 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 20 00 00 00 command: 5A 00 00 00 -# +# name: POWER type: parsed protocol: SIRC15 address: 54 00 00 00 command: 15 00 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 83 F4 00 00 command: 82 7D 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 83 F4 00 00 command: 83 7C 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 83 F4 00 00 command: 14 EB 00 00 -# +# name: POWER type: parsed protocol: NEC address: 31 00 00 00 command: 91 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 31 00 00 00 command: 90 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 31 00 00 00 command: D0 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 31 00 00 00 command: 89 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 86 00 00 00 command: 00 00 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 86 00 00 00 command: 30 00 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 86 00 00 00 command: 31 00 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 86 00 00 00 command: 32 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 30 00 00 00 command: 00 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 87 4E 00 00 command: 0D 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9032 4479 597 560 572 558 564 566 566 1666 589 1671 594 562 570 560 562 568 564 1669 596 560 562 568 564 1669 596 560 562 1671 594 1666 588 1671 594 562 570 560 562 568 564 1669 596 560 562 568 564 566 566 563 569 1664 591 1669 596 1664 590 565 567 1667 598 1661 593 1666 588 1671 594 562 570 560 562 568 564 565 567 563 569 560 562 568 564 565 567 1666 588 1671 594 1665 589 1670 595 1665 590 1669 596 1664 590 1668 597 13983 9029 2222 599 96237 9030 2221 589 96244 9034 2217 594 96244 9033 2218 592 96249 9038 2213 597 96239 9037 2214 596 96238 9028 2223 598 96221 9032 2215 595 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9034 4482 593 563 569 561 571 559 563 1698 566 1694 570 559 563 568 564 566 566 1695 569 560 572 559 563 1671 593 563 569 1692 562 1671 593 1693 571 558 564 567 565 565 567 1693 571 532 590 567 565 1695 569 560 562 1698 566 1694 570 1663 591 539 593 1693 571 1688 566 564 568 1691 563 567 565 565 567 563 569 561 571 559 563 567 565 565 567 563 569 1690 564 1695 569 1691 563 1696 568 1691 563 1697 567 1692 562 1697 567 13988 9030 2223 597 96250 9035 2219 591 96245 9032 2221 589 96240 9038 2215 595 96235 9033 2220 590 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 9028 4482 593 563 569 561 571 558 564 1696 568 1690 564 566 566 563 569 561 571 1688 566 563 569 561 571 1688 566 563 569 1690 564 1695 569 1689 565 1668 596 560 562 568 564 1695 569 560 562 568 564 1695 569 560 562 568 564 1695 569 1690 564 566 566 1692 572 1687 567 563 569 1690 564 566 566 564 568 562 570 559 563 567 565 565 567 562 570 560 562 1696 568 1665 589 1670 594 1665 589 1670 594 1664 590 1669 647 1612 590 13987 9031 2220 590 96223 9033 2217 593 96223 9034 2218 592 96225 9032 2219 591 96221 9087 2164 595 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 9031 4479 596 560 572 558 564 566 566 1693 571 1688 566 563 569 561 571 559 563 1696 568 561 571 559 563 1697 567 562 570 1689 565 1694 570 1688 566 1693 571 1661 593 1693 571 558 564 566 566 564 568 1691 563 541 591 564 568 562 570 560 562 1697 567 1692 562 1696 568 562 570 1689 565 564 568 561 571 559 563 567 565 564 568 562 570 560 562 567 565 1694 570 1689 565 1694 570 1688 566 1693 571 1688 566 1693 571 1662 592 13987 9031 2220 590 96231 9034 2217 593 96234 9030 2222 588 96247 9037 2215 595 -# +# name: VOL+ type: parsed protocol: NEC address: 32 00 00 00 command: 11 00 00 00 -# +# name: VOL- type: parsed protocol: NEC @@ -338,22 +362,52 @@ type: parsed protocol: NECext address: 83 F4 00 00 command: 4E B1 00 00 -# +# name: POWER type: parsed protocol: NEC address: 03 00 00 00 command: 1D 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 03 00 00 00 command: 11 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 03 00 00 00 command: 15 00 00 00 -# +# OFF +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9075 4307 677 433 675 456 651 461 651 1579 650 1576 649 459 649 460 648 465 648 1578 647 461 622 491 622 1604 647 465 647 1583 622 1608 647 1579 647 461 647 466 622 1604 647 465 647 1579 647 461 645 463 648 465 648 1583 646 1580 646 466 647 1579 622 491 647 1583 622 1608 647 1579 647 461 647 461 622 486 622 486 647 461 647 462 646 462 622 491 646 1584 622 1608 647 1584 621 1608 647 1583 646 1584 647 1584 646 1592 622 14330 9047 2137 621 +# +name: POWER +type: parsed +protocol: Samsung32 +address: 07 00 00 00 +command: E6 00 00 00 +# +name: VOL+ +type: parsed +protocol: Samsung32 +address: 07 00 00 00 +command: 07 00 00 00 +# +name: VOL- +type: parsed +protocol: Samsung32 +address: 07 00 00 00 +command: 0B 00 00 00 +# +name: MUTE +type: parsed +protocol: Samsung32 +address: 07 00 00 00 +command: 0F 00 00 00 +# diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index 5681f1aa8..4a60dfdb4 100755 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -1,37 +1,85 @@ Filetype: IR library file Version: 1 -# Last Updated 13th Sept, 2022 -# +# Last Updated 25th Sept, 2022 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3398 1660 464 419 435 1253 434 423 441 417 436 420 434 424 440 417 437 421 433 424 440 417 437 421 433 425 439 418 436 1252 435 422 432 427 437 420 434 424 440 417 436 421 433 424 440 417 437 421 433 1255 432 426 438 419 435 423 431 426 438 420 434 423 431 427 437 421 433 1228 459 425 439 1249 438 1250 437 1225 462 1226 461 422 432 426 438 1224 463 421 433 1229 458 1230 457 1257 440 1221 466 392 462 1224 463 72803 3397 1661 463 421 433 1255 432 426 438 419 435 423 431 427 437 420 434 424 440 417 437 421 433 398 466 418 436 422 432 1256 431 427 437 421 433 424 440 418 436 422 432 425 439 419 435 423 431 426 438 1250 437 421 433 425 439 418 436 422 432 426 438 419 435 423 431 428 436 1252 435 422 432 1257 440 1248 439 1249 438 1224 463 395 458 425 439 1249 438 419 435 1227 460 1255 432 1256 431 1231 466 417 437 1249 438 72803 3398 1687 437 420 434 1255 432 425 439 419 434 397 457 427 437 420 434 424 440 417 436 421 432 425 439 418 436 422 432 1257 440 417 437 422 431 426 438 393 461 423 431 427 437 420 434 424 440 417 436 1225 462 422 432 426 438 419 435 423 431 426 438 420 434 424 440 418 436 1252 435 422 432 1257 440 1247 440 1248 439 1223 464 420 434 424 440 1222 465 418 435 1253 434 1254 433 1229 458 1256 431 427 437 1248 439 72798 3403 1682 432 426 438 1250 437 420 434 424 440 417 436 421 433 425 439 418 436 422 432 425 439 419 435 422 432 426 438 1250 437 420 434 425 439 418 436 422 432 425 439 419 435 422 432 426 438 419 434 1254 433 424 440 417 437 421 432 425 439 418 436 422 432 426 438 420 434 1254 433 425 439 1222 465 1223 464 1224 463 1252 435 422 432 426 438 1250 437 421 433 1255 432 1256 431 1257 440 1221 466 419 435 1250 437 72798 3402 1683 431 426 438 1250 437 421 433 425 439 418 436 422 432 425 439 419 435 423 431 426 438 420 434 423 431 427 437 1251 436 421 433 426 438 419 435 423 431 427 437 420 434 424 440 417 436 421 433 1255 432 425 439 419 435 422 432 426 438 419 435 423 431 427 437 421 433 1255 432 426 438 1250 437 1251 436 1252 435 1254 433 424 440 418 436 1252 435 423 431 1257 440 1247 440 1249 438 1250 437 421 433 1226 461 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3405 1655 458 425 439 1248 438 420 433 424 440 417 436 421 433 425 439 418 435 422 431 426 438 420 433 423 441 417 436 1251 435 422 431 427 437 420 434 424 440 418 435 421 432 425 439 419 434 422 431 1257 440 417 436 421 433 424 440 417 436 421 432 425 439 418 435 423 430 426 438 420 434 424 440 417 436 421 433 1255 432 425 439 418 435 422 431 426 438 419 435 423 430 426 438 1250 437 421 432 1252 435 79433 3405 1680 434 424 440 1221 466 418 435 422 431 426 438 419 434 423 430 427 437 420 434 423 441 417 436 421 433 424 440 1248 439 419 434 423 431 427 437 420 433 424 440 417 436 421 432 424 440 418 435 1251 436 422 431 426 438 419 434 423 430 427 437 420 434 424 440 418 435 421 432 425 439 418 435 422 431 426 438 1223 464 420 434 424 440 417 436 420 434 424 440 417 436 421 432 1255 432 426 438 1247 440 79430 3397 1687 437 420 434 1254 433 425 439 419 434 422 432 426 438 420 433 423 441 417 436 420 433 424 440 417 436 421 432 1256 431 426 438 420 434 424 440 417 436 421 432 425 439 418 435 422 431 425 439 1249 438 420 433 424 440 417 436 421 433 425 439 418 435 422 432 426 438 419 434 423 441 417 436 420 433 424 440 1248 439 418 435 422 431 426 438 419 434 423 430 427 437 420 433 1254 433 425 439 1245 431 79441 3397 1687 437 420 433 1254 433 424 440 418 435 421 432 425 439 418 435 422 431 426 438 419 434 423 431 427 437 420 433 1254 433 425 439 419 434 422 431 426 438 419 434 423 430 427 437 420 433 424 440 1221 466 418 435 422 431 426 438 419 434 423 441 417 436 420 433 425 439 418 436 422 431 426 438 419 434 423 431 1257 440 417 436 421 432 425 439 418 435 422 431 426 438 419 434 1253 434 424 440 1245 431 79442 3395 1688 436 421 433 1255 432 426 438 419 434 423 430 427 437 420 433 424 440 417 436 420 434 424 440 417 436 421 432 1255 432 426 438 420 434 423 441 417 436 420 433 424 440 418 435 421 432 425 439 1249 438 419 435 423 431 427 437 420 434 424 440 417 436 421 433 425 439 418 435 422 432 426 438 419 435 423 430 1256 441 417 436 420 433 424 440 417 436 421 432 425 439 418 435 1253 434 423 441 1245 431 79441 3397 1687 437 421 432 1255 432 425 439 418 435 422 431 426 438 419 434 423 430 427 437 420 434 424 440 417 436 421 432 1255 432 425 439 419 434 423 431 426 438 420 434 423 441 417 436 420 434 424 440 1247 440 418 435 422 432 425 439 419 435 423 431 426 438 419 434 424 440 417 436 421 433 425 439 418 435 422 431 1256 431 426 438 420 433 423 441 417 436 420 434 424 440 417 436 1225 462 421 432 1253 434 79429 3399 1684 440 417 436 1225 462 421 432 425 439 418 435 422 431 425 439 418 435 422 431 426 438 419 435 422 432 426 438 1250 437 420 433 425 439 418 435 421 433 425 439 418 435 421 433 425 439 418 435 1252 435 423 431 426 438 419 434 423 431 427 437 420 434 424 440 417 436 421 432 425 439 418 436 421 432 425 439 1249 438 419 434 423 431 427 437 420 434 424 440 417 436 421 432 1255 432 425 439 1246 441 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3396 1688 436 421 432 1256 431 426 438 420 433 424 440 417 436 421 432 424 440 418 435 422 431 425 439 419 434 422 431 1257 440 417 436 421 432 425 439 418 435 422 431 426 438 419 434 423 430 427 437 1250 436 421 432 425 439 419 434 423 430 426 438 420 434 424 440 418 435 1252 435 423 431 427 437 420 433 424 440 1247 440 418 435 422 431 1256 431 427 437 420 433 424 440 417 436 1252 434 423 430 1254 432 77786 3404 1681 433 425 439 1248 438 419 434 423 430 427 437 420 433 424 440 417 436 421 432 424 440 417 436 421 433 425 439 1248 438 419 434 424 440 417 436 421 432 425 439 418 435 422 431 426 438 420 433 1254 433 424 440 418 435 422 431 426 438 419 434 423 430 426 438 421 432 1254 432 425 439 419 434 423 430 426 438 1250 436 421 432 425 439 1248 438 419 434 423 441 417 436 421 432 1255 432 426 438 1246 441 77777 3402 1682 432 426 438 1250 436 420 433 424 440 417 436 421 432 425 439 419 434 422 431 426 438 419 434 423 441 417 436 1251 436 422 431 426 438 419 434 423 441 417 436 420 433 424 440 417 436 421 432 1255 432 426 438 420 433 423 441 417 436 421 432 424 440 418 435 422 431 1256 441 417 436 421 432 424 440 418 435 1252 435 422 431 426 438 1250 437 421 432 424 440 418 435 421 432 1256 430 426 438 1247 440 +# +name: CH+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3401 1683 431 426 438 1249 438 420 434 424 440 417 436 421 433 424 440 417 436 421 432 425 439 418 435 421 432 425 439 1248 439 418 435 423 431 426 438 420 434 423 431 427 437 420 434 423 431 427 437 1250 437 421 433 424 440 418 436 421 432 425 439 418 435 421 433 426 438 419 435 423 430 1256 431 427 437 1250 437 1224 463 422 432 425 439 419 435 422 431 1256 431 426 438 1249 438 1223 464 420 434 1251 436 76104 3396 1688 436 421 433 1255 432 425 439 418 435 422 432 425 439 419 435 422 431 426 438 419 434 422 432 426 438 419 434 1253 434 424 440 418 435 422 432 425 439 418 435 422 431 426 438 419 434 423 431 1257 440 417 436 421 433 424 440 417 437 421 433 424 440 417 436 422 432 425 439 418 435 1252 435 423 431 1256 441 1247 440 417 436 421 432 425 439 418 435 1252 435 422 432 1256 431 1256 441 417 437 1247 440 +# +name: CH- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3404 1652 462 422 432 1230 457 427 437 420 434 424 440 417 436 420 434 424 440 417 436 421 433 424 440 417 436 421 432 1228 459 425 439 419 434 422 432 426 438 419 434 422 431 426 438 419 435 422 431 1230 457 426 438 420 433 423 431 426 438 420 433 423 430 427 437 420 434 1228 459 424 440 1221 466 418 435 1225 462 1226 461 422 432 426 438 1224 463 420 433 1228 459 399 465 1222 465 1223 464 420 433 1225 462 +# +name: POWER +type: parsed +protocol: NECext +address: BA A0 00 00 +command: 4C B3 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: BA A0 00 00 +command: 01 FE 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: AD ED 00 00 +command: B5 4A 00 00 +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3553 1709 466 407 465 1277 466 407 492 379 464 406 465 406 465 405 466 405 466 406 491 407 463 408 462 409 461 411 460 1284 459 412 460 412 460 412 459 412 459 412 459 412 459 412 460 412 459 412 459 1284 459 412 460 412 459 412 459 413 459 412 460 412 459 412 460 412 459 1285 458 412 459 1285 458 1285 459 1285 458 1285 458 413 458 413 458 1285 458 413 458 1285 459 1285 459 1285 458 1285 458 413 458 1285 458 74570 3544 1715 460 411 460 1284 459 412 459 412 459 412 459 412 460 412 459 412 459 412 459 412 459 412 459 412 460 412 459 1284 459 412 460 412 459 412 459 412 460 412 459 412 459 412 459 412 459 412 460 1284 459 412 459 412 459 412 460 412 459 412 460 412 459 412 460 412 460 1284 459 412 460 1284 459 1284 459 1285 459 1285 458 413 458 413 458 1285 459 412 459 1285 458 1285 458 1285 459 1285 459 412 459 1284 459 74570 3544 1715 459 413 458 1285 459 412 459 412 459 413 459 413 458 413 458 413 459 413 458 413 458 413 459 413 458 413 458 1285 459 413 459 413 458 413 458 413 459 413 458 413 459 413 458 413 458 413 459 1285 458 413 458 413 458 413 459 413 458 413 458 413 459 413 459 413 458 1285 459 413 458 1285 459 1285 459 1285 458 1285 458 413 458 413 458 1285 459 413 458 1285 458 1285 458 1286 457 1286 458 414 458 1286 457 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3554 1678 495 403 468 1248 495 403 497 374 497 375 497 374 497 374 497 375 496 375 496 375 495 377 493 378 492 380 490 1254 489 383 488 383 489 383 488 383 488 383 488 383 489 383 488 383 489 383 488 1255 488 383 488 384 488 383 488 384 487 384 487 384 487 384 488 384 488 384 487 1256 487 384 488 384 487 1256 488 1256 488 384 487 384 487 384 488 1256 487 384 488 384 487 1257 487 1257 487 385 486 1257 487 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3554 1678 495 404 467 1249 524 374 497 374 497 374 497 374 497 374 497 375 496 375 495 376 494 377 493 379 491 381 489 1255 488 383 488 383 488 383 489 383 488 383 488 383 488 383 489 383 488 383 489 1255 488 383 489 383 488 383 489 383 488 383 488 384 488 383 489 383 488 384 488 384 487 383 488 384 487 384 488 1256 488 384 487 384 487 384 488 384 487 384 487 384 488 384 487 1256 487 384 488 1256 487 75630 3547 1686 487 384 487 1281 462 409 463 409 462 409 462 410 462 409 462 409 463 409 463 410 461 410 461 410 462 410 461 1282 462 410 461 410 461 410 462 410 461 410 461 410 462 410 461 410 461 410 461 1282 462 410 462 410 461 410 461 410 461 410 462 410 462 410 461 410 461 410 462 410 462 410 461 410 462 410 461 1282 462 410 461 410 461 410 461 410 461 411 461 410 461 411 461 1282 461 411 461 1283 460 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3585 1649 524 374 497 1245 498 373 498 374 497 375 496 375 496 375 496 375 496 375 496 376 494 378 492 379 491 381 490 1255 489 383 488 383 488 383 489 383 488 383 488 383 488 383 488 383 489 383 488 1255 488 383 488 383 488 383 489 383 488 383 488 383 488 383 488 383 488 1256 488 384 488 384 487 384 487 384 487 1256 487 384 488 384 488 1256 487 384 488 408 463 385 487 384 487 1257 486 385 486 1257 486 75629 3549 1684 489 383 488 1255 488 383 488 383 489 383 488 383 489 383 488 383 489 383 488 383 489 383 488 383 488 384 488 1255 489 383 488 384 488 384 487 383 488 384 487 383 489 384 487 384 488 384 487 1256 487 384 488 384 487 384 488 384 487 385 486 384 488 385 486 385 486 1257 487 384 487 409 462 386 486 385 486 1257 486 385 486 409 462 1257 487 409 462 409 463 409 462 409 463 1281 462 410 462 1282 461 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3526 1678 495 403 468 1248 496 403 496 375 496 375 497 375 496 375 496 376 495 376 495 376 495 377 493 378 492 380 490 1254 488 384 488 383 488 384 488 384 487 384 487 384 487 384 488 384 487 384 488 1257 486 385 486 385 486 385 487 385 486 386 486 409 462 409 462 410 461 410 462 410 461 1282 462 409 462 1282 462 1282 461 410 462 410 461 410 461 410 462 1282 461 410 462 1282 461 1282 462 410 461 1282 462 -# +# name: CH- type: raw frequency: 38000 @@ -55,3001 +103,3001 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4008 3984 520 1976 517 1980 523 1975 518 1979 514 1016 492 1012 496 1975 518 987 521 1976 517 987 521 1977 516 1014 494 1010 488 990 518 985 523 1008 489 1981 522 1976 517 1013 495 1976 517 987 521 1977 516 987 521 1977 516 8473 4002 3988 516 1979 514 1984 519 1977 516 1982 521 1008 489 988 520 1977 516 988 520 1977 516 988 520 1977 516 987 521 1010 488 989 519 985 523 980 518 2006 487 1984 519 983 514 1983 520 983 515 1983 520 983 515 1982 521 8466 4010 3978 516 1980 523 1974 519 1978 578 1918 522 982 516 1014 494 1977 516 987 521 1976 517 987 521 1976 517 986 522 982 515 1015 493 1011 487 990 518 1979 514 1984 519 984 524 1973 520 984 513 1984 519 983 514 1983 520 -# +# name: POWER type: parsed protocol: SIRC address: 01 00 00 00 command: 15 00 00 00 -# +# name: POWER type: parsed protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 08 00 00 00 command: 05 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 08 00 00 00 command: 00 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 08 00 00 00 command: 01 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 08 00 00 00 command: 02 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 08 00 00 00 command: 03 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 08 00 00 00 command: 0B 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 00 DF 00 00 command: 1C 00 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 00 DF 00 00 command: 4B 00 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 00 DF 00 00 command: 4F 00 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 00 DF 00 00 command: 09 00 00 00 -# +# name: CH- type: parsed protocol: NECext address: 00 DF 00 00 command: 05 00 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 00 DF 00 00 command: 08 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 -# +# name: MUTE type: parsed protocol: Samsung32 address: 0E 00 00 00 command: 0D 00 00 00 -# +# name: VOL+ type: parsed protocol: Samsung32 address: 0E 00 00 00 command: 14 00 00 00 -# +# name: VOL- type: parsed protocol: Samsung32 address: 0E 00 00 00 command: 15 00 00 00 -# +# name: CH+ type: parsed protocol: Samsung32 address: 0E 00 00 00 command: 12 00 00 00 -# +# name: CH- type: parsed protocol: Samsung32 address: 0E 00 00 00 command: 13 00 00 00 -# +# name: POWER type: parsed protocol: RC6 address: 00 00 00 00 command: 0C 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 07 00 00 00 command: 02 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 50 00 00 00 command: 17 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 40 00 00 00 command: 12 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 31 49 00 00 command: 63 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: AA 00 00 00 command: 1C 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 38 00 00 00 command: 1C 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 83 7A 00 00 command: 08 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 53 00 00 00 command: 17 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 18 18 00 00 command: C0 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 38 00 00 00 command: 10 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: AA 00 00 00 command: C5 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 04 00 00 00 command: 08 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 18 00 00 00 command: 08 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 71 00 00 00 command: 08 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 80 6F 00 00 command: 0A 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 48 00 00 00 command: 00 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 80 7B 00 00 command: 13 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 80 7E 00 00 command: 18 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 50 00 00 00 command: 08 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 80 75 00 00 command: 0A 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 80 57 00 00 command: 0A 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 0B 00 00 00 command: 0A 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: AA 00 00 00 command: 1B 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 85 46 00 00 command: 12 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 05 00 00 00 command: 02 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 08 00 00 00 command: 0F 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 00 00 00 00 command: 01 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 07 00 00 00 command: E6 00 00 00 -# +# name: VOL+ type: parsed protocol: Samsung32 address: 07 00 00 00 command: 07 00 00 00 -# +# name: VOL- type: parsed protocol: Samsung32 address: 07 00 00 00 command: 0B 00 00 00 -# +# name: CH+ type: parsed protocol: Samsung32 address: 07 00 00 00 command: 12 00 00 00 -# +# name: CH- type: parsed protocol: Samsung32 address: 07 00 00 00 command: 10 00 00 00 -# +# name: MUTE type: parsed protocol: Samsung32 address: 07 00 00 00 command: 0F 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 634 2571 505 519 479 519 479 518 480 518 480 518 480 518 480 517 481 547 481 517 481 20040 590 2555 501 1007 999 997 510 548 480 486 512 486 512 486 542 485 513 516 482 116758 593 2552 504 1004 992 1004 514 514 514 483 515 513 485 483 545 482 516 482 516 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 525 1955 449 1999 476 4545 446 4544 478 2032 443 2006 469 2011 444 4577 445 4545 447 4574 448 2002 473 4547 444 34913 447 2032 443 2007 478 4542 449 4541 471 2039 446 2004 471 2008 447 4574 448 4543 448 4572 450 2030 445 4545 446 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 2445 582 1221 603 548 602 1191 609 572 602 1191 609 542 607 544 631 1172 603 568 606 545 605 566 608 543 26263 2414 611 1192 607 544 606 1197 602 569 606 1197 602 539 611 540 635 1168 606 565 610 541 608 563 587 564 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3461 1802 439 452 444 1283 469 448 438 453 443 447 439 452 444 419 497 448 438 425 471 419 467 451 445 445 441 450 446 1281 471 420 466 425 471 446 440 424 472 445 461 456 440 451 445 445 441 450 446 1281 471 447 439 451 445 419 467 423 473 445 441 422 494 450 436 428 468 1259 493 425 471 1256 496 1259 472 1281 471 1285 467 423 473 417 469 1286 466 452 444 1283 469 1285 467 1261 491 1263 468 423 493 1260 471 74142 3578 1713 467 423 473 1281 471 420 466 452 444 419 467 424 472 418 488 429 467 451 445 445 441 450 446 444 442 449 437 1290 472 446 440 423 473 445 441 449 467 396 490 428 468 449 447 444 442 448 438 1289 473 445 441 450 446 444 442 449 437 426 470 421 495 422 464 426 470 1257 495 450 446 1254 488 1267 464 1290 472 1282 470 421 465 453 443 1284 468 450 446 1281 471 1283 469 1259 493 1261 470 448 468 1258 473 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 389 1737 280 796 253 744 295 754 274 775 274 776 273 1827 271 1828 270 805 254 1820 278 796 253 797 252 745 294 1806 302 773 245 48942 305 1821 277 798 251 746 303 747 271 778 271 1829 279 796 253 796 253 1821 277 798 251 1823 275 1824 274 1825 273 802 247 1827 271 42824 381 1745 272 804 245 752 297 753 275 773 276 774 275 1825 273 1826 272 803 246 1828 270 805 254 795 244 753 296 1804 294 781 247 48939 379 1746 271 804 245 779 270 753 275 774 275 1825 273 802 247 802 247 1827 271 804 245 1829 279 1820 278 1821 277 798 251 1823 275 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 562 1721 561 594 557 597 564 617 513 615 536 618 543 1715 566 1716 566 1692 559 594 567 588 563 618 543 611 540 615 536 618 543 1715 556 623 538 617 534 621 530 624 516 638 513 642 509 1722 560 620 541 1717 565 1692 559 1724 568 1715 556 1701 560 1723 559 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8436 4189 538 1563 566 1559 539 510 559 543 516 507 542 560 509 540 509 567 512 1586 512 1562 567 1559 539 536 533 1566 542 507 562 513 536 540 509 22102 647 1478 559 1568 540 508 541 535 534 515 534 568 511 538 511 539 540 1585 513 1560 559 1567 541 534 535 1564 534 515 534 568 511 538 511 22125 644 1482 565 1561 537 511 538 564 515 508 541 535 534 541 508 516 563 1588 510 1563 556 1570 538 510 559 1567 541 534 515 535 534 541 508 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 929 825 1711 934 797 930 791 909 822 932 789 938 793 934 797 930 791 1719 899 856 1711 907 824 90848 923 830 1706 912 819 908 823 931 790 910 822 933 788 912 819 935 796 1714 904 850 1707 939 792 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 448 2031 444 2005 480 4540 452 4539 473 2037 438 2011 474 2006 449 4571 451 4539 453 4568 444 2036 449 4541 451 34906 527 1953 451 1998 477 4543 449 4542 480 2030 445 2004 471 2009 446 4575 447 4543 449 4572 450 1999 476 4545 446 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 9021 4496 567 1664 567 1690 561 567 533 1698 563 1667 564 1693 568 1663 568 586 534 567 563 565 535 594 536 591 539 589 531 571 539 563 567 1690 541 560 560 594 536 592 538 564 536 1695 566 1664 567 1690 561 1670 561 1696 555 1675 566 562 558 596 514 562 568 559 561 594 536 565 535 593 537 591 539 1665 566 1692 559 1671 560 1697 564 1666 565 1666 565 1693 558 1672 569 23181 9013 4504 569 1689 542 1689 562 565 535 1697 564 1666 646 1610 560 1672 559 595 535 593 537 590 510 566 564 590 540 588 532 596 514 588 542 1689 542 560 560 594 536 592 538 590 510 1694 567 1664 567 1690 561 1669 562 1695 556 1675 566 561 559 596 514 588 542 585 535 593 537 591 509 593 537 591 539 1665 566 1692 559 1671 560 1697 564 1667 564 1667 564 1693 558 1672 569 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8041 3979 513 536 482 515 513 1559 509 515 514 1560 508 515 514 509 509 514 484 4000 533 1566 512 537 481 1566 512 537 481 1566 512 537 481 516 513 537 481 24150 8044 3977 505 518 510 539 479 1567 511 512 506 1568 510 539 479 543 485 538 480 3977 536 1564 514 534 484 1563 515 508 510 1563 515 508 510 540 489 534 484 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 383 2027 295 2112 271 2138 266 890 271 887 294 926 235 2114 300 887 274 915 236 2145 269 887 274 884 297 923 238 920 241 917 264 895 266 26573 384 2026 296 2111 273 2136 268 889 272 886 295 924 237 2113 301 886 275 914 237 2144 270 886 275 914 267 921 240 919 242 916 265 924 237 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 177 8474 175 5510 174 8476 173 8477 177 8504 171 5515 175 8476 178 8472 177 8473 176 5541 174 8476 173 45583 171 8481 178 5507 177 8473 176 8474 175 8506 173 5512 172 8478 176 8475 174 8476 178 5538 177 8474 175 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8044 3976 506 517 511 1563 505 517 511 538 480 517 511 538 460 563 455 568 460 3993 530 545 483 1564 514 1559 509 1564 514 509 509 540 488 535 483 513 505 24150 8043 3978 514 509 509 1564 514 509 509 540 478 519 509 540 458 565 464 559 459 3994 529 546 482 1565 513 1560 508 1565 513 510 508 541 487 536 482 541 477 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 558 2942 450 10021 482 2989 484 10015 447 3024 449 10021 472 3100 485 2986 477 2994 500 2999 475 2996 477 2994 479 2992 482 3018 476 2995 479 6464 484 36270 477 3023 450 10020 473 2999 485 10014 448 3022 452 10019 474 3098 478 2994 480 2991 503 2996 477 2994 480 2992 482 2990 484 3015 479 2992 481 6462 485 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 587 2407 476 1062 965 547 482 547 451 577 452 546 452 22108 590 2404 479 1060 967 1028 510 519 509 548 480 487 511 120791 645 2411 472 1066 961 1065 483 515 514 514 504 493 515 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 172 7439 171 7441 169 7443 177 7434 176 7462 178 4887 176 4916 177 4914 169 7469 171 4920 174 4918 175 55174 176 7436 174 7437 173 7439 171 7440 175 7463 172 4894 174 4917 171 4921 172 7465 175 4916 178 4914 169 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 589 2556 500 524 474 554 454 544 454 543 455 543 455 543 455 543 445 583 446 552 446 20046 584 2561 505 1033 485 514 963 518 480 1032 516 512 476 522 506 491 507 522 476 116758 586 2560 506 1033 484 513 964 548 450 1031 507 522 476 521 507 490 508 521 477 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 586 2407 476 1063 964 578 450 548 450 547 481 517 481 577 451 546 452 546 472 556 452 545 453 575 453 514 484 544 484 543 455 14954 510 2483 481 1058 480 548 959 552 446 1067 481 516 512 546 482 515 992 1003 535 493 515 543 486 513 475 522 506 552 446 111671 589 2405 478 1061 477 551 967 514 484 1059 479 549 479 548 480 517 990 1036 512 516 482 546 483 515 503 525 483 544 454 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8444 4180 537 1564 565 1560 538 1561 557 1568 540 1559 539 536 533 542 517 559 510 1563 535 1564 565 1561 537 512 567 1558 540 535 534 1566 542 1557 562 23122 564 1562 557 1569 539 1560 538 1587 542 1558 540 534 535 515 534 541 538 1587 511 1563 566 1560 538 536 533 1567 541 534 515 1585 533 1566 542 23166 561 1565 564 1561 537 1563 535 1590 539 1561 537 538 541 534 515 535 534 1564 534 1566 563 1563 535 540 539 1560 538 511 538 1588 541 1559 539 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 527 1923 481 1998 477 4543 449 4542 470 2040 445 2004 471 2009 446 4575 447 4543 449 4572 450 1999 476 2034 441 34899 524 1956 448 2001 474 4546 446 4545 477 2033 442 2007 478 2002 443 4578 444 4546 445 4575 447 2003 472 2037 448 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 533 1356 437 3474 427 3483 429 3455 436 1454 430 1459 405 28168 510 1379 434 3477 434 3476 425 3459 432 1457 427 1462 402 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 921 833 1714 932 789 938 793 934 797 903 818 909 822 905 816 938 793 1716 902 853 1714 905 816 90856 922 805 1742 931 790 937 794 933 788 939 792 935 796 930 791 937 794 1715 903 825 1742 904 817 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 179 7433 177 4915 178 7434 175 7436 174 7464 176 7435 175 4916 177 4915 173 4918 170 4922 171 4920 173 55174 175 7437 173 4919 174 7437 173 7439 171 7467 173 7438 172 4920 173 4919 174 4917 176 4915 178 4914 169 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 169 6731 176 6748 169 6730 177 6748 169 6755 172 4427 177 4447 178 6721 175 6749 178 4446 168 4456 169 54704 176 6723 174 6750 177 6723 173 6750 177 6747 170 4429 175 4449 176 6723 174 6751 176 4448 177 4447 178 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3506 3494 876 830 840 2576 847 2568 844 862 819 2570 842 864 816 863 818 2570 842 836 844 2572 840 866 815 865 815 2573 839 867 813 866 814 2573 850 857 813 2575 847 2568 844 834 847 2569 843 835 845 2571 872 2571 842 32654 3512 3488 872 834 847 2570 842 2573 839 867 814 2574 849 858 822 857 813 2575 848 859 821 2566 846 832 848 860 821 2567 845 833 848 860 820 2568 844 834 847 2569 843 2572 840 838 843 2574 849 829 841 2575 868 2575 837 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 560 2939 453 10018 475 2996 477 10022 450 3021 452 10018 475 3097 478 6464 483 6460 477 6466 502 6469 479 2993 480 2990 484 36274 564 2936 456 10015 478 2993 481 10020 534 2936 456 10014 479 3093 482 6461 476 6466 482 6461 476 6495 473 2999 485 2986 477 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1617 4604 1559 1537 1560 1537 1560 4661 1533 33422 1613 4607 1566 1530 1556 1540 1536 4685 1539 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 174 4972 177 4910 173 4944 170 6988 174 6984 177 6951 175 6983 174 14269 177 4969 175 4912 176 4941 178 6979 172 6986 175 6953 178 6980 171 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 174 7067 176 10544 1055 719 1053 739 1054 738 953 822 1052 2566 169 3435 171 3431 175 3446 170 3432 174 3446 170 3432 174 3428 178 3442 174 3429 177 3425 171 39320 2323 4900 178 10543 1056 719 1053 739 1054 738 953 821 1053 2566 169 3435 171 3431 175 3445 171 3432 174 3446 170 3432 174 3428 178 3442 174 3428 178 3425 171 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3506 3492 868 839 841 2575 848 858 822 2566 846 832 848 859 821 858 812 2576 847 860 820 2567 845 833 847 860 821 2568 844 862 818 2570 842 864 817 2571 841 2574 849 2567 845 861 820 2568 845 834 847 2570 873 2570 842 34395 3503 3496 874 833 847 2568 845 834 847 2570 842 864 816 835 846 862 819 2569 843 835 846 2571 841 865 816 864 816 2571 841 837 844 2573 850 857 813 2575 848 2567 845 2570 842 864 816 2572 840 838 842 2574 869 2574 838 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 170 8479 170 5516 178 8472 177 8474 175 8506 173 5513 171 8479 175 8476 178 8472 177 5540 175 8475 174 45584 177 8473 176 5509 175 8476 173 8477 176 8504 170 5516 178 8472 177 8474 175 8476 173 5543 172 8479 170 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 178 4969 170 6958 173 4944 175 6983 173 6956 174 6984 177 6980 171 16308 180 4966 173 6955 176 4941 172 6985 176 6982 169 6960 176 6982 174 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 585 2409 474 550 478 550 448 1033 994 1063 485 512 506 79916 585 2410 473 551 477 550 448 1034 993 1033 515 543 475 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1192 1012 6649 26844 1192 1013 6648 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3134 6105 6263 82963 3134 6105 6263 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 588 1511 567 1533 565 589 531 597 513 589 541 587 533 1565 533 569 541 1533 565 562 568 1531 537 1537 561 593 537 591 539 1507 561 1539 569 22152 586 1513 565 1535 563 590 540 562 538 564 566 588 542 1557 531 597 513 1534 564 590 540 1533 535 1539 559 568 562 592 538 1509 569 1531 567 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 923 831 1715 903 818 936 795 932 789 938 793 934 797 1713 1740 932 789 911 821 934 798 930 791 90853 928 799 1737 935 796 931 790 937 795 932 789 938 793 1717 1736 936 796 932 789 911 820 934 798 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 689 1461 566 1534 564 589 531 597 513 1534 564 564 566 1533 535 620 510 1537 561 592 538 1535 543 1531 567 587 533 595 535 1511 567 1533 565 22161 588 1512 566 1534 564 564 556 598 512 1535 563 565 565 1534 534 594 536 1538 560 593 537 1536 542 1532 566 587 543 585 535 1511 567 1534 564 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 588 2558 498 526 482 515 483 546 452 545 453 545 453 545 453 545 453 544 474 554 444 20047 583 2562 504 519 479 519 479 1003 515 483 1024 548 450 1001 995 1001 506 116771 593 2552 504 520 478 551 447 1004 513 514 993 549 449 1002 994 1002 516 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 587 2559 507 517 481 517 481 547 451 516 482 546 452 546 452 546 452 545 473 525 483 20038 592 2553 503 521 477 552 446 521 477 1004 514 515 992 1034 483 514 484 513 485 116769 593 2552 504 520 478 550 448 520 478 1003 515 514 993 1032 486 513 475 522 476 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 4558 4576 558 596 565 97881 4554 4579 565 589 562 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1039 7202 958 4713 981 4713 961 7255 956 4739 955 16077 1038 7204 956 4714 980 4715 959 7256 954 4741 954 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 506 2638 510 516 482 516 482 546 452 546 452 545 453 545 453 545 453 575 443 554 444 20048 592 2554 502 1036 481 517 481 517 511 516 482 516 961 1035 513 515 483 514 484 116757 594 2552 504 1034 484 514 484 514 504 524 484 513 964 1032 506 522 476 492 506 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 170 7441 169 4924 174 7437 193 7444 171 7441 174 4918 170 7441 174 4917 171 7440 195 7443 172 7439 171 55187 174 7437 173 4919 175 7437 173 7438 172 7466 175 4891 172 7439 171 4921 172 7439 171 7441 174 7464 171 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 179 4967 172 4915 178 6980 171 4945 169 4948 176 4912 176 4941 178 16307 176 4969 175 4912 176 6982 174 4942 171 4945 169 4919 174 4943 176 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1042 793 898 883 869 858 924 884 878 877 875 879 873 855 928 1717 901 854 1794 878 894 887 875 1716 902 89114 985 798 903 878 874 880 902 852 900 855 897 857 905 876 896 1722 906 849 1789 883 899 855 897 1721 897 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 170 8480 169 8481 178 8472 177 8474 175 8476 173 5513 176 8474 175 8476 173 8507 178 5509 175 8505 174 45558 175 8476 173 8476 173 8477 172 8478 171 8480 169 5517 177 8473 176 8474 175 8506 174 5512 172 8509 171 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 628 2577 499 528 480 545 453 544 454 544 454 544 454 544 454 543 455 543 475 553 445 20047 593 2553 503 521 477 551 447 1004 514 515 992 519 479 1003 515 513 485 543 455 116768 585 2561 505 519 479 519 479 1002 516 513 994 548 450 1001 506 522 476 521 477 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8987 4505 568 586 534 594 536 591 509 567 563 591 539 563 567 587 513 1692 559 1672 559 1698 563 590 510 592 538 590 540 1664 567 1690 561 593 507 1699 562 1668 563 1694 567 1663 568 586 534 568 562 592 508 595 535 1695 536 592 538 1693 558 595 515 1690 561 593 517 585 535 567 563 39551 8994 4497 566 589 541 560 560 594 516 586 534 594 536 592 538 590 510 1695 566 1664 567 1690 561 593 507 595 535 566 564 1667 564 1693 558 596 534 1670 561 1670 561 1696 565 1666 565 589 541 587 533 595 515 587 533 1697 534 568 562 1695 556 572 538 1693 568 559 541 588 542 585 535 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8987 4504 569 559 561 593 537 565 535 567 563 591 539 588 532 597 513 1691 560 568 562 592 508 1697 564 589 511 565 565 1692 559 1672 559 569 561 1669 562 566 564 564 566 1665 566 588 542 586 534 1670 561 567 563 565 535 593 537 591 539 1692 539 589 541 586 534 594 536 592 508 40679 8987 4504 569 585 535 593 537 591 509 566 564 591 539 588 532 596 514 1691 560 594 536 592 508 1697 564 589 511 591 539 1692 559 1671 560 594 536 1669 562 592 538 590 540 1664 567 587 543 585 535 1670 561 593 537 565 535 593 537 591 539 1691 540 588 542 586 534 594 536 592 508 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 298 1828 270 804 245 1829 279 1820 278 797 252 771 278 1822 276 1824 274 800 249 1825 273 802 247 776 252 771 278 1822 276 799 250 48931 388 1737 280 796 253 1821 277 1822 276 798 251 1823 275 800 249 774 275 1825 273 776 273 1801 297 1828 270 1829 279 796 253 1821 277 42813 301 1825 273 801 248 1826 272 1827 271 804 245 805 244 1830 278 1821 277 798 251 1823 275 799 250 774 244 779 280 1820 278 796 253 48926 382 1744 354 696 271 1828 270 1829 279 796 253 1821 277 797 252 746 303 1823 275 774 275 1799 299 1826 272 1827 271 804 245 1829 279 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 177 5508 176 5539 176 8475 174 5542 173 8478 171 5545 170 8481 168 8482 177 8473 176 5541 174 8476 173 45573 169 5517 177 5538 177 8473 176 5541 174 8476 173 5544 171 8479 170 8481 178 8472 177 5540 175 8475 174 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 175 8474 175 8475 174 8477 172 8478 171 8480 169 8481 178 5538 177 5510 174 5542 173 5543 172 5544 171 45575 177 8472 177 8474 175 8476 173 8477 172 8478 171 8481 178 5507 177 5539 176 5540 175 5542 173 5543 172 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8050 3971 511 1562 516 1558 510 539 490 1557 511 1563 515 533 485 538 490 533 485 3983 530 1569 509 1564 514 1559 509 1565 513 1560 508 515 513 536 482 541 488 24152 8042 3979 514 1560 508 1565 513 510 508 1565 513 1560 508 515 513 536 482 541 488 3980 533 1567 511 1562 516 1557 511 1563 515 1558 510 539 489 534 484 539 490 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 175 8475 174 5512 177 8473 176 8475 174 8506 179 5508 176 8474 175 8475 174 8477 172 5544 171 8480 169 45587 176 8475 174 5511 173 8477 177 8473 176 8504 170 5516 178 8472 177 8473 176 8475 174 5542 173 8478 171 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 176 7436 174 7438 172 7439 171 7441 174 7463 172 7440 170 4921 172 4919 174 4917 176 4916 177 4914 174 55176 175 7437 173 7439 191 7446 174 7438 177 7434 176 7435 175 4917 176 4915 179 4914 174 4917 171 4946 178 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 176 7435 175 4917 177 7435 175 7436 189 7449 176 7435 175 7437 173 4918 175 7436 174 4918 175 4916 178 55171 175 7436 174 4918 170 7441 174 7438 177 7460 170 7441 174 7438 177 4914 174 7437 178 4914 169 4922 171 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8049 3973 509 1564 514 509 509 1564 514 535 483 1564 514 535 483 540 489 535 483 3980 533 1566 512 537 481 1566 512 511 507 1566 512 537 481 542 486 511 507 24149 8045 3976 516 1558 510 512 516 1557 511 512 516 1558 510 512 516 507 511 512 506 3984 539 1560 508 515 513 1560 508 541 488 1560 508 541 488 536 482 514 504 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 366 202 867 527 170 130516 343 227 863 529 168 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 176 5992 176 1372 176 1320 177 1345 172 1349 179 1370 178 1317 175 4444 176 1346 171 1351 177 1345 172 1349 179 1344 174 5963 175 65574 172 5995 178 1344 174 1348 175 1347 175 1347 170 1378 170 1325 172 4447 178 1344 173 1349 169 1353 175 1347 170 1351 177 5961 177 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 497 1478 488 511 467 1482 494 531 447 1477 499 501 466 533 445 530 468 507 471 529 438 12857 488 1485 491 509 469 1481 495 529 448 1476 490 510 468 532 445 529 469 480 498 502 465 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 982 6313 961 2662 903 2718 929 2719 907 6363 900 2722 904 6365 909 6361 903 6368 906 2742 905 46364 989 6307 906 2716 911 2712 925 2723 903 6367 907 2715 901 6369 905 6365 909 6361 903 2745 902 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 599 257 975 317 177 130649 308 228 974 319 175 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 176 4969 170 6958 173 6985 177 6981 171 6958 178 6980 177 6981 170 16308 180 4966 173 6955 176 6982 169 6988 174 6956 175 6983 173 6984 172 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 178 5990 173 1349 174 1348 175 1348 174 4444 176 1346 171 1351 177 4416 178 1344 173 1348 169 1353 175 1347 170 1351 177 9048 177 65573 173 5995 173 1348 175 1348 174 1347 176 4444 171 1351 177 1345 173 4421 173 1348 169 1352 176 1347 170 1351 177 1345 172 9053 177 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 174 4972 177 4910 173 6985 177 4940 174 6984 178 6951 175 6983 174 14269 177 4968 176 4912 176 6981 175 4941 173 6985 177 6953 178 6979 172 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1318 225 177 130305 1609 231 171 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 585 2410 473 1065 962 581 447 519 479 580 448 549 449 579 449 518 480 548 480 517 481 517 481 577 451 516 482 576 452 545 453 14955 510 2483 481 1058 480 549 969 543 445 1037 511 547 481 546 482 516 482 545 484 545 483 514 484 544 963 1063 485 543 445 111612 626 2427 557 954 513 512 995 547 451 1031 507 521 508 551 477 520 478 550 478 549 479 488 510 548 969 1057 481 517 481 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 203 272 1215 302 171 130229 1423 275 178 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 176 7436 174 7438 192 7446 174 7437 178 7434 176 7435 175 4917 176 4915 178 4913 175 4917 197 7440 175 55130 286 7377 177 7435 175 7437 173 7438 172 7466 174 7411 178 4913 170 4921 172 4919 174 4918 175 7436 174 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 175 7437 173 4918 170 7441 174 7437 178 7460 170 7441 179 7433 177 4915 178 4913 170 4922 171 4920 173 55124 291 7372 172 4921 172 7439 171 7441 174 7463 172 7440 170 7442 178 4913 170 4922 171 4920 173 4918 175 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 172 8477 172 8478 171 8480 169 5516 179 8502 178 5509 175 8475 174 8476 173 8479 170 5545 170 8480 169 45588 176 8473 176 8474 175 8476 173 5513 177 8504 171 5515 174 8476 178 8472 177 8473 176 5541 174 8476 173 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 177 7436 174 4918 175 7436 174 4918 175 7462 178 4887 176 4916 177 4914 174 4917 171 4921 172 4919 175 55184 175 7435 175 4918 175 7436 174 4918 175 7462 178 4914 174 4917 171 4920 173 4919 174 4917 176 4915 178 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 508 2484 480 1060 967 544 485 544 454 574 454 543 455 573 445 553 445 522 506 552 446 552 446 551 477 551 447 581 447 520 478 550 478 15908 626 2427 476 1062 476 522 995 547 451 1061 477 520 508 550 478 519 479 519 999 1058 959 1037 990 582 446 1035 483 111666 590 2404 479 1059 479 549 968 543 455 1027 511 548 480 517 511 486 512 546 961 1065 962 1034 993 579 449 1032 486 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 175 8475 174 8475 174 8477 172 8478 171 8480 169 5517 178 8473 175 8475 179 8501 173 5513 176 8505 169 45562 179 8472 177 8473 176 8474 175 8476 173 8478 171 5515 174 8476 178 8473 176 8505 174 5512 172 8508 171 120769 178 93377 175 7437 173 4919 174 7437 173 7439 171 7467 173 7439 171 7441 174 4918 170 4921 172 7439 171 7467 173 55167 171 7440 170 4922 171 7440 195 7443 172 7439 171 7441 174 7438 177 4915 173 4918 195 7442 173 7439 170 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 295 1805 273 776 242 1808 270 754 244 1806 272 777 241 758 270 754 264 760 268 756 272 14149 297 1802 266 784 244 1805 263 762 246 1803 265 785 244 780 248 751 267 758 271 753 265 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 535 1723 569 585 566 615 536 619 542 586 565 616 535 1722 539 615 536 1721 561 620 541 587 564 617 534 621 540 588 563 618 543 1714 537 617 534 621 540 615 536 618 543 612 539 615 536 1722 560 594 567 1717 534 1723 569 1714 557 1700 643 1639 643 1641 559 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 502 2521 504 521 997 545 453 575 453 545 453 575 454 22097 591 2433 511 513 994 1062 476 552 476 522 476 552 476 120839 628 2455 509 515 992 1064 484 513 505 493 515 543 475 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 591 2404 479 1060 967 1029 509 519 509 549 479 518 480 79926 585 2408 556 956 989 1033 515 544 484 543 475 522 476 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 586 2560 506 518 480 548 450 548 450 517 481 517 481 517 481 547 451 546 482 516 482 20040 590 2556 500 1038 480 518 969 543 455 543 475 1006 511 517 481 517 511 486 481 116778 584 2561 505 1033 485 513 964 548 450 548 480 1001 506 522 476 522 506 521 446 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 917 206 175 186 170 21561 170 2280 175 2274 502 1929 174 2276 169 5178 170 2261 173 3724 498 1932 171 2279 176 2273 172 3709 172 2277 178 3720 171 17223 177 7619 174 2275 170 2279 176 2256 168 2280 175 5172 176 2256 168 3729 173 2276 179 2253 171 2278 177 3703 178 2271 174 3724 177 17251 170 7627 177 2272 173 2276 169 2263 171 2277 178 5169 169 2262 172 3726 175 2256 168 2280 175 2274 171 3710 171 2278 177 3720 171 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 565 233 653 313 170 130328 752 235 233 107 229 398 177 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 586 2439 505 549 968 1027 511 517 511 517 481 547 481 21583 584 2439 505 520 997 1059 479 549 479 518 480 548 480 120894 593 2432 501 522 995 1061 477 521 507 520 478 550 478 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 558 8032 474 8115 503 8116 482 8108 480 8141 477 5239 476 8114 504 8115 483 8107 481 5236 509 8111 477 45290 554 8036 481 8108 510 8110 478 8112 476 8145 473 5243 482 8107 511 8109 479 8111 477 5240 505 8115 473 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 173 7438 172 4920 173 7438 172 4920 173 7465 175 4890 173 7439 171 4920 173 4919 174 4917 176 4915 178 55179 170 7441 169 4924 174 7437 178 4913 175 7463 172 4893 170 7441 174 4918 170 4922 171 4920 173 4918 175 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 225 745 222 774 193 778 200 797 175 769 193 777 201 771 196 774 224 747 220 776 202 769 198 248 220 252 196 250 218 253 225 746 221 250 198 248 220 252 226 246 222 223 225 248 220 252 216 229 219 253 225 247 221 277 176 243 220 279 189 230 228 244 224 248 220 252 196 250 218 253 215 257 201 770 197 799 189 257 201 271 197 37716 222 749 218 778 200 771 196 801 172 772 200 771 196 774 193 777 221 750 217 780 197 773 194 251 217 255 193 279 199 273 195 749 218 254 194 252 226 245 223 275 178 242 221 277 201 245 193 253 225 247 221 250 218 254 194 252 226 272 196 223 225 248 220 251 217 255 193 253 225 247 221 251 197 773 194 803 174 297 176 244 219 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3503 2655 197 642 876 2568 844 834 846 833 848 860 821 831 839 2576 847 2569 843 2572 841 2574 849 858 823 857 813 866 815 865 815 2572 841 2575 848 2568 844 2570 842 836 844 863 818 834 847 861 820 2568 845 2571 872 2571 842 32651 3505 3495 875 2567 845 861 820 832 849 859 811 840 840 2576 847 2568 844 2571 842 2574 849 830 840 867 814 838 842 865 815 2572 840 2575 848 2568 845 2571 841 865 815 864 817 834 846 861 819 2569 843 2572 871 2572 840 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 347 677 219 252 196 276 202 742 225 798 174 770 192 778 200 771 196 775 223 748 219 777 200 770 197 249 219 253 195 251 227 271 197 747 220 252 216 229 219 253 225 273 195 277 176 244 219 253 215 230 228 244 224 248 220 252 196 250 218 280 198 247 201 245 223 249 219 253 195 251 227 245 223 248 200 797 175 795 198 248 200 246 222 37666 344 678 228 245 223 222 226 771 196 800 198 747 220 750 217 753 224 773 194 776 202 769 198 799 173 246 227 245 223 249 199 247 221 749 218 280 198 247 201 245 223 249 219 253 195 251 227 244 224 248 200 272 196 250 218 254 194 252 226 245 223 249 199 274 194 251 227 245 193 253 225 273 195 251 217 753 225 746 221 251 197 275 193 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 174 7437 173 7440 174 7437 178 7433 177 7461 169 7442 178 4914 174 4917 171 4921 172 4919 174 7463 177 55163 177 7435 174 7437 173 7438 172 7440 175 7463 172 7413 176 4915 178 4913 175 4917 171 4920 174 7438 172 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8042 3979 513 510 508 541 487 1559 509 515 513 1560 508 515 513 510 508 541 477 3981 532 1568 510 1563 515 1558 510 1564 514 1559 509 514 514 535 483 540 488 24151 8042 3979 513 536 482 541 487 1560 508 541 488 1560 508 541 487 536 482 541 477 3980 533 1566 512 1561 507 1566 512 1562 516 1557 511 538 491 533 485 538 490 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8989 4501 562 1696 565 1665 566 562 568 586 514 588 542 586 534 594 536 1667 564 591 539 1692 539 563 567 1690 561 1669 562 1669 562 1696 565 562 538 564 566 588 542 586 534 1670 561 568 562 592 538 590 510 592 538 590 540 561 539 563 567 561 569 585 535 593 507 595 535 593 537 39547 8987 4504 569 1689 562 1668 563 591 539 589 511 591 539 589 541 561 559 1671 560 568 562 1695 536 592 538 1693 558 1673 568 1663 568 1689 562 592 508 594 536 592 538 590 540 1664 567 561 569 559 561 567 543 585 535 593 537 591 509 593 537 591 539 589 541 587 513 589 541 587 533 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8988 4504 640 487 562 592 538 590 510 592 538 590 540 588 532 596 514 614 516 1689 562 1668 563 1695 536 1695 566 1664 567 1690 612 1618 643 1430 801 1613 648 481 558 570 540 589 541 587 533 595 535 592 508 594 536 592 538 1667 564 1693 558 1672 569 1688 563 1668 644 1586 563 1694 567 40630 8994 2265 557 96833 8987 2273 538 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 173 7439 171 4922 172 7439 171 4921 172 7466 174 4917 176 4915 173 4918 170 7441 174 7438 192 7445 175 55181 174 7437 173 4918 175 7437 173 4919 175 7463 177 4888 175 4917 176 4915 178 7460 170 7440 175 7437 178 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1636 4610 1563 1533 1584 7760 1561 28769 1641 4606 1557 1539 1588 7757 1564 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 590 2404 479 1059 968 575 454 544 454 574 454 543 455 543 475 522 476 552 476 552 446 551 447 581 448 520 478 581 447 519 479 549 479 15967 587 2407 476 1062 476 522 995 547 451 1030 508 520 509 550 478 519 479 519 998 1028 999 1057 481 547 960 1066 482 111641 587 2407 476 1063 485 513 994 547 451 1031 507 551 477 551 477 520 478 550 968 1059 968 1027 511 548 959 1036 512 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 588 2406 477 1061 966 577 451 516 482 545 483 545 453 575 443 524 484 514 504 554 454 543 455 543 475 553 445 583 445 521 477 582 446 15969 585 2409 474 1065 483 514 993 549 449 1033 515 543 475 553 475 522 476 552 965 1030 997 576 452 1029 998 1028 479 111668 587 2407 475 1063 485 543 964 517 481 1031 507 552 476 551 477 520 478 550 968 1028 999 574 454 1027 990 1036 481 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 174 7439 196 7441 174 7437 173 7439 171 7441 174 7438 177 7460 170 7442 178 7433 177 4915 173 4918 170 55186 174 7438 172 7440 170 7441 174 7438 177 7461 169 7416 173 7464 176 7435 175 7437 173 4918 175 4917 176 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 173 7438 172 7441 174 7438 177 7434 176 7462 168 7443 177 7435 175 4917 176 4915 173 7438 177 4941 173 55166 174 7438 197 7441 174 7437 173 7439 171 7441 174 7438 177 7460 170 4922 171 4893 195 7443 172 4920 173 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 175 7436 179 4913 175 4917 171 4920 173 4945 169 4896 177 7435 175 7436 174 7464 176 4916 177 4914 169 55180 170 7441 169 4924 169 4922 171 4920 173 4919 174 4917 176 7435 175 7463 177 7434 176 4916 177 4914 174 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 927 827 1709 936 796 932 789 938 793 1717 1736 936 795 932 789 1721 927 827 1709 909 822 90851 898 829 1738 934 798 930 791 936 796 1715 1738 934 797 930 791 1719 899 828 1739 934 797 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 176 5991 177 1372 176 1320 177 1344 173 1349 174 1374 169 1327 170 4449 176 1346 171 1351 177 1345 172 1349 168 1353 175 5963 175 65573 173 5995 178 1344 174 1348 175 1348 174 1347 170 1378 170 1325 172 4447 178 1344 174 1349 169 1353 175 1347 170 1352 176 5961 177 -# +# name: POWER type: parsed protocol: NEC address: 71 00 00 00 command: 4A 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 60 00 00 00 command: 03 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 60 00 00 00 command: 00 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 42 00 00 00 command: 01 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 50 AD 00 00 command: 00 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 50 AD 00 00 command: 02 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 50 00 00 00 command: 3F 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 06 00 00 00 command: 0F 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 08 00 00 00 command: 12 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 08 00 00 00 command: 0B 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 83 55 00 00 command: C2 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 00 00 00 00 command: 51 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 00 BD 00 00 command: 01 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 00 00 00 00 command: 0F 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 16 00 00 00 command: 0F 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 01 00 00 00 command: 01 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 80 68 00 00 command: 49 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 86 02 00 00 command: 49 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 2383 609 1214 600 612 580 1213 608 614 583 1210 605 607 586 616 611 1192 599 613 608 614 579 613 615 607 26670 2387 601 1212 600 612 589 1214 603 609 586 1217 595 607 594 618 606 1187 602 610 609 613 588 614 610 612 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 178 7761 176 11308 546 957 540 1958 538 970 537 1955 541 962 545 1953 543 964 543 962 545 957 540 970 548 960 547 1945 541 1950 546 965 542 1953 543 962 545 1945 540 970 537 1958 538 7881 172 7744 172 11318 536 971 536 1956 540 963 534 1964 542 966 541 1951 535 968 539 971 536 971 536 969 538 964 533 1965 541 1954 542 963 534 1956 540 971 536 1959 537 968 539 1951 535 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3444 1767 413 486 420 1343 419 478 418 485 411 490 416 479 417 489 417 482 414 485 421 482 414 483 413 490 416 485 411 1343 419 487 419 480 416 483 413 490 416 482 414 488 418 483 413 483 413 492 414 1345 417 482 414 489 417 480 416 487 419 482 414 481 415 491 415 484 412 1347 415 488 418 1338 414 1348 414 1347 415 1340 412 494 412 487 419 1340 412 491 415 1341 421 1341 421 1340 412 1343 419 487 419 1339 413 74311 3445 1753 437 461 445 1316 446 456 440 455 441 465 441 458 438 461 445 458 438 460 436 466 440 461 445 451 445 460 446 1313 439 460 446 457 439 459 437 465 441 460 446 450 436 469 437 462 444 456 440 1322 440 457 439 464 442 459 437 459 437 468 438 461 445 455 441 462 444 1312 440 463 443 1317 445 1310 442 1323 439 1320 442 457 439 464 442 1315 437 466 440 1320 442 1313 439 1326 446 1313 439 460 446 1317 445 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 278 1845 274 808 271 806 273 812 278 805 275 805 274 1840 279 1844 275 809 281 1836 272 806 274 812 278 805 274 1842 277 802 277 44956 279 1842 277 804 275 802 277 808 271 811 279 1838 281 798 271 814 276 1844 275 806 273 1841 278 1845 274 1846 273 808 271 1843 276 44959 275 1845 274 807 272 805 275 811 279 804 275 805 274 1839 280 1844 275 808 271 1845 274 805 274 811 279 804 275 1841 278 801 278 44955 280 1841 278 802 277 801 278 807 272 810 280 1837 271 807 272 813 277 1843 276 805 274 1839 280 1843 276 1845 274 807 272 1842 277 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 881 909 1750 928 875 927 876 921 872 929 874 927 876 918 875 930 873 1815 874 924 1745 937 876 88694 880 922 1747 933 880 914 879 926 877 922 871 927 876 927 876 920 873 1818 871 929 1740 934 879 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 509 1717 504 629 512 631 510 627 504 633 508 633 508 1713 508 1719 512 1713 508 625 505 637 504 633 508 629 512 629 512 623 508 1719 512 626 505 628 513 631 510 627 514 623 507 632 509 1713 508 632 509 1716 505 1715 506 1724 507 1716 505 1719 512 1715 506 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 506 493 505 4059 505 5051 501 506 502 4065 499 511 497 4063 501 5058 504 504 504 4060 504 5052 500 507 501 4066 498 5056 506 5042 500 515 503 119614 504 505 503 4065 499 5051 501 511 497 4069 505 499 499 4072 502 5050 502 506 502 4066 498 5053 499 512 506 4060 504 5044 498 5061 501 508 500 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8887 4470 532 1738 513 1708 533 1708 533 577 533 576 534 569 531 582 538 1705 536 571 539 1707 534 571 539 571 539 570 540 1699 532 581 539 568 532 575 535 576 534 571 539 571 539 569 541 1698 533 1717 534 1708 533 1710 531 1716 535 1706 535 1711 540 1705 536 567 533 580 540 567 533 39042 8915 2231 530 94849 8917 2256 535 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8313 4161 515 1574 514 1571 507 569 510 562 507 563 506 562 507 568 511 562 507 1580 508 1577 511 1582 506 567 513 1575 513 554 505 571 509 564 505 22604 513 1573 505 1589 509 563 506 564 505 562 507 569 511 562 507 563 506 1579 509 1584 514 1576 512 558 511 1574 514 562 507 565 515 556 513 22593 514 1581 507 1583 505 564 505 563 506 570 510 563 506 564 505 562 507 1586 512 1578 510 1577 511 557 512 1581 507 566 514 556 513 555 514 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8735 4383 558 573 557 550 560 568 562 544 566 1722 560 540 560 1732 560 544 566 1719 563 1701 560 1723 559 1704 557 574 556 1699 562 574 556 1703 559 1727 565 1698 563 1721 561 546 564 1723 559 541 559 577 564 541 559 571 560 548 562 565 566 1697 565 567 564 1693 558 1733 559 1701 560 39926 8754 2247 565 92341 8758 2243 589 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3298 3336 821 2506 825 881 820 2505 826 2529 823 856 825 2524 817 866 825 2528 813 2513 818 888 813 862 819 887 814 865 826 2522 820 864 827 2526 815 861 820 887 814 2510 821 885 816 863 818 2531 821 2512 819 2559 793 32401 3298 3349 818 2507 824 882 819 2509 822 2527 814 868 823 2530 821 855 826 2531 821 2504 827 879 822 857 824 875 816 867 824 2529 823 854 827 2530 821 853 817 889 822 2506 825 873 818 866 825 2527 814 2513 818 2564 788 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8840 4439 532 566 534 566 534 1668 532 1674 536 1669 531 562 538 566 534 563 537 1667 533 567 533 563 537 563 537 562 538 1662 538 1671 529 568 532 565 535 566 534 1668 532 1674 536 1669 531 562 538 1672 528 1675 536 1668 532 1675 535 559 531 1676 534 565 535 558 532 1678 532 565 535 562 538 563 537 1665 535 565 535 1670 530 1669 531 572 538 1666 534 1669 531 1676 534 22777 8858 4447 535 92577 8858 4413 538 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 289 2112 261 2109 295 2101 262 918 294 912 259 915 297 2098 265 916 296 909 262 2107 297 905 266 913 289 918 263 910 292 909 262 918 294 24789 263 2106 298 2098 265 2110 294 913 258 916 296 905 266 2108 296 911 260 914 288 2107 266 914 298 908 263 911 291 910 261 919 293 913 258 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8898 4453 569 578 573 577 574 571 570 1745 567 1747 565 1743 569 583 568 579 572 1740 572 1744 568 1742 570 579 572 576 575 568 573 1746 566 1746 566 580 571 1745 567 577 574 576 575 1739 573 569 572 581 570 577 574 1738 574 576 575 1735 567 1748 574 574 567 1742 570 1748 574 1737 575 41005 8876 2261 571 93850 8898 2264 568 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3215 1637 410 430 405 439 406 1242 408 435 410 1242 408 428 407 440 405 435 410 1240 410 1243 407 431 404 440 405 437 408 1238 402 1254 406 434 401 439 406 438 407 431 404 440 405 437 408 428 407 439 406 434 401 439 406 438 407 1241 409 434 401 441 404 432 403 444 401 1249 401 439 406 438 407 1241 409 434 401 441 404 433 402 444 401 1249 401 439 406 1248 402 436 409 434 401 441 404 433 402 444 401 439 406 45471 3239 1614 403 435 400 444 401 1250 400 437 408 1248 402 438 407 433 402 442 403 1245 405 1248 423 420 405 431 404 443 402 1248 402 1248 422 421 404 435 400 443 402 440 405 431 404 443 402 438 407 433 402 442 403 435 400 443 402 1250 400 436 399 447 408 432 403 438 407 1246 404 434 401 443 402 1250 400 436 399 447 408 432 403 437 408 1246 404 434 401 1253 407 434 401 436 399 447 408 432 403 437 408 436 399 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 7928 3948 504 515 503 518 500 1583 505 516 502 1584 504 510 508 516 502 516 502 3952 510 1579 509 507 501 1587 501 519 510 1571 507 518 500 517 501 517 501 23073 7931 3943 509 514 504 515 503 1578 500 524 505 1580 508 510 508 514 504 511 507 3951 511 1576 502 513 505 1586 502 515 503 1582 506 515 503 513 505 516 502 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8837 4464 538 610 531 619 532 613 538 1748 534 1750 532 611 540 613 538 609 532 615 536 614 537 608 533 1753 539 1745 537 606 535 618 533 614 537 609 532 619 532 613 538 611 540 609 532 611 540 1748 534 1749 533 1750 532 1754 538 1743 539 1747 535 1750 532 1747 535 618 533 613 538 44105 8864 2224 537 93399 8912 2202 538 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 492 4975 496 4993 498 498 500 4056 498 504 494 4055 499 4963 497 532 496 4031 492 4996 495 502 496 4060 494 4972 499 4990 491 506 492 4063 491 511 497 4052 492 4970 490 539 500 4027 496 103358 500 4961 500 4995 496 505 493 4056 498 499 499 4057 497 4969 491 533 496 4026 497 4997 494 508 490 4059 495 4967 494 5001 490 511 497 4053 491 505 493 4063 491 4975 496 528 490 4032 491 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 2357 610 1183 592 1191 614 1179 595 1188 618 584 613 1180 593 588 613 1190 612 590 605 587 613 589 605 587 25398 2355 623 1180 591 1181 627 1186 589 1183 618 584 616 1187 587 584 614 1189 615 587 605 587 615 587 609 593 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3425 3482 848 2607 846 2639 845 2608 846 2639 845 2612 852 2624 850 2613 851 911 851 885 847 919 843 891 851 915 847 890 852 907 845 897 845 917 845 891 851 915 847 887 845 2639 845 2612 852 2625 849 2613 851 2630 844 34282 3455 3478 852 2601 852 2633 851 2605 848 2629 845 2617 847 2633 851 2604 849 917 845 890 852 913 849 889 843 915 847 896 846 916 846 890 852 914 848 885 847 919 843 895 847 2630 844 2617 847 2634 850 2605 848 2636 848 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 500 500 498 4066 498 5058 504 502 506 4061 503 508 500 4060 504 5055 497 5055 497 511 497 4071 503 5047 505 507 501 4065 499 5049 503 512 496 124314 501 508 500 4067 507 5043 499 513 505 4060 504 501 497 4073 501 5052 500 5052 500 512 496 4066 498 5058 504 506 502 4058 506 5053 499 509 499 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 176 7763 174 8817 169 10842 544 1955 541 967 540 1952 544 959 538 972 546 962 545 1947 538 1952 544 967 540 1955 541 964 543 1947 539 972 546 1949 547 7873 170 7746 170 10350 175 11811 543 960 537 1961 535 972 535 970 537 965 542 1956 540 1956 540 965 542 1947 539 973 534 1960 536 969 538 1952 534 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 2570 2682 1189 1208 1186 2665 1186 1217 1187 2668 1183 1215 1179 2671 1190 2695 1186 1187 1187 2692 1179 2671 1190 1213 1181 1193 1191 1207 1187 2663 1188 1215 1179 2676 1185 46941 2563 2685 1186 1191 1183 2698 1184 1188 1186 2691 1180 1197 1187 2694 1187 2666 1185 1210 1184 2674 1187 2695 1186 1185 1189 1206 1188 1189 1185 2696 1186 1186 1187 2689 1182 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 873 916 1773 906 877 925 878 919 874 928 875 925 878 1806 1770 914 879 1809 870 928 1772 88684 870 926 1774 908 875 926 877 917 876 929 874 925 878 1809 1777 905 877 1808 871 930 1770 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 874 906 877 912 1767 904 879 908 874 918 875 915 878 907 875 920 873 1795 874 914 1775 897 875 88704 879 914 868 922 1767 897 875 919 874 915 878 911 872 920 873 914 879 1792 877 914 1775 889 873 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3325 1560 406 444 401 453 402 1226 404 449 406 1226 404 443 402 454 401 449 406 1224 406 1228 402 446 409 444 401 451 404 1223 407 1230 410 440 405 445 410 443 402 446 409 444 401 451 404 442 403 453 402 448 407 443 402 451 404 1224 406 448 407 444 401 445 410 446 409 1221 409 442 403 1231 409 439 406 1227 403 450 405 441 404 452 403 1227 403 448 407 446 409 439 406 447 408 444 401 445 400 456 410 440 405 52348 3320 1553 403 445 400 454 401 1230 400 447 408 1228 402 449 406 444 401 452 403 1225 405 1229 431 421 404 442 403 454 401 1229 401 1229 431 423 402 446 399 455 400 451 404 442 403 453 402 448 407 443 402 451 404 444 401 452 403 1229 401 445 400 457 398 451 404 446 399 1235 405 443 402 1232 408 444 401 1225 405 452 403 447 398 452 403 1231 399 449 406 447 408 443 402 444 401 456 399 450 405 445 400 453 402 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 990 915 980 909 986 924 981 2829 981 934 981 2823 987 923 982 2828 982 933 982 906 989 33895 989 907 988 927 988 900 985 2841 979 915 980 2851 980 909 986 2840 980 914 981 934 981 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 821 5754 848 2490 841 2492 819 2524 817 5726 845 2492 839 5727 844 5757 845 5727 854 2483 848 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 5092 1621 406 2599 406 2598 407 2605 1653 1616 411 2619 1609 1606 1654 1618 409 2623 382 2600 405 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8879 4446 566 1747 565 584 567 1744 568 581 570 1744 568 574 567 586 565 582 569 578 563 1753 570 575 566 1749 563 585 566 1743 569 1749 563 1748 564 582 569 1747 565 580 571 578 573 1741 571 572 569 584 567 580 571 1741 571 578 573 1738 564 1751 572 577 564 1744 568 1750 572 1740 572 41007 8906 2257 565 93855 8872 2265 567 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1144 1010 6795 26754 1151 997 6798 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1144 1009 1120 1006 1143 1991 1116 26758 1146 1006 1123 1003 1146 1988 1119 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8906 4165 572 1672 569 1678 563 640 572 637 565 643 569 633 569 643 569 1674 567 639 563 1684 567 637 565 1681 570 1675 566 1673 568 1681 570 636 566 640 572 637 565 639 563 1684 567 640 572 630 572 640 572 634 568 1675 566 1681 570 1670 571 638 564 1681 570 1669 572 1678 563 1680 571 40485 8898 2252 570 85621 8955 2194 567 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 446 1191 449 1194 446 1195 445 1204 446 1200 1316 459 447 1193 447 1202 448 1197 443 1201 449 1191 449 34491 443 1204 446 1197 443 1198 442 1207 443 1202 1314 436 440 1201 449 1199 441 1205 445 1198 442 1199 441 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 4268 4327 522 1593 516 1603 516 1597 522 519 520 520 519 515 514 531 518 520 519 519 520 521 518 519 520 1597 522 1595 514 1597 522 1599 520 1595 514 524 515 1604 515 521 518 523 516 524 515 519 520 525 514 524 515 1599 520 522 517 1596 513 1605 514 1602 517 1595 514 1607 522 1592 516 40481 8748 2187 523 93986 8721 2189 521 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 247 3006 244 153 178 1007 251 117 637 597 381 678 218 156 175 529 382 679 217 157 174 24963 247 3038 252 117 219 994 249 119 217 483 250 117 173 531 278 779 173 167 169 569 383 679 217 156 175 126538 246 3039 251 118 218 995 247 120 195 504 249 118 172 532 277 780 172 168 178 560 382 680 216 157 174 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8872 4454 568 579 572 578 573 572 569 581 570 1744 568 575 566 587 564 582 569 1743 569 1747 565 1745 567 1748 564 584 567 1741 571 1747 565 1747 565 1747 565 1751 571 1739 563 1752 570 578 563 1745 567 1751 572 1741 571 575 566 585 566 578 573 577 564 1750 573 571 570 583 568 579 572 41007 8905 2258 574 93846 8871 2266 566 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 4278 4318 521 517 522 520 519 517 522 520 519 521 518 516 513 531 518 520 519 1595 514 1605 514 1599 520 1598 521 1595 513 1598 521 1600 519 1596 513 1602 517 1601 518 1595 514 1604 515 525 514 520 519 526 513 525 514 524 515 527 522 513 516 526 513 1603 516 1595 514 1607 522 1593 516 40481 8749 2186 524 93985 8722 2189 521 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 2746 8423 2744 19607 2746 19601 2742 8431 2745 8424 2742 19608 2745 8419 2747 19608 2745 19607 2746 8422 2744 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 170 6683 174 4889 175 10382 372 849 821 2498 176 10378 264 2479 842 2492 839 2475 846 2483 838 2481 840 2495 836 2477 844 845 846 37009 172 6681 176 4888 175 10381 373 848 924 2395 844 2490 174 10383 248 2492 172 10386 245 2495 169 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8898 4453 569 578 573 577 574 1737 565 584 567 582 569 574 567 1751 572 1741 571 1741 571 1744 568 576 575 1741 571 1743 569 1739 573 579 572 575 566 581 570 580 571 574 567 1748 575 1739 573 570 571 582 569 578 573 1739 573 1742 570 1740 572 577 574 575 566 1742 570 1749 574 1738 574 41006 8875 2262 570 93850 8907 2256 566 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8872 4454 568 1745 567 1749 563 1746 566 584 567 1747 565 1743 569 583 568 579 572 575 566 584 567 578 563 1752 571 578 563 580 571 1747 565 1747 565 581 570 1746 566 578 573 577 564 1751 572 571 570 583 568 579 572 1740 572 578 563 1747 565 1750 573 576 565 1743 569 1749 563 1749 563 41017 8906 2257 565 93855 8872 2265 567 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 179 2644 178 8174 170 2646 176 8181 173 2648 174 8177 177 2640 172 5419 174 5413 170 2649 173 2644 178 2646 176 2646 176 5409 174 28831 174 2651 171 8183 171 2648 174 8174 170 2655 177 8177 177 2642 170 5412 171 5420 173 2649 173 2646 176 2640 172 2653 169 5419 174 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 174 2648 174 8178 176 2640 171 8185 169 2653 169 8182 172 2645 177 2647 557 2264 558 5027 174 5410 173 5418 175 5413 170 28837 168 2649 173 8184 170 2652 170 8181 173 2643 169 8188 176 2646 176 2643 168 2648 174 5417 176 5411 172 5413 170 5413 170 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 178 706 266 139 268 137 173 173 198 234 178 126768 175 299 169 86 275 130 267 138 172 230 177 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 554 1922 584 3809 582 3782 578 3821 580 1920 555 1941 544 1922 574 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 476 1470 465 3479 474 3469 474 3477 475 1467 468 1471 474 27473 472 1474 472 3475 467 3478 475 3468 474 1471 475 1468 467 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 301 2188 236 2169 235 2205 230 1009 234 1070 183 1064 179 2198 206 1046 207 1069 173 2207 207 1042 211 1062 201 1043 210 1032 231 1005 237 1039 234 1006 236 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8872 4453 570 1744 568 582 569 1741 571 1744 568 580 571 1738 564 1754 569 578 563 584 567 1749 563 581 570 580 571 1743 569 573 568 585 566 1746 566 580 571 580 571 1739 563 586 565 1749 563 579 572 582 569 577 564 1748 564 1752 571 574 567 1748 564 584 567 1742 570 1748 564 1747 565 41015 8898 2265 567 93853 8875 2262 570 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8904 4446 576 572 569 581 570 575 566 584 567 582 569 1739 573 579 572 575 566 1746 566 1750 572 1738 574 1741 571 1742 570 573 568 1750 572 1740 572 1740 572 578 573 572 569 581 570 1744 568 574 567 586 575 572 569 578 573 1742 570 1740 572 1743 569 579 572 1737 565 1753 570 1743 569 41010 8881 2257 565 93855 8903 2259 573 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8878 4448 564 584 567 583 568 577 564 586 565 584 567 1741 571 582 569 1743 569 1743 569 1746 566 1744 568 1747 565 1749 563 579 572 1747 565 581 570 1743 569 1746 566 578 573 1743 569 579 572 571 570 583 568 579 572 575 566 584 567 1743 569 581 570 1744 568 1740 572 1746 566 1746 566 41013 8898 2264 568 93853 8872 2265 567 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8900 4450 572 575 566 585 566 578 573 1743 569 579 572 1736 566 587 574 572 569 1743 569 1747 565 1745 567 582 569 1745 567 575 566 1753 570 1742 570 1742 570 1746 566 578 573 1742 570 578 573 570 571 582 569 578 573 574 567 583 568 1742 570 579 572 1742 570 1738 574 1744 568 1744 568 41012 8871 2266 566 93855 8903 2258 574 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8872 4454 568 1745 567 1749 563 1747 565 1750 562 1752 571 1737 565 1754 568 1743 569 578 563 587 564 581 570 580 571 577 564 579 572 581 570 576 565 1748 564 1751 572 1739 563 1752 571 1743 569 1739 563 590 571 575 566 581 570 580 571 574 567 583 568 580 571 572 569 1750 562 1749 563 41017 8905 2257 575 93846 8871 2266 566 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 176 7764 173 11361 544 1951 545 1948 176 8815 171 2319 177 2322 174 2321 175 2318 178 2313 173 18281 170 7746 170 11369 536 1954 542 1957 539 969 538 1954 542 1949 536 1962 534 1960 174 2320 176 2315 170 2328 178 2317 168 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 172 23035 176 2267 178 2285 170 2270 175 2288 177 11602 222 2218 216 2246 173 183 173 935 221 218 174 864 221 1250 171 1310 223 2219 216 2247 218 1244 223 216 176 869 170 1296 217 2239 216 1254 223 216 176 866 219 9127 169 7642 173 2284 171 2273 172 2290 175 2263 171 10143 178 10623 222 1245 222 217 175 1843 220 2226 219 1264 223 1237 174 183 178 952 219 2222 223 216 176 866 219 1249 172 9190 173 7637 178 2266 169 2286 169 2280 175 2284 171 10125 175 10622 224 215 177 868 216 2228 217 2238 171 1299 224 215 177 865 174 183 173 934 222 216 176 1848 215 1247 220 1265 222 762 170 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 7410 1482 382 2742 375 2747 380 2751 1630 1535 400 2724 1657 1529 1629 1538 407 2720 407 2716 401 2722 4125 1549 376 2751 376 2748 379 2744 1626 1541 405 2723 1658 1530 1628 1531 404 2726 401 2726 401 2723 4124 1542 383 2747 380 2747 380 2745 1626 1534 401 2729 1652 1539 1629 1532 403 2719 408 2722 405 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 4277 4319 520 518 521 521 518 518 521 1597 522 1594 515 1597 522 1599 520 1594 515 1600 519 1600 519 1594 515 526 513 527 522 512 517 528 521 517 522 516 513 1605 514 522 517 525 514 525 514 521 518 526 513 525 514 1600 519 523 516 1597 522 1596 513 1603 516 1595 514 1607 522 1593 516 40481 8749 2186 524 93986 8721 2188 522 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 1325 431 445 1199 1317 455 441 1207 443 1202 1294 457 449 1190 440 1209 441 1205 445 1198 1318 454 442 93237 1320 434 442 1201 1325 448 448 1200 440 1205 1291 460 446 1193 447 1202 448 1198 442 1201 1325 447 449 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8876 4450 572 575 566 585 566 578 573 577 564 585 566 577 564 589 572 574 567 1745 567 1749 563 1747 565 1750 562 1751 571 1737 565 1754 569 1743 569 1743 569 1747 565 579 572 1743 569 579 572 571 570 583 568 579 572 575 566 584 567 1743 569 581 570 1744 568 1740 572 1746 566 1746 566 41013 8898 2265 567 93853 8873 2264 568 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 300 1791 297 744 295 743 296 751 298 745 294 747 302 736 293 1837 271 745 294 747 302 1793 295 752 297 1802 296 1801 297 742 297 1806 302 31592 296 1801 297 742 297 749 300 744 295 745 294 745 294 752 297 1829 269 746 293 745 294 1809 300 744 295 1802 296 1799 299 748 301 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 178 2003 177 2899 177 1996 174 2908 168 2910 177 2000 170 2004 176 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8898 4173 564 642 570 1677 564 1677 564 645 567 640 572 631 571 641 571 635 567 639 563 1683 568 1673 568 641 571 636 566 637 565 647 565 641 571 634 568 642 570 1671 570 639 563 1682 569 632 570 643 569 636 566 1677 564 1683 568 636 566 1680 571 636 566 1674 567 1682 569 1674 567 40489 8904 2246 566 85626 8902 2248 564 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8897 4454 569 578 573 1743 569 576 565 1750 572 576 575 1733 569 584 567 1745 567 1745 567 583 568 1742 570 579 572 1742 570 573 568 1750 573 574 567 580 571 580 571 573 568 582 569 580 571 572 569 584 567 1744 568 1744 568 1748 575 1735 567 1749 574 1740 572 1736 566 1752 571 576 575 41005 8878 2259 563 93858 8901 2260 572 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8880 4446 566 1747 565 585 566 578 573 577 564 1750 573 571 570 1748 564 582 569 578 573 1743 569 1741 571 1744 568 580 571 1737 565 588 563 1749 563 583 568 582 569 576 565 1750 573 576 565 578 573 580 571 576 565 1747 565 1751 571 1738 564 586 565 1749 563 1745 567 1751 572 1741 571 41008 8905 2258 574 93846 8871 2266 566 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3892 3856 525 978 529 977 530 969 528 977 530 974 523 975 532 1924 531 971 526 1924 531 975 532 1916 529 976 531 1921 524 1947 508 1925 530 1920 525 1926 529 1925 530 970 527 1927 528 976 531 1915 530 978 529 1921 1033 9201 3871 3867 524 977 530 975 522 981 526 972 525 983 524 978 529 1921 524 982 525 1923 532 973 524 1928 527 971 526 1931 524 1950 505 1922 523 1931 524 1924 531 1923 532 972 525 1922 523 985 533 1918 527 975 532 1922 1032 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8900 4451 571 576 575 1742 570 1739 573 1742 570 578 573 1736 566 1752 570 576 575 1737 575 575 566 579 572 578 573 1741 571 571 570 583 568 1745 567 579 572 578 573 1738 574 575 566 1748 575 568 573 581 570 576 575 1737 565 1751 572 573 568 1747 576 573 568 1741 571 1747 565 1747 565 41014 8878 2260 562 93858 8901 2261 571 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 875 904 1745 924 879 913 880 1786 873 919 874 917 1742 922 871 1802 877 912 1747 921 872 88714 880 907 1742 930 873 917 876 1788 871 924 879 910 1749 919 874 1798 871 916 1743 928 875 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 4758 1543 403 2731 407 2726 402 2739 1601 1514 401 2760 1580 1530 1577 1540 406 2758 400 2708 1602 1535 400 2740 408 2729 409 2726 401 2731 1599 1520 405 2758 1572 1540 1578 1532 403 2737 431 2706 1604 1535 411 2722 405 2734 403 2734 404 2731 1599 1512 403 2764 1576 1539 1578 1533 402 2730 428 2712 1608 1534 402 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8873 4453 570 578 563 1753 570 575 566 1749 563 585 566 1742 570 583 568 1744 568 1744 568 582 569 1741 571 578 573 1741 571 572 569 1749 563 583 568 1745 567 1748 564 1746 566 583 568 581 570 1738 564 589 572 1740 572 574 567 584 567 577 564 1752 571 1743 569 573 568 1751 572 575 566 41014 8900 2263 569 93851 8878 2259 563 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 171 313 176 798 337 133 600 232 170 126777 176 65 169 496 176 200 609 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 500 527 491 4033 500 4986 495 510 498 4054 500 499 499 4048 496 4974 497 530 499 4026 497 4989 492 513 495 4057 497 4967 493 4992 499 506 492 4060 494 505 493 4054 500 98563 497 529 500 4025 498 4988 493 512 496 4056 498 501 497 4050 493 4976 495 532 497 4028 495 4991 500 505 493 4059 495 4969 491 4994 497 508 490 4062 492 507 491 4056 498 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 879 901 871 1796 1770 903 869 917 876 916 877 913 880 906 877 918 875 914 879 1788 1768 1784 875 87826 871 921 872 1797 1769 897 875 919 874 915 878 910 873 920 873 914 879 913 870 1800 1776 1767 871 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 874 905 1774 894 878 914 879 908 875 917 876 915 878 907 876 919 874 1793 876 913 1777 895 878 88703 872 920 1769 901 872 913 870 925 878 910 873 916 877 916 877 910 873 1798 871 919 1770 894 878 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3339 1714 415 445 420 1283 418 440 415 448 418 444 422 435 420 446 420 440 415 445 421 443 412 445 421 443 412 449 416 1279 412 455 421 439 416 443 412 452 414 444 411 452 414 1287 414 442 413 453 413 1287 414 446 419 444 422 437 418 445 421 441 414 442 413 452 414 447 419 1281 420 443 412 1285 416 1287 414 1287 414 1282 419 447 419 441 414 1286 415 448 418 1280 421 1282 419 443 412 1283 418 448 418 1283 418 73871 3336 1694 414 444 411 1291 410 452 414 442 413 453 413 448 418 442 413 450 416 443 412 450 416 447 419 437 418 448 418 1282 419 441 414 449 417 442 413 449 417 446 420 436 419 1287 414 446 420 440 415 1288 413 445 410 453 413 449 417 439 416 450 416 445 421 439 416 447 419 1279 412 451 415 1287 414 1282 419 1287 414 1285 416 444 411 453 413 1285 416 447 419 1283 418 1278 413 453 413 1287 414 446 419 1284 417 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 4411 4332 558 1660 561 596 565 612 559 597 564 617 565 585 566 620 561 591 560 620 561 595 566 611 560 597 564 1653 558 592 559 627 565 589 562 617 564 1630 560 617 564 592 559 22591 4439 4322 558 1639 561 618 563 590 561 622 560 592 559 624 557 597 564 612 559 600 561 618 563 590 561 622 559 1628 562 621 561 594 567 609 562 597 564 1652 559 595 566 617 564 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3444 1767 413 487 419 1274 417 481 415 1277 414 488 418 1267 414 492 414 1276 415 484 412 1282 419 478 418 1275 416 1276 415 480 416 1280 421 479 417 1272 419 1275 416 1272 419 1274 417 484 412 484 412 493 413 1277 414 485 421 1273 418 479 417 486 420 1271 420 476 420 486 420 479 417 482 414 1280 411 1276 415 488 418 1273 418 478 418 488 418 481 415 1275 416 487 419 478 418 485 411 1280 421 475 421 1275 416 1273 418 69071 3439 1759 441 456 440 1253 438 463 443 1243 438 468 438 1251 440 460 446 1247 444 454 442 1251 440 461 445 1241 440 1256 445 455 441 1248 443 461 445 1242 439 1254 447 1245 446 1240 441 465 441 458 438 462 444 1249 442 456 440 1252 439 463 443 452 444 1252 439 461 445 454 442 461 445 452 444 1249 442 1250 441 454 442 1254 437 463 443 456 440 463 443 1245 446 456 440 462 444 451 445 1251 440 460 436 1253 438 1256 445 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8705 4317 583 682 581 688 585 678 585 1721 581 1722 580 681 582 690 583 682 581 1721 581 1725 587 1713 579 689 584 683 580 1718 584 1724 588 1714 588 677 586 683 580 683 580 1726 586 680 583 678 585 687 586 679 584 1718 584 1721 581 1719 583 685 588 1716 586 1713 579 1729 583 1719 583 41145 8706 2217 585 94686 8705 2217 584 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8888 4470 532 576 534 576 534 571 539 572 538 1706 535 568 532 581 529 578 532 1711 530 581 529 1711 530 1717 534 574 536 1703 538 575 535 572 538 1705 536 1711 530 1711 530 1716 535 1709 532 571 529 585 535 571 529 579 531 579 531 574 536 574 536 573 537 1701 530 1720 531 1712 529 39045 8912 2261 540 94838 8911 2235 536 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 874 915 1774 904 879 923 870 1816 1770 1800 1776 904 879 1805 874 931 1769 909 874 88698 876 927 1773 904 879 922 871 1819 1767 1796 1770 914 879 1809 870 928 1772 910 873 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 178 7753 174 2308 178 2284 171 2316 170 2298 177 10228 174 10724 223 1256 221 217 175 1868 169 2293 172 1327 216 1263 178 1316 217 2245 220 218 174 887 218 1261 170 10707 174 7752 175 2296 169 2314 171 2293 172 2307 179 10216 176 6265 174 10729 219 1258 219 1272 215 1268 173 2310 221 1255 222 217 175 877 172 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 532 1692 559 561 529 574 567 559 531 566 564 555 535 1694 557 568 532 1691 560 560 530 573 557 568 532 565 565 555 535 567 563 1688 533 564 567 554 536 567 563 562 538 558 562 558 532 1697 565 561 539 1683 558 1689 532 1697 564 1687 534 1689 562 1684 537 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 874 915 1774 904 879 923 870 927 876 1814 876 925 1775 900 872 1821 879 920 1769 909 874 88702 871 926 1774 907 876 925 878 917 876 1817 873 927 1773 905 878 1813 876 921 1769 912 871 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8884 4474 538 569 531 1716 535 570 530 580 530 1715 536 567 533 580 530 577 533 1710 531 1715 536 1705 536 1710 531 1714 537 1702 529 1720 531 1712 529 578 532 1715 536 1705 536 1710 531 577 533 570 530 584 536 571 529 1714 537 573 537 568 532 578 532 1713 538 1701 530 1719 532 1711 530 39044 8913 2260 531 94848 8907 2239 532 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 446 1694 455 1706 453 1705 424 628 452 597 452 622 458 1673 456 625 455 594 455 1706 454 590 459 621 459 591 458 616 453 591 458 622 539 22750 459 1675 454 1733 427 1712 427 622 458 588 451 622 458 1681 458 618 451 595 454 1705 455 598 451 625 454 592 457 616 453 598 451 626 535 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 3429 3445 875 2555 868 875 867 871 871 2560 873 868 874 2551 872 874 868 871 871 869 873 870 872 865 867 2565 868 873 869 2556 867 2567 866 874 868 2560 873 870 872 2555 868 2564 869 2586 847 2577 846 2589 844 870 872 32983 3470 3430 869 2559 874 868 874 867 875 2550 873 873 869 2559 874 865 867 877 875 862 870 873 869 872 870 2555 868 877 875 2554 869 2559 874 869 873 2554 869 873 869 2562 871 2553 870 2590 843 2586 847 2581 842 876 866 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8873 4452 571 1743 569 580 571 574 567 583 568 1746 566 1742 570 1748 564 582 569 578 563 1753 570 1740 572 1743 569 579 572 571 570 583 568 1744 568 579 572 578 573 572 569 1746 566 582 569 574 567 586 565 582 569 1743 569 1746 566 1744 568 581 570 1745 567 1741 571 1747 565 1746 566 41014 8898 2264 568 93853 8874 2263 569 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8902 4448 574 1739 573 1742 570 575 566 584 567 581 570 573 568 585 566 1746 566 580 571 580 571 1739 573 1742 570 1743 569 1739 573 1745 567 579 572 1741 571 1744 568 1742 570 1745 567 1747 565 1743 569 1749 573 1739 573 573 568 583 568 576 575 575 566 583 568 575 566 587 574 572 569 41011 8871 2266 566 93854 8902 2260 572 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 4275 4320 519 520 519 523 516 520 519 1599 520 520 519 515 524 521 518 520 519 1595 524 1595 524 1588 520 521 518 1599 520 1591 517 1603 516 1599 520 1595 524 1594 525 1588 521 1597 522 518 521 513 526 519 520 518 521 517 522 520 519 517 522 519 520 1597 522 1589 519 1601 518 1597 522 40475 8724 2186 514 93995 8752 2183 516 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 10380 4892 599 620 592 605 597 620 592 604 598 623 589 2081 598 627 595 2080 599 2101 598 2105 574 2099 590 2088 591 2111 599 591 590 2116 594 599 593 626 596 2082 597 619 593 2086 593 626 596 594 598 627 595 598 594 2106 593 604 598 2100 589 607 595 2107 593 2079 590 2116 594 2082 750 41149 8722 2109 590 94682 8727 2104 596 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 8879 4446 566 1747 565 1751 571 573 568 582 569 580 571 571 570 584 567 1744 568 579 572 578 573 1737 565 1751 572 1742 570 1738 564 1754 568 578 573 574 567 584 567 577 564 1752 571 577 564 580 571 582 569 577 564 1748 564 1752 571 1739 563 587 564 1750 572 1736 566 1752 571 1742 570 41009 8903 2260 572 93848 8880 2257 565 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 4271 4324 515 1600 519 1600 519 1594 515 1603 516 1601 518 1593 516 1605 514 1601 518 520 519 522 517 520 519 522 517 523 516 518 521 523 516 522 517 1598 521 1597 522 1591 518 1600 519 521 518 516 523 522 517 521 518 520 519 523 516 520 519 522 517 1599 520 1591 518 1603 516 1599 520 40477 8753 2183 516 93993 8724 2185 515 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.33 data: 7847 3931 470 1448 467 495 472 1443 472 490 467 1451 464 491 466 499 468 491 466 4413 467 1455 470 486 471 1449 466 495 472 1441 464 501 466 492 465 494 463 22093 7851 3934 467 1454 471 490 467 1446 469 496 471 1446 469 489 468 494 473 484 473 4410 470 1449 466 489 468 1455 470 489 468 1449 466 496 471 486 471 490 467 -# +# name: POWER type: parsed protocol: NECext address: 00 7F 00 00 command: 0A F5 00 00 -# +# name: POWER type: parsed protocol: NECext address: 01 72 00 00 command: 1E E1 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 01 72 00 00 command: 48 B7 00 00 -# +# name: CH- type: parsed protocol: NECext address: 01 72 00 00 command: 44 BB 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 01 72 00 00 command: 0A F5 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 01 72 00 00 command: 06 F9 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 01 72 00 00 command: 5C A3 00 00 -# +# name: POWER type: parsed protocol: NECext address: 86 05 00 00 command: 0F F0 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 86 05 00 00 command: 0C F3 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 86 05 00 00 command: 0D F2 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 86 05 00 00 command: 0A F5 00 00 -# +# name: CH- type: parsed protocol: NECext address: 86 05 00 00 command: 0B F4 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 86 05 00 00 command: 0E F1 00 00 -# +# name: POWER type: parsed protocol: NECext address: 02 7D 00 00 command: 46 B9 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 02 7D 00 00 command: 4C B3 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 02 7D 00 00 command: 0F F0 00 00 -# +# name: CH- type: parsed protocol: NECext address: 02 7D 00 00 command: 5A A5 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 02 7D 00 00 command: 0C F3 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 02 7D 00 00 command: 19 E6 00 00 -# +# name: CH- type: parsed protocol: NECext address: 02 7D 00 00 command: 41 BE 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 02 7D 00 00 command: 42 BD 00 00 -# +# name: CH- type: parsed protocol: NECext address: 02 7D 00 00 command: 57 A8 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 02 7D 00 00 command: 15 EA 00 00 -# +# name: POWER type: parsed protocol: NECext address: 84 E0 00 00 command: 20 DF 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 84 E0 00 00 command: 50 AF 00 00 -# +# name: CH- type: parsed protocol: NECext address: 84 E0 00 00 command: 51 AE 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 84 E0 00 00 command: 60 9F 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 84 E0 00 00 command: 61 9E 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 84 E0 00 00 command: 64 9B 00 00 -# +# name: CH- type: parsed protocol: NECext address: 84 E0 00 00 command: 57 A8 00 00 -# +# name: POWER type: parsed protocol: NEC address: 6E 00 00 00 command: 02 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 6E 00 00 00 command: 06 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 6E 00 00 00 command: 0C 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 6E 00 00 00 command: 08 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 6E 00 00 00 command: 0E 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 6E 00 00 00 command: 04 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4000 4000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 2000 500 1000 500 2000 500 1000 500 2000 500 1000 500 1000 500 1000 500 1000 500 1000 500 2000 500 2000 500 1000 500 2000 500 1000 500 2000 500 1000 500 2000 500 8500 4000 4000 500 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4000 4000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 2000 500 2000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 1000 500 1000 500 2000 500 2000 500 1000 500 1000 500 1000 500 1000 500 1000 500 1000 500 8500 4000 4000 500 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4000 4000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 2000 500 1000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 1000 500 1000 500 2000 500 2000 500 1000 500 2000 500 1000 500 1000 500 1000 500 1000 500 8500 4000 4000 500 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4000 4000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 2000 500 1000 500 2000 500 2000 500 2000 500 1000 500 1000 500 1000 500 1000 500 1000 500 2000 500 2000 500 1000 500 2000 500 1000 500 1000 500 1000 500 2000 500 8500 4000 4000 500 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4000 4000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 2000 500 1000 500 2000 500 2000 500 1000 500 2000 500 1000 500 1000 500 1000 500 1000 500 2000 500 2000 500 1000 500 2000 500 1000 500 1000 500 2000 500 1000 500 8500 4000 4000 500 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4000 4000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 2000 500 1000 500 2000 500 2000 500 1000 500 1000 500 1000 500 1000 500 1000 500 1000 500 2000 500 2000 500 1000 500 2000 500 1000 500 1000 500 2000 500 2000 500 8500 4000 4000 500 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4000 4000 500 2000 500 2000 500 2000 500 2000 500 2000 500 2000 500 1000 500 2000 500 2000 500 2000 500 2000 500 1000 500 1000 500 1000 500 1000 500 1000 500 1000 500 1000 500 2000 500 1000 500 1000 500 1000 500 1000 500 2000 500 8500 4000 4000 500 -# +# name: VOL+ type: parsed protocol: NEC address: 04 00 00 00 command: 02 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 04 00 00 00 command: 03 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 04 00 00 00 command: 09 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 04 00 00 00 command: 00 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 04 00 00 00 command: 01 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 50 00 00 00 command: 0B 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 50 00 00 00 command: 12 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 50 00 00 00 command: 15 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 50 00 00 00 command: 19 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 50 00 00 00 command: 18 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 85 7C 00 00 command: 80 7F 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 85 7C 00 00 command: 8F 70 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 85 7C 00 00 command: 93 6C 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 85 7C 00 00 command: 8D 72 00 00 -# +# name: CH- type: parsed protocol: NECext address: 85 7C 00 00 command: 91 6E 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 85 7C 00 00 command: 97 68 00 00 -# +# name: CH- type: parsed protocol: NECext address: 85 7C 00 00 command: 96 69 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8073 3997 524 502 495 505 492 1508 498 503 494 1505 501 1500 495 1504 491 1510 496 3988 522 502 495 1505 501 501 496 504 493 1507 499 502 495 1505 501 501 496 18806 8072 3997 524 502 495 505 492 1507 499 502 495 1505 490 1509 497 1504 491 1510 496 3988 522 502 495 1505 501 500 497 503 494 1506 500 501 496 1504 491 510 498 18806 8072 3998 523 503 494 506 491 1509 497 504 493 1506 499 1501 494 1506 500 1502 493 3989 522 504 493 1507 499 502 495 505 492 1508 498 503 494 1506 499 502 495 18807 8072 3998 523 503 494 506 491 1509 497 504 493 1506 500 1501 494 1506 500 1502 493 3989 521 503 494 1506 500 502 495 505 492 1508 498 503 494 1506 500 502 495 18807 8072 3998 523 502 495 505 492 1508 498 503 494 1505 501 1500 495 1504 491 1510 496 3988 523 502 495 1505 501 501 496 503 494 1506 500 501 496 1504 491 510 498 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 8065 4004 517 509 499 502 495 1505 501 500 497 1502 493 1507 498 1476 519 1482 523 3984 526 499 498 1502 493 1507 498 1477 518 507 501 500 497 1503 492 509 499 17804 8064 4004 516 510 498 503 494 1505 500 501 496 1503 492 1508 497 1503 492 1484 521 3986 524 501 496 1503 492 1508 497 1503 492 509 499 502 495 1505 500 502 495 17808 8071 3999 522 504 493 507 501 1500 495 506 491 1508 497 1502 493 1507 498 1503 492 3991 519 506 491 1508 497 1503 492 1508 497 504 493 507 501 1499 496 506 491 17814 8065 4006 525 500 497 504 493 1507 498 502 495 1504 491 1509 496 1504 491 1510 496 3987 523 502 495 1504 502 1499 496 1504 501 500 497 503 494 1506 499 502 495 17807 8072 3997 524 502 495 505 492 1508 497 503 494 1505 501 1499 496 1479 516 1485 520 3987 523 501 496 1504 491 1509 496 1479 516 510 498 503 494 1505 500 502 495 17806 8073 3996 525 501 496 505 492 1507 498 503 494 1505 500 1499 496 1479 516 1485 520 3987 523 502 495 1504 501 1499 496 1479 516 510 498 503 494 1506 499 502 495 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8069 3998 522 503 494 506 491 1509 496 505 492 1507 498 1501 494 1506 499 1502 493 3989 521 1503 492 1508 497 1503 492 508 500 1501 494 506 491 510 498 504 493 17810 8067 4003 517 508 500 501 496 1504 491 510 498 1502 493 1507 498 1501 494 1508 497 3984 526 1474 521 1504 501 1500 495 505 492 1509 496 505 492 508 500 502 495 17809 8069 4000 520 506 491 509 499 1501 494 507 501 1499 496 1503 492 1508 497 1504 491 3991 519 1480 525 1500 495 1505 500 500 497 1503 492 509 499 503 494 507 490 17809 8069 3999 521 505 492 508 500 1500 495 506 491 1508 497 1502 493 1507 498 1503 492 3990 520 1504 491 1509 496 1504 491 509 499 1501 494 507 501 501 496 505 492 17808 8070 3998 523 503 494 506 491 1509 496 504 493 1507 498 1501 494 1506 499 1502 493 3988 522 1502 493 1507 498 1502 493 507 501 1500 495 505 492 509 499 502 495 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8066 4002 519 507 501 500 497 1503 492 508 500 1500 495 1480 525 1475 520 1506 499 3983 517 508 500 1500 495 1481 524 501 496 1504 491 510 498 503 494 507 501 18803 8073 3997 524 503 494 506 491 1483 522 504 493 1506 499 1476 519 1482 523 1478 517 3989 521 504 493 1482 523 1478 517 508 500 1476 519 507 501 500 497 505 492 18809 8066 4003 517 508 500 501 496 1503 492 509 499 1501 494 1480 525 1475 520 1481 524 3983 516 509 499 1501 494 1482 523 502 495 1505 500 500 497 504 493 508 500 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 8069 4000 520 480 517 508 500 1500 495 505 492 1508 497 1502 493 1506 499 1502 493 3989 521 1503 492 1509 496 503 494 1506 499 1501 494 506 491 510 498 504 493 17807 8072 3997 524 501 496 505 492 1508 497 502 495 1505 500 1499 496 1504 491 1510 495 3986 524 1500 495 1506 499 500 497 1503 492 1508 497 503 494 507 501 501 496 17804 8064 4004 517 509 499 501 496 1504 491 509 499 1500 495 1505 500 1499 496 1505 500 3980 520 1505 500 1500 495 505 492 1508 497 1502 493 508 500 501 496 505 492 17807 8072 3995 526 500 497 503 494 1506 499 501 496 1504 491 1508 497 1503 492 1509 496 3985 515 1509 496 1503 492 508 500 1500 495 1506 499 501 496 505 492 509 499 17803 8065 4003 518 508 500 501 496 1504 491 509 499 1502 493 1507 498 1502 493 1508 497 3985 525 1500 495 1505 500 500 497 1503 492 1508 497 504 493 508 500 501 496 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8064 4006 525 501 496 504 493 1507 498 502 495 1505 500 1499 496 1504 501 1500 495 3987 523 1501 494 1507 498 502 495 505 492 1508 497 1503 492 509 499 503 494 17808 8069 4000 520 505 492 508 500 1500 495 506 491 1508 497 1503 492 1508 497 1504 491 3991 519 1505 500 1501 494 507 501 500 497 1502 493 1508 497 503 494 508 500 17803 8064 4006 525 501 496 504 493 1507 498 503 494 1505 500 1500 495 1505 500 1500 495 3988 522 1502 493 1507 498 503 494 506 491 1508 497 1503 492 509 499 503 494 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8068 3999 521 504 493 507 501 1498 497 504 493 1505 500 1475 520 1479 526 1500 495 3987 523 502 495 1505 500 501 496 504 493 1506 499 1501 494 507 501 500 497 18802 8072 3996 524 502 495 505 492 1507 498 503 494 1505 500 1475 520 1480 525 1476 519 3987 523 501 496 1504 491 510 498 502 495 1504 501 1475 520 505 492 509 498 18798 8065 4001 519 507 501 499 498 1502 493 507 501 1499 496 1504 501 1473 522 1504 501 3981 518 506 491 1509 496 505 492 508 499 1500 495 1505 500 500 497 505 492 18808 8065 4001 519 507 501 500 497 1503 492 508 499 1500 495 1505 500 1499 496 1506 499 3983 516 508 499 1501 494 507 501 500 497 1502 493 1508 497 504 493 508 500 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8065 4005 525 500 497 503 494 1506 499 501 496 1504 491 1508 497 1503 492 1509 496 3985 524 1500 495 506 491 510 497 503 494 506 491 1509 496 505 492 509 498 19801 8067 3999 521 504 493 507 500 1500 495 505 492 1508 497 1502 493 1507 498 1503 492 3989 520 1504 501 500 497 504 493 507 500 500 497 1503 492 509 498 503 494 19804 8064 4005 525 500 497 503 494 1506 499 502 495 1504 501 1499 496 1504 501 1501 494 3987 522 1503 492 509 498 502 495 505 492 508 499 1501 494 507 500 501 496 19800 8067 3999 520 505 492 508 499 1500 495 506 491 1508 497 1502 493 1507 498 1502 493 3988 521 1503 492 509 498 502 495 506 491 509 498 1501 494 507 500 501 496 19801 8066 4000 520 506 491 509 498 1501 494 507 500 1499 496 1504 491 1508 497 1504 501 3981 518 1507 498 503 494 507 500 500 497 504 493 1507 498 503 494 507 500 19798 8069 3998 521 504 493 508 499 1500 495 506 491 1508 497 1503 492 1508 497 1504 501 3980 519 1506 499 502 495 505 492 509 498 501 496 1504 501 500 497 505 492 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8064 4001 518 507 500 499 498 1502 493 507 500 1474 521 1479 516 1484 521 1479 516 3990 519 506 491 1508 497 504 493 508 499 500 497 1503 492 509 498 503 494 19803 8063 4003 516 509 498 502 495 1505 500 500 497 1478 517 1483 522 1478 568 1431 522 3985 524 501 496 1481 524 501 496 505 492 508 499 1500 494 507 500 501 496 19800 8067 4000 519 506 491 509 498 1477 517 506 501 1473 521 1479 515 1483 522 1479 526 3980 518 506 491 1485 520 505 492 508 499 501 496 1479 516 509 498 503 494 19800 8066 3998 521 504 493 507 500 1474 520 504 493 1482 523 1477 517 1482 523 1477 517 3989 520 504 493 1483 522 503 494 506 491 509 498 1477 517 508 499 502 495 -# +# name: POWER type: parsed protocol: NECext address: EA C7 00 00 command: 17 E8 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: EA C7 00 00 command: 0F F0 00 00 -# +# name: VOL- type: parsed protocol: NECext address: EA C7 00 00 command: 10 EF 00 00 -# +# name: MUTE type: parsed protocol: NECext address: EA C7 00 00 command: 20 DF 00 00 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3479 1762 421 452 417 1330 418 455 424 449 420 426 443 457 422 451 418 456 423 450 419 454 425 448 421 452 417 457 422 1324 424 449 420 453 415 458 421 452 417 456 423 450 419 454 425 448 421 453 416 1330 418 1329 419 454 415 458 421 1298 450 423 446 455 424 449 420 453 416 457 422 451 418 1329 419 1327 421 1325 423 451 418 1328 420 1326 422 1325 423 450 419 1328 420 453 416 1303 445 455 424 1295 453 448 421 -# +# name: VOL+ type: parsed protocol: RC6 address: 00 00 00 00 command: 10 00 00 00 -# +# name: VOL- type: parsed protocol: RC6 address: 00 00 00 00 command: 11 00 00 00 -# +# name: CH+ type: parsed protocol: RC6 address: 00 00 00 00 command: 4C 00 00 00 -# +# name: CH- type: parsed protocol: RC6 address: 00 00 00 00 command: 4D 00 00 00 -# +# name: MUTE type: parsed protocol: RC6 address: 00 00 00 00 command: 0D 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 182 7827 172 2332 177 2328 181 2323 176 2330 179 1309 175 1331 174 2331 178 1328 177 2328 181 1307 177 2327 182 1325 180 1326 179 1309 176 1331 174 1332 173 2333 176 2310 178 1328 177 2328 181 1325 180 2306 182 1325 180 2325 174 8340 183 7825 175 2330 179 2326 173 2333 176 2310 178 1328 177 1329 176 2329 180 1308 176 2329 180 1326 179 2326 173 1334 182 1306 179 1328 177 1329 176 1312 183 2322 177 2329 180 1326 179 2325 174 1315 180 2326 173 1333 183 2323 176 8339 183 7824 175 2330 179 2307 181 2324 175 2331 178 1328 177 1330 175 2311 177 1329 176 2329 180 1326 179 2327 182 1305 179 1328 177 1328 177 1311 173 1334 182 2323 176 2330 179 1326 571 1916 180 1327 178 2325 587 920 575 1930 579 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4096 3909 587 1917 592 1912 587 1917 540 1964 545 942 584 922 594 1910 589 1916 541 1963 546 1958 572 1913 586 1919 590 915 590 915 549 939 587 919 586 1918 591 1912 545 962 575 913 592 913 582 924 540 948 589 917 588 7923 4040 3964 584 1919 538 1966 543 1943 587 1917 592 914 591 915 538 1965 544 1942 588 1916 593 1911 588 1916 593 1910 589 918 546 942 595 911 594 912 541 1963 546 1939 591 915 590 916 589 916 548 940 586 920 585 920 543 7950 4097 3926 549 1955 575 1910 589 1915 594 1910 589 917 536 952 595 1909 590 1914 595 1909 590 1914 585 1920 537 1967 542 945 592 914 591 915 538 968 569 1916 593 1912 587 919 586 919 545 944 593 913 592 913 540 966 571 -# +# name: VOL- type: raw frequency: 38381 duty_cycle: 0.330000 data: 8885 4455 573 573 573 1641 573 573 573 1641 573 573 573 1641 573 1641 573 1641 573 573 573 1641 573 573 573 573 573 573 573 573 573 1641 573 1641 573 1641 573 573 573 573 573 573 573 573 573 1641 573 1641 573 573 573 573 573 1641 573 1641 573 1641 573 1641 573 573 573 573 573 1641 573 38196 8885 4507 573 573 573 1641 573 573 573 1641 573 573 573 1641 573 1641 573 1641 573 573 573 1641 573 573 573 573 573 573 573 573 573 1641 573 1641 573 1641 573 573 573 573 573 573 573 573 573 1641 573 1641 573 1641 573 573 573 1641 573 1641 573 1641 573 1641 573 573 573 573 573 573 573 38196 -# +# name: POWER type: parsed protocol: Samsung32 address: 07 00 00 00 command: E0 00 00 00 -# +# name: VOL- type: parsed protocol: Samsung32 address: 07 00 00 00 command: 23 00 00 00 -# +# name: CH- type: parsed protocol: Samsung32 address: 07 00 00 00 command: 13 00 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 07 00 00 00 command: 98 00 00 00 -# +# name: VOL+ type: parsed protocol: SIRC address: 01 00 00 00 command: 12 00 00 00 -# +# name: VOL- type: parsed protocol: SIRC address: 01 00 00 00 command: 13 00 00 00 -# +# name: CH+ type: parsed protocol: SIRC address: 01 00 00 00 command: 10 00 00 00 -# +# name: CH- type: parsed protocol: SIRC address: 01 00 00 00 command: 11 00 00 00 -# +# name: MUTE type: parsed protocol: SIRC address: 01 00 00 00 command: 14 00 00 00 -# +# name: POWER type: parsed protocol: SIRC address: 01 00 00 00 command: 6D 00 00 00 -# +# name: VOL- type: parsed protocol: SIRC address: 01 00 00 00 command: 73 00 00 00 -# +# name: VOL+ type: parsed protocol: SIRC address: 01 00 00 00 command: 72 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 195 1833 300 766 280 760 275 790 276 737 309 731 304 1801 301 1804 309 731 304 1801 270 795 282 758 277 762 273 1832 270 769 246 45851 326 1780 302 739 307 785 282 732 303 736 310 1795 307 732 303 763 303 1775 307 733 334 1798 273 1832 270 1810 251 814 273 1780 281 43762 302 1804 309 758 277 737 330 762 284 730 305 734 301 1803 310 1796 306 733 302 1829 273 767 279 734 301 791 275 1804 278 762 253 45870 307 1798 304 763 272 767 279 787 279 760 275 1829 284 730 305 734 301 1804 309 757 278 1827 275 1804 278 1828 274 765 270 1835 278 43740 303 1776 306 787 279 760 275 765 281 759 307 758 277 1775 307 1799 303 736 299 1832 281 759 276 763 304 736 299 1832 281 733 302 45820 306 1800 302 764 282 758 277 788 278 762 284 1821 281 732 303 736 310 1796 307 733 302 1829 273 1806 276 1830 272 767 268 1837 245 43772 302 1778 304 789 277 762 284 756 279 786 249 765 301 1777 336 1770 301 764 282 1824 278 761 274 765 301 738 308 1824 278 761 274 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 254 1721 360 681 354 738 308 706 329 711 355 1774 307 1772 361 1744 327 687 359 1772 299 742 335 705 330 736 279 1825 298 742 283 44773 384 1721 360 707 308 707 359 733 302 711 335 705 361 704 331 708 338 1766 336 704 331 1773 329 1776 306 1773 360 681 323 1782 331 44726 411 1722 328 686 360 733 302 711 335 705 361 1742 329 1803 330 1749 332 708 327 1777 335 705 330 710 325 741 274 1830 303 737 278 44778 359 1747 355 712 303 711 355 711 335 705 330 709 337 703 363 703 332 1770 332 709 337 1767 335 1771 300 1752 360 733 302 1776 326 44731 355 1751 330 711 355 737 309 705 330 710 336 1793 309 1771 331 1774 307 706 360 1771 300 740 326 714 332 735 280 1798 325 741 274 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8958 4449 510 4475 515 4444 515 2213 508 4477 513 2215 516 2212 509 2219 512 2217 514 2214 517 2211 540 2214 517 2211 510 4449 510 2218 513 4472 507 2220 511 30572 8960 2218 513 87698 8966 2211 510 87701 8963 2214 568 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 8956 4451 508 2220 511 2217 514 4470 510 4449 510 2218 544 2211 510 2218 513 2215 516 2212 509 2220 511 2217 514 2214 517 2211 510 2245 517 4441 508 2220 511 35049 8961 2215 516 87696 8959 2217 514 87698 8956 2220 511 87701 8964 2213 508 -# +# name: CH- type: parsed protocol: SIRC15 address: 97 00 00 00 command: 3C 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 02 00 00 00 command: 1F 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 02 00 00 00 command: 1E 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 02 00 00 00 command: 1C 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4009 3986 511 1987 517 1981 513 1985 519 1979 515 1009 493 1006 486 1986 518 1006 486 1987 517 1007 485 1987 517 1007 485 1014 488 1010 492 1007 485 1013 489 1984 510 1988 516 1008 494 1978 516 1008 494 1979 515 983 519 1979 515 8184 4015 3980 518 1980 514 1985 519 1979 515 1983 511 1013 489 1010 492 1980 514 1010 492 1980 514 1011 491 1981 513 1011 491 1007 485 1014 488 1010 492 1007 485 1987 517 1981 513 1012 490 1982 512 986 516 1983 511 1013 489 1983 511 8070 4015 3980 518 1981 513 1985 519 1979 515 1983 511 1014 488 1010 492 1980 514 1011 491 1981 513 1011 491 1981 513 1012 490 1008 494 1005 487 1011 491 1008 484 1988 516 1982 512 1012 490 1983 511 1013 489 1983 511 1014 488 1984 510 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4009 3986 511 1988 516 1982 511 1987 517 1981 512 1012 490 1009 493 1979 514 1010 492 1981 512 1986 518 1980 513 1985 519 979 513 1012 490 1009 493 1006 486 1986 518 1981 512 985 517 1982 511 987 515 1010 492 1006 486 1013 489 8184 4013 3982 515 1983 510 1988 516 1982 511 1987 517 1007 485 1014 488 1985 519 1005 487 1986 518 1981 512 1986 518 1980 513 1011 491 1008 494 1004 488 1011 491 1982 511 1987 517 1007 485 1988 516 1009 493 1005 487 1012 490 1009 493 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4012 3982 514 1984 519 1979 514 1984 519 1979 514 983 519 980 512 1988 516 982 520 1979 514 1984 519 1978 515 983 519 980 511 987 515 983 519 980 511 1988 516 1982 511 987 515 1983 521 978 514 985 517 981 521 1978 515 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4012 3983 513 1985 518 1980 513 1985 518 1980 513 984 518 981 521 1978 515 983 519 1980 513 1984 520 979 512 1986 517 1007 484 1014 488 1011 491 1007 495 1978 515 1983 510 1014 488 1984 519 979 512 1012 490 1983 510 1014 488 8185 4011 3984 512 1986 518 1980 513 1985 518 1980 513 1011 491 1007 485 1988 516 982 520 1979 514 1984 519 1005 486 1986 517 981 510 1014 488 985 517 1007 495 1978 515 1983 510 1014 488 1985 518 1006 486 1013 489 1983 520 1004 487 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4016 3980 516 1982 511 1987 516 1982 511 1987 516 982 520 1004 487 1986 517 980 511 1987 516 1982 511 1013 489 1010 492 1006 486 1013 489 984 518 1007 485 1988 516 1982 511 987 515 1984 519 1005 486 985 517 1982 511 1987 517 8182 4014 3981 515 1983 520 1978 515 1983 510 1988 515 982 520 979 512 1987 517 981 510 1988 516 1983 510 987 515 1010 492 981 521 978 513 985 517 981 521 1978 515 1983 520 978 514 1985 518 979 513 986 516 1983 520 1978 515 -# +# name: VOL+ type: parsed protocol: NEC address: 40 00 00 00 command: 1A 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 40 00 00 00 command: 1E 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 40 00 00 00 command: 10 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 40 00 00 00 command: 1B 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 40 00 00 00 command: 1F 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 04 00 00 00 command: 1A 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 01 00 00 00 command: 10 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 01 00 00 00 command: 0E 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 01 00 00 00 command: 0F 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 01 00 00 00 command: 0C 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 01 00 00 00 command: 0D 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 01 00 00 00 command: 17 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 9028 4480 593 1667 589 541 597 532 596 534 594 562 566 564 564 539 589 567 571 558 570 1663 594 1666 591 1696 571 1662 595 1666 591 1669 598 1662 595 562 566 563 565 539 589 567 571 1661 596 561 567 563 565 564 564 1669 598 1662 595 1691 566 1668 599 558 570 1663 594 1692 565 575 1669 -# +# name: POWER type: parsed protocol: NEC address: 08 00 00 00 command: D7 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 08 00 00 00 command: 80 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 08 00 00 00 command: 8E 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 08 00 00 00 command: 83 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 08 00 00 00 command: 86 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 08 00 00 00 command: DF 00 00 00 -# +# name: POWER type: parsed protocol: RC5 address: 01 00 00 00 command: 0C 00 00 00 -# +# name: MUTE type: parsed protocol: RC5 address: 01 00 00 00 command: 0D 00 00 00 -# +# name: VOL+ type: parsed protocol: RC5 address: 01 00 00 00 command: 10 00 00 00 -# +# name: VOL- type: parsed protocol: RC5 address: 01 00 00 00 command: 11 00 00 00 -# +# name: CH+ type: parsed protocol: RC5 address: 01 00 00 00 command: 20 00 00 00 -# +# name: CH- type: parsed protocol: RC5 address: 01 00 00 00 command: 21 00 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 00 7F 00 00 command: 50 AF 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 00 7F 00 00 command: 1E E1 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 00 7F 00 00 command: 5F A0 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 00 7F 00 00 command: 1F E0 00 00 -# +# name: CH- type: parsed protocol: NECext address: 00 7F 00 00 command: 5C A3 00 00 -# +# name: POWER type: parsed protocol: NECext address: 64 46 00 00 command: 5D A2 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 64 46 00 00 command: DE 21 00 00 -# +# name: CH- type: parsed protocol: NECext address: 64 46 00 00 command: DB 24 00 00 -# +# name: POWER type: parsed protocol: NEC address: 20 00 00 00 command: 52 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 20 00 00 00 command: 53 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 20 00 00 00 command: 02 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 20 00 00 00 command: 09 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 20 00 00 00 command: 03 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 20 00 00 00 command: 41 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 00 BF 00 00 command: 0D F2 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 00 BF 00 00 command: 44 BB 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 00 BF 00 00 command: 43 BC 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 00 BF 00 00 command: 0E F1 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 00 BF 00 00 command: 4A B5 00 00 -# +# name: CH- type: parsed protocol: NECext address: 00 BF 00 00 command: 4B B4 00 00 -# +# name: POWER type: parsed protocol: RC5 address: 03 00 00 00 command: 0C 00 00 00 -# +# name: VOL+ type: parsed protocol: RC5 address: 03 00 00 00 command: 10 00 00 00 -# +# name: VOL- type: parsed protocol: RC5 address: 03 00 00 00 command: 11 00 00 00 -# +# name: CH+ type: parsed protocol: RC5 address: 03 00 00 00 command: 20 00 00 00 -# +# name: CH- type: parsed protocol: RC5 address: 03 00 00 00 command: 21 00 00 00 -# +# name: MUTE type: parsed protocol: RC5 address: 03 00 00 00 command: 0D 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 00 BF 00 00 command: 00 FF 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 00 BF 00 00 command: 48 B7 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 00 BF 00 00 command: 49 B6 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 00 BF 00 00 command: 01 FE 00 00 -# +# name: POWER type: parsed protocol: Samsung32 address: 17 00 00 00 command: 14 00 00 00 -# +# name: CH- type: parsed protocol: Samsung32 address: 17 00 00 00 command: 11 00 00 00 -# +# name: CH+ type: parsed protocol: Samsung32 address: 17 00 00 00 command: 10 00 00 00 -# +# name: VOL- type: parsed protocol: Samsung32 address: 17 00 00 00 command: 13 00 00 00 -# +# name: VOL+ type: parsed protocol: Samsung32 address: 17 00 00 00 command: 12 00 00 00 -# +# name: MUTE type: parsed protocol: Samsung32 address: 17 00 00 00 command: 15 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3477 1735 448 424 445 1301 448 425 444 429 450 422 447 426 443 430 449 423 446 427 452 421 448 424 445 428 451 422 447 1299 450 422 447 426 443 430 449 423 446 427 452 420 449 424 445 428 451 421 448 1298 451 422 447 425 444 429 450 423 446 426 443 430 449 423 446 427 452 1294 444 428 451 1295 443 1303 446 1300 449 1297 452 421 500 373 444 1302 447 426 443 1303 446 1300 449 1297 452 1294 444 428 451 1295 443 74431 3476 1736 448 425 444 1302 447 426 453 419 450 423 446 427 452 420 449 424 445 427 452 421 448 425 444 428 451 422 447 1299 450 422 447 426 453 420 449 423 446 427 452 420 449 424 445 428 451 421 448 1298 451 422 447 425 454 419 450 423 446 454 425 447 422 451 418 427 452 1294 444 428 451 1295 443 1302 447 1300 449 1297 452 420 449 451 418 1301 448 424 445 1302 447 1299 450 1296 442 1304 445 454 425 1294 444 74431 3475 1737 446 425 454 1293 445 426 453 420 449 424 445 427 452 421 448 424 445 428 451 422 447 425 454 419 450 422 447 1300 449 424 445 427 452 421 448 424 445 428 451 421 448 425 454 418 451 422 447 1300 449 424 445 454 425 420 449 424 445 428 451 421 448 425 444 429 450 1296 453 419 450 1297 452 1294 444 1301 448 1298 451 422 509 364 453 1293 445 427 452 1294 444 1301 448 1298 451 1296 453 420 449 1296 453 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3474 1765 418 455 424 1323 415 458 421 451 418 456 423 422 447 454 415 458 421 452 417 456 423 450 419 454 425 448 421 1325 423 423 446 454 425 448 421 452 417 456 423 450 419 454 425 448 421 452 417 1330 418 455 424 448 421 453 416 457 422 451 418 455 424 449 420 453 416 457 422 451 418 455 424 449 420 453 416 1331 417 455 424 449 420 453 416 458 421 452 417 456 423 450 419 1327 421 424 445 1329 419 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3475 1737 446 427 452 1294 444 456 423 423 446 454 425 421 448 452 417 456 423 423 446 455 424 449 420 425 444 457 422 1297 451 421 448 453 416 457 422 451 418 428 451 449 420 426 443 457 422 424 445 1301 447 426 443 458 421 451 418 456 423 449 420 454 415 458 421 452 417 1302 446 427 452 448 421 452 417 456 423 1296 452 448 421 453 416 1303 445 455 424 449 420 453 416 430 449 1297 451 421 448 1299 449 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3476 1764 419 454 425 1321 417 456 423 450 419 455 424 449 420 453 416 457 422 451 418 455 424 449 420 453 416 458 421 1325 423 450 419 454 414 458 421 452 417 456 423 450 419 455 424 449 420 453 416 1330 418 455 424 449 420 453 416 457 422 451 418 456 423 450 419 454 415 458 421 452 417 1330 418 454 425 1321 417 1330 418 455 424 449 420 453 416 458 421 1325 423 450 419 1327 421 1325 423 450 419 1327 421 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3480 1759 424 450 419 1300 448 452 417 456 423 450 419 454 425 448 421 452 417 457 422 451 418 455 424 449 420 453 416 1331 417 455 424 449 420 454 415 458 421 452 417 456 423 450 419 454 425 448 421 1325 423 450 419 455 424 448 421 453 416 457 422 451 418 455 424 449 420 1326 422 424 445 1329 419 426 443 1331 417 1302 446 454 425 420 449 1298 450 450 419 1328 420 452 417 1330 418 1301 447 425 444 1330 418 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3477 1763 420 453 416 1330 418 455 424 449 420 453 415 458 421 452 417 456 423 450 419 454 425 448 421 452 417 456 423 1324 424 448 421 453 416 457 422 451 418 455 424 449 420 453 416 457 422 451 418 1329 419 454 415 458 421 452 417 456 423 450 419 427 452 448 421 452 417 456 423 1324 424 449 420 453 416 1330 418 1328 420 453 416 457 422 451 418 1329 419 454 415 458 421 1298 450 1323 425 448 421 1326 422 -# +# name: POWER type: parsed protocol: RC5 address: 00 00 00 00 command: 0C 00 00 00 -# +# name: CH+ type: parsed protocol: RC5X address: 00 00 00 00 command: 10 00 00 00 -# +# name: CH- type: parsed protocol: RC5X address: 00 00 00 00 command: 11 00 00 00 -# +# name: VOL+ type: parsed protocol: RC5X address: 00 00 00 00 command: 16 00 00 00 -# +# name: VOL- type: parsed protocol: RC5X address: 00 00 00 00 command: 15 00 00 00 -# +# name: MUTE type: parsed protocol: RC5 address: 00 00 00 00 command: 0D 00 00 00 -# +# name: CH+ type: parsed protocol: RC6 address: 00 00 00 00 command: 20 00 00 00 -# +# name: CH- type: parsed protocol: RC6 address: 00 00 00 00 command: 21 00 00 00 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 179 7828 182 2323 176 2328 181 2323 176 2329 180 1308 176 1330 175 2329 180 1326 179 2307 181 2323 176 2329 180 2325 174 1332 173 1315 180 1327 179 1328 177 2327 182 2322 177 1311 173 2332 177 1329 176 1330 175 1312 183 1324 181 8332 180 7826 174 2331 178 2326 173 2313 176 2330 179 1327 178 1328 177 2327 182 1306 179 2326 183 2322 177 2328 181 2323 176 1312 183 1324 181 1325 180 1325 180 2307 181 2323 176 1331 174 2330 179 1327 178 1310 175 1331 174 1332 173 8323 179 7845 176 2311 177 2327 182 2322 177 2328 181 1325 180 1308 177 2328 181 1325 180 2325 174 2330 179 2326 173 2314 174 1332 173 1332 173 1333 183 1306 178 2326 183 2322 177 1329 176 2328 181 1307 177 1329 176 1330 175 1313 182 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 183 7824 176 2329 180 2324 175 2329 180 2324 175 1314 181 1325 180 2324 175 1331 174 2331 178 2307 181 2324 175 1331 174 1331 174 1314 181 1326 179 1326 179 2325 174 2332 177 1310 174 2330 179 1327 178 1328 177 1310 174 2330 179 8334 178 7827 173 2332 177 2327 182 2323 176 2310 178 1328 177 1328 177 2327 182 1306 179 2326 183 2322 177 2327 182 1324 181 1307 177 1329 176 1330 176 1331 174 2311 177 2328 181 1325 180 2324 175 1332 173 1313 182 1325 180 2324 175 8339 173 1383 2522 3925 179 2325 576 1909 590 1915 594 1910 589 918 588 919 576 1911 175 1332 173 2330 592 1912 587 1918 581 907 588 918 598 908 587 920 575 913 592 1914 182 2320 592 914 581 1927 180 1307 178 1327 592 915 580 1925 574 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 176 7830 180 2324 175 2329 180 2324 175 2329 180 1308 176 1329 176 2328 181 1325 180 2305 183 2321 178 1329 177 2327 182 1324 181 1306 178 1328 177 1329 176 2327 182 2304 174 1332 173 2332 177 1328 177 1310 174 2330 179 1327 178 8333 179 7826 174 2330 179 2325 174 2313 175 2329 180 1326 179 1326 179 2325 174 1315 180 2324 175 2329 180 1326 179 2325 174 1314 181 1325 180 1326 179 1308 177 2328 181 2323 176 1330 175 2329 180 1308 176 1330 175 2328 181 1325 180 8314 177 7845 176 2310 178 2327 182 2322 177 2327 182 1323 182 1306 179 2326 173 1333 183 2322 177 2327 182 1305 179 2326 173 1333 183 1323 182 1305 179 1327 178 2326 173 2331 178 1327 178 2308 180 1326 179 1327 178 2325 174 1315 180 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 182 7824 176 2328 181 2323 176 2328 181 2324 175 1312 183 1323 182 2322 177 1330 175 2309 179 2325 174 1332 173 1333 183 1305 179 1327 178 1328 177 1328 177 2308 180 262 177 1885 175 295 175 861 174 2330 179 99 313 911 573 915 590 1916 180 64 349 1910 176 265 174 7896 177 3081 835 3912 182 2322 177 207 179 1942 180 2304 174 268 181 1881 179 263 176 889 177 264 175 886 583 1925 182 271 178 855 180 240 178 1907 174 2331 178 1327 178 1309 176 1329 590 916 589 919 173 306 175 833 181 317 174 1832 175 2329 180 1325 180 309 182 1833 174 1313 182 1325 180 289 181 1853 175 2329 180 8313 178 7845 176 2309 179 2325 174 2331 178 2326 173 1333 183 1304 180 2324 175 1332 173 2330 179 2325 174 1314 181 1325 180 1326 179 1327 178 1308 177 1330 175 2329 180 2324 175 1312 183 2322 177 1329 176 1329 176 2329 180 2304 174 8339 173 351 3575 3902 594 1911 588 1916 593 1911 588 1916 583 904 591 916 589 1915 594 911 584 1920 579 1907 592 915 590 915 591 916 579 908 597 909 596 909 586 1919 580 1907 179 1326 592 1912 597 908 587 901 594 1911 588 1916 593 -# +# name: POWER type: parsed protocol: NEC address: A0 00 00 00 command: 5F 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: A0 00 00 00 command: 1C 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: A0 00 00 00 command: 40 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: A0 00 00 00 command: 5D 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: A0 00 00 00 command: 03 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: A0 00 00 00 command: 1F 00 00 00 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1253 1157 464 560 465 858 460 2364 460 563 462 1462 463 1761 467 1156 465 1159 462 2661 467 1456 469 1155 466 86886 331 925 330 373 328 652 331 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 1224 1186 467 556 437 887 441 2382 463 560 433 1490 466 1757 461 1163 458 566 438 2686 463 1460 465 2359 434 86319 301 953 302 402 330 649 334 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4499 4472 566 1662 565 1664 563 1665 562 565 538 564 539 562 541 560 543 558 545 1683 544 1658 569 1686 541 559 544 557 536 565 538 563 540 561 542 559 544 1684 543 558 545 556 537 564 539 562 541 560 543 558 545 1684 543 558 545 1683 544 1684 543 1660 567 1688 539 1689 538 1664 563 565 538 563 540 561 542 559 544 42973 4495 4472 566 1662 565 1663 564 1664 563 564 539 562 541 560 543 558 545 556 537 1691 536 1691 536 1666 572 555 538 564 539 561 542 559 544 557 536 565 538 1689 538 563 540 560 543 558 545 555 538 563 540 561 542 1686 541 559 544 1684 543 1684 543 1658 569 1685 542 1686 541 1660 567 559 544 557 536 565 538 563 540 42959 4499 4466 562 1666 572 1656 571 1656 571 556 537 564 539 562 541 559 544 556 537 1691 536 1690 537 1664 563 564 539 562 541 560 543 557 536 565 538 563 540 1688 539 561 542 559 544 556 537 564 539 562 541 560 543 1684 543 558 545 1682 545 1683 544 1657 570 1684 543 1659 568 1659 568 559 544 557 536 565 538 563 540 42955 4503 4463 565 1663 564 1663 564 1664 563 563 540 561 542 558 545 556 537 564 539 1688 539 1688 539 1662 565 562 541 559 544 557 536 565 538 563 540 560 543 1685 542 559 544 556 537 564 539 562 541 559 544 557 536 1692 535 565 538 1690 537 1690 537 1664 563 1691 536 1666 572 1656 571 556 537 564 539 562 541 559 544 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4507 4464 564 1690 537 1691 536 1666 572 555 538 538 565 562 541 559 544 557 536 1693 545 1656 571 1657 570 557 536 565 538 563 540 561 542 558 545 1683 544 1657 570 1684 543 558 545 555 538 563 540 561 542 559 544 557 536 565 538 563 540 1688 539 1662 565 1663 564 1663 564 1664 563 564 539 536 567 560 543 558 545 42962 4496 4470 568 1686 541 1660 567 1661 566 560 543 558 545 556 537 564 539 561 542 1686 541 1660 567 1687 540 534 569 558 545 555 538 563 540 561 542 1686 541 1686 541 1686 541 533 570 557 536 565 538 563 540 560 543 558 545 555 538 563 540 1661 566 1687 540 1661 566 1661 566 1662 565 561 542 533 570 557 536 564 539 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4506 4465 563 1692 546 1658 569 1659 568 559 544 557 536 565 538 563 540 561 542 1687 540 1662 565 1689 538 563 540 561 542 560 543 558 545 556 537 1665 562 1693 545 530 563 1692 546 555 538 564 539 562 541 560 543 558 545 556 537 1665 562 539 564 1690 537 1691 536 1692 535 1693 545 556 537 539 564 563 540 561 542 42974 4505 4464 564 1690 537 1665 562 1667 571 530 563 565 538 563 540 561 542 559 544 1684 543 1659 568 1661 566 561 542 559 544 557 536 565 538 563 540 1663 564 1690 537 563 540 1662 565 559 558 545 556 537 564 539 562 541 1688 539 561 542 1687 540 1688 539 1688 539 1663 564 563 540 561 542 559 544 557 536 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4498 4471 567 1661 566 1662 565 1664 563 564 539 563 540 561 542 559 544 557 536 1693 545 1684 543 1659 568 559 544 557 536 566 537 564 539 562 541 560 543 1686 541 560 543 558 545 1684 543 558 545 556 537 564 539 1690 537 564 539 1689 538 1690 537 564 539 1689 538 1665 562 1666 572 556 537 564 539 563 540 560 543 42964 4504 4464 564 1690 537 1665 562 1666 572 555 538 564 539 562 541 560 543 558 545 1683 544 1684 543 1659 568 558 545 556 537 565 538 563 540 560 543 558 545 1683 544 556 537 565 538 1690 537 564 539 561 542 560 543 1685 542 558 545 1683 544 1657 570 557 536 1692 546 1683 544 1684 543 557 536 566 537 563 540 561 542 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4506 4464 564 1691 536 1692 546 1656 571 556 537 564 539 562 541 560 543 558 545 1683 544 1684 543 1685 542 558 545 556 537 565 538 563 540 561 542 558 545 556 537 564 539 562 541 1687 540 561 542 558 545 556 537 1691 536 1665 562 1692 546 1656 571 556 537 1691 536 1692 546 1683 544 557 536 565 538 563 540 560 543 42966 4502 4466 562 1693 545 1683 544 1684 543 558 545 556 537 564 539 561 542 559 544 1684 543 1684 543 1658 569 558 545 530 563 564 539 562 541 560 543 558 535 566 537 564 539 562 541 1687 540 560 543 558 545 555 538 1691 536 1665 562 1693 545 1657 570 557 536 1666 572 1683 544 1658 569 557 546 529 564 563 540 561 542 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4497 4474 564 1690 537 1691 536 1666 572 556 537 564 539 562 541 560 543 558 545 1683 544 1683 544 1684 543 532 571 556 537 564 539 562 541 560 543 1659 568 1686 541 1661 566 1662 565 562 541 560 543 558 535 565 538 563 540 561 542 558 545 556 537 1665 562 1666 572 1656 571 1684 543 557 546 555 538 564 539 562 541 42966 4502 4466 562 1692 535 1693 545 1657 570 556 537 565 538 562 541 560 543 543 1656 571 1656 571 1657 570 557 536 565 538 563 540 560 543 558 545 1683 544 1683 544 1657 570 1684 543 531 562 565 538 563 540 560 543 558 545 556 537 564 539 561 542 1660 567 1686 541 1687 540 1662 565 562 541 533 570 557 536 565 538 -# +# name: POWER type: parsed protocol: NEC address: 38 00 00 00 command: 12 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 38 00 00 00 command: 0E 00 00 00 -# +# name: VOL- type: parsed protocol: NEC address: 38 00 00 00 command: 0F 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 38 00 00 00 command: 18 00 00 00 -# +# name: CH+ type: parsed protocol: NEC address: 38 00 00 00 command: 0A 00 00 00 -# +# name: CH- type: parsed protocol: NEC address: 38 00 00 00 command: 0B 00 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 277 1806 274 775 281 776 279 770 275 774 281 768 277 1814 277 1806 274 775 280 1803 277 780 276 773 282 766 279 1831 249 781 274 45962 281 1803 277 771 274 783 273 802 253 770 275 1834 257 801 255 768 277 1807 273 775 280 1811 280 1804 276 1806 274 774 282 1811 280 43887 275 1809 282 767 278 779 276 799 256 766 279 771 274 1843 248 1810 281 767 278 1806 274 782 274 776 279 796 249 1807 273 784 282 45962 279 1804 276 772 273 784 282 768 277 798 247 1836 255 802 253 796 249 1808 283 766 279 1813 278 1805 275 1808 272 776 279 1813 278 43890 282 1801 279 769 276 781 274 775 280 769 276 773 283 1834 257 1801 279 769 276 1808 272 784 282 767 278 772 273 1810 281 776 279 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 282 1801 280 769 276 781 275 774 282 768 277 1805 276 781 275 775 281 769 276 1832 249 809 247 776 280 770 275 1834 247 784 282 47004 273 1811 280 768 277 780 276 773 283 767 278 771 274 1816 275 1809 272 1811 280 768 277 1815 276 1807 274 1809 282 767 278 1813 278 42841 284 1799 282 768 277 780 276 774 282 767 278 1805 276 781 275 774 282 768 277 1806 275 782 274 775 281 769 276 1807 274 783 283 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 273 1810 281 768 277 780 276 799 257 767 278 797 248 1816 275 774 282 768 277 1806 275 808 248 801 255 795 250 1807 274 809 247 46989 278 1805 276 799 246 784 282 767 278 798 247 1835 256 775 281 1803 278 1806 275 773 283 1809 272 1811 280 1803 278 771 274 1817 274 42868 278 1806 275 799 257 775 281 768 277 798 247 776 280 1811 280 770 275 773 283 1801 280 777 279 771 274 801 255 1802 279 778 278 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 282 1801 280 769 276 781 275 775 281 768 277 772 273 784 282 1801 280 770 275 1807 274 784 282 767 278 771 274 1809 282 775 281 47005 282 1801 280 770 275 782 274 776 280 769 276 1807 274 1817 274 775 280 1803 278 771 274 1817 274 1809 282 1801 280 770 275 1815 276 42841 273 1811 280 769 276 781 275 774 282 768 277 772 273 783 273 1811 280 794 251 1806 275 782 274 776 280 769 276 1808 273 783 283 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 277 1805 276 799 246 785 281 768 277 798 247 1810 281 775 281 1804 277 771 274 1810 281 801 255 795 250 772 273 1811 280 776 280 45957 274 1809 272 777 279 778 278 772 273 776 280 769 276 1815 276 799 246 1811 280 769 276 1815 276 1807 274 1809 282 767 278 1813 278 43890 280 1803 278 797 248 783 273 776 280 796 249 1834 247 784 282 1802 279 796 249 1808 273 783 283 793 252 770 275 1808 273 784 282 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 281 1803 278 771 274 782 274 775 281 769 276 1807 274 1817 274 1835 256 766 280 1804 277 780 276 773 283 767 278 1831 250 780 276 44910 276 1835 256 766 280 777 279 771 275 774 282 767 278 779 277 773 283 1800 281 768 277 1814 277 1806 275 1808 283 766 279 1811 280 44937 280 1803 278 771 274 783 283 766 279 770 275 1808 273 1819 272 1811 280 768 277 1807 274 782 274 776 280 769 276 1833 248 784 282 -# +# name: POWER type: parsed protocol: SIRC address: 01 00 00 00 command: 2E 00 00 00 -# +# name: POWER type: parsed protocol: SIRC address: 01 00 00 00 command: 2F 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: EA C7 00 00 command: 97 68 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 328 605 321 283 643 290 313 589 316 287 639 596 642 589 316 285 318 285 641 591 637 294 309 587 328 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 331 601 314 289 647 285 308 595 320 282 644 591 647 584 321 282 644 587 318 285 641 290 313 583 332 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 330 632 294 281 645 288 315 585 320 284 642 593 645 585 320 284 642 589 649 583 644 586 329 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 333 600 315 288 638 294 309 594 321 281 645 591 636 595 643 589 638 592 313 290 646 585 330 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 334 628 287 289 647 285 308 593 322 307 619 589 649 582 323 280 646 586 641 589 316 287 639 89967 331 602 313 290 646 286 307 595 320 283 643 591 647 584 321 282 644 588 639 591 314 288 638 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 332 601 314 290 646 286 307 594 321 282 644 590 648 582 323 281 645 586 641 290 313 583 644 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3997 3984 515 1987 518 1984 521 1980 514 2013 492 982 521 980 512 1989 516 984 519 1983 522 979 513 1987 518 983 520 981 522 979 513 1014 489 1012 491 1984 521 1981 513 987 516 1986 519 981 522 1980 515 986 517 1985 520 9037 4000 3982 516 1984 521 1981 513 1988 517 1984 521 979 513 988 515 1986 519 982 521 1981 513 987 516 1985 520 981 522 979 513 988 515 986 517 984 519 1983 511 1989 516 985 518 1983 522 979 513 1988 517 984 519 1983 522 9036 3991 3990 519 1983 511 1990 515 1986 519 1982 512 988 515 1012 491 1985 520 981 522 1979 515 985 518 1984 521 980 512 988 515 986 517 984 519 983 520 1981 513 1988 517 983 520 1982 512 988 515 1986 519 982 521 1981 513 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3993 3987 521 1980 514 1987 517 1984 520 1981 513 987 515 985 517 1984 520 980 522 1979 515 1987 517 1983 521 1980 514 986 516 984 518 982 520 980 512 1989 515 1986 518 982 520 1981 513 987 515 985 517 983 519 982 520 9036 3999 3981 517 1984 520 1981 513 1988 516 1985 519 980 512 989 513 1987 517 983 519 1982 512 1990 514 1986 518 1982 512 988 514 987 515 985 517 983 519 1981 513 1988 516 984 518 1983 521 979 513 987 515 985 517 983 519 9037 4019 3962 515 1986 518 1982 512 1990 514 1986 518 982 520 980 512 1989 515 985 517 1984 520 1981 513 1989 515 1985 571 929 521 979 513 988 514 986 516 1985 519 1981 565 936 514 1986 570 930 520 981 521 979 513 988 515 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3999 3982 516 1985 519 1982 512 1990 514 1986 518 982 520 980 512 1989 515 986 516 2010 494 1981 513 1989 515 984 518 982 520 981 521 979 513 1014 488 1986 518 1983 511 989 513 1988 516 984 518 982 520 980 512 1989 515 9040 4026 3954 512 1989 515 1985 519 1982 512 1989 515 985 517 983 519 1981 513 988 514 1987 517 1983 521 1980 514 986 516 984 518 982 520 980 522 979 513 1987 517 1985 519 980 522 1980 514 985 517 984 518 982 520 2007 487 9043 4023 3956 521 1980 514 1987 517 1984 520 1980 514 986 516 984 518 1982 522 979 513 1988 516 1985 519 1981 513 987 515 985 517 983 519 982 520 980 512 1989 515 1986 518 981 521 1980 514 986 516 985 517 983 519 1981 513 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3997 3983 515 1987 517 1983 521 1980 514 1987 517 983 519 981 521 1980 514 986 516 1985 519 2007 487 987 515 1986 518 982 520 980 512 989 513 987 515 1985 519 1982 512 988 514 1987 517 983 519 981 521 1979 515 986 516 9040 3994 3985 512 1989 515 1985 519 1982 512 1989 515 984 518 982 520 1981 513 987 515 1986 518 1983 521 979 513 2014 490 984 518 982 520 980 522 979 513 1987 517 1984 520 980 512 1989 515 985 517 983 519 1981 513 988 514 9042 3992 3987 521 1980 514 1987 517 1984 520 1981 513 987 515 985 517 1983 521 980 512 1989 515 1986 518 981 521 1980 514 986 516 984 518 983 519 981 521 1979 515 1987 517 982 520 1981 513 987 515 985 517 1983 521 980 512 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3994 3986 512 1989 515 1986 518 1982 512 1989 515 985 517 983 519 2008 486 988 514 1987 517 1983 521 979 513 987 515 986 516 984 518 982 520 980 512 1988 516 1985 519 981 521 1980 514 986 516 984 518 2009 485 1990 514 9041 3994 3986 511 1989 515 1985 519 1982 512 1989 515 984 518 982 520 1981 513 987 515 1986 518 1982 512 988 514 986 516 984 518 983 519 981 521 979 513 1987 517 1984 520 980 512 1989 515 984 518 982 520 2007 487 1988 516 9038 4028 3952 514 1986 518 1982 512 1989 515 1985 519 980 512 989 513 2013 491 983 519 1982 512 1989 515 984 519 982 520 980 522 979 513 987 515 985 517 1983 521 1980 514 986 516 1985 519 980 512 989 513 2013 491 1984 520 -# +# name: POWER type: parsed protocol: NECext address: 40 40 00 00 command: 0A F5 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 40 40 00 00 command: 15 EA 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 40 40 00 00 command: 1C E3 00 00 -# +# name: CH+ type: parsed protocol: NECext address: 40 40 00 00 command: 1F E0 00 00 -# +# name: CH- type: parsed protocol: NECext address: 40 40 00 00 command: 1E E1 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 40 40 00 00 command: 0F F0 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3476 1735 443 429 446 1300 451 422 453 420 445 428 447 426 449 423 452 448 417 429 446 426 449 424 451 422 443 430 445 1300 451 422 453 420 445 428 447 426 449 423 452 421 444 429 446 427 448 424 451 1295 445 427 448 425 450 423 452 420 445 429 446 426 449 424 451 421 444 1303 448 425 450 1296 444 1301 450 1296 444 1302 448 424 451 422 453 1293 447 426 449 1296 444 1302 448 1297 454 1293 447 425 450 1296 444 74939 3477 1734 444 429 446 1300 451 422 453 419 446 455 420 425 450 423 452 420 445 428 447 426 449 424 451 421 444 429 446 1300 451 422 453 420 445 428 447 425 450 423 452 420 445 429 446 426 449 424 451 1295 445 427 448 425 450 422 453 420 445 428 447 426 449 424 451 421 444 1302 449 424 451 1295 445 1301 450 1296 444 1302 449 424 451 422 453 1292 448 425 450 1296 444 1301 450 1297 443 1302 448 425 450 1295 445 74938 3478 1734 444 428 447 1299 452 421 444 429 446 427 448 425 450 422 453 420 444 428 447 426 449 423 452 421 444 429 446 1300 451 422 453 419 446 428 447 425 450 423 452 421 444 429 446 426 449 424 451 1295 445 427 448 425 450 423 452 420 445 428 447 426 449 424 451 421 444 1302 448 424 451 1295 445 1301 450 1296 444 1302 449 424 451 422 453 1292 448 425 450 1296 444 1301 450 1296 444 1302 449 424 451 1295 445 74938 3479 1733 445 428 447 1299 452 421 444 429 446 426 449 424 451 421 454 419 446 427 448 425 450 422 453 420 445 428 447 1299 452 421 444 429 446 426 449 424 451 422 453 419 446 427 448 425 450 422 453 1293 447 426 449 423 452 421 444 429 446 426 449 424 451 422 453 419 446 1301 450 422 453 1293 447 1299 452 1294 446 1300 451 422 453 419 446 1301 449 423 452 1294 446 1300 451 1295 445 1300 451 422 453 1293 447 -# +# name: MUTE type: raw frequency: 38000 @@ -3061,160 +3109,172 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3482 1730 448 425 450 1296 444 429 446 427 448 424 451 422 453 420 445 428 447 425 450 423 452 421 444 429 446 426 449 1297 454 419 446 427 448 425 450 423 452 420 445 428 447 426 449 424 451 421 444 1303 448 425 450 422 453 420 445 428 447 425 450 423 452 421 444 429 446 427 448 424 451 422 453 419 446 428 447 1298 453 420 445 428 447 426 449 424 451 421 444 429 446 427 448 1298 453 420 445 1301 450 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3512 1700 478 395 480 1266 474 399 476 396 479 394 481 392 473 400 475 397 478 395 480 393 482 390 475 398 477 396 479 1267 473 399 476 397 478 395 480 392 473 400 475 398 477 396 479 394 481 391 474 1272 479 394 481 392 473 400 475 398 477 395 480 393 482 391 474 399 476 1269 482 391 474 399 476 397 478 395 480 1266 474 398 477 396 479 1267 473 399 476 397 478 394 481 392 473 1273 478 395 480 1266 474 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3505 1707 481 391 474 1272 479 394 481 392 473 400 475 398 477 395 480 393 482 391 474 399 476 396 479 394 481 392 473 1273 478 395 480 393 482 390 475 398 477 396 479 394 481 391 474 399 476 397 478 1268 472 400 475 398 477 395 480 393 482 391 474 399 476 396 479 394 481 392 473 400 475 1271 480 393 482 1264 476 1269 482 391 474 399 476 397 478 395 480 1266 474 398 477 1269 482 1264 476 397 478 1267 473 106476 3510 1702 476 396 479 1267 473 400 475 398 477 395 480 393 482 391 474 398 477 396 479 394 481 391 474 399 476 397 478 1268 472 401 474 398 477 396 479 394 481 391 474 399 476 397 478 395 480 392 473 1274 477 396 479 393 482 391 474 399 476 397 478 394 481 392 473 400 475 398 477 395 480 1266 474 399 476 1270 481 1265 475 397 478 395 480 393 472 401 474 1271 480 393 482 1264 476 1270 481 392 473 1273 478 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3503 1708 480 392 473 1274 477 396 479 393 482 391 474 399 476 397 478 395 480 392 473 400 475 398 446 427 448 424 482 1264 476 397 478 394 481 392 473 400 475 398 477 395 480 393 482 391 474 399 476 1270 480 392 473 400 475 398 477 395 480 393 482 391 474 399 476 397 478 1268 472 400 475 1271 480 393 482 1264 476 1270 481 392 473 400 475 1270 481 393 472 1274 477 396 479 1267 473 1273 478 395 480 1266 474 74632 3510 1702 476 397 478 1268 472 400 475 398 477 395 480 393 482 391 474 399 476 396 479 394 481 392 473 400 475 398 477 1268 483 391 474 399 476 396 479 394 481 391 474 399 476 397 478 395 480 392 473 1273 478 396 479 393 482 391 484 388 477 397 478 395 480 392 473 400 475 1271 479 394 481 1264 476 397 478 1268 472 1273 478 395 480 393 482 1264 476 397 478 1267 473 400 475 1271 480 1266 474 399 476 1270 481 74602 3509 1703 475 397 478 1268 482 390 475 398 477 396 479 394 481 391 474 399 476 397 478 395 480 392 473 400 475 398 477 1269 482 391 474 399 476 397 478 394 481 392 473 400 475 397 478 395 480 393 482 1264 476 396 479 394 481 392 473 400 475 398 477 395 480 393 482 391 474 1272 479 394 481 1265 475 397 478 1268 472 1274 476 396 479 394 481 1264 476 397 478 1268 483 390 475 1272 479 1267 473 400 475 1270 481 -# +# name: MUTE type: parsed protocol: NEC address: 01 00 00 00 command: 41 00 00 00 -# +# name: MUTE type: parsed protocol: NECext address: A0 B7 00 00 command: AF 50 00 00 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3999 3980 517 1984 520 1980 513 1987 517 1983 521 979 513 987 515 1985 519 1983 511 1989 515 1986 518 1982 511 1989 515 984 518 982 520 980 512 989 513 1987 517 1983 521 979 513 988 514 986 516 984 518 982 520 980 512 9042 3991 3987 521 1980 514 1987 517 1983 521 1980 513 986 516 984 518 1982 511 1989 515 1986 518 1982 512 1989 515 1985 519 981 521 979 513 987 515 985 517 1983 521 1979 515 986 516 984 518 982 520 980 512 989 513 987 515 9038 4027 3952 514 1987 517 1983 521 1979 515 1986 518 981 521 979 513 1988 516 1985 519 1981 513 1988 516 1984 520 1980 514 986 516 984 518 982 520 980 522 1978 516 1986 518 982 520 980 512 988 514 986 516 984 518 982 520 9035 4019 3959 517 1983 521 1979 515 1986 518 1982 511 988 514 986 516 1984 520 1981 512 1988 516 1984 520 1980 513 1987 517 983 519 981 521 979 513 987 515 1985 519 1982 511 988 514 986 516 984 518 982 520 980 543 957 545 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 4006 3983 521 1975 518 1980 513 1984 519 1977 516 987 521 983 515 1982 521 1977 516 1981 522 1974 519 1979 514 1983 520 983 514 989 519 985 523 981 517 2007 496 1975 518 985 523 981 517 987 521 1009 489 989 519 985 523 8466 4010 3979 515 1981 522 1975 518 1980 513 1984 519 984 513 990 518 2005 488 1983 520 1977 516 1981 522 1974 519 1979 514 1015 493 985 523 980 518 986 522 1975 518 1980 513 990 518 986 522 981 517 988 520 1010 488 989 519 8469 4007 3981 523 1972 521 1976 517 1980 523 1974 519 984 524 980 518 2005 488 1984 519 1978 515 1982 521 1975 518 1980 513 990 518 985 523 1008 489 987 521 1976 517 1981 522 981 517 1013 495 1009 489 988 520 984 513 1016 492 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4008 3980 524 1972 521 1976 517 1980 513 1984 519 983 514 989 519 1979 514 989 519 1978 515 1983 520 1976 517 1980 523 980 518 986 522 1008 490 1014 494 1977 516 1980 523 980 518 1980 513 990 518 1012 496 1007 491 986 522 8465 4011 3978 516 1980 513 1983 520 1977 516 1980 523 980 517 986 522 1975 518 985 523 1974 519 1978 515 1982 521 1975 518 985 523 981 517 986 522 1008 489 1981 522 1974 519 985 523 1974 519 1010 498 979 518 985 523 981 517 8470 4006 3983 521 1974 519 1978 515 1982 521 1976 517 986 522 982 515 1981 522 982 516 1982 521 1975 518 1979 514 1983 520 983 515 989 519 1011 497 981 517 1980 523 1974 519 985 523 1974 519 984 524 1006 491 1012 496 982 516 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4010 3978 515 1980 523 1974 519 1978 515 1982 521 982 515 988 520 1977 516 988 520 1977 516 1981 522 1974 519 1011 497 1006 491 1012 496 1007 490 1013 495 1976 517 1980 523 980 518 1980 523 980 517 985 523 981 516 1981 522 8465 4000 3987 517 1979 513 1984 519 1977 516 1981 522 981 517 987 521 1976 517 987 521 1976 517 1980 523 1974 519 985 523 980 517 986 522 982 516 988 520 1977 516 1981 522 981 517 1981 522 980 517 986 522 982 515 1981 522 8465 3999 3986 518 1977 515 1981 522 1974 519 1978 514 1015 493 984 524 1973 520 1010 487 1983 520 1976 516 1980 523 1006 491 1012 496 1007 490 1013 495 1008 489 1982 521 1975 518 1012 496 1975 518 1011 497 1006 492 1012 496 1975 518 -# +# name: CH+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4005 3982 522 1974 519 1978 515 1982 521 1975 518 986 522 982 515 1981 522 981 517 1980 523 1974 519 984 524 1973 520 984 524 979 518 985 523 981 517 1980 523 1973 520 984 524 1973 520 984 513 990 518 1978 515 989 519 8468 4008 3979 514 1981 522 1974 519 1978 515 1982 521 983 515 1014 494 1977 516 1014 494 1977 516 1982 521 982 516 1981 522 982 515 987 521 983 514 989 519 1978 515 1982 521 982 516 1981 522 981 516 988 520 1977 516 988 520 8468 4007 3980 524 1972 521 1976 517 1980 523 1973 520 984 524 979 519 1979 514 989 519 1978 515 1982 521 982 516 1981 522 981 517 986 522 982 516 1014 494 1977 516 1980 523 980 517 1980 523 979 519 985 523 1975 518 985 523 -# +# name: CH- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4006 3981 523 1973 520 1977 516 1981 522 1974 519 1011 497 1006 491 1979 524 1005 493 1978 515 1982 521 1009 488 1015 493 1010 498 1006 491 1012 496 1007 490 1980 523 1973 520 1010 498 1973 520 983 515 1016 492 1978 514 1983 520 8468 4007 3982 522 1973 520 1977 516 1981 522 1975 518 986 522 1008 490 1982 521 982 516 1982 521 1976 517 986 522 982 516 988 520 984 524 979 519 985 523 1975 518 1979 514 989 519 1978 515 988 520 984 524 1973 520 1977 516 -# OFF -name: POWER -type: parsed -protocol: NEC -address: 01 00 00 00 -command: 59 00 00 00 -# OFF -name: POWER -type: parsed -protocol: NEC -address: 08 00 00 00 -command: D5 00 00 00 -# OFF -name: POWER -type: parsed -protocol: RC5 -address: 01 00 00 00 -command: 2A 00 00 00 -# OFF -name: POWER +# +name: VOL+ type: parsed protocol: NECext -address: 00 7F 00 00 -command: 0C F3 00 00 -# OFF -name: POWER +address: AD ED 00 00 +command: BA 45 00 00 +# +name: VOL- type: parsed protocol: NECext -address: 86 05 00 00 -command: 13 EC 00 00 -# OFF -name: POWER +address: AD ED 00 00 +command: BB 44 00 00 +# +name: CH+ type: parsed protocol: NECext -address: 02 7D 00 00 -command: 11 EE 00 00 -# OFF -name: POWER +address: AD ED 00 00 +command: B0 4F 00 00 +# +name: CH- type: parsed protocol: NECext -address: 84 E0 00 00 -command: 22 DD 00 00 -# OFF +address: AD ED 00 00 +command: B1 4E 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: AD ED 00 00 +command: C5 3A 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1068 514 646 516 646 1414 647 1415 646 517 645 1415 673 489 674 1386 675 487 675 1386 674 1386 700 10636 1098 487 673 490 672 1389 671 1413 646 516 645 1416 643 519 643 1418 642 520 642 1419 641 1419 641 10694 1066 518 642 520 642 1419 641 1419 642 520 642 1419 641 520 642 1419 642 520 642 1419 641 1419 642 10694 1066 519 641 521 641 1419 641 1419 642 521 641 1419 642 520 642 1419 641 521 641 1419 642 1419 641 10694 1066 519 641 521 641 1419 641 1419 641 521 641 1419 641 521 641 1419 642 521 641 1420 641 1419 641 10694 1066 519 641 521 641 1419 642 1419 641 521 641 1419 642 521 641 1420 640 521 641 1420 641 1419 641 10694 1066 519 641 521 641 1420 641 1420 640 521 641 1420 640 521 641 1420 641 521 641 1420 640 1420 640 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1069 513 647 1124 646 516 646 807 646 1124 646 516 646 516 646 1415 673 1096 675 488 674 488 674 13013 1098 486 674 1096 673 489 672 782 670 1123 645 516 645 517 644 1417 643 1127 642 520 642 520 642 13045 1067 518 642 1128 642 520 642 811 642 1128 642 520 642 520 642 1419 642 1128 642 520 642 520 642 13045 1066 518 642 1128 642 520 642 811 642 1128 642 520 642 520 642 1419 641 1128 642 521 641 520 642 13046 1066 519 641 1128 642 521 641 811 642 1129 641 521 641 521 641 1419 641 1128 642 521 641 520 642 13046 1066 519 641 1129 641 521 641 812 641 1129 641 521 641 521 641 1419 642 1129 641 521 641 521 641 13046 1065 519 641 1129 641 521 641 811 642 1129 641 521 641 521 641 1420 640 1129 641 521 641 521 641 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1071 515 645 1124 646 516 646 807 646 1124 674 487 676 487 675 1385 675 1385 675 487 701 752 701 12406 1098 487 673 1097 672 492 669 805 646 1124 645 517 644 519 643 1418 642 1418 642 520 642 811 642 12464 1067 518 642 1128 642 520 642 811 642 1128 642 520 642 520 642 1419 642 1418 642 520 642 811 642 12464 1066 519 641 1128 642 520 642 811 642 1128 642 520 642 520 642 1419 642 1419 641 520 642 811 642 12464 1066 519 641 1128 642 521 641 811 642 1128 642 521 641 521 641 1419 642 1419 641 521 641 811 642 12464 1066 519 641 1129 641 521 641 811 642 1129 641 521 641 521 641 1419 642 1419 642 521 641 812 641 12464 1066 519 641 1129 641 521 641 812 641 1129 641 521 641 521 641 1419 641 1419 642 521 641 812 641 +# name: POWER type: parsed protocol: NEC -address: 20 00 00 00 -command: 4E 00 00 00 -# OFF -name: POWER +address: 00 00 00 00 +command: 1A 00 00 00 +# +name: VOL+ type: parsed protocol: NEC -address: 04 00 00 00 -command: 0E 00 00 00 -# OFF -name: POWER +address: 00 00 00 00 +command: 11 00 00 00 +# +name: VOL- type: parsed protocol: NEC -address: 04 00 00 00 -command: 1B 00 00 00 -# OFF +address: 00 00 00 00 +command: 33 00 00 00 +# name: POWER -type: parsed -protocol: NEC -address: 01 00 00 00 -command: 5E 00 00 00 -# OFF -name: POWER -type: parsed -protocol: NECext -address: EA C7 00 00 -command: 62 9D 00 00 -# OFF -name: POWER -type: parsed -protocol: Samsung32 -address: 07 00 00 00 -command: 03 00 00 00 -# OFF -name: POWER -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 36 00 00 00 -# OFF -name: POWER -type: parsed -protocol: Samsung32 -address: 07 00 00 00 -command: 24 00 00 00 -# +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3481 1715 457 442 428 1284 457 442 428 443 427 443 427 443 427 442 428 442 428 442 453 417 453 417 453 417 452 418 451 1289 451 422 448 447 422 424 447 447 423 448 422 424 446 448 422 448 422 448 422 1319 422 448 422 448 422 448 422 448 422 448 423 448 422 448 422 448 422 1319 422 448 422 1319 422 1319 422 1319 422 1319 422 448 422 449 421 1319 422 448 422 1320 421 1319 422 1320 421 1319 422 449 422 1319 422 74732 3475 1750 422 448 422 1319 422 448 422 448 422 448 422 448 422 448 422 448 422 448 422 448 422 448 422 448 422 449 422 1319 422 449 421 449 421 448 422 449 421 449 421 449 421 449 421 449 421 449 421 1320 421 449 421 449 421 449 421 449 421 449 422 449 421 449 422 449 421 1320 421 449 421 1320 421 1320 421 1320 421 1320 421 449 421 449 421 1320 421 449 421 1320 421 1320 421 1320 421 1320 421 450 420 1321 420 74732 3475 1750 422 448 422 1319 422 448 422 448 423 448 422 448 422 448 422 448 422 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 448 422 448 422 448 422 448 422 449 421 449 421 449 421 448 422 1320 421 449 421 449 421 449 422 449 421 449 421 449 422 449 421 449 421 1320 421 449 421 1320 421 1320 421 1320 421 1320 421 449 421 449 421 1320 421 449 421 1320 421 1320 421 1320 421 1320 421 449 421 1320 421 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3596 1604 513 388 429 1282 459 442 428 442 428 442 428 442 428 442 428 441 429 441 429 442 428 442 428 443 426 445 449 1289 452 446 423 447 423 448 422 448 422 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 448 422 448 422 448 422 448 422 448 422 448 423 448 422 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 449 422 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 1320 421 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3480 1715 457 441 429 1284 457 442 428 442 428 442 428 442 428 442 428 441 429 442 428 442 453 417 453 417 453 418 451 1289 451 421 449 447 423 447 423 447 423 447 423 448 422 448 422 448 423 447 423 1318 423 447 423 448 422 448 423 447 423 448 423 448 422 448 422 448 422 1319 422 448 422 448 422 448 423 448 422 1319 422 448 423 448 422 1319 422 448 422 448 422 448 422 448 422 1319 422 448 423 1319 422 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3537 1660 458 441 429 1311 430 442 428 442 428 442 428 442 428 442 428 442 428 442 428 442 428 442 453 417 453 417 453 1287 453 420 449 422 447 447 423 448 422 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 447 423 448 422 448 422 448 422 448 422 448 422 448 423 448 422 1319 422 448 422 448 423 1319 422 1319 423 448 422 448 422 448 422 1319 422 448 422 448 422 1319 422 1319 422 448 422 1319 422 +# +name: CH+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3481 1715 457 441 429 1311 430 442 429 442 428 442 428 442 428 442 428 441 429 442 428 442 453 417 453 417 452 419 450 1289 451 422 447 447 423 447 423 447 423 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 448 422 448 422 448 422 448 423 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 1319 422 1319 422 448 422 448 422 448 422 448 422 1319 422 448 422 1319 422 1319 422 448 422 1319 422 +# +name: CH- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3505 1690 483 416 454 1258 483 416 454 416 454 417 428 442 428 442 428 441 455 416 454 416 454 416 454 417 452 419 450 1289 451 421 448 423 447 448 422 448 422 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 448 422 448 422 448 423 448 422 448 423 448 422 448 422 1319 422 448 422 1319 422 448 422 1319 422 1319 422 448 422 448 423 1319 422 448 422 1319 422 448 422 1319 422 1320 421 449 421 1319 422 +# diff --git a/assets/resources/subghz/assets/keeloq_mfcodes b/assets/resources/subghz/assets/keeloq_mfcodes index a1b36da9d..0c0e15a62 100644 --- a/assets/resources/subghz/assets/keeloq_mfcodes +++ b/assets/resources/subghz/assets/keeloq_mfcodes @@ -1,48 +1,51 @@ Filetype: Flipper SubGhz Keystore File Version: 0 Encryption: 1 -IV: F2 D4 F5 5A B3 CC 3F 21 28 3A AF ED D1 EB 73 DF -BBFA4D79A73C384D6E07E717F761F32A625F28AA1DB2261B8B19A18261E30AB6 -CE4004AB56111B0B3D486770705FAD8BD616A80957EA2C537BAF1FD09E552DA3 -F974561612C9C751237C64D978F706B41873FDBE38851306574F436CB02D9ECA -E29CAB7C2C2D9853D0F4DF69F582562E8182234E78B355540F6FE3F78C73D518 -97ABE18993A700A607E37DC88E1434F84DDD1C2771693978C9D2FA4CE4F2AB7BBC7C3EB3E8545B37FBBE1C1F1CA03543 -E86ABD0AAE5A4B4A9414C9CB6112CA49B3A8EC29723B14DCA85902F41B05ADDC -C1FBE921035F408C59DA6AD5E76E3887AC9BC90146619B3CAE445BED556E96AC -232C9F86915B927888352797B45F159268FE78956CF09B8D241CDC393D3B0225 -3D9E2A3C701C9D4DD4D72038D4536CA6F515C547CAB0AD18BA71204BD2ABFB74 -4D69A4506D2C97EF8EC68F90CF1AD1065A1EB909793EEB3AF71B0D75E55B9E76 -5A7F4595DFA181C3E946EBEE4974DBD6DA85AF6FCAD0B3725FDD28667175A421D69A2122853E57927C38CCF368732476 -6A946FAEDE134155B5A88EC01AA535E7A778947D360218B560381A64CAF9ACE896079D04C14718D5AD5C0D4EE3005F52 -88AC0C723AAA875A1885C8392A616FA43B205119B0E8D299193979A1921FC8B3 -40588AADA5E1A8BE214B2CCF32D268B48C6B783AE0DD10D88BDF3FF88E921E09 -A7BE05D05DEC9B9A3AE1575D411BF7B12366AD78B726F3E3E843E7BF199961A4 -79F973A155A4367F0EAA078AA0857A2A2A82FC4C8A5AE9E567E7CBF62C2A5CE2 -C38296EEABDA1F95D0C401CC6DDC8656476DC19248588EEF1CB93773D94CDB02A40C902970C4FCB14FABEFFB4F8BC208 -B0B7699B3C3573EE4D88D8CE65FAF3532B5A741D1F20892C0F38BAA2BCE98F2D -6E401D6BDB1B33A404DEB668F3FB353166475487BAADE4A348E3CFDEB3B1B54B -0E44B87878617559783CC6A7C65BE9F99950FE8956ED4BB04894BC53085E3A09CA19915B1E8C143A68D1B7A97F5D1ECB -AC19E55638429C65E6E567C0E96DA9648F8FB80215CF693D7FD5DD86FE7989AC7AC7BAE86BBD4FFF7161AFFB405FFA98 -BCE70C69D90AD639A737813FC8FD26F40F803137BD36E47651C266A671428D6F -F053CF5255AD2E1875A5C38635F7BF203B1DAE1433B162C30AE8695AC8A5589D -B7EFC77FFA98B173E429B3566A27842C4DC5E91B0BC01F07A6A98332C4E1F42A -D7C7950FFB2C5E7D9BCDBC230BF5F1BFFC0FE6F1CF5C8C6013DD90E41AE403FE -50667B2E5909FD5F9D6385788A81DE5F72E56512EAD6BF5EACCA959CB6AF0DEF -6BDDE1EA185EA975343C161DF358E0AE71007DE13EE8CD26683C28B21470B910 -8128188D151CB4D465427768BF811B1AF5345801BF6F5C937A11F0485F90CA46 -9FF6331E570479788C2D61916DB48DDE534F8C049056D4E3216ADCB37C9556A6 -0636731CB79FC7459BAFA37E704D58765551631F3936892FD244CF989127540A -ECB48EF5C599D4A5F1FD39A62A06EF910B1B4973BFBFDFEF61F00C81E87847BA -AAC73DC804600A04BD962F7C5B9ACA99F3769EED9F2DD7AF8338E7220271090F -3EA4D2329D0BA54E80AF71966BD74CB13C21DF8010EE795BCCCE6A580EC05758 -F491DE599DA31EA9A51509B69846C6C1FB6AB5BBE3AA5915D51225F205A55EC2 -54347F82D73E4B66569DAAB52B03EB5A6440F9FDFD302454B84B4E41E0E7E55C -28BBAB93FEB24CE27C47B068C065A294758CECBC3531FA691D085D2B10D189616DB074AC6F8D75BBE176A9459347968C -61260BD3C4FCEF8208CC88682032E4FE295F8D000998302AD11D8D643A30EC4F -97309829406F5CF8FA15565F8F6CF53DEA0E5C0B59DD657A2BB1F58FBCF3DF7F -EA622706F837A37D84D806F15E73D6B95658129F9E12170587200BFB8BDBAEEA -67EAFE49F7872D6EBDB4127E5107D9EB147393038DBAC4D6C4916AD7668C463D -65D7D3225DEAE1BA33F1EAB6F14E817C9D47646123E02C9D4C1BEAF46DD9DF547FE9AD432E1CD648165AE10D7D240B88 -223158904F64C174A87ED14F1CACB86DA9AD7D0ED32AEB2A7E955715498969FB -9CA01D5797B93547F246CB06EDD96CABECE27E0BAB6D090681B63E83AD4F2167 -AD0BF3A0C1ECDF869BF3022AAA0065941F1D354CCE346B47740D2794FD042D47 \ No newline at end of file +IV: 2A 34 F1 5A AF 6F F5 1A 83 A6 1E DA DE B7 3D F1 +06B63DF24AE073A2F2B19C55CA9E8364FBECD26E49C551990153F6513BDE5267 +6139C78C74C341EB7474085CF1D047BD6FB005F80A72AF3EF3F89D58EF5DF500 +D85F11689020ECA47FBE9C2B67EE41A81E1F06DE2A35AF958965E3ECE29EA701 +1AE9073A42FE0E439544FE6945F6B33CF15A7A4A279020B5E0B3BE33FD189A7E +E161F007854BB33E0056FA09A2E2DEE66789B5C87C8D6D3DE2C8C1BD2B48983EB9D1C5697CA6E95996918F7C47B761B0 +59AE4644DCB3D720C38B5115F230DA58E7BE0A697907F6174BB05AB7886ACDB1 +634DF0BCC185C4C1F7E1B1594B4438D051ABAE092433078963063B51D961D08C +1EBEBCB49E498B9BE977D53EC21B9A546155B627737BD0AA832D496035729346 +4DFA93E639197772D57E8ACE04512CEFC045B8CC965C175A25ED525B630CBB63 +C2D5235D1014A319B249EAE8A5EE350F18D5AB8A498EF222704BD4EB1435F388 +F66D1937160E1392197F463A52E87FCE938A92070892113443C348D7553327A5715CF615CE2F2C96284F47759E043419 +841D29E7CBE040188E2283BFBA9F26EF2F65CCB085B56C3515E8C46C3F20BD75BAA963550869435FDAF509CEEE66A2C4 +7D87E24487D307635E7A17B989B8547EE11F3BF3468D055F0B44633B631BA42C +B4916043973501B95A82B329196D6EBA69FBBC3AF8FD914583104E0E18CE82F6 +E4649F9C2A5465D2EA6F3E9724DD06CD6962FE2BAEB14F1453C14D1559232AE1 +96E15D890DF7FD348441F5E429A875754C6BF0520A787F8E9D8C5415674783CC +CB52005EDED47B57F795BC92FB0522EAB18D23EE028B8D10ED57828C250EB285BFEC6E4A4BE8DABCE0D57ECAA20D90C3 +8E5A50C7D5C374445E88752301D20F0B3D6E4988B61D90FD63779B0EDEF9C60D +49D6CB276A0E5FF134A38062503F01351F44CD6455708B50B5F07D03FC477C33 +CB45B56613DF208E79E4E10A6510F07DC1AA49210C7B94E8BBAECD2C35EC6ABC99FB10FD7C96DD6BB6A6685E9FAD93FB +0743F3CC51200F763C242F1956B4D775C092ADF1A5C19ACAE96EB60C2990CF214F8FEA8FC6749286F6BDAB67657C479A +E5608B28A058787D64A145F0362DEFD98CAE0B5A0F22C6DA7C6D278C7B5F95E3 +D4C113D43E7FB6D2EFA9E87471AA76A61B26872607B4AF5B87F9D72113835CE6 +2DC502800BFD21B76126390CA64A08C5432A2254E822F214CDE1EA11430084C5 +CA22C73010B0F1CB8009601BE2AF0B3674D83D5880E4A26C2A3FF0EA0A098CEA +E53B2B102FDB000E9BB747F957156976E5A0C0E3898AA844C13AE8A9CEE7013B +EFB27324B5661419265804ABD130C13DC9DF9CD4D2AC2011CB4FD43D56304AD1 +491D75A82ACE8CE216FBE4F0D2D0133BAC7EA8F4A5304337D5E8611AD9C72523 +BBFA2B00827E0BCC8AC5CE12C972BB58DFA2EA59DFEFF5A538398FCF970F58A7 +6BAF9C855926B683BEDC11883543B2C0E0866FF6B06C46CC09B3C4E1200E7716 +B35A4D25FF4D5CFF93B9C4C07B78FCF7E2646138DAB7C090A938C8055CCCE3D8 +71CC3C0180771E6B304CE984F5A9962EB35D1965CB78EBAE6F4DDFA44E5E02A2 +3DCF52C549FEFCCE2831DB74579AA2C157A4BEE70C43905664C9A6491A171F5D +F7E45AF200F7663DCCE54C14118D2CDFD1228ED0BFF7F70CFBCE15B6F9DF3D40 +C44E048AD5C003E68DCF0111317D109CF2B7DD79299692CDA7DA2A12EC9A295A +2B3E6778A97B251A5FEB190991B8AE8EC48F5FC6E94C2ECB8DFADFDD9D8E21FEE5DCCEDD9A1EB8C5212DEAE36FBBDF92 +1DD4756E681528CBBDBA6C7BF8833DF556D41E5EA4E4DE52CAD3544C946CD8CA +F903D388CF2016B40B492494F7475E71C50E9FDD63304558212DAF6FBC4E1BA4 +9E9F24951DB27917668CD6366795052306022F6F8BA11B08A970691C6857E6C5 +C88461104FA0EAA68001B0C2D0483D1A53D6AE04F4CB291C76CEF3A1A5C5DC10 +8345B2B9F08B018FEAC2F74D76747FF30DBF426C9B390ACD42AD48104C12042E +087269DC66C76E1D6449831A2C3B6F0006C0F8B1861062B95708C6B222C58A9C +4D31DE05DB12E552D43B1017C68AF3F52B6FE8063E4AD82CB568CDAF22950BCC26FF21EE968FB57650111B617A84DEF7 +769BAA780F84797431B6E9DD5180AF3848E03C942C67040B39CC6384E2A8F4C6 +1844AAAAD6A6AFB2623DF1452DF940715E6EB92F54C49F408872EC4B2156DDB2 +23EB39CD7F3921081199BA8B63D4C19F74365F8D8E71D486576DC900E5EFEEA3 +45958B93A16A73CA2578ADCFB1EADAA983BB7015321B0592B67CDF573B084194 diff --git a/assets/resources/subghz/assets/keeloq_mfcodes_user_example b/assets/resources/subghz/assets/keeloq_mfcodes_user_example index 0c75fd9c8..38fcf72a9 100644 --- a/assets/resources/subghz/assets/keeloq_mfcodes_user_example +++ b/assets/resources/subghz/assets/keeloq_mfcodes_user_example @@ -4,7 +4,7 @@ # for adding manufacture keys # AABBCCDDEEFFAABB:X:NAME\r\n # AABBCCDDEEFFAABB - man 64 bit -# X - encryption method 1 - Simple Learning, 2 - Normal_Learning, 3 - Secure_Learning, 4 - Magic_xor_type1 Learning +# X - encryption method 1 - Simple Learning, 2 - Normal_Learning, 3 - Secure_Learning, 4 - Magic_xor_type1 Learning, 5 - FAAC, 6 - Magic Serial typ1 # 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 diff --git a/assets/resources/subghz/assets/setting_user b/assets/resources/subghz/assets/setting_user index de419485c..9742ba2db 100644 --- a/assets/resources/subghz/assets/setting_user +++ b/assets/resources/subghz/assets/setting_user @@ -43,6 +43,8 @@ Frequency: 438900000 Frequency: 464000000 Frequency: 779000000 Frequency: 868350000 +Frequency: 868400000 +Frequency: 868950000 Frequency: 906400000 Frequency: 915000000 Frequency: 925000000 @@ -77,4 +79,4 @@ Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 36 10 69 15 32 Custom_preset_name: HND_2 Custom_preset_module: CC1101 # G2 G3 G4 D L0 L1 L2 -Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 07 11 36 10 E9 15 32 18 18 19 16 1D 92 1C 40 1B 03 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 \ No newline at end of file +Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 07 11 36 10 E9 15 32 18 18 19 16 1D 92 1C 40 1B 03 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 diff --git a/assets/unit_tests/subghz/oregon2_raw.sub b/assets/unit_tests/subghz/oregon2_raw.sub new file mode 100644 index 000000000..549a60db3 --- /dev/null +++ b/assets/unit_tests/subghz/oregon2_raw.sub @@ -0,0 +1,20 @@ +Filetype: Flipper SubGhz RAW File +Version: 1 +Frequency: 433920000 +Preset: FuriHalSubGhzPresetOok270Async +Protocol: RAW +RAW_Data: 889 -130 325 -64 457 -560 165 -68 199 -170 67 -66 265 -132 133 -666 67 -166 431 -66 201 -98 297 -100 595 -66 199 -134 65 -100 795 -132 99 -168 501 -200 331 -132 265 -102 265 -134 423 -98 521 -226 65 -166 431 -134 99 -100 133 -464 195 -326 623 -100 673 -98 321 -200 65 -136 369 -166 65 -68 97 -166 165 -334 265 -102 231 -166 101 -170 65 -170 265 -136 931 -100 133 -134 563 -66 333 -100 427 -66 163 -390 231 -66 193 -130 461 -166 557 -100 99 -198 263 -100 197 -294 231 -232 299 -134 199 -170 267 -134 631 -98 235 -100 499 -68 463 -100 65 -134 335 -170 273 -134 297 -100 67 -66 197 -166 67 -134 301 -168 537 -470 99 -134 433 -132 199 -192 261 -100 523 -164 459 -132 259 -332 359 -64 227 -96 131 -132 687 -132 363 -136 329 -434 99 -334 133 -100 401 -132 233 -700 233 -170 337 -66 371 -68 233 -202 531 -266 731 -66 465 -100 167 -100 133 -232 335 -166 239 -102 367 -232 231 -100 167 -134 201 -136 301 -168 199 -300 231 -98 237 -134 233 -102 329 -132 261 -134 199 -66 265 -136 99 -170 167 -134 199 -166 167 -136 367 -298 197 -200 99 -166 469 -136 439 -66 303 -134 295 -100 433 -134 899 -266 363 -132 197 -160 555 -324 129 -96 97 -128 257 -132 97 -394 257 -98 195 -166 459 -332 395 -132 633 -134 301 -100 131 -332 169 -168 395 -166 263 -540 783 -100 287 -130 295 -96 225 -296 133 -98 99 -100 461 -164 545 -130 99 -66 301 -68 265 -100 235 -134 235 -70 333 -102 497 -66 233 -364 301 -170 103 -66 165 -336 733 -200 133 -100 263 -102 65 -136 465 -200 1035 -198 165 -170 67 -302 631 -100 429 -332 65 -128 129 -130 159 -128 159 -66 161 -96 325 -164 261 -100 197 -162 65 -96 99 -130 65 -102 333 -100 199 -98 389 -330 129 -128 229 -66 425 -366 229 -64 261 -100 227 -96 227 -526 301 -200 97 -66 699 -334 67 -100 399 -198 787 -98 297 -134 429 -100 3245 -64 527 -98 131 -526 633 -68 133 -302 1459 -164 971 -102 237 -136 1439 -266 1131 -66 599 -200 303 -332 325 -130 389 -166 371 -66 333 -102 65 -100 233 -234 327 -266 233 -166 297 -100 225 -130 163 -336 99 -596 199 -330 131 -66 331 -338 263 -358 197 -168 877 -66 227 -96 63 -130 263 -162 225 -290 197 -198 357 -132 297 -262 165 -456 227 -98 399 -296 95 -132 99 -98 457 -200 199 -168 535 -100 567 -134 327 -130 193 -130 683 -102 101 -132 233 -170 943 -166 827 -66 267 -102 503 -68 1325 -164 +RAW_Data: 1607 -68 233 -166 1167 -70 531 -134 335 -168 131 -66 299 -402 899 -66 461 -66 457 -98 953 -98 165 -66 293 -230 881 -64 393 -166 589 -66 289 -66 1093 -204 333 -98 2745 -132 2019 -170 925 -68 269 -102 1469 -136 2301 -68 1355 -100 527 -66 975 -68 1445 -98 2397 -100 1733 -66 703 -100 995 -100 135 -136 235 -202 167 -134 2071 -166 339 -170 201 -268 129 -66 465 -66 365 -100 197 -164 129 -98 161 -96 423 -66 675 -66 1543 -136 567 -200 767 -202 65 -100 1401 -66 623 -136 567 -234 67 -236 197 -194 97 -66 263 -66 1827 -392 1893 -98 165 -268 133 -132 231 -162 225 -98 695 -198 563 -100 301 -332 267 -102 341 -66 99 -132 1299 -130 525 -68 161 -96 357 -98 353 -100 131 -100 131 -98 163 -132 323 -100 535 -66 1323 -130 133 -66 235 -134 1497 -132 387 -98 129 -162 2623 -134 163 -68 167 -66 959 -232 495 -68 131 -134 867 -134 865 -66 333 -98 305 -134 231 -98 765 -198 397 -432 165 -66 165 -366 265 -102 541 -100 261 -162 331 -134 457 -66 491 -196 97 -266 193 -262 65 -166 231 -266 497 -360 263 -98 587 -164 259 -98 231 -66 359 -100 267 -102 271 -168 97 -262 63 -66 261 -130 227 -130 295 -164 65 -66 265 -200 597 -134 267 -170 603 -100 97 -466 231 -264 97 -168 99 -66 65 -200 199 -100 267 -404 303 -102 201 -204 235 -134 131 -198 335 -298 327 -130 291 -164 63 -162 295 -262 197 -130 95 -130 195 -96 159 -130 161 -66 231 -100 165 -66 199 -134 363 -66 267 -168 165 -168 167 -100 165 -530 363 -432 99 -232 65 -132 395 -328 229 -98 197 -132 161 -96 191 -292 197 -204 133 -100 399 -166 531 -332 235 -168 99 -66 325 -158 553 -132 129 -226 231 -134 99 -462 129 -64 289 -100 193 -66 355 -164 291 -198 131 -298 197 -198 373 -268 335 -234 427 -68 199 -132 267 -232 131 -66 783 -326 63 -162 161 -130 227 -66 259 -562 233 -464 303 -102 201 -334 301 -134 297 -198 229 -66 127 -166 99 -100 197 -198 571 -66 457 -134 361 -424 131 -328 163 -98 63 -100 505 -102 201 -1094 229 -164 65 -230 789 -236 2505 -166 201 -170 163 -64 1139 -66 927 -100 295 -198 723 -100 365 -66 459 -196 3033 -272 199 -66 499 -202 1319 -232 295 -298 131 -362 97 -164 129 -132 65 -98 197 -130 129 -98 261 -130 97 -98 229 -96 425 -66 227 -166 483 -66 163 -326 567 -68 235 -68 67 -66 167 -66 235 -330 425 -164 63 -66 427 -102 167 -66 669 -132 429 -200 65 -102 133 -100 197 -368 +RAW_Data: 65 -134 2481 -228 65 -130 229 -228 763 -136 603 -166 1619 -98 1763 -102 837 -166 321 -66 951 -130 2067 -66 259 -132 1835 -66 437 -102 701 -66 565 -68 363 -70 1113 -66 1989 -164 257 -128 351 -162 1055 -232 265 -170 309 -200 435 -166 833 -102 2467 -132 595 -66 773 -166 1615 -98 131 -96 485 -64 517 -166 197 -68 1231 -68 403 -100 263 -134 233 -100 503 -100 333 -266 729 -66 199 -100 369 -68 1239 -100 197 -68 299 -170 337 -100 825 -132 163 -66 4205 -64 161 -100 635 -66 907 -66 1017 -166 1709 -100 201 -266 657 -68 463 -166 331 -164 293 -64 259 -162 129 -262 597 -134 701 -136 67 -168 235 -136 303 -170 1417 -66 263 -98 857 -100 659 -166 97 -100 2497 -64 2495 -98 719 -128 227 -130 2217 -164 623 -264 719 -134 329 -98 1371 -100 553 -294 165 -66 1163 -100 329 -196 649 -200 1123 -68 263 -100 593 -266 333 -102 1133 -136 131 -132 603 -200 1819 -66 489 -66 563 -266 1113 -230 165 -66 423 -68 335 -100 101 -100 1073 -132 897 -100 101 -100 499 -134 173 -138 763 -238 371 -130 403 -166 203 -102 271 -136 269 -166 99 -168 263 -96 425 -66 331 -234 133 -400 231 -132 453 -66 459 -164 199 -68 237 -132 163 -198 161 -196 265 -132 65 -64 195 -130 357 -164 663 -68 167 -600 131 -98 133 -304 203 -134 433 -98 261 -130 199 -100 237 -100 229 -326 99 -98 331 -132 99 -294 165 -66 303 -134 99 -232 133 -136 99 -68 267 -198 233 -138 67 -166 367 -100 333 -168 267 -200 369 -266 135 -404 1939 -132 231 -160 161 -64 293 -98 331 -132 339 -104 135 -100 197 -430 263 -202 233 -64 195 -162 129 -64 227 -298 265 -68 697 -66 301 -68 231 -300 131 -368 769 -234 265 -98 195 -324 97 -752 229 -126 355 -98 257 -98 287 -64 427 -132 295 -262 197 -170 369 -102 267 -100 169 -68 201 -102 2551 -136 635 -134 639 -134 99 -132 197 -200 371 -66 731 -132 199 -138 733 -304 433 -68 729 -440 197 -68 99 -102 165 -266 261 -164 491 -296 489 -194 257 -164 133 -134 237 -68 335 -98 227 -130 229 -98 295 -98 231 -202 267 -236 233 -136 331 -130 195 -128 261 -430 261 -162 97 -224 99 -130 193 -96 197 -162 229 -396 97 -98 227 -364 267 -100 99 -100 233 -236 697 -164 227 -196 63 -98 327 -230 325 -66 129 -196 95 -98 195 -130 325 -430 131 -194 129 -454 161 -196 235 -68 433 -134 667 -164 355 -236 101 -98 2143 -134 1827 -198 63 -198 65 -64 2859 -64 619 -66 97 -130 3157 -66 679 -194 1491 -98 +RAW_Data: 951 -64 393 -100 955 -132 4715 -100 131 -66 199 -204 1541 -66 929 -130 1347 -166 665 -132 233 -132 67 -102 433 -100 595 -228 997 -66 505 -68 133 -98 231 -68 571 -134 1371 -232 231 -270 135 -102 97 -66 867 -100 269 -68 967 -100 1649 -66 65 -66 951 -68 65 -202 363 -200 779 -102 1449 -294 419 -130 361 -230 1079 -164 163 -260 893 -102 333 -100 533 -166 467 -100 135 -66 135 -202 369 -100 199 -100 269 -134 301 -166 229 -66 101 -134 199 -134 1293 -64 779 -62 831 -66 1243 -68 267 -102 197 -100 395 -98 455 -64 621 -132 877 -98 199 -100 2101 -134 503 -100 2035 -134 735 -236 475 -136 237 -132 133 -134 1229 -100 133 -66 167 -68 2655 -100 1807 -100 1095 -264 825 -98 163 -66 491 -98 161 -128 953 -100 773 -100 131 -66 67 -134 457 -130 63 -64 389 -98 715 -66 425 -300 97 -100 1515 -66 303 -68 99 -98 721 -64 887 -132 65 -132 165 -66 635 -68 2801 -66 1561 -100 751 -98 129 -64 725 -136 201 -100 333 -204 573 -104 1745 -134 99 -66 129 -64 595 -134 167 -102 337 -134 567 -134 1131 -138 1207 -100 269 -68 135 -100 1143 -134 2139 -68 1701 -162 991 -596 431 -66 99 -132 657 -66 391 -320 357 -260 259 -98 429 -66 163 -228 65 -130 227 -66 261 -166 99 -98 131 -366 199 -134 463 -102 201 -98 231 -102 639 -238 301 -568 169 -610 265 -102 841 -198 297 -100 335 -132 263 -266 265 -68 469 -134 267 -68 933 -298 333 -298 729 -168 135 -136 437 -132 1137 -134 199 -68 265 -132 463 -166 129 -130 227 -98 297 -98 65 -132 97 -202 199 -232 305 -66 165 -198 365 -66 99 -98 299 -170 65 -136 301 -232 99 -564 133 -132 233 -170 99 -102 131 -134 65 -204 101 -98 297 -98 167 -762 233 -298 99 -326 395 -66 299 -132 369 -504 333 -98 483 -200 457 -164 63 -164 329 -162 65 -622 231 -268 131 -132 133 -134 131 -134 131 -66 99 -100 231 -66 167 -336 165 -98 197 -100 97 -264 321 -98 521 -132 163 -130 129 -294 297 -134 101 -102 265 -168 497 -68 197 -68 499 -134 269 -398 267 -130 203 -302 65 -498 271 -136 465 -292 131 -294 163 -198 329 -96 129 -98 193 -130 391 -330 165 -134 167 -170 297 -102 133 -136 135 -366 199 -132 423 -132 395 -168 65 -166 401 -98 229 -98 329 -98 99 -130 129 -228 261 -160 127 -426 389 -162 193 -132 131 -100 231 -168 67 -304 201 -68 765 -132 161 -162 193 -64 195 -64 295 -130 787 -98 419 -528 429 -66 363 -134 131 -100 133 -200 331 -98 +RAW_Data: 431 -66 1167 -68 937 -68 1003 -66 99 -132 941 -134 65 -66 365 -274 165 -236 367 -96 557 -134 675 -66 261 -164 127 -96 391 -164 161 -98 391 -292 163 -98 519 -196 165 -98 523 -66 195 -160 3343 -66 661 -100 2589 -136 307 -100 629 -136 639 -100 133 -168 405 -100 267 -66 465 -132 1171 -64 749 -64 165 -98 983 -100 163 -202 537 -66 327 -100 669 -100 401 -236 2885 -164 439 -134 97 -426 1931 -66 1385 -98 715 -98 519 -66 289 -162 97 -360 297 -166 163 -66 289 -66 555 -334 167 -230 429 -102 267 -132 943 -136 401 -68 929 -130 193 -68 467 -198 335 -66 963 -100 597 -132 197 -260 523 -232 1115 -102 1935 -66 1395 -134 305 -100 99 -66 199 -66 1071 -66 2357 -66 367 -498 769 -234 163 -130 191 -64 1211 -200 133 -102 201 -100 561 -366 361 -98 195 -100 537 -64 165 -196 1041 -332 133 -102 441 -230 4217 -66 1033 -66 167 -66 933 -100 565 -66 331 -164 673 -104 441 -66 533 -66 2095 -164 525 -66 297 -170 965 -198 421 -100 663 -832 65 -100 331 -164 231 -166 135 -168 237 -466 761 -134 891 -196 791 -198 257 -160 161 -98 293 -66 1081 -98 229 -130 327 -66 1301 -200 331 -166 101 -66 461 -100 2619 -132 1663 -98 1609 -134 499 -332 165 -370 67 -264 97 -96 259 -98 701 -402 197 -128 527 -236 233 -102 167 -134 303 -134 99 -166 299 -132 165 -200 467 -68 305 -168 207 -102 465 -102 729 -136 101 -374 327 -96 259 -98 467 -202 65 -66 673 -98 335 -404 135 -66 339 -204 99 -366 233 -68 365 -166 133 -102 867 -198 163 -162 163 -294 463 -332 165 -68 269 -268 331 -100 131 -166 299 -132 231 -400 263 -164 131 -266 267 -264 367 -66 371 -134 229 -104 267 -232 67 -466 265 -100 101 -100 165 -200 65 -200 301 -66 199 -168 233 -98 267 -66 67 -134 261 -196 261 -234 427 -294 65 -194 193 -66 259 -132 849 -96 63 -198 167 -294 95 -98 361 -164 261 -196 131 -132 437 -100 597 -262 327 -162 295 -98 295 -164 259 -196 425 -230 321 -66 195 -66 261 -496 99 -200 529 -132 133 -966 133 -132 165 -66 63 -128 491 -402 65 -262 299 -66 299 -202 265 -100 99 -668 97 -134 65 -100 101 -66 65 -266 691 -66 431 -166 167 -134 199 -370 899 -134 99 -100 1093 -166 163 -166 399 -98 327 -100 99 -168 135 -200 133 -202 429 -98 65 -98 197 -556 65 -66 97 -326 331 -166 333 -200 135 -100 235 -234 265 -98 65 -68 135 -66 335 -66 133 -298 99 -66 233 -164 435 -232 97 -132 97 -392 +RAW_Data: 99 -198 819 -66 1235 -98 321 -132 1091 -66 1307 -98 3059 -164 3305 -64 227 -98 591 -98 129 -66 229 -98 2143 -98 939 -68 563 -100 361 -232 945 -164 257 -96 229 -230 387 -64 195 -130 981 -294 587 -162 193 -98 1337 -66 293 -98 2665 -66 297 -98 647 -66 459 -132 491 -164 489 -96 595 -66 899 -66 837 -64 1151 -196 259 -98 357 -164 891 -132 1359 -134 197 -98 97 -98 261 -64 229 -96 461 -136 693 -100 201 -98 865 -66 599 -100 517 -132 709 -66 293 -298 655 -66 197 -130 129 -66 197 -98 4291 -66 673 -66 667 -132 1473 -132 133 -104 99 -66 163 -168 333 -134 1743 -132 1097 -132 99 -68 167 -602 1323 -352 99 -166 753 -98 423 -98 97 -66 1317 -228 1309 -98 1849 -66 1939 -132 601 -100 665 -100 1875 -66 695 -132 425 -66 425 -66 263 -134 165 -134 99 -98 829 -66 601 -166 131 -102 565 -66 301 -100 1099 -100 601 -138 533 -66 667 -234 561 -66 99 -68 2741 -98 199 -100 531 -168 101 -434 1027 -68 431 -66 403 -132 99 -98 565 -132 135 -100 399 -166 271 -236 233 -166 197 -366 99 -66 99 -168 503 -66 199 -170 207 -100 673 -368 99 -66 263 -168 133 -98 397 -268 337 -66 131 -132 231 -132 501 -134 99 -168 567 -138 103 -136 267 -298 231 -134 197 -160 321 -332 231 -98 131 -164 257 -64 163 -328 395 -66 331 -202 65 -168 133 -68 167 -100 233 -102 335 -66 197 -326 1101 -132 589 -100 811 -132 399 -136 269 -102 497 -66 559 -100 129 -98 855 -68 637 -102 65 -200 875 -68 233 -166 167 -66 529 -202 235 -102 231 -66 1237 -66 733 -98 1723 -132 101 -100 297 -66 829 -232 197 -100 367 -134 169 -166 167 -434 633 -100 235 -200 131 -134 233 -100 131 -100 331 -134 495 -432 65 -528 161 -130 295 -132 337 -136 133 -166 165 -100 269 -240 201 -336 133 -166 165 -238 199 -202 431 -434 99 -134 501 -166 231 -96 559 -202 167 -66 717 -98 987 -198 65 -64 163 -64 227 -98 555 -164 199 -64 361 -66 163 -98 129 -162 97 -130 161 -460 197 -230 681 -98 197 -98 329 -100 267 -266 291 -264 65 -100 329 -100 459 -200 363 -98 165 -134 231 -134 301 -134 231 -302 99 -132 101 -134 267 -136 233 -68 393 -422 163 -166 361 -166 99 -134 365 -134 133 -336 401 -66 495 -132 401 -168 133 -402 501 -136 1093 -862 165 -132 293 -300 289 -66 131 -164 391 -134 99 -360 359 -130 323 -200 423 -98 195 -162 295 -132 161 -98 129 -782 131 -426 227 -64 259 -166 63 -160 323 -98 261 -230 +RAW_Data: 231 -66 921 -66 355 -64 1019 -98 227 -258 163 -66 597 -232 1313 -132 163 -404 467 -236 901 -164 483 -98 195 -96 489 -134 103 -238 169 -66 67 -68 299 -100 497 -68 65 -134 1635 -304 1153 -100 539 -168 265 -200 499 -166 535 -100 397 -168 931 -100 131 -66 631 -134 897 -270 1233 -100 65 -132 131 -334 663 -66 163 -66 131 -132 705 -98 571 -200 433 -100 237 -234 229 -132 1627 -66 569 -100 715 -66 1863 -272 265 -68 301 -98 465 -68 97 -134 99 -66 395 -136 1405 -66 529 -132 63 -196 579 -132 413 -260 129 -136 101 -166 1201 -134 833 -134 393 -66 335 -172 201 -68 1027 -96 753 -64 815 -66 97 -64 1341 -132 289 -160 127 -66 99 -228 1083 -96 163 -66 259 -64 159 -98 2409 -168 767 -200 367 -66 1675 -66 1067 -98 3407 -200 99 -66 1403 -166 99 -134 439 -200 329 -136 599 -66 637 -66 835 -66 1099 -98 99 -66 463 -166 165 -100 461 -164 3037 -66 655 -66 97 -98 229 -130 355 -132 1443 -66 527 -98 881 -98 229 -162 127 -96 583 -64 65 -162 489 -166 885 -194 257 -98 1539 -66 293 -166 229 -132 655 -98 757 -49522 271 -758 689 -1264 737 -670 293 -1152 811 -1144 341 -664 773 -678 327 -1118 807 -1144 835 -1146 781 -1126 873 -1096 347 -622 877 -624 321 -1106 843 -1098 871 -1098 843 -1106 379 -610 841 -584 381 -1122 365 -602 845 -1116 837 -610 381 -1056 889 -1078 383 -614 827 -1110 877 -592 353 -1108 845 -1120 839 -1120 347 -602 849 -1110 865 -612 361 -1072 869 -1114 351 -618 861 -618 343 -1090 853 -1106 387 -618 797 -674 347 -1084 389 -574 867 -584 381 -1114 841 -1102 845 -1116 839 -1112 843 -1098 875 -1086 383 -584 865 -588 375 -1100 861 -1112 851 -1084 853 -1108 847 -1106 381 -584 857 -610 383 -1080 357 -602 871 -602 385 -1084 383 -616 823 -610 373 -1086 381 -590 871 -1084 839 -628 353 -1102 875 -1100 349 -9404 875 -1060 871 -1086 887 -1088 879 -1058 863 -1086 855 -1132 845 -1078 871 -1076 857 -1098 881 -1082 861 -1088 843 -1120 853 -1074 879 -1074 879 -1068 889 -614 341 -1090 387 -616 863 -624 345 -1088 391 -590 857 -612 385 -1058 393 -596 843 -1088 889 -1078 879 -578 387 -1082 875 -1076 415 -550 881 -1070 877 -592 391 -1114 821 -1104 373 -620 821 -624 361 -1072 903 -1086 855 -1092 843 -1086 905 -1054 387 -614 863 -618 347 -1088 853 -1114 845 -1090 867 -1070 381 -610 885 -584 385 -1052 407 -578 877 -1052 899 -600 389 -1048 907 -1074 383 -586 877 -1072 877 -594 359 -1076 875 -1082 891 -1088 363 -616 855 -1084 857 -592 381 -1088 883 -1086 385 -572 +RAW_Data: 889 -624 353 -1082 853 -1096 379 -594 853 -624 353 -1092 417 -582 847 -612 385 -1076 847 -1080 883 -1052 913 -1044 907 -1076 849 -1088 383 -602 867 -616 361 -1068 901 -1072 865 -1104 831 -1080 879 -1098 397 -586 855 -626 355 -1084 381 -592 873 -616 351 -1084 385 -624 821 -620 359 -1086 387 -584 883 -1086 877 -592 355 -1106 853 -1086 387 -69570 97 -100 99 -2620 131 -636 333 -102 235 -236 67 -68 363 -66 201 -100 567 -102 267 -164 101 -134 65 -68 197 -68 297 -166 671 -100 469 -336 165 -100 201 -66 169 -230 169 -204 329 -624 67 -98 265 -232 193 -168 299 -100 235 -138 101 -370 165 -294 333 -622 231 -130 129 -130 353 -132 195 -162 359 -164 67 -68 333 -100 133 -688 235 -236 497 -198 293 -98 129 -296 293 -164 229 -128 229 -132 193 -400 165 -66 163 -98 361 -164 355 -196 587 -164 131 -98 263 -554 99 -130 129 -130 191 -464 99 -132 67 -100 167 -604 329 -66 199 -68 133 -102 163 -66 2971 -132 785 -66 329 -96 323 -100 201 -136 301 -66 1959 -166 867 -134 467 -66 297 -100 835 -100 753 -166 165 -64 67 -370 335 -66 559 -232 165 -334 65 -162 129 -354 163 -64 131 -134 265 -300 263 -132 267 -296 327 -198 99 -132 535 -132 469 -866 231 -860 99 -232 503 -134 99 -198 233 -134 267 -200 97 -358 297 -164 259 -98 227 -166 135 -66 323 -100 97 -294 131 -164 129 -98 295 -96 129 -426 299 -100 67 -102 623 -100 163 -194 127 -360 563 -134 199 -428 493 -98 229 -130 257 -64 165 -100 131 -98 163 -692 357 -64 161 -98 321 -64 389 -230 65 -692 227 -130 261 -132 231 -162 287 -298 97 -460 393 -130 301 -168 331 -100 269 -202 101 -134 201 -102 99 -132 199 -204 235 -664 65 -562 133 -328 463 -100 291 -194 159 -162 227 -98 293 -328 165 -128 227 -574 535 -332 197 -168 65 -300 131 -66 389 -1078 131 -64 259 -64 223 -98 257 -164 63 -328 433 -134 65 -602 131 -68 333 -136 369 -66 297 -264 427 -66 97 -130 429 -102 133 -136 203 -240 167 -236 329 -526 67 -132 133 -168 331 -360 65 -66 331 -296 267 -134 469 -132 595 -230 661 -662 299 -100 265 -200 203 -168 801 -100 133 -68 399 -132 99 -100 161 -390 65 -298 65 -98 261 -130 161 -128 257 -66 67 -134 621 -98 227 -328 99 -230 129 -294 193 -96 195 -318 425 -526 129 -196 163 -162 65 -132 293 -130 63 -66 325 -128 63 -130 293 -66 199 -200 269 -206 133 -198 325 -98 163 -100 97 -98 261 -164 67 -98 167 -430 131 -494 131 -164 +RAW_Data: 97 -98 861 -66 1199 -166 231 -100 651 -166 197 -104 439 -98 131 -64 493 -98 883 -96 99 -98 3327 -66 131 -264 733 -134 2133 -166 131 -102 303 -136 535 -134 701 -98 355 -228 131 -202 99 -134 99 -100 791 -166 169 -202 671 -100 741 -100 263 -66 165 -68 935 -132 197 -198 673 -100 605 -66 1457 -98 1195 -166 2347 -134 505 -100 1469 -66 391 -100 229 -100 1171 -98 939 -100 459 -170 369 -134 231 -162 127 -98 95 -66 195 -98 195 -66 299 -100 331 -98 65 -232 369 -132 201 -68 167 -166 1481 -102 501 -160 1257 -66 2307 -64 623 -164 2079 -66 1101 -98 423 -64 659 -68 431 -136 99 -100 435 -130 167 -168 835 -200 135 -104 133 -100 503 -68 1437 -232 821 -132 357 -96 463 -66 263 -64 683 -132 165 -96 655 -166 3939 -100 1169 -132 2443 -98 197 -132 425 -234 233 -162 1043 -66 197 -100 2793 -134 167 -104 675 -100 197 -134 1367 -102 763 -132 265 -230 133 -102 365 -100 167 -66 1069 -66 837 -100 295 -160 97 -64 129 -132 617 -164 197 -100 133 -136 337 -172 133 -66 557 -98 951 -66 263 -130 587 -66 729 -196 335 -166 933 -432 369 -100 199 -296 225 -98 355 -66 129 -64 557 -98 289 -66 355 -128 193 -162 267 -134 299 -98 165 -170 303 -640 1031 -134 99 -66 135 -68 771 -166 171 -104 201 -134 131 -68 635 -428 661 -292 749 -430 1161 -100 905 -98 65 -98 657 -262 2837 -132 67 -66 265 -132 631 -66 1037 -296 97 -98 1703 -302 367 -100 505 -232 497 -362 333 -134 591 -100 755 -232 67 -130 587 -66 231 -168 65 -332 99 -66 267 -232 393 -134 65 -132 131 -428 133 -200 165 -202 199 -168 165 -102 269 -100 333 -852 201 -134 233 -202 65 -200 563 -768 265 -136 169 -102 169 -598 333 -202 267 -134 267 -328 163 -130 625 -500 199 -200 99 -270 65 -134 65 -198 65 -100 99 -596 493 -66 99 -66 331 -232 103 -136 373 -168 831 -170 65 -672 163 -102 133 -136 331 -100 333 -234 101 -100 99 -200 99 -100 201 -302 199 -600 301 -202 135 -134 705 -166 435 -530 97 -198 131 -198 195 -66 163 -392 293 -66 295 -370 229 -198 65 -100 405 -134 165 -134 133 -170 337 -236 205 -274 267 -134 329 -132 195 -132 503 -132 133 -136 133 -334 197 -196 299 -168 101 -100 233 -100 439 -134 301 -332 331 -298 433 -406 433 -68 167 -100 203 -100 101 -102 99 -328 397 -234 205 -168 133 -364 63 -202 397 -198 95 -394 267 -134 569 -66 201 -102 133 -136 101 -102 99 -132 99 -196 197 -498 197 -102 135 -170 +RAW_Data: 331 -164 63 -162 1267 -66 163 -130 129 -66 725 -164 231 -64 853 -66 101 -134 199 -102 99 -68 365 -66 357 -130 815 -64 357 -98 97 -98 97 -66 65 -466 231 -172 3749 -66 849 -130 917 -64 327 -64 1013 -98 555 -332 795 -100 571 -132 769 -132 401 -134 1297 -134 377 -138 435 -100 401 -100 667 -100 1761 -66 667 -66 1533 -236 233 -98 885 -130 457 -66 999 -66 165 -66 833 -134 695 -166 501 -66 499 -200 329 -64 197 -134 441 -100 2099 -98 491 -134 197 -130 2225 -132 65 -100 689 -64 193 -160 159 -96 195 -98 323 -164 259 -98 535 -472 771 -66 665 -270 665 -66 595 -266 2191 -64 643 -98 1287 -98 741 -100 233 -200 569 -194 261 -68 637 -100 97 -66 491 -158 395 -138 1017 -66 627 -262 559 -64 327 -98 263 -134 99 -102 201 -102 337 -66 167 -68 679 -100 471 -134 195 -66 133 -202 693 -96 197 -98 391 -164 99 -98 3883 -194 461 -100 237 -168 1891 -68 301 -68 969 -166 1439 -294 551 -130 389 -98 99 -196 167 -102 505 -66 569 -234 901 -98 407 -136 469 -66 769 -98 769 -166 1263 -266 297 -98 1701 -200 203 -168 329 -232 65 -100 329 -164 803 -100 135 -200 233 -166 135 -272 265 -134 197 -100 133 -134 539 -232 197 -396 165 -366 263 -68 233 -102 365 -132 233 -100 135 -266 199 -234 167 -232 97 -524 127 -128 389 -98 305 -364 261 -130 257 -162 589 -464 361 -66 229 -134 161 -100 203 -432 265 -66 199 -66 199 -366 229 -236 99 -134 99 -100 131 -168 133 -100 131 -236 267 -132 297 -264 291 -132 167 -234 65 -100 199 -66 333 -730 237 -440 365 -102 99 -100 99 -132 99 -100 1429 -134 427 -100 97 -100 131 -164 799 -170 1077 -100 431 -66 133 -168 737 -134 197 -230 65 -102 803 -132 491 -98 429 -198 471 -134 365 -66 299 -236 65 -66 2837 -102 399 -64 585 -64 523 -196 97 -98 295 -196 555 -160 261 -500 299 -396 333 -236 133 -68 327 -100 199 -204 699 -66 701 -100 65 -164 65 -370 195 -196 97 -66 193 -130 129 -360 195 -130 231 -96 291 -64 455 -228 293 -196 291 -162 97 -194 621 -130 847 -66 395 -66 161 -128 193 -130 293 -98 231 -170 67 -134 297 -360 167 -266 263 -526 263 -132 229 -98 191 -160 159 -100 721 -234 101 -100 99 -130 259 -258 265 -632 687 -164 133 -134 631 -100 199 -102 165 -560 299 -200 265 -332 431 -870 99 -266 503 -364 135 -66 269 -68 499 -100 265 -102 263 -102 569 -234 719 -132 99 -196 419 -262 163 -688 95 -66 165 -128 95 -66 +RAW_Data: 295 -98 987 -196 517 -100 489 -66 355 -132 563 -198 867 -134 1413 -134 541 -134 767 -100 193 -98 1799 -102 467 -134 299 -96 323 -66 261 -100 259 -66 229 -96 851 -66 369 -266 469 -66 101 -98 163 -136 267 -432 859 -130 523 -66 197 -134 1027 -132 227 -194 393 -98 807 -166 235 -100 133 -66 165 -102 133 -136 371 -162 1411 -132 865 -200 471 -100 133 -68 299 -66 633 -98 329 -234 401 -98 1505 -132 133 -134 331 -262 163 -66 261 -98 289 -64 201 -68 1055 -96 391 -66 951 -298 265 -202 297 -66 401 -68 131 -100 1733 -98 941 -66 803 -98 847 -64 3701 -100 721 -160 357 -166 1799 -66 329 -100 99 -102 363 -198 167 -136 197 -66 567 -66 199 -236 1247 -166 2455 -68 1107 -200 235 -100 2355 -130 913 -98 877 -98 163 -196 97 -66 427 -100 801 -134 867 -98 263 -68 441 -134 561 -98 1671 -134 865 -68 935 -132 163 -102 975 -66 1343 -132 1339 -134 369 -100 1107 -66 1167 -168 631 -232 835 -66 1027 -132 333 -166 265 -98 1207 -98 223 -98 455 -64 2095 -134 933 -136 233 -68 335 -136 305 -100 1737 -66 427 -100 263 -130 323 -66 227 -66 717 -100 265 -100 65 -128 355 -66 367 -132 95 -230 229 -100 131 -64 493 -132 291 -396 393 -130 259 -196 227 -288 397 -68 229 -430 99 -302 237 -700 65 -66 65 -100 133 -200 101 -336 133 -166 237 -202 67 -302 67 -68 333 -132 263 -102 267 -296 163 -166 233 -168 363 -64 295 -298 537 -166 431 -200 431 -166 63 -258 363 -164 563 -234 199 -68 299 -100 325 -754 295 -196 65 -98 165 -132 301 -134 131 -134 97 -68 405 -68 233 -134 271 -134 67 -168 101 -136 133 -366 99 -132 67 -132 265 -200 233 -100 201 -136 101 -66 263 -132 129 -66 293 -582 263 -132 1103 -134 203 -168 97 -66 197 -264 131 -168 133 -132 65 -134 199 -134 101 -100 131 -436 99 -232 97 -398 231 -362 65 -202 301 -396 297 -98 199 -134 265 -164 101 -168 267 -102 405 -170 99 -102 397 -132 97 -98 295 -98 1179 -100 135 -136 131 -134 765 -134 465 -168 439 -232 403 -100 65 -134 931 -100 169 -136 237 -68 231 -234 199 -68 401 -134 541 -166 429 -166 1607 -368 533 -66 363 -66 133 -134 433 -166 297 -238 201 -100 201 -170 199 -134 273 -136 99 -134 167 -238 133 -66 265 -134 165 -132 165 -132 97 -228 723 -198 415 -64 491 -298 257 -66 231 -192 225 -96 227 -98 193 -96 521 -198 65 -66 231 -166 163 -98 465 -66 133 -132 195 -130 225 -162 521 -130 63 -66 199 -228 +RAW_Data: 817 -162 449 -160 719 -198 469 -68 133 -68 1101 -132 593 -230 1105 -100 131 -134 231 -66 329 -196 685 -96 557 -68 1263 -68 101 -68 397 -100 65 -66 625 -66 97 -132 1099 -66 493 -66 757 -98 1151 -66 303 -134 1901 -66 99 -100 665 -262 991 -98 791 -66 1925 -168 865 -232 835 -98 505 -102 99 -100 535 -100 169 -134 427 -132 863 -68 167 -134 975 -100 133 -268 1339 -100 1453 -66 1445 -162 195 -64 3623 -66 237 -68 1063 -308 1449 -98 1111 -132 167 -102 855 -270 199 -134 297 -134 267 -168 863 -234 637 -66 567 -230 99 -200 3325 -198 845 -66 289 -66 131 -66 815 -130 1093 -100 167 -100 429 -98 1703 -166 195 -64 971 -98 163 -192 195 -168 439 -132 329 -132 67 -134 67 -134 1591 -168 407 -100 867 -68 399 -134 661 -100 663 -66 237 -136 395 -232 131 -66 695 -100 627 -264 913 -66 1083 -98 287 -66 199 -132 335 -100 1031 -68 99 -100 3815 -98 165 -66 129 -98 163 -128 563 -98 779 -96 223 -64 161 -164 2025 -66 1741 -172 101 -136 203 -102 665 -100 475 -64 167 -100 637 -98 997 -170 1207 -136 233 -166 233 -168 635 -132 199 -100 235 -270 199 -98 131 -102 169 -170 293 -98 323 -164 427 -334 233 -168 267 -68 369 -100 263 -368 101 -66 665 -98 265 -100 133 -100 99 -168 133 -66 133 -132 133 -66 269 -134 435 -68 267 -136 271 -500 163 -100 163 -166 355 -132 97 -98 323 -194 63 -688 463 -130 97 -396 65 -100 357 -194 461 -98 161 -130 223 -162 165 -352 461 -300 267 -166 233 -464 329 -100 293 -362 163 -228 289 -66 229 -66 195 -162 325 -66 261 -98 127 -424 299 -302 367 -68 265 -272 429 -98 161 -98 393 -296 65 -130 161 -196 261 -66 473 -234 97 -98 263 -160 323 -98 67 -132 697 -298 99 -134 233 -202 97 -134 301 -200 307 -100 101 -134 865 -166 231 -202 233 -100 301 -170 169 -102 169 -200 65 -98 595 -166 231 -234 661 -66 473 -334 165 -304 365 -266 97 -502 363 -134 133 -236 65 -100 99 -134 99 -170 235 -66 333 -100 195 -100 133 -300 133 -102 301 -304 65 -100 99 -100 131 -202 135 -134 65 -200 363 -66 263 -498 67 -68 295 -194 321 -368 435 -100 97 -664 99 -100 569 -66 133 -66 67 -134 199 -136 101 -68 301 -68 405 -198 133 -132 581 -132 165 -98 159 -98 197 -66 229 -130 131 -294 133 -96 423 -100 427 -300 357 -132 291 -64 95 -194 455 -98 263 -100 359 -196 65 -162 227 -162 157 -96 157 -230 589 -132 325 -134 535 -66 267 -100 135 -302 +RAW_Data: 131 -134 599 -166 393 -98 369 -236 197 -100 401 -232 569 -134 135 -70 337 -134 101 -136 135 -100 1895 -66 401 -170 503 -66 1633 -66 601 -66 355 -96 683 -100 729 -68 133 -132 433 -68 569 -100 133 -68 201 -132 835 -100 465 -68 527 -98 193 -200 1129 -166 535 -100 199 -98 259 -132 227 -64 1597 -98 261 -192 753 -100 911 -66 667 -298 131 -100 263 -66 1051 -230 787 -66 935 -66 233 -98 885 -236 431 -66 197 -162 521 -68 167 -196 263 -96 589 -98 517 -66 1439 -64 777 -66 3219 -132 679 -134 205 -68 507 -198 749 -200 199 -168 167 -100 133 -134 201 -68 731 -66 495 -198 737 -66 237 -68 135 -100 167 -234 1535 -68 873 -66 373 -66 67 -232 297 -68 65 -66 1095 -68 327 -130 63 -132 1715 -66 2261 -100 321 -132 197 -164 457 -232 1291 -132 405 -68 1001 -68 1133 -272 471 -66 99 -134 1403 -68 167 -68 1091 -336 933 -134 1207 -132 265 -68 267 -66 99 -366 265 -66 1469 -258 367 -168 429 -132 129 -66 491 -132 343 -100 65 -100 263 -136 199 -164 273 -204 791 -100 901 -66 167 -98 165 -64 559 -132 619 -132 1087 -128 2283 -398 1467 -164 259 -130 1927 -130 421 -98 1085 -66 705 -68 1843 -168 875 -170 203 -136 341 -640 199 -66 133 -554 161 -196 63 -66 521 -292 163 -160 95 -158 127 -192 197 -100 587 -130 397 -662 261 -66 193 -130 259 -66 361 -64 459 -98 197 -560 655 -130 389 -66 1135 -100 133 -130 131 -98 1011 -100 561 -66 685 -164 457 -132 2469 -200 609 -66 665 -66 67 -132 327 -200 1657 -134 919 -132 651 -100 327 -230 191 -130 263 -358 95 -130 549 -98 99 -68 299 -100 461 -132 99 -472 165 -134 99 -66 99 -132 399 -102 169 -102 697 -166 233 -132 333 -632 197 -164 865 -266 101 -68 533 -166 299 -100 163 -228 259 -66 327 -200 65 -66 229 -100 363 -230 197 -336 165 -102 893 -300 65 -132 231 -370 265 -230 99 -98 229 -518 199 -100 401 -724 225 -98 63 -96 231 -64 291 -292 65 -98 131 -98 159 -158 127 -194 161 -292 65 -98 133 -66 297 -66 303 -168 97 -168 231 -234 269 -532 135 -168 99 -168 301 -528 99 -506 199 -368 399 -132 329 -372 99 -68 133 -264 197 -100 201 -200 67 -134 131 -270 133 -134 133 -198 327 -200 65 -100 331 -262 161 -166 469 -534 167 -738 131 -100 367 -232 101 -100 265 -604 65 -170 99 -166 299 -102 169 -132 99 -398 229 -330 197 -166 335 -366 97 -98 131 -200 269 -100 199 -168 131 -134 537 -98 265 -100 335 -236 99 -366 +RAW_Data: 459 -100 453 -130 419 -130 519 -96 63 -130 2077 -66 767 -64 127 -134 1961 -296 529 -202 637 -134 527 -100 201 -68 633 -66 163 -360 1029 -68 765 -100 867 -66 503 -100 131 -66 841 -98 165 -68 237 -66 509 -100 501 -302 235 -66 99 -164 227 -130 551 -196 327 -66 1571 -132 99 -68 867 -66 163 -96 161 -130 129 -130 549 -130 487 -166 1801 -66 229 -66 197 -232 325 -66 425 -198 131 -64 295 -166 735 -66 533 -98 227 -130 129 -262 425 -100 263 -66 129 -132 97 -168 971 -170 405 -68 199 -134 475 -202 297 -98 1445 -98 395 -196 161 -66 225 -134 1803 -100 473 -102 1499 -66 199 -100 701 -132 165 -68 133 -102 303 -98 735 -102 805 -100 827 -100 235 -100 65 -266 637 -68 693 -66 1383 -228 819 -66 233 -304 435 -198 203 -136 1135 -270 1709 -64 227 -64 581 -134 505 -66 2203 -64 293 -64 753 -66 551 -132 747 -64 1303 -64 463 -66 229 -102 1877 -266 871 -166 1357 -64 819 -66 465 -198 693 -68 165 -64 95 -128 3785 -132 1465 -100 299 -102 329 -164 595 -134 1029 -66 299 -168 1263 -166 331 -68 967 -100 101 -102 603 -260 165 -132 467 -66 233 -66 235 -102 475 -100 135 -68 301 -134 297 -98 131 -102 269 -466 99 -134 237 -166 135 -168 203 -102 265 -68 503 -66 233 -66 637 -134 101 -200 199 -166 293 -554 361 -328 367 -264 533 -238 167 -68 135 -170 99 -300 591 -298 133 -236 299 -66 231 -368 263 -232 435 -136 133 -102 133 -200 133 -134 163 -134 167 -168 299 -66 265 -100 133 -240 135 -132 263 -170 269 -200 501 -396 263 -98 227 -132 129 -292 427 -66 165 -102 627 -602 99 -66 301 -168 199 -100 563 -330 165 -134 233 -136 65 -332 499 -100 131 -232 325 -96 65 -132 195 -98 393 -624 323 -68 133 -98 195 -162 231 -100 263 -132 231 -102 133 -236 99 -236 231 -166 65 -102 133 -268 101 -102 299 -136 267 -164 493 -64 229 -258 291 -326 263 -198 391 -134 167 -202 365 -594 133 -102 201 -134 503 -396 429 -204 169 -400 197 -170 267 -132 403 -466 297 -98 469 -234 395 -132 233 -100 165 -100 165 -66 197 -68 297 -166 501 -134 133 -100 65 -166 631 -68 297 -134 199 -100 165 -68 299 -266 133 -66 165 -100 231 -490 557 -134 371 -164 299 -170 733 -164 239 -334 335 -66 299 -300 199 -170 103 -100 233 -102 641 -168 65 -100 995 -66 265 -160 259 -130 129 -226 425 -100 355 -726 97 -688 99 -66 233 -266 299 -942 167 -102 167 -166 65 -100 367 -136 99 -134 199 -134 267 -164 +RAW_Data: 67 -68 233 -66 899 -66 163 -96 485 -98 355 -130 943 -100 235 -168 499 -104 1367 -98 297 -100 635 -68 1169 -100 67 -134 835 -264 959 -164 129 -98 419 -196 589 -66 421 -66 1717 -100 133 -100 265 -134 227 -356 455 -166 163 -66 1055 -100 1455 -134 463 -98 2191 -132 295 -132 335 -66 709 -64 619 -98 959 -68 835 -170 603 -134 1033 -134 635 -168 759 -232 397 -198 397 -164 1267 -166 257 -198 1295 -100 239 -104 563 -204 335 -198 203 -68 901 -68 1255 -134 1697 -66 793 -66 1691 -68 201 -100 765 -66 165 -132 131 -230 131 -66 917 -66 335 -338 231 -170 827 -98 199 -136 301 -196 65 -98 199 -200 765 -134 403 -98 333 -68 1691 -132 2565 -64 569 -170 1255 -264 65 -132 1243 -132 2527 -66 259 -66 1739 -100 1309 -198 167 -238 337 -66 131 -68 1973 -362 299 -100 1387 -96 129 -164 423 -230 3875 -96 4283 -98 165 -98 515 -134 469 -68 171 -102 1163 -100 65 -298 461 -66 367 -136 205 -168 371 -98 491 -164 161 -262 1093 -100 299 -100 269 -334 1205 -98 63 -98 261 -64 457 -98 diff --git a/assets/unit_tests/subghz/test_random_raw.sub b/assets/unit_tests/subghz/test_random_raw.sub index 928838d3c..7d342bb93 100644 --- a/assets/unit_tests/subghz/test_random_raw.sub +++ b/assets/unit_tests/subghz/test_random_raw.sub @@ -145,3 +145,18 @@ RAW_Data: -66 133 -66 97 -166 561 -100 895 -132 1323 -66 10873 -3752 99 -722 229 RAW_Data: -5434 65 -298 133 -132 131 -68 231 -200 661 -132 9517 -424 97 -1456 99 -1694 393 -100 131 -560 131 -196 197 -298 65 -428 229 -196 297 -266 131 -166 2435 -66 10161 -11230 65 -1320 131 -298 265 -532 231 -200 1291 -68 631 -66 12645 -4048 133 -66 67 -132 167 -266 163 -66 397 -132 197 -132 299 -98 197 -198 2903 -66 2361 -66 9627 -3588 197 -332 165 -68 331 -68 197 -132 99 -100 663 -66 363 -230 231 -166 131 -100 201 -298 163 -132 133 -202 363 -300 397 -102 263 -100 165 -66 1221 -66 1479 -132 165 -98 229 -12976 263 -66 363 -134 231 -66 629 -132 327 -100 97 -130 99 -164 227 -64 297 -132 397 -164 425 -198 97 -198 99 -66 365 -164 199 -102 97 -66 1817 -13524 231 -134 16907 -4086 233 -630 65 -396 201 -66 165 -198 67 -198 99 -664 2117 -166 12473 -446 2649 -440 2661 -420 2651 -422 2681 -418 2703 -400 365 -2724 387 -2696 2695 -414 357 -2704 2707 -386 389 -2700 2687 -392 405 -2706 2695 -402 363 -21268 2707 -388 377 -2706 2691 -404 2699 -382 2717 -382 2707 -378 2693 -416 2687 -396 363 -2736 355 -2748 2659 -416 365 -2708 2715 -388 377 -2708 2697 -404 363 -2730 2673 -420 355 -21268 2655 -460 319 -2766 2663 -448 2631 -436 2665 -418 2683 -410 2681 -416 2701 -386 383 -2700 375 -2744 2669 -416 353 -2730 2685 -416 357 -2708 2721 -380 369 -2724 2697 -382 385 -21260 2701 -418 353 -2720 2673 -418 2675 -408 2693 -384 2715 -386 2717 -386 2691 -404 363 -2732 387 -2702 2669 -412 359 -2736 2699 -380 381 -2728 2675 -416 381 -2720 2675 -414 347 -21280 2685 -390 377 -2724 2689 -416 2673 -408 2705 -382 2695 -410 2689 -414 2661 -418 385 -2704 369 -2704 2693 -416 375 -2726 2661 -420 355 -2728 2711 -388 375 -2702 2691 -410 363 -21252 2659 -488 287 -2794 2651 -448 2629 -436 2671 -416 2695 -416 2663 -406 2699 -384 383 -2730 367 -2702 2695 -418 385 -2702 2685 -412 349 -2744 2693 -366 389 -2714 2693 -394 381 -21266 2685 -418 363 -2730 2683 -382 2693 -418 2675 -410 2699 -384 2719 -382 2707 -380 359 -2734 387 -2704 2709 -380 361 -2732 2699 -418 357 -2728 2667 -416 383 -2696 2709 -380 391 -21228 2685 -458 307 -2800 2647 -412 2659 -432 2667 -416 2695 -416 2675 -406 2675 -416 383 -2700 361 -2730 2687 -414 375 -2696 2701 -420 353 -2720 2711 -382 367 -2728 2675 -416 385 -21222 2735 -386 355 -2744 2687 -396 2679 -418 2701 -386 2705 -382 2681 -410 2697 -384 385 -2736 365 -2704 2715 -384 377 -2696 2697 -416 349 -2722 2707 -386 379 -2732 2671 -410 361 -21258 2681 -464 297 -2796 2629 -456 2655 -420 2661 -448 2663 -404 2695 -382 2715 -380 371 -2740 355 -2744 2679 -384 391 -2728 2675 -388 379 RAW_Data: -2728 2695 -414 357 -2704 2705 -418 357 -21262 2673 -416 383 -2696 2709 -380 2703 -384 2699 -418 2671 -408 2695 -382 2713 -386 379 -2730 357 -2732 2695 -384 383 -2730 2679 -416 357 -2708 2701 -410 349 -2736 2697 -382 385 -21252 2669 -478 289 -2790 2647 -426 2651 -444 2653 -430 2659 -418 2695 -414 2681 -402 349 -2738 383 -2722 2677 -414 347 -2744 2691 -382 369 -2730 2691 -384 383 -2734 2679 -414 347 -21264 2705 -386 379 -2736 2667 -410 2695 -382 2715 -380 2709 -420 2665 -392 2713 -382 383 -2730 365 -2728 2665 -418 383 -2696 2693 -418 357 -2710 2711 -380 375 -2718 2701 -416 357 -21238 2677 -484 311 -2766 2635 -444 2657 -420 2663 -422 2695 -416 2667 -428 2675 -396 363 -73890 133 -98 131 -132 129 -658 99 -66 853 -100 63 -100 361 -98 1589 -66 1231 -132 65 -100 297 -198 65 -132 265 -66 9857 -4672 165 -1030 97 -1394 65 -200 2687 -68 6873 -8336 99 -1156 97 -66 163 -232 163 -262 197 -132 295 -132 263 -166 953 -100 263 -130 393 -164 295 -64 329 -66 393 -164 823 -130 165 -66 6133 -8436 165 -164 265 -266 65 -362 197 -696 3181 -132 363 -98 65 -166 131 -66 399 -132 663 -396 329 -66 7335 -7578 497 -230 627 -264 99 -366 99 -132 131 -134 265 -498 163 -100 1323 -66 265 -66 1129 -100 399 -132 365 -100 795 -68 397 -98 597 -364 297 -132 361 -132 265 -132 8591 -4740 65 -100 131 -166 199 -1088 97 -296 99 -528 131 -98 661 -66 401 -198 1157 -166 361 -164 495 -100 165 -66 297 -100 1423 -66 3067 -5658 67 -6406 197 -1092 65 -530 659 -68 265 -100 991 -68 231 -230 297 -66 327 -66 131 -132 659 -134 131 -100 1183 -132 263 -98 621 -66 2075 -6976 65 -5138 67 -132 129 -664 67 -132 165 -100 331 -466 231 -68 467 -98 563 -66 231 -100 531 -66 465 -66 1023 -166 297 -134 3409 -12290 67 -164 99 -532 133 -166 263 -66 231 -66 721 -64 131 -68 959 -134 495 -100 299 -98 497 -98 365 -100 397 -232 297 -98 531 -66 3029 -12216 265 -132 99 -364 199 -234 131 -66 431 -166 333 -166 397 -132 327 -100 395 -66 197 -132 395 -66 527 -98 295 -100 97 -98 789 -132 363 -132 297 -200 2815 -4914 65 -6620 65 -462 65 -134 297 -66 497 -264 231 -198 2773 -134 365 -100 831 -166 131 -100 297 -132 861 -132 299 -100 561 -66 1381 -6946 65 -5516 231 -266 97 -1362 1093 -68 1621 -134 165 -332 297 -98 361 -228 97 -132 797 -98 3487 -13224 229 -164 65 -132 913 -66 1123 -98 527 -134 929 -98 723 -100 12259 -270 165 -132 67 -132 165 -1326 99 -98 65 -1194 431 -66 695 -66 733 -134 197 RAW_Data: -134 10801 -166 67 -6130 133 -198 231 -334 365 -98 229 -132 165 -68 231 -166 14501 -524 65 -328 131 -498 129 -1288 65 -494 163 -64 165 -66 527 -132 131 -132 1019 -198 129 -166 393 -198 65 -164 6411 -66 3255 -10642 65 -1320 165 -164 493 -492 559 -264 2555 -66 695 -66 1657 -164 855 -66 4001 -10526 97 -596 133 -298 67 -264 65 -300 65 -100 263 -166 231 -134 99 -100 2703 -68 13643 -4922 297 -100 65 -232 133 -198 331 -300 231 -66 331 -100 12047 -3872 97 -196 65 -494 329 -66 65 -890 97 -98 229 -164 195 -596 797 -66 861 -132 65 -66 231 -100 565 -66 65 -66 1297 -132 265 -66 363 -134 265 -364 297 -164 299 -134 297 -134 495 -98 11309 -3790 131 -1380 65 -758 65 -164 129 -460 65 -360 199 -100 563 -68 497 -198 363 -266 263 -100 165 -66 697 -66 1933 -13594 65 -762 1223 -132 1119 -196 361 -134 131 -100 793 -166 695 -68 231 -68 463 -66 11727 -4204 363 -264 131 -132 133 -1124 97 -100 163 -100 327 -100 331 -198 397 -66 397 -100 395 -100 163 -66 197 -564 1059 -7962 65 -100 65 -198 129 -362 99 -394 197 -296 495 -100 1357 -68 459 -66 593 -66 265 -68 301 -132 465 -66 231 -200 397 -66 397 -232 199 -298 12077 -4350 231 -796 363 -198 133 -264 65 -1132 597 -332 3295 -100 755 -98 231 -164 97 -264 459 -166 759 -164 3265 -12138 99 -232 99 -1228 1025 -100 393 -66 531 -132 693 -132 1063 -66 427 -64 297 -294 229 -98 9723 -5404 67 -466 99 -796 267 -98 201 -100 167 -264 461 -98 1415 -66 861 -66 267 -66 331 -134 1663 -66 2089 -7012 65 -100 101 -4804 431 -728 99 -100 65 -100 995 -134 165 -66 929 -100 65 -66 927 -100 1093 -168 99 -100 497 -66 665 -200 6517 -8312 165 -66 129 -66 559 -166 99 -430 65 -398 67 -66 593 -198 459 -132 261 -132 263 -130 723 -66 459 -100 325 -166 67 -198 559 -66 493 -66 11475 -3896 99 -266 99 -66 197 -1092 129 -198 361 -166 163 -98 263 -196 759 -100 265 -100 365 -630 4635 -12748 65 -1712 461 -100 497 -66 395 -98 265 -98 229 -164 529 -132 297 -66 565 -132 987 -132 8665 -2820 2265 -450 313 -2774 2643 -442 325 -2772 2665 -416 359 -2734 2667 -386 379 -21274 2657 -474 293 -2810 2619 -466 2613 -476 2629 -452 2663 -388 2683 -418 2705 -400 365 -2722 387 -2700 2697 -380 361 -2732 2691 -418 361 -2732 2667 -416 383 -2698 2697 -416 357 -21238 2715 -384 383 -2732 2685 -416 2667 -416 2695 -398 2671 -418 2687 -390 2713 -382 383 -2730 365 -2728 2661 -416 379 -2716 2685 -384 379 -2720 2703 -378 401 -2718 2671 +RAW_Data: 889 -130 325 -64 457 -560 165 -68 199 -170 67 -66 265 -132 133 -666 67 -166 431 -66 201 -98 297 -100 595 -66 199 -134 65 -100 795 -132 99 -168 501 -200 331 -132 265 -102 265 -134 423 -98 521 -226 65 -166 431 -134 99 -100 133 -464 195 -326 623 -100 673 -98 321 -200 65 -136 369 -166 65 -68 97 -166 165 -334 265 -102 231 -166 101 -170 65 -170 265 -136 931 -100 133 -134 563 -66 333 -100 427 -66 163 -390 231 -66 193 -130 461 -166 557 -100 99 -198 263 -100 197 -294 231 -232 299 -134 199 -170 267 -134 631 -98 235 -100 499 -68 463 -100 65 -134 335 -170 273 -134 297 -100 67 -66 197 -166 67 -134 301 -168 537 -470 99 -134 433 -132 199 -192 261 -100 523 -164 459 -132 259 -332 359 -64 227 -96 131 -132 687 -132 363 -136 329 -434 99 -334 133 -100 401 -132 233 -700 233 -170 337 -66 371 -68 233 -202 531 -266 731 -66 465 -100 167 -100 133 -232 335 -166 239 -102 367 -232 231 -100 167 -134 201 -136 301 -168 199 -300 231 -98 237 -134 233 -102 329 -132 261 -134 199 -66 265 -136 99 -170 167 -134 199 -166 167 -136 367 -298 197 -200 99 -166 469 -136 439 -66 303 -134 295 -100 433 -134 899 -266 363 -132 197 -160 555 -324 129 -96 97 -128 257 -132 97 -394 257 -98 195 -166 459 -332 395 -132 633 -134 301 -100 131 -332 169 -168 395 -166 263 -540 783 -100 287 -130 295 -96 225 -296 133 -98 99 -100 461 -164 545 -130 99 -66 301 -68 265 -100 235 -134 235 -70 333 -102 497 -66 233 -364 301 -170 103 -66 165 -336 733 -200 133 -100 263 -102 65 -136 465 -200 1035 -198 165 -170 67 -302 631 -100 429 -332 65 -128 129 -130 159 -128 159 -66 161 -96 325 -164 261 -100 197 -162 65 -96 99 -130 65 -102 333 -100 199 -98 389 -330 129 -128 229 -66 425 -366 229 -64 261 -100 227 -96 227 -526 301 -200 97 -66 699 -334 67 -100 399 -198 787 -98 297 -134 429 -100 3245 -64 527 -98 131 -526 633 -68 133 -302 1459 -164 971 -102 237 -136 1439 -266 1131 -66 599 -200 303 -332 325 -130 389 -166 371 -66 333 -102 65 -100 233 -234 327 -266 233 -166 297 -100 225 -130 163 -336 99 -596 199 -330 131 -66 331 -338 263 -358 197 -168 877 -66 227 -96 63 -130 263 -162 225 -290 197 -198 357 -132 297 -262 165 -456 227 -98 399 -296 95 -132 99 -98 457 -200 199 -168 535 -100 567 -134 327 -130 193 -130 683 -102 101 -132 233 -170 943 -166 827 -66 267 -102 503 -68 1325 -164 +RAW_Data: 1607 -68 233 -166 1167 -70 531 -134 335 -168 131 -66 299 -402 899 -66 461 -66 457 -98 953 -98 165 -66 293 -230 881 -64 393 -166 589 -66 289 -66 1093 -204 333 -98 2745 -132 2019 -170 925 -68 269 -102 1469 -136 2301 -68 1355 -100 527 -66 975 -68 1445 -98 2397 -100 1733 -66 703 -100 995 -100 135 -136 235 -202 167 -134 2071 -166 339 -170 201 -268 129 -66 465 -66 365 -100 197 -164 129 -98 161 -96 423 -66 675 -66 1543 -136 567 -200 767 -202 65 -100 1401 -66 623 -136 567 -234 67 -236 197 -194 97 -66 263 -66 1827 -392 1893 -98 165 -268 133 -132 231 -162 225 -98 695 -198 563 -100 301 -332 267 -102 341 -66 99 -132 1299 -130 525 -68 161 -96 357 -98 353 -100 131 -100 131 -98 163 -132 323 -100 535 -66 1323 -130 133 -66 235 -134 1497 -132 387 -98 129 -162 2623 -134 163 -68 167 -66 959 -232 495 -68 131 -134 867 -134 865 -66 333 -98 305 -134 231 -98 765 -198 397 -432 165 -66 165 -366 265 -102 541 -100 261 -162 331 -134 457 -66 491 -196 97 -266 193 -262 65 -166 231 -266 497 -360 263 -98 587 -164 259 -98 231 -66 359 -100 267 -102 271 -168 97 -262 63 -66 261 -130 227 -130 295 -164 65 -66 265 -200 597 -134 267 -170 603 -100 97 -466 231 -264 97 -168 99 -66 65 -200 199 -100 267 -404 303 -102 201 -204 235 -134 131 -198 335 -298 327 -130 291 -164 63 -162 295 -262 197 -130 95 -130 195 -96 159 -130 161 -66 231 -100 165 -66 199 -134 363 -66 267 -168 165 -168 167 -100 165 -530 363 -432 99 -232 65 -132 395 -328 229 -98 197 -132 161 -96 191 -292 197 -204 133 -100 399 -166 531 -332 235 -168 99 -66 325 -158 553 -132 129 -226 231 -134 99 -462 129 -64 289 -100 193 -66 355 -164 291 -198 131 -298 197 -198 373 -268 335 -234 427 -68 199 -132 267 -232 131 -66 783 -326 63 -162 161 -130 227 -66 259 -562 233 -464 303 -102 201 -334 301 -134 297 -198 229 -66 127 -166 99 -100 197 -198 571 -66 457 -134 361 -424 131 -328 163 -98 63 -100 505 -102 201 -1094 229 -164 65 -230 789 -236 2505 -166 201 -170 163 -64 1139 -66 927 -100 295 -198 723 -100 365 -66 459 -196 3033 -272 199 -66 499 -202 1319 -232 295 -298 131 -362 97 -164 129 -132 65 -98 197 -130 129 -98 261 -130 97 -98 229 -96 425 -66 227 -166 483 -66 163 -326 567 -68 235 -68 67 -66 167 -66 235 -330 425 -164 63 -66 427 -102 167 -66 669 -132 429 -200 65 -102 133 -100 197 -368 +RAW_Data: 65 -134 2481 -228 65 -130 229 -228 763 -136 603 -166 1619 -98 1763 -102 837 -166 321 -66 951 -130 2067 -66 259 -132 1835 -66 437 -102 701 -66 565 -68 363 -70 1113 -66 1989 -164 257 -128 351 -162 1055 -232 265 -170 309 -200 435 -166 833 -102 2467 -132 595 -66 773 -166 1615 -98 131 -96 485 -64 517 -166 197 -68 1231 -68 403 -100 263 -134 233 -100 503 -100 333 -266 729 -66 199 -100 369 -68 1239 -100 197 -68 299 -170 337 -100 825 -132 163 -66 4205 -64 161 -100 635 -66 907 -66 1017 -166 1709 -100 201 -266 657 -68 463 -166 331 -164 293 -64 259 -162 129 -262 597 -134 701 -136 67 -168 235 -136 303 -170 1417 -66 263 -98 857 -100 659 -166 97 -100 2497 -64 2495 -98 719 -128 227 -130 2217 -164 623 -264 719 -134 329 -98 1371 -100 553 -294 165 -66 1163 -100 329 -196 649 -200 1123 -68 263 -100 593 -266 333 -102 1133 -136 131 -132 603 -200 1819 -66 489 -66 563 -266 1113 -230 165 -66 423 -68 335 -100 101 -100 1073 -132 897 -100 101 -100 499 -134 173 -138 763 -238 371 -130 403 -166 203 -102 271 -136 269 -166 99 -168 263 -96 425 -66 331 -234 133 -400 231 -132 453 -66 459 -164 199 -68 237 -132 163 -198 161 -196 265 -132 65 -64 195 -130 357 -164 663 -68 167 -600 131 -98 133 -304 203 -134 433 -98 261 -130 199 -100 237 -100 229 -326 99 -98 331 -132 99 -294 165 -66 303 -134 99 -232 133 -136 99 -68 267 -198 233 -138 67 -166 367 -100 333 -168 267 -200 369 -266 135 -404 1939 -132 231 -160 161 -64 293 -98 331 -132 339 -104 135 -100 197 -430 263 -202 233 -64 195 -162 129 -64 227 -298 265 -68 697 -66 301 -68 231 -300 131 -368 769 -234 265 -98 195 -324 97 -752 229 -126 355 -98 257 -98 287 -64 427 -132 295 -262 197 -170 369 -102 267 -100 169 -68 201 -102 2551 -136 635 -134 639 -134 99 -132 197 -200 371 -66 731 -132 199 -138 733 -304 433 -68 729 -440 197 -68 99 -102 165 -266 261 -164 491 -296 489 -194 257 -164 133 -134 237 -68 335 -98 227 -130 229 -98 295 -98 231 -202 267 -236 233 -136 331 -130 195 -128 261 -430 261 -162 97 -224 99 -130 193 -96 197 -162 229 -396 97 -98 227 -364 267 -100 99 -100 233 -236 697 -164 227 -196 63 -98 327 -230 325 -66 129 -196 95 -98 195 -130 325 -430 131 -194 129 -454 161 -196 235 -68 433 -134 667 -164 355 -236 101 -98 2143 -134 1827 -198 63 -198 65 -64 2859 -64 619 -66 97 -130 3157 -66 679 -194 1491 -98 +RAW_Data: 951 -64 393 -100 955 -132 4715 -100 131 -66 199 -204 1541 -66 929 -130 1347 -166 665 -132 233 -132 67 -102 433 -100 595 -228 997 -66 505 -68 133 -98 231 -68 571 -134 1371 -232 231 -270 135 -102 97 -66 867 -100 269 -68 967 -100 1649 -66 65 -66 951 -68 65 -202 363 -200 779 -102 1449 -294 419 -130 361 -230 1079 -164 163 -260 893 -102 333 -100 533 -166 467 -100 135 -66 135 -202 369 -100 199 -100 269 -134 301 -166 229 -66 101 -134 199 -134 1293 -64 779 -62 831 -66 1243 -68 267 -102 197 -100 395 -98 455 -64 621 -132 877 -98 199 -100 2101 -134 503 -100 2035 -134 735 -236 475 -136 237 -132 133 -134 1229 -100 133 -66 167 -68 2655 -100 1807 -100 1095 -264 825 -98 163 -66 491 -98 161 -128 953 -100 773 -100 131 -66 67 -134 457 -130 63 -64 389 -98 715 -66 425 -300 97 -100 1515 -66 303 -68 99 -98 721 -64 887 -132 65 -132 165 -66 635 -68 2801 -66 1561 -100 751 -98 129 -64 725 -136 201 -100 333 -204 573 -104 1745 -134 99 -66 129 -64 595 -134 167 -102 337 -134 567 -134 1131 -138 1207 -100 269 -68 135 -100 1143 -134 2139 -68 1701 -162 991 -596 431 -66 99 -132 657 -66 391 -320 357 -260 259 -98 429 -66 163 -228 65 -130 227 -66 261 -166 99 -98 131 -366 199 -134 463 -102 201 -98 231 -102 639 -238 301 -568 169 -610 265 -102 841 -198 297 -100 335 -132 263 -266 265 -68 469 -134 267 -68 933 -298 333 -298 729 -168 135 -136 437 -132 1137 -134 199 -68 265 -132 463 -166 129 -130 227 -98 297 -98 65 -132 97 -202 199 -232 305 -66 165 -198 365 -66 99 -98 299 -170 65 -136 301 -232 99 -564 133 -132 233 -170 99 -102 131 -134 65 -204 101 -98 297 -98 167 -762 233 -298 99 -326 395 -66 299 -132 369 -504 333 -98 483 -200 457 -164 63 -164 329 -162 65 -622 231 -268 131 -132 133 -134 131 -134 131 -66 99 -100 231 -66 167 -336 165 -98 197 -100 97 -264 321 -98 521 -132 163 -130 129 -294 297 -134 101 -102 265 -168 497 -68 197 -68 499 -134 269 -398 267 -130 203 -302 65 -498 271 -136 465 -292 131 -294 163 -198 329 -96 129 -98 193 -130 391 -330 165 -134 167 -170 297 -102 133 -136 135 -366 199 -132 423 -132 395 -168 65 -166 401 -98 229 -98 329 -98 99 -130 129 -228 261 -160 127 -426 389 -162 193 -132 131 -100 231 -168 67 -304 201 -68 765 -132 161 -162 193 -64 195 -64 295 -130 787 -98 419 -528 429 -66 363 -134 131 -100 133 -200 331 -98 +RAW_Data: 431 -66 1167 -68 937 -68 1003 -66 99 -132 941 -134 65 -66 365 -274 165 -236 367 -96 557 -134 675 -66 261 -164 127 -96 391 -164 161 -98 391 -292 163 -98 519 -196 165 -98 523 -66 195 -160 3343 -66 661 -100 2589 -136 307 -100 629 -136 639 -100 133 -168 405 -100 267 -66 465 -132 1171 -64 749 -64 165 -98 983 -100 163 -202 537 -66 327 -100 669 -100 401 -236 2885 -164 439 -134 97 -426 1931 -66 1385 -98 715 -98 519 -66 289 -162 97 -360 297 -166 163 -66 289 -66 555 -334 167 -230 429 -102 267 -132 943 -136 401 -68 929 -130 193 -68 467 -198 335 -66 963 -100 597 -132 197 -260 523 -232 1115 -102 1935 -66 1395 -134 305 -100 99 -66 199 -66 1071 -66 2357 -66 367 -498 769 -234 163 -130 191 -64 1211 -200 133 -102 201 -100 561 -366 361 -98 195 -100 537 -64 165 -196 1041 -332 133 -102 441 -230 4217 -66 1033 -66 167 -66 933 -100 565 -66 331 -164 673 -104 441 -66 533 -66 2095 -164 525 -66 297 -170 965 -198 421 -100 663 -832 65 -100 331 -164 231 -166 135 -168 237 -466 761 -134 891 -196 791 -198 257 -160 161 -98 293 -66 1081 -98 229 -130 327 -66 1301 -200 331 -166 101 -66 461 -100 2619 -132 1663 -98 1609 -134 499 -332 165 -370 67 -264 97 -96 259 -98 701 -402 197 -128 527 -236 233 -102 167 -134 303 -134 99 -166 299 -132 165 -200 467 -68 305 -168 207 -102 465 -102 729 -136 101 -374 327 -96 259 -98 467 -202 65 -66 673 -98 335 -404 135 -66 339 -204 99 -366 233 -68 365 -166 133 -102 867 -198 163 -162 163 -294 463 -332 165 -68 269 -268 331 -100 131 -166 299 -132 231 -400 263 -164 131 -266 267 -264 367 -66 371 -134 229 -104 267 -232 67 -466 265 -100 101 -100 165 -200 65 -200 301 -66 199 -168 233 -98 267 -66 67 -134 261 -196 261 -234 427 -294 65 -194 193 -66 259 -132 849 -96 63 -198 167 -294 95 -98 361 -164 261 -196 131 -132 437 -100 597 -262 327 -162 295 -98 295 -164 259 -196 425 -230 321 -66 195 -66 261 -496 99 -200 529 -132 133 -966 133 -132 165 -66 63 -128 491 -402 65 -262 299 -66 299 -202 265 -100 99 -668 97 -134 65 -100 101 -66 65 -266 691 -66 431 -166 167 -134 199 -370 899 -134 99 -100 1093 -166 163 -166 399 -98 327 -100 99 -168 135 -200 133 -202 429 -98 65 -98 197 -556 65 -66 97 -326 331 -166 333 -200 135 -100 235 -234 265 -98 65 -68 135 -66 335 -66 133 -298 99 -66 233 -164 435 -232 97 -132 97 -392 +RAW_Data: 99 -198 819 -66 1235 -98 321 -132 1091 -66 1307 -98 3059 -164 3305 -64 227 -98 591 -98 129 -66 229 -98 2143 -98 939 -68 563 -100 361 -232 945 -164 257 -96 229 -230 387 -64 195 -130 981 -294 587 -162 193 -98 1337 -66 293 -98 2665 -66 297 -98 647 -66 459 -132 491 -164 489 -96 595 -66 899 -66 837 -64 1151 -196 259 -98 357 -164 891 -132 1359 -134 197 -98 97 -98 261 -64 229 -96 461 -136 693 -100 201 -98 865 -66 599 -100 517 -132 709 -66 293 -298 655 -66 197 -130 129 -66 197 -98 4291 -66 673 -66 667 -132 1473 -132 133 -104 99 -66 163 -168 333 -134 1743 -132 1097 -132 99 -68 167 -602 1323 -352 99 -166 753 -98 423 -98 97 -66 1317 -228 1309 -98 1849 -66 1939 -132 601 -100 665 -100 1875 -66 695 -132 425 -66 425 -66 263 -134 165 -134 99 -98 829 -66 601 -166 131 -102 565 -66 301 -100 1099 -100 601 -138 533 -66 667 -234 561 -66 99 -68 2741 -98 199 -100 531 -168 101 -434 1027 -68 431 -66 403 -132 99 -98 565 -132 135 -100 399 -166 271 -236 233 -166 197 -366 99 -66 99 -168 503 -66 199 -170 207 -100 673 -368 99 -66 263 -168 133 -98 397 -268 337 -66 131 -132 231 -132 501 -134 99 -168 567 -138 103 -136 267 -298 231 -134 197 -160 321 -332 231 -98 131 -164 257 -64 163 -328 395 -66 331 -202 65 -168 133 -68 167 -100 233 -102 335 -66 197 -326 1101 -132 589 -100 811 -132 399 -136 269 -102 497 -66 559 -100 129 -98 855 -68 637 -102 65 -200 875 -68 233 -166 167 -66 529 -202 235 -102 231 -66 1237 -66 733 -98 1723 -132 101 -100 297 -66 829 -232 197 -100 367 -134 169 -166 167 -434 633 -100 235 -200 131 -134 233 -100 131 -100 331 -134 495 -432 65 -528 161 -130 295 -132 337 -136 133 -166 165 -100 269 -240 201 -336 133 -166 165 -238 199 -202 431 -434 99 -134 501 -166 231 -96 559 -202 167 -66 717 -98 987 -198 65 -64 163 -64 227 -98 555 -164 199 -64 361 -66 163 -98 129 -162 97 -130 161 -460 197 -230 681 -98 197 -98 329 -100 267 -266 291 -264 65 -100 329 -100 459 -200 363 -98 165 -134 231 -134 301 -134 231 -302 99 -132 101 -134 267 -136 233 -68 393 -422 163 -166 361 -166 99 -134 365 -134 133 -336 401 -66 495 -132 401 -168 133 -402 501 -136 1093 -862 165 -132 293 -300 289 -66 131 -164 391 -134 99 -360 359 -130 323 -200 423 -98 195 -162 295 -132 161 -98 129 -782 131 -426 227 -64 259 -166 63 -160 323 -98 261 -230 +RAW_Data: 231 -66 921 -66 355 -64 1019 -98 227 -258 163 -66 597 -232 1313 -132 163 -404 467 -236 901 -164 483 -98 195 -96 489 -134 103 -238 169 -66 67 -68 299 -100 497 -68 65 -134 1635 -304 1153 -100 539 -168 265 -200 499 -166 535 -100 397 -168 931 -100 131 -66 631 -134 897 -270 1233 -100 65 -132 131 -334 663 -66 163 -66 131 -132 705 -98 571 -200 433 -100 237 -234 229 -132 1627 -66 569 -100 715 -66 1863 -272 265 -68 301 -98 465 -68 97 -134 99 -66 395 -136 1405 -66 529 -132 63 -196 579 -132 413 -260 129 -136 101 -166 1201 -134 833 -134 393 -66 335 -172 201 -68 1027 -96 753 -64 815 -66 97 -64 1341 -132 289 -160 127 -66 99 -228 1083 -96 163 -66 259 -64 159 -98 2409 -168 767 -200 367 -66 1675 -66 1067 -98 3407 -200 99 -66 1403 -166 99 -134 439 -200 329 -136 599 -66 637 -66 835 -66 1099 -98 99 -66 463 -166 165 -100 461 -164 3037 -66 655 -66 97 -98 229 -130 355 -132 1443 -66 527 -98 881 -98 229 -162 127 -96 583 -64 65 -162 489 -166 885 -194 257 -98 1539 -66 293 -166 229 -132 655 -98 757 -49522 271 -758 689 -1264 737 -670 293 -1152 811 -1144 341 -664 773 -678 327 -1118 807 -1144 835 -1146 781 -1126 873 -1096 347 -622 877 -624 321 -1106 843 -1098 871 -1098 843 -1106 379 -610 841 -584 381 -1122 365 -602 845 -1116 837 -610 381 -1056 889 -1078 383 -614 827 -1110 877 -592 353 -1108 845 -1120 839 -1120 347 -602 849 -1110 865 -612 361 -1072 869 -1114 351 -618 861 -618 343 -1090 853 -1106 387 -618 797 -674 347 -1084 389 -574 867 -584 381 -1114 841 -1102 845 -1116 839 -1112 843 -1098 875 -1086 383 -584 865 -588 375 -1100 861 -1112 851 -1084 853 -1108 847 -1106 381 -584 857 -610 383 -1080 357 -602 871 -602 385 -1084 383 -616 823 -610 373 -1086 381 -590 871 -1084 839 -628 353 -1102 875 -1100 349 -9404 875 -1060 871 -1086 887 -1088 879 -1058 863 -1086 855 -1132 845 -1078 871 -1076 857 -1098 881 -1082 861 -1088 843 -1120 853 -1074 879 -1074 879 -1068 889 -614 341 -1090 387 -616 863 -624 345 -1088 391 -590 857 -612 385 -1058 393 -596 843 -1088 889 -1078 879 -578 387 -1082 875 -1076 415 -550 881 -1070 877 -592 391 -1114 821 -1104 373 -620 821 -624 361 -1072 903 -1086 855 -1092 843 -1086 905 -1054 387 -614 863 -618 347 -1088 853 -1114 845 -1090 867 -1070 381 -610 885 -584 385 -1052 407 -578 877 -1052 899 -600 389 -1048 907 -1074 383 -586 877 -1072 877 -594 359 -1076 875 -1082 891 -1088 363 -616 855 -1084 857 -592 381 -1088 883 -1086 385 -572 +RAW_Data: 889 -624 353 -1082 853 -1096 379 -594 853 -624 353 -1092 417 -582 847 -612 385 -1076 847 -1080 883 -1052 913 -1044 907 -1076 849 -1088 383 -602 867 -616 361 -1068 901 -1072 865 -1104 831 -1080 879 -1098 397 -586 855 -626 355 -1084 381 -592 873 -616 351 -1084 385 -624 821 -620 359 -1086 387 -584 883 -1086 877 -592 355 -1106 853 -1086 387 -69570 97 -100 99 -2620 131 -636 333 -102 235 -236 67 -68 363 -66 201 -100 567 -102 267 -164 101 -134 65 -68 197 -68 297 -166 671 -100 469 -336 165 -100 201 -66 169 -230 169 -204 329 -624 67 -98 265 -232 193 -168 299 -100 235 -138 101 -370 165 -294 333 -622 231 -130 129 -130 353 -132 195 -162 359 -164 67 -68 333 -100 133 -688 235 -236 497 -198 293 -98 129 -296 293 -164 229 -128 229 -132 193 -400 165 -66 163 -98 361 -164 355 -196 587 -164 131 -98 263 -554 99 -130 129 -130 191 -464 99 -132 67 -100 167 -604 329 -66 199 -68 133 -102 163 -66 2971 -132 785 -66 329 -96 323 -100 201 -136 301 -66 1959 -166 867 -134 467 -66 297 -100 835 -100 753 -166 165 -64 67 -370 335 -66 559 -232 165 -334 65 -162 129 -354 163 -64 131 -134 265 -300 263 -132 267 -296 327 -198 99 -132 535 -132 469 -866 231 -860 99 -232 503 -134 99 -198 233 -134 267 -200 97 -358 297 -164 259 -98 227 -166 135 -66 323 -100 97 -294 131 -164 129 -98 295 -96 129 -426 299 -100 67 -102 623 -100 163 -194 127 -360 563 -134 199 -428 493 -98 229 -130 257 -64 165 -100 131 -98 163 -692 357 -64 161 -98 321 -64 389 -230 65 -692 227 -130 261 -132 231 -162 287 -298 97 -460 393 -130 301 -168 331 -100 269 -202 101 -134 201 -102 99 -132 199 -204 235 -664 65 -562 133 -328 463 -100 291 -194 159 -162 227 -98 293 -328 165 -128 227 -574 535 -332 197 -168 65 -300 131 -66 389 -1078 131 -64 259 -64 223 -98 257 -164 63 -328 433 -134 65 -602 131 -68 333 -136 369 -66 297 -264 427 -66 97 -130 429 -102 133 -136 203 -240 167 -236 329 -526 67 -132 133 -168 331 -360 65 -66 331 -296 267 -134 469 -132 595 -230 661 -662 299 -100 265 -200 203 -168 801 -100 133 -68 399 -132 99 -100 161 -390 65 -298 65 -98 261 -130 161 -128 257 -66 67 -134 621 -98 227 -328 99 -230 129 -294 193 -96 195 -318 425 -526 129 -196 163 -162 65 -132 293 -130 63 -66 325 -128 63 -130 293 -66 199 -200 269 -206 133 -198 325 -98 163 -100 97 -98 261 -164 67 -98 167 -430 131 -494 131 -164 +RAW_Data: 97 -98 861 -66 1199 -166 231 -100 651 -166 197 -104 439 -98 131 -64 493 -98 883 -96 99 -98 3327 -66 131 -264 733 -134 2133 -166 131 -102 303 -136 535 -134 701 -98 355 -228 131 -202 99 -134 99 -100 791 -166 169 -202 671 -100 741 -100 263 -66 165 -68 935 -132 197 -198 673 -100 605 -66 1457 -98 1195 -166 2347 -134 505 -100 1469 -66 391 -100 229 -100 1171 -98 939 -100 459 -170 369 -134 231 -162 127 -98 95 -66 195 -98 195 -66 299 -100 331 -98 65 -232 369 -132 201 -68 167 -166 1481 -102 501 -160 1257 -66 2307 -64 623 -164 2079 -66 1101 -98 423 -64 659 -68 431 -136 99 -100 435 -130 167 -168 835 -200 135 -104 133 -100 503 -68 1437 -232 821 -132 357 -96 463 -66 263 -64 683 -132 165 -96 655 -166 3939 -100 1169 -132 2443 -98 197 -132 425 -234 233 -162 1043 -66 197 -100 2793 -134 167 -104 675 -100 197 -134 1367 -102 763 -132 265 -230 133 -102 365 -100 167 -66 1069 -66 837 -100 295 -160 97 -64 129 -132 617 -164 197 -100 133 -136 337 -172 133 -66 557 -98 951 -66 263 -130 587 -66 729 -196 335 -166 933 -432 369 -100 199 -296 225 -98 355 -66 129 -64 557 -98 289 -66 355 -128 193 -162 267 -134 299 -98 165 -170 303 -640 1031 -134 99 -66 135 -68 771 -166 171 -104 201 -134 131 -68 635 -428 661 -292 749 -430 1161 -100 905 -98 65 -98 657 -262 2837 -132 67 -66 265 -132 631 -66 1037 -296 97 -98 1703 -302 367 -100 505 -232 497 -362 333 -134 591 -100 755 -232 67 -130 587 -66 231 -168 65 -332 99 -66 267 -232 393 -134 65 -132 131 -428 133 -200 165 -202 199 -168 165 -102 269 -100 333 -852 201 -134 233 -202 65 -200 563 -768 265 -136 169 -102 169 -598 333 -202 267 -134 267 -328 163 -130 625 -500 199 -200 99 -270 65 -134 65 -198 65 -100 99 -596 493 -66 99 -66 331 -232 103 -136 373 -168 831 -170 65 -672 163 -102 133 -136 331 -100 333 -234 101 -100 99 -200 99 -100 201 -302 199 -600 301 -202 135 -134 705 -166 435 -530 97 -198 131 -198 195 -66 163 -392 293 -66 295 -370 229 -198 65 -100 405 -134 165 -134 133 -170 337 -236 205 -274 267 -134 329 -132 195 -132 503 -132 133 -136 133 -334 197 -196 299 -168 101 -100 233 -100 439 -134 301 -332 331 -298 433 -406 433 -68 167 -100 203 -100 101 -102 99 -328 397 -234 205 -168 133 -364 63 -202 397 -198 95 -394 267 -134 569 -66 201 -102 133 -136 101 -102 99 -132 99 -196 197 -498 197 -102 135 -170 +RAW_Data: 331 -164 63 -162 1267 -66 163 -130 129 -66 725 -164 231 -64 853 -66 101 -134 199 -102 99 -68 365 -66 357 -130 815 -64 357 -98 97 -98 97 -66 65 -466 231 -172 3749 -66 849 -130 917 -64 327 -64 1013 -98 555 -332 795 -100 571 -132 769 -132 401 -134 1297 -134 377 -138 435 -100 401 -100 667 -100 1761 -66 667 -66 1533 -236 233 -98 885 -130 457 -66 999 -66 165 -66 833 -134 695 -166 501 -66 499 -200 329 -64 197 -134 441 -100 2099 -98 491 -134 197 -130 2225 -132 65 -100 689 -64 193 -160 159 -96 195 -98 323 -164 259 -98 535 -472 771 -66 665 -270 665 -66 595 -266 2191 -64 643 -98 1287 -98 741 -100 233 -200 569 -194 261 -68 637 -100 97 -66 491 -158 395 -138 1017 -66 627 -262 559 -64 327 -98 263 -134 99 -102 201 -102 337 -66 167 -68 679 -100 471 -134 195 -66 133 -202 693 -96 197 -98 391 -164 99 -98 3883 -194 461 -100 237 -168 1891 -68 301 -68 969 -166 1439 -294 551 -130 389 -98 99 -196 167 -102 505 -66 569 -234 901 -98 407 -136 469 -66 769 -98 769 -166 1263 -266 297 -98 1701 -200 203 -168 329 -232 65 -100 329 -164 803 -100 135 -200 233 -166 135 -272 265 -134 197 -100 133 -134 539 -232 197 -396 165 -366 263 -68 233 -102 365 -132 233 -100 135 -266 199 -234 167 -232 97 -524 127 -128 389 -98 305 -364 261 -130 257 -162 589 -464 361 -66 229 -134 161 -100 203 -432 265 -66 199 -66 199 -366 229 -236 99 -134 99 -100 131 -168 133 -100 131 -236 267 -132 297 -264 291 -132 167 -234 65 -100 199 -66 333 -730 237 -440 365 -102 99 -100 99 -132 99 -100 1429 -134 427 -100 97 -100 131 -164 799 -170 1077 -100 431 -66 133 -168 737 -134 197 -230 65 -102 803 -132 491 -98 429 -198 471 -134 365 -66 299 -236 65 -66 2837 -102 399 -64 585 -64 523 -196 97 -98 295 -196 555 -160 261 -500 299 -396 333 -236 133 -68 327 -100 199 -204 699 -66 701 -100 65 -164 65 -370 195 -196 97 -66 193 -130 129 -360 195 -130 231 -96 291 -64 455 -228 293 -196 291 -162 97 -194 621 -130 847 -66 395 -66 161 -128 193 -130 293 -98 231 -170 67 -134 297 -360 167 -266 263 -526 263 -132 229 -98 191 -160 159 -100 721 -234 101 -100 99 -130 259 -258 265 -632 687 -164 133 -134 631 -100 199 -102 165 -560 299 -200 265 -332 431 -870 99 -266 503 -364 135 -66 269 -68 499 -100 265 -102 263 -102 569 -234 719 -132 99 -196 419 -262 163 -688 95 -66 165 -128 95 -66 +RAW_Data: 295 -98 987 -196 517 -100 489 -66 355 -132 563 -198 867 -134 1413 -134 541 -134 767 -100 193 -98 1799 -102 467 -134 299 -96 323 -66 261 -100 259 -66 229 -96 851 -66 369 -266 469 -66 101 -98 163 -136 267 -432 859 -130 523 -66 197 -134 1027 -132 227 -194 393 -98 807 -166 235 -100 133 -66 165 -102 133 -136 371 -162 1411 -132 865 -200 471 -100 133 -68 299 -66 633 -98 329 -234 401 -98 1505 -132 133 -134 331 -262 163 -66 261 -98 289 -64 201 -68 1055 -96 391 -66 951 -298 265 -202 297 -66 401 -68 131 -100 1733 -98 941 -66 803 -98 847 -64 3701 -100 721 -160 357 -166 1799 -66 329 -100 99 -102 363 -198 167 -136 197 -66 567 -66 199 -236 1247 -166 2455 -68 1107 -200 235 -100 2355 -130 913 -98 877 -98 163 -196 97 -66 427 -100 801 -134 867 -98 263 -68 441 -134 561 -98 1671 -134 865 -68 935 -132 163 -102 975 -66 1343 -132 1339 -134 369 -100 1107 -66 1167 -168 631 -232 835 -66 1027 -132 333 -166 265 -98 1207 -98 223 -98 455 -64 2095 -134 933 -136 233 -68 335 -136 305 -100 1737 -66 427 -100 263 -130 323 -66 227 -66 717 -100 265 -100 65 -128 355 -66 367 -132 95 -230 229 -100 131 -64 493 -132 291 -396 393 -130 259 -196 227 -288 397 -68 229 -430 99 -302 237 -700 65 -66 65 -100 133 -200 101 -336 133 -166 237 -202 67 -302 67 -68 333 -132 263 -102 267 -296 163 -166 233 -168 363 -64 295 -298 537 -166 431 -200 431 -166 63 -258 363 -164 563 -234 199 -68 299 -100 325 -754 295 -196 65 -98 165 -132 301 -134 131 -134 97 -68 405 -68 233 -134 271 -134 67 -168 101 -136 133 -366 99 -132 67 -132 265 -200 233 -100 201 -136 101 -66 263 -132 129 -66 293 -582 263 -132 1103 -134 203 -168 97 -66 197 -264 131 -168 133 -132 65 -134 199 -134 101 -100 131 -436 99 -232 97 -398 231 -362 65 -202 301 -396 297 -98 199 -134 265 -164 101 -168 267 -102 405 -170 99 -102 397 -132 97 -98 295 -98 1179 -100 135 -136 131 -134 765 -134 465 -168 439 -232 403 -100 65 -134 931 -100 169 -136 237 -68 231 -234 199 -68 401 -134 541 -166 429 -166 1607 -368 533 -66 363 -66 133 -134 433 -166 297 -238 201 -100 201 -170 199 -134 273 -136 99 -134 167 -238 133 -66 265 -134 165 -132 165 -132 97 -228 723 -198 415 -64 491 -298 257 -66 231 -192 225 -96 227 -98 193 -96 521 -198 65 -66 231 -166 163 -98 465 -66 133 -132 195 -130 225 -162 521 -130 63 -66 199 -228 +RAW_Data: 817 -162 449 -160 719 -198 469 -68 133 -68 1101 -132 593 -230 1105 -100 131 -134 231 -66 329 -196 685 -96 557 -68 1263 -68 101 -68 397 -100 65 -66 625 -66 97 -132 1099 -66 493 -66 757 -98 1151 -66 303 -134 1901 -66 99 -100 665 -262 991 -98 791 -66 1925 -168 865 -232 835 -98 505 -102 99 -100 535 -100 169 -134 427 -132 863 -68 167 -134 975 -100 133 -268 1339 -100 1453 -66 1445 -162 195 -64 3623 -66 237 -68 1063 -308 1449 -98 1111 -132 167 -102 855 -270 199 -134 297 -134 267 -168 863 -234 637 -66 567 -230 99 -200 3325 -198 845 -66 289 -66 131 -66 815 -130 1093 -100 167 -100 429 -98 1703 -166 195 -64 971 -98 163 -192 195 -168 439 -132 329 -132 67 -134 67 -134 1591 -168 407 -100 867 -68 399 -134 661 -100 663 -66 237 -136 395 -232 131 -66 695 -100 627 -264 913 -66 1083 -98 287 -66 199 -132 335 -100 1031 -68 99 -100 3815 -98 165 -66 129 -98 163 -128 563 -98 779 -96 223 -64 161 -164 2025 -66 1741 -172 101 -136 203 -102 665 -100 475 -64 167 -100 637 -98 997 -170 1207 -136 233 -166 233 -168 635 -132 199 -100 235 -270 199 -98 131 -102 169 -170 293 -98 323 -164 427 -334 233 -168 267 -68 369 -100 263 -368 101 -66 665 -98 265 -100 133 -100 99 -168 133 -66 133 -132 133 -66 269 -134 435 -68 267 -136 271 -500 163 -100 163 -166 355 -132 97 -98 323 -194 63 -688 463 -130 97 -396 65 -100 357 -194 461 -98 161 -130 223 -162 165 -352 461 -300 267 -166 233 -464 329 -100 293 -362 163 -228 289 -66 229 -66 195 -162 325 -66 261 -98 127 -424 299 -302 367 -68 265 -272 429 -98 161 -98 393 -296 65 -130 161 -196 261 -66 473 -234 97 -98 263 -160 323 -98 67 -132 697 -298 99 -134 233 -202 97 -134 301 -200 307 -100 101 -134 865 -166 231 -202 233 -100 301 -170 169 -102 169 -200 65 -98 595 -166 231 -234 661 -66 473 -334 165 -304 365 -266 97 -502 363 -134 133 -236 65 -100 99 -134 99 -170 235 -66 333 -100 195 -100 133 -300 133 -102 301 -304 65 -100 99 -100 131 -202 135 -134 65 -200 363 -66 263 -498 67 -68 295 -194 321 -368 435 -100 97 -664 99 -100 569 -66 133 -66 67 -134 199 -136 101 -68 301 -68 405 -198 133 -132 581 -132 165 -98 159 -98 197 -66 229 -130 131 -294 133 -96 423 -100 427 -300 357 -132 291 -64 95 -194 455 -98 263 -100 359 -196 65 -162 227 -162 157 -96 157 -230 589 -132 325 -134 535 -66 267 -100 135 -302 +RAW_Data: 131 -134 599 -166 393 -98 369 -236 197 -100 401 -232 569 -134 135 -70 337 -134 101 -136 135 -100 1895 -66 401 -170 503 -66 1633 -66 601 -66 355 -96 683 -100 729 -68 133 -132 433 -68 569 -100 133 -68 201 -132 835 -100 465 -68 527 -98 193 -200 1129 -166 535 -100 199 -98 259 -132 227 -64 1597 -98 261 -192 753 -100 911 -66 667 -298 131 -100 263 -66 1051 -230 787 -66 935 -66 233 -98 885 -236 431 -66 197 -162 521 -68 167 -196 263 -96 589 -98 517 -66 1439 -64 777 -66 3219 -132 679 -134 205 -68 507 -198 749 -200 199 -168 167 -100 133 -134 201 -68 731 -66 495 -198 737 -66 237 -68 135 -100 167 -234 1535 -68 873 -66 373 -66 67 -232 297 -68 65 -66 1095 -68 327 -130 63 -132 1715 -66 2261 -100 321 -132 197 -164 457 -232 1291 -132 405 -68 1001 -68 1133 -272 471 -66 99 -134 1403 -68 167 -68 1091 -336 933 -134 1207 -132 265 -68 267 -66 99 -366 265 -66 1469 -258 367 -168 429 -132 129 -66 491 -132 343 -100 65 -100 263 -136 199 -164 273 -204 791 -100 901 -66 167 -98 165 -64 559 -132 619 -132 1087 -128 2283 -398 1467 -164 259 -130 1927 -130 421 -98 1085 -66 705 -68 1843 -168 875 -170 203 -136 341 -640 199 -66 133 -554 161 -196 63 -66 521 -292 163 -160 95 -158 127 -192 197 -100 587 -130 397 -662 261 -66 193 -130 259 -66 361 -64 459 -98 197 -560 655 -130 389 -66 1135 -100 133 -130 131 -98 1011 -100 561 -66 685 -164 457 -132 2469 -200 609 -66 665 -66 67 -132 327 -200 1657 -134 919 -132 651 -100 327 -230 191 -130 263 -358 95 -130 549 -98 99 -68 299 -100 461 -132 99 -472 165 -134 99 -66 99 -132 399 -102 169 -102 697 -166 233 -132 333 -632 197 -164 865 -266 101 -68 533 -166 299 -100 163 -228 259 -66 327 -200 65 -66 229 -100 363 -230 197 -336 165 -102 893 -300 65 -132 231 -370 265 -230 99 -98 229 -518 199 -100 401 -724 225 -98 63 -96 231 -64 291 -292 65 -98 131 -98 159 -158 127 -194 161 -292 65 -98 133 -66 297 -66 303 -168 97 -168 231 -234 269 -532 135 -168 99 -168 301 -528 99 -506 199 -368 399 -132 329 -372 99 -68 133 -264 197 -100 201 -200 67 -134 131 -270 133 -134 133 -198 327 -200 65 -100 331 -262 161 -166 469 -534 167 -738 131 -100 367 -232 101 -100 265 -604 65 -170 99 -166 299 -102 169 -132 99 -398 229 -330 197 -166 335 -366 97 -98 131 -200 269 -100 199 -168 131 -134 537 -98 265 -100 335 -236 99 -366 +RAW_Data: 459 -100 453 -130 419 -130 519 -96 63 -130 2077 -66 767 -64 127 -134 1961 -296 529 -202 637 -134 527 -100 201 -68 633 -66 163 -360 1029 -68 765 -100 867 -66 503 -100 131 -66 841 -98 165 -68 237 -66 509 -100 501 -302 235 -66 99 -164 227 -130 551 -196 327 -66 1571 -132 99 -68 867 -66 163 -96 161 -130 129 -130 549 -130 487 -166 1801 -66 229 -66 197 -232 325 -66 425 -198 131 -64 295 -166 735 -66 533 -98 227 -130 129 -262 425 -100 263 -66 129 -132 97 -168 971 -170 405 -68 199 -134 475 -202 297 -98 1445 -98 395 -196 161 -66 225 -134 1803 -100 473 -102 1499 -66 199 -100 701 -132 165 -68 133 -102 303 -98 735 -102 805 -100 827 -100 235 -100 65 -266 637 -68 693 -66 1383 -228 819 -66 233 -304 435 -198 203 -136 1135 -270 1709 -64 227 -64 581 -134 505 -66 2203 -64 293 -64 753 -66 551 -132 747 -64 1303 -64 463 -66 229 -102 1877 -266 871 -166 1357 -64 819 -66 465 -198 693 -68 165 -64 95 -128 3785 -132 1465 -100 299 -102 329 -164 595 -134 1029 -66 299 -168 1263 -166 331 -68 967 -100 101 -102 603 -260 165 -132 467 -66 233 -66 235 -102 475 -100 135 -68 301 -134 297 -98 131 -102 269 -466 99 -134 237 -166 135 -168 203 -102 265 -68 503 -66 233 -66 637 -134 101 -200 199 -166 293 -554 361 -328 367 -264 533 -238 167 -68 135 -170 99 -300 591 -298 133 -236 299 -66 231 -368 263 -232 435 -136 133 -102 133 -200 133 -134 163 -134 167 -168 299 -66 265 -100 133 -240 135 -132 263 -170 269 -200 501 -396 263 -98 227 -132 129 -292 427 -66 165 -102 627 -602 99 -66 301 -168 199 -100 563 -330 165 -134 233 -136 65 -332 499 -100 131 -232 325 -96 65 -132 195 -98 393 -624 323 -68 133 -98 195 -162 231 -100 263 -132 231 -102 133 -236 99 -236 231 -166 65 -102 133 -268 101 -102 299 -136 267 -164 493 -64 229 -258 291 -326 263 -198 391 -134 167 -202 365 -594 133 -102 201 -134 503 -396 429 -204 169 -400 197 -170 267 -132 403 -466 297 -98 469 -234 395 -132 233 -100 165 -100 165 -66 197 -68 297 -166 501 -134 133 -100 65 -166 631 -68 297 -134 199 -100 165 -68 299 -266 133 -66 165 -100 231 -490 557 -134 371 -164 299 -170 733 -164 239 -334 335 -66 299 -300 199 -170 103 -100 233 -102 641 -168 65 -100 995 -66 265 -160 259 -130 129 -226 425 -100 355 -726 97 -688 99 -66 233 -266 299 -942 167 -102 167 -166 65 -100 367 -136 99 -134 199 -134 267 -164 +RAW_Data: 67 -68 233 -66 899 -66 163 -96 485 -98 355 -130 943 -100 235 -168 499 -104 1367 -98 297 -100 635 -68 1169 -100 67 -134 835 -264 959 -164 129 -98 419 -196 589 -66 421 -66 1717 -100 133 -100 265 -134 227 -356 455 -166 163 -66 1055 -100 1455 -134 463 -98 2191 -132 295 -132 335 -66 709 -64 619 -98 959 -68 835 -170 603 -134 1033 -134 635 -168 759 -232 397 -198 397 -164 1267 -166 257 -198 1295 -100 239 -104 563 -204 335 -198 203 -68 901 -68 1255 -134 1697 -66 793 -66 1691 -68 201 -100 765 -66 165 -132 131 -230 131 -66 917 -66 335 -338 231 -170 827 -98 199 -136 301 -196 65 -98 199 -200 765 -134 403 -98 333 -68 1691 -132 2565 -64 569 -170 1255 -264 65 -132 1243 -132 2527 -66 259 -66 1739 -100 1309 -198 167 -238 337 -66 131 -68 1973 -362 299 -100 1387 -96 129 -164 423 -230 3875 -96 4283 -98 165 -98 515 -134 469 -68 171 -102 1163 -100 65 -298 461 -66 367 -136 205 -168 371 -98 491 -164 161 -262 1093 -100 299 -100 269 -334 1205 -98 63 -98 261 -64 457 -98 diff --git a/debug/flipperapps.py b/debug/flipperapps.py index c8d3fcdb9..8e1aa2daf 100644 --- a/debug/flipperapps.py +++ b/debug/flipperapps.py @@ -64,7 +64,7 @@ class AppState: def is_loaded_in_gdb(self, gdb_app) -> bool: # Avoid constructing full app wrapper for comparison - return self.entry_address == int(gdb_app["entry"]) + return self.entry_address == int(gdb_app["state"]["entry"]) @staticmethod def parse_debug_link_data(section_data: bytes) -> Tuple[str, int]: @@ -78,13 +78,13 @@ class AppState: @staticmethod def from_gdb(gdb_app: "AppState") -> "AppState": state = AppState(str(gdb_app["manifest"]["name"].string())) - state.entry_address = int(gdb_app["entry"]) + state.entry_address = int(gdb_app["state"]["entry"]) app_state = gdb_app["state"] - if debug_link_size := int(app_state["debug_link_size"]): + if debug_link_size := int(app_state["debug_link_info"]["debug_link_size"]): debug_link_data = ( gdb.selected_inferior() - .read_memory(int(app_state["debug_link"]), debug_link_size) + .read_memory(int(app_state["debug_link_info"]["debug_link"]), debug_link_size) .tobytes() ) state.debug_link_elf, state.debug_link_crc = AppState.parse_debug_link_data( diff --git a/debug/stm32wbx.cfg b/debug/stm32wbx.cfg index f100c3ccd..ba383831b 100644 --- a/debug/stm32wbx.cfg +++ b/debug/stm32wbx.cfg @@ -101,3 +101,7 @@ $_TARGETNAME configure -event trace-config { # assignment mmw 0xE0042004 0x00000020 0 } + +$_TARGETNAME configure -event gdb-detach { + resume +} \ No newline at end of file diff --git a/documentation/AppManifests.md b/documentation/AppManifests.md index 5e7ceb939..7bc8d0a47 100644 --- a/documentation/AppManifests.md +++ b/documentation/AppManifests.md @@ -1,16 +1,16 @@ # Flipper Application Manifests (.fam) -All components of Flipper Zero firmware — services, user applications, system settings — are developed independently. Each component has a build system manifest file, named `application.fam`, defining basic properties of a components and its relations to other parts of the system. +All components of Flipper Zero firmware — services, user applications, system settings — are developed independently. Each component has a build system manifest file, named `application.fam`, which defines basic properties of that component and its relations to other parts of the system. -When building firmware, **`fbt`** collects all application manifests, processes their dependencies and builds only those components that are utilized in current build configuration. See [fbt docs](./fbt.md#firmware-application-set) for details on build configurations. +When building firmware, **`fbt`** collects all application manifests and processes their dependencies. Then it builds only those components that are referenced in the current build configuration. See [fbt docs](./fbt.md#firmware-application-set) for details on build configurations. ## Application definition Properties of a firmware component are declared in a form of a Python code snippet, forming a call to App() function with various parameters. -Only 2 parameters are mandatoty: ***appid*** and ***apptype***, others are optional and may be meaningful only for certain application types. +Only 2 parameters are mandatory: ***appid*** and ***apptype***, others are optional and may only be meaningful for certain application types. -### Keys +### Parameters * **appid**: string, application id within the build system. Used for specifying which applications to include in build configuration and to resolve dependencies and conflicts. @@ -21,7 +21,7 @@ Only 2 parameters are mandatoty: ***appid*** and ***apptype***, others are optio | SERVICE | System service, created at early startup | | SYSTEM | Application not being shown in any menus. Can be started by other apps or from CLI | | APP | Regular application for main menu | -| PLUGIN | Application to be built as .fap plugin | +| PLUGIN | Application to be built as a part of firmware an to be placed in Plugins menu | | DEBUG | Application only visible in Debug menu with debug mode enabled | | ARCHIVE | One and only Archive app | | SETTINGS | Application to be placed in System settings menu | @@ -29,25 +29,28 @@ Only 2 parameters are mandatoty: ***appid*** and ***apptype***, others are optio | EXTERNAL | Application to be built as .fap plugin | | METAPACKAGE | Does not define any code to be run, used for declaring dependencies and application bundles | -* **name**: Name to show in menus. -* **entry_point**: C function to be used as applicaiton's entry point. +* **name**: Name that is displayed in menus. +* **entry_point**: C function to be used as application's entry point. * **flags**: Internal flags for system apps. Do not use. * **cdefines**: C preprocessor definitions to declare globally for other apps when current application is included in active build configuration. * **requires**: List of application IDs to also include in build configuration, when current application is referenced in list of applications to build. * **conflicts**: List of application IDs that current application conflicts with. If any of them is found in constructed application list, **`fbt`** will abort firmware build process. * **provides**: Functionally identical to ***requires*** field. -* **stack_size**: Stack size, in bytes, to allocate for application on its startup. Note that allocating a stack too small for app to run will cause system crash due to stack overflow, and allocating too much stack will reduce usable heap memory size for app to process data. *Note: you can use `ps` and `free` CLI commands to profile you app's memory usage.* +* **stack_size**: Stack size, in bytes, to allocate for application on its startup. Note that allocating a stack that is too small for an app to run will cause system crash due to stack overflow, and allocating too much stack space will reduce usable heap memory size for apps to process data. *Note: you can use `ps` and `free` CLI commands to profile your app's memory usage.* * **icon**: Animated icon name from built-in assets to be used when building app as a part of firmware. -* **order**: Order of an application within its group when sorting entries in it. The lower the order is, the closer to the start of the list the items is located. Used for ordering startup hooks and menu entries. -* **sdk_headers**: List of C header files from this app's code to include in API definitions for external applicaions. +* **order**: Order of an application within its group when sorting entries in it. The lower the order is, the closer to the start of the list the item is placed. *Used for ordering startup hooks and menu entries.* +* **sdk_headers**: List of C header files from this app's code to include in API definitions for external applications. The following parameters are used only for [FAPs](./AppsOnSDCard.md): * **sources**: list of file name masks, used for gathering sources within app folder. Default value of ["\*.c\*"] includes C and CPP source files. -* **version**: string, 2 numbers in form of "x.y": application version to be embedded within .fap file. -* **fap_icon**: name of .png file, 1-bit color depth, 10x10px, to be embedded within .fap file. +* **fap_version**: string, 2 numbers in form of "x.y": application version to be embedded within .fap file. +* **fap_icon**: name of a .png file, 1-bit color depth, 10x10px, to be embedded within .fap file. * **fap_libs**: list of extra libraries to link application against. Provides access to extra functions that are not exported as a part of main firmware at expense of increased .fap file size and RAM consumption. * **fap_category**: string, may be empty. App subcategory, also works as path of FAP within apps folder in the file system. +* **fap_description**: string, may be empty. Short application descriotion. +* **fap_author**: string, may be empty. Application's author. +* **fap_weburl**: string, may be empty. Application's homepage. ## .fam file contents @@ -76,4 +79,4 @@ App( ) ``` -For more examples, see application.fam files for basic firmware components. \ No newline at end of file +For more examples, see .fam files from various firmware parts. diff --git a/documentation/HowToInstall.md b/documentation/HowToInstall.md index 730e9e269..718b0f717 100644 --- a/documentation/HowToInstall.md +++ b/documentation/HowToInstall.md @@ -22,7 +22,8 @@ after that on web updater page - press `Connect` button - And wait, if all flashed successfully - you will have all needed assets pre installed - Done -![web_install](https://user-images.githubusercontent.com/10697207/190832212-d27597b5-cf11-4f2e-9b1f-7104710905ee.gif) +![web_instr](https://user-images.githubusercontent.com/10697207/190942577-9d137e01-468b-4c74-8587-c2a17c3c7534.jpg) +

@@ -39,6 +40,26 @@ after that on web updater page - press `Connect` button - And if all flashed successfully - you will have all needed assets pre installed - Done +![ios](https://user-images.githubusercontent.com/10697207/192114863-75693972-31fb-4b5f-bcc4-4122abb352c2.jpg) + +
+
+ +## With qFlipper (1.2.0) + +- Download qFlipper that allows `.tgz` installation [Download qFlipper 1.2.0 (official link)](https://update.flipperzero.one/builds/qFlipper/1.2.0/) +- Be sure you updated to latest official release before(only if installing for the first time), and verify that microSD card is installed +- Open latest release page - [Releases](https://github.com/Eng1n33r/flipperzero-firmware/releases/latest) +- Download `flipper-z-f7-update-(version).tgz` +- Launch qFlipper +- Connect your device and select `Install from file` +- Select `flipper-z-f7-update-(version).tgz` that you downloaded +- Update will start +- And wait, if all flashed successfully - you will have all needed assets pre installed +- Done + +![qflip](https://user-images.githubusercontent.com/10697207/192114874-4edae5f5-6bff-4674-8e3b-030ceaf17abc.png) +

@@ -56,8 +77,7 @@ after that on web updater page - press `Connect` button - Update will start, wait for all stages - Done -![manual_install](https://user-images.githubusercontent.com/10697207/190832689-8fb50d97-2820-4501-b8b7-d8e87a235d45.gif) - +![manual](https://user-images.githubusercontent.com/10697207/192114890-b9220265-1fe3-4837-8e98-ed267282e11e.png)

diff --git a/documentation/fbt.md b/documentation/fbt.md index 3eee6baaa..090ff78f0 100644 --- a/documentation/fbt.md +++ b/documentation/fbt.md @@ -49,7 +49,7 @@ To run cleanup (think of `make clean`) for specified targets, add `-c` option. - `flash` - flash attached device with OpenOCD over ST-Link - `flash_usb`, `flash_usb_full` - build, upload and install update package to device over USB. See details on `updater_package`, `updater_minpackage` - `debug` - build and flash firmware, then attach with gdb with firmware's .elf loaded -- `debug_other` - attach gdb without loading any .elf. Allows to manually add external elf files with `add-symbol-file` in gdb +- `debug_other`, `debug_other_blackmagic` - attach gdb without loading any .elf. Allows to manually add external elf files with `add-symbol-file` in gdb - `updater_debug` - attach gdb with updater's .elf loaded - `blackmagic` - debug firmware with Blackmagic probe (WiFi dev board) - `openocd` - just start OpenOCD diff --git a/fbt_options.py b/fbt_options.py index b0d0ebea5..eb9c8cff7 100644 --- a/fbt_options.py +++ b/fbt_options.py @@ -73,7 +73,8 @@ FIRMWARE_APPS = { "system_apps", # Settings "settings_apps", - # Plugins + # Stock plugins - no longer built into fw, now they're .faps + # Yet you can still build them as a part of fw # "basic_plugins", # Debug # "debug_apps", @@ -82,7 +83,7 @@ FIRMWARE_APPS = { # Svc "basic_services", # Apps - "main_apps", + "main_apps_default", "system_apps", # Settings "settings_apps", diff --git a/firmware.scons b/firmware.scons index 962c70725..530634ef2 100644 --- a/firmware.scons +++ b/firmware.scons @@ -302,7 +302,7 @@ if fwenv["IS_BASE_FIRMWARE"]: "-D__inline__=inline", ], ) - Depends(sdk_source, fwenv["SDK_HEADERS"]) + Depends(sdk_source, (fwenv["SDK_HEADERS"], fwenv["FW_ASSETS_HEADERS"])) sdk_tree = fwenv.SDKTree("sdk/sdk.opts", "sdk_origin") AlwaysBuild(sdk_tree) diff --git a/firmware/targets/f7/Inc/FreeRTOSConfig.h b/firmware/targets/f7/Inc/FreeRTOSConfig.h index ab2dc14ef..69ef9406b 100644 --- a/firmware/targets/f7/Inc/FreeRTOSConfig.h +++ b/firmware/targets/f7/Inc/FreeRTOSConfig.h @@ -76,19 +76,8 @@ to exclude the API function. */ #define INCLUDE_xTaskGetSchedulerState 1 #define INCLUDE_xTimerPendFunctionCall 1 -/* CMSIS-RTOS V2 flags */ -#define configUSE_OS2_THREAD_SUSPEND_RESUME 1 -#define configUSE_OS2_THREAD_ENUMERATE 1 -#define configUSE_OS2_THREAD_FLAGS 1 -#define configUSE_OS2_TIMER 1 -#define configUSE_OS2_MUTEX 1 - -// NEVER TO BE USED, because of their hard realtime nature -// #define configUSE_OS2_EVENTFLAGS_FROM_ISR 1 - -/* CMSIS-RTOS */ +/* Furi-specific */ #define configTASK_NOTIFICATION_ARRAY_ENTRIES 2 -#define CMSIS_TASK_NOTIFY_INDEX 1 extern __attribute__((__noreturn__)) void furi_thread_catch(); #define configTASK_RETURN_ADDRESS (furi_thread_catch + 2) diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index e6041f744..3c5195deb 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -163,29 +163,29 @@ Function,-,LL_ADC_REG_Init,ErrorStatus,"ADC_TypeDef*, LL_ADC_REG_InitTypeDef*" Function,-,LL_ADC_REG_StructInit,void,LL_ADC_REG_InitTypeDef* Function,-,LL_ADC_StructInit,void,LL_ADC_InitTypeDef* Function,-,LL_COMP_DeInit,ErrorStatus,COMP_TypeDef* -Function,-,LL_COMP_Init,ErrorStatus,"COMP_TypeDef*, LL_COMP_InitTypeDef*" +Function,+,LL_COMP_Init,ErrorStatus,"COMP_TypeDef*, LL_COMP_InitTypeDef*" Function,-,LL_COMP_StructInit,void,LL_COMP_InitTypeDef* Function,-,LL_CRC_DeInit,ErrorStatus,CRC_TypeDef* Function,-,LL_CRS_DeInit,ErrorStatus, -Function,-,LL_DMA_DeInit,ErrorStatus,"DMA_TypeDef*, uint32_t" -Function,-,LL_DMA_Init,ErrorStatus,"DMA_TypeDef*, uint32_t, LL_DMA_InitTypeDef*" +Function,+,LL_DMA_DeInit,ErrorStatus,"DMA_TypeDef*, uint32_t" +Function,+,LL_DMA_Init,ErrorStatus,"DMA_TypeDef*, uint32_t, LL_DMA_InitTypeDef*" Function,-,LL_DMA_StructInit,void,LL_DMA_InitTypeDef* Function,-,LL_EXTI_DeInit,ErrorStatus, Function,-,LL_EXTI_Init,ErrorStatus,LL_EXTI_InitTypeDef* Function,-,LL_EXTI_StructInit,void,LL_EXTI_InitTypeDef* Function,-,LL_GPIO_DeInit,ErrorStatus,GPIO_TypeDef* -Function,-,LL_GPIO_Init,ErrorStatus,"GPIO_TypeDef*, LL_GPIO_InitTypeDef*" +Function,+,LL_GPIO_Init,ErrorStatus,"GPIO_TypeDef*, LL_GPIO_InitTypeDef*" Function,-,LL_GPIO_StructInit,void,LL_GPIO_InitTypeDef* Function,-,LL_I2C_DeInit,ErrorStatus,I2C_TypeDef* -Function,-,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, LL_I2C_InitTypeDef*" +Function,+,LL_I2C_Init,ErrorStatus,"I2C_TypeDef*, LL_I2C_InitTypeDef*" Function,-,LL_I2C_StructInit,void,LL_I2C_InitTypeDef* Function,-,LL_Init1msTick,void,uint32_t -Function,-,LL_LPTIM_DeInit,ErrorStatus,LPTIM_TypeDef* +Function,+,LL_LPTIM_DeInit,ErrorStatus,LPTIM_TypeDef* Function,-,LL_LPTIM_Disable,void,LPTIM_TypeDef* -Function,-,LL_LPTIM_Init,ErrorStatus,"LPTIM_TypeDef*, LL_LPTIM_InitTypeDef*" +Function,+,LL_LPTIM_Init,ErrorStatus,"LPTIM_TypeDef*, LL_LPTIM_InitTypeDef*" Function,-,LL_LPTIM_StructInit,void,LL_LPTIM_InitTypeDef* Function,-,LL_LPUART_DeInit,ErrorStatus,USART_TypeDef* -Function,-,LL_LPUART_Init,ErrorStatus,"USART_TypeDef*, LL_LPUART_InitTypeDef*" +Function,+,LL_LPUART_Init,ErrorStatus,"USART_TypeDef*, LL_LPUART_InitTypeDef*" Function,-,LL_LPUART_StructInit,void,LL_LPUART_InitTypeDef* Function,-,LL_PKA_DeInit,ErrorStatus,PKA_TypeDef* Function,-,LL_PKA_Init,ErrorStatus,"PKA_TypeDef*, LL_PKA_InitTypeDef*" @@ -199,14 +199,14 @@ Function,-,LL_RCC_GetADCClockFreq,uint32_t,uint32_t Function,-,LL_RCC_GetCLK48ClockFreq,uint32_t,uint32_t Function,-,LL_RCC_GetI2CClockFreq,uint32_t,uint32_t Function,-,LL_RCC_GetLPTIMClockFreq,uint32_t,uint32_t -Function,-,LL_RCC_GetLPUARTClockFreq,uint32_t,uint32_t +Function,+,LL_RCC_GetLPUARTClockFreq,uint32_t,uint32_t Function,-,LL_RCC_GetRFWKPClockFreq,uint32_t, Function,-,LL_RCC_GetRNGClockFreq,uint32_t,uint32_t Function,-,LL_RCC_GetRTCClockFreq,uint32_t, Function,-,LL_RCC_GetSAIClockFreq,uint32_t,uint32_t Function,-,LL_RCC_GetSMPSClockFreq,uint32_t, Function,-,LL_RCC_GetSystemClocksFreq,void,LL_RCC_ClocksTypeDef* -Function,-,LL_RCC_GetUSARTClockFreq,uint32_t,uint32_t +Function,+,LL_RCC_GetUSARTClockFreq,uint32_t,uint32_t Function,-,LL_RCC_GetUSBClockFreq,uint32_t,uint32_t Function,-,LL_RNG_DeInit,ErrorStatus,RNG_TypeDef* Function,-,LL_RNG_Init,ErrorStatus,"RNG_TypeDef*, LL_RNG_InitTypeDef*" @@ -218,21 +218,21 @@ Function,-,LL_RTC_ALMB_StructInit,void,LL_RTC_AlarmTypeDef* Function,-,LL_RTC_DATE_Init,ErrorStatus,"RTC_TypeDef*, uint32_t, LL_RTC_DateTypeDef*" Function,-,LL_RTC_DATE_StructInit,void,LL_RTC_DateTypeDef* Function,-,LL_RTC_DeInit,ErrorStatus,RTC_TypeDef* -Function,-,LL_RTC_EnterInitMode,ErrorStatus,RTC_TypeDef* +Function,+,LL_RTC_EnterInitMode,ErrorStatus,RTC_TypeDef* Function,-,LL_RTC_ExitInitMode,ErrorStatus,RTC_TypeDef* -Function,-,LL_RTC_Init,ErrorStatus,"RTC_TypeDef*, LL_RTC_InitTypeDef*" +Function,+,LL_RTC_Init,ErrorStatus,"RTC_TypeDef*, LL_RTC_InitTypeDef*" Function,-,LL_RTC_StructInit,void,LL_RTC_InitTypeDef* Function,-,LL_RTC_TIME_Init,ErrorStatus,"RTC_TypeDef*, uint32_t, LL_RTC_TimeTypeDef*" Function,-,LL_RTC_TIME_StructInit,void,LL_RTC_TimeTypeDef* Function,-,LL_RTC_WaitForSynchro,ErrorStatus,RTC_TypeDef* Function,-,LL_SPI_DeInit,ErrorStatus,SPI_TypeDef* -Function,-,LL_SPI_Init,ErrorStatus,"SPI_TypeDef*, LL_SPI_InitTypeDef*" +Function,+,LL_SPI_Init,ErrorStatus,"SPI_TypeDef*, LL_SPI_InitTypeDef*" Function,-,LL_SPI_StructInit,void,LL_SPI_InitTypeDef* Function,-,LL_SetFlashLatency,ErrorStatus,uint32_t -Function,-,LL_SetSystemCoreClock,void,uint32_t +Function,+,LL_SetSystemCoreClock,void,uint32_t Function,-,LL_TIM_BDTR_Init,ErrorStatus,"TIM_TypeDef*, LL_TIM_BDTR_InitTypeDef*" Function,-,LL_TIM_BDTR_StructInit,void,LL_TIM_BDTR_InitTypeDef* -Function,-,LL_TIM_DeInit,ErrorStatus,TIM_TypeDef* +Function,+,LL_TIM_DeInit,ErrorStatus,TIM_TypeDef* Function,-,LL_TIM_ENCODER_Init,ErrorStatus,"TIM_TypeDef*, LL_TIM_ENCODER_InitTypeDef*" Function,-,LL_TIM_ENCODER_StructInit,void,LL_TIM_ENCODER_InitTypeDef* Function,-,LL_TIM_HALLSENSOR_Init,ErrorStatus,"TIM_TypeDef*, LL_TIM_HALLSENSOR_InitTypeDef*" @@ -246,7 +246,7 @@ Function,-,LL_TIM_StructInit,void,LL_TIM_InitTypeDef* Function,-,LL_USART_ClockInit,ErrorStatus,"USART_TypeDef*, LL_USART_ClockInitTypeDef*" Function,-,LL_USART_ClockStructInit,void,LL_USART_ClockInitTypeDef* Function,-,LL_USART_DeInit,ErrorStatus,USART_TypeDef* -Function,-,LL_USART_Init,ErrorStatus,"USART_TypeDef*, LL_USART_InitTypeDef*" +Function,+,LL_USART_Init,ErrorStatus,"USART_TypeDef*, LL_USART_InitTypeDef*" Function,-,LL_USART_StructInit,void,LL_USART_InitTypeDef* Function,-,LL_mDelay,void,uint32_t Function,-,SystemCoreClockUpdate,void, @@ -799,13 +799,13 @@ Function,-,fiprintf,int,"FILE*, const char*, ..." Function,-,fiscanf,int,"FILE*, const char*, ..." Function,+,flipper_application_alloc,FlipperApplication*,"Storage*, const ElfApiInterface*" Function,+,flipper_application_free,void,FlipperApplication* -Function,-,flipper_application_get_entry_address,const void*,FlipperApplication* Function,+,flipper_application_get_manifest,const FlipperApplicationManifest*,FlipperApplication* -Function,-,flipper_application_get_state,const FlipperApplicationState*,FlipperApplication* -Function,-,flipper_application_get_thread,FuriThread*,FlipperApplication* Function,+,flipper_application_load_status_to_string,const char*,FlipperApplicationLoadStatus +Function,+,flipper_application_manifest_is_compatible,_Bool,"const FlipperApplicationManifest*, const ElfApiInterface*" +Function,+,flipper_application_manifest_is_valid,_Bool,const FlipperApplicationManifest* Function,+,flipper_application_map_to_memory,FlipperApplicationLoadStatus,FlipperApplication* Function,+,flipper_application_preload,FlipperApplicationPreloadStatus,"FlipperApplication*, const char*" +Function,+,flipper_application_preload_manifest,FlipperApplicationPreloadStatus,"FlipperApplication*, const char*" Function,-,flipper_application_preload_status_to_string,const char*,FlipperApplicationPreloadStatus Function,+,flipper_application_spawn,FuriThread*,"FlipperApplication*, void*" Function,+,flipper_format_buffered_file_alloc,FlipperFormat*,Storage* @@ -1116,6 +1116,7 @@ Function,+,furi_hal_nfc_field_off,void, Function,+,furi_hal_nfc_field_on,void, Function,-,furi_hal_nfc_init,void, Function,+,furi_hal_nfc_is_busy,_Bool, +Function,+,furi_hal_nfc_is_init,_Bool, Function,+,furi_hal_nfc_listen,_Bool,"uint8_t*, uint8_t, uint8_t*, uint8_t, _Bool, uint32_t" Function,+,furi_hal_nfc_listen_rx,_Bool,"FuriHalNfcTxRxContext*, uint32_t" Function,+,furi_hal_nfc_listen_sleep,void, @@ -1368,8 +1369,10 @@ Function,+,furi_thread_get_name,const char*,FuriThreadId Function,+,furi_thread_get_return_code,int32_t,FuriThread* Function,+,furi_thread_get_stack_space,uint32_t,FuriThreadId Function,+,furi_thread_get_state,FuriThreadState,FuriThread* +Function,+,furi_thread_is_suspended,_Bool,FuriThreadId Function,+,furi_thread_join,_Bool,FuriThread* Function,+,furi_thread_mark_as_service,void,FuriThread* +Function,+,furi_thread_resume,void,FuriThreadId Function,+,furi_thread_set_callback,void,"FuriThread*, FuriThreadCallback" Function,+,furi_thread_set_context,void,"FuriThread*, void*" Function,+,furi_thread_set_name,void,"FuriThread*, const char*" @@ -1381,6 +1384,7 @@ Function,+,furi_thread_set_stdout_callback,_Bool,FuriThreadStdoutWriteCallback Function,+,furi_thread_start,void,FuriThread* Function,+,furi_thread_stdout_flush,int32_t, Function,+,furi_thread_stdout_write,size_t,"const char*, size_t" +Function,+,furi_thread_suspend,void,FuriThreadId Function,+,furi_thread_yield,void, Function,+,furi_timer_alloc,FuriTimer*,"FuriTimerCallback, FuriTimerType, void*" Function,+,furi_timer_free,void,FuriTimer* @@ -4090,7 +4094,6 @@ Variable,+,A_NFC_14,const Icon, Variable,+,A_Plugins_14,const Icon, Variable,+,A_Round_loader_8x8,const Icon, Variable,+,A_Settings_14,const Icon, -Variable,+,A_SpectrumAnalyzer_14,const Icon, Variable,+,A_Sub1ghz_14,const Icon, Variable,+,A_U2F_14,const Icon, Variable,+,A_UniRFRemix_14,const Icon, @@ -4098,6 +4101,7 @@ Variable,+,A_iButton_14,const Icon, Variable,-,ITM_RxBuffer,volatile int32_t, Variable,+,I_125_10px,const Icon, Variable,+,I_ActiveConnection_50x64,const Icon, +Variable,+,I_Apps_10px,const Icon, Variable,+,I_ArrowC_1_36x36,const Icon, Variable,+,I_ArrowDownEmpty_14x15,const Icon, Variable,+,I_ArrowDownFilled_14x15,const Icon, @@ -4162,7 +4166,7 @@ Variable,+,I_KeyBackspaceSelected_16x9,const Icon, Variable,+,I_KeyBackspace_16x9,const Icon, Variable,+,I_KeySaveSelected_24x11,const Icon, Variable,+,I_KeySave_24x11,const Icon, -Variable,+,I_Keychain,const Icon, +Variable,+,I_Keychain_39x36,const Icon, Variable,+,I_Left_mouse_icon_9x9,const Icon, Variable,+,I_Lock_7x8,const Icon, Variable,+,I_Lock_8x8,const Icon, @@ -4172,7 +4176,7 @@ Variable,+,I_Mode_25x27,const Icon, Variable,+,I_Mode_hvr_25x27,const Icon, Variable,+,I_Mute_25x27,const Icon, Variable,+,I_Mute_hvr_25x27,const Icon, -Variable,+,I_NFC_manual,const Icon, +Variable,+,I_NFC_manual_60x50,const Icon, Variable,+,I_Nfc_10px,const Icon, Variable,+,I_Ok_btn_9x9,const Icon, Variable,+,I_Ok_btn_pressed_13x13,const Icon, @@ -4180,7 +4184,7 @@ Variable,+,I_Percent_10x14,const Icon, Variable,+,I_Pin_arrow_down_7x9,const Icon, Variable,+,I_Pin_arrow_left_9x7,const Icon, Variable,+,I_Pin_arrow_right_9x7,const Icon, -Variable,+,I_Pin_arrow_up7x9,const Icon, +Variable,+,I_Pin_arrow_up_7x9,const Icon, Variable,+,I_Pin_attention_dpad_29x29,const Icon, Variable,+,I_Pin_back_arrow_10x8,const Icon, Variable,+,I_Pin_back_full_40x8,const Icon, @@ -4195,7 +4199,7 @@ Variable,+,I_RFIDDolphinReceive_97x61,const Icon, Variable,+,I_RFIDDolphinSend_97x61,const Icon, Variable,+,I_RFIDDolphinSuccess_108x57,const Icon, Variable,+,I_RFIDSmallChip_14x14,const Icon, -Variable,+,I_Restoring,const Icon, +Variable,+,I_Restoring_38x32,const Icon, Variable,+,I_Right_mouse_icon_9x9,const Icon, Variable,+,I_Rotate_25x27,const Icon, Variable,+,I_Rotate_hvr_25x27,const Icon, @@ -4591,6 +4595,7 @@ Variable,-,subghz_protocol_nice_flo_encoder,const SubGhzProtocolEncoder, Variable,-,subghz_protocol_nice_flor_s,const SubGhzProtocol, Variable,-,subghz_protocol_nice_flor_s_decoder,const SubGhzProtocolDecoder, Variable,-,subghz_protocol_nice_flor_s_encoder,const SubGhzProtocolEncoder, +Variable,-,subghz_protocol_oregon2,const SubGhzProtocol, Variable,-,subghz_protocol_phoenix_v2,const SubGhzProtocol, Variable,-,subghz_protocol_phoenix_v2_decoder,const SubGhzProtocolDecoder, Variable,-,subghz_protocol_phoenix_v2_encoder,const SubGhzProtocolEncoder, diff --git a/firmware/targets/f7/furi_hal/furi_hal_nfc.c b/firmware/targets/f7/furi_hal/furi_hal_nfc.c index 1a5afa1ec..de67bbc35 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_nfc.c +++ b/firmware/targets/f7/furi_hal/furi_hal_nfc.c @@ -39,6 +39,10 @@ bool furi_hal_nfc_is_busy() { return rfalNfcGetState() != RFAL_NFC_STATE_IDLE; } +bool furi_hal_nfc_is_init() { + return rfalNfcGetState() != RFAL_NFC_STATE_NOTINIT; +} + void furi_hal_nfc_field_on() { furi_hal_nfc_exit_sleep(); st25r3916TxRxOn(); diff --git a/firmware/targets/furi_hal_include/furi_hal_nfc.h b/firmware/targets/furi_hal_include/furi_hal_nfc.h index aa1c61d9c..537e0abf0 100644 --- a/firmware/targets/furi_hal_include/furi_hal_nfc.h +++ b/firmware/targets/furi_hal_include/furi_hal_nfc.h @@ -107,6 +107,12 @@ void furi_hal_nfc_init(); */ bool furi_hal_nfc_is_busy(); +/** Check if nfc is initialized + * + * @return true if initialized + */ + bool furi_hal_nfc_is_init(); + /** NFC field on */ void furi_hal_nfc_field_on(); diff --git a/furi/core/record.c b/furi/core/record.c index 666d50761..63dfdbe47 100644 --- a/furi/core/record.c +++ b/furi/core/record.c @@ -6,6 +6,7 @@ #include #include +#include #define FURI_RECORD_FLAG_READY (0x1) @@ -15,7 +16,7 @@ typedef struct { size_t holders_count; } FuriRecordData; -DICT_DEF2(FuriRecordDataDict, string_t, STRING_OPLIST, FuriRecordData, M_POD_OPLIST) +DICT_DEF2(FuriRecordDataDict, const char*, M_CSTR_DUP_OPLIST, FuriRecordData, M_POD_OPLIST) typedef struct { FuriMutex* mutex; @@ -24,6 +25,19 @@ typedef struct { static FuriRecord* furi_record = NULL; +static FuriRecordData* furi_record_get(const char* name) { + return FuriRecordDataDict_get(furi_record->records, name); +} + +static void furi_record_put(const char* name, FuriRecordData* record_data) { + FuriRecordDataDict_set_at(furi_record->records, name, *record_data); +} + +static void furi_record_erase(const char* name, FuriRecordData* record_data) { + furi_event_flag_free(record_data->flags); + FuriRecordDataDict_erase(furi_record->records, name); +} + void furi_record_init() { furi_record = malloc(sizeof(FuriRecord)); furi_record->mutex = furi_mutex_alloc(FuriMutexTypeNormal); @@ -31,16 +45,16 @@ void furi_record_init() { FuriRecordDataDict_init(furi_record->records); } -static FuriRecordData* furi_record_data_get_or_create(string_t name_str) { +static FuriRecordData* furi_record_data_get_or_create(const char* name) { furi_assert(furi_record); - FuriRecordData* record_data = FuriRecordDataDict_get(furi_record->records, name_str); + FuriRecordData* record_data = furi_record_get(name); if(!record_data) { FuriRecordData new_record; new_record.flags = furi_event_flag_alloc(); new_record.data = NULL; new_record.holders_count = 0; - FuriRecordDataDict_set_at(furi_record->records, name_str, new_record); - record_data = FuriRecordDataDict_get(furi_record->records, name_str); + furi_record_put(name, &new_record); + record_data = furi_record_get(name); } return record_data; } @@ -59,35 +73,25 @@ bool furi_record_exists(const char* name) { bool ret = false; - string_t name_str; - string_init_set_str(name_str, name); - furi_record_lock(); - ret = (FuriRecordDataDict_get(furi_record->records, name_str) != NULL); + ret = (furi_record_get(name) != NULL); furi_record_unlock(); - string_clear(name_str); - return ret; } void furi_record_create(const char* name, void* data) { furi_assert(furi_record); - string_t name_str; - string_init_set_str(name_str, name); - furi_record_lock(); // Get record data and fill it - FuriRecordData* record_data = furi_record_data_get_or_create(name_str); + FuriRecordData* record_data = furi_record_data_get_or_create(name); furi_assert(record_data->data == NULL); record_data->data = data; furi_event_flag_set(record_data->flags, FURI_RECORD_FLAG_READY); furi_record_unlock(); - - string_clear(name_str); } bool furi_record_destroy(const char* name) { @@ -95,35 +99,26 @@ bool furi_record_destroy(const char* name) { bool ret = false; - string_t name_str; - string_init_set_str(name_str, name); - furi_record_lock(); - FuriRecordData* record_data = FuriRecordDataDict_get(furi_record->records, name_str); + FuriRecordData* record_data = furi_record_get(name); furi_assert(record_data); if(record_data->holders_count == 0) { - furi_event_flag_free(record_data->flags); - FuriRecordDataDict_erase(furi_record->records, name_str); + furi_record_erase(name, record_data); ret = true; } furi_record_unlock(); - string_clear(name_str); - return ret; } void* furi_record_open(const char* name) { furi_assert(furi_record); - string_t name_str; - string_init_set_str(name_str, name); - furi_record_lock(); - FuriRecordData* record_data = furi_record_data_get_or_create(name_str); + FuriRecordData* record_data = furi_record_data_get_or_create(name); record_data->holders_count++; furi_record_unlock(); @@ -136,24 +131,17 @@ void* furi_record_open(const char* name) { FuriFlagWaitAny | FuriFlagNoClear, FuriWaitForever) == FURI_RECORD_FLAG_READY); - string_clear(name_str); - return record_data->data; } void furi_record_close(const char* name) { furi_assert(furi_record); - string_t name_str; - string_init_set_str(name_str, name); - furi_record_lock(); - FuriRecordData* record_data = FuriRecordDataDict_get(furi_record->records, name_str); + FuriRecordData* record_data = furi_record_get(name); furi_assert(record_data); record_data->holders_count--; furi_record_unlock(); - - string_clear(name_str); } diff --git a/furi/core/thread.c b/furi/core/thread.c index a68472b56..58cb9bc09 100644 --- a/furi/core/thread.c +++ b/furi/core/thread.c @@ -89,7 +89,9 @@ static void furi_thread_body(void* context) { if(thread->is_service) { FURI_LOG_E( - "Service", "%s thread exited. Thread memory cannot be reclaimed.", thread->name); + "Service", + "%s thread exited. Thread memory cannot be reclaimed.", + thread->name ? thread->name : ""); } // clear thread local storage @@ -515,4 +517,23 @@ size_t furi_thread_stdout_write(const char* data, size_t size) { int32_t furi_thread_stdout_flush() { return __furi_thread_stdout_flush(furi_thread_get_current()); -} \ No newline at end of file +} + +void furi_thread_suspend(FuriThreadId thread_id) { + TaskHandle_t hTask = (TaskHandle_t)thread_id; + vTaskSuspend(hTask); +} + +void furi_thread_resume(FuriThreadId thread_id) { + TaskHandle_t hTask = (TaskHandle_t)thread_id; + if(FURI_IS_IRQ_MODE()) { + xTaskResumeFromISR(hTask); + } else { + vTaskResume(hTask); + } +} + +bool furi_thread_is_suspended(FuriThreadId thread_id) { + TaskHandle_t hTask = (TaskHandle_t)thread_id; + return eTaskGetState(hTask) == eSuspended; +} diff --git a/furi/core/thread.h b/furi/core/thread.h index f15b9ff66..fda81bb3a 100644 --- a/furi/core/thread.h +++ b/furi/core/thread.h @@ -236,6 +236,25 @@ size_t furi_thread_stdout_write(const char* data, size_t size); */ int32_t furi_thread_stdout_flush(); +/** Suspend thread + * + * @param thread_id thread id + */ +void furi_thread_suspend(FuriThreadId thread_id); + +/** Resume thread + * + * @param thread_id thread id + */ +void furi_thread_resume(FuriThreadId thread_id); + +/** Get thread suspended state + * + * @param thread_id thread id + * @return true if thread is suspended + */ +bool furi_thread_is_suspended(FuriThreadId thread_id); + #ifdef __cplusplus } #endif diff --git a/lib/flipper_application/application_manifest.c b/lib/flipper_application/application_manifest.c new file mode 100644 index 000000000..ab92e4930 --- /dev/null +++ b/lib/flipper_application/application_manifest.c @@ -0,0 +1,21 @@ +#include "application_manifest.h" + +bool flipper_application_manifest_is_valid(const FlipperApplicationManifest* manifest) { + if((manifest->base.manifest_magic != FAP_MANIFEST_MAGIC) || + (manifest->base.manifest_version != FAP_MANIFEST_SUPPORTED_VERSION)) { + return false; + } + + return true; +} + +bool flipper_application_manifest_is_compatible( + const FlipperApplicationManifest* manifest, + const ElfApiInterface* api_interface) { + if(manifest->base.api_version.major != api_interface->api_version_major /* || + manifest->base.api_version.minor > app->api_interface->api_version_minor */) { + return false; + } + + return true; +} diff --git a/lib/flipper_application/application_manifest.h b/lib/flipper_application/application_manifest.h index 6aa20e481..f46d44fd7 100644 --- a/lib/flipper_application/application_manifest.h +++ b/lib/flipper_application/application_manifest.h @@ -1,6 +1,12 @@ +/** + * @file application_manifest.h + * Flipper application manifest + */ #pragma once #include +#include +#include "elf/elf_api_interface.h" #ifdef __cplusplus extern "C" { @@ -40,6 +46,25 @@ typedef FlipperApplicationManifestV1 FlipperApplicationManifest; #pragma pack(pop) +/** + * @brief Check if manifest is valid + * + * @param manifest + * @return bool + */ +bool flipper_application_manifest_is_valid(const FlipperApplicationManifest* manifest); + +/** + * @brief Check if manifest is compatible with current ELF API interface + * + * @param manifest + * @param api_interface + * @return bool + */ +bool flipper_application_manifest_is_compatible( + const FlipperApplicationManifest* manifest, + const ElfApiInterface* api_interface); + #ifdef __cplusplus } #endif diff --git a/lib/flipper_application/elf/elf_api_interface.h b/lib/flipper_application/elf/elf_api_interface.h index 505f4f718..ca31fc483 100644 --- a/lib/flipper_application/elf/elf_api_interface.h +++ b/lib/flipper_application/elf/elf_api_interface.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #define ELF_INVALID_ADDRESS 0xFFFFFFFF diff --git a/lib/flipper_application/elf/elf_file.c b/lib/flipper_application/elf/elf_file.c new file mode 100644 index 000000000..202d0a875 --- /dev/null +++ b/lib/flipper_application/elf/elf_file.c @@ -0,0 +1,794 @@ +#include +#include "elf_file.h" +#include "elf_file_i.h" +#include "elf_api_interface.h" + +#define TAG "elf" + +#define ELF_NAME_BUFFER_LEN 32 +#define SECTION_OFFSET(e, n) (e->section_table + n * sizeof(Elf32_Shdr)) +#define IS_FLAGS_SET(v, m) ((v & m) == m) +#define RESOLVER_THREAD_YIELD_STEP 30 + +// #define ELF_DEBUG_LOG 1 + +#ifndef ELF_DEBUG_LOG +#undef FURI_LOG_D +#define FURI_LOG_D(...) +#endif + +#define TRAMPOLINE_CODE_SIZE 6 + +/** +ldr r12, [pc, #2] +bx r12 +*/ +const uint8_t trampoline_code_little_endian[TRAMPOLINE_CODE_SIZE] = + {0xdf, 0xf8, 0x02, 0xc0, 0x60, 0x47}; + +typedef struct { + uint8_t code[TRAMPOLINE_CODE_SIZE]; + uint32_t addr; +} __attribute__((packed)) JMPTrampoline; + +/**************************************************************************************************/ +/********************************************* Caches *********************************************/ +/**************************************************************************************************/ + +static bool address_cache_get(AddressCache_t cache, int symEntry, Elf32_Addr* symAddr) { + Elf32_Addr* addr = AddressCache_get(cache, symEntry); + if(addr) { + *symAddr = *addr; + return true; + } else { + return false; + } +} + +static void address_cache_put(AddressCache_t cache, int symEntry, Elf32_Addr symAddr) { + AddressCache_set_at(cache, symEntry, symAddr); +} + +/**************************************************************************************************/ +/********************************************** ELF ***********************************************/ +/**************************************************************************************************/ + +static ELFSection* elf_file_get_section(ELFFile* elf, const char* name) { + return ELFSectionDict_get(elf->sections, name); +} + +static void elf_file_put_section(ELFFile* elf, const char* name, ELFSection* section) { + ELFSectionDict_set_at(elf->sections, strdup(name), *section); +} + +static bool elf_read_string_from_offset(ELFFile* elf, off_t offset, string_t name) { + bool result = false; + + off_t old = storage_file_tell(elf->fd); + + do { + if(!storage_file_seek(elf->fd, offset, true)) break; + + char buffer[ELF_NAME_BUFFER_LEN + 1]; + buffer[ELF_NAME_BUFFER_LEN] = 0; + + while(true) { + uint16_t read = storage_file_read(elf->fd, buffer, ELF_NAME_BUFFER_LEN); + string_cat_str(name, buffer); + if(strlen(buffer) < ELF_NAME_BUFFER_LEN) { + result = true; + break; + } + + if(storage_file_get_error(elf->fd) != FSE_OK || read == 0) break; + } + + } while(false); + storage_file_seek(elf->fd, old, true); + + return result; +} + +static bool elf_read_section_name(ELFFile* elf, off_t offset, string_t name) { + return elf_read_string_from_offset(elf, elf->section_table_strings + offset, name); +} + +static bool elf_read_symbol_name(ELFFile* elf, off_t offset, string_t name) { + return elf_read_string_from_offset(elf, elf->symbol_table_strings + offset, name); +} + +static bool elf_read_section_header(ELFFile* elf, size_t section_idx, Elf32_Shdr* section_header) { + off_t offset = SECTION_OFFSET(elf, section_idx); + return storage_file_seek(elf->fd, offset, true) && + storage_file_read(elf->fd, section_header, sizeof(Elf32_Shdr)) == sizeof(Elf32_Shdr); +} + +static bool + elf_read_section(ELFFile* elf, size_t section_idx, Elf32_Shdr* section_header, string_t name) { + if(!elf_read_section_header(elf, section_idx, section_header)) { + return false; + } + + if(section_header->sh_name && !elf_read_section_name(elf, section_header->sh_name, name)) { + return false; + } + + return true; +} + +static bool elf_read_symbol(ELFFile* elf, int n, Elf32_Sym* sym, string_t name) { + bool success = false; + off_t old = storage_file_tell(elf->fd); + off_t pos = elf->symbol_table + n * sizeof(Elf32_Sym); + if(storage_file_seek(elf->fd, pos, true) && + storage_file_read(elf->fd, sym, sizeof(Elf32_Sym)) == sizeof(Elf32_Sym)) { + if(sym->st_name) + success = elf_read_symbol_name(elf, sym->st_name, name); + else { + Elf32_Shdr shdr; + success = elf_read_section(elf, sym->st_shndx, &shdr, name); + } + } + storage_file_seek(elf->fd, old, true); + return success; +} + +static ELFSection* elf_section_of(ELFFile* elf, int index) { + ELFSectionDict_it_t it; + for(ELFSectionDict_it(it, elf->sections); !ELFSectionDict_end_p(it); ELFSectionDict_next(it)) { + ELFSectionDict_itref_t* itref = ELFSectionDict_ref(it); + if(itref->value.sec_idx == index) { + return &itref->value; + } + } + + return NULL; +} + +static Elf32_Addr elf_address_of(ELFFile* elf, Elf32_Sym* sym, const char* sName) { + if(sym->st_shndx == SHN_UNDEF) { + Elf32_Addr addr = 0; + if(elf->api_interface->resolver_callback(sName, &addr)) { + return addr; + } + } else { + ELFSection* symSec = elf_section_of(elf, sym->st_shndx); + if(symSec) { + return ((Elf32_Addr)symSec->data) + sym->st_value; + } + } + FURI_LOG_D(TAG, " Can not find address for symbol %s", sName); + return ELF_INVALID_ADDRESS; +} + +__attribute__((unused)) static const char* elf_reloc_type_to_str(int symt) { +#define STRCASE(name) \ + case name: \ + return #name; + switch(symt) { + STRCASE(R_ARM_NONE) + STRCASE(R_ARM_TARGET1) + STRCASE(R_ARM_ABS32) + STRCASE(R_ARM_THM_PC22) + STRCASE(R_ARM_THM_JUMP24) + default: + return "R_"; + } +#undef STRCASE +} + +static JMPTrampoline* elf_create_trampoline(Elf32_Addr addr) { + JMPTrampoline* trampoline = malloc(sizeof(JMPTrampoline)); + memcpy(trampoline->code, trampoline_code_little_endian, TRAMPOLINE_CODE_SIZE); + trampoline->addr = addr; + return trampoline; +} + +static void elf_relocate_jmp_call(ELFFile* elf, Elf32_Addr relAddr, int type, Elf32_Addr symAddr) { + int offset, hi, lo, s, j1, j2, i1, i2, imm10, imm11; + int to_thumb, is_call, blx_bit = 1 << 12; + + /* Get initial offset */ + hi = ((uint16_t*)relAddr)[0]; + lo = ((uint16_t*)relAddr)[1]; + s = (hi >> 10) & 1; + j1 = (lo >> 13) & 1; + j2 = (lo >> 11) & 1; + i1 = (j1 ^ s) ^ 1; + i2 = (j2 ^ s) ^ 1; + imm10 = hi & 0x3ff; + imm11 = lo & 0x7ff; + offset = (s << 24) | (i1 << 23) | (i2 << 22) | (imm10 << 12) | (imm11 << 1); + if(offset & 0x01000000) offset -= 0x02000000; + + to_thumb = symAddr & 1; + is_call = (type == R_ARM_THM_PC22); + + /* Store offset */ + int offset_copy = offset; + + /* Compute final offset */ + offset += symAddr - relAddr; + if(!to_thumb && is_call) { + blx_bit = 0; /* bl -> blx */ + offset = (offset + 3) & -4; /* Compute offset from aligned PC */ + } + + /* Check that relocation is possible + * offset must not be out of range + * if target is to be entered in arm mode: + - bit 1 must not set + - instruction must be a call (bl) or a jump to PLT */ + if(!to_thumb || offset >= 0x1000000 || offset < -0x1000000) { + if(to_thumb || (symAddr & 2) || (!is_call)) { + FURI_LOG_D( + TAG, + "can't relocate value at %x, %s, doing trampoline", + relAddr, + elf_reloc_type_to_str(type)); + + Elf32_Addr addr; + if(!address_cache_get(elf->trampoline_cache, symAddr, &addr)) { + addr = (Elf32_Addr)elf_create_trampoline(symAddr); + address_cache_put(elf->trampoline_cache, symAddr, addr); + } + + offset = offset_copy; + offset += (int)addr - relAddr; + if(!to_thumb && is_call) { + blx_bit = 0; /* bl -> blx */ + offset = (offset + 3) & -4; /* Compute offset from aligned PC */ + } + } + } + + /* Compute and store final offset */ + s = (offset >> 24) & 1; + i1 = (offset >> 23) & 1; + i2 = (offset >> 22) & 1; + j1 = s ^ (i1 ^ 1); + j2 = s ^ (i2 ^ 1); + imm10 = (offset >> 12) & 0x3ff; + imm11 = (offset >> 1) & 0x7ff; + (*(uint16_t*)relAddr) = (uint16_t)((hi & 0xf800) | (s << 10) | imm10); + (*(uint16_t*)(relAddr + 2)) = + (uint16_t)((lo & 0xc000) | (j1 << 13) | blx_bit | (j2 << 11) | imm11); +} + +static bool elf_relocate_symbol(ELFFile* elf, Elf32_Addr relAddr, int type, Elf32_Addr symAddr) { + switch(type) { + case R_ARM_TARGET1: + case R_ARM_ABS32: + *((uint32_t*)relAddr) += symAddr; + FURI_LOG_D(TAG, " R_ARM_ABS32 relocated is 0x%08X", (unsigned int)*((uint32_t*)relAddr)); + break; + case R_ARM_THM_PC22: + case R_ARM_THM_JUMP24: + elf_relocate_jmp_call(elf, relAddr, type, symAddr); + FURI_LOG_D( + TAG, " R_ARM_THM_CALL/JMP relocated is 0x%08X", (unsigned int)*((uint32_t*)relAddr)); + break; + default: + FURI_LOG_E(TAG, " Undefined relocation %d", type); + return false; + } + return true; +} + +static bool elf_relocate(ELFFile* elf, Elf32_Shdr* h, ELFSection* s) { + if(s->data) { + Elf32_Rel rel; + size_t relEntries = h->sh_size / sizeof(rel); + size_t relCount; + (void)storage_file_seek(elf->fd, h->sh_offset, true); + FURI_LOG_D(TAG, " Offset Info Type Name"); + + int relocate_result = true; + string_t symbol_name; + string_init(symbol_name); + + for(relCount = 0; relCount < relEntries; relCount++) { + if(relCount % RESOLVER_THREAD_YIELD_STEP == 0) { + FURI_LOG_D(TAG, " reloc YIELD"); + furi_delay_tick(1); + } + + if(storage_file_read(elf->fd, &rel, sizeof(Elf32_Rel)) != sizeof(Elf32_Rel)) { + FURI_LOG_E(TAG, " reloc read fail"); + string_clear(symbol_name); + return false; + } + + Elf32_Addr symAddr; + + int symEntry = ELF32_R_SYM(rel.r_info); + int relType = ELF32_R_TYPE(rel.r_info); + Elf32_Addr relAddr = ((Elf32_Addr)s->data) + rel.r_offset; + + if(!address_cache_get(elf->relocation_cache, symEntry, &symAddr)) { + Elf32_Sym sym; + string_reset(symbol_name); + if(!elf_read_symbol(elf, symEntry, &sym, symbol_name)) { + FURI_LOG_E(TAG, " symbol read fail"); + string_clear(symbol_name); + return false; + } + + FURI_LOG_D( + TAG, + " %08X %08X %-16s %s", + (unsigned int)rel.r_offset, + (unsigned int)rel.r_info, + elf_reloc_type_to_str(relType), + string_get_cstr(symbol_name)); + + symAddr = elf_address_of(elf, &sym, string_get_cstr(symbol_name)); + address_cache_put(elf->relocation_cache, symEntry, symAddr); + } + + if(symAddr != ELF_INVALID_ADDRESS) { + FURI_LOG_D( + TAG, + " symAddr=%08X relAddr=%08X", + (unsigned int)symAddr, + (unsigned int)relAddr); + if(!elf_relocate_symbol(elf, relAddr, relType, symAddr)) { + relocate_result = false; + } + } else { + FURI_LOG_E(TAG, " No symbol address of %s", string_get_cstr(symbol_name)); + relocate_result = false; + } + } + string_clear(symbol_name); + + return relocate_result; + } else { + FURI_LOG_D(TAG, "Section not loaded"); + } + + return false; +} + +/**************************************************************************************************/ +/********************************************* MISC ***********************************************/ +/**************************************************************************************************/ + +static bool cstr_prefix(const char* prefix, const char* string) { + return strncmp(prefix, string, strlen(prefix)) == 0; +} + +/**************************************************************************************************/ +/************************************ Internal FAP interfaces *************************************/ +/**************************************************************************************************/ +typedef enum { + SectionTypeERROR = 0, + SectionTypeUnused = 1 << 0, + SectionTypeData = 1 << 1, + SectionTypeRelData = 1 << 2, + SectionTypeSymTab = 1 << 3, + SectionTypeStrTab = 1 << 4, + SectionTypeManifest = 1 << 5, + SectionTypeDebugLink = 1 << 6, + + SectionTypeValid = SectionTypeSymTab | SectionTypeStrTab | SectionTypeManifest, +} SectionType; + +static bool elf_load_metadata( + ELFFile* elf, + Elf32_Shdr* section_header, + FlipperApplicationManifest* manifest) { + if(section_header->sh_size < sizeof(FlipperApplicationManifest)) { + return false; + } + + if(manifest == NULL) { + return true; + } + + return storage_file_seek(elf->fd, section_header->sh_offset, true) && + storage_file_read(elf->fd, manifest, section_header->sh_size) == + section_header->sh_size; +} + +static bool elf_load_debug_link(ELFFile* elf, Elf32_Shdr* section_header) { + elf->debug_link_info.debug_link_size = section_header->sh_size; + elf->debug_link_info.debug_link = malloc(section_header->sh_size); + + return storage_file_seek(elf->fd, section_header->sh_offset, true) && + storage_file_read(elf->fd, elf->debug_link_info.debug_link, section_header->sh_size) == + section_header->sh_size; +} + +static SectionType elf_preload_section( + ELFFile* elf, + size_t section_idx, + Elf32_Shdr* section_header, + string_t name_string, + FlipperApplicationManifest* manifest) { + const char* name = string_get_cstr(name_string); + + const struct { + const char* prefix; + SectionType type; + } lookup_sections[] = { + {".text", SectionTypeData}, + {".rodata", SectionTypeData}, + {".data", SectionTypeData}, + {".bss", SectionTypeData}, + {".preinit_array", SectionTypeData}, + {".init_array", SectionTypeData}, + {".fini_array", SectionTypeData}, + {".rel.text", SectionTypeRelData}, + {".rel.rodata", SectionTypeRelData}, + {".rel.data", SectionTypeRelData}, + {".rel.preinit_array", SectionTypeRelData}, + {".rel.init_array", SectionTypeRelData}, + {".rel.fini_array", SectionTypeRelData}, + }; + + for(size_t i = 0; i < COUNT_OF(lookup_sections); i++) { + if(cstr_prefix(lookup_sections[i].prefix, name)) { + FURI_LOG_D(TAG, "Found section %s", lookup_sections[i].prefix); + + if(lookup_sections[i].type == SectionTypeRelData) { + name = name + strlen(".rel"); + } + + ELFSection* section_p = elf_file_get_section(elf, name); + if(!section_p) { + ELFSection section = { + .data = NULL, + .sec_idx = 0, + .rel_sec_idx = 0, + .size = 0, + }; + + elf_file_put_section(elf, name, §ion); + section_p = elf_file_get_section(elf, name); + } + + if(lookup_sections[i].type == SectionTypeRelData) { + section_p->rel_sec_idx = section_idx; + } else { + section_p->sec_idx = section_idx; + } + + return lookup_sections[i].type; + } + } + + if(strcmp(name, ".symtab") == 0) { + FURI_LOG_D(TAG, "Found .symtab section"); + elf->symbol_table = section_header->sh_offset; + elf->symbol_count = section_header->sh_size / sizeof(Elf32_Sym); + return SectionTypeSymTab; + } else if(strcmp(name, ".strtab") == 0) { + FURI_LOG_D(TAG, "Found .strtab section"); + elf->symbol_table_strings = section_header->sh_offset; + return SectionTypeStrTab; + } else if(strcmp(name, ".fapmeta") == 0) { + FURI_LOG_D(TAG, "Found .fapmeta section"); + if(elf_load_metadata(elf, section_header, manifest)) { + return SectionTypeManifest; + } else { + return SectionTypeERROR; + } + } else if(strcmp(name, ".gnu_debuglink") == 0) { + FURI_LOG_D(TAG, "Found .gnu_debuglink section"); + if(elf_load_debug_link(elf, section_header)) { + return SectionTypeDebugLink; + } else { + return SectionTypeERROR; + } + } + + return SectionTypeUnused; +} + +static bool elf_load_section_data(ELFFile* elf, ELFSection* section) { + Elf32_Shdr section_header; + if(section->sec_idx == 0) { + FURI_LOG_D(TAG, "Section is not present"); + return true; + } + + if(!elf_read_section_header(elf, section->sec_idx, §ion_header)) { + return false; + } + + if(section_header.sh_size == 0) { + FURI_LOG_D(TAG, "No data for section"); + return true; + } + + section->data = aligned_malloc(section_header.sh_size, section_header.sh_addralign); + section->size = section_header.sh_size; + + if(section_header.sh_type == SHT_NOBITS) { + /* section is empty (.bss?) */ + /* no need to memset - allocator already did that */ + return true; + } + + if((!storage_file_seek(elf->fd, section_header.sh_offset, true)) || + (storage_file_read(elf->fd, section->data, section_header.sh_size) != + section_header.sh_size)) { + FURI_LOG_E(TAG, " seek/read fail"); + return false; + } + + FURI_LOG_D(TAG, "0x%X", section->data); + return true; +} + +static bool elf_relocate_section(ELFFile* elf, ELFSection* section) { + Elf32_Shdr section_header; + if(section->rel_sec_idx) { + FURI_LOG_D(TAG, "Relocating section"); + if(elf_read_section_header(elf, section->rel_sec_idx, §ion_header)) + return elf_relocate(elf, §ion_header, section); + else { + FURI_LOG_E(TAG, "Error reading section header"); + return false; + } + } else { + FURI_LOG_D(TAG, "No relocation index"); /* Not an error */ + } + return true; +} + +static void elf_file_call_section_list(ELFFile* elf, const char* name, bool reverse_order) { + ELFSection* section = elf_file_get_section(elf, name); + + if(section && section->size) { + const uint32_t* start = section->data; + const uint32_t* end = section->data + section->size; + + if(reverse_order) { + while(end > start) { + end--; + ((void (*)(void))(*end))(); + } + } else { + while(start < end) { + ((void (*)(void))(*start))(); + start++; + } + } + } +} + +/**************************************************************************************************/ +/********************************************* Public *********************************************/ +/**************************************************************************************************/ + +ELFFile* elf_file_alloc(Storage* storage, const ElfApiInterface* api_interface) { + ELFFile* elf = malloc(sizeof(ELFFile)); + elf->fd = storage_file_alloc(storage); + elf->api_interface = api_interface; + ELFSectionDict_init(elf->sections); + AddressCache_init(elf->trampoline_cache); + return elf; +} + +void elf_file_free(ELFFile* elf) { + // free sections data + { + ELFSectionDict_it_t it; + for(ELFSectionDict_it(it, elf->sections); !ELFSectionDict_end_p(it); + ELFSectionDict_next(it)) { + const ELFSectionDict_itref_t* itref = ELFSectionDict_cref(it); + if(itref->value.data) { + aligned_free(itref->value.data); + } + free((void*)itref->key); + } + + ELFSectionDict_clear(elf->sections); + } + + // free trampoline data + { + AddressCache_it_t it; + for(AddressCache_it(it, elf->trampoline_cache); !AddressCache_end_p(it); + AddressCache_next(it)) { + const AddressCache_itref_t* itref = AddressCache_cref(it); + free((void*)itref->value); + } + + AddressCache_clear(elf->trampoline_cache); + } + + if(elf->debug_link_info.debug_link) { + free(elf->debug_link_info.debug_link); + } + + storage_file_free(elf->fd); + free(elf); +} + +bool elf_file_open(ELFFile* elf, const char* path) { + Elf32_Ehdr h; + Elf32_Shdr sH; + + if(!storage_file_open(elf->fd, path, FSAM_READ, FSOM_OPEN_EXISTING) || + !storage_file_seek(elf->fd, 0, true) || + storage_file_read(elf->fd, &h, sizeof(h)) != sizeof(h) || + !storage_file_seek(elf->fd, h.e_shoff + h.e_shstrndx * sizeof(sH), true) || + storage_file_read(elf->fd, &sH, sizeof(Elf32_Shdr)) != sizeof(Elf32_Shdr)) { + return false; + } + + elf->entry = h.e_entry; + elf->sections_count = h.e_shnum; + elf->section_table = h.e_shoff; + elf->section_table_strings = sH.sh_offset; + return true; +} + +bool elf_file_load_manifest(ELFFile* elf, FlipperApplicationManifest* manifest) { + bool result = false; + string_t name; + string_init(name); + + FURI_LOG_D(TAG, "Looking for manifest section"); + for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) { + Elf32_Shdr section_header; + + string_reset(name); + if(!elf_read_section(elf, section_idx, §ion_header, name)) { + break; + } + + if(string_cmp(name, ".fapmeta") == 0) { + if(elf_load_metadata(elf, §ion_header, manifest)) { + FURI_LOG_D(TAG, "Load manifest done"); + result = true; + break; + } else { + break; + } + } + } + + string_clear(name); + return result; +} + +bool elf_file_load_section_table(ELFFile* elf, FlipperApplicationManifest* manifest) { + SectionType loaded_sections = SectionTypeERROR; + string_t name; + string_init(name); + + FURI_LOG_D(TAG, "Scan ELF indexs..."); + for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) { + Elf32_Shdr section_header; + + string_reset(name); + if(!elf_read_section(elf, section_idx, §ion_header, name)) { + loaded_sections = SectionTypeERROR; + break; + } + + FURI_LOG_D(TAG, "Preloading data for section #%d %s", section_idx, string_get_cstr(name)); + SectionType section_type = + elf_preload_section(elf, section_idx, §ion_header, name, manifest); + loaded_sections |= section_type; + + if(section_type == SectionTypeERROR) { + loaded_sections = SectionTypeERROR; + break; + } + } + + string_clear(name); + FURI_LOG_D(TAG, "Load symbols done"); + + return IS_FLAGS_SET(loaded_sections, SectionTypeValid); +} + +ELFFileLoadStatus elf_file_load_sections(ELFFile* elf) { + ELFFileLoadStatus status = ELFFileLoadStatusSuccess; + ELFSectionDict_it_t it; + + AddressCache_init(elf->relocation_cache); + size_t start = furi_get_tick(); + + for(ELFSectionDict_it(it, elf->sections); !ELFSectionDict_end_p(it); ELFSectionDict_next(it)) { + ELFSectionDict_itref_t* itref = ELFSectionDict_ref(it); + FURI_LOG_D(TAG, "Loading section '%s'", itref->key); + if(!elf_load_section_data(elf, &itref->value)) { + FURI_LOG_E(TAG, "Error loading section '%s'", itref->key); + status = ELFFileLoadStatusUnspecifiedError; + } + } + + if(status == ELFFileLoadStatusSuccess) { + for(ELFSectionDict_it(it, elf->sections); !ELFSectionDict_end_p(it); + ELFSectionDict_next(it)) { + ELFSectionDict_itref_t* itref = ELFSectionDict_ref(it); + FURI_LOG_D(TAG, "Relocating section '%s'", itref->key); + if(!elf_relocate_section(elf, &itref->value)) { + FURI_LOG_E(TAG, "Error relocating section '%s'", itref->key); + status = ELFFileLoadStatusMissingImports; + } + } + } + + /* Fixing up entry point */ + if(status == ELFFileLoadStatusSuccess) { + ELFSection* text_section = elf_file_get_section(elf, ".text"); + + if(text_section == NULL) { + FURI_LOG_E(TAG, "No .text section found"); + status = ELFFileLoadStatusUnspecifiedError; + } else { + elf->entry += (uint32_t)text_section->data; + } + } + + FURI_LOG_D(TAG, "Relocation cache size: %u", AddressCache_size(elf->relocation_cache)); + FURI_LOG_D(TAG, "Trampoline cache size: %u", AddressCache_size(elf->trampoline_cache)); + AddressCache_clear(elf->relocation_cache); + FURI_LOG_I(TAG, "Loaded in %ums", (size_t)(furi_get_tick() - start)); + + return status; +} + +void elf_file_pre_run(ELFFile* elf) { + elf_file_call_section_list(elf, ".preinit_array", false); + elf_file_call_section_list(elf, ".init_array", false); +} + +int32_t elf_file_run(ELFFile* elf, void* args) { + int32_t result; + result = ((int32_t(*)(void*))elf->entry)(args); + return result; +} + +void elf_file_post_run(ELFFile* elf) { + elf_file_call_section_list(elf, ".fini_array", true); +} + +const ElfApiInterface* elf_file_get_api_interface(ELFFile* elf_file) { + return elf_file->api_interface; +} + +void elf_file_init_debug_info(ELFFile* elf, ELFDebugInfo* debug_info) { + // set entry + debug_info->entry = elf->entry; + + // copy debug info + memcpy(&debug_info->debug_link_info, &elf->debug_link_info, sizeof(ELFDebugLinkInfo)); + + // init mmap + debug_info->mmap_entry_count = ELFSectionDict_size(elf->sections); + debug_info->mmap_entries = malloc(sizeof(ELFMemoryMapEntry) * debug_info->mmap_entry_count); + uint32_t mmap_entry_idx = 0; + + ELFSectionDict_it_t it; + for(ELFSectionDict_it(it, elf->sections); !ELFSectionDict_end_p(it); ELFSectionDict_next(it)) { + const ELFSectionDict_itref_t* itref = ELFSectionDict_cref(it); + + const void* data_ptr = itref->value.data; + if(data_ptr) { + debug_info->mmap_entries[mmap_entry_idx].address = (uint32_t)data_ptr; + debug_info->mmap_entries[mmap_entry_idx].name = itref->key; + mmap_entry_idx++; + } + } +} + +void elf_file_clear_debug_info(ELFDebugInfo* debug_info) { + // clear debug info + memset(&debug_info->debug_link_info, 0, sizeof(ELFDebugLinkInfo)); + + // clear mmap + if(debug_info->mmap_entries) { + free(debug_info->mmap_entries); + debug_info->mmap_entries = NULL; + } + + debug_info->mmap_entry_count = 0; +} diff --git a/lib/flipper_application/elf/elf_file.h b/lib/flipper_application/elf/elf_file.h new file mode 100644 index 000000000..673f165cc --- /dev/null +++ b/lib/flipper_application/elf/elf_file.h @@ -0,0 +1,127 @@ +/** + * @file elf_file.h + * ELF file loader + */ +#pragma once +#include +#include "../application_manifest.h" +#include "elf_api_interface.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ELFFile ELFFile; + +typedef struct { + const char* name; + uint32_t address; +} ELFMemoryMapEntry; + +typedef struct { + uint32_t debug_link_size; + uint8_t* debug_link; +} ELFDebugLinkInfo; + +typedef struct { + uint32_t mmap_entry_count; + ELFMemoryMapEntry* mmap_entries; + ELFDebugLinkInfo debug_link_info; + off_t entry; +} ELFDebugInfo; + +typedef enum { + ELFFileLoadStatusSuccess = 0, + ELFFileLoadStatusUnspecifiedError, + ELFFileLoadStatusNoFreeMemory, + ELFFileLoadStatusMissingImports, +} ELFFileLoadStatus; + +/** + * @brief Allocate ELFFile instance + * @param storage + * @param api_interface + * @return ELFFile* + */ +ELFFile* elf_file_alloc(Storage* storage, const ElfApiInterface* api_interface); + +/** + * @brief Free ELFFile instance + * @param elf_file + */ +void elf_file_free(ELFFile* elf_file); + +/** + * @brief Open ELF file + * @param elf_file + * @param path + * @return bool + */ +bool elf_file_open(ELFFile* elf_file, const char* path); + +/** + * @brief Load ELF file manifest + * @param elf + * @param manifest + * @return bool + */ +bool elf_file_load_manifest(ELFFile* elf, FlipperApplicationManifest* manifest); + +/** + * @brief Load ELF file section table (load stage #1) + * @param elf_file + * @param manifest + * @return bool + */ +bool elf_file_load_section_table(ELFFile* elf_file, FlipperApplicationManifest* manifest); + +/** + * @brief Load and relocate ELF file sections (load stage #2) + * @param elf_file + * @return ELFFileLoadStatus + */ +ELFFileLoadStatus elf_file_load_sections(ELFFile* elf_file); + +/** + * @brief Execute ELF file pre-run stage, call static constructors for example (load stage #3) + * @param elf + */ +void elf_file_pre_run(ELFFile* elf); + +/** + * @brief Run ELF file (load stage #4) + * @param elf_file + * @param args + * @return int32_t + */ +int32_t elf_file_run(ELFFile* elf_file, void* args); + +/** + * @brief Execute ELF file post-run stage, call static destructors for example (load stage #5) + * @param elf + */ +void elf_file_post_run(ELFFile* elf); + +/** + * @brief Get ELF file API interface + * @param elf_file + * @return const ElfApiInterface* + */ +const ElfApiInterface* elf_file_get_api_interface(ELFFile* elf_file); + +/** + * @brief Get ELF file debug info + * @param elf_file + * @param debug_info + */ +void elf_file_init_debug_info(ELFFile* elf_file, ELFDebugInfo* debug_info); + +/** + * @brief Clear ELF file debug info generated by elf_file_init_debug_info + * @param debug_info + */ +void elf_file_clear_debug_info(ELFDebugInfo* debug_info); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/lib/flipper_application/elf/elf_file_i.h b/lib/flipper_application/elf/elf_file_i.h new file mode 100644 index 000000000..1df075f06 --- /dev/null +++ b/lib/flipper_application/elf/elf_file_i.h @@ -0,0 +1,46 @@ +#pragma once +#include "elf_file.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +DICT_DEF2(AddressCache, int, M_DEFAULT_OPLIST, Elf32_Addr, M_DEFAULT_OPLIST) + +/** + * Callable elf entry type + */ +typedef int32_t(entry_t)(void*); + +typedef struct { + void* data; + uint16_t sec_idx; + uint16_t rel_sec_idx; + Elf32_Word size; +} ELFSection; + +DICT_DEF2(ELFSectionDict, const char*, M_CSTR_OPLIST, ELFSection, M_POD_OPLIST) + +struct ELFFile { + size_t sections_count; + off_t section_table; + off_t section_table_strings; + + size_t symbol_count; + off_t symbol_table; + off_t symbol_table_strings; + off_t entry; + ELFSectionDict_t sections; + + AddressCache_t relocation_cache; + AddressCache_t trampoline_cache; + + File* fd; + const ElfApiInterface* api_interface; + ELFDebugLinkInfo debug_link_info; +}; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/lib/flipper_application/flipper_applicaiton_i.c b/lib/flipper_application/flipper_applicaiton_i.c deleted file mode 100644 index a2a069eeb..000000000 --- a/lib/flipper_application/flipper_applicaiton_i.c +++ /dev/null @@ -1,477 +0,0 @@ -#include "flipper_application_i.h" -#include - -#define TAG "fapp-i" - -#define RESOLVER_THREAD_YIELD_STEP 30 - -#define IS_FLAGS_SET(v, m) ((v & m) == m) -#define SECTION_OFFSET(e, n) (e->section_table + n * sizeof(Elf32_Shdr)) -#define SYMBOL_OFFSET(e, n) (e->_table + n * sizeof(Elf32_Shdr)) - -bool flipper_application_load_elf_headers(FlipperApplication* e, const char* path) { - Elf32_Ehdr h; - Elf32_Shdr sH; - - if(!storage_file_open(e->fd, path, FSAM_READ, FSOM_OPEN_EXISTING) || - !storage_file_seek(e->fd, 0, true) || - storage_file_read(e->fd, &h, sizeof(h)) != sizeof(h) || - !storage_file_seek(e->fd, h.e_shoff + h.e_shstrndx * sizeof(sH), true) || - storage_file_read(e->fd, &sH, sizeof(Elf32_Shdr)) != sizeof(Elf32_Shdr)) { - return false; - } - - e->entry = h.e_entry; - e->sections = h.e_shnum; - e->section_table = h.e_shoff; - e->section_table_strings = sH.sh_offset; - return true; -} - -static bool flipper_application_load_metadata(FlipperApplication* e, Elf32_Shdr* sh) { - if(sh->sh_size < sizeof(e->manifest)) { - return false; - } - - return storage_file_seek(e->fd, sh->sh_offset, true) && - storage_file_read(e->fd, &e->manifest, sh->sh_size) == sh->sh_size; -} - -static bool flipper_application_load_debug_link(FlipperApplication* e, Elf32_Shdr* sh) { - e->state.debug_link_size = sh->sh_size; - e->state.debug_link = malloc(sh->sh_size); - - return storage_file_seek(e->fd, sh->sh_offset, true) && - storage_file_read(e->fd, e->state.debug_link, sh->sh_size) == sh->sh_size; -} - -static FindFlags_t flipper_application_preload_section( - FlipperApplication* e, - Elf32_Shdr* sh, - const char* name, - int n) { - FURI_LOG_D(TAG, "Processing: %s", name); - - const struct { - const char* name; - uint16_t* ptr_section_idx; - FindFlags_t flags; - } lookup_sections[] = { - {".text", &e->text.sec_idx, FoundText}, - {".rodata", &e->rodata.sec_idx, FoundRodata}, - {".data", &e->data.sec_idx, FoundData}, - {".bss", &e->bss.sec_idx, FoundBss}, - {".rel.text", &e->text.rel_sec_idx, FoundRelText}, - {".rel.rodata", &e->rodata.rel_sec_idx, FoundRelRodata}, - {".rel.data", &e->data.rel_sec_idx, FoundRelData}, - }; - - for(size_t i = 0; i < COUNT_OF(lookup_sections); i++) { - if(strcmp(name, lookup_sections[i].name) == 0) { - *lookup_sections[i].ptr_section_idx = n; - return lookup_sections[i].flags; - } - } - - if(strcmp(name, ".symtab") == 0) { - e->symbol_table = sh->sh_offset; - e->symbol_count = sh->sh_size / sizeof(Elf32_Sym); - return FoundSymTab; - } else if(strcmp(name, ".strtab") == 0) { - e->symbol_table_strings = sh->sh_offset; - return FoundStrTab; - } else if(strcmp(name, ".fapmeta") == 0) { - // Load metadata immediately - if(flipper_application_load_metadata(e, sh)) { - return FoundFappManifest; - } - } else if(strcmp(name, ".gnu_debuglink") == 0) { - if(flipper_application_load_debug_link(e, sh)) { - return FoundDebugLink; - } - } - return FoundERROR; -} - -static bool - read_string_from_offset(FlipperApplication* e, off_t offset, char* buffer, size_t buffer_size) { - bool success = false; - - off_t old = storage_file_tell(e->fd); - if(storage_file_seek(e->fd, offset, true) && - (storage_file_read(e->fd, buffer, buffer_size) == buffer_size)) { - success = true; - } - storage_file_seek(e->fd, old, true); - - return success; -} - -static bool read_section_name(FlipperApplication* e, off_t off, char* buf, size_t max) { - return read_string_from_offset(e, e->section_table_strings + off, buf, max); -} - -static bool read_symbol_name(FlipperApplication* e, off_t off, char* buf, size_t max) { - return read_string_from_offset(e, e->symbol_table_strings + off, buf, max); -} - -static bool read_section_header(FlipperApplication* e, int n, Elf32_Shdr* h) { - off_t offset = SECTION_OFFSET(e, n); - return storage_file_seek(e->fd, offset, true) && - storage_file_read(e->fd, h, sizeof(Elf32_Shdr)) == sizeof(Elf32_Shdr); -} - -static bool read_section(FlipperApplication* e, int n, Elf32_Shdr* h, char* name, size_t nlen) { - if(!read_section_header(e, n, h)) { - return false; - } - if(!h->sh_name) { - return true; - } - return read_section_name(e, h->sh_name, name, nlen); -} - -bool flipper_application_load_section_table(FlipperApplication* e) { - furi_check(e->state.mmap_entry_count == 0); - - size_t n; - FindFlags_t found = FoundERROR; - FURI_LOG_D(TAG, "Scan ELF indexs..."); - for(n = 1; n < e->sections; n++) { - Elf32_Shdr section_header; - char name[33] = {0}; - if(!read_section_header(e, n, §ion_header)) { - return false; - } - if(section_header.sh_name && - !read_section_name(e, section_header.sh_name, name, sizeof(name))) { - return false; - } - - FURI_LOG_T(TAG, "Examining section %d %s", n, name); - FindFlags_t section_flags = - flipper_application_preload_section(e, §ion_header, name, n); - found |= section_flags; - if((section_flags & FoundGdbSection) != 0) { - e->state.mmap_entry_count++; - } - if(IS_FLAGS_SET(found, FoundAll)) { - return true; - } - } - - FURI_LOG_D(TAG, "Load symbols done"); - return IS_FLAGS_SET(found, FoundValid); -} - -static const char* type_to_str(int symt) { -#define STRCASE(name) \ - case name: \ - return #name; - switch(symt) { - STRCASE(R_ARM_NONE) - STRCASE(R_ARM_ABS32) - STRCASE(R_ARM_THM_PC22) - STRCASE(R_ARM_THM_JUMP24) - default: - return "R_"; - } -#undef STRCASE -} - -static void relocate_jmp_call(Elf32_Addr relAddr, int type, Elf32_Addr symAddr) { - UNUSED(type); - uint16_t upper_insn = ((uint16_t*)relAddr)[0]; - uint16_t lower_insn = ((uint16_t*)relAddr)[1]; - uint32_t S = (upper_insn >> 10) & 1; - uint32_t J1 = (lower_insn >> 13) & 1; - uint32_t J2 = (lower_insn >> 11) & 1; - - int32_t offset = (S << 24) | /* S -> offset[24] */ - ((~(J1 ^ S) & 1) << 23) | /* J1 -> offset[23] */ - ((~(J2 ^ S) & 1) << 22) | /* J2 -> offset[22] */ - ((upper_insn & 0x03ff) << 12) | /* imm10 -> offset[12:21] */ - ((lower_insn & 0x07ff) << 1); /* imm11 -> offset[1:11] */ - if(offset & 0x01000000) offset -= 0x02000000; - - offset += symAddr - relAddr; - - S = (offset >> 24) & 1; - J1 = S ^ (~(offset >> 23) & 1); - J2 = S ^ (~(offset >> 22) & 1); - - upper_insn = ((upper_insn & 0xf800) | (S << 10) | ((offset >> 12) & 0x03ff)); - ((uint16_t*)relAddr)[0] = upper_insn; - - lower_insn = ((lower_insn & 0xd000) | (J1 << 13) | (J2 << 11) | ((offset >> 1) & 0x07ff)); - ((uint16_t*)relAddr)[1] = lower_insn; -} - -static bool relocate_symbol(Elf32_Addr relAddr, int type, Elf32_Addr symAddr) { - switch(type) { - case R_ARM_ABS32: - *((uint32_t*)relAddr) += symAddr; - FURI_LOG_D(TAG, " R_ARM_ABS32 relocated is 0x%08X", (unsigned int)*((uint32_t*)relAddr)); - break; - case R_ARM_THM_PC22: - case R_ARM_THM_JUMP24: - relocate_jmp_call(relAddr, type, symAddr); - FURI_LOG_D( - TAG, " R_ARM_THM_CALL/JMP relocated is 0x%08X", (unsigned int)*((uint32_t*)relAddr)); - break; - default: - FURI_LOG_D(TAG, " Undefined relocation %d", type); - return false; - } - return true; -} - -static ELFSection_t* section_of(FlipperApplication* e, int index) { - if(e->text.sec_idx == index) { - return &e->text; - } else if(e->data.sec_idx == index) { - return &e->data; - } else if(e->bss.sec_idx == index) { - return &e->bss; - } else if(e->rodata.sec_idx == index) { - return &e->rodata; - } - return NULL; -} - -static Elf32_Addr address_of(FlipperApplication* e, Elf32_Sym* sym, const char* sName) { - if(sym->st_shndx == SHN_UNDEF) { - Elf32_Addr addr = 0; - if(e->api_interface->resolver_callback(sName, &addr)) { - return addr; - } - } else { - ELFSection_t* symSec = section_of(e, sym->st_shndx); - if(symSec) { - return ((Elf32_Addr)symSec->data) + sym->st_value; - } - } - FURI_LOG_D(TAG, " Can not find address for symbol %s", sName); - return ELF_INVALID_ADDRESS; -} - -static bool read_symbol(FlipperApplication* e, int n, Elf32_Sym* sym, char* name, size_t nlen) { - bool success = false; - off_t old = storage_file_tell(e->fd); - off_t pos = e->symbol_table + n * sizeof(Elf32_Sym); - if(storage_file_seek(e->fd, pos, true) && - storage_file_read(e->fd, sym, sizeof(Elf32_Sym)) == sizeof(Elf32_Sym)) { - if(sym->st_name) - success = read_symbol_name(e, sym->st_name, name, nlen); - else { - Elf32_Shdr shdr; - success = read_section(e, sym->st_shndx, &shdr, name, nlen); - } - } - storage_file_seek(e->fd, old, true); - return success; -} - -static bool - relocation_cache_get(RelocationAddressCache_t cache, int symEntry, Elf32_Addr* symAddr) { - Elf32_Addr* addr = RelocationAddressCache_get(cache, symEntry); - if(addr) { - *symAddr = *addr; - return true; - } else { - return false; - } -} - -static void - relocation_cache_put(RelocationAddressCache_t cache, int symEntry, Elf32_Addr symAddr) { - RelocationAddressCache_set_at(cache, symEntry, symAddr); -} - -#define MAX_SYMBOL_NAME_LEN 128u - -static bool relocate(FlipperApplication* e, Elf32_Shdr* h, ELFSection_t* s) { - if(s->data) { - Elf32_Rel rel; - size_t relEntries = h->sh_size / sizeof(rel); - size_t relCount; - (void)storage_file_seek(e->fd, h->sh_offset, true); - FURI_LOG_D(TAG, " Offset Info Type Name"); - - int relocate_result = true; - char symbol_name[MAX_SYMBOL_NAME_LEN + 1] = {0}; - - for(relCount = 0; relCount < relEntries; relCount++) { - if(relCount % RESOLVER_THREAD_YIELD_STEP == 0) { - FURI_LOG_D(TAG, " reloc YIELD"); - furi_delay_tick(1); - } - - if(storage_file_read(e->fd, &rel, sizeof(Elf32_Rel)) != sizeof(Elf32_Rel)) { - FURI_LOG_E(TAG, " reloc read fail"); - return false; - } - - Elf32_Addr symAddr; - - int symEntry = ELF32_R_SYM(rel.r_info); - int relType = ELF32_R_TYPE(rel.r_info); - Elf32_Addr relAddr = ((Elf32_Addr)s->data) + rel.r_offset; - - if(!relocation_cache_get(e->relocation_cache, symEntry, &symAddr)) { - Elf32_Sym sym; - if(!read_symbol(e, symEntry, &sym, symbol_name, MAX_SYMBOL_NAME_LEN)) { - FURI_LOG_E(TAG, " symbol read fail"); - return false; - } - - FURI_LOG_D( - TAG, - " %08X %08X %-16s %s", - (unsigned int)rel.r_offset, - (unsigned int)rel.r_info, - type_to_str(relType), - symbol_name); - - symAddr = address_of(e, &sym, symbol_name); - relocation_cache_put(e->relocation_cache, symEntry, symAddr); - } - - if(symAddr != ELF_INVALID_ADDRESS) { - FURI_LOG_D( - TAG, - " symAddr=%08X relAddr=%08X", - (unsigned int)symAddr, - (unsigned int)relAddr); - if(!relocate_symbol(relAddr, relType, symAddr)) { - relocate_result = false; - } - } else { - FURI_LOG_D(TAG, " No symbol address of %s", symbol_name); - relocate_result = false; - } - } - - return relocate_result; - } else - FURI_LOG_I(TAG, "Section not loaded"); - - return false; -} - -static bool flipper_application_load_section_data(FlipperApplication* e, ELFSection_t* s) { - Elf32_Shdr section_header; - if(s->sec_idx == 0) { - FURI_LOG_I(TAG, "Section is not present"); - return true; - } - - if(!read_section_header(e, s->sec_idx, §ion_header)) { - return false; - } - - if(section_header.sh_size == 0) { - FURI_LOG_I(TAG, "No data for section"); - return true; - } - - s->data = aligned_malloc(section_header.sh_size, section_header.sh_addralign); - // e->state.mmap_entry_count++; - - if(section_header.sh_type == SHT_NOBITS) { - /* section is empty (.bss?) */ - /* no need to memset - allocator already did that */ - /* memset(s->data, 0, h->sh_size); */ - FURI_LOG_D(TAG, "0x%X", s->data); - return true; - } - - if((!storage_file_seek(e->fd, section_header.sh_offset, true)) || - (storage_file_read(e->fd, s->data, section_header.sh_size) != section_header.sh_size)) { - FURI_LOG_E(TAG, " seek/read fail"); - flipper_application_free_section(s); - return false; - } - - FURI_LOG_D(TAG, "0x%X", s->data); - return true; -} - -static bool flipper_application_relocate_section(FlipperApplication* e, ELFSection_t* s) { - Elf32_Shdr section_header; - if(s->rel_sec_idx) { - FURI_LOG_D(TAG, "Relocating section"); - if(read_section_header(e, s->rel_sec_idx, §ion_header)) - return relocate(e, §ion_header, s); - else { - FURI_LOG_E(TAG, "Error reading section header"); - return false; - } - } else - FURI_LOG_D(TAG, "No relocation index"); /* Not an error */ - return true; -} - -FlipperApplicationLoadStatus flipper_application_load_sections(FlipperApplication* e) { - FlipperApplicationLoadStatus status = FlipperApplicationLoadStatusSuccess; - RelocationAddressCache_init(e->relocation_cache); - size_t start = furi_get_tick(); - - struct { - ELFSection_t* section; - const char* name; - } sections[] = { - {&e->text, ".text"}, - {&e->rodata, ".rodata"}, - {&e->data, ".data"}, - {&e->bss, ".bss"}, - }; - - for(size_t i = 0; i < COUNT_OF(sections); i++) { - if(!flipper_application_load_section_data(e, sections[i].section)) { - FURI_LOG_E(TAG, "Error loading section '%s'", sections[i].name); - status = FlipperApplicationLoadStatusUnspecifiedError; - } - } - - if(status == FlipperApplicationLoadStatusSuccess) { - for(size_t i = 0; i < COUNT_OF(sections); i++) { - if(!flipper_application_relocate_section(e, sections[i].section)) { - FURI_LOG_E(TAG, "Error relocating section '%s'", sections[i].name); - status = FlipperApplicationLoadStatusMissingImports; - } - } - } - - if(status == FlipperApplicationLoadStatusSuccess) { - e->state.mmap_entries = - malloc(sizeof(FlipperApplicationMemoryMapEntry) * e->state.mmap_entry_count); - uint32_t mmap_entry_idx = 0; - for(size_t i = 0; i < COUNT_OF(sections); i++) { - const void* data_ptr = sections[i].section->data; - if(data_ptr) { - FURI_LOG_I(TAG, "0x%X %s", (uint32_t)data_ptr, sections[i].name); - e->state.mmap_entries[mmap_entry_idx].address = (uint32_t)data_ptr; - e->state.mmap_entries[mmap_entry_idx].name = sections[i].name; - mmap_entry_idx++; - } - } - furi_check(mmap_entry_idx == e->state.mmap_entry_count); - - /* Fixing up entry point */ - e->entry += (uint32_t)e->text.data; - } - - FURI_LOG_D(TAG, "Relocation cache size: %u", RelocationAddressCache_size(e->relocation_cache)); - RelocationAddressCache_clear(e->relocation_cache); - FURI_LOG_I(TAG, "Loaded in %ums", (size_t)(furi_get_tick() - start)); - - return status; -} - -void flipper_application_free_section(ELFSection_t* s) { - if(s->data) { - aligned_free(s->data); - } - s->data = NULL; -} diff --git a/lib/flipper_application/flipper_application.c b/lib/flipper_application/flipper_application.c index 6e84cce38..cf44eebb2 100644 --- a/lib/flipper_application/flipper_application.c +++ b/lib/flipper_application/flipper_application.c @@ -1,16 +1,22 @@ #include "flipper_application.h" -#include "flipper_application_i.h" +#include "elf/elf_file.h" #define TAG "fapp" +struct FlipperApplication { + ELFDebugInfo state; + FlipperApplicationManifest manifest; + ELFFile* elf; + FuriThread* thread; +}; + /* For debugger access to app state */ FlipperApplication* last_loaded_app = NULL; FlipperApplication* flipper_application_alloc(Storage* storage, const ElfApiInterface* api_interface) { FlipperApplication* app = malloc(sizeof(FlipperApplication)); - app->api_interface = api_interface; - app->fd = storage_file_alloc(storage); + app->elf = elf_file_alloc(storage, api_interface); app->thread = NULL; return app; } @@ -25,56 +31,71 @@ void flipper_application_free(FlipperApplication* app) { last_loaded_app = NULL; - if(app->state.debug_link_size) { - free(app->state.debug_link); - } - - if(app->state.mmap_entries) { - free(app->state.mmap_entries); - } - - ELFSection_t* sections[] = {&app->text, &app->rodata, &app->data, &app->bss}; - for(size_t i = 0; i < COUNT_OF(sections); i++) { - flipper_application_free_section(sections[i]); - } - - storage_file_free(app->fd); - + elf_file_clear_debug_info(&app->state); + elf_file_free(app->elf); free(app); } -/* Parse headers, load manifest */ -FlipperApplicationPreloadStatus - flipper_application_preload(FlipperApplication* app, const char* path) { - if(!flipper_application_load_elf_headers(app, path) || - !flipper_application_load_section_table(app)) { - return FlipperApplicationPreloadStatusInvalidFile; - } - - if((app->manifest.base.manifest_magic != FAP_MANIFEST_MAGIC) && - (app->manifest.base.manifest_version == FAP_MANIFEST_SUPPORTED_VERSION)) { +static FlipperApplicationPreloadStatus + flipper_application_validate_manifest(FlipperApplication* app) { + if(!flipper_application_manifest_is_valid(&app->manifest)) { return FlipperApplicationPreloadStatusInvalidManifest; } - if(app->manifest.base.api_version.major != app->api_interface->api_version_major /* || - app->manifest.base.api_version.minor > app->api_interface->api_version_minor */) { + if(!flipper_application_manifest_is_compatible( + &app->manifest, elf_file_get_api_interface(app->elf))) { return FlipperApplicationPreloadStatusApiMismatch; } return FlipperApplicationPreloadStatusSuccess; } +/* Parse headers, load manifest */ +FlipperApplicationPreloadStatus + flipper_application_preload_manifest(FlipperApplication* app, const char* path) { + if(!elf_file_open(app->elf, path) || !elf_file_load_manifest(app->elf, &app->manifest)) { + return FlipperApplicationPreloadStatusInvalidFile; + } + + return flipper_application_validate_manifest(app); +} + +/* Parse headers, load full file */ +FlipperApplicationPreloadStatus + flipper_application_preload(FlipperApplication* app, const char* path) { + if(!elf_file_open(app->elf, path) || !elf_file_load_section_table(app->elf, &app->manifest)) { + return FlipperApplicationPreloadStatusInvalidFile; + } + + return flipper_application_validate_manifest(app); +} + const FlipperApplicationManifest* flipper_application_get_manifest(FlipperApplication* app) { return &app->manifest; } FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplication* app) { last_loaded_app = app; - return flipper_application_load_sections(app); + ELFFileLoadStatus status = elf_file_load_sections(app->elf); + + switch(status) { + case ELFFileLoadStatusSuccess: + elf_file_init_debug_info(app->elf, &app->state); + return FlipperApplicationLoadStatusSuccess; + case ELFFileLoadStatusNoFreeMemory: + return FlipperApplicationLoadStatusNoFreeMemory; + case ELFFileLoadStatusMissingImports: + return FlipperApplicationLoadStatusMissingImports; + default: + return FlipperApplicationLoadStatusUnspecifiedError; + } } -const FlipperApplicationState* flipper_application_get_state(FlipperApplication* app) { - return &app->state; +static int32_t flipper_application_thread(void* context) { + elf_file_pre_run(last_loaded_app->elf); + int32_t result = elf_file_run(last_loaded_app->elf, context); + elf_file_post_run(last_loaded_app->elf); + return result; } FuriThread* flipper_application_spawn(FlipperApplication* app, void* args) { @@ -86,20 +107,12 @@ FuriThread* flipper_application_spawn(FlipperApplication* app, void* args) { app->thread = furi_thread_alloc(); furi_thread_set_stack_size(app->thread, manifest->stack_size); furi_thread_set_name(app->thread, manifest->name); - furi_thread_set_callback(app->thread, (entry_t*)app->entry); + furi_thread_set_callback(app->thread, flipper_application_thread); furi_thread_set_context(app->thread, args); return app->thread; } -FuriThread* flipper_application_get_thread(FlipperApplication* app) { - return app->thread; -} - -void const* flipper_application_get_entry_address(FlipperApplication* app) { - return (void*)app->entry; -} - static const char* preload_status_strings[] = { [FlipperApplicationPreloadStatusSuccess] = "Success", [FlipperApplicationPreloadStatusUnspecifiedError] = "Unknown error", diff --git a/lib/flipper_application/flipper_application.h b/lib/flipper_application/flipper_application.h index 34de40388..b3e5996bb 100644 --- a/lib/flipper_application/flipper_application.h +++ b/lib/flipper_application/flipper_application.h @@ -1,3 +1,7 @@ +/** + * @file flipper_application.h + * Flipper application + */ #pragma once #include "application_manifest.h" @@ -79,6 +83,14 @@ void flipper_application_free(FlipperApplication* app); FlipperApplicationPreloadStatus flipper_application_preload(FlipperApplication* app, const char* path); +/** + * @brief Validate elf file and load application manifest + * @param app Application pointer + * @return Preload result code + */ +FlipperApplicationPreloadStatus + flipper_application_preload_manifest(FlipperApplication* app, const char* path); + /** * @brief Get pointer to application manifest for preloaded application * @param app Application pointer @@ -93,13 +105,6 @@ const FlipperApplicationManifest* flipper_application_get_manifest(FlipperApplic */ FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplication* app); -/** - * @brief Get state object for loaded application - * @param app Application pointer - * @return Pointer to state object - */ -const FlipperApplicationState* flipper_application_get_state(FlipperApplication* app); - /** * @brief Create application thread at entry point address, using app name and * stack size from metadata. Returned thread isn't started yet. @@ -110,20 +115,6 @@ const FlipperApplicationState* flipper_application_get_state(FlipperApplication* */ FuriThread* flipper_application_spawn(FlipperApplication* app, void* args); -/** - * @brief Get previously spawned thread - * @param app Application pointer - * @return Created thread - */ -FuriThread* flipper_application_get_thread(FlipperApplication* app); - -/** - * @brief Return relocated and valid address of app's entry point - * @param app Application pointer - * @return Address of app's entry point - */ -void const* flipper_application_get_entry_address(FlipperApplication* app); - #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/lib/flipper_application/flipper_application_i.h b/lib/flipper_application/flipper_application_i.h deleted file mode 100644 index 8adf5c0d2..000000000 --- a/lib/flipper_application/flipper_application_i.h +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#include "elf.h" -#include "flipper_application.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -DICT_DEF2(RelocationAddressCache, int, M_DEFAULT_OPLIST, Elf32_Addr, M_DEFAULT_OPLIST) - -/** - * Callable elf entry type - */ -typedef int32_t(entry_t)(void*); - -typedef struct { - void* data; - uint16_t sec_idx; - uint16_t rel_sec_idx; -} ELFSection_t; - -struct FlipperApplication { - const ElfApiInterface* api_interface; - File* fd; - FlipperApplicationState state; - FlipperApplicationManifest manifest; - - size_t sections; - off_t section_table; - off_t section_table_strings; - - size_t symbol_count; - off_t symbol_table; - off_t symbol_table_strings; - off_t entry; - - ELFSection_t text; - ELFSection_t rodata; - ELFSection_t data; - ELFSection_t bss; - - FuriThread* thread; - RelocationAddressCache_t relocation_cache; -}; - -typedef enum { - FoundERROR = 0, - FoundSymTab = (1 << 0), - FoundStrTab = (1 << 2), - FoundText = (1 << 3), - FoundRodata = (1 << 4), - FoundData = (1 << 5), - FoundBss = (1 << 6), - FoundRelText = (1 << 7), - FoundRelRodata = (1 << 8), - FoundRelData = (1 << 9), - FoundRelBss = (1 << 10), - FoundFappManifest = (1 << 11), - FoundDebugLink = (1 << 12), - FoundValid = FoundSymTab | FoundStrTab | FoundFappManifest, - FoundExec = FoundValid | FoundText, - FoundGdbSection = FoundText | FoundRodata | FoundData | FoundBss, - FoundAll = FoundSymTab | FoundStrTab | FoundText | FoundRodata | FoundData | FoundBss | - FoundRelText | FoundRelRodata | FoundRelData | FoundRelBss | FoundDebugLink, -} FindFlags_t; - -/** - * @brief Load and validate basic ELF file headers - * @param e Application instance - * @param path FS path to application file - * @return true if ELF file is valid - */ -bool flipper_application_load_elf_headers(FlipperApplication* e, const char* path); - -/** - * @brief Iterate over all sections and save related indexes - * @param e Application instance - * @return true if all required sections are found - */ -bool flipper_application_load_section_table(FlipperApplication* e); - -/** - * @brief Load section data to memory and process relocations - * @param e Application instance - * @return Status code - */ -FlipperApplicationLoadStatus flipper_application_load_sections(FlipperApplication* e); - -/** - * @brief Release section data - * @param s section pointer - */ -void flipper_application_free_section(ELFSection_t* s); - -#ifdef __cplusplus -} -#endif \ No newline at end of file diff --git a/lib/nfc/helpers/mf_classic_dict.c b/lib/nfc/helpers/mf_classic_dict.c index 410ddbd8b..5bb67145a 100644 --- a/lib/nfc/helpers/mf_classic_dict.c +++ b/lib/nfc/helpers/mf_classic_dict.c @@ -5,6 +5,7 @@ #define MF_CLASSIC_DICT_FLIPPER_PATH EXT_PATH("nfc/assets/mf_classic_dict.nfc") #define MF_CLASSIC_DICT_USER_PATH EXT_PATH("nfc/assets/mf_classic_dict_user.nfc") +#define MF_CLASSIC_DICT_UNIT_TEST_PATH EXT_PATH("unit_tests/mf_classic_dict.nfc") #define TAG "MfClassicDict" @@ -23,6 +24,9 @@ bool mf_classic_dict_check_presence(MfClassicDictType dict_type) { dict_present = storage_common_stat(storage, MF_CLASSIC_DICT_FLIPPER_PATH, NULL) == FSE_OK; } else if(dict_type == MfClassicDictTypeUser) { dict_present = storage_common_stat(storage, MF_CLASSIC_DICT_USER_PATH, NULL) == FSE_OK; + } else if(dict_type == MfClassicDictTypeUnitTest) { + dict_present = storage_common_stat(storage, MF_CLASSIC_DICT_UNIT_TEST_PATH, NULL) == + FSE_OK; } furi_record_close(RECORD_STORAGE); @@ -50,6 +54,15 @@ MfClassicDict* mf_classic_dict_alloc(MfClassicDictType dict_type) { buffered_file_stream_close(dict->stream); break; } + } else if(dict_type == MfClassicDictTypeUnitTest) { + if(!buffered_file_stream_open( + dict->stream, + MF_CLASSIC_DICT_UNIT_TEST_PATH, + FSAM_READ_WRITE, + FSOM_CREATE_ALWAYS)) { + buffered_file_stream_close(dict->stream); + break; + } } // Read total amount of keys @@ -86,38 +99,30 @@ void mf_classic_dict_free(MfClassicDict* dict) { free(dict); } +static void mf_classic_dict_int_to_str(uint8_t* key_int, string_t key_str) { + string_reset(key_str); + for(size_t i = 0; i < 6; i++) { + string_cat_printf(key_str, "%02X", key_int[i]); + } +} + +static void mf_classic_dict_str_to_int(string_t key_str, uint64_t* key_int) { + uint8_t key_byte_tmp; + + *key_int = 0ULL; + for(uint8_t i = 0; i < 12; i += 2) { + args_char_to_hex( + string_get_char(key_str, i), string_get_char(key_str, i + 1), &key_byte_tmp); + *key_int |= (uint64_t)key_byte_tmp << 8 * (5 - i / 2); + } +} + uint32_t mf_classic_dict_get_total_keys(MfClassicDict* dict) { furi_assert(dict); return dict->total_keys; } -bool mf_classic_dict_get_next_key(MfClassicDict* dict, uint64_t* key) { - furi_assert(dict); - furi_assert(dict->stream); - - uint8_t key_byte_tmp = 0; - string_t next_line; - string_init(next_line); - - bool key_read = false; - *key = 0ULL; - while(!key_read) { - if(!stream_read_line(dict->stream, next_line)) break; - if(string_get_char(next_line, 0) == '#') continue; - if(string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue; - for(uint8_t i = 0; i < 12; i += 2) { - args_char_to_hex( - string_get_char(next_line, i), string_get_char(next_line, i + 1), &key_byte_tmp); - *key |= (uint64_t)key_byte_tmp << 8 * (5 - i / 2); - } - key_read = true; - } - - string_clear(next_line); - return key_read; -} - bool mf_classic_dict_rewind(MfClassicDict* dict) { furi_assert(dict); furi_assert(dict->stream); @@ -125,24 +130,194 @@ bool mf_classic_dict_rewind(MfClassicDict* dict) { return stream_rewind(dict->stream); } -bool mf_classic_dict_add_key(MfClassicDict* dict, uint8_t* key) { +bool mf_classic_dict_get_next_key_str(MfClassicDict* dict, string_t key) { furi_assert(dict); furi_assert(dict->stream); - string_t key_str; - string_init(key_str); - for(size_t i = 0; i < 6; i++) { - string_cat_printf(key_str, "%02X", key[i]); + bool key_read = false; + string_reset(key); + while(!key_read) { + if(!stream_read_line(dict->stream, key)) break; + if(string_get_char(key, 0) == '#') continue; + if(string_size(key) != NFC_MF_CLASSIC_KEY_LEN) continue; + string_left(key, 12); + key_read = true; } - string_cat_printf(key_str, "\n"); + + return key_read; +} + +bool mf_classic_dict_get_next_key(MfClassicDict* dict, uint64_t* key) { + furi_assert(dict); + furi_assert(dict->stream); + + string_t temp_key; + string_init(temp_key); + bool key_read = mf_classic_dict_get_next_key_str(dict, temp_key); + if(key_read) { + mf_classic_dict_str_to_int(temp_key, key); + } + string_clear(temp_key); + return key_read; +} + +bool mf_classic_dict_is_key_present_str(MfClassicDict* dict, string_t key) { + furi_assert(dict); + furi_assert(dict->stream); + + string_t next_line; + string_init(next_line); + + bool key_found = false; + stream_rewind(dict->stream); + while(!key_found) { + if(!stream_read_line(dict->stream, next_line)) break; + if(string_get_char(next_line, 0) == '#') continue; + if(string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue; + string_left(next_line, 12); + if(!string_equal_p(key, next_line)) continue; + key_found = true; + } + + string_clear(next_line); + return key_found; +} + +bool mf_classic_dict_is_key_present(MfClassicDict* dict, uint8_t* key) { + string_t temp_key; + + string_init(temp_key); + mf_classic_dict_int_to_str(key, temp_key); + bool key_found = mf_classic_dict_is_key_present_str(dict, temp_key); + string_clear(temp_key); + return key_found; +} + +bool mf_classic_dict_add_key_str(MfClassicDict* dict, string_t key) { + furi_assert(dict); + furi_assert(dict->stream); + + string_cat_printf(key, "\n"); bool key_added = false; do { if(!stream_seek(dict->stream, 0, StreamOffsetFromEnd)) break; - if(!stream_insert_string(dict->stream, key_str)) break; + if(!stream_insert_string(dict->stream, key)) break; + dict->total_keys++; key_added = true; } while(false); - string_clear(key_str); + string_left(key, 12); return key_added; } + +bool mf_classic_dict_add_key(MfClassicDict* dict, uint8_t* key) { + furi_assert(dict); + furi_assert(dict->stream); + + string_t temp_key; + string_init(temp_key); + mf_classic_dict_int_to_str(key, temp_key); + bool key_added = mf_classic_dict_add_key_str(dict, temp_key); + + string_clear(temp_key); + return key_added; +} + +bool mf_classic_dict_get_key_at_index_str(MfClassicDict* dict, string_t key, uint32_t target) { + furi_assert(dict); + furi_assert(dict->stream); + + string_t next_line; + uint32_t index = 0; + string_init(next_line); + string_reset(key); + + bool key_found = false; + while(!key_found) { + if(!stream_read_line(dict->stream, next_line)) break; + if(string_get_char(next_line, 0) == '#') continue; + if(string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue; + if(index++ != target) continue; + string_set_n(key, next_line, 0, 12); + key_found = true; + } + + string_clear(next_line); + return key_found; +} + +bool mf_classic_dict_get_key_at_index(MfClassicDict* dict, uint64_t* key, uint32_t target) { + furi_assert(dict); + furi_assert(dict->stream); + + string_t temp_key; + string_init(temp_key); + bool key_found = mf_classic_dict_get_key_at_index_str(dict, temp_key, target); + if(key_found) { + mf_classic_dict_str_to_int(temp_key, key); + } + string_clear(temp_key); + return key_found; +} + +bool mf_classic_dict_find_index_str(MfClassicDict* dict, string_t key, uint32_t* target) { + furi_assert(dict); + furi_assert(dict->stream); + + string_t next_line; + string_init(next_line); + + bool key_found = false; + uint32_t index = 0; + stream_rewind(dict->stream); + while(!key_found) { + if(!stream_read_line(dict->stream, next_line)) break; + if(string_get_char(next_line, 0) == '#') continue; + if(string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue; + string_left(next_line, 12); + if(!string_equal_p(key, next_line)) continue; + key_found = true; + *target = index; + } + + string_clear(next_line); + return key_found; +} + +bool mf_classic_dict_find_index(MfClassicDict* dict, uint8_t* key, uint32_t* target) { + furi_assert(dict); + furi_assert(dict->stream); + + string_t temp_key; + string_init(temp_key); + mf_classic_dict_int_to_str(key, temp_key); + bool key_found = mf_classic_dict_find_index_str(dict, temp_key, target); + + string_clear(temp_key); + return key_found; +} + +bool mf_classic_dict_delete_index(MfClassicDict* dict, uint32_t target) { + furi_assert(dict); + furi_assert(dict->stream); + + string_t next_line; + string_init(next_line); + uint32_t index = 0; + + bool key_removed = false; + while(!key_removed) { + if(!stream_read_line(dict->stream, next_line)) break; + if(string_get_char(next_line, 0) == '#') continue; + if(string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue; + if(index++ != target) continue; + stream_seek(dict->stream, -NFC_MF_CLASSIC_KEY_LEN, StreamOffsetFromCurrent); + if(!stream_delete(dict->stream, NFC_MF_CLASSIC_KEY_LEN)) break; + dict->total_keys--; + key_removed = true; + } + + string_clear(next_line); + return key_removed; +} diff --git a/lib/nfc/helpers/mf_classic_dict.h b/lib/nfc/helpers/mf_classic_dict.h index 2654e668c..9241a37b9 100644 --- a/lib/nfc/helpers/mf_classic_dict.h +++ b/lib/nfc/helpers/mf_classic_dict.h @@ -9,20 +9,91 @@ typedef enum { MfClassicDictTypeUser, MfClassicDictTypeFlipper, + MfClassicDictTypeUnitTest, } MfClassicDictType; typedef struct MfClassicDict MfClassicDict; bool mf_classic_dict_check_presence(MfClassicDictType dict_type); +/** Allocate MfClassicDict instance + * + * @param[in] dict_type The dictionary type + * + * @return MfClassicDict instance + */ MfClassicDict* mf_classic_dict_alloc(MfClassicDictType dict_type); +/** Free MfClassicDict instance + * + * @param dict MfClassicDict instance + */ void mf_classic_dict_free(MfClassicDict* dict); +/** Get total keys count + * + * @param dict MfClassicDict instance + * + * @return total keys count + */ uint32_t mf_classic_dict_get_total_keys(MfClassicDict* dict); +/** Rewind to the beginning + * + * @param dict MfClassicDict instance + * + * @return true on success + */ +bool mf_classic_dict_rewind(MfClassicDict* dict); + +bool mf_classic_dict_is_key_present(MfClassicDict* dict, uint8_t* key); + +bool mf_classic_dict_is_key_present_str(MfClassicDict* dict, string_t key); + bool mf_classic_dict_get_next_key(MfClassicDict* dict, uint64_t* key); -bool mf_classic_dict_rewind(MfClassicDict* dict); +bool mf_classic_dict_get_next_key_str(MfClassicDict* dict, string_t key); + +/** Get key at target offset as uint64_t + * + * @param dict MfClassicDict instance + * @param[out] key Pointer to the uint64_t key + * @param[in] target Target offset from current position + * + * @return true on success + */ +bool mf_classic_dict_get_key_at_index(MfClassicDict* dict, uint64_t* key, uint32_t target); + +/** Get key at target offset as string_t + * + * @param dict MfClassicDict instance + * @param[out] key Found key destination buffer + * @param[in] target Target offset from current position + * + * @return true on success + */ +bool mf_classic_dict_get_key_at_index_str(MfClassicDict* dict, string_t key, uint32_t target); bool mf_classic_dict_add_key(MfClassicDict* dict, uint8_t* key); + +/** Add string representation of the key + * + * @param dict MfClassicDict instance + * @param[in] key String representation of the key + * + * @return true on success + */ +bool mf_classic_dict_add_key_str(MfClassicDict* dict, string_t key); + +bool mf_classic_dict_find_index(MfClassicDict* dict, uint8_t* key, uint32_t* target); + +bool mf_classic_dict_find_index_str(MfClassicDict* dict, string_t key, uint32_t* target); + +/** Delete key at target offset + * + * @param dict MfClassicDict instance + * @param[in] target Target offset from current position + * + * @return true on success + */ +bool mf_classic_dict_delete_index(MfClassicDict* dict, uint32_t target); diff --git a/lib/nfc/helpers/reader_analyzer.c b/lib/nfc/helpers/reader_analyzer.c index 90b917296..3d065d144 100644 --- a/lib/nfc/helpers/reader_analyzer.c +++ b/lib/nfc/helpers/reader_analyzer.c @@ -39,7 +39,8 @@ struct ReaderAnalyzer { NfcDebugPcap* pcap; }; -static FuriHalNfcDevData reader_analyzer_nfc_data[] = { //XXX +static FuriHalNfcDevData reader_analyzer_nfc_data[] = { + //XXX [ReaderAnalyzerNfcDataMfClassic] = {.sak = 0x08, .atqa = {0x44, 0x00}, @@ -101,7 +102,8 @@ int32_t reader_analyzer_thread(void* context) { ReaderAnalyzer* reader_analyzer_alloc() { ReaderAnalyzer* instance = malloc(sizeof(ReaderAnalyzer)); reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic].cuid = rand(); //XXX - furi_hal_random_fill_buf((uint8_t*) &reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic].uid, 7); + furi_hal_random_fill_buf( + (uint8_t*)&reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic].uid, 7); instance->nfc_data = reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic]; instance->alive = false; instance->stream = diff --git a/lib/nfc/nfc_worker.c b/lib/nfc/nfc_worker.c index 6355f8d1e..2feae443f 100644 --- a/lib/nfc/nfc_worker.c +++ b/lib/nfc/nfc_worker.c @@ -123,7 +123,25 @@ static bool nfc_worker_read_mf_ultralight(NfcWorker* nfc_worker, FuriHalNfcTxRxC } do { - // Read card + // Try to read supported card + FURI_LOG_I(TAG, "Trying to read a supported card ..."); + for(size_t i = 0; i < NfcSupportedCardTypeEnd; i++) { + if(nfc_supported_card[i].protocol == NfcDeviceProtocolMifareUl) { + if(nfc_supported_card[i].verify(nfc_worker, tx_rx)) { + if(nfc_supported_card[i].read(nfc_worker, tx_rx)) { + read_success = true; + nfc_supported_card[i].parse(nfc_worker->dev_data); + break; + } + } else { + furi_hal_nfc_sleep(); + } + } + } + if(read_success) break; + furi_hal_nfc_sleep(); + + // Otherwise, try to read as usual if(!furi_hal_nfc_detect(&nfc_worker->dev_data->nfc_data, 200)) break; if(!mf_ul_read_card(tx_rx, &reader, &data)) break; // Copy data @@ -149,14 +167,17 @@ static bool nfc_worker_read_mf_classic(NfcWorker* nfc_worker, FuriHalNfcTxRxCont do { // Try to read supported card - FURI_LOG_I(TAG, "Try read supported card ..."); + FURI_LOG_I(TAG, "Trying to read a supported card ..."); for(size_t i = 0; i < NfcSupportedCardTypeEnd; i++) { if(nfc_supported_card[i].protocol == NfcDeviceProtocolMifareClassic) { if(nfc_supported_card[i].verify(nfc_worker, tx_rx)) { if(nfc_supported_card[i].read(nfc_worker, tx_rx)) { read_success = true; nfc_supported_card[i].parse(nfc_worker->dev_data); + break; } + } else { + furi_hal_nfc_sleep(); } } } diff --git a/lib/nfc/parsers/all_in_one.c b/lib/nfc/parsers/all_in_one.c new file mode 100644 index 000000000..b49a32f7c --- /dev/null +++ b/lib/nfc/parsers/all_in_one.c @@ -0,0 +1,113 @@ +#include "nfc_supported_card.h" +#include "all_in_one.h" + +#include +#include + +#include "furi_hal.h" + +#define ALL_IN_ONE_LAYOUT_UNKNOWN 0 +#define ALL_IN_ONE_LAYOUT_A 1 +#define ALL_IN_ONE_LAYOUT_D 2 +#define ALL_IN_ONE_LAYOUT_E2 3 +#define ALL_IN_ONE_LAYOUT_E3 4 +#define ALL_IN_ONE_LAYOUT_E5 5 +#define ALL_IN_ONE_LAYOUT_2 6 + +uint8_t all_in_one_get_layout(NfcDeviceData* dev_data) { + // I absolutely hate what's about to happen here. + + // Switch on the second half of the third byte of page 5 + FURI_LOG_I("all_in_one", "Layout byte: %02x", dev_data->mf_ul_data.data[(4 * 5) + 2]); + FURI_LOG_I( + "all_in_one", "Layout half-byte: %02x", dev_data->mf_ul_data.data[(4 * 5) + 3] & 0x0F); + switch(dev_data->mf_ul_data.data[(4 * 5) + 2] & 0x0F) { + // If it is A, the layout type is a type A layout + case 0x0A: + return ALL_IN_ONE_LAYOUT_A; + case 0x0D: + return ALL_IN_ONE_LAYOUT_D; + case 0x02: + return ALL_IN_ONE_LAYOUT_2; + default: + FURI_LOG_I( + "all_in_one", + "Unknown layout type: %d", + dev_data->mf_ul_data.data[(4 * 5) + 2] & 0x0F); + return ALL_IN_ONE_LAYOUT_UNKNOWN; + } +} + +bool all_in_one_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + UNUSED(nfc_worker); + // If this is a all_in_one pass, first 2 bytes of page 4 are 0x45 0xD9 + MfUltralightReader reader = {}; + MfUltralightData data = {}; + + if(!mf_ul_read_card(tx_rx, &reader, &data)) { + return false; + } else { + if(data.data[4 * 4] == 0x45 && data.data[4 * 4 + 1] == 0xD9) { + FURI_LOG_I("all_in_one", "Pass verified"); + return true; + } + } + return false; +} + +bool all_in_one_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + MfUltralightReader reader = {}; + MfUltralightData data = {}; + if(!mf_ul_read_card(tx_rx, &reader, &data)) { + return false; + } else { + memcpy(&nfc_worker->dev_data->mf_ul_data, &data, sizeof(data)); + FURI_LOG_I("all_in_one", "Card read"); + return true; + } +} + +bool all_in_one_parser_parse(NfcDeviceData* dev_data) { + if(dev_data->mf_ul_data.data[4 * 4] != 0x45 || dev_data->mf_ul_data.data[4 * 4 + 1] != 0xD9) { + FURI_LOG_I("all_in_one", "Pass not verified"); + return false; + } + + // If the layout is a then the ride count is stored in the first byte of page 8 + uint8_t ride_count = 0; + uint32_t serial = 0; + if(all_in_one_get_layout(dev_data) == ALL_IN_ONE_LAYOUT_A) { + ride_count = dev_data->mf_ul_data.data[4 * 8]; + } else if(all_in_one_get_layout(dev_data) == ALL_IN_ONE_LAYOUT_D) { + // If the layout is D, the ride count is stored in the second byte of page 9 + ride_count = dev_data->mf_ul_data.data[4 * 9 + 1]; + // I hate this with a burning passion. + + // The number starts at the second half of the third byte on page 4, and is 32 bits long + // So we get the second half of the third byte, then bytes 4-6, and then the first half of the 7th byte + // B8 17 A2 A4 BD becomes 81 7A 2A 4B + serial = (dev_data->mf_ul_data.data[4 * 4 + 2] & 0x0F) << 28 | + dev_data->mf_ul_data.data[4 * 4 + 3] << 20 | + dev_data->mf_ul_data.data[4 * 4 + 4] << 12 | + dev_data->mf_ul_data.data[4 * 4 + 5] << 4 | + (dev_data->mf_ul_data.data[4 * 4 + 6] >> 4); + } else { + FURI_LOG_I("all_in_one", "Unknown layout: %d", all_in_one_get_layout(dev_data)); + ride_count = 137; + } + + // I hate this with a burning passion. + + // The number starts at the second half of the third byte on page 4, and is 32 bits long + // So we get the second half of the third byte, then bytes 4-6, and then the first half of the 7th byte + // B8 17 A2 A4 BD becomes 81 7A 2A 4B + serial = + (dev_data->mf_ul_data.data[4 * 4 + 2] & 0x0F) << 28 | + dev_data->mf_ul_data.data[4 * 4 + 3] << 20 | dev_data->mf_ul_data.data[4 * 4 + 4] << 12 | + dev_data->mf_ul_data.data[4 * 4 + 5] << 4 | (dev_data->mf_ul_data.data[4 * 4 + 6] >> 4); + + // Format string for rides count + string_printf( + dev_data->parsed_data, "\e#All-In-One\nNumber: %u\nRides left: %u", serial, ride_count); + return true; +} \ No newline at end of file diff --git a/lib/nfc/parsers/all_in_one.h b/lib/nfc/parsers/all_in_one.h new file mode 100644 index 000000000..9b646d4dc --- /dev/null +++ b/lib/nfc/parsers/all_in_one.h @@ -0,0 +1,9 @@ +#pragma once + +#include "nfc_supported_card.h" + +bool all_in_one_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool all_in_one_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool all_in_one_parser_parse(NfcDeviceData* dev_data); \ No newline at end of file diff --git a/lib/nfc/parsers/nfc_supported_card.c b/lib/nfc/parsers/nfc_supported_card.c index 480c970e7..fc2dc34e0 100644 --- a/lib/nfc/parsers/nfc_supported_card.c +++ b/lib/nfc/parsers/nfc_supported_card.c @@ -1,14 +1,54 @@ #include "nfc_supported_card.h" -#include "troyka_parser.h" +#include "plantain_parser.h" +#include "troika_parser.h" +#include "plantain_4k_parser.h" +#include "troika_4k_parser.h" +#include "two_cities.h" +#include "all_in_one.h" NfcSupportedCard nfc_supported_card[NfcSupportedCardTypeEnd] = { - [NfcSupportedCardTypeTroyka] = + [NfcSupportedCardTypePlantain] = { .protocol = NfcDeviceProtocolMifareClassic, - .verify = troyka_parser_verify, - .read = troyka_parser_read, - .parse = troyka_parser_parse, + .verify = plantain_parser_verify, + .read = plantain_parser_read, + .parse = plantain_parser_parse, + }, + [NfcSupportedCardTypeTroika] = + { + .protocol = NfcDeviceProtocolMifareClassic, + .verify = troika_parser_verify, + .read = troika_parser_read, + .parse = troika_parser_parse, + }, + [NfcSupportedCardTypePlantain4K] = + { + .protocol = NfcDeviceProtocolMifareClassic, + .verify = plantain_4k_parser_verify, + .read = plantain_4k_parser_read, + .parse = plantain_4k_parser_parse, + }, + [NfcSupportedCardTypeTroika4K] = + { + .protocol = NfcDeviceProtocolMifareClassic, + .verify = troika_4k_parser_verify, + .read = troika_4k_parser_read, + .parse = troika_4k_parser_parse, + }, + [NfcSupportedCardTypeTwoCities] = + { + .protocol = NfcDeviceProtocolMifareClassic, + .verify = two_cities_parser_verify, + .read = two_cities_parser_read, + .parse = two_cities_parser_parse, + }, + [NfcSupportedCardTypeAllInOne] = + { + .protocol = NfcDeviceProtocolMifareUl, + .verify = all_in_one_parser_verify, + .read = all_in_one_parser_read, + .parse = all_in_one_parser_parse, }, }; diff --git a/lib/nfc/parsers/nfc_supported_card.h b/lib/nfc/parsers/nfc_supported_card.h index 9b5d1c053..d34b5794a 100644 --- a/lib/nfc/parsers/nfc_supported_card.h +++ b/lib/nfc/parsers/nfc_supported_card.h @@ -7,7 +7,12 @@ #include typedef enum { - NfcSupportedCardTypeTroyka, + NfcSupportedCardTypePlantain, + NfcSupportedCardTypeTroika, + NfcSupportedCardTypePlantain4K, + NfcSupportedCardTypeTroika4K, + NfcSupportedCardTypeTwoCities, + NfcSupportedCardTypeAllInOne, NfcSupportedCardTypeEnd, } NfcSupportedCardType; diff --git a/lib/nfc/parsers/plantain_4k_parser.c b/lib/nfc/parsers/plantain_4k_parser.c new file mode 100644 index 000000000..77387707b --- /dev/null +++ b/lib/nfc/parsers/plantain_4k_parser.c @@ -0,0 +1,153 @@ +#include "nfc_supported_card.h" +#include "plantain_parser.h" // For luhn and string_push_uint64 + +#include +#include + +#include "furi_hal.h" + +static const MfClassicAuthContext plantain_keys_4k[] = { + {.sector = 0, .key_a = 0xFFFFFFFFFFFF, .key_b = 0xFFFFFFFFFFFF}, + {.sector = 1, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 2, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 3, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 4, .key_a = 0xe56ac127dd45, .key_b = 0x19fc84a3784b}, + {.sector = 5, .key_a = 0x77dabc9825e1, .key_b = 0x9764fec3154a}, + {.sector = 6, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 7, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 8, .key_a = 0x26973ea74321, .key_b = 0xd27058c6e2c7}, + {.sector = 9, .key_a = 0xeb0a8ff88ade, .key_b = 0x578a9ada41e3}, + {.sector = 10, .key_a = 0xea0fd73cb149, .key_b = 0x29c35fa068fb}, + {.sector = 11, .key_a = 0xc76bf71a2509, .key_b = 0x9ba241db3f56}, + {.sector = 12, .key_a = 0xacffffffffff, .key_b = 0x71f3a315ad26}, + {.sector = 13, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 14, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 15, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 16, .key_a = 0x72f96bdd3714, .key_b = 0x462225cd34cf}, + {.sector = 17, .key_a = 0x044ce1872bc3, .key_b = 0x8c90c70cff4a}, + {.sector = 18, .key_a = 0xbc2d1791dec1, .key_b = 0xca96a487de0b}, + {.sector = 19, .key_a = 0x8791b2ccb5c4, .key_b = 0xc956c3b80da3}, + {.sector = 20, .key_a = 0x8e26e45e7d65, .key_b = 0x8e65b3af7d22}, + {.sector = 21, .key_a = 0x0f318130ed18, .key_b = 0x0c420a20e056}, + {.sector = 22, .key_a = 0x045ceca15535, .key_b = 0x31bec3d9e510}, + {.sector = 23, .key_a = 0x9d993c5d4ef4, .key_b = 0x86120e488abf}, + {.sector = 24, .key_a = 0xc65d4eaa645b, .key_b = 0xb69d40d1a439}, + {.sector = 25, .key_a = 0x3a8a139c20b4, .key_b = 0x8818a9c5d406}, + {.sector = 26, .key_a = 0xbaff3053b496, .key_b = 0x4b7cb25354d3}, + {.sector = 27, .key_a = 0x7413b599c4ea, .key_b = 0xb0a2AAF3A1BA}, + {.sector = 28, .key_a = 0x0ce7cd2cc72b, .key_b = 0xfa1fbb3f0f1f}, + {.sector = 29, .key_a = 0x0be5fac8b06a, .key_b = 0x6f95887a4fd3}, + {.sector = 30, .key_a = 0x0eb23cc8110b, .key_b = 0x04dc35277635}, + {.sector = 31, .key_a = 0xbc4580b7f20b, .key_b = 0xd0a4131fb290}, + {.sector = 32, .key_a = 0x7a396f0d633d, .key_b = 0xad2bdc097023}, + {.sector = 33, .key_a = 0xa3faa6daff67, .key_b = 0x7600e889adf9}, + {.sector = 34, .key_a = 0xfd8705e721b0, .key_b = 0x296fc317a513}, + {.sector = 35, .key_a = 0x22052b480d11, .key_b = 0xe19504c39461}, + {.sector = 36, .key_a = 0xa7141147d430, .key_b = 0xff16014fefc7}, + {.sector = 37, .key_a = 0x8a8d88151a00, .key_b = 0x038b5f9b5a2a}, + {.sector = 38, .key_a = 0xb27addfb64b0, .key_b = 0x152fd0c420a7}, + {.sector = 39, .key_a = 0x7259fa0197c6, .key_b = 0x5583698df085}, +}; + +bool plantain_4k_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + furi_assert(nfc_worker); + UNUSED(nfc_worker); + + if(nfc_worker->dev_data->mf_classic_data.type != MfClassicType4k) { + return false; + } + + uint8_t sector = 8; + uint8_t block = mf_classic_get_sector_trailer_block_num_by_sector(sector); + FURI_LOG_D("Plant4K", "Verifying sector %d", sector); + if(mf_classic_authenticate(tx_rx, block, 0x26973ea74321, MfClassicKeyA)) { + FURI_LOG_D("Plant4K", "Sector %d verified", sector); + return true; + } + return false; +} + +bool plantain_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + furi_assert(nfc_worker); + + MfClassicReader reader = {}; + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + for(size_t i = 0; i < COUNT_OF(plantain_keys_4k); i++) { + mf_classic_reader_add_sector( + &reader, + plantain_keys_4k[i].sector, + plantain_keys_4k[i].key_a, + plantain_keys_4k[i].key_b); + FURI_LOG_T("plant4k", "Added sector %d", plantain_keys_4k[i].sector); + } + for(int i = 0; i < 5; i++) { + if(mf_classic_read_card(tx_rx, &reader, &nfc_worker->dev_data->mf_classic_data) == 40) { + return true; + } + } + return false; +} + +bool plantain_4k_parser_parse(NfcDeviceData* dev_data) { + MfClassicData* data = &dev_data->mf_classic_data; + + // Verify key + MfClassicSectorTrailer* sec_tr = mf_classic_get_sector_trailer_by_sector(data, 8); + uint64_t key = nfc_util_bytes2num(sec_tr->key_a, 6); + if(key != plantain_keys_4k[8].key_a) return false; + + // Point to block 0 of sector 4, value 0 + uint8_t* temp_ptr = &data->block[4 * 4].value[0]; + // Read first 4 bytes of block 0 of sector 4 from last to first and convert them to uint32_t + // 38 18 00 00 becomes 00 00 18 38, and equals to 6200 decimal + uint32_t balance = + ((temp_ptr[3] << 24) | (temp_ptr[2] << 16) | (temp_ptr[1] << 8) | temp_ptr[0]) / 100; + // Read card number + // Point to block 0 of sector 0, value 0 + temp_ptr = &data->block[0 * 4].value[0]; + // Read first 7 bytes of block 0 of sector 0 from last to first and convert them to uint64_t + // 80 5C 23 8A 16 31 04 becomes 04 31 16 8A 23 5C 80, and equals to 36130104729284868 decimal + uint8_t card_number_arr[7]; + for(size_t i = 0; i < 7; i++) { + card_number_arr[i] = temp_ptr[6 - i]; + } + // Copy card number to uint64_t + uint64_t card_number = 0; + for(size_t i = 0; i < 7; i++) { + card_number = (card_number << 8) | card_number_arr[i]; + } + // Convert card number to string + string_t card_number_str; + string_init(card_number_str); + // Should look like "361301047292848684" + // %llu doesn't work for some reason in sprintf, so we use string_push_uint64 instead + string_push_uint64(card_number, card_number_str); + // Add suffix with luhn checksum (1 digit) to the card number string + string_t card_number_suffix; + string_init(card_number_suffix); + + // The number to calculate the checksum on doesn't fit into uint64_t, idk + //uint8_t luhn_checksum = plantain_calculate_luhn(card_number); + + // // Convert luhn checksum to string + // string_t luhn_checksum_str; + // string_init(luhn_checksum_str); + // string_push_uint64(luhn_checksum, luhn_checksum_str); + + string_cat_printf(card_number_suffix, "-"); + // FURI_LOG_D("plant4k", "Card checksum: %d", luhn_checksum); + string_cat_printf(card_number_str, string_get_cstr(card_number_suffix)); + // Free all not needed strings + string_clear(card_number_suffix); + // string_clear(luhn_checksum_str); + + string_printf( + dev_data->parsed_data, + "\e#Plantain\nN:%s\nBalance:%d\n", + string_get_cstr(card_number_str), + balance); + string_clear(card_number_str); + + return true; +} diff --git a/lib/nfc/parsers/plantain_4k_parser.h b/lib/nfc/parsers/plantain_4k_parser.h new file mode 100644 index 000000000..29998af15 --- /dev/null +++ b/lib/nfc/parsers/plantain_4k_parser.h @@ -0,0 +1,9 @@ +#pragma once + +#include "nfc_supported_card.h" + +bool plantain_4k_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool plantain_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool plantain_4k_parser_parse(NfcDeviceData* dev_data); diff --git a/lib/nfc/parsers/plantain_parser.c b/lib/nfc/parsers/plantain_parser.c new file mode 100644 index 000000000..ff81b8e9b --- /dev/null +++ b/lib/nfc/parsers/plantain_parser.c @@ -0,0 +1,147 @@ +#include "nfc_supported_card.h" + +#include +#include + +#include "furi_hal.h" + +static const MfClassicAuthContext plantain_keys[] = { + {.sector = 0, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 1, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 2, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 3, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 4, .key_a = 0xe56ac127dd45, .key_b = 0x19fc84a3784b}, + {.sector = 5, .key_a = 0x77dabc9825e1, .key_b = 0x9764fec3154a}, + {.sector = 6, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 7, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 8, .key_a = 0x26973ea74321, .key_b = 0xd27058c6e2c7}, + {.sector = 9, .key_a = 0xeb0a8ff88ade, .key_b = 0x578a9ada41e3}, + {.sector = 10, .key_a = 0xea0fd73cb149, .key_b = 0x29c35fa068fb}, + {.sector = 11, .key_a = 0xc76bf71a2509, .key_b = 0x9ba241db3f56}, + {.sector = 12, .key_a = 0xacffffffffff, .key_b = 0x71f3a315ad26}, + {.sector = 13, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 14, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 15, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, +}; + +bool plantain_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + furi_assert(nfc_worker); + UNUSED(nfc_worker); + if(nfc_worker->dev_data->mf_classic_data.type != MfClassicType1k) { + return false; + } + + uint8_t sector = 8; + uint8_t block = mf_classic_get_sector_trailer_block_num_by_sector(sector); + FURI_LOG_D("Plant", "Verifying sector %d", sector); + if(mf_classic_authenticate(tx_rx, block, 0x26973ea74321, MfClassicKeyA)) { + FURI_LOG_D("Plant", "Sector %d verified", sector); + return true; + } + return false; +} + +bool plantain_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + furi_assert(nfc_worker); + + MfClassicReader reader = {}; + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + for(size_t i = 0; i < COUNT_OF(plantain_keys); i++) { + mf_classic_reader_add_sector( + &reader, plantain_keys[i].sector, plantain_keys[i].key_a, plantain_keys[i].key_b); + } + + return mf_classic_read_card(tx_rx, &reader, &nfc_worker->dev_data->mf_classic_data) == 16; +} + +void string_push_uint64(uint64_t input, string_t output) { + const uint8_t base = 10; + + do { + char c = input % base; + input /= base; + + if(c < 10) + c += '0'; + else + c += 'A' - 10; + string_push_back(output, c); + } while(input); + + // reverse string + for(uint8_t i = 0; i < string_size(output) / 2; i++) { + char c = string_get_char(output, i); + string_set_char(output, i, string_get_char(output, string_size(output) - i - 1)); + string_set_char(output, string_size(output) - i - 1, c); + } +} + +uint8_t plantain_calculate_luhn(uint64_t number) { + // No. + UNUSED(number); + return 0; +} + +bool plantain_parser_parse(NfcDeviceData* dev_data) { + MfClassicData* data = &dev_data->mf_classic_data; + + // Verify key + MfClassicSectorTrailer* sec_tr = mf_classic_get_sector_trailer_by_sector(data, 8); + uint64_t key = nfc_util_bytes2num(sec_tr->key_a, 6); + if(key != plantain_keys[8].key_a) return false; + + // Point to block 0 of sector 4, value 0 + uint8_t* temp_ptr = &data->block[4 * 4].value[0]; + // Read first 4 bytes of block 0 of sector 4 from last to first and convert them to uint32_t + // 38 18 00 00 becomes 00 00 18 38, and equals to 6200 decimal + uint32_t balance = + ((temp_ptr[3] << 24) | (temp_ptr[2] << 16) | (temp_ptr[1] << 8) | temp_ptr[0]) / 100; + // Read card number + // Point to block 0 of sector 0, value 0 + temp_ptr = &data->block[0 * 4].value[0]; + // Read first 7 bytes of block 0 of sector 0 from last to first and convert them to uint64_t + // 80 5C 23 8A 16 31 04 becomes 04 31 16 8A 23 5C 80, and equals to 36130104729284868 decimal + uint8_t card_number_arr[7]; + for(size_t i = 0; i < 7; i++) { + card_number_arr[i] = temp_ptr[6 - i]; + } + // Copy card number to uint64_t + uint64_t card_number = 0; + for(size_t i = 0; i < 7; i++) { + card_number = (card_number << 8) | card_number_arr[i]; + } + // Convert card number to string + string_t card_number_str; + string_init(card_number_str); + // Should look like "361301047292848684" + // %llu doesn't work for some reason in sprintf, so we use string_push_uint64 instead + string_push_uint64(card_number, card_number_str); + // Add suffix with luhn checksum (1 digit) to the card number string + string_t card_number_suffix; + string_init(card_number_suffix); + + // The number to calculate the checksum on doesn't fit into uint64_t, idk + //uint8_t luhn_checksum = plantain_calculate_luhn(card_number); + + // // Convert luhn checksum to string + // string_t luhn_checksum_str; + // string_init(luhn_checksum_str); + // string_push_uint64(luhn_checksum, luhn_checksum_str); + + string_cat_printf(card_number_suffix, "-"); + // FURI_LOG_D("plant4k", "Card checksum: %d", luhn_checksum); + string_cat_printf(card_number_str, string_get_cstr(card_number_suffix)); + // Free all not needed strings + string_clear(card_number_suffix); + // string_clear(luhn_checksum_str); + + string_printf( + dev_data->parsed_data, + "\e#Plantain\nN:%s\nBalance:%d\n", + string_get_cstr(card_number_str), + balance); + string_clear(card_number_str); + + return true; +} diff --git a/lib/nfc/parsers/plantain_parser.h b/lib/nfc/parsers/plantain_parser.h new file mode 100644 index 000000000..d37f0dd48 --- /dev/null +++ b/lib/nfc/parsers/plantain_parser.h @@ -0,0 +1,13 @@ +#pragma once + +#include "nfc_supported_card.h" + +bool plantain_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool plantain_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool plantain_parser_parse(NfcDeviceData* dev_data); + +void string_push_uint64(uint64_t input, string_t output); + +uint8_t plantain_calculate_luhn(uint64_t number); diff --git a/lib/nfc/parsers/troika_4k_parser.c b/lib/nfc/parsers/troika_4k_parser.c new file mode 100644 index 000000000..8c32381f2 --- /dev/null +++ b/lib/nfc/parsers/troika_4k_parser.c @@ -0,0 +1,104 @@ +#include "nfc_supported_card.h" + +#include +#include + +static const MfClassicAuthContext troika_4k_keys[] = { + {.sector = 0, .key_a = 0xa0a1a2a3a4a5, .key_b = 0xfbf225dc5d58}, + {.sector = 1, .key_a = 0xa82607b01c0d, .key_b = 0x2910989b6880}, + {.sector = 2, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 3, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 4, .key_a = 0x73068f118c13, .key_b = 0x2b7f3253fac5}, + {.sector = 5, .key_a = 0xFBC2793D540B, .key_b = 0xd3a297dc2698}, + {.sector = 6, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 7, .key_a = 0xae3d65a3dad4, .key_b = 0x0f1c63013dbb}, + {.sector = 8, .key_a = 0xa73f5dc1d333, .key_b = 0xe35173494a81}, + {.sector = 9, .key_a = 0x69a32f1c2f19, .key_b = 0x6b8bd9860763}, + {.sector = 10, .key_a = 0x9becdf3d9273, .key_b = 0xf8493407799d}, + {.sector = 11, .key_a = 0x08b386463229, .key_b = 0x5efbaecef46b}, + {.sector = 12, .key_a = 0xcd4c61c26e3d, .key_b = 0x31c7610de3b0}, + {.sector = 13, .key_a = 0xa82607b01c0d, .key_b = 0x2910989b6880}, + {.sector = 14, .key_a = 0x0e8f64340ba4, .key_b = 0x4acec1205d75}, + {.sector = 15, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 16, .key_a = 0x6b02733bb6ec, .key_b = 0x7038cd25c408}, + {.sector = 17, .key_a = 0x403d706ba880, .key_b = 0xb39d19a280df}, + {.sector = 18, .key_a = 0xc11f4597efb5, .key_b = 0x70d901648cb9}, + {.sector = 19, .key_a = 0x0db520c78c1c, .key_b = 0x73e5b9d9d3a4}, + {.sector = 20, .key_a = 0x3ebce0925b2f, .key_b = 0x372cc880f216}, + {.sector = 21, .key_a = 0x16a27af45407, .key_b = 0x9868925175ba}, + {.sector = 22, .key_a = 0xaba208516740, .key_b = 0xce26ecb95252}, + {.sector = 23, .key_a = 0xCD64E567ABCD, .key_b = 0x8f79c4fd8a01}, + {.sector = 24, .key_a = 0x764cd061f1e6, .key_b = 0xa74332f74994}, + {.sector = 25, .key_a = 0x1cc219e9fec1, .key_b = 0xb90de525ceb6}, + {.sector = 26, .key_a = 0x2fe3cb83ea43, .key_b = 0xfba88f109b32}, + {.sector = 27, .key_a = 0x07894ffec1d6, .key_b = 0xefcb0e689db3}, + {.sector = 28, .key_a = 0x04c297b91308, .key_b = 0xc8454c154cb5}, + {.sector = 29, .key_a = 0x7a38e3511a38, .key_b = 0xab16584c972a}, + {.sector = 30, .key_a = 0x7545df809202, .key_b = 0xecf751084a80}, + {.sector = 31, .key_a = 0x5125974cd391, .key_b = 0xd3eafb5df46d}, + {.sector = 32, .key_a = 0x7a86aa203788, .key_b = 0xe41242278ca2}, + {.sector = 33, .key_a = 0xafcef64c9913, .key_b = 0x9db96dca4324}, + {.sector = 34, .key_a = 0x04eaa462f70b, .key_b = 0xac17b93e2fae}, + {.sector = 35, .key_a = 0xe734c210f27e, .key_b = 0x29ba8c3e9fda}, + {.sector = 36, .key_a = 0xd5524f591eed, .key_b = 0x5daf42861b4d}, + {.sector = 37, .key_a = 0xe4821a377b75, .key_b = 0xe8709e486465}, + {.sector = 38, .key_a = 0x518dc6eea089, .key_b = 0x97c64ac98ca4}, + {.sector = 39, .key_a = 0xbb52f8cce07f, .key_b = 0x6b6119752c70}, +}; + +bool troika_4k_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + furi_assert(nfc_worker); + + if(nfc_worker->dev_data->mf_classic_data.type != MfClassicType4k) { + return false; + } + + uint8_t sector = 11; + uint8_t block = mf_classic_get_sector_trailer_block_num_by_sector(sector); + FURI_LOG_D("Troika", "Verifying sector %d", sector); + if(mf_classic_authenticate(tx_rx, block, 0x08b386463229, MfClassicKeyA)) { + FURI_LOG_D("Troika", "Sector %d verified", sector); + return true; + } + return false; +} + +bool troika_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + furi_assert(nfc_worker); + + MfClassicReader reader = {}; + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + for(size_t i = 0; i < COUNT_OF(troika_4k_keys); i++) { + mf_classic_reader_add_sector( + &reader, troika_4k_keys[i].sector, troika_4k_keys[i].key_a, troika_4k_keys[i].key_b); + } + + return mf_classic_read_card(tx_rx, &reader, &nfc_worker->dev_data->mf_classic_data) == 40; +} + +bool troika_4k_parser_parse(NfcDeviceData* dev_data) { + MfClassicData* data = &dev_data->mf_classic_data; + + // Verify key + MfClassicSectorTrailer* sec_tr = mf_classic_get_sector_trailer_by_sector(data, 4); + uint64_t key = nfc_util_bytes2num(sec_tr->key_a, 6); + if(key != troika_4k_keys[4].key_a) return false; + + // Verify card type + if(data->type != MfClassicType4k) return false; + + uint8_t* temp_ptr = &data->block[8 * 4 + 1].value[5]; + uint16_t balance = ((temp_ptr[0] << 8) | temp_ptr[1]) / 25; + temp_ptr = &data->block[8 * 4].value[3]; + uint32_t number = 0; + for(size_t i = 0; i < 4; i++) { + number <<= 8; + number |= temp_ptr[i]; + } + number >>= 4; + + string_printf(dev_data->parsed_data, "\e#Troika\nNum: %ld\nBalance: %d rur.", number, balance); + + return true; +} diff --git a/lib/nfc/parsers/troika_4k_parser.h b/lib/nfc/parsers/troika_4k_parser.h new file mode 100644 index 000000000..c1d6f01d3 --- /dev/null +++ b/lib/nfc/parsers/troika_4k_parser.h @@ -0,0 +1,9 @@ +#pragma once + +#include "nfc_supported_card.h" + +bool troika_4k_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool troika_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool troika_4k_parser_parse(NfcDeviceData* dev_data); diff --git a/lib/nfc/parsers/troyka_parser.c b/lib/nfc/parsers/troika_parser.c similarity index 68% rename from lib/nfc/parsers/troyka_parser.c rename to lib/nfc/parsers/troika_parser.c index 51ffa42e1..f396b1680 100644 --- a/lib/nfc/parsers/troyka_parser.c +++ b/lib/nfc/parsers/troika_parser.c @@ -3,7 +3,7 @@ #include #include -static const MfClassicAuthContext troyka_keys[] = { +static const MfClassicAuthContext troika_keys[] = { {.sector = 0, .key_a = 0xa0a1a2a3a4a5, .key_b = 0xfbf225dc5d58}, {.sector = 1, .key_a = 0xa82607b01c0d, .key_b = 0x2910989b6880}, {.sector = 2, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, @@ -22,42 +22,50 @@ static const MfClassicAuthContext troyka_keys[] = { {.sector = 15, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, }; -bool troyka_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { +bool troika_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { furi_assert(nfc_worker); UNUSED(nfc_worker); + if(nfc_worker->dev_data->mf_classic_data.type != MfClassicType1k) { + return false; + } - MfClassicAuthContext auth_ctx = { - .key_a = MF_CLASSIC_NO_KEY, - .key_b = MF_CLASSIC_NO_KEY, - .sector = 8, - }; - return mf_classic_auth_attempt(tx_rx, &auth_ctx, 0xa73f5dc1d333); + uint8_t sector = 11; + uint8_t block = mf_classic_get_sector_trailer_block_num_by_sector(sector); + FURI_LOG_D("Troika", "Verifying sector %d", sector); + if(mf_classic_authenticate(tx_rx, block, 0x08b386463229, MfClassicKeyA)) { + FURI_LOG_D("Troika", "Sector %d verified", sector); + return true; + } + return false; } -bool troyka_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { +bool troika_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { furi_assert(nfc_worker); MfClassicReader reader = {}; FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); - for(size_t i = 0; i < COUNT_OF(troyka_keys); i++) { + for(size_t i = 0; i < COUNT_OF(troika_keys); i++) { mf_classic_reader_add_sector( - &reader, troyka_keys[i].sector, troyka_keys[i].key_a, troyka_keys[i].key_b); + &reader, troika_keys[i].sector, troika_keys[i].key_a, troika_keys[i].key_b); } return mf_classic_read_card(tx_rx, &reader, &nfc_worker->dev_data->mf_classic_data) == 16; } -bool troyka_parser_parse(NfcDeviceData* dev_data) { +bool troika_parser_parse(NfcDeviceData* dev_data) { MfClassicData* data = &dev_data->mf_classic_data; - bool troyka_parsed = false; + bool troika_parsed = false; do { // Verify key MfClassicSectorTrailer* sec_tr = mf_classic_get_sector_trailer_by_sector(data, 8); uint64_t key = nfc_util_bytes2num(sec_tr->key_a, 6); - if(key != troyka_keys[8].key_a) break; + if(key != troika_keys[8].key_a) break; + + // Verify card type + if(data->type != MfClassicType1k) break; // Parse data uint8_t* temp_ptr = &data->block[8 * 4 + 1].value[5]; @@ -71,9 +79,9 @@ bool troyka_parser_parse(NfcDeviceData* dev_data) { number >>= 4; string_printf( - dev_data->parsed_data, "\e#Troyka\nNum: %ld\nBalance: %d rur.", number, balance); - troyka_parsed = true; + dev_data->parsed_data, "\e#Troika\nNum: %ld\nBalance: %d rur.", number, balance); + troika_parsed = true; } while(false); - return troyka_parsed; + return troika_parsed; } diff --git a/lib/nfc/parsers/troika_parser.h b/lib/nfc/parsers/troika_parser.h new file mode 100644 index 000000000..2aae48d29 --- /dev/null +++ b/lib/nfc/parsers/troika_parser.h @@ -0,0 +1,9 @@ +#pragma once + +#include "nfc_supported_card.h" + +bool troika_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool troika_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool troika_parser_parse(NfcDeviceData* dev_data); diff --git a/lib/nfc/parsers/troyka_parser.h b/lib/nfc/parsers/troyka_parser.h deleted file mode 100644 index 445fe40e5..000000000 --- a/lib/nfc/parsers/troyka_parser.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "nfc_supported_card.h" - -bool troyka_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); - -bool troyka_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); - -bool troyka_parser_parse(NfcDeviceData* dev_data); diff --git a/lib/nfc/parsers/two_cities.c b/lib/nfc/parsers/two_cities.c new file mode 100644 index 000000000..d052dff19 --- /dev/null +++ b/lib/nfc/parsers/two_cities.c @@ -0,0 +1,171 @@ +#include "nfc_supported_card.h" +#include "plantain_parser.h" // For plantain-specific stuff + +#include +#include + +#include "furi_hal.h" + +static const MfClassicAuthContext two_cities_keys_4k[] = { + {.sector = 0, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 1, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 2, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 3, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 4, .key_a = 0xe56ac127dd45, .key_b = 0x19fc84a3784b}, + {.sector = 5, .key_a = 0x77dabc9825e1, .key_b = 0x9764fec3154a}, + {.sector = 6, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 7, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 8, .key_a = 0xa73f5dc1d333, .key_b = 0xe35173494a81}, + {.sector = 9, .key_a = 0x69a32f1c2f19, .key_b = 0x6b8bd9860763}, + {.sector = 10, .key_a = 0xea0fd73cb149, .key_b = 0x29c35fa068fb}, + {.sector = 11, .key_a = 0xc76bf71a2509, .key_b = 0x9ba241db3f56}, + {.sector = 12, .key_a = 0xacffffffffff, .key_b = 0x71f3a315ad26}, + {.sector = 13, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 14, .key_a = 0xffffffffffff, .key_b = 0xffffffffffff}, + {.sector = 15, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 16, .key_a = 0x72f96bdd3714, .key_b = 0x462225cd34cf}, + {.sector = 17, .key_a = 0x044ce1872bc3, .key_b = 0x8c90c70cff4a}, + {.sector = 18, .key_a = 0xbc2d1791dec1, .key_b = 0xca96a487de0b}, + {.sector = 19, .key_a = 0x8791b2ccb5c4, .key_b = 0xc956c3b80da3}, + {.sector = 20, .key_a = 0x8e26e45e7d65, .key_b = 0x8e65b3af7d22}, + {.sector = 21, .key_a = 0x0f318130ed18, .key_b = 0x0c420a20e056}, + {.sector = 22, .key_a = 0x045ceca15535, .key_b = 0x31bec3d9e510}, + {.sector = 23, .key_a = 0x9d993c5d4ef4, .key_b = 0x86120e488abf}, + {.sector = 24, .key_a = 0xc65d4eaa645b, .key_b = 0xb69d40d1a439}, + {.sector = 25, .key_a = 0x3a8a139c20b4, .key_b = 0x8818a9c5d406}, + {.sector = 26, .key_a = 0xbaff3053b496, .key_b = 0x4b7cb25354d3}, + {.sector = 27, .key_a = 0x7413b599c4ea, .key_b = 0xb0a2AAF3A1BA}, + {.sector = 28, .key_a = 0x0ce7cd2cc72b, .key_b = 0xfa1fbb3f0f1f}, + {.sector = 29, .key_a = 0x0be5fac8b06a, .key_b = 0x6f95887a4fd3}, + {.sector = 30, .key_a = 0x26973ea74321, .key_b = 0xd27058c6e2c7}, + {.sector = 31, .key_a = 0xeb0a8ff88ade, .key_b = 0x578a9ada41e3}, + {.sector = 32, .key_a = 0x7a396f0d633d, .key_b = 0xad2bdc097023}, + {.sector = 33, .key_a = 0xa3faa6daff67, .key_b = 0x7600e889adf9}, + {.sector = 34, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 35, .key_a = 0x2aa05ed1856f, .key_b = 0xeaac88e5dc99}, + {.sector = 36, .key_a = 0xa7141147d430, .key_b = 0xff16014fefc7}, + {.sector = 37, .key_a = 0x8a8d88151a00, .key_b = 0x038b5f9b5a2a}, + {.sector = 38, .key_a = 0xb27addfb64b0, .key_b = 0x152fd0c420a7}, + {.sector = 39, .key_a = 0x7259fa0197c6, .key_b = 0x5583698df085}, +}; + +bool two_cities_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + furi_assert(nfc_worker); + UNUSED(nfc_worker); + + if(nfc_worker->dev_data->mf_classic_data.type != MfClassicType4k) { + return false; + } + + uint8_t sector = 4; + uint8_t block = mf_classic_get_sector_trailer_block_num_by_sector(sector); + FURI_LOG_D("2cities", "Verifying sector %d", sector); + if(mf_classic_authenticate(tx_rx, block, 0xe56ac127dd45, MfClassicKeyA)) { + FURI_LOG_D("2cities", "Sector %d verified", sector); + return true; + } + return false; +} + +bool two_cities_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + furi_assert(nfc_worker); + + MfClassicReader reader = {}; + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + for(size_t i = 0; i < COUNT_OF(two_cities_keys_4k); i++) { + mf_classic_reader_add_sector( + &reader, + two_cities_keys_4k[i].sector, + two_cities_keys_4k[i].key_a, + two_cities_keys_4k[i].key_b); + FURI_LOG_T("2cities", "Added sector %d", two_cities_keys_4k[i].sector); + } + + return mf_classic_read_card(tx_rx, &reader, &nfc_worker->dev_data->mf_classic_data) == 40; +} + +bool two_cities_parser_parse(NfcDeviceData* dev_data) { + MfClassicData* data = &dev_data->mf_classic_data; + + // Verify key + MfClassicSectorTrailer* sec_tr = mf_classic_get_sector_trailer_by_sector(data, 4); + uint64_t key = nfc_util_bytes2num(sec_tr->key_a, 6); + if(key != two_cities_keys_4k[4].key_a) return false; + + // ===== + // PLANTAIN + // ===== + + // Point to block 0 of sector 4, value 0 + uint8_t* temp_ptr = &data->block[4 * 4].value[0]; + // Read first 4 bytes of block 0 of sector 4 from last to first and convert them to uint32_t + // 38 18 00 00 becomes 00 00 18 38, and equals to 6200 decimal + uint32_t balance = + ((temp_ptr[3] << 24) | (temp_ptr[2] << 16) | (temp_ptr[1] << 8) | temp_ptr[0]) / 100; + // Read card number + // Point to block 0 of sector 0, value 0 + temp_ptr = &data->block[0 * 4].value[0]; + // Read first 7 bytes of block 0 of sector 0 from last to first and convert them to uint64_t + // 80 5C 23 8A 16 31 04 becomes 04 31 16 8A 23 5C 80, and equals to 36130104729284868 decimal + uint8_t card_number_arr[7]; + for(size_t i = 0; i < 7; i++) { + card_number_arr[i] = temp_ptr[6 - i]; + } + // Copy card number to uint64_t + uint64_t card_number = 0; + for(size_t i = 0; i < 7; i++) { + card_number = (card_number << 8) | card_number_arr[i]; + } + // Convert card number to string + string_t card_number_str; + string_init(card_number_str); + // Should look like "361301047292848684" + // %llu doesn't work for some reason in sprintf, so we use string_push_uint64 instead + string_push_uint64(card_number, card_number_str); + // Add suffix with luhn checksum (1 digit) to the card number string + string_t card_number_suffix; + string_init(card_number_suffix); + + // The number to calculate the checksum on doesn't fit into uint64_t, idk + //uint8_t luhn_checksum = two_cities_calculate_luhn(card_number); + + // // Convert luhn checksum to string + // string_t luhn_checksum_str; + // string_init(luhn_checksum_str); + // string_push_uint64(luhn_checksum, luhn_checksum_str); + + string_cat_printf(card_number_suffix, "-"); + // FURI_LOG_D("plant4k", "Card checksum: %d", luhn_checksum); + string_cat_printf(card_number_str, string_get_cstr(card_number_suffix)); + // Free all not needed strings + string_clear(card_number_suffix); + // string_clear(luhn_checksum_str); + + // ===== + // --PLANTAIN-- + // ===== + // TROIKA + // ===== + + uint8_t* troika_temp_ptr = &data->block[8 * 4 + 1].value[5]; + uint16_t troika_balance = ((troika_temp_ptr[0] << 8) | troika_temp_ptr[1]) / 25; + troika_temp_ptr = &data->block[8 * 4].value[3]; + uint32_t troika_number = 0; + for(size_t i = 0; i < 4; i++) { + troika_number <<= 8; + troika_number |= troika_temp_ptr[i]; + } + troika_number >>= 4; + + string_printf( + dev_data->parsed_data, + "\e#Troika+Plantain\nPN: %s\nPB: %d rur.\nTN: %d\nTB: %d rur.\n", + string_get_cstr(card_number_str), + balance, + troika_number, + troika_balance); + string_clear(card_number_str); + + return true; +} diff --git a/lib/nfc/parsers/two_cities.h b/lib/nfc/parsers/two_cities.h new file mode 100644 index 000000000..e735bea8e --- /dev/null +++ b/lib/nfc/parsers/two_cities.h @@ -0,0 +1,9 @@ +#pragma once + +#include "nfc_supported_card.h" + +bool two_cities_parser_verify(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool two_cities_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx); + +bool two_cities_parser_parse(NfcDeviceData* dev_data); diff --git a/lib/subghz/protocols/bett.c b/lib/subghz/protocols/bett.c index 08080dc6c..c80702577 100644 --- a/lib/subghz/protocols/bett.c +++ b/lib/subghz/protocols/bett.c @@ -173,7 +173,7 @@ bool subghz_protocol_encoder_bett_deserialize(void* context, FlipperFormat* flip flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_bett_get_upload(instance); + if(!subghz_protocol_encoder_bett_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/came.c b/lib/subghz/protocols/came.c index 14c66b7fa..53d3d0788 100644 --- a/lib/subghz/protocols/came.c +++ b/lib/subghz/protocols/came.c @@ -162,7 +162,7 @@ bool subghz_protocol_encoder_came_deserialize(void* context, FlipperFormat* flip flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_came_get_upload(instance); + if(!subghz_protocol_encoder_came_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/came_atomo.c b/lib/subghz/protocols/came_atomo.c index bb0cf24e1..727cef8ee 100644 --- a/lib/subghz/protocols/came_atomo.c +++ b/lib/subghz/protocols/came_atomo.c @@ -79,7 +79,7 @@ void* subghz_protocol_encoder_came_atomo_alloc(SubGhzEnvironment* environment) { instance->generic.protocol_name = instance->base.protocol->name; instance->encoder.repeat = 10; - instance->encoder.size_upload = 1024; //approx max buffer size + instance->encoder.size_upload = 1024; //actual size about 760 instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); instance->encoder.is_running = false; return instance; @@ -114,7 +114,7 @@ static LevelDuration break; default: - furi_crash("SubGhz: ManchesterEncoderResult is incorrect."); + FURI_LOG_E(TAG, "SubGhz: ManchesterEncoderResult is incorrect."); break; } return level_duration_make(data.level, data.duration); diff --git a/lib/subghz/protocols/chamberlain_code.c b/lib/subghz/protocols/chamberlain_code.c index 51f2bcd32..66d230d13 100644 --- a/lib/subghz/protocols/chamberlain_code.c +++ b/lib/subghz/protocols/chamberlain_code.c @@ -155,7 +155,7 @@ static bool break; default: - furi_crash(TAG " unknown protocol."); + FURI_LOG_E(TAG, "Invalid bits count"); return false; break; } @@ -224,7 +224,7 @@ bool subghz_protocol_encoder_chamb_code_deserialize(void* context, FlipperFormat flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_chamb_code_get_upload(instance); + if(!subghz_protocol_encoder_chamb_code_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/clemsa.c b/lib/subghz/protocols/clemsa.c index 357a0b06d..337346934 100644 --- a/lib/subghz/protocols/clemsa.c +++ b/lib/subghz/protocols/clemsa.c @@ -173,7 +173,7 @@ bool subghz_protocol_encoder_clemsa_deserialize(void* context, FlipperFormat* fl flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_clemsa_get_upload(instance); + if(!subghz_protocol_encoder_clemsa_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/doitrand.c b/lib/subghz/protocols/doitrand.c index 9a0a58190..9122c1935 100644 --- a/lib/subghz/protocols/doitrand.c +++ b/lib/subghz/protocols/doitrand.c @@ -154,7 +154,7 @@ bool subghz_protocol_encoder_doitrand_deserialize(void* context, FlipperFormat* flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_doitrand_get_upload(instance); + if(!subghz_protocol_encoder_doitrand_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/gate_tx.c b/lib/subghz/protocols/gate_tx.c index d7efb3862..56c224aef 100644 --- a/lib/subghz/protocols/gate_tx.c +++ b/lib/subghz/protocols/gate_tx.c @@ -147,7 +147,7 @@ bool subghz_protocol_encoder_gate_tx_deserialize(void* context, FlipperFormat* f flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_gate_tx_get_upload(instance); + if(!subghz_protocol_encoder_gate_tx_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/holtek.c b/lib/subghz/protocols/holtek.c index 137ba85d3..5cd160633 100644 --- a/lib/subghz/protocols/holtek.c +++ b/lib/subghz/protocols/holtek.c @@ -160,7 +160,7 @@ bool subghz_protocol_encoder_holtek_deserialize(void* context, FlipperFormat* fl flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_holtek_get_upload(instance); + if(!subghz_protocol_encoder_holtek_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/honeywell_wdb.c b/lib/subghz/protocols/honeywell_wdb.c index e1e21426d..451a13f50 100644 --- a/lib/subghz/protocols/honeywell_wdb.c +++ b/lib/subghz/protocols/honeywell_wdb.c @@ -162,7 +162,7 @@ bool subghz_protocol_encoder_honeywell_wdb_deserialize( flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_honeywell_wdb_get_upload(instance); + if(!subghz_protocol_encoder_honeywell_wdb_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/hormann.c b/lib/subghz/protocols/hormann.c index 0197f59e6..d78bc9273 100644 --- a/lib/subghz/protocols/hormann.c +++ b/lib/subghz/protocols/hormann.c @@ -163,7 +163,7 @@ bool subghz_protocol_encoder_hormann_deserialize(void* context, FlipperFormat* f flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_hormann_get_upload(instance); + if(!subghz_protocol_encoder_hormann_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/ido.c b/lib/subghz/protocols/ido.c index 914468445..fca8fcd76 100644 --- a/lib/subghz/protocols/ido.c +++ b/lib/subghz/protocols/ido.c @@ -61,7 +61,8 @@ const SubGhzProtocolEncoder subghz_protocol_ido_encoder = { const SubGhzProtocol subghz_protocol_ido = { .name = SUBGHZ_PROTOCOL_IDO_NAME, .type = SubGhzProtocolTypeDynamic, - .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_AM | SubGhzProtocolFlag_Decodable, + .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_AM | SubGhzProtocolFlag_Decodable | + SubGhzProtocolFlag_Save, .decoder = &subghz_protocol_ido_decoder, .encoder = &subghz_protocol_ido_encoder, diff --git a/lib/subghz/protocols/intertechno_v3.c b/lib/subghz/protocols/intertechno_v3.c index e70bb8c8b..ffe52e875 100644 --- a/lib/subghz/protocols/intertechno_v3.c +++ b/lib/subghz/protocols/intertechno_v3.c @@ -179,7 +179,7 @@ bool subghz_protocol_encoder_intertechno_v3_deserialize( flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_intertechno_v3_get_upload(instance); + if(!subghz_protocol_encoder_intertechno_v3_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index ab1626a6f..818edb7e6 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -181,6 +181,12 @@ static bool subghz_protocol_keeloq_gen_data(SubGhzProtocolEncoderKeeloq* instanc instance->generic.serial, manufacture_code->key); hop = subghz_protocol_keeloq_common_encrypt(decrypt, man); break; + case KEELOQ_LEARNING_MAGIC_SERIAL_TYPE_1: + //Magic Serial Type 1 learning + man = subghz_protocol_keeloq_common_magic_serial_type1_learning( + fix, manufacture_code->key); + hop = subghz_protocol_keeloq_common_encrypt(decrypt, man); + break; case KEELOQ_LEARNING_UNKNOWN: if(kl_type == 1) { hop = @@ -347,7 +353,7 @@ bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* fl seed_data[sizeof(uint32_t) - i - 1] = (instance->generic.seed >> i * 8) & 0xFF; } if(!flipper_format_read_hex(flipper_format, "Seed", seed_data, sizeof(uint32_t))) { - FURI_LOG_E(TAG, "ENCODER: Missing Seed"); + FURI_LOG_D(TAG, "ENCODER: Missing Seed"); } instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; @@ -359,7 +365,7 @@ bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* fl flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_keeloq_get_upload(instance, instance->generic.btn); + if(!subghz_protocol_encoder_keeloq_get_upload(instance, instance->generic.btn)) break; if(!flipper_format_rewind(flipper_format)) { FURI_LOG_E(TAG, "Rewind error"); @@ -610,6 +616,16 @@ static uint8_t subghz_protocol_keeloq_check_remote_controller_selector( return 1; } break; + case KEELOQ_LEARNING_MAGIC_SERIAL_TYPE_1: + man = subghz_protocol_keeloq_common_magic_serial_type1_learning( + fix, manufacture_code->key); + decrypt = subghz_protocol_keeloq_common_decrypt(hop, man); + if(subghz_protocol_keeloq_check_decrypt(instance, decrypt, btn, end_serial)) { + *manufacture_name = string_get_cstr(manufacture_code->name); + mfname = *manufacture_name; + return 1; + } + break; case KEELOQ_LEARNING_UNKNOWN: // Simple Learning decrypt = subghz_protocol_keeloq_common_decrypt(hop, manufacture_code->key); @@ -619,6 +635,7 @@ static uint8_t subghz_protocol_keeloq_check_remote_controller_selector( kl_type = 1; return 1; } + // Check for mirrored man uint64_t man_rev = 0; uint64_t man_rev_byte = 0; @@ -626,6 +643,7 @@ static uint8_t subghz_protocol_keeloq_check_remote_controller_selector( man_rev_byte = (uint8_t)(manufacture_code->key >> i); man_rev = man_rev | man_rev_byte << (56 - i); } + decrypt = subghz_protocol_keeloq_common_decrypt(hop, man_rev); if(subghz_protocol_keeloq_check_decrypt(instance, decrypt, btn, end_serial)) { *manufacture_name = string_get_cstr(manufacture_code->name); @@ -633,6 +651,7 @@ static uint8_t subghz_protocol_keeloq_check_remote_controller_selector( kl_type = 1; return 1; } + //########################### // Normal Learning // https://phreakerclub.com/forum/showpost.php?p=43557&postcount=37 @@ -696,6 +715,7 @@ static uint8_t subghz_protocol_keeloq_check_remote_controller_selector( kl_type = 4; return 1; } + break; } } @@ -748,6 +768,16 @@ static uint8_t subghz_protocol_keeloq_check_remote_controller_selector( return 1; } break; + case KEELOQ_LEARNING_MAGIC_SERIAL_TYPE_1: + man = subghz_protocol_keeloq_common_magic_serial_type1_learning( + fix, manufacture_code->key); + decrypt = subghz_protocol_keeloq_common_decrypt(hop, man); + if(subghz_protocol_keeloq_check_decrypt(instance, decrypt, btn, end_serial)) { + *manufacture_name = string_get_cstr(manufacture_code->name); + mfname = *manufacture_name; + return 1; + } + break; case KEELOQ_LEARNING_UNKNOWN: // Simple Learning decrypt = subghz_protocol_keeloq_common_decrypt(hop, manufacture_code->key); @@ -836,6 +866,7 @@ static uint8_t subghz_protocol_keeloq_check_remote_controller_selector( kl_type = 4; return 1; } + break; } } @@ -925,7 +956,7 @@ bool subghz_protocol_decoder_keeloq_deserialize(void* context, FlipperFormat* fl seed_data[sizeof(uint32_t) - i - 1] = (instance->generic.seed >> i * 8) & 0xFF; } if(!flipper_format_read_hex(flipper_format, "Seed", seed_data, sizeof(uint32_t))) { - FURI_LOG_E(TAG, "DECODER: Missing Seed"); + FURI_LOG_D(TAG, "DECODER: Missing Seed"); } instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; diff --git a/lib/subghz/protocols/keeloq_common.c b/lib/subghz/protocols/keeloq_common.c index 5306002ba..ec976fe61 100644 --- a/lib/subghz/protocols/keeloq_common.c +++ b/lib/subghz/protocols/keeloq_common.c @@ -101,4 +101,15 @@ inline uint64_t uint64_t man = (uint64_t)subghz_protocol_keeloq_common_encrypt(seed, key) << 32 | subghz_protocol_keeloq_common_encrypt(lsb, key); return man; -} \ No newline at end of file +} +/** Magic_serial_type1 Learning + * @param data - serial number (28bit) + * @param man - magic man (64bit) + * @return manufacture for this serial number (64bit) + */ + +inline uint64_t + subghz_protocol_keeloq_common_magic_serial_type1_learning(uint32_t data, uint64_t man) { + return man | ((uint64_t)data << 40) | + ((uint64_t)(((data & 0xff) + ((data >> 8) & 0xFF)) & 0xFF) << 32); +} diff --git a/lib/subghz/protocols/keeloq_common.h b/lib/subghz/protocols/keeloq_common.h index 554afaa61..5d813de0f 100644 --- a/lib/subghz/protocols/keeloq_common.h +++ b/lib/subghz/protocols/keeloq_common.h @@ -22,6 +22,7 @@ #define KEELOQ_LEARNING_SECURE 3u #define KEELOQ_LEARNING_MAGIC_XOR_TYPE_1 4u #define KEELOQ_LEARNING_FAAC 5u +#define KEELOQ_LEARNING_MAGIC_SERIAL_TYPE_1 6u /** * Simple Learning Encrypt @@ -71,3 +72,11 @@ uint64_t subghz_protocol_keeloq_common_magic_xor_type1_learning(uint32_t data, u * @return man_learning for this fix number (64bit) */ uint64_t subghz_protocol_keeloq_common_faac_learning(const uint32_t seed, const uint64_t key); + +/** Magic_serial_type1 Learning + * @param data - serial number (28bit) + * @param man - magic man (64bit) + * @return manufacture for this serial number (64bit) + */ + +uint64_t subghz_protocol_keeloq_common_magic_serial_type1_learning(uint32_t data, uint64_t man); diff --git a/lib/subghz/protocols/linear.c b/lib/subghz/protocols/linear.c index 92ba02a8f..8f7aed794 100644 --- a/lib/subghz/protocols/linear.c +++ b/lib/subghz/protocols/linear.c @@ -165,7 +165,7 @@ bool subghz_protocol_encoder_linear_deserialize(void* context, FlipperFormat* fl flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_linear_get_upload(instance); + if(!subghz_protocol_encoder_linear_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/magellen.c b/lib/subghz/protocols/magellen.c index bb0600a74..6dcc83e56 100644 --- a/lib/subghz/protocols/magellen.c +++ b/lib/subghz/protocols/magellen.c @@ -168,7 +168,7 @@ bool subghz_protocol_encoder_magellen_deserialize(void* context, FlipperFormat* flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_magellen_get_upload(instance); + if(!subghz_protocol_encoder_magellen_get_upload(instance)) break; instance->encoder.is_running = true; res = true; @@ -381,7 +381,7 @@ static void subghz_protocol_magellen_get_event_serialize(uint8_t event, string_t "%s%s%s%s%s%s%s%s", ((event >> 4) & 0x1 ? (event & 0x1 ? " Open" : " Close") : (event & 0x1 ? " Motion" : " Ok")), - ((event >> 1) & 0x1 ? ", Tamper On (Alarm)" : ""), + ((event >> 1) & 0x1 ? ", Tamper On\n(Alarm)" : ""), ((event >> 2) & 0x1 ? ", ?" : ""), ((event >> 3) & 0x1 ? ", Power On" : ""), ((event >> 4) & 0x1 ? ", MT:Wireless_Reed" : ""), diff --git a/lib/subghz/protocols/megacode.c b/lib/subghz/protocols/megacode.c index 909e72171..1501580d8 100644 --- a/lib/subghz/protocols/megacode.c +++ b/lib/subghz/protocols/megacode.c @@ -193,7 +193,7 @@ bool subghz_protocol_encoder_megacode_deserialize(void* context, FlipperFormat* flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_megacode_get_upload(instance); + if(!subghz_protocol_encoder_megacode_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/nero_radio.c b/lib/subghz/protocols/nero_radio.c index 69326f5a0..b5a7e8c0e 100644 --- a/lib/subghz/protocols/nero_radio.c +++ b/lib/subghz/protocols/nero_radio.c @@ -172,7 +172,7 @@ bool subghz_protocol_encoder_nero_radio_deserialize(void* context, FlipperFormat flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_nero_radio_get_upload(instance); + if(!subghz_protocol_encoder_nero_radio_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/nero_sketch.c b/lib/subghz/protocols/nero_sketch.c index c93b36a53..66ee569c2 100644 --- a/lib/subghz/protocols/nero_sketch.c +++ b/lib/subghz/protocols/nero_sketch.c @@ -166,7 +166,7 @@ bool subghz_protocol_encoder_nero_sketch_deserialize(void* context, FlipperForma flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_nero_sketch_get_upload(instance); + if(!subghz_protocol_encoder_nero_sketch_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/nice_flo.c b/lib/subghz/protocols/nice_flo.c index 07b18e3ea..f07e9efcc 100644 --- a/lib/subghz/protocols/nice_flo.c +++ b/lib/subghz/protocols/nice_flo.c @@ -149,7 +149,7 @@ bool subghz_protocol_encoder_nice_flo_deserialize(void* context, FlipperFormat* flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_nice_flo_get_upload(instance); + if(!subghz_protocol_encoder_nice_flo_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/nice_flor_s.c b/lib/subghz/protocols/nice_flor_s.c index d5c3cd665..ef2c73053 100644 --- a/lib/subghz/protocols/nice_flor_s.c +++ b/lib/subghz/protocols/nice_flor_s.c @@ -96,7 +96,7 @@ void* subghz_protocol_encoder_nice_flor_s_alloc(SubGhzEnvironment* environment) TAG, "Loading rainbow table from %s", instance->nice_flor_s_rainbow_table_file_name); } instance->encoder.repeat = 10; - instance->encoder.size_upload = 2976; //max upload 186*16 = 2976 + instance->encoder.size_upload = 1800; //wrong!! upload 186*16 = 2976 - actual size about 1716 instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); instance->encoder.is_running = false; return instance; diff --git a/lib/subghz/protocols/oregon2.c b/lib/subghz/protocols/oregon2.c new file mode 100644 index 000000000..84bb38be4 --- /dev/null +++ b/lib/subghz/protocols/oregon2.c @@ -0,0 +1,324 @@ +#include "oregon2.h" +#include "../blocks/const.h" +#include "../blocks/decoder.h" +#include "../blocks/generic.h" +#include "../blocks/math.h" +#include +#include +#include + +#define TAG "SubGhzProtocolOregon2" + +static const SubGhzBlockConst oregon2_const = { + .te_long = 1000, + .te_short = 500, + .te_delta = 200, + .min_count_bit_for_found = 32, +}; + +#define OREGON2_PREAMBLE_BITS 19 +#define OREGON2_PREAMBLE_MASK ((1 << (OREGON2_PREAMBLE_BITS + 1)) - 1) +#define OREGON2_SENSOR_ID(d) (((d) >> 16) & 0xFFFF) +#define OREGON2_CHECKSUM_BITS 8 + +// 15 ones + 0101 (inverted A) +#define OREGON2_PREAMBLE 0b1111111111111110101 + +// bit indicating the low battery +#define OREGON2_FLAG_BAT_LOW 0x4 + +struct SubGhzProtocolDecoderOregon2 { + SubGhzProtocolDecoderBase base; + + SubGhzBlockDecoder decoder; + SubGhzBlockGeneric generic; + ManchesterState manchester_state; + bool prev_bit; + bool have_bit; + + uint8_t var_bits; + uint32_t var_data; +}; + +typedef struct SubGhzProtocolDecoderOregon2 SubGhzProtocolDecoderOregon2; + +typedef enum { + Oregon2DecoderStepReset = 0, + Oregon2DecoderStepFoundPreamble, + Oregon2DecoderStepVarData, +} Oregon2DecoderStep; + +void* subghz_protocol_decoder_oregon2_alloc(SubGhzEnvironment* environment) { + UNUSED(environment); + SubGhzProtocolDecoderOregon2* instance = malloc(sizeof(SubGhzProtocolDecoderOregon2)); + instance->base.protocol = &subghz_protocol_oregon2; + instance->generic.protocol_name = instance->base.protocol->name; + return instance; +} + +void subghz_protocol_decoder_oregon2_free(void* context) { + furi_assert(context); + SubGhzProtocolDecoderOregon2* instance = context; + free(instance); +} + +void subghz_protocol_decoder_oregon2_reset(void* context) { + furi_assert(context); + SubGhzProtocolDecoderOregon2* instance = context; + instance->decoder.parser_step = Oregon2DecoderStepReset; + instance->decoder.decode_data = 0UL; + instance->decoder.decode_count_bit = 0; + manchester_advance( + instance->manchester_state, ManchesterEventReset, &instance->manchester_state, NULL); + instance->have_bit = false; + instance->var_data = 0; + instance->var_bits = 0; +} + +static ManchesterEvent level_and_duration_to_event(bool level, uint32_t duration) { + bool is_long = false; + + if(DURATION_DIFF(duration, oregon2_const.te_long) < oregon2_const.te_delta) { + is_long = true; + } else if(DURATION_DIFF(duration, oregon2_const.te_short) < oregon2_const.te_delta) { + is_long = false; + } else { + return ManchesterEventReset; + } + + if(level) + return is_long ? ManchesterEventLongHigh : ManchesterEventShortHigh; + else + return is_long ? ManchesterEventLongLow : ManchesterEventShortLow; +} + +// From sensor id code return amount of bits in variable section +static uint8_t oregon2_sensor_id_var_bits(uint16_t sensor_id) { + if(sensor_id == 0xEC40) return 16; + return 0; +} + +void subghz_protocol_decoder_oregon2_feed(void* context, bool level, uint32_t duration) { + furi_assert(context); + SubGhzProtocolDecoderOregon2* instance = context; + // oregon v2.1 signal is inverted + ManchesterEvent event = level_and_duration_to_event(!level, duration); + bool data; + + // low-level bit sequence decoding + if(event == ManchesterEventReset) { + instance->decoder.parser_step = Oregon2DecoderStepReset; + instance->have_bit = false; + instance->decoder.decode_data = 0UL; + instance->decoder.decode_count_bit = 0; + } + if(manchester_advance(instance->manchester_state, event, &instance->manchester_state, &data)) { + if(instance->have_bit) { + if(!instance->prev_bit && data) { + subghz_protocol_blocks_add_bit(&instance->decoder, 1); + } else if(instance->prev_bit && !data) { + subghz_protocol_blocks_add_bit(&instance->decoder, 0); + } else { + subghz_protocol_decoder_oregon2_reset(context); + } + instance->have_bit = false; + } else { + instance->prev_bit = data; + instance->have_bit = true; + } + } + + switch(instance->decoder.parser_step) { + case Oregon2DecoderStepReset: + // waiting for fixed oregon2 preamble + if(instance->decoder.decode_count_bit >= OREGON2_PREAMBLE_BITS && + ((instance->decoder.decode_data & OREGON2_PREAMBLE_MASK) == OREGON2_PREAMBLE)) { + instance->decoder.parser_step = Oregon2DecoderStepFoundPreamble; + instance->decoder.decode_count_bit = 0; + instance->decoder.decode_data = 0UL; + } + break; + case Oregon2DecoderStepFoundPreamble: + // waiting for fixed oregon2 data + if(instance->decoder.decode_count_bit == 32) { + instance->generic.data = instance->decoder.decode_data; + instance->generic.data_count_bit = instance->decoder.decode_count_bit; + instance->decoder.decode_data = 0UL; + instance->decoder.decode_count_bit = 0; + + // reverse nibbles in decoded data + instance->generic.data = (instance->generic.data & 0x55555555) << 1 | + (instance->generic.data & 0xAAAAAAAA) >> 1; + instance->generic.data = (instance->generic.data & 0x33333333) << 2 | + (instance->generic.data & 0xCCCCCCCC) >> 2; + + instance->var_bits = + oregon2_sensor_id_var_bits(OREGON2_SENSOR_ID(instance->generic.data)); + + if(!instance->var_bits) { + // sensor is not supported, stop decoding, but showing the decoded fixed part + instance->decoder.parser_step = Oregon2DecoderStepReset; + if(instance->base.callback) + instance->base.callback(&instance->base, instance->base.context); + } else { + instance->decoder.parser_step = Oregon2DecoderStepVarData; + } + } + break; + case Oregon2DecoderStepVarData: + // waiting for variable (sensor-specific data) + if(instance->decoder.decode_count_bit == instance->var_bits + OREGON2_CHECKSUM_BITS) { + instance->var_data = instance->decoder.decode_data & 0xFFFFFFFF; + + // reverse nibbles in var data + instance->var_data = (instance->var_data & 0x55555555) << 1 | + (instance->var_data & 0xAAAAAAAA) >> 1; + instance->var_data = (instance->var_data & 0x33333333) << 2 | + (instance->var_data & 0xCCCCCCCC) >> 2; + + instance->decoder.parser_step = Oregon2DecoderStepReset; + if(instance->base.callback) + instance->base.callback(&instance->base, instance->base.context); + } + break; + } +} + +uint8_t subghz_protocol_decoder_oregon2_get_hash_data(void* context) { + furi_assert(context); + SubGhzProtocolDecoderOregon2* instance = context; + return subghz_protocol_blocks_get_hash_data( + &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); +} + +bool subghz_protocol_decoder_oregon2_serialize( + void* context, + FlipperFormat* flipper_format, + SubGhzPresetDefinition* preset) { + furi_assert(context); + SubGhzProtocolDecoderOregon2* instance = context; + if(!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) return false; + uint32_t temp = instance->var_bits; + if(!flipper_format_write_uint32(flipper_format, "VarBits", &temp, 1)) { + FURI_LOG_E(TAG, "Error adding VarBits"); + return false; + } + if(!flipper_format_write_hex( + flipper_format, + "VarData", + (const uint8_t*)&instance->var_data, + sizeof(instance->var_data))) { + FURI_LOG_E(TAG, "Error adding VarData"); + return false; + } + return true; +} + +bool subghz_protocol_decoder_oregon2_deserialize(void* context, FlipperFormat* flipper_format) { + furi_assert(context); + SubGhzProtocolDecoderOregon2* instance = context; + bool ret = false; + uint32_t temp_data; + do { + if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { + break; + } + if(!flipper_format_read_uint32(flipper_format, "VarBits", &temp_data, 1)) { + FURI_LOG_E(TAG, "Missing VarLen"); + break; + } + instance->var_bits = (uint8_t)temp_data; + if(!flipper_format_read_hex( + flipper_format, + "VarData", + (uint8_t*)&instance->var_data, + sizeof(instance->var_data))) { + FURI_LOG_E(TAG, "Missing VarData"); + break; + } + if(instance->generic.data_count_bit != oregon2_const.min_count_bit_for_found) { + FURI_LOG_E(TAG, "Wrong number of bits in key: %d", instance->generic.data_count_bit); + break; + } + ret = true; + } while(false); + return ret; +} + +// append string of the variable data +static void + oregon2_var_data_append_string(uint16_t sensor_id, uint32_t var_data, string_t output) { + uint32_t val; + + if(sensor_id == 0xEC40) { + val = ((var_data >> 4) & 0xF) * 10 + ((var_data >> 8) & 0xF); + string_cat_printf( + output, + "Temp: %s%d.%d C\r\n", + (var_data & 0xF) ? "-" : "+", + val, + (uint32_t)(var_data >> 12) & 0xF); + } +} + +static void oregon2_append_check_sum(uint32_t fix_data, uint32_t var_data, string_t output) { + uint8_t sum = fix_data & 0xF; + uint8_t ref_sum = var_data & 0xFF; + var_data >>= 8; + + for(uint8_t i = 1; i < 8; i++) { + fix_data >>= 4; + var_data >>= 4; + sum += (fix_data & 0xF) + (var_data & 0xF); + } + + // swap calculated sum nibbles + sum = (((sum >> 4) & 0xF) | (sum << 4)) & 0xFF; + if(sum == ref_sum) + string_cat_printf(output, "Sum ok: 0x%hhX", ref_sum); + else + string_cat_printf(output, "Sum err: 0x%hhX vs 0x%hhX", ref_sum, sum); +} + +void subghz_protocol_decoder_oregon2_get_string(void* context, string_t output) { + furi_assert(context); + SubGhzProtocolDecoderOregon2* instance = context; + uint16_t sensor_id = OREGON2_SENSOR_ID(instance->generic.data); + string_cat_printf( + output, + "%s\r\n" + "ID: 0x%04lX, ch: %d%s, rc: 0x%02lX\r\n", + instance->generic.protocol_name, + (uint32_t)sensor_id, + (uint32_t)(instance->generic.data >> 12) & 0xF, + ((instance->generic.data & OREGON2_FLAG_BAT_LOW) ? ", low bat" : ""), + (uint32_t)(instance->generic.data >> 4) & 0xFF); + + if(instance->var_bits > 0) { + oregon2_var_data_append_string( + sensor_id, instance->var_data >> OREGON2_CHECKSUM_BITS, output); + oregon2_append_check_sum((uint32_t)instance->generic.data, instance->var_data, output); + } +} + +const SubGhzProtocolDecoder subghz_protocol_oregon2_decoder = { + .alloc = subghz_protocol_decoder_oregon2_alloc, + .free = subghz_protocol_decoder_oregon2_free, + + .feed = subghz_protocol_decoder_oregon2_feed, + .reset = subghz_protocol_decoder_oregon2_reset, + + .get_hash_data = subghz_protocol_decoder_oregon2_get_hash_data, + .serialize = subghz_protocol_decoder_oregon2_serialize, + .deserialize = subghz_protocol_decoder_oregon2_deserialize, + .get_string = subghz_protocol_decoder_oregon2_get_string, +}; + +const SubGhzProtocol subghz_protocol_oregon2 = { + .name = SUBGHZ_PROTOCOL_OREGON2_NAME, + .type = SubGhzProtocolTypeStatic, + .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_AM | SubGhzProtocolFlag_Decodable | + SubGhzProtocolFlag_Load | SubGhzProtocolFlag_Save, + + .decoder = &subghz_protocol_oregon2_decoder, +}; diff --git a/lib/subghz/protocols/oregon2.h b/lib/subghz/protocols/oregon2.h new file mode 100644 index 000000000..981b25999 --- /dev/null +++ b/lib/subghz/protocols/oregon2.h @@ -0,0 +1,5 @@ +#pragma once + +#include "base.h" +#define SUBGHZ_PROTOCOL_OREGON2_NAME "Oregon2" +extern const SubGhzProtocol subghz_protocol_oregon2; diff --git a/lib/subghz/protocols/phoenix_v2.c b/lib/subghz/protocols/phoenix_v2.c index 3d2796e44..d680b2e62 100644 --- a/lib/subghz/protocols/phoenix_v2.c +++ b/lib/subghz/protocols/phoenix_v2.c @@ -150,7 +150,7 @@ bool subghz_protocol_encoder_phoenix_v2_deserialize(void* context, FlipperFormat flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_phoenix_v2_get_upload(instance); + if(!subghz_protocol_encoder_phoenix_v2_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/princeton.c b/lib/subghz/protocols/princeton.c index 2ddfa2cb6..a5b8134d8 100644 --- a/lib/subghz/protocols/princeton.c +++ b/lib/subghz/protocols/princeton.c @@ -167,7 +167,7 @@ bool subghz_protocol_encoder_princeton_deserialize(void* context, FlipperFormat* flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - subghz_protocol_encoder_princeton_get_upload(instance); + if(!subghz_protocol_encoder_princeton_get_upload(instance)) break; instance->encoder.is_running = true; res = true; diff --git a/lib/subghz/protocols/registry.c b/lib/subghz/protocols/registry.c index 8bb45e9ad..453fa747a 100644 --- a/lib/subghz/protocols/registry.c +++ b/lib/subghz/protocols/registry.c @@ -12,9 +12,7 @@ const SubGhzProtocol* subghz_protocol_registry[] = { &subghz_protocol_chamb_code, &subghz_protocol_power_smart, &subghz_protocol_marantec, &subghz_protocol_bett, &subghz_protocol_doitrand, &subghz_protocol_phoenix_v2, &subghz_protocol_honeywell_wdb, &subghz_protocol_magellen, &subghz_protocol_intertechno_v3, - &subghz_protocol_clemsa - -}; + &subghz_protocol_clemsa, &subghz_protocol_oregon2}; const SubGhzProtocol* subghz_protocol_registry_get_by_name(const char* name) { for(size_t i = 0; i < subghz_protocol_registry_count(); i++) { diff --git a/lib/subghz/protocols/registry.h b/lib/subghz/protocols/registry.h index 96a6f2c45..44f54b6ca 100644 --- a/lib/subghz/protocols/registry.h +++ b/lib/subghz/protocols/registry.h @@ -36,6 +36,7 @@ #include "magellen.h" #include "intertechno_v3.h" #include "clemsa.h" +#include "oregon2.h" #ifdef __cplusplus extern "C" { diff --git a/lib/subghz/protocols/scher_khan.c b/lib/subghz/protocols/scher_khan.c index 1c044e9db..89f2937d8 100644 --- a/lib/subghz/protocols/scher_khan.c +++ b/lib/subghz/protocols/scher_khan.c @@ -69,7 +69,8 @@ const SubGhzProtocolEncoder subghz_protocol_scher_khan_encoder = { const SubGhzProtocol subghz_protocol_scher_khan = { .name = SUBGHZ_PROTOCOL_SCHER_KHAN_NAME, .type = SubGhzProtocolTypeDynamic, - .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_FM | SubGhzProtocolFlag_Decodable, + .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_FM | SubGhzProtocolFlag_Decodable | + SubGhzProtocolFlag_Save, .decoder = &subghz_protocol_scher_khan_decoder, .encoder = &subghz_protocol_scher_khan_encoder, diff --git a/lib/subghz/protocols/somfy_keytis.c b/lib/subghz/protocols/somfy_keytis.c index 7a3b2186f..0307a78fa 100644 --- a/lib/subghz/protocols/somfy_keytis.c +++ b/lib/subghz/protocols/somfy_keytis.c @@ -68,7 +68,7 @@ const SubGhzProtocol subghz_protocol_somfy_keytis = { .name = SUBGHZ_PROTOCOL_SOMFY_KEYTIS_NAME, .type = SubGhzProtocolTypeDynamic, .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_868 | SubGhzProtocolFlag_AM | - SubGhzProtocolFlag_Decodable, + SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Save, .decoder = &subghz_protocol_somfy_keytis_decoder, .encoder = &subghz_protocol_somfy_keytis_encoder, diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index b9aac5777..d0b2f82a8 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -67,7 +67,7 @@ const SubGhzProtocol subghz_protocol_somfy_telis = { .name = SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME, .type = SubGhzProtocolTypeDynamic, .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_868 | SubGhzProtocolFlag_AM | - SubGhzProtocolFlag_Decodable, + SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Save, .decoder = &subghz_protocol_somfy_telis_decoder, .encoder = &subghz_protocol_somfy_telis_encoder, diff --git a/lib/subghz/protocols/star_line.c b/lib/subghz/protocols/star_line.c index 434cf81e3..3a09e40e7 100644 --- a/lib/subghz/protocols/star_line.c +++ b/lib/subghz/protocols/star_line.c @@ -74,7 +74,7 @@ const SubGhzProtocol subghz_protocol_star_line = { .name = SUBGHZ_PROTOCOL_STAR_LINE_NAME, .type = SubGhzProtocolTypeDynamic, .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_AM | SubGhzProtocolFlag_Decodable | - SubGhzProtocolFlag_Load | SubGhzProtocolFlag_Save | SubGhzProtocolFlag_Send, + SubGhzProtocolFlag_Load | SubGhzProtocolFlag_Save, .decoder = &subghz_protocol_star_line_decoder, .encoder = &subghz_protocol_star_line_encoder, diff --git a/lib/toolbox/m_cstr_dup.h b/lib/toolbox/m_cstr_dup.h new file mode 100644 index 000000000..2bc35c877 --- /dev/null +++ b/lib/toolbox/m_cstr_dup.h @@ -0,0 +1,17 @@ +#pragma once +#include + +#define M_INIT_DUP(a) ((a) = strdup("")) +#define M_SET_DUP(a, b) (M_CHECK_DEFAULT_TYPE(a), free((void*)a), (a) = strdup(b)) +#define M_CLEAR_DUP(a) (free((void*)a)) + +#define M_CSTR_DUP_OPLIST \ + (INIT(M_INIT_DUP), \ + INIT_SET(M_SET_DUP), \ + SET(M_SET_DUP), \ + CLEAR(M_CLEAR_DUP), \ + HASH(m_core_cstr_hash), \ + EQUAL(M_CSTR_EQUAL), \ + CMP(strcmp), \ + TYPE(const char*), \ + OUT_STR(M_CSTR_OUT_STR)) diff --git a/lib/toolbox/random_name.c b/lib/toolbox/random_name.c index 985906756..b5924c8db 100644 --- a/lib/toolbox/random_name.c +++ b/lib/toolbox/random_name.c @@ -21,6 +21,12 @@ void set_random_name(char* name, uint8_t max_name_size) { "thick", "great", "my", + "mini", + "ultra", + "haupt", + "small", + "random", + "strange", }; const char* suffix[] = { @@ -32,6 +38,14 @@ void set_random_name(char* name, uint8_t max_name_size) { "burer", "sidorovich", "habar", + "radar", + "borov", + "pda", + "konserva", + "aptechka", + "door", + "thing", + "stuff", }; // sus is not (sus)pect - this is about super sus uint8_t prefix_i = rand() % COUNT_OF(prefix); diff --git a/scripts/flipper/utils/cdc.py b/scripts/flipper/utils/cdc.py index 081705cc2..7047db2a6 100644 --- a/scripts/flipper/utils/cdc.py +++ b/scripts/flipper/utils/cdc.py @@ -14,4 +14,4 @@ def resolve_port(logger, portname: str = "auto"): logger.error("Failed to find connected Flipper") elif len(flippers) > 1: logger.error("More than one Flipper is attached") - logger.error("Failed to guess which port to use. Specify --port") + logger.error("Failed to guess which port to use") diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 4c4b7279c..35cac7742 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -3,5 +3,5 @@ heatshrink2==0.11.0 Pillow==9.1.1 grpcio==1.47.0 grpcio-tools==1.47.0 -protobuf==3.20.1 +protobuf==3.20.2 python3-protobuf==2.5.0 diff --git a/scripts/serial_cli.py b/scripts/serial_cli.py index e07e6bfb4..441bc7cc8 100644 --- a/scripts/serial_cli.py +++ b/scripts/serial_cli.py @@ -1,13 +1,25 @@ import logging import subprocess from flipper.utils.cdc import resolve_port +import os +import sys def main(): logger = logging.getLogger() if not (port := resolve_port(logger, "auto")): + logger.error("Is Flipper connected over USB and isn't in DFU mode?") return 1 - subprocess.call(["python3", "-m", "serial.tools.miniterm", "--raw", port, "230400"]) + subprocess.call( + [ + os.path.basename(sys.executable), + "-m", + "serial.tools.miniterm", + "--raw", + port, + "230400", + ] + ) if __name__ == "__main__": diff --git a/scripts/toolchain/fbtenv.cmd b/scripts/toolchain/fbtenv.cmd index 1403837d9..5eaf16f94 100644 --- a/scripts/toolchain/fbtenv.cmd +++ b/scripts/toolchain/fbtenv.cmd @@ -32,6 +32,7 @@ if not "%REAL_TOOLCHAIN_VERSION%" == "%FLIPPER_TOOLCHAIN_VERSION%" ( set "HOME=%USERPROFILE%" set "PYTHONHOME=%FBT_TOOLCHAIN_ROOT%\python" set "PYTHONPATH=" +set "PYTHONNOUSERSITE=1" set "PATH=%FBT_TOOLCHAIN_ROOT%\python;%FBT_TOOLCHAIN_ROOT%\bin;%FBT_TOOLCHAIN_ROOT%\protoc\bin;%FBT_TOOLCHAIN_ROOT%\openocd\bin;%PATH%" set "PROMPT=(fbt) %PROMPT%" diff --git a/scripts/toolchain/fbtenv.sh b/scripts/toolchain/fbtenv.sh index cfbf25a4d..98d496810 100755 --- a/scripts/toolchain/fbtenv.sh +++ b/scripts/toolchain/fbtenv.sh @@ -40,6 +40,13 @@ fbtenv_restore_env() elif [ -n "${PROMPT:-""}" ]; then PROMPT="$(echo "$PROMPT" | sed 's/\[fbt\]//g')"; fi + + PYTHONNOUSERSITE="$SAVED_PYTHONNOUSERSITE"; + PYTHONPATH="$SAVED_PYTHONPATH"; + + unset SAVED_PYTHONNOUSERSITE; + unset SAVED_PYTHONPATH; + unset SCRIPT_PATH; unset FBT_TOOLCHAIN_VERSION; unset FBT_TOOLCHAIN_PATH; @@ -286,6 +293,12 @@ fbtenv_main() PATH="$TOOLCHAIN_ARCH_DIR/bin:$PATH"; PATH="$TOOLCHAIN_ARCH_DIR/protobuf/bin:$PATH"; PATH="$TOOLCHAIN_ARCH_DIR/openocd/bin:$PATH"; + + SAVED_PYTHONNOUSERSITE="${PYTHONNOUSERSITE:-""}"; + SAVED_PYTHONPATH="${PYTHONPATH:-""}"; + + PYTHONNOUSERSITE=1; + PYTHONPATH=; } fbtenv_main "${1:-""}"; diff --git a/site_scons/environ.scons b/site_scons/environ.scons index f1668ab16..cb370ef26 100644 --- a/site_scons/environ.scons +++ b/site_scons/environ.scons @@ -12,7 +12,15 @@ forward_os_env = { "PATH": os.environ["PATH"], } # Proxying CI environment to child processes & scripts -for env_value_name in ("WORKFLOW_BRANCH_OR_TAG", "DIST_SUFFIX", "CUSTOM_FLIPPER_NAME", "HOME", "APPDATA"): +for env_value_name in ( + "WORKFLOW_BRANCH_OR_TAG", + "DIST_SUFFIX", + "CUSTOM_FLIPPER_NAME", + "HOME", + "APPDATA", + "PYTHONHOME", + "PYTHONNOUSERSITE", +): if environ_value := os.environ.get(env_value_name, None): forward_os_env[env_value_name] = environ_value diff --git a/site_scons/extapps.scons b/site_scons/extapps.scons index cfffda04f..4cb5e35cf 100644 --- a/site_scons/extapps.scons +++ b/site_scons/extapps.scons @@ -63,7 +63,10 @@ def build_app_as_external(env, appdef): extapps["dist"][appdef.appid] = (appdef.fap_category, compact_elf) -apps_to_build_as_faps = [FlipperAppType.PLUGIN, FlipperAppType.EXTERNAL] +apps_to_build_as_faps = [ + FlipperAppType.PLUGIN, + FlipperAppType.EXTERNAL, +] if appenv["DEBUG_TOOLS"]: apps_to_build_as_faps.append(FlipperAppType.DEBUG) diff --git a/site_scons/fbt/appmanifest.py b/site_scons/fbt/appmanifest.py index a41717d6a..a0ab5e7c6 100644 --- a/site_scons/fbt/appmanifest.py +++ b/site_scons/fbt/appmanifest.py @@ -36,11 +36,16 @@ class FlipperApplication: icon: Optional[str] = None order: int = 0 sdk_headers: List[str] = field(default_factory=list) - version: Tuple[int] = field(default_factory=lambda: (0, 0)) + # .fap-specific sources: List[str] = field(default_factory=lambda: ["*.c*"]) + fap_version: Tuple[int] = field(default_factory=lambda: (0, 0)) fap_icon: Optional[str] = None fap_libs: List[str] = field(default_factory=list) fap_category: str = "" + fap_description: str = "" + fap_author: str = "" + fap_weburl: str = "" + # Internally used by fbt _appdir: Optional[object] = None _apppath: Optional[str] = None diff --git a/site_scons/fbt/elfmanifest.py b/site_scons/fbt/elfmanifest.py index 2f54810d9..313a64c09 100644 --- a/site_scons/fbt/elfmanifest.py +++ b/site_scons/fbt/elfmanifest.py @@ -66,8 +66,8 @@ def assemble_manifest_data( ) image_data = image.data - app_version_as_int = ((app_manifest.version[0] & 0xFFFF) << 16) | ( - app_manifest.version[1] & 0xFFFF + app_version_as_int = ((app_manifest.fap_version[0] & 0xFFFF) << 16) | ( + app_manifest.fap_version[1] & 0xFFFF ) data = ElfManifestBaseHeader( diff --git a/site_scons/fbt/sdk.py b/site_scons/fbt/sdk.py index b8ae7fb76..3d4a17b2f 100644 --- a/site_scons/fbt/sdk.py +++ b/site_scons/fbt/sdk.py @@ -329,7 +329,6 @@ class SdkCache: self.sdk = ApiEntries() self.disabled_entries = set() self.new_entries = set() - self.loaded_dirty = False self.loaded_dirty_version = False self.version_action = VersionBump.NONE @@ -340,8 +339,7 @@ class SdkCache: return ( self.version != SdkVersion(0, 0) and self.version_action == VersionBump.NONE - and not self.loaded_dirty - and not self.new_entries + and not self._have_pending_entries() ) def _filter_enabled(self, sdk_entries): @@ -388,21 +386,12 @@ class SdkCache: if self._load_version_only: raise Exception("Only SDK version was loaded, cannot save") - version_is_clean = True - if self.loaded_dirty: - # There are still new entries and version was already updated - version_is_clean = False - if self.version_action == VersionBump.MINOR: self.version = SdkVersion(self.version.major, self.version.minor + 1) - version_is_clean = False elif self.version_action == VersionBump.MAJOR: self.version = SdkVersion(self.version.major + 1, 0) - version_is_clean = False - if version_is_clean: - print(f"API version {self.version} is up to date") - else: + if self._have_pending_entries(): self.new_entries.add(self.version) print( f"API version is still WIP: {self.version}. Review the changes and re-run command." @@ -418,16 +407,23 @@ class SdkCache: ) ) ) + else: + print(f"API version {self.version} is up to date") - if not version_is_clean or self.loaded_dirty_version: - # Regenerate cache file + regenerate_csv = ( + self.loaded_dirty_version + or self._have_pending_entries() + or self.version_action != VersionBump.NONE + ) + + if regenerate_csv: str_cache_entries = [self.version] name_getter = operator.attrgetter("name") str_cache_entries.extend(sorted(self.sdk.headers, key=name_getter)) str_cache_entries.extend(sorted(self.sdk.functions, key=name_getter)) str_cache_entries.extend(sorted(self.sdk.variables, key=name_getter)) - with open(self.cache_file_name, "w", newline="") as f: + with open(self.cache_file_name, "wt", newline="") as f: writer = csv.DictWriter(f, fieldnames=SdkCache.CSV_FIELD_NAMES) writer.writeheader() @@ -476,13 +472,20 @@ class SdkCache: f"Cannot load symbol cache '{self.cache_file_name}'! File does not exist" ) - with open(self.cache_file_name, "r") as f: + with open(self.cache_file_name, "rt") as f: reader = csv.DictReader(f) for row in reader: self._process_entry(row) if self._load_version_only and row.get("entry") == SdkVersion.csv_type: break - self.loaded_dirty = bool(self.new_entries) + + def _have_pending_entries(self) -> bool: + return any( + filter( + lambda e: not isinstance(e, SdkVersion), + self.new_entries, + ) + ) def sync_sets( self, known_set: Set[Any], new_set: Set[Any], update_version: bool = True diff --git a/site_scons/site_tools/fbt_sdk.py b/site_scons/site_tools/fbt_sdk.py index 26d663650..f6c2d452e 100644 --- a/site_scons/site_tools/fbt_sdk.py +++ b/site_scons/site_tools/fbt_sdk.py @@ -15,6 +15,7 @@ from fbt.sdk import SdkCollector, SdkCache def prebuild_sdk_emitter(target, source, env): target.append(env.ChangeFileExtension(target[0], ".d")) + target.append(env.ChangeFileExtension(target[0], ".i.c")) return target, source