SubRem: archive browser

This commit is contained in:
gid9798
2023-07-14 14:16:37 +03:00
parent f49cad314e
commit b3810ec573
11 changed files with 69 additions and 12 deletions

View File

@@ -12,6 +12,7 @@ static const char* tab_default_paths[] = {
[ArchiveTabIButton] = ANY_PATH("ibutton"), [ArchiveTabIButton] = ANY_PATH("ibutton"),
[ArchiveTabNFC] = ANY_PATH("nfc"), [ArchiveTabNFC] = ANY_PATH("nfc"),
[ArchiveTabSubGhz] = ANY_PATH("subghz"), [ArchiveTabSubGhz] = ANY_PATH("subghz"),
[ArchiveTabSubGhzRemote] = EXT_PATH("subghz_remote"),
[ArchiveTabLFRFID] = ANY_PATH("lfrfid"), [ArchiveTabLFRFID] = ANY_PATH("lfrfid"),
[ArchiveTabInfrared] = ANY_PATH("infrared"), [ArchiveTabInfrared] = ANY_PATH("infrared"),
[ArchiveTabBadUsb] = ANY_PATH("badusb"), [ArchiveTabBadUsb] = ANY_PATH("badusb"),
@@ -25,6 +26,7 @@ static const char* known_ext[] = {
[ArchiveFileTypeIButton] = ".ibtn", [ArchiveFileTypeIButton] = ".ibtn",
[ArchiveFileTypeNFC] = ".nfc", [ArchiveFileTypeNFC] = ".nfc",
[ArchiveFileTypeSubGhz] = ".sub", [ArchiveFileTypeSubGhz] = ".sub",
[ArchiveFileTypeSubGhzRemote] = ".txt",
[ArchiveFileTypeLFRFID] = ".rfid", [ArchiveFileTypeLFRFID] = ".rfid",
[ArchiveFileTypeInfrared] = ".ir", [ArchiveFileTypeInfrared] = ".ir",
[ArchiveFileTypeBadUsb] = ".txt", [ArchiveFileTypeBadUsb] = ".txt",
@@ -40,6 +42,7 @@ static const ArchiveFileTypeEnum known_type[] = {
[ArchiveTabIButton] = ArchiveFileTypeIButton, [ArchiveTabIButton] = ArchiveFileTypeIButton,
[ArchiveTabNFC] = ArchiveFileTypeNFC, [ArchiveTabNFC] = ArchiveFileTypeNFC,
[ArchiveTabSubGhz] = ArchiveFileTypeSubGhz, [ArchiveTabSubGhz] = ArchiveFileTypeSubGhz,
[ArchiveTabSubGhzRemote] = ArchiveFileTypeSubGhzRemote,
[ArchiveTabLFRFID] = ArchiveFileTypeLFRFID, [ArchiveTabLFRFID] = ArchiveFileTypeLFRFID,
[ArchiveTabInfrared] = ArchiveFileTypeInfrared, [ArchiveTabInfrared] = ArchiveFileTypeInfrared,
[ArchiveTabBadUsb] = ArchiveFileTypeBadUsb, [ArchiveTabBadUsb] = ArchiveFileTypeBadUsb,

View File

@@ -22,6 +22,12 @@ void archive_set_file_type(ArchiveFile_t* file, const char* path, bool is_folder
file->type = i; file->type = i;
return; // *.txt file is a BadUSB script only if it is in BadUSB folder return; // *.txt file is a BadUSB script only if it is in BadUSB folder
} }
} else if(i == ArchiveFileTypeSubGhzRemote) {
if(furi_string_search(
file->path, archive_get_default_path(ArchiveTabSubGhzRemote)) == 0) {
file->type = i;
return; // *.txt file is a SubRem map file only if it is in SubRem folder
}
} else { } else {
file->type = i; file->type = i;
return; return;

View File

@@ -12,6 +12,7 @@ typedef enum {
ArchiveFileTypeIButton, ArchiveFileTypeIButton,
ArchiveFileTypeNFC, ArchiveFileTypeNFC,
ArchiveFileTypeSubGhz, ArchiveFileTypeSubGhz,
ArchiveFileTypeSubGhzRemote,
ArchiveFileTypeLFRFID, ArchiveFileTypeLFRFID,
ArchiveFileTypeInfrared, ArchiveFileTypeInfrared,
ArchiveFileTypeBadUsb, ArchiveFileTypeBadUsb,

View File

@@ -20,6 +20,8 @@ static const char* archive_get_flipper_app_name(ArchiveFileTypeEnum file_type) {
return "NFC"; return "NFC";
case ArchiveFileTypeSubGhz: case ArchiveFileTypeSubGhz:
return "Sub-GHz"; return "Sub-GHz";
case ArchiveFileTypeSubGhzRemote:
return "Sub-GHz Remote";
case ArchiveFileTypeLFRFID: case ArchiveFileTypeLFRFID:
return "125 kHz RFID"; return "125 kHz RFID";
case ArchiveFileTypeInfrared: case ArchiveFileTypeInfrared:

View File

@@ -14,6 +14,7 @@ static const char* ArchiveTabNames[] = {
[ArchiveTabIButton] = "iButton", [ArchiveTabIButton] = "iButton",
[ArchiveTabNFC] = "NFC", [ArchiveTabNFC] = "NFC",
[ArchiveTabSubGhz] = "Sub-GHz", [ArchiveTabSubGhz] = "Sub-GHz",
[ArchiveTabSubGhzRemote] = "SubRem",
[ArchiveTabLFRFID] = "RFID LF", [ArchiveTabLFRFID] = "RFID LF",
[ArchiveTabInfrared] = "Infrared", [ArchiveTabInfrared] = "Infrared",
[ArchiveTabBadUsb] = "Bad USB", [ArchiveTabBadUsb] = "Bad USB",
@@ -27,6 +28,7 @@ static const Icon* ArchiveItemIcons[] = {
[ArchiveFileTypeIButton] = &I_ibutt_10px, [ArchiveFileTypeIButton] = &I_ibutt_10px,
[ArchiveFileTypeNFC] = &I_Nfc_10px, [ArchiveFileTypeNFC] = &I_Nfc_10px,
[ArchiveFileTypeSubGhz] = &I_sub1_10px, [ArchiveFileTypeSubGhz] = &I_sub1_10px,
[ArchiveFileTypeSubGhzRemote] = &I_subrem_10px,
[ArchiveFileTypeLFRFID] = &I_125_10px, [ArchiveFileTypeLFRFID] = &I_125_10px,
[ArchiveFileTypeInfrared] = &I_ir_10px, [ArchiveFileTypeInfrared] = &I_ir_10px,
[ArchiveFileTypeBadUsb] = &I_badusb_10px, [ArchiveFileTypeBadUsb] = &I_badusb_10px,

View File

@@ -24,6 +24,7 @@
typedef enum { typedef enum {
ArchiveTabFavorites, ArchiveTabFavorites,
ArchiveTabSubGhz, ArchiveTabSubGhz,
ArchiveTabSubGhzRemote,
ArchiveTabLFRFID, ArchiveTabLFRFID,
ArchiveTabNFC, ArchiveTabNFC,
ArchiveTabInfrared, ArchiveTabInfrared,

View File

@@ -8,8 +8,6 @@ void subrem_scene_open_map_file_on_enter(void* context) {
uint32_t start_scene_state = uint32_t start_scene_state =
scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart); scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart);
// TODO if optimization
if(load_state == SubRemLoadMapStateBack) { if(load_state == SubRemLoadMapStateBack) {
scene_manager_previous_scene(app->scene_manager); scene_manager_previous_scene(app->scene_manager);
} else if(start_scene_state == SubmenuIndexSubRemEditMapFile) { } else if(start_scene_state == SubmenuIndexSubRemEditMapFile) {

View File

@@ -39,6 +39,9 @@ void subrem_scene_remote_on_enter(void* context) {
SubGhzRemoteApp* app = context; SubGhzRemoteApp* app = context;
subrem_view_remote_update_data_labels(app->subrem_remote_view, app->map_preset->subs_preset); subrem_view_remote_update_data_labels(app->subrem_remote_view, app->map_preset->subs_preset);
subrem_view_remote_set_radio(
app->subrem_remote_view,
subghz_txrx_radio_device_get(app->txrx) == SubGhzRadioDeviceTypeExternalCC1101);
subrem_view_remote_set_callback(app->subrem_remote_view, subrem_scene_remote_callback, app); subrem_view_remote_set_callback(app->subrem_remote_view, subrem_scene_remote_callback, app);

View File

@@ -18,16 +18,23 @@ static void subghz_remote_app_tick_event_callback(void* context) {
scene_manager_handle_tick_event(app->scene_manager); scene_manager_handle_tick_event(app->scene_manager);
} }
SubGhzRemoteApp* subghz_remote_app_alloc() { static void subghz_remote_make_app_folder(SubGhzRemoteApp* app) {
SubGhzRemoteApp* app = malloc(sizeof(SubGhzRemoteApp)); furi_assert(app);
Storage* storage = furi_record_open(RECORD_STORAGE); Storage* storage = furi_record_open(RECORD_STORAGE);
// Migrate old users data
storage_common_migrate(storage, EXT_PATH("unirf"), SUBREM_APP_FOLDER); storage_common_migrate(storage, EXT_PATH("unirf"), SUBREM_APP_FOLDER);
if(!storage_simply_mkdir(storage, SUBREM_APP_FOLDER)) { if(!storage_simply_mkdir(storage, SUBREM_APP_FOLDER)) {
//FURI_LOG_E(TAG, "Could not create folder %s", SUBREM_APP_FOLDER); // FURI_LOG_E(TAG, "Could not create folder %s", SUBREM_APP_FOLDER);
dialog_message_show_storage_error(app->dialogs, "Cannot create\napp folder");
} }
furi_record_close(RECORD_STORAGE); furi_record_close(RECORD_STORAGE);
}
SubGhzRemoteApp* subghz_remote_app_alloc() {
SubGhzRemoteApp* app = malloc(sizeof(SubGhzRemoteApp));
furi_hal_power_suppress_charge_enter(); furi_hal_power_suppress_charge_enter();
@@ -103,9 +110,6 @@ SubGhzRemoteApp* subghz_remote_app_alloc() {
app->map_not_saved = false; app->map_not_saved = false;
scene_manager_next_scene(app->scene_manager, SubRemSceneStart);
scene_manager_next_scene(app->scene_manager, SubRemSceneOpenMapFile);
return app; return app;
} }
@@ -164,11 +168,33 @@ void subghz_remote_app_free(SubGhzRemoteApp* app) {
free(app); free(app);
} }
int32_t subghz_remote_app(void* p) { int32_t subghz_remote_app(void* arg) {
UNUSED(p);
SubGhzRemoteApp* subghz_remote_app = subghz_remote_app_alloc(); SubGhzRemoteApp* subghz_remote_app = subghz_remote_app_alloc();
furi_string_set(subghz_remote_app->file_path, SUBREM_APP_FOLDER); subghz_remote_make_app_folder(subghz_remote_app);
bool map_loaded = false;
if((arg != NULL) && (strlen(arg) != 0)) {
furi_string_set(subghz_remote_app->file_path, (const char*)arg);
SubRemLoadMapState load_state = subrem_map_file_load(
subghz_remote_app, furi_string_get_cstr(subghz_remote_app->file_path));
if(load_state == SubRemLoadMapStateOK || load_state == SubRemLoadMapStateNotAllOK) {
map_loaded = true;
} else {
// TODO Replace
dialog_message_show_storage_error(subghz_remote_app->dialogs, "Cannot load\nmap file");
}
}
if(map_loaded) {
scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneRemote);
} else {
furi_string_set(subghz_remote_app->file_path, SUBREM_APP_FOLDER);
scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneStart);
scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneOpenMapFile);
}
view_dispatcher_run(subghz_remote_app->view_dispatcher); view_dispatcher_run(subghz_remote_app->view_dispatcher);

View File

@@ -22,6 +22,7 @@ typedef struct {
SubRemViewRemoteState state; SubRemViewRemoteState state;
uint8_t pressed_btn; uint8_t pressed_btn;
bool is_external;
} SubRemViewRemoteModel; } SubRemViewRemoteModel;
void subrem_view_remote_set_callback( void subrem_view_remote_set_callback(
@@ -106,6 +107,15 @@ void subrem_view_remote_set_state(
true); true);
} }
void subrem_view_remote_set_radio(SubRemViewRemote* subrem_view_remote, bool external) {
furi_assert(subrem_view_remote);
with_view_model(
subrem_view_remote->view,
SubRemViewRemoteModel * model,
{ model->is_external = external; },
true);
}
void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) { void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) {
canvas_clear(canvas); canvas_clear(canvas);
canvas_set_color(canvas, ColorBlack); canvas_set_color(canvas, ColorBlack);
@@ -143,6 +153,8 @@ void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) {
elements_button_right(canvas, "Save"); elements_button_right(canvas, "Save");
} else { } else {
canvas_draw_str_aligned(canvas, 11, 62, AlignLeft, AlignBottom, "Hold=Exit."); canvas_draw_str_aligned(canvas, 11, 62, AlignLeft, AlignBottom, "Hold=Exit.");
canvas_draw_str_aligned(
canvas, 126, 62, AlignRight, AlignBottom, ((model->is_external) ? "Ext" : "Int"));
} }
//Status text and indicator //Status text and indicator
@@ -267,6 +279,7 @@ SubRemViewRemote* subrem_view_remote_alloc() {
} }
model->pressed_btn = 0; model->pressed_btn = 0;
model->is_external = false;
}, },
true); true);
return subrem_view_remote; return subrem_view_remote;

View File

@@ -33,4 +33,6 @@ void subrem_view_remote_update_data_labels(
void subrem_view_remote_set_state( void subrem_view_remote_set_state(
SubRemViewRemote* subrem_view_remote, SubRemViewRemote* subrem_view_remote,
SubRemViewRemoteState state, SubRemViewRemoteState state,
uint8_t presed_btn); uint8_t presed_btn);
void subrem_view_remote_set_radio(SubRemViewRemote* subrem_view_remote, bool external);