mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-16 04:24:45 -07:00
SubRem: archive browser
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ typedef enum {
|
|||||||
ArchiveFileTypeIButton,
|
ArchiveFileTypeIButton,
|
||||||
ArchiveFileTypeNFC,
|
ArchiveFileTypeNFC,
|
||||||
ArchiveFileTypeSubGhz,
|
ArchiveFileTypeSubGhz,
|
||||||
|
ArchiveFileTypeSubGhzRemote,
|
||||||
ArchiveFileTypeLFRFID,
|
ArchiveFileTypeLFRFID,
|
||||||
ArchiveFileTypeInfrared,
|
ArchiveFileTypeInfrared,
|
||||||
ArchiveFileTypeBadUsb,
|
ArchiveFileTypeBadUsb,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
ArchiveTabFavorites,
|
ArchiveTabFavorites,
|
||||||
ArchiveTabSubGhz,
|
ArchiveTabSubGhz,
|
||||||
|
ArchiveTabSubGhzRemote,
|
||||||
ArchiveTabLFRFID,
|
ArchiveTabLFRFID,
|
||||||
ArchiveTabNFC,
|
ArchiveTabNFC,
|
||||||
ArchiveTabInfrared,
|
ArchiveTabInfrared,
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
Reference in New Issue
Block a user