Merge remote-tracking branch 'origin/subbrute-deep-refactor' into subbrute-deep-refactor

This commit is contained in:
DerSkythe 2022-09-26 01:10:21 +04:00
commit 87654e60b8
194 changed files with 5585 additions and 2690 deletions

1
.github/CODEOWNERS vendored Normal file
View file

@ -0,0 +1 @@
* @xMasterX

View file

@ -9,6 +9,10 @@
"type": "command", "type": "command",
"command": "shellCommand.execute", "command": "shellCommand.execute",
"args": { "args": {
"useSingleResult": true,
"env": {
"PATH": "${workspaceFolder};${env:PATH}"
},
"command": "./fbt get_blackmagic", "command": "./fbt get_blackmagic",
"description": "Get Blackmagic device", "description": "Get Blackmagic device",
} }

View file

@ -1,16 +1,20 @@
### New changes ### New changes
* Picopass plugin fixed (bug with mbedtls lib fixed by hedger in OFW PR 1742) * Infrared: Updated universal remote assets (by @Amec0e)
* PR: Fix SubGHz last used settings (PR 70 by derskythe) * OFW PR: SubGHz: Read RAW - datetime in default names (+ format changed) (OFW PR 1772 by Skorpionm)
* PR: Random UID for detect reader mode - changes each time when you exit NFC app and launch it (PR 69 by h4sh5) * OFW: Text input overwrite max size template
* OFW PR: Dummy mode (aka dumb mode) (OFW PR 1739 by nminaylov) * OFW: Remove unused headers
* OFW PR: picopass se identify (OFW PR 1701 by pcunning) * OFW: ELF-Loader: C++ plugin support, loader overhaul.
* OFW PR: faploader api extension and lib fixes (OFW PR 1742 by hedger) * 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.

View file

@ -49,7 +49,7 @@ See changelog in releases for latest updates!
- Keeloq [Not ALL systems supported yet!] - Keeloq [Not ALL systems supported yet!]
- Nice Flor S - Nice Flor S
- Security+ v1 & v2 - Security+ v1 & v2
- Star Line - Star Line (saving only)
## Support us so we can buy equipment and develop new features ## Support us so we can buy equipment and develop new features
* ETH/BSC/ERC20-Tokens: `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a` * 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) - 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 -> 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 -> 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 # Instructions
## [- How to install firmware](https://github.com/Eng1n33r/flipperzero-firmware/blob/dev/documentation/HowToInstall.md) ## [- How to install firmware](https://github.com/Eng1n33r/flipperzero-firmware/blob/dev/documentation/HowToInstall.md)
@ -167,4 +166,4 @@ Games:
- `site_scons` - Build helpers - `site_scons` - Build helpers
- `scripts` - Supplementary scripts and python libraries home - `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.

View file

@ -44,6 +44,8 @@ distenv = coreenv.Clone(
"target extended-remote ${GDBREMOTE}", "target extended-remote ${GDBREMOTE}",
"-ex", "-ex",
"set confirm off", "set confirm off",
"-ex",
"set pagination off",
], ],
GDBOPTS_BLACKMAGIC=[ GDBOPTS_BLACKMAGIC=[
"-ex", "-ex",
@ -234,10 +236,19 @@ distenv.PhonyTarget(
distenv.PhonyTarget( distenv.PhonyTarget(
"debug_other", "debug_other",
"${GDBPYCOM}", "${GDBPYCOM}",
GDBPYOPTS='-ex "source debug/PyCortexMDebug/PyCortexMDebug.py" ', GDBOPTS="${GDBOPTS_BASE}",
GDBREMOTE="${OPENOCD_GDB_PIPE}", 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 # Just start OpenOCD
distenv.PhonyTarget( distenv.PhonyTarget(
"openocd", "openocd",

View file

@ -3,6 +3,7 @@
#include <storage/storage.h> #include <storage/storage.h>
#include <lib/flipper_format/flipper_format.h> #include <lib/flipper_format/flipper_format.h>
#include <lib/nfc/protocols/nfca.h> #include <lib/nfc/protocols/nfca.h>
#include <lib/nfc/helpers/mf_classic_dict.h>
#include <lib/digital_signal/digital_signal.h> #include <lib/digital_signal/digital_signal.h>
#include <lib/flipper_format/flipper_format_i.h> #include <lib/flipper_format/flipper_format_i.h>
@ -170,10 +171,59 @@ MU_TEST(nfc_digital_signal_test) {
"NFC long digital signal test failed\r\n"); "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) { MU_TEST_SUITE(nfc) {
nfc_test_alloc(); nfc_test_alloc();
MU_RUN_TEST(nfc_digital_signal_test); MU_RUN_TEST(nfc_digital_signal_test);
MU_RUN_TEST(mf_classic_dict_test);
nfc_test_free(); nfc_test_free();
} }

View file

@ -13,7 +13,7 @@
#define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") #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 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_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 #define TEST_TIMEOUT 10000
static SubGhzEnvironment* environment_handler; static SubGhzEnvironment* environment_handler;
@ -434,6 +434,13 @@ MU_TEST(subghz_decoder_clemsa_test) {
"Test decoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n"); "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 //test encoders
MU_TEST(subghz_encoder_princeton_test) { MU_TEST(subghz_encoder_princeton_test) {
mu_assert( mu_assert(
@ -595,6 +602,7 @@ MU_TEST_SUITE(subghz) {
MU_RUN_TEST(subghz_decoder_magellen_test); MU_RUN_TEST(subghz_decoder_magellen_test);
MU_RUN_TEST(subghz_decoder_intertechno_v3_test); MU_RUN_TEST(subghz_decoder_intertechno_v3_test);
MU_RUN_TEST(subghz_decoder_clemsa_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_princeton_test);
MU_RUN_TEST(subghz_encoder_came_test); MU_RUN_TEST(subghz_encoder_came_test);

View file

@ -15,6 +15,23 @@ App(
"archive", "archive",
"clock", "clock",
"unirfremix", "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",
], ],
) )

View file

@ -16,6 +16,7 @@ static const char* tab_default_paths[] = {
[ArchiveTabInfrared] = ANY_PATH("infrared"), [ArchiveTabInfrared] = ANY_PATH("infrared"),
[ArchiveTabBadUsb] = ANY_PATH("badusb"), [ArchiveTabBadUsb] = ANY_PATH("badusb"),
[ArchiveTabU2f] = "/app:u2f", [ArchiveTabU2f] = "/app:u2f",
[ArchiveTabApps] = ANY_PATH("apps"),
[ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX, [ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX,
}; };
@ -27,6 +28,7 @@ static const char* known_ext[] = {
[ArchiveFileTypeInfrared] = ".ir", [ArchiveFileTypeInfrared] = ".ir",
[ArchiveFileTypeBadUsb] = ".txt", [ArchiveFileTypeBadUsb] = ".txt",
[ArchiveFileTypeU2f] = "?", [ArchiveFileTypeU2f] = "?",
[ArchiveFileTypeApps] = ".fap",
[ArchiveFileTypeUpdateManifest] = ".fuf", [ArchiveFileTypeUpdateManifest] = ".fuf",
[ArchiveFileTypeFolder] = "?", [ArchiveFileTypeFolder] = "?",
[ArchiveFileTypeUnknown] = "*", [ArchiveFileTypeUnknown] = "*",
@ -41,6 +43,7 @@ static const ArchiveFileTypeEnum known_type[] = {
[ArchiveTabInfrared] = ArchiveFileTypeInfrared, [ArchiveTabInfrared] = ArchiveFileTypeInfrared,
[ArchiveTabBadUsb] = ArchiveFileTypeBadUsb, [ArchiveTabBadUsb] = ArchiveFileTypeBadUsb,
[ArchiveTabU2f] = ArchiveFileTypeU2f, [ArchiveTabU2f] = ArchiveFileTypeU2f,
[ArchiveTabApps] = ArchiveFileTypeApps,
[ArchiveTabBrowser] = ArchiveFileTypeUnknown, [ArchiveTabBrowser] = ArchiveFileTypeUnknown,
}; };

View file

@ -13,6 +13,7 @@ typedef enum {
ArchiveFileTypeInfrared, ArchiveFileTypeInfrared,
ArchiveFileTypeBadUsb, ArchiveFileTypeBadUsb,
ArchiveFileTypeU2f, ArchiveFileTypeU2f,
ArchiveFileTypeApps,
ArchiveFileTypeUpdateManifest, ArchiveFileTypeUpdateManifest,
ArchiveFileTypeFolder, ArchiveFileTypeFolder,
ArchiveFileTypeUnknown, ArchiveFileTypeUnknown,

View file

@ -42,10 +42,7 @@ ARRAY_DEF(
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
// Using in applications/archive/views/archive_browser_view.c // Using in applications/archive/views/archive_browser_view.c
static void archive_menu_add_item( static void archive_menu_add_item(ArchiveContextMenuItem_t* obj, string_t text, uint32_t event) {
ArchiveContextMenuItem_t* obj,
string_t text,
uint32_t event) {
string_init_move(obj->text, text); string_init_move(obj->text, text);
obj->event = event; obj->event = event;
} }

View file

@ -19,6 +19,7 @@ static const char* flipper_app_name[] = {
[ArchiveFileTypeInfrared] = "Infrared", [ArchiveFileTypeInfrared] = "Infrared",
[ArchiveFileTypeBadUsb] = "Bad USB", [ArchiveFileTypeBadUsb] = "Bad USB",
[ArchiveFileTypeU2f] = "U2F", [ArchiveFileTypeU2f] = "U2F",
[ArchiveFileTypeApps] = "Applications",
[ArchiveFileTypeUpdateManifest] = "UpdaterApp", [ArchiveFileTypeUpdateManifest] = "UpdaterApp",
}; };
@ -132,7 +133,7 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) {
case ArchiveBrowserEventFileMenuRename: case ArchiveBrowserEventFileMenuRename:
if(favorites) { if(favorites) {
browser->callback(ArchiveBrowserEventEnterFavMove, browser->context); 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 { } else {
// Added ability to rename files and folders // Added ability to rename files and folders
archive_show_file_menu(browser, false); archive_show_file_menu(browser, false);

View file

@ -37,7 +37,11 @@ void archive_scene_info_on_enter(void* context) {
// Directory path // Directory path
path_extract_dirname(string_get_cstr(current->path), dirname); 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 // File size
FileInfo fileinfo; FileInfo fileinfo;
@ -60,7 +64,7 @@ void archive_scene_info_on_enter(void* context) {
string_get_cstr(dirname)); string_get_cstr(dirname));
} }
widget_add_text_box_element( 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 // This one to return and cursor select this file
path_extract_filename_no_ext(string_get_cstr(current->path), filename); path_extract_filename_no_ext(string_get_cstr(current->path), filename);

View file

@ -16,6 +16,7 @@ static const char* ArchiveTabNames[] = {
[ArchiveTabInfrared] = "Infrared", [ArchiveTabInfrared] = "Infrared",
[ArchiveTabBadUsb] = "Bad USB", [ArchiveTabBadUsb] = "Bad USB",
[ArchiveTabU2f] = "U2F", [ArchiveTabU2f] = "U2F",
[ArchiveTabApps] = "Apps",
[ArchiveTabBrowser] = "Browser", [ArchiveTabBrowser] = "Browser",
}; };
@ -27,6 +28,7 @@ static const Icon* ArchiveItemIcons[] = {
[ArchiveFileTypeInfrared] = &I_ir_10px, [ArchiveFileTypeInfrared] = &I_ir_10px,
[ArchiveFileTypeBadUsb] = &I_badusb_10px, [ArchiveFileTypeBadUsb] = &I_badusb_10px,
[ArchiveFileTypeU2f] = &I_u2f_10px, [ArchiveFileTypeU2f] = &I_u2f_10px,
[ArchiveFileTypeApps] = &I_Apps_10px,
[ArchiveFileTypeUpdateManifest] = &I_update_10px, [ArchiveFileTypeUpdateManifest] = &I_update_10px,
[ArchiveFileTypeFolder] = &I_dir_10px, [ArchiveFileTypeFolder] = &I_dir_10px,
[ArchiveFileTypeUnknown] = &I_unknown_10px, [ArchiveFileTypeUnknown] = &I_unknown_10px,

View file

@ -27,6 +27,7 @@ typedef enum {
ArchiveTabIButton, ArchiveTabIButton,
ArchiveTabBadUsb, ArchiveTabBadUsb,
ArchiveTabU2f, ArchiveTabU2f,
ArchiveTabApps,
ArchiveTabBrowser, ArchiveTabBrowser,
ArchiveTabTotal, ArchiveTabTotal,
} ArchiveTabEnum; } ArchiveTabEnum;

View file

@ -33,5 +33,4 @@ typedef enum {
typedef struct { typedef struct {
TimeFormat time_format; TimeFormat time_format;
DateFormat date_format; DateFormat date_format;
uint8_t increment_precision;
} ClockSettings; } ClockSettings;

View file

@ -25,7 +25,7 @@ static bool
FlipperApplication* app = flipper_application_alloc(loader->storage, &hashtable_api_interface); FlipperApplication* app = flipper_application_alloc(loader->storage, &hashtable_api_interface);
FlipperApplicationPreloadStatus preload_res = FlipperApplicationPreloadStatus preload_res =
flipper_application_preload(app, string_get_cstr(path)); flipper_application_preload_manifest(app, string_get_cstr(path));
bool load_success = false; bool load_success = false;

View file

@ -33,8 +33,6 @@ static void infrared_scene_universal_common_hide_popup(Infrared* infrared) {
void infrared_scene_universal_common_on_enter(void* context) { void infrared_scene_universal_common_on_enter(void* context) {
Infrared* infrared = 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)); 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; Infrared* infrared = context;
ButtonPanel* button_panel = infrared->button_panel; ButtonPanel* button_panel = infrared->button_panel;
view_stack_remove_view(infrared->view_stack, button_panel_get_view(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); button_panel_reset(button_panel);
} }

View file

@ -16,7 +16,7 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) {
LfRfidReadViewModel* model = _model; LfRfidReadViewModel* model = _model;
canvas_set_color(canvas, ColorBlack); 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); canvas_set_font(canvas, FontPrimary);

View file

@ -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) { int32_t nfc_app(void* p) {
if(!nfc_is_hal_ready()) return 0;
Nfc* nfc = nfc_alloc(); Nfc* nfc = nfc_alloc();
char* args = p; char* args = p;

View file

@ -33,8 +33,14 @@
#include <nfc/scenes/nfc_scene.h> #include <nfc/scenes/nfc_scene.h>
#include <nfc/helpers/nfc_custom_event.h> #include <nfc/helpers/nfc_custom_event.h>
#include <dialogs/dialogs.h>
#include "rpc/rpc_app.h" #include "rpc/rpc_app.h"
#include <m-array.h>
ARRAY_DEF(MfClassicUserKeys, char*, M_PTR_OPLIST);
#define NFC_TEXT_STORE_SIZE 128 #define NFC_TEXT_STORE_SIZE 128
typedef enum { typedef enum {
@ -58,6 +64,7 @@ struct Nfc {
char text_store[NFC_TEXT_STORE_SIZE + 1]; char text_store[NFC_TEXT_STORE_SIZE + 1];
string_t text_box_store; string_t text_box_store;
uint8_t byte_input_store[6]; uint8_t byte_input_store[6];
MfClassicUserKeys_t mfc_key_strs; // Used in MFC key listing
void* rpc_ctx; void* rpc_ctx;
NfcRpcState rpc_state; NfcRpcState rpc_state;

View file

@ -32,6 +32,9 @@ ADD_SCENE(nfc, mf_classic_menu, MfClassicMenu)
ADD_SCENE(nfc, mf_classic_emulate, MfClassicEmulate) ADD_SCENE(nfc, mf_classic_emulate, MfClassicEmulate)
ADD_SCENE(nfc, mf_classic_keys, MfClassicKeys) ADD_SCENE(nfc, mf_classic_keys, MfClassicKeys)
ADD_SCENE(nfc, mf_classic_keys_add, MfClassicKeysAdd) 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, mf_classic_dict_attack, MfClassicDictAttack)
ADD_SCENE(nfc, emv_read_success, EmvReadSuccess) ADD_SCENE(nfc, emv_read_success, EmvReadSuccess)
ADD_SCENE(nfc, emv_menu, EmvMenu) ADD_SCENE(nfc, emv_menu, EmvMenu)

View file

@ -25,8 +25,13 @@ bool nfc_scene_delete_success_on_event(void* context, SceneManagerEvent event) {
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventViewExit) { if(event.event == NfcCustomEventViewExit) {
consumed = scene_manager_search_and_switch_to_previous_scene( if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneMfClassicKeys)) {
nfc->scene_manager, NfcSceneFileSelect); 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; return consumed;

View file

@ -47,7 +47,9 @@ void nfc_scene_device_info_on_enter(void* context) {
} }
string_clear(country_name); 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); string_set(temp_str, nfc->dev->dev_data.parsed_data);
} }

View file

@ -31,7 +31,10 @@ bool nfc_scene_dict_not_found_on_event(void* context, SceneManagerEvent event) {
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventViewExit) { 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( consumed = scene_manager_search_and_switch_to_previous_scene(
nfc->scene_manager, NfcSceneExtraActions); nfc->scene_manager, NfcSceneExtraActions);
} else { } else {

View file

@ -17,7 +17,7 @@ void nfc_scene_extra_actions_on_enter(void* context) {
submenu_add_item( submenu_add_item(
submenu, submenu,
"Mf Classic Keys", "Mifare Classic Keys",
SubmenuIndexMfClassicKeys, SubmenuIndexMfClassicKeys,
nfc_scene_extra_actions_submenu_callback, nfc_scene_extra_actions_submenu_callback,
nfc); nfc);

View file

@ -26,15 +26,25 @@ void nfc_scene_mf_classic_keys_on_enter(void* context) {
} }
widget_add_string_element( 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]; 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); 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_string_element(nfc->widget, 0, 32, AlignLeft, AlignTop, FontSecondary, temp_str);
widget_add_button_element( widget_add_button_element(
nfc->widget, GuiButtonTypeCenter, "Add", nfc_scene_mf_classic_keys_widget_callback, nfc); 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); 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) { if(event.event == GuiButtonTypeCenter) {
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicKeysAdd); scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicKeysAdd);
consumed = true; 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;
} }
} }

View file

@ -29,15 +29,16 @@ bool nfc_scene_mf_classic_keys_add_on_event(void* context, SceneManagerEvent eve
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventByteInputDone) { if(event.event == NfcCustomEventByteInputDone) {
// Add key to dict // Add key to dict
bool key_added = false;
MfClassicDict* dict = mf_classic_dict_alloc(MfClassicDictTypeUser); MfClassicDict* dict = mf_classic_dict_alloc(MfClassicDictTypeUser);
if(dict) { if(dict) {
if(mf_classic_dict_add_key(dict, nfc->byte_input_store)) { if(mf_classic_dict_is_key_present(dict, nfc->byte_input_store)) {
key_added = true; 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 { } else {
scene_manager_next_scene(nfc->scene_manager, NfcSceneDictNotFound); scene_manager_next_scene(nfc->scene_manager, NfcSceneDictNotFound);
} }

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -7,6 +7,13 @@ enum SubmenuIndex {
SubmenuIndexDynamic, // dynamic indexes start here 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) { MifareDesfireApplication* nfc_scene_mf_desfire_app_get_app(Nfc* nfc) {
uint32_t app_idx = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfDesfireApp) >> uint32_t app_idx = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfDesfireApp) >>
1; 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) { void nfc_scene_mf_desfire_app_on_enter(void* context) {
Nfc* nfc = context; Nfc* nfc = context;
Submenu* submenu = nfc->submenu;
MifareDesfireApplication* app = nfc_scene_mf_desfire_app_get_app(nfc); MifareDesfireApplication* app = nfc_scene_mf_desfire_app_get_app(nfc);
if(!app) { if(!app) {
popup_set_icon(nfc->popup, 5, 5, &I_WarningDolphin_45x42); popup_set_icon(nfc->popup, 5, 5, &I_WarningDolphin_45x42);
popup_set_header(nfc->popup, "Internal Error!", 55, 12, AlignLeft, AlignBottom); popup_set_header(nfc->popup, "Empty card!", 55, 12, AlignLeft, AlignBottom);
popup_set_text( popup_set_callback(nfc->popup, nfc_scene_mf_desfire_popup_callback);
nfc->popup, popup_set_context(nfc->popup, nfc);
"No app selected.\nThis should\nnever happen,\nplease file a bug.", popup_set_timeout(nfc->popup, 3000);
55, popup_enable_timeout(nfc->popup);
15, popup_set_text(nfc->popup, "No application\nfound.", 55, 15, AlignLeft, AlignTop);
AlignLeft,
AlignTop);
view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup);
FURI_LOG_E(TAG, "Bad state. No app selected?"); } else {
return; 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); uint16_t cap = NFC_TEXT_STORE_SIZE;
char* buf = nfc->text_store;
submenu_add_item( int idx = SubmenuIndexDynamic;
submenu, "App info", SubmenuIndexAppInfo, nfc_scene_mf_desfire_app_submenu_callback, nfc); for(MifareDesfireFile* file = app->file_head; file; file = file->next) {
int size = snprintf(buf, cap, "File %d", file->id);
uint16_t cap = NFC_TEXT_STORE_SIZE; if(size < 0 || size >= cap) {
char* buf = nfc->text_store; FURI_LOG_W(
int idx = SubmenuIndexDynamic; TAG,
for(MifareDesfireFile* file = app->file_head; file; file = file->next) { "Exceeded NFC_TEXT_STORE_SIZE when preparing file id strings; menu truncated");
int size = snprintf(buf, cap, "File %d", file->id); break;
if(size < 0 || size >= cap) { }
FURI_LOG_W( char* label = buf;
TAG, cap -= size + 1;
"Exceeded NFC_TEXT_STORE_SIZE when preparing file id strings; menu truncated"); buf += size + 1;
break; 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) { 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); uint32_t state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfDesfireApp);
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeCustom) {
MifareDesfireApplication* app = nfc_scene_mf_desfire_app_get_app(nfc); if(event.event == NfcCustomEventViewExit) {
TextBox* text_box = nfc->text_box; consumed = scene_manager_previous_scene(nfc->scene_manager);
string_reset(nfc->text_box_store);
if(event.event == SubmenuIndexAppInfo) {
mf_df_cat_application_info(app, nfc->text_box_store);
} else { } else {
uint16_t index = event.event - SubmenuIndexDynamic; MifareDesfireApplication* app = nfc_scene_mf_desfire_app_get_app(nfc);
MifareDesfireFile* file = app->file_head; TextBox* text_box = nfc->text_box;
for(int i = 0; file && i < index; i++) { string_reset(nfc->text_box_store);
file = file->next; 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) { text_box_set_text(text_box, string_get_cstr(nfc->text_box_store));
return false; scene_manager_set_scene_state(nfc->scene_manager, NfcSceneMfDesfireApp, state | 1);
} view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox);
mf_df_cat_file(file, nfc->text_box_store); 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) { } else if(event.type == SceneManagerEventTypeBack) {
if(state & 1) { if(state & 1) {
view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); 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; Nfc* nfc = context;
// Clear views // Clear views
popup_reset(nfc->popup);
text_box_reset(nfc->text_box); text_box_reset(nfc->text_box);
string_reset(nfc->text_box_store); string_reset(nfc->text_box_store);
submenu_reset(nfc->submenu); submenu_reset(nfc->submenu);

View file

@ -27,7 +27,7 @@ void nfc_scene_mf_ultralight_read_auth_set_state(Nfc* nfc, NfcSceneMfUlReadState
popup_reset(nfc->popup); popup_reset(nfc->popup);
popup_set_text( popup_set_text(
nfc->popup, "Apply card to\nFlipper's back", 97, 24, AlignCenter, AlignTop); 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) { } else if(state == NfcSceneMfUlReadStateReading) {
popup_reset(nfc->popup); popup_reset(nfc->popup);
popup_set_header( popup_set_header(

View file

@ -34,15 +34,19 @@ void nfc_scene_mf_ultralight_read_success_on_enter(void* context) {
nfc); nfc);
string_t temp_str; string_t temp_str;
string_init_printf(temp_str, "\e#%s\n", nfc_mf_ul_type(mf_ul_data->type, true)); if(string_size(nfc->dev->dev_data.parsed_data)) {
string_cat_printf(temp_str, "UID:"); string_init_set(temp_str, nfc->dev->dev_data.parsed_data);
for(size_t i = 0; i < data->uid_len; i++) { } else {
string_cat_printf(temp_str, " %02X", data->uid[i]); string_init_printf(temp_str, "\e#%s\n", nfc_mf_ul_type(mf_ul_data->type, true));
} string_cat_printf(temp_str, "UID:");
string_cat_printf( for(size_t i = 0; i < data->uid_len; i++) {
temp_str, "\nPages Read: %d/%d", mf_ul_data->data_read / 4, mf_ul_data->data_size / 4); string_cat_printf(temp_str, " %02X", data->uid[i]);
if(mf_ul_data->data_read != mf_ul_data->data_size) { }
string_cat_printf(temp_str, "\nPassword-protected pages!"); 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)); widget_add_text_scroll_element(widget, 0, 0, 128, 52, string_get_cstr(temp_str));
string_clear(temp_str); string_clear(temp_str);

View file

@ -20,7 +20,7 @@ void nfc_scene_mf_ultralight_unlock_menu_on_enter(void* context) {
scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfUltralightUnlockMenu); scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfUltralightUnlockMenu);
submenu_add_item( submenu_add_item(
submenu, submenu,
"Enter Password Manually", "Enter PWD Manually",
SubmenuIndexMfUlUnlockMenuManual, SubmenuIndexMfUlUnlockMenuManual,
nfc_scene_mf_ultralight_unlock_menu_submenu_callback, nfc_scene_mf_ultralight_unlock_menu_submenu_callback,
nfc); nfc);

View file

@ -26,7 +26,7 @@ void nfc_scene_read_set_state(Nfc* nfc, NfcSceneReadState state) {
popup_reset(nfc->popup); popup_reset(nfc->popup);
popup_set_text( popup_set_text(
nfc->popup, "Apply card to\nFlipper's back", 97, 24, AlignCenter, AlignTop); 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) { } else if(state == NfcSceneReadStateReading) {
popup_reset(nfc->popup); popup_reset(nfc->popup);
popup_set_header( popup_set_header(

View file

@ -11,7 +11,7 @@ void nfc_scene_restore_original_confirm_on_enter(void* context) {
DialogEx* dialog_ex = nfc->dialog_ex; DialogEx* dialog_ex = nfc->dialog_ex;
dialog_ex_set_header(dialog_ex, "Restore Card Data?", 64, 0, AlignCenter, AlignTop); 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_set_text(
dialog_ex, "It will be returned\nto its original state.", 47, 21, AlignLeft, AlignTop); dialog_ex, "It will be returned\nto its original state.", 47, 21, AlignLeft, AlignTop);
dialog_ex_set_left_button_text(dialog_ex, "Cancel"); dialog_ex_set_left_button_text(dialog_ex, "Cancel");

View file

@ -27,7 +27,10 @@ bool nfc_scene_save_success_on_event(void* context, SceneManagerEvent event) {
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventViewExit) { 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( consumed = scene_manager_search_and_switch_to_previous_scene(
nfc->scene_manager, NfcSceneSavedMenu); nfc->scene_manager, NfcSceneSavedMenu);
} else { } else {

View file

@ -91,7 +91,9 @@ bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
bool application_info_present = false; bool application_info_present = false;
if(dev_data->protocol == NfcDeviceProtocolEMV) { if(dev_data->protocol == NfcDeviceProtocolEMV) {
application_info_present = true; 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); application_info_present = nfc_supported_card_verify_and_parse(dev_data);
} }

View file

@ -225,6 +225,8 @@ bool subghz_scene_decode_raw_on_event(void* context, SceneManagerEvent event) {
subghz_file_encoder_worker_free(file_worker_encoder); subghz_file_encoder_worker_free(file_worker_encoder);
subghz->state_notifications = SubGhzNotificationStateIDLE; subghz->state_notifications = SubGhzNotificationStateIDLE;
scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet);
scene_manager_search_and_switch_to_previous_scene( scene_manager_search_and_switch_to_previous_scene(
subghz->scene_manager, SubGhzSceneMoreRAW); subghz->scene_manager, SubGhzSceneMoreRAW);
consumed = true; consumed = true;

View file

@ -50,8 +50,8 @@ bool subghz_scene_need_saving_on_event(void* context, SceneManagerEvent event) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
subghz_preset_init( subghz_preset_init(
subghz, subghz,
string_get_cstr(subghz->last_setting->preset_name), "AM650",
subghz->last_setting->frequency, subghz_setting_get_default_frequency(subghz->setting),
NULL, NULL,
0); 0);
scene_manager_search_and_switch_to_previous_scene( scene_manager_search_and_switch_to_previous_scene(

View file

@ -113,12 +113,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeCustom) {
switch(event.event) { switch(event.event) {
case SubGhzCustomEventViewReadRAWBack: 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 //Stop TX
if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) { if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) {
subghz_tx_stop(subghz); 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) || if((subghz->txrx->rx_key_state == SubGhzRxKeyStateAddKey) ||
(subghz->txrx->rx_key_state == SubGhzRxKeyStateBack)) { (subghz->txrx->rx_key_state == SubGhzRxKeyStateBack)) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateExit; subghz->txrx->rx_key_state = SubGhzRxKeyStateExit;
subghz->current_scene = SubGhzSceneNeedSaving;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
} else { } else {
//Restore default setting //Restore default setting
subghz_preset_init( subghz_preset_init(
subghz, subghz,
string_get_cstr(subghz->last_setting->preset_name), "AM650",
subghz->last_setting->frequency, subghz_setting_get_default_frequency(subghz->setting),
NULL, NULL,
0); 0);
if(!scene_manager_search_and_switch_to_previous_scene( 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)) { subghz->scene_manager, SubGhzSceneStart)) {
scene_manager_stop(subghz->scene_manager); scene_manager_stop(subghz->scene_manager);
view_dispatcher_stop(subghz->view_dispatcher); view_dispatcher_stop(subghz->view_dispatcher);
} else {
subghz->current_scene = SubGhzSceneStart;
} }
} else {
subghz->current_scene = SubGhzSceneSaved;
} }
} }
consumed = true; consumed = true;
@ -181,8 +170,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
case SubGhzCustomEventViewReadRAWConfig: case SubGhzCustomEventViewReadRAWConfig:
scene_manager_set_scene_state( scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet); 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); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig);
consumed = true; consumed = true;
break; break;
@ -204,7 +191,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
scene_manager_set_scene_state( scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet); subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet);
subghz->txrx->rx_key_state = SubGhzRxKeyStateRAWLoad; subghz->txrx->rx_key_state = SubGhzRxKeyStateRAWLoad;
subghz->current_scene = SubGhzSceneMoreRAW;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneMoreRAW); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneMoreRAW);
consumed = true; consumed = true;
} else { } else {
@ -224,7 +210,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) { if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateBack; subghz->txrx->rx_key_state = SubGhzRxKeyStateBack;
subghz->current_scene = SubGhzSceneShowOnlyRx;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
} else { } else {
DOLPHIN_DEED(DolphinDeedSubGhzSend); DOLPHIN_DEED(DolphinDeedSubGhzSend);
@ -284,7 +269,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
case SubGhzCustomEventViewReadRAWREC: case SubGhzCustomEventViewReadRAWREC:
if(subghz->txrx->rx_key_state != SubGhzRxKeyStateIDLE) { if(subghz->txrx->rx_key_state != SubGhzRxKeyStateIDLE) {
subghz->current_scene = SubGhzSceneNeedSaving;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
} else { } else {
//subghz_get_preset_name(subghz, subghz->error_str); //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; subghz->txrx->rx_key_state = SubGhzRxKeyStateAddKey;
} else { } else {
string_set_str(subghz->error_str, "Function requires\nan SD card."); string_set_str(subghz->error_str, "Function requires\nan SD card.");
subghz->current_scene = SubGhzSceneShowError;
scene_manager_next_scene(subghz->scene_manager, 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( scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSetRAW); subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSetRAW);
subghz->txrx->rx_key_state = SubGhzRxKeyStateBack; subghz->txrx->rx_key_state = SubGhzRxKeyStateBack;
subghz->current_scene = SubGhzSceneSaveName;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName);
} }
consumed = true; consumed = true;

View file

@ -1,8 +1,6 @@
#include "../subghz_i.h" #include "../subghz_i.h"
#include "../views/receiver.h" #include "../views/receiver.h"
#define TAG "SubGhzSceneReceiver"
const NotificationSequence subghz_sequence_rx = { const NotificationSequence subghz_sequence_rx = {
&message_green_255, &message_green_255,
@ -100,18 +98,12 @@ static void subghz_scene_add_to_history_callback(
void subghz_scene_receiver_on_enter(void* context) { void subghz_scene_receiver_on_enter(void* context) {
SubGhz* subghz = context; SubGhz* subghz = context;
subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver);
string_t str_buff; string_t str_buff;
string_init(str_buff); string_init(str_buff);
if(subghz->txrx->rx_key_state == SubGhzRxKeyStateIDLE) { if(subghz->txrx->rx_key_state == SubGhzRxKeyStateIDLE) {
subghz_preset_init( subghz_preset_init(
subghz, subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0);
string_get_cstr(subghz->last_setting->preset_name),
subghz->last_setting->frequency,
NULL,
0);
subghz_history_reset(subghz->txrx->history); subghz_history_reset(subghz->txrx->history);
subghz->txrx->rx_key_state = SubGhzRxKeyStateStart; subghz->txrx->rx_key_state = SubGhzRxKeyStateStart;
} }
@ -143,8 +135,6 @@ void subghz_scene_receiver_on_enter(void* context) {
} }
if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { (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_begin(
subghz, subghz,
subghz_setting_get_preset_data_by_name( 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) { if(event.type == SceneManagerEventTypeCustom) {
switch(event.event) { switch(event.event) {
case SubGhzCustomEventViewReceiverBack: 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 // Stop CC1101 Rx
subghz->state_notifications = SubGhzNotificationStateIDLE; subghz->state_notifications = SubGhzNotificationStateIDLE;
if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) { 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) { if(subghz->txrx->rx_key_state == SubGhzRxKeyStateAddKey) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateExit; subghz->txrx->rx_key_state = SubGhzRxKeyStateExit;
subghz->current_scene = SubGhzSceneNeedSaving;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
} else { } else {
subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
subghz_preset_init( subghz_preset_init(
subghz, subghz,
string_get_cstr(subghz->last_setting->preset_name), "AM650",
subghz->last_setting->frequency, subghz_setting_get_default_frequency(subghz->setting),
NULL, NULL,
0); 0);
subghz->current_scene = SubGhzSceneStart;
scene_manager_search_and_switch_to_previous_scene( scene_manager_search_and_switch_to_previous_scene(
subghz->scene_manager, SubGhzSceneStart); subghz->scene_manager, SubGhzSceneStart);
} }
@ -199,7 +181,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
case SubGhzCustomEventViewReceiverOK: case SubGhzCustomEventViewReceiverOK:
subghz->txrx->idx_menu_chosen = subghz->txrx->idx_menu_chosen =
subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); subghz_view_receiver_get_idx_menu(subghz->subghz_receiver);
subghz->current_scene = SubGhzSceneReceiverInfo;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverInfo); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverInfo);
consumed = true; consumed = true;
break; break;
@ -207,10 +188,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
subghz->state_notifications = SubGhzNotificationStateIDLE; subghz->state_notifications = SubGhzNotificationStateIDLE;
subghz->txrx->idx_menu_chosen = subghz->txrx->idx_menu_chosen =
subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); 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); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig);
consumed = true; consumed = true;
break; break;
@ -250,8 +227,5 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
} }
void subghz_scene_receiver_on_exit(void* context) { void subghz_scene_receiver_on_exit(void* context) {
SubGhz* subghz = context; UNUSED(context);
//filter restoration
subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable);
} }

View file

@ -2,8 +2,6 @@
#include <lib/subghz/protocols/raw.h> #include <lib/subghz/protocols/raw.h>
#define TAG "SubGhzSceneReceiverConfig"
enum SubGhzSettingIndex { enum SubGhzSettingIndex {
SubGhzSettingIndexFrequency, SubGhzSettingIndexFrequency,
SubGhzSettingIndexHopping, SubGhzSettingIndexHopping,
@ -147,8 +145,6 @@ static void subghz_scene_receiver_config_set_frequency(VariableItem* item) {
(subghz_setting_get_frequency(subghz->setting, index) % 1000000) / 10000); (subghz_setting_get_frequency(subghz->setting, index) % 1000000) / 10000);
variable_item_set_current_value_text(item, text_buf); variable_item_set_current_value_text(item, text_buf);
subghz->txrx->preset->frequency = subghz_setting_get_frequency(subghz->setting, index); 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 { } else {
variable_item_set_current_value_index( variable_item_set_current_value_index(
item, subghz_setting_get_frequency_default_index(subghz->setting)); 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) { static void subghz_scene_receiver_config_set_preset(VariableItem* item) {
SubGhz* subghz = variable_item_get_context(item); SubGhz* subghz = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(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(
variable_item_set_current_value_text(item, preset_name); item, subghz_setting_get_preset_name(subghz->setting, index));
string_set_str(subghz->last_setting->preset_name, preset_name);
subghz_preset_init( subghz_preset_init(
subghz, subghz,
preset_name, subghz_setting_get_preset_name(subghz->setting, index),
subghz->txrx->preset->frequency, subghz->txrx->preset->frequency,
subghz_setting_get_preset_data(subghz->setting, index), subghz_setting_get_preset_data(subghz->setting, index),
subghz_setting_get_preset_data_size(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_receiver_search_decoder_base_by_name(
subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME),
rssi_threshold_value[index]); rssi_threshold_value[index]);
subghz->last_setting->rssi_threshold = rssi_threshold_value[index];
} }
static void subghz_scene_receiver_config_set_detect_raw(VariableItem* item) { 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]); variable_item_set_current_value_text(item, detect_raw_text[index]);
subghz_receiver_set_filter(subghz->txrx->receiver, detect_raw_value[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_protocol_decoder_raw_set_auto_mode(
subghz_receiver_search_decoder_base_by_name( 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->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) { 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) { void subghz_scene_receiver_config_on_enter(void* context) {
SubGhz* subghz = context; SubGhz* subghz = context;
subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver);
VariableItem* item; VariableItem* item;
uint8_t value_index; 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); (subghz_setting_get_frequency(subghz->setting, value_index) % 1000000) / 10000);
variable_item_set_current_value_text(item, text_buf); 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( item = variable_item_list_add(
subghz->variable_item_list, subghz->variable_item_list,
"Modulation:", "Modulation:",
@ -284,17 +286,6 @@ void subghz_scene_receiver_config_on_enter(void* context) {
if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
SubGhzCustomEventManagerSet) { 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( item = variable_item_list_add(
subghz->variable_item_list, subghz->variable_item_list,
"Detect Raw:", "Detect Raw:",
@ -307,7 +298,10 @@ void subghz_scene_receiver_config_on_enter(void* context) {
DETECT_RAW_COUNT); DETECT_RAW_COUNT);
variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, detect_raw_text[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( item = variable_item_list_add(
subghz->variable_item_list, subghz->variable_item_list,
"RSSI for Raw:", "RSSI for Raw:",
@ -321,7 +315,10 @@ void subghz_scene_receiver_config_on_enter(void* context) {
RSSI_THRESHOLD_COUNT); RSSI_THRESHOLD_COUNT);
variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, rssi_threshold_text[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_add(subghz->variable_item_list, "Lock Keyboard", 1, NULL, NULL);
variable_item_list_set_enter_callback( variable_item_list_set_enter_callback(
subghz->variable_item_list, 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) { void subghz_scene_receiver_config_on_exit(void* context) {
SubGhz* subghz = context; SubGhz* subghz = context;
variable_item_list_set_selected_item(subghz->variable_item_list, 0);
variable_item_list_reset(subghz->variable_item_list); variable_item_list_reset(subghz->variable_item_list);
scene_manager_set_scene_state( scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet); subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet);

View file

@ -14,6 +14,22 @@ void subghz_scene_save_name_text_input_callback(void* context) {
view_dispatcher_send_custom_event(subghz->view_dispatcher, SubGhzCustomEventSceneSaveName); 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) { void subghz_scene_save_name_on_enter(void* context) {
SubGhz* subghz = 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) == if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) ==
SubGhzCustomEventManagerSetRAW) { SubGhzCustomEventManagerSetRAW) {
dev_name_empty = true; 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); string_set(subghz->file_path, dir_name);
} }

View file

@ -1,5 +1,7 @@
#include "../subghz_i.h" #include "../subghz_i.h"
#include <lib/subghz/protocols/raw.h>
enum SubmenuIndex { enum SubmenuIndex {
SubmenuIndexRead = 10, SubmenuIndexRead = 10,
SubmenuIndexSaved, SubmenuIndexSaved,
@ -19,6 +21,12 @@ void subghz_scene_start_on_enter(void* context) {
if(subghz->state_notifications == SubGhzNotificationStateStarting) { if(subghz->state_notifications == SubGhzNotificationStateStarting) {
subghz->state_notifications = SubGhzNotificationStateIDLE; 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( submenu_add_item(
subghz->submenu, "Read", SubmenuIndexRead, subghz_scene_start_submenu_callback, subghz); subghz->submenu, "Read", SubmenuIndexRead, subghz_scene_start_submenu_callback, subghz);
submenu_add_item( submenu_add_item(

View file

@ -174,25 +174,16 @@ SubGhz* subghz_alloc() {
subghz->setting = subghz_setting_alloc(); subghz->setting = subghz_setting_alloc();
subghz_setting_load(subghz->setting, EXT_PATH("subghz/assets/setting_user")); 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 //init Worker & Protocol & History & KeyBoard
subghz->lock = SubGhzLockOff; subghz->lock = SubGhzLockOff;
subghz->txrx = malloc(sizeof(SubGhzTxRx)); subghz->txrx = malloc(sizeof(SubGhzTxRx));
subghz->txrx->preset = malloc(sizeof(SubGhzPresetDefinition)); subghz->txrx->preset = malloc(sizeof(SubGhzPresetDefinition));
string_init(subghz->txrx->preset->name); string_init(subghz->txrx->preset->name);
subghz_preset_init( subghz_preset_init(
subghz, subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0);
string_get_cstr(subghz->last_setting->preset_name),
subghz->last_setting->frequency,
NULL,
0);
subghz->txrx->txrx_state = SubGhzTxRxStateSleep; 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->rx_key_state = SubGhzRxKeyStateIDLE;
subghz->txrx->history = subghz_history_alloc(); subghz->txrx->history = subghz_history_alloc();
subghz->txrx->worker = subghz_worker_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_environment_set_nice_flor_s_rainbow_table_file_name(
subghz->txrx->environment, EXT_PATH("subghz/assets/nice_flor_s")); subghz->txrx->environment, EXT_PATH("subghz/assets/nice_flor_s"));
subghz->txrx->receiver = subghz_receiver_alloc_init(subghz->txrx->environment); subghz->txrx->receiver = subghz_receiver_alloc_init(subghz->txrx->environment);
// Setup values
subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable);
subghz_worker_set_overrun_callback( subghz_worker_set_overrun_callback(
@ -299,9 +288,6 @@ void subghz_free(SubGhz* subghz) {
//setting //setting
subghz_setting_free(subghz->setting); subghz_setting_free(subghz->setting);
// Last setting
subghz_last_setting_free(subghz->last_setting);
//Worker & Protocol & History //Worker & Protocol & History
subghz_receiver_free(subghz->txrx->receiver); subghz_receiver_free(subghz->txrx->receiver);
subghz_environment_free(subghz->txrx->environment); subghz_environment_free(subghz->txrx->environment);

View file

@ -1,5 +1,7 @@
#include "subghz_history.h" #include "subghz_history.h"
#include <lib/subghz/receiver.h> #include <lib/subghz/receiver.h>
#include <furi.h>
#include <m-string.h>
#define SUBGHZ_HISTORY_MAX 65 #define SUBGHZ_HISTORY_MAX 65
#define TAG "SubGhzHistory" #define TAG "SubGhzHistory"
@ -37,9 +39,15 @@ SubGhzHistory* subghz_history_alloc(void) {
void subghz_history_free(SubGhzHistory* instance) { void subghz_history_free(SubGhzHistory* instance) {
furi_assert(instance); furi_assert(instance);
string_clear(instance->tmp_string);
// Call method instead of code duplicate for
subghz_history_reset(instance); 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); SubGhzHistoryItemArray_clear(instance->history->data);
free(instance->history); free(instance->history);
free(instance); free(instance);
@ -133,22 +141,16 @@ bool subghz_history_add_to_history(
furi_assert(instance); furi_assert(instance);
furi_assert(context); furi_assert(context);
if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) { if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) return false;
FURI_LOG_W(TAG, "Out of history slots!");
return false;
}
SubGhzProtocolDecoderBase* decoder_base = context; SubGhzProtocolDecoderBase* decoder_base = context;
if((instance->code_last_hash_data == if((instance->code_last_hash_data ==
subghz_protocol_decoder_base_get_hash_data(decoder_base)) && subghz_protocol_decoder_base_get_hash_data(decoder_base)) &&
((furi_get_tick() - instance->last_update_timestamp) < 500)) { ((furi_get_tick() - instance->last_update_timestamp) < 500)) {
//FURI_LOG_W(TAG, "Too short period for add");
instance->last_update_timestamp = furi_get_tick(); instance->last_update_timestamp = furi_get_tick();
return false; 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->code_last_hash_data = subghz_protocol_decoder_base_get_hash_data(decoder_base);
instance->last_update_timestamp = furi_get_tick(); instance->last_update_timestamp = furi_get_tick();

View file

@ -33,7 +33,6 @@
#include "subghz_history.h" #include "subghz_history.h"
#include "subghz_setting.h" #include "subghz_setting.h"
#include "subghz_last_setting.h"
#include <gui/modules/variable_item_list.h> #include <gui/modules/variable_item_list.h>
#include <lib/toolbox/path.h> #include <lib/toolbox/path.h>
@ -101,11 +100,10 @@ struct SubGhz {
SubGhzTestPacket* subghz_test_packet; SubGhzTestPacket* subghz_test_packet;
string_t error_str; string_t error_str;
SubGhzSetting* setting; SubGhzSetting* setting;
SubGhzLastSetting* last_setting;
SubGhzLock lock; SubGhzLock lock;
bool in_decoder_scene; bool in_decoder_scene;
SubGhzScene current_scene;
void* rpc_ctx; void* rpc_ctx;
}; };

View file

@ -1,140 +0,0 @@
#include "subghz_setting.h"
#include "subghz_i.h"
#include "subghz_last_setting.h"
#include <furi.h>
#include <m-list.h>
#include <furi_hal_subghz.h>
#include <furi_hal_subghz_configs.h>
#include <lib/subghz/protocols/raw.h>
#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);
}

View file

@ -1,24 +0,0 @@
#pragma once
#include <math.h>
#include <furi.h>
#include <furi_hal.h>
#include <lib/flipper_format/flipper_format.h>
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);

View file

@ -260,7 +260,13 @@ void subghz_setting_load(SubGhzSetting* instance, const char* file_path) {
break; break;
} }
if(flipper_format_read_uint32(fff_data_file, "Default_frequency", &temp_data32, 1)) { 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) // 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) { size_t subghz_setting_get_frequency_count(SubGhzSetting* instance) {
furi_assert(instance); furi_assert(instance);
return FrequencyList_size(instance->frequencies); return FrequencyList_size(instance->frequencies);

View file

@ -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_frequency_default_index(SubGhzSetting* instance);
uint32_t subghz_setting_get_default_frequency(SubGhzSetting* instance); uint32_t subghz_setting_get_default_frequency(SubGhzSetting* instance);
void subghz_setting_set_default_frequency(SubGhzSetting* instance, uint32_t frequency_to_setup);

View file

@ -340,7 +340,6 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) {
return true; return true;
}); });
} else if(event->key == InputKeyLeft && event->type == InputTypeShort) { } else if(event->key == InputKeyLeft && event->type == InputTypeShort) {
//Config receiver
subghz_receiver->callback(SubGhzCustomEventViewReceiverConfig, subghz_receiver->context); subghz_receiver->callback(SubGhzCustomEventViewReceiverConfig, subghz_receiver->context);
} else if(event->key == InputKeyOk && event->type == InputTypeShort) { } else if(event->key == InputKeyOk && event->type == InputTypeShort) {
with_view_model( with_view_model(

View file

@ -45,7 +45,7 @@ void subghz_view_transmitter_add_data_to_show(
} }
static void subghz_view_transmitter_button_right(Canvas* canvas, const char* str) { 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 vertical_offset = 3;
const uint8_t horizontal_offset = 1; const uint8_t horizontal_offset = 1;
const uint8_t string_width = canvas_string_width(canvas, str); 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_invert_color(canvas);
canvas_draw_icon( 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_draw_str(
canvas, x + horizontal_offset + icon_width_with_offset, y - vertical_offset, str); canvas, x + horizontal_offset + icon_width_with_offset, y - vertical_offset, str);
canvas_invert_color(canvas); canvas_invert_color(canvas);

View file

@ -790,7 +790,7 @@ static void render_callback(Canvas* canvas, void* ctx) {
break; break;
case 1: case 1:
canvas_draw_icon(canvas, 113, 15, &I_Pin_cell_13x13); 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; break;
case 2: case 2:
canvas_draw_icon(canvas, 113, 15, &I_Pin_cell_13x13); 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* unirfremix_alloc(void) {
UniRFRemix* app = malloc(sizeof(UniRFRemix)); UniRFRemix* app = malloc(sizeof(UniRFRemix));
furi_hal_power_suppress_charge_enter();
app->model_mutex = furi_mutex_alloc(FuriMutexTypeNormal); app->model_mutex = furi_mutex_alloc(FuriMutexTypeNormal);
app->input_queue = furi_message_queue_alloc(32, sizeof(InputEvent)); app->input_queue = furi_message_queue_alloc(32, sizeof(InputEvent));
@ -862,7 +864,9 @@ UniRFRemix* unirfremix_alloc(void) {
return app; 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->up_file);
string_clear(app->down_file); string_clear(app->down_file);
string_clear(app->left_file); string_clear(app->left_file);
@ -888,10 +892,12 @@ void unirfremix_free(UniRFRemix* app) {
furi_mutex_free(app->model_mutex); furi_mutex_free(app->model_mutex);
furi_hal_subghz_sleep(); if(with_subghz) {
subghz_setting_free(app->setting); furi_hal_subghz_sleep();
subghz_receiver_free(app->subghz_receiver); subghz_setting_free(app->setting);
subghz_environment_free(app->environment); subghz_receiver_free(app->subghz_receiver);
subghz_environment_free(app->environment);
}
furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_NOTIFICATION);
app->notification = NULL; app->notification = NULL;
@ -939,6 +945,8 @@ int32_t unirfremix_app(void* p) {
furi_record_close(RECORD_DIALOGS); furi_record_close(RECORD_DIALOGS);
if(!res) { if(!res) {
FURI_LOG_E(TAG, "No file selected"); FURI_LOG_E(TAG, "No file selected");
unirfremix_free(app, false);
return 255;
} else { } else {
//check map and population variables //check map and population variables
unirfremix_cfg_set_check(app, app->file_path); unirfremix_cfg_set_check(app, app->file_path);
@ -970,8 +978,6 @@ int32_t unirfremix_app(void* p) {
furi_mutex_release(app->model_mutex); furi_mutex_release(app->model_mutex);
view_port_update(app->view_port); view_port_update(app->view_port);
furi_hal_power_suppress_charge_enter();
//input detect loop start //input detect loop start
InputEvent input; InputEvent input;
while(1) { while(1) {
@ -1164,9 +1170,7 @@ int32_t unirfremix_app(void* p) {
} }
// remove & free all stuff created by app // remove & free all stuff created by app
unirfremix_free(app); unirfremix_free(app, true);
furi_hal_power_suppress_charge_exit();
return 0; return 0;
} }

View file

@ -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 = 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_KEYPAD_COMMA},
{.width = 1, .icon = NULL, .key = ".", .shift_key = ">", .value = HID_KEYBOARD_DOT}, {.width = 1, .icon = NULL, .key = ".", .shift_key = ">", .value = HID_KEYBOARD_DOT},
{.width = 4, .icon = NULL, .key = " ", .value = HID_KEYBOARD_SPACEBAR}, {.width = 4, .icon = NULL, .key = " ", .value = HID_KEYBOARD_SPACEBAR},

View file

@ -53,7 +53,7 @@ static void bt_hid_mouse_draw_callback(Canvas* canvas, void* context) {
canvas_set_bitmap_mode(canvas, 0); canvas_set_bitmap_mode(canvas, 0);
canvas_set_color(canvas, ColorWhite); 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); canvas_set_color(canvas, ColorBlack);
// Down // Down

View file

@ -1,21 +1,35 @@
# Flipfrid # Flipfrid
Basic EM4100 Fuzzer Basic EM4100 and HIDProx Fuzzer.
## Why ## Why
Flipfrid is a simple Rfid fuzzer using EM4100 protocol (125khz). 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. 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 ## How
There is 4 modes : 1) Select the Protocol with the left and right arrows
- Default key loop over 16 factory/default keys and emulate each one after one ; 2) Select the Mode with the up and down arrows
- 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; ### Info
- Uids list: loop over a text file (one uid per line)
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 : TODO :
- blank screen on back press - blank screen on back press
- Add second byte test to `BF customer id`

View file

@ -64,6 +64,7 @@ FlipFridState* flipfrid_alloc() {
flipfrid->is_attacking = false; flipfrid->is_attacking = false;
flipfrid->key_index = 0; flipfrid->key_index = 0;
flipfrid->menu_index = 0; flipfrid->menu_index = 0;
flipfrid->menu_proto_index = 0;
flipfrid->attack = FlipFridAttackDefaultValues; flipfrid->attack = FlipFridAttackDefaultValues;
flipfrid->notify = furi_record_open(RECORD_NOTIFICATION); flipfrid->notify = furi_record_open(RECORD_NOTIFICATION);
@ -73,12 +74,14 @@ FlipFridState* flipfrid_alloc() {
flipfrid->data[2] = 0x00; flipfrid->data[2] = 0x00;
flipfrid->data[3] = 0x00; flipfrid->data[3] = 0x00;
flipfrid->data[4] = 0x00; flipfrid->data[4] = 0x00;
flipfrid->data[5] = 0x00;
flipfrid->payload[0] = 0x00; flipfrid->payload[0] = 0x00;
flipfrid->payload[1] = 0x00; flipfrid->payload[1] = 0x00;
flipfrid->payload[2] = 0x00; flipfrid->payload[2] = 0x00;
flipfrid->payload[3] = 0x00; flipfrid->payload[3] = 0x00;
flipfrid->payload[4] = 0x00; flipfrid->payload[4] = 0x00;
flipfrid->payload[5] = 0x00;
//Dialog //Dialog
flipfrid->dialogs = furi_record_open(RECORD_DIALOGS); flipfrid->dialogs = furi_record_open(RECORD_DIALOGS);

View file

@ -28,6 +28,11 @@ typedef enum {
FlipFridAttackLoadFileCustomUids, FlipFridAttackLoadFileCustomUids,
} FlipFridAttacks; } FlipFridAttacks;
typedef enum {
EM4100,
HIDProx,
} FlipFridProtos;
typedef enum { typedef enum {
NoneScene, NoneScene,
SceneEntryPoint, SceneEntryPoint,
@ -56,13 +61,16 @@ typedef struct {
FlipFridScene previous_scene; FlipFridScene previous_scene;
NotificationApp* notify; NotificationApp* notify;
u_int8_t menu_index; u_int8_t menu_index;
u_int8_t menu_proto_index;
string_t data_str; string_t data_str;
uint8_t data[5]; uint8_t data[6];
uint8_t payload[5]; uint8_t payload[6];
uint8_t attack_step; uint8_t attack_step;
FlipFridAttacks attack; FlipFridAttacks attack;
FlipFridProtos proto;
string_t attack_name; string_t attack_name;
string_t proto_name;
DialogsApp* dialogs; DialogsApp* dialogs;
string_t notification_msg; string_t notification_msg;

View file

@ -1,8 +1,12 @@
#include "flipfrid_scene_entrypoint.h" #include "flipfrid_scene_entrypoint.h"
string_t menu_items[4]; 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) { switch(index) {
case FlipFridAttackDefaultValues: case FlipFridAttackDefaultValues:
context->attack = FlipFridAttackDefaultValues; context->attack = FlipFridAttackDefaultValues;
@ -27,6 +31,19 @@ void flipfrid_scene_entrypoint_menu_callback(FlipFridState* context, uint32_t in
default: default:
break; 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) { 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[2] = 0x00;
context->payload[3] = 0x00; context->payload[3] = 0x00;
context->payload[4] = 0x00; context->payload[4] = 0x00;
context->payload[5] = 0x00;
context->menu_index = 0; context->menu_index = 0;
for(uint32_t i = 0; i < 4; i++) { 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[1], "BF Customer ID");
string_set(menu_items[2], "Load File"); string_set(menu_items[2], "Load File");
string_set(menu_items[3], "Load uids from 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) { 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++) { for(uint32_t i = 0; i < 4; i++) {
string_clear(menu_items[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) { void flipfrid_scene_entrypoint_on_tick(FlipFridState* context) {
@ -74,10 +104,18 @@ void flipfrid_scene_entrypoint_on_event(FlipFridEvent event, FlipFridState* cont
} }
break; break;
case InputKeyLeft: case InputKeyLeft:
if(context->menu_proto_index > EM4100) {
context->menu_proto_index--;
}
break;
case InputKeyRight: case InputKeyRight:
if(context->menu_proto_index < HIDProx) {
context->menu_proto_index++;
}
break; break;
case InputKeyOk: 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; break;
case InputKeyBack: case InputKeyBack:
context->is_running = false; context->is_running = false;
@ -91,10 +129,6 @@ void flipfrid_scene_entrypoint_on_draw(Canvas* canvas, FlipFridState* context) {
canvas_clear(canvas); canvas_clear(canvas);
canvas_set_color(canvas, ColorBlack); 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) { if(context->menu_index > FlipFridAttackDefaultValues) {
canvas_set_font(canvas, FontSecondary); canvas_set_font(canvas, FontSecondary);
canvas_draw_str_aligned( canvas_draw_str_aligned(
@ -120,4 +154,41 @@ void flipfrid_scene_entrypoint_on_draw(Canvas* canvas, FlipFridState* context) {
AlignTop, AlignTop,
string_get_cstr(menu_items[context->menu_index + 1])); 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]));
}
} }

View file

@ -36,11 +36,21 @@ bool flipfrid_load(FlipFridState* context, const char* file_path) {
break; break;
} else { } else {
FURI_LOG_I(TAG, "Key type: %s", string_get_cstr(temp_str)); 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"); if(context->proto == EM4100) {
string_reset(context->notification_msg); if(strcmp(string_get_cstr(temp_str), "EM4100") != 0) {
string_set_str(context->notification_msg, "Unsupported Key type"); FURI_LOG_E(TAG, "Unsupported Key type");
break; 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 { } else {
FURI_LOG_I(TAG, "Key: %s", string_get_cstr(context->data_str)); FURI_LOG_I(TAG, "Key: %s", string_get_cstr(context->data_str));
// Check data size if(context->proto == EM4100) {
if(string_size(context->data_str) != 14) { if(string_size(context->data_str) != 14) {
FURI_LOG_E(TAG, "Incorrect Key length"); FURI_LOG_E(TAG, "Incorrect Key length");
string_reset(context->notification_msg); string_reset(context->notification_msg);
string_set_str(context->notification_msg, "Incorrect Key length"); string_set_str(context->notification_msg, "Incorrect Key length");
break; 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 // String to uint8_t
for(uint8_t i = 0; i < 5; i++) { for(uint8_t i = 0; i < 6; i++) {
char temp_str2[3]; char temp_str2[3];
temp_str2[0] = string_get_cstr(context->data_str)[i * 3]; temp_str2[0] = string_get_cstr(context->data_str)[i * 3];
temp_str2[1] = string_get_cstr(context->data_str)[i * 3 + 1]; temp_str2[1] = string_get_cstr(context->data_str)[i * 3 + 1];

View file

@ -2,8 +2,8 @@
#include <gui/elements.h> #include <gui/elements.h>
uint8_t counter = 0; uint8_t counter = 0;
#define TIME_BETWEEN_CARDS 5 #define TIME_BETWEEN_CARDS 6
uint8_t id_list[16][5] = { uint8_t id_list[17][5] = {
{0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes {0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
{0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11 {0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
@ -16,17 +16,39 @@ uint8_t id_list[16][5] = {
{0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88 {0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
{0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99 {0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
{0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID {0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID
{0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
{0x04, 0xd0, 0x9b, 0x0d, 0x6a}, // From arha {0x04, 0xd0, 0x9b, 0x0d, 0x6a}, // From arha
{0x34, 0x00, 0x29, 0x3d, 0x9e}, // From arha {0x34, 0x00, 0x29, 0x3d, 0x9e}, // From arha
{0x04, 0xdf, 0x00, 0x00, 0x01}, // From arha {0x04, 0xdf, 0x00, 0x00, 0x01}, // From arha
{0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // 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) { void flipfrid_scene_run_attack_on_enter(FlipFridState* context) {
context->attack_step = 0; context->attack_step = 0;
context->dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); context->dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax);
context->worker = lfrfid_worker_alloc(context->dict); 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) { 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) { void flipfrid_scene_run_attack_on_tick(FlipFridState* context) {
if(context->is_attacking) { if(context->is_attacking) {
if(1 == counter) { 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); lfrfid_worker_free(context->worker);
context->worker = lfrfid_worker_alloc(context->dict); context->worker = lfrfid_worker_alloc(context->dict);
lfrfid_worker_start_thread(context->worker); 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); lfrfid_worker_stop_thread(context->worker);
switch(context->attack) { switch(context->attack) {
case FlipFridAttackDefaultValues: case FlipFridAttackDefaultValues:
context->payload[0] = id_list[context->attack_step][0]; if(context->proto == EM4100) {
context->payload[1] = id_list[context->attack_step][1]; context->payload[0] = id_list[context->attack_step][0];
context->payload[2] = id_list[context->attack_step][2]; context->payload[1] = id_list[context->attack_step][1];
context->payload[3] = id_list[context->attack_step][3]; context->payload[2] = id_list[context->attack_step][2];
context->payload[4] = id_list[context->attack_step][4]; context->payload[3] = id_list[context->attack_step][3];
context->payload[4] = id_list[context->attack_step][4];
if(context->attack_step == 15) { if(context->attack_step == 15) {
context->attack_step = 0; context->attack_step = 0;
counter = 0; counter = 0;
context->is_attacking = false; context->is_attacking = false;
notification_message(context->notify, &sequence_blink_stop); notification_message(context->notify, &sequence_blink_stop);
notification_message(context->notify, &sequence_single_vibro); notification_message(context->notify, &sequence_single_vibro);
} else {
} else { context->attack_step++;
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);
break; break;
} else { } 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: case FlipFridAttackBfCustomerId:
while(true) { if(context->proto == EM4100) {
string_reset(context->data_str); context->payload[0] = context->attack_step;
if(!stream_read_line(context->uids_stream, context->data_str)) { 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; context->attack_step = 0;
counter = 0; counter = 0;
context->is_attacking = false; context->is_attacking = false;
notification_message(context->notify, &sequence_blink_stop); notification_message(context->notify, &sequence_blink_stop);
notification_message(context->notify, &sequence_single_vibro); notification_message(context->notify, &sequence_single_vibro);
break; break;
}; } else {
if(string_get_char(context->data_str, 0) == '#') continue; context->attack_step++;
if(string_size(context->data_str) != 11) continue; }
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; break;
} }
FURI_LOG_D(TAG, string_get_cstr(context->data_str));
// string is valid, parse it in context->payload case FlipFridAttackLoadFileCustomUids:
for(uint8_t i = 0; i < 5; i++) { if(context->proto == EM4100) {
char temp_str[3]; while(true) {
temp_str[0] = string_get_cstr(context->data_str)[i * 2]; string_reset(context->data_str);
temp_str[1] = string_get_cstr(context->data_str)[i * 2 + 1]; if(!stream_read_line(context->uids_stream, context->data_str)) {
temp_str[2] = '\0'; context->attack_step = 0;
context->payload[i] = (uint8_t)strtol(temp_str, NULL, 16); 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_draw_str_aligned(
canvas, 64, 8, AlignCenter, AlignTop, string_get_cstr(context->attack_name)); canvas, 64, 8, AlignCenter, AlignTop, string_get_cstr(context->attack_name));
char uid[16]; char uid[18];
snprintf( if(context->proto == HIDProx) {
uid, snprintf(
sizeof(uid), uid,
"%02X:%02X:%02X:%02X:%02X", sizeof(uid),
context->payload[0], "%02X:%02X:%02X:%02X:%02X:%02X",
context->payload[1], context->payload[0],
context->payload[2], context->payload[1],
context->payload[3], context->payload[2],
context->payload[4]); 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_draw_str_aligned(canvas, 64, 24, AlignCenter, AlignTop, uid);
canvas_set_font(canvas, FontSecondary); canvas_set_font(canvas, FontSecondary);

View file

@ -47,7 +47,8 @@ static void render_callback(Canvas* const canvas, void* ctx) {
canvas_draw_frame(canvas, 0, 0, 128, 64); canvas_draw_frame(canvas, 0, 0, 128, 64);
canvas_set_font(canvas, FontSecondary); 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); 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, 7, 10, AlignLeft, AlignBottom, target_text);
canvas_draw_str_aligned(canvas, 22, 20, AlignLeft, AlignBottom, "<- select address ->"); 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, 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, 20, AlignLeft, AlignBottom, "or duckyscript file");
canvas_draw_str_aligned(canvas, 3, 30, AlignLeft, AlignBottom, "loading error"); 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, 10, AlignLeft, AlignBottom, "Running duckyscript");
canvas_draw_str_aligned(canvas, 3, 20, AlignLeft, AlignBottom, "Please wait!"); canvas_draw_str_aligned(canvas, 3, 20, AlignLeft, AlignBottom, "Please wait!");
canvas_draw_str_aligned( 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]); 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"); DialogsApp* dialogs = furi_record_open("dialogs");
bool result = false; bool result = false;
string_t path; string_t path;
@ -120,6 +124,9 @@ static bool open_ducky_script(Stream* stream) {
} }
} }
string_clear(path); string_clear(path);
plugin_state->is_ducky_running = true;
return result; return result;
} }
@ -160,10 +167,11 @@ static bool process_ducky_file(
uint8_t* file_buf; uint8_t* file_buf;
bool loaded = false; bool loaded = false;
FURI_LOG_D(TAG, "opening ducky script"); 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); file_size = stream_size(file_stream);
if(file_size == (size_t)0) { if(file_size == (size_t)0) {
FURI_LOG_D(TAG, "load failed. file_size: %d", file_size); FURI_LOG_D(TAG, "load failed. file_size: %d", file_size);
plugin_state->is_ducky_running = false;
return loaded; return loaded;
} }
file_buf = malloc(file_size); file_buf = malloc(file_size);
@ -180,6 +188,7 @@ static bool process_ducky_file(
} }
free(file_buf); free(file_buf);
} }
plugin_state->is_ducky_running = false;
return loaded; return loaded;
} }

View file

@ -24,6 +24,7 @@ typedef struct {
bool ducky_err; bool ducky_err;
bool addr_err; bool addr_err;
bool is_thread_running; bool is_thread_running;
bool is_ducky_running;
bool close_thread_please; bool close_thread_please;
Storage* storage; Storage* storage;
FuriThread* mjthread; FuriThread* mjthread;

View file

@ -1,7 +1,7 @@
App( App(
appid="picopass", appid="picopass",
name="PicoPass Reader", name="PicoPass Reader",
apptype=FlipperAppType.PLUGIN, apptype=FlipperAppType.EXTERNAL,
entry_point="picopass_app", entry_point="picopass_app",
requires=[ requires=[
"storage", "storage",

View file

@ -1,11 +1,12 @@
App( App(
appid="spectrum_analyzer", appid="spectrum_analyzer",
name="Spectrum Analyzer", name="Spectrum Analyzer",
apptype=FlipperAppType.APP, apptype=FlipperAppType.EXTERNAL,
entry_point="spectrum_analyzer_app", entry_point="spectrum_analyzer_app",
cdefines=["APP_SPECTRUM_ANALYZER"], cdefines=["APP_SPECTRUM_ANALYZER"],
requires=["gui"], requires=["gui"],
icon="A_SpectrumAnalyzer_14",
stack_size=2 * 1024, stack_size=2 * 1024,
order=12, order=12,
fap_icon="spectrum_10px.png",
fap_category="Tools",
) )

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

View file

@ -22,15 +22,11 @@ void desktop_scene_slideshow_on_enter(void* context) {
bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) { bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) {
Desktop* desktop = (Desktop*)context; Desktop* desktop = (Desktop*)context;
bool consumed = false; bool consumed = false;
Storage* storage = NULL;
Power* power = NULL; Power* power = NULL;
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeCustom) {
switch(event.event) { switch(event.event) {
case DesktopSlideshowCompleted: 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); scene_manager_previous_scene(desktop->scene_manager);
consumed = true; consumed = true;
break; break;
@ -50,4 +46,8 @@ bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) {
void desktop_scene_slideshow_on_exit(void* context) { void desktop_scene_slideshow_on_exit(void* context) {
UNUSED(context); UNUSED(context);
Storage* storage = furi_record_open(RECORD_STORAGE);
storage_common_remove(storage, SLIDESHOW_FS_PATH);
furi_record_close(RECORD_STORAGE);
} }

View file

@ -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); canvas_draw_icon(canvas, x + 3, y + 2, &I_Pin_arrow_down_7x9);
break; break;
case InputKeyUp: 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; break;
case InputKeyLeft: case InputKeyLeft:
canvas_draw_icon(canvas, x + 2, y + 3, &I_Pin_arrow_left_9x7); canvas_draw_icon(canvas, x + 2, y + 3, &I_Pin_arrow_left_9x7);

View file

@ -142,6 +142,8 @@ void button_panel_reset(ButtonPanel* button_panel) {
} }
model->reserve_x = 0; model->reserve_x = 0;
model->reserve_y = 0; model->reserve_y = 0;
model->selected_item_x = 0;
model->selected_item_y = 0;
LabelList_reset(model->labels); LabelList_reset(model->labels);
ButtonMatrix_reset(model->button_matrix); ButtonMatrix_reset(model->button_matrix);
return true; return true;

View file

@ -318,15 +318,17 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b
} }
} else if(selected == BACKSPACE_KEY) { } else if(selected == BACKSPACE_KEY) {
text_input_backspace_cb(model); text_input_backspace_cb(model);
} else if(text_length < (model->text_buffer_size - 1)) { } else {
if(model->clear_default_text) { if(model->clear_default_text) {
text_length = 0; text_length = 0;
} }
if(text_length == 0 && char_is_lowercase(selected)) { if(text_length < (model->text_buffer_size - 1)) {
selected = char_to_uppercase(selected); 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; model->clear_default_text = false;
} }

View file

@ -1,11 +1,8 @@
#include "power_i.h" #include "power_i.h"
#include "views/power_off.h"
#include "desktop/desktop_settings.h" #include "desktop/desktop_settings.h"
#include <furi.h> #include <furi.h>
#include <furi_hal.h> #include <furi_hal.h>
#include <gui/view_port.h>
#include <gui/view.h>
#define POWER_OFF_TIMEOUT 90 #define POWER_OFF_TIMEOUT 90

View file

@ -60,19 +60,8 @@ const char* const delay_text[DELAY_COUNT] = {
"10min", "10min",
"30min", "30min",
}; };
const uint32_t delay_value[DELAY_COUNT] = { const uint32_t delay_value[DELAY_COUNT] =
1000, {1000, 5000, 10000, 15000, 30000, 60000, 90000, 120000, 300000, 600000, 1800000};
5000,
10000,
15000,
30000,
60000,
90000,
120000,
300000,
600000,
1800000
};
#define VIBRO_COUNT 2 #define VIBRO_COUNT 2
const char* const vibro_text[VIBRO_COUNT] = { const char* const vibro_text[VIBRO_COUNT] = {

View file

@ -1,16 +1,5 @@
Import("env") 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( assetsenv = env.Clone(
tools=["fbt_assets"], tools=["fbt_assets"],
FW_LIB_NAME="assets", FW_LIB_NAME="assets",
@ -77,7 +66,6 @@ assetsenv.Alias("proto_ver", proto_ver)
# Gather everything into a static lib # Gather everything into a static lib
assets_parts = (icons, proto, dolphin_blocking, dolphin_internal, proto_ver) assets_parts = (icons, proto, dolphin_blocking, dolphin_internal, proto_ver)
assetsenv.Depends(assets_parts, version_value)
assetslib = assetsenv.Library("${FW_LIB_NAME}", assets_parts) assetslib = assetsenv.Library("${FW_LIB_NAME}", assets_parts)
assetsenv.Install("${LIB_DIST_DIR}", assetslib) assetsenv.Install("${LIB_DIST_DIR}", assetslib)
@ -113,6 +101,7 @@ if assetsenv["IS_BASE_FIRMWARE"]:
) )
# Exporting resources node to external environment # Exporting resources node to external environment
env["FW_ASSETS_HEADERS"] = assets_parts
env["FW_RESOURCES"] = resources env["FW_RESOURCES"] = resources
assetsenv.Alias("resources", resources) assetsenv.Alias("resources", resources)

View file

@ -7,7 +7,7 @@ Passive frames: 8
Active frames: 0 Active frames: 0
Frames order: 0 1 2 3 4 5 6 7 Frames order: 0 1 2 3 4 5 6 7
Active cycles: 0 Active cycles: 0
Frame rate: 4 Frame rate: 3
Duration: 3600 Duration: 3600
Active cooldown: 0 Active cooldown: 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View file

@ -7,7 +7,7 @@ Passive frames: 8
Active frames: 0 Active frames: 0
Frames order: 0 1 2 3 4 5 6 7 Frames order: 0 1 2 3 4 5 6 7
Active cycles: 0 Active cycles: 0
Frame rate: 4 Frame rate: 3
Duration: 3600 Duration: 3600
Active cooldown: 0 Active cooldown: 0

View file

@ -1,7 +1,43 @@
Filetype: IR library file Filetype: IR library file
Version: 1 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 # TIMER ON
name: TIMER name: TIMER
type: raw type: raw
@ -1148,4 +1184,52 @@ type: raw
frequency: 38000 frequency: 38000
duty_cycle: 0.330000 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 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
# #

View file

@ -1,6 +1,30 @@
Filetype: IR library file Filetype: IR library file
Version: 1 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 name: POWER
type: parsed type: parsed
@ -1376,3 +1400,93 @@ protocol: NEC
address: 00 00 00 00 address: 00 00 00 00
command: 57 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
#

View file

@ -1,6 +1,31 @@
Filetype: IR library file Filetype: IR library file
Version: 1 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 name: POWER
type: parsed type: parsed
@ -85,6 +110,12 @@ type: raw
frequency: 38000 frequency: 38000
duty_cycle: 0.330000 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 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+ name: SPEED+
type: raw type: raw
@ -895,3 +926,57 @@ frequency: 38000
duty_cycle: 0.330000 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 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
#

View file

@ -1,9 +1,33 @@
Filetype: IR library file Filetype: IR library file
Version: 1 Version: 1
# Last Updated 8th Sep, 2022 # Last Updated 17th Sept, 2022
# #
# ON # ON
name: POWER 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 type: parsed
protocol: NECext protocol: NECext
address: 83 F4 00 00 address: 83 F4 00 00
@ -356,4 +380,34 @@ type: parsed
protocol: NEC protocol: NEC
address: 03 00 00 00 address: 03 00 00 00
command: 15 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
# #

View file

@ -1,6 +1,54 @@
Filetype: IR library file Filetype: IR library file
Version: 1 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 name: POWER
type: raw type: raw
@ -3127,94 +3175,106 @@ type: raw
frequency: 38000 frequency: 38000
duty_cycle: 0.330000 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 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 name: VOL+
type: parsed type: parsed
protocol: NEC protocol: NECext
address: 01 00 00 00 address: AD ED 00 00
command: 59 00 00 00 command: BA 45 00 00
# OFF #
name: POWER name: VOL-
type: parsed type: parsed
protocol: NEC protocol: NECext
address: 08 00 00 00 address: AD ED 00 00
command: D5 00 00 00 command: BB 44 00 00
# OFF #
name: POWER name: CH+
type: parsed type: parsed
protocol: RC5 protocol: NECext
address: 01 00 00 00 address: AD ED 00 00
command: 2A 00 00 00 command: B0 4F 00 00
# OFF #
name: POWER name: CH-
type: parsed type: parsed
protocol: NECext protocol: NECext
address: 00 7F 00 00 address: AD ED 00 00
command: 0C F3 00 00 command: B1 4E 00 00
# OFF #
name: POWER name: MUTE
type: parsed type: parsed
protocol: NECext protocol: NECext
address: 86 05 00 00 address: AD ED 00 00
command: 13 EC 00 00 command: C5 3A 00 00
# OFF #
name: POWER name: POWER
type: parsed type: raw
protocol: NECext frequency: 38000
address: 02 7D 00 00 duty_cycle: 0.330000
command: 11 EE 00 00 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
# OFF #
name: POWER name: VOL+
type: parsed type: raw
protocol: NECext frequency: 38000
address: 84 E0 00 00 duty_cycle: 0.330000
command: 22 DD 00 00 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
# OFF #
name: POWER name: VOL-
type: parsed type: raw
protocol: NEC frequency: 38000
address: 20 00 00 00 duty_cycle: 0.330000
command: 4E 00 00 00 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
# OFF #
name: POWER name: POWER
type: parsed type: parsed
protocol: NEC protocol: NEC
address: 04 00 00 00 address: 00 00 00 00
command: 0E 00 00 00 command: 1A 00 00 00
# OFF #
name: POWER name: VOL+
type: parsed type: parsed
protocol: NEC protocol: NEC
address: 04 00 00 00 address: 00 00 00 00
command: 1B 00 00 00 command: 11 00 00 00
# OFF #
name: POWER name: VOL-
type: parsed type: parsed
protocol: NEC protocol: NEC
address: 01 00 00 00 address: 00 00 00 00
command: 5E 00 00 00 command: 33 00 00 00
# OFF #
name: POWER name: POWER
type: parsed type: raw
protocol: NECext frequency: 38000
address: EA C7 00 00 duty_cycle: 0.330000
command: 62 9D 00 00 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
# OFF #
name: POWER name: VOL+
type: parsed type: raw
protocol: Samsung32 frequency: 38000
address: 07 00 00 00 duty_cycle: 0.330000
command: 03 00 00 00 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
# OFF #
name: POWER name: VOL-
type: parsed type: raw
protocol: SIRC frequency: 38000
address: 01 00 00 00 duty_cycle: 0.330000
command: 36 00 00 00 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
# OFF #
name: POWER name: MUTE
type: parsed type: raw
protocol: Samsung32 frequency: 38000
address: 07 00 00 00 duty_cycle: 0.330000
command: 24 00 00 00 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
# #

Some files were not shown because too many files have changed in this diff Show more