1
mirror of https://github.com/DarkFlippers/unleashed-firmware.git synced 2025-12-12 12:42:30 +04:00

some improvement and cleanup

This commit is contained in:
gid9798
2023-05-17 17:52:46 +03:00
parent 075dfe8109
commit 24e4c65221
10 changed files with 376 additions and 406 deletions

View File

@@ -6,69 +6,17 @@ typedef enum {
// SubRemCustomEventManagerSetRAW,
//SubmenuIndex
SubmenuIndexOpenMapFile,
SubmenuIndexOpenView, // TODO: temp debug
SubmenuIndexSubRemOpenMapFile,
SubmenuIndexSubRemRemoteView, // TODO: temp debug
SubmenuIndexSubRemAbout,
//SubRemCustomEvent
SubRemCustomEventViewRemoteBack = 100,
SubRemCustomEventViewRemoteStartUP,
SubRemCustomEventViewRemoteStartUP = 100,
SubRemCustomEventViewRemoteStartDOWN,
SubRemCustomEventViewRemoteStartLEFT,
SubRemCustomEventViewRemoteStartRIGHT,
SubRemCustomEventViewRemoteStartOK,
SubRemCustomEventViewRemoteBack,
SubRemCustomEventViewRemoteStop,
// SubRemCustomEventSceneDeleteSuccess = 100,
// SubRemCustomEventSceneDelete,
// SubRemCustomEventSceneDeleteRAW,
// SubRemCustomEventSceneDeleteRAWBack,
// SubRemCustomEventSceneReceiverInfoTxStart,
// SubRemCustomEventSceneReceiverInfoTxStop,
// SubRemCustomEventSceneReceiverInfoSave,
// SubRemCustomEventSceneSaveName,
// SubRemCustomEventSceneSaveSuccess,
// SubRemCustomEventSceneShowErrorBack,
// SubRemCustomEventSceneShowErrorOk,
// SubRemCustomEventSceneShowErrorSub,
// SubRemCustomEventSceneShowOnlyRX,
// SubRemCustomEventSceneAnalyzerLock,
// SubRemCustomEventSceneAnalyzerUnlock,
// SubRemCustomEventSceneSettingLock,
// SubRemCustomEventSceneExit,
// SubRemCustomEventSceneStay,
// SubRemCustomEventSceneRpcLoad,
// SubRemCustomEventSceneRpcButtonPress,
// SubRemCustomEventSceneRpcButtonRelease,
// SubRemCustomEventSceneRpcSessionClose,
// SubRemCustomEventViewReceiverOK,
// SubRemCustomEventViewReceiverConfig,
// SubRemCustomEventViewReceiverBack,
// SubRemCustomEventViewReceiverOffDisplay,
// SubRemCustomEventViewReceiverUnlock,
// SubRemCustomEventViewReceiverDeleteItem,
// SubRemCustomEventViewReadRAWBack,
// SubRemCustomEventViewReadRAWIDLE,
// SubRemCustomEventViewReadRAWREC,
// SubRemCustomEventViewReadRAWConfig,
// SubRemCustomEventViewReadRAWErase,
// SubRemCustomEventViewReadRAWSendStart,
// SubRemCustomEventViewReadRAWSendStop,
// SubRemCustomEventViewReadRAWSave,
// SubRemCustomEventViewReadRAWTXRXStop,
// SubRemCustomEventViewReadRAWMore,
// SubRemCustomEventViewTransmitterBack,
// SubRemCustomEventViewTransmitterSendStart,
// SubRemCustomEventViewTransmitterSendStop,
// SubRemCustomEventViewTransmitterError,
// SubRemCustomEventViewFreqAnalOkShort,
// SubRemCustomEventViewFreqAnalOkLong,
// SubRemCustomEventByteInputDone,
} SubRemCustomEvent;
SubRemCustomEventViewRemoteForcedStop,
} SubRemCustomEvent;

View File

@@ -2,50 +2,39 @@
#include <furi.h>
#include <furi_hal.h>
/*
#define AVR_ISP_VERSION_APP "0.1"
#define AVR_ISP_DEVELOPED "SkorP"
#define AVR_ISP_GITHUB "https://github.com/flipperdevices/flipperzero-firmware"
#define AVR_ISP_APP_FILE_VERSION 1
#define AVR_ISP_APP_FILE_TYPE "Flipper Dump AVR"
#define AVR_ISP_APP_EXTENSION ".avr"
*/
// TODO: rename Filepath
//#define SUBREMOTEMAP_FOLDER "/ext/subghz_remote"
#define SUBGHZ_REMOTE_APP_EXTENSION ".txt"
#define SUBGHZ_REMOTE_APP_PATH_PREFIX "/ext/subghz_remote"
// #define SUBREM_APP_APP_FILE_VERSION 1
// #define SUBREM_APP_APP_FILE_TYPE "Flipper SubRem Map file"
#define SUBREM_APP_EXTENSION ".txt"
typedef enum {
SubRemSubKeyNameUp = (0U),
SubRemSubKeyNameDown,
SubRemSubKeyNameLeft,
SubRemSubKeyNameRight,
SubRemSubKeyNameOk,
SubRemSubKeyNameMaxCount,
} SubRemSubKeyName;
typedef enum {
//SubRemViewVariableItemList,
SubRemViewSubmenu,
//SubRemViewProgrammer,
//SubRemViewReader,
//SubRemViewWriter,
SubRemViewWidget,
SubRemViewPopup,
SubRemViewTextInput,
SubRemViewIDRemote,
//SubRemViewChipDetect,
} SubRemViewID;
typedef enum {
// Loadin State
SubRemSubKeyTypeNoData = 0,
SubRemSubKeyTypeHaveFileName,
// SubRemSubKeyTypeHaveFileName,
// Key Type
SubRemSubKeyTypeStaticKey = 100,
SubRemSubKeyTypeDynamicKey,
SubRemSubKeyTypeRawKey,
} SubRemSubKeyType;
} SubRemSubKeyType; // TODO: depricated
/*
typedef enum {
SubRemErrorNoError,
SubRemErrorReading,
SubRemErrorWriting,
SubRemErrorVerification,
SubRemErrorWritingFuse,
} SubRemError;*/
// typedef enum {
//
// } SubRemLoadMapState;

View File

@@ -4,14 +4,9 @@ void subrem_scene_openmapfile_on_enter(void* context) {
SubGhzRemoteApp* app = context;
if(subrem_load_from_file(app)) {
// if(subghz_get_load_type_file(subghz) == SubGhzLoadTypeFileRaw) {
// subghz_rx_key_state_set(subghz, SubGhzRxKeyStateRAWLoad);
// scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReadRAW);
// } else {
// scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSavedMenu);
// }
scene_manager_next_scene(app->scene_manager, SubRemSceneRemote);
} else {
// TODO: Map Preset Reset
scene_manager_search_and_switch_to_previous_scene(app->scene_manager, SubRemSceneStart);
}
}

View File

@@ -1,5 +1,9 @@
#include "../subghz_remote_app_i.h"
#include "../views/transmitter.h"
#include "../views/remote.h"
#include <lib/subghz/protocols/raw.h>
#define TAG "SubRemScenRemote"
// TODO:
// #include <lib/subghz/protocols/keeloq.h>
@@ -13,61 +17,48 @@ void subrem_scene_remote_callback(SubRemCustomEvent event, void* context) {
view_dispatcher_send_custom_event(app->view_dispatcher, event);
}
bool subrem_scene_remote_update_data_show(void* context) {
void subrem_scene_remote_raw_callback_end_tx(void* context) {
furi_assert(context);
SubGhzRemoteApp* app = context;
view_dispatcher_send_custom_event(app->view_dispatcher, SubRemCustomEventViewRemoteForcedStop);
}
static uint8_t subrem_scene_remote_event_to_index(SubRemCustomEvent event_id) {
uint8_t ret = 0;
if(event_id == SubRemCustomEventViewRemoteStartUP) {
ret = SubRemSubKeyNameUp;
} else if(event_id == SubRemCustomEventViewRemoteStartDOWN) {
ret = SubRemSubKeyNameDown;
} else if(event_id == SubRemCustomEventViewRemoteStartLEFT) {
ret = SubRemSubKeyNameLeft;
} else if(event_id == SubRemCustomEventViewRemoteStartRIGHT) {
ret = SubRemSubKeyNameRight;
} else if(event_id == SubRemCustomEventViewRemoteStartOK) {
ret = SubRemSubKeyNameOk;
}
return ret;
}
static bool subrem_scene_remote_update_data_show(void* context) {
SubGhzRemoteApp* app = context;
//UNUSED(app);
bool ret = false;
subrem_view_remote_add_data_to_show(
//app->subrem_remote_view, "N/A", "N/A", "N/A", "N/A", "N/A");
app->subrem_remote_view,
// "UP",
// "DOWN",
// "LEFT",
// "RIGHT",
// "OK");
furi_string_get_cstr(app->subs_preset[0]->label),
furi_string_get_cstr(app->subs_preset[1]->label),
furi_string_get_cstr(app->subs_preset[2]->label),
furi_string_get_cstr(app->subs_preset[3]->label),
furi_string_get_cstr(app->subs_preset[4]->label));
// SubGhzProtocolDecoderBase* decoder = subghz_txrx_get_decoder(app->txrx);
// if(decoder) {
// FuriString* key_str = furi_string_alloc();
// FuriString* frequency_str = furi_string_alloc();
// FuriString* modulation_str = furi_string_alloc();
// if(subghz_protocol_decoder_base_deserialize(
// decoder, subghz_txrx_get_fff_data(app->txrx)) == SubGhzProtocolStatusOk) {
// subghz_protocol_decoder_base_get_string(decoder, key_str);
// subghz_txrx_get_frequency_and_modulation(
// app->txrx, frequency_str, modulation_str, false);
// subghz_view_transmitter_add_data_to_show(
// app->subghz_transmitter,
// furi_string_get_cstr(key_str),
// furi_string_get_cstr(frequency_str),
// furi_string_get_cstr(modulation_str),
// subghz_txrx_protocol_is_transmittable(app->txrx, false));
// ret = true;
// }
// furi_string_free(frequency_str);
// furi_string_free(modulation_str);
// furi_string_free(key_str);
// }
return ret;
}
void subrem_scene_remote_on_enter(void* context) {
SubGhzRemoteApp* app = context;
// TODO: reset custom btns
// keeloq_reset_original_btn();
// subghz_custom_btns_reset();
// TODO: init view data
if(!subrem_scene_remote_update_data_show(app)) {
@@ -84,63 +75,71 @@ void subrem_scene_remote_on_enter(void* context) {
bool subrem_scene_remote_on_event(void* context, SceneManagerEvent event) {
SubGhzRemoteApp* app = context;
if(event.type == SceneManagerEventTypeCustom) {
// if(event.event == SubGhzCustomEventViewTransmitterSendStart) {
// app->state_notifications = SubGhzNotificationStateIDLE;
// if(subghz_tx_start(app, subghz_txrx_get_fff_data(app->txrx))) {
// app->state_notifications = SubGhzNotificationStateTx;
// subrem_scene_remote_update_data_show(app);
// DOLPHIN_DEED(DolphinDeedSubGhzSend);
// }
// return true;
// } else if(event.event == SubGhzCustomEventViewTransmitterSendStop) {
// app->state_notifications = SubGhzNotificationStateIDLE;
// subghz_txrx_stop(app->txrx);
// if(subghz_custom_btn_get() != 0) {
// subghz_custom_btn_set(0);
// uint8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult();
// furi_hal_subghz_set_rolling_counter_mult(0);
// // Calling restore!
// subghz_tx_start(app, subghz_txrx_get_fff_data(app->txrx));
// subghz_txrx_stop(app->txrx);
// furi_hal_subghz_set_rolling_counter_mult(tmp_counter);
// }
// return true;
// } else
if(event.event == SubRemCustomEventViewRemoteBack) {
// app->state_notifications = SubGhzNotificationStateIDLE; //TODO: notification
scene_manager_search_and_switch_to_previous_scene(
app->scene_manager, SubRemSceneStart);
return true;
} else if(event.event == SubRemCustomEventViewRemoteStartUP) {
if(subghz_tx_start_sub(app, app->subs_preset[0])) {
notification_message(app->notifications, &sequence_blink_start_magenta);
if(!scene_manager_search_and_switch_to_previous_scene(
app->scene_manager, SubRemSceneOpenMapFile)) {
if(!scene_manager_search_and_switch_to_previous_scene(
app->scene_manager, SubRemSceneStart)) {
scene_manager_stop(app->scene_manager);
view_dispatcher_stop(app->view_dispatcher);
}
}
} else if(event.event == SubRemCustomEventViewRemoteStop) {
subghz_tx_stop_sub(app, app->subs_preset[0]);
notification_message(app->notifications, &sequence_blink_stop);
}
// notification_message(app->notification, &sequence_blink_stop);
return true;
} else if(
event.event == SubRemCustomEventViewRemoteStartUP ||
event.event == SubRemCustomEventViewRemoteStartDOWN ||
event.event == SubRemCustomEventViewRemoteStartLEFT ||
event.event == SubRemCustomEventViewRemoteStartRIGHT ||
event.event == SubRemCustomEventViewRemoteStartOK) {
// Start sending sub
subghz_tx_stop_sub(app, true);
app->chusen_sub = subrem_scene_remote_event_to_index(event.event);
subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateLoading);
if(subghz_tx_start_sub(
app,
app->subs_preset[app->chusen_sub],
subrem_scene_remote_raw_callback_end_tx)) {
subrem_view_remote_set_presed_btn(app->subrem_remote_view, app->chusen_sub);
subrem_view_remote_set_state(
app->subrem_remote_view, SubRemViewRemoteStateSending);
notification_message(app->notifications, &sequence_blink_start_magenta);
} else {
subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle);
}
return true;
} else if(event.event == SubRemCustomEventViewRemoteForcedStop) {
subghz_tx_stop_sub(app, true);
subrem_view_remote_set_presed_btn(app->subrem_remote_view, 0);
subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle);
// else if(event.event == SubGhzCustomEventViewTransmitterError) {
// furi_string_set(app->error_str, "Protocol not\nfound!");
// scene_manager_next_scene(app->scene_manager, SubGhzSceneShowErrorSub);
// }
} else if(event.type == SceneManagerEventTypeTick) {
// if(app->state_notifications == SubGhzNotificationStateTx) {
// notification_message(app->notifications, &sequence_blink_magenta_10);
// }
// return true;
notification_message(app->notifications, &sequence_blink_stop);
return true;
} else if(event.event == SubRemCustomEventViewRemoteStop) {
if(subghz_tx_stop_sub(app, false)) {
subrem_view_remote_set_presed_btn(app->subrem_remote_view, 0);
subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle);
notification_message(app->notifications, &sequence_blink_stop);
}
return true;
}
}
// } else if(event.type == SceneManagerEventTypeTick) {
// }
return false;
}
void subrem_scene_remote_on_exit(void* context) {
SubGhzRemoteApp* app = context;
UNUSED(app);
// TODO: notifications and reset KL
//app->state_notifications = SubGhzNotificationStateIDLE;
subghz_tx_stop_sub(app, true);
subrem_view_remote_set_presed_btn(app->subrem_remote_view, 0);
subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle);
notification_message(app->notifications, &sequence_blink_stop);
// TODO: notifications and reset KL
// keeloq_reset_mfname();
// keeloq_reset_kl_type();

View File

@@ -16,23 +16,17 @@ void subrem_scene_start_on_enter(void* context) {
submenu_add_item(
submenu,
"Open Map File",
SubmenuIndexOpenMapFile,
SubmenuIndexSubRemOpenMapFile,
subrem_scene_start_submenu_callback,
app);
#if FURI_DEBUG
submenu_add_item(
submenu, "Remote", SubmenuIndexOpenView, subrem_scene_start_submenu_callback, app);
// submenu_add_item(
// submenu,
// "ISP Programmer",
// SubmenuIndexSubGhzRemoteProgrammer,
// subrem_scene_start_submenu_callback,
// app);
// submenu_add_item(
// submenu,
// "Wiring",
// SubmenuIndexAvrIsWiring,
// subrem_scene_start_submenu_callback,
// app);
submenu,
"Remote_Debug",
SubmenuIndexSubRemRemoteView,
subrem_scene_start_submenu_callback,
app);
#endif
// submenu_add_item(
// submenu,
// "About",
@@ -53,33 +47,21 @@ bool subrem_scene_start_on_event(void* context, SceneManagerEvent event) {
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
if(event.event == SubmenuIndexOpenMapFile) {
if(event.event == SubmenuIndexSubRemOpenMapFile) {
//scene_manager_set_scene_state(app->scene_manager, SubRemSceneStart, event.event);
scene_manager_next_scene(app->scene_manager, SubRemSceneOpenMapFile);
consumed = true;
} else if(event.event == SubmenuIndexOpenView) {
}
// } else if(event.event == SubmenuIndexSubRemAbout) {
// scene_manager_next_scene(app->scene_manager, SubRemSceneAbout);
// consumed = true;
// }
#if FURI_DEBUG
else if(event.event == SubmenuIndexSubRemRemoteView) {
scene_manager_next_scene(app->scene_manager, SubRemSceneRemote);
consumed = true;
}
// } else if(event.event == SubmenuIndexSubGhzRemoteProgrammer) {
// scene_manager_set_scene_state(
// app->scene_manager, SubRemSceneChipDetect, SubGhzRemoteViewProgrammer);
// scene_manager_next_scene(app->scene_manager, SubRemSceneChipDetect);
// consumed = true;
// } else if(event.event == SubmenuIndexSubGhzRemoteReader) {
// scene_manager_set_scene_state(
// app->scene_manager, SubRemSceneChipDetect, SubGhzRemoteViewReader);
// scene_manager_next_scene(app->scene_manager, SubRemSceneChipDetect);
// consumed = true;
// } else if(event.event == SubmenuIndexSubGhzRemoteWriter) {
// scene_manager_set_scene_state(
// app->scene_manager, SubRemSceneChipDetect, SubGhzRemoteViewWriter);
// scene_manager_next_scene(app->scene_manager, SubRemSceneChipDetect);
// consumed = true;
// } else if(event.event == SubmenuIndexAvrIsWiring) {
// scene_manager_next_scene(app->scene_manager, SubRemSceneWiring);
// consumed = true;
// }
scene_manager_set_scene_state(app->scene_manager, SubRemSceneStart, event.event);
#endif
}
return consumed;

View File

@@ -93,29 +93,8 @@ SubGhzRemoteApp* subghz_remote_app_alloc() {
app->view_dispatcher,
SubRemViewIDRemote,
subrem_view_remote_get_view(app->subrem_remote_view));
/*
// Reader view
app->subghz_remote_reader_view = subghz_remote_reader_view_alloc();
view_dispatcher_add_view(
app->view_dispatcher,
SubRemViewReader,
subghz_remote_reader_view_get_view(app->subghz_remote_reader_view));
// Writer view
app->subghz_remote_writer_view = subghz_remote_writer_view_alloc();
view_dispatcher_add_view(
app->view_dispatcher,
SubRemViewWriter,
subghz_remote_writer_view_get_view(app->subghz_remote_writer_view));
// Chip detect view
app->subghz_remote_chip_detect_view = subghz_remote_chip_detect_view_alloc();
view_dispatcher_add_view(
app->view_dispatcher,
SubRemViewChipDetect,
subghz_remote_chip_detect_view_get_view(app->subghz_remote_chip_detect_view));
*/
for(uint8_t i = 0; i < SUBREM_MAX_SUB_KEY_COUNT; i++) {
for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) {
app->subs_preset[i] = subrem_sub_file_preset_alloc();
}
@@ -137,6 +116,8 @@ SubGhzRemoteApp* subghz_remote_app_alloc() {
app->receiver = subghz_receiver_alloc_init(app->environment);
app->tx_running = false;
scene_manager_next_scene(app->scene_manager, SubRemSceneStart);
return app;
@@ -179,26 +160,10 @@ void subghz_remote_app_free(SubGhzRemoteApp* app) {
subghz_environment_free(app->environment);
subghz_setting_free(app->setting);
for(uint8_t i = 0; i < SUBREM_MAX_SUB_KEY_COUNT; i++) {
for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) {
subrem_sub_file_preset_free(app->subs_preset[i]);
}
// // Reader view
// view_dispatcher_remove_view(app->view_dispatcher, SubRemViewReader);
// subghz_remote_reader_view_free(app->subghz_remote_reader_view);
// // Writer view
// view_dispatcher_remove_view(app->view_dispatcher, SubRemViewWriter);
// subghz_remote_writer_view_free(app->subghz_remote_writer_view);
// // Chip detect view
// view_dispatcher_remove_view(app->view_dispatcher, SubRemViewChipDetect);
// subghz_remote_chip_detect_view_free(app->subghz_remote_chip_detect_view);
// // View dispatcher
// view_dispatcher_free(app->view_dispatcher);
// scene_manager_free(app->scene_manager);
// Notifications
furi_record_close(RECORD_NOTIFICATION);
app->notifications = NULL;
@@ -209,11 +174,6 @@ void subghz_remote_app_free(SubGhzRemoteApp* app) {
// Path strings
furi_string_free(app->file_path);
// Disable 5v power
// if(furi_hal_power_is_otg_enabled()) {
// furi_hal_power_disable_otg();
// }
free(app);
}

View File

@@ -7,15 +7,16 @@
#define TAG "SubGhzRemote"
static const char* map_file_labels[SUBREM_MAX_SUB_KEY_COUNT][2] = {
{"UP", "ULABEL"},
{"DOWN", "DLABEL"},
{"LEFT", "LLABEL"},
{"RIGHT", "RLABEL"},
{"OK", "OKLABEL"},
static const char* map_file_labels[SubRemSubKeyNameMaxCount][2] = {
[SubRemSubKeyNameUp] = {"UP", "ULABEL"},
[SubRemSubKeyNameDown] = {"DOWN", "DLABEL"},
[SubRemSubKeyNameLeft] = {"LEFT", "LLABEL"},
[SubRemSubKeyNameRight] = {"RIGHT", "RLABEL"},
[SubRemSubKeyNameOk] = {"OK", "OKLABEL"},
};
bool subrem_set_preset_data(SubGhzSetting* setting, FreqPreset* freq_preset, const char* preset) {
static bool
subrem_set_preset_data(SubGhzSetting* setting, FreqPreset* freq_preset, const char* preset) {
const char* preset_name = "";
if(!strcmp(preset, "FuriHalSubGhzPresetOok270Async")) {
preset_name = "AM270";
@@ -45,7 +46,7 @@ SubRemSubFilePreset* subrem_sub_file_preset_alloc() {
sub_preset->protocaol_name = furi_string_alloc();
sub_preset->label = furi_string_alloc_set_str("N/A");
sub_preset->type = SubRemSubKeyTypeNoData;
sub_preset->type = SubGhzProtocolTypeUnknown;
return sub_preset;
}
@@ -61,7 +62,7 @@ void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset) {
free(sub_preset);
}
void subrem_subs_file_preset_reset(SubRemSubFilePreset* sub_preset) {
static void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset) {
furi_assert(sub_preset);
furi_string_set_str(sub_preset->label, "N/A");
@@ -71,43 +72,45 @@ void subrem_subs_file_preset_reset(SubRemSubFilePreset* sub_preset) {
Stream* fff_data_stream = flipper_format_get_raw_stream(sub_preset->fff_data);
stream_clean(fff_data_stream);
sub_preset->type = SubRemSubKeyTypeNoData;
sub_preset->type = SubGhzProtocolTypeUnknown;
}
void subrem_sub_file_presets_reset(SubGhzRemoteApp* app) {
void subrem_map_preset_reset(SubGhzRemoteApp* app) {
furi_assert(app);
for(uint8_t i = 0; i < SUBREM_MAX_SUB_KEY_COUNT; i++) {
subrem_subs_file_preset_reset(app->subs_preset[i]);
for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) {
subrem_sub_file_preset_reset(app->subs_preset[i]);
}
}
static bool subrem_sub_file_presets_load(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) {
static bool subrem_map_preset_load(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) {
furi_assert(app);
bool ret = false;
for(uint8_t i = 0; i < SUBREM_MAX_SUB_KEY_COUNT; i++) {
SubRemSubFilePreset* sub_preset;
for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) {
sub_preset = app->subs_preset[i];
if(!flipper_format_read_string(
fff_data_file, map_file_labels[i][0], app->subs_preset[i]->file_path)) {
fff_data_file, map_file_labels[i][0], sub_preset->file_path)) {
#if FURO_LOG
FURI_LOG_W(TAG, "No file patch for %s", map_file_labels[i][0]);
app->subs_preset[i]->type = SubRemSubKeyTypeNoData;
//continue;
#endif
sub_preset->type = SubGhzProtocolTypeUnknown;
} else if(!flipper_format_rewind(fff_data_file)) {
// Rewind error
//continue;
} else if(!flipper_format_read_string(
fff_data_file, map_file_labels[i][1], app->subs_preset[i]->label)) {
fff_data_file, map_file_labels[i][1], sub_preset->label)) {
#if FURO_LOG
FURI_LOG_W(TAG, "No Label for %s", map_file_labels[i][0]);
furi_string_set_str(app->subs_preset[i]->label, "N/A");
#endif
furi_string_set_str(sub_preset->label,
"N/A"); // TODO: Standart name or part of name
} else {
FURI_LOG_I(
TAG,
// "Loaded %s key \r\nLabel %s file %s",
"Loaded %s key: %s %s",
"%-5s: %s %s",
map_file_labels[i][0],
furi_string_get_cstr(app->subs_preset[i]->label),
furi_string_get_cstr(app->subs_preset[i]->file_path));
app->subs_preset[i]->type = SubRemSubKeyTypeHaveFileName; // TODO:
furi_string_get_cstr(sub_preset->label),
furi_string_get_cstr(sub_preset->file_path));
ret = true;
}
flipper_format_rewind(fff_data_file);
@@ -115,11 +118,20 @@ static bool subrem_sub_file_presets_load(SubGhzRemoteApp* app, FlipperFormat* ff
return ret;
}
bool subghz_tx_start_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset) {
bool subghz_tx_start_sub(
SubGhzRemoteApp* app,
SubRemSubFilePreset* sub_preset,
SubGhzProtocolEncoderRAWCallbackEnd callback) {
furi_assert(app);
furi_assert(sub_preset);
bool ret = false;
subghz_tx_stop_sub(app, true);
if(sub_preset->type == SubGhzProtocolTypeUnknown) {
return false;
}
FURI_LOG_I(TAG, "Send %s", furi_string_get_cstr(sub_preset->label));
do {
@@ -152,19 +164,27 @@ bool subghz_tx_start_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset)
break;
}
if(sub_preset->type == SubGhzProtocolTypeRAW) {
subghz_protocol_raw_file_encoder_worker_set_callback_end(
(SubGhzProtocolEncoderRAW*)subghz_transmitter_get_protocol_instance(
app->transmitter),
callback,
app);
}
furi_hal_subghz_start_async_tx(subghz_transmitter_yield, app->transmitter);
ret = true;
}
} while(false);
// ret = false; // TODO:
app->tx_running = ret; // TODO:
return ret;
}
void subghz_tx_stop_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset) {
static void subghz_tx_stop(SubGhzRemoteApp* app) {
furi_assert(app);
furi_assert(sub_preset);
//Stop TX
furi_hal_subghz_stop_async_tx();
@@ -172,29 +192,46 @@ void subghz_tx_stop_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset) {
subghz_transmitter_stop(app->transmitter);
subghz_transmitter_free(app->transmitter);
furi_hal_subghz_idle();
}
bool subghz_tx_stop_sub(SubGhzRemoteApp* app, bool forced) {
furi_assert(app);
if(forced || (app->subs_preset[app->chusen_sub]->type != SubGhzProtocolTypeRAW)) {
// SubRemSubKeyTypeRawKey)) {
if(app->tx_running) {
subghz_tx_stop(app);
app->tx_running = false;
return true;
}
}
return false;
// SubRemSubFilePreset* sub_preset = app->subs_preset[app->chusen_sub];
// TODO: need saving logic
}
static bool subrem_sub_presets_check(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) {
static bool subrem_map_preset_check(SubGhzRemoteApp* app, FlipperFormat* fff_data_file) {
furi_assert(app);
FuriString* temp_str = furi_string_alloc();
uint32_t temp_data32;
bool ret = false;
bool sub_preset_loaded = false;
SubRemSubFilePreset* sub_preset;
for(uint8_t i = 0; i < SUBREM_MAX_SUB_KEY_COUNT; i++) {
for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) {
sub_preset = app->subs_preset[i];
if(sub_preset->type == SubRemSubKeyTypeNoData) {
sub_preset_loaded = false;
if(furi_string_empty(sub_preset->file_path)) {
// FURI_LOG_I(TAG, "Empty file path");
continue;
}
do {
if(!flipper_format_file_open_existing(
fff_data_file, furi_string_get_cstr(sub_preset->file_path))) {
FURI_LOG_E(
TAG,
"Error open file %s",
furi_string_get_cstr(sub_preset->file_path)); // TODO: warning
FURI_LOG_W(TAG, "Error open file %s", furi_string_get_cstr(sub_preset->file_path));
break;
}
@@ -213,9 +250,9 @@ static bool subrem_sub_presets_check(SubGhzRemoteApp* app, FlipperFormat* fff_da
//Load frequency
if(!flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) {
FURI_LOG_W(TAG, "Cannot read frequency. Defaulting to 433.92 MHz");
sub_preset->freq_preset.frequency = subghz_setting_get_default_frequency(
app->setting); // TODO: Get default from settings
FURI_LOG_W(TAG, "Cannot read frequency. Set default frequency");
sub_preset->freq_preset.frequency =
subghz_setting_get_default_frequency(app->setting);
} else if(!furi_hal_subghz_is_tx_allowed(temp_data32)) {
FURI_LOG_E(TAG, "This frequency can only be used for RX");
break;
@@ -246,7 +283,6 @@ static bool subrem_sub_presets_check(SubGhzRemoteApp* app, FlipperFormat* fff_da
//if RAW
subghz_protocol_raw_gen_fff_data(
fff_data, furi_string_get_cstr(sub_preset->file_path));
sub_preset->type = SubRemSubKeyTypeRawKey;
} else {
stream_copy_full(
flipper_format_get_raw_stream(fff_data_file),
@@ -262,70 +298,82 @@ static bool subrem_sub_presets_check(SubGhzRemoteApp* app, FlipperFormat* fff_da
if(!protocol) {
FURI_LOG_E(TAG, "Protocol not found");
break;
} else if(protocol->flag & SubGhzProtocolFlag_Send) { // FIXME:
if(protocol->type == SubGhzProtocolTypeStatic) {
sub_preset->type = SubRemSubKeyTypeStaticKey;
} else if(protocol->type == SubGhzProtocolTypeDynamic) {
sub_preset->type = SubRemSubKeyTypeDynamicKey;
} else if(protocol->type == SubGhzProtocolTypeRAW) {
sub_preset->type = SubRemSubKeyTypeRawKey;
// } else if(protocol->type == SubGhzProtocolTypeBinRAW) { // TODO: BINRAW
} else if(protocol->flag & SubGhzProtocolFlag_Send) {
if((protocol->type == SubGhzProtocolTypeStatic) ||
(protocol->type == SubGhzProtocolTypeDynamic) ||
// (protocol->type == SubGhzProtocolTypeBinRAW) || // TODO: BINRAW
(protocol->type == SubGhzProtocolTypeRAW)) {
sub_preset->type = protocol->type;
} else {
FURI_LOG_E(TAG, "Unsuported Protocol");
break;
}
furi_string_set(sub_preset->protocaol_name, temp_str);
} // TODO: check dynamic and protocol found
ret |= true;
if(ret) {
FURI_LOG_I(TAG, "Protocol Loaded");
} else {
FURI_LOG_E(TAG, "Protocol does not support transmission");
}
sub_preset_loaded = true;
ret |= true;
#if FURI_DEBUG
FURI_LOG_I(TAG, "%-16s - protocol Loaded", furi_string_get_cstr(sub_preset->label));
#endif
} while(false);
// TODO:
// Load file state logic
// Label depending on the state
if(!sub_preset_loaded) {
furi_string_set_str(sub_preset->label, "N/A");
}
flipper_format_file_close(fff_data_file);
}
furi_string_free(temp_str);
//ret = false; // TODO:
return ret;
}
bool subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) {
furi_assert(app);
furi_assert(file_path);
// TODO: drop furi log
FURI_LOG_I(TAG, "Load Map File Start"); // drop
#if FURI_DEBUG
FURI_LOG_I(TAG, "Load Map File Start");
#endif
Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* fff_data_file = flipper_format_file_alloc(storage);
bool ret = false;
FURI_LOG_I(TAG, "Open Map File.."); // drop
subrem_sub_file_presets_reset(app);
#if FURI_DEBUG
FURI_LOG_I(TAG, "Open Map File..");
#endif
subrem_map_preset_reset(app);
if(!flipper_format_file_open_existing(fff_data_file, file_path)) {
FURI_LOG_E(TAG, "Could not open MAP file %s", file_path);
} else {
if(!subrem_sub_file_presets_load(app, fff_data_file)) {
// TODO: error popup or return error type
FURI_LOG_E(TAG, "Could no Sub file path in MAP file");
if(!subrem_map_preset_load(app, fff_data_file)) {
FURI_LOG_E(TAG, "Could no Sub file path in MAP file");
// ret = // error for popup
} else if(
(flipper_format_file_close(fff_data_file)) &&
(subrem_sub_presets_check(app, fff_data_file))) {
(subrem_map_preset_check(app, fff_data_file))) {
FURI_LOG_I(TAG, "Load Map File Seccesful");
ret = true;
}
}
// TODO: Pop for error or return error type
if(!ret) {
FURI_LOG_E(TAG, "Broken Map File");
}
flipper_format_file_close(fff_data_file);
flipper_format_free(fff_data_file);
furi_record_close(RECORD_STORAGE);
//ret = false; // TODO:
return ret;
}
@@ -344,7 +392,6 @@ bool subrem_load_from_file(SubGhzRemoteApp* app) {
if(res) {
res = subrem_map_file_load(app, furi_string_get_cstr(app->file_path));
// FIXME res = subghz_key_load(app, furi_string_get_cstr(app->file_path), true);
}
furi_string_free(file_path);

View File

@@ -1,12 +1,12 @@
#pragma once
#include "helpers/subrem_types.h"
#include <subghz_remote_new_icons.h> // TODO:
#include "views/transmitter.h"
#include "views/remote.h"
#include "scenes/subrem_scene.h"
#include <subghz_remote_new_icons.h> // TODO:
#include <gui/gui.h>
#include <gui/view_dispatcher.h>
#include <gui/scene_manager.h>
@@ -18,21 +18,16 @@
#include <storage/storage.h>
#include <gui/modules/popup.h>
#include <lib/subghz/protocols/raw.h>
#include <lib/subghz/subghz_setting.h>
#include <lib/subghz/receiver.h>
#include <lib/subghz/transmitter.h>
#include <flipper_format/flipper_format_i.h> // FIXME:
// #include "views/subghz_remote_view_programmer.h"
// #include "views/subghz_remote_view_reader.h"
// #include "views/subghz_remote_view_writer.h"
// #include "views/subghz_remote_view_chip_detect.h"
#define SUBREM_APP_EXTENSION ".txt"
#define SUBREM_APP_FOLDER "/ext/subghz_remote"
#define SUBREM_APP_FOLDER ANY_PATH("subghz_remote")
#define SUBGHZ_REMOTE_MAX_LEN_NAME 64
#define SUBREM_MAX_SUB_KEY_COUNT (5U)
typedef struct {
uint32_t frequency;
@@ -46,7 +41,7 @@ typedef struct {
FuriString* file_path;
FuriString* protocaol_name;
FuriString* label;
SubRemSubKeyType type;
SubGhzProtocolType type;
} SubRemSubFilePreset;
SubRemSubFilePreset* subrem_sub_file_preset_alloc();
@@ -68,22 +63,25 @@ typedef struct {
SubRemViewRemote* subrem_remote_view;
SubRemSubFilePreset* subs_preset[SUBREM_MAX_SUB_KEY_COUNT];
SubRemSubFilePreset* subs_preset[SubRemSubKeyNameMaxCount];
SubGhzSetting* setting;
SubGhzEnvironment* environment;
SubGhzReceiver* receiver;
SubGhzTransmitter* transmitter;
// AvrIspProgrammerView* subghz_remote_programmer_view;
// AvrIspReaderView* subghz_remote_reader_view;
// AvrIspWriterView* subghz_remote_writer_view;
// AvrIspChipDetectView* subghz_remote_chip_detect_view;
bool tx_running;
// AvrIspError error;
uint8_t chusen_sub;
// TODO: LoadFileError
} SubGhzRemoteApp;
bool subrem_load_from_file(SubGhzRemoteApp* app);
bool subghz_tx_start_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset);
void subghz_tx_stop_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset);
bool subghz_tx_start_sub(
SubGhzRemoteApp* app,
SubRemSubFilePreset* sub_preset,
SubGhzProtocolEncoderRAWCallbackEnd callback);
bool subghz_tx_stop_sub(SubGhzRemoteApp* app, bool forced);

View File

@@ -1,27 +1,18 @@
#include "transmitter.h"
#include "remote.h"
#include "../subghz_remote_app_i.h"
#include <input/input.h>
#include <gui/elements.h>
#define SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH 16
struct SubRemViewRemote {
View* view;
SubRemViewRemoteCallback callback;
void* context;
};
// FIXME: drop
// static char* char_to_str(char* str, int i) {
// char* converted = malloc(sizeof(char) * i + 1);
// memcpy(converted, str, i);
// converted[i] = '\0';
// return converted;
// }
// TODO: model
typedef struct {
// FuriString* up_label;
// FuriString* down_label;
@@ -35,6 +26,8 @@ typedef struct {
char* right_label;
char* ok_label;
SubRemViewRemoteState state;
uint8_t pressed_btn;
// bool show_button;
// FuriString* temp_button_id;
@@ -70,12 +63,6 @@ void subrem_view_remote_add_data_to_show(
strncpy(model->right_label, right_label, SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH);
strncpy(model->ok_label, ok_label, SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH);
// model->up_label = char_to_str((char*)up_label, 16);
// model->down_label = char_to_str((char*)down_label, 16);
// model->left_label = char_to_str((char*)left_label, 16);
// model->right_label = char_to_str((char*)right_label, 16);
// model->ok_label = char_to_str((char*)ok_label, 16);
// furi_string_set(model->up_label, up_label);
// furi_string_set(model->down_label, down_label);
// furi_string_set(model->left_label, left_label);
@@ -85,6 +72,23 @@ void subrem_view_remote_add_data_to_show(
true);
}
void subrem_view_remote_set_presed_btn(SubRemViewRemote* subrem_view_remote, uint8_t presed_btn) {
furi_assert(subrem_view_remote);
with_view_model(
subrem_view_remote->view,
SubRemViewRemoteModel * model,
{ model->pressed_btn = presed_btn; },
true);
}
void subrem_view_remote_set_state(
SubRemViewRemote* subrem_view_remote,
SubRemViewRemoteState state) {
furi_assert(subrem_view_remote);
with_view_model(
subrem_view_remote->view, SubRemViewRemoteModel * model, { model->state = state; }, true);
}
void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) {
canvas_clear(canvas);
canvas_set_color(canvas, ColorBlack);
@@ -126,29 +130,44 @@ void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) {
canvas_draw_str_aligned(canvas, 11, 62, AlignLeft, AlignBottom, "Hold=Exit.");
//Status text and indicator
// canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, app->send_status);
//canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, model->state);
canvas_draw_icon(canvas, 113, 15, &I_Pin_cell_13x13);
switch(model->pressed_btn) {
case 0:
break;
case 1:
canvas_draw_icon(canvas, 116, 17, &I_Pin_arrow_up_7x9);
break;
case 2:
canvas_draw_icon_ex(canvas, 116, 17, &I_Pin_arrow_up_7x9, IconRotation180);
break;
case 3:
canvas_draw_icon_ex(canvas, 115, 18, &I_Pin_arrow_up_7x9, IconRotation90);
break;
case 4:
canvas_draw_icon_ex(canvas, 115, 18, &I_Pin_arrow_up_7x9, IconRotation270);
break;
case 5:
canvas_draw_icon(canvas, 116, 18, &I_Pin_star_7x7);
break;
}
if(model->state == SubRemViewRemoteStateIdle) {
canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, "Idle");
} else {
switch(model->state) {
case SubRemViewRemoteStateSending:
canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, "Send");
break;
case SubRemViewRemoteStateLoading:
canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, "Load");
break;
default:
canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, "Idle");
break;
}
switch(model->pressed_btn) {
case SubRemSubKeyNameUp:
canvas_draw_icon(canvas, 116, 17, &I_Pin_arrow_up_7x9);
break;
case SubRemSubKeyNameDown:
canvas_draw_icon_ex(canvas, 116, 17, &I_Pin_arrow_up_7x9, IconRotation180);
break;
case SubRemSubKeyNameLeft:
canvas_draw_icon_ex(canvas, 115, 18, &I_Pin_arrow_up_7x9, IconRotation270);
break;
case SubRemSubKeyNameRight:
canvas_draw_icon_ex(canvas, 115, 18, &I_Pin_arrow_up_7x9, IconRotation90);
break;
case SubRemSubKeyNameOk:
canvas_draw_icon(canvas, 116, 18, &I_Pin_star_7x7);
break;
}
}
//Repeat indicator
//canvas_draw_str_aligned(canvas, 125, 40, AlignRight, AlignBottom, "Repeat:");
//canvas_draw_icon(canvas, 115, 39, &I_SubGHzRemote_Repeat_12x14);
@@ -160,6 +179,7 @@ bool subrem_view_remote_input(InputEvent* event, void* context) {
SubRemViewRemote* subrem_view_remote = context;
if(event->key == InputKeyBack && event->type == InputTypeLong) {
// TODO: remove reset Debug
with_view_model(
subrem_view_remote->view,
SubRemViewRemoteModel * model,
@@ -177,28 +197,47 @@ bool subrem_view_remote_input(InputEvent* event, void* context) {
// furi_string_reset(model->ok_label);
},
false);
return false;
} else if(event->key == InputKeyUp) {
if(event->type == InputTypePress) {
with_view_model(
subrem_view_remote->view,
SubRemViewRemoteModel * model,
{ model->pressed_btn = 1; },
true);
subrem_view_remote->callback(
SubRemCustomEventViewRemoteStartUP, subrem_view_remote->context);
return true;
} else if(event->type == InputTypeRelease) {
with_view_model(
subrem_view_remote->view,
SubRemViewRemoteModel * model,
{ model->pressed_btn = 0; },
true);
subrem_view_remote->callback(
SubRemCustomEventViewRemoteStop, subrem_view_remote->context);
return true;
}
subrem_view_remote->callback(SubRemCustomEventViewRemoteBack, subrem_view_remote->context);
return true;
} else if(event->key == InputKeyBack && event->type == InputTypeShort) {
with_view_model(
subrem_view_remote->view,
SubRemViewRemoteModel * model,
{ model->pressed_btn = 0; },
true);
subrem_view_remote->callback(
SubRemCustomEventViewRemoteForcedStop, subrem_view_remote->context);
return true;
} else if(event->key == InputKeyBack) {
return true;
}
// BACK button processing end
if(event->key == InputKeyUp && event->type == InputTypePress) {
subrem_view_remote->callback(
SubRemCustomEventViewRemoteStartUP, subrem_view_remote->context);
return true;
} else if(event->key == InputKeyDown && event->type == InputTypePress) {
subrem_view_remote->callback(
SubRemCustomEventViewRemoteStartDOWN, subrem_view_remote->context);
return true;
} else if(event->key == InputKeyLeft && event->type == InputTypePress) {
subrem_view_remote->callback(
SubRemCustomEventViewRemoteStartLEFT, subrem_view_remote->context);
return true;
} else if(event->key == InputKeyRight && event->type == InputTypePress) {
subrem_view_remote->callback(
SubRemCustomEventViewRemoteStartRIGHT, subrem_view_remote->context);
return true;
} else if(event->key == InputKeyOk && event->type == InputTypePress) {
subrem_view_remote->callback(
SubRemCustomEventViewRemoteStartOK, subrem_view_remote->context);
return true;
} else if(event->type == InputTypeRelease) {
subrem_view_remote->callback(SubRemCustomEventViewRemoteStop, subrem_view_remote->context);
return true;
}
return true;
}
@@ -227,6 +266,8 @@ SubRemViewRemote* subrem_view_remote_alloc() {
subrem_view_remote->view,
SubRemViewRemoteModel * model,
{
model->state = SubRemViewRemoteStateIdle;
model->up_label = malloc(sizeof(char) * SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH + 1);
model->down_label = malloc(sizeof(char) * SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH + 1);
model->left_label = malloc(sizeof(char) * SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH + 1);

View File

@@ -3,6 +3,12 @@
#include <gui/view.h>
#include "../helpers/subrem_custom_event.h"
typedef enum {
SubRemViewRemoteStateIdle,
SubRemViewRemoteStateLoading,
SubRemViewRemoteStateSending,
} SubRemViewRemoteState;
typedef struct SubRemViewRemote SubRemViewRemote;
typedef void (*SubRemViewRemoteCallback)(SubRemCustomEvent event, void* context);
@@ -24,4 +30,9 @@ void subrem_view_remote_add_data_to_show(
const char* down_label,
const char* left_label,
const char* right_label,
const char* ok_label);
const char* ok_label);
void subrem_view_remote_set_presed_btn(SubRemViewRemote* subrem_view_remote, uint8_t presed_btn);
void subrem_view_remote_set_state(
SubRemViewRemote* subrem_view_remote,
SubRemViewRemoteState state);