#include "../mag_i.h" #define TAG "MagSceneEmulateConfig" enum MagEmulateConfigIndex { MagEmulateConfigIndexClock, MagEmulateConfigIndexTrack, MagEmulateConfigIndexReverse, MagEmulateConfigIndexRepeat, MagEmulateConfigIndexTx, // MagEmulateConfigIndexInterpacket, }; #define TX_COUNT 7 const char* const tx_text[TX_COUNT] = { "RFID", "GPIO", "Piezo", "LF + P", "NFC", "434MHz", "868MHz", }; const uint32_t tx_value[TX_COUNT] = { MagTxStateRFID, MagTxStateGPIO, MagTxStatePiezo, MagTxStateLF_P, MagTxStateNFC, MagTxCC1101_434, MagTxCC1101_868, }; #define TRACK_COUNT 4 const char* const track_text[TRACK_COUNT] = { "1 + 2", "1", "2", "3", }; const uint32_t track_value[TRACK_COUNT] = { MagTrackStateOneAndTwo, MagTrackStateOne, MagTrackStateTwo, MagTrackStateThree, }; #define REVERSE_COUNT 2 const char* const reverse_text[REVERSE_COUNT] = { "OFF", "ON", }; const uint32_t reverse_value[REVERSE_COUNT] = { MagReverseStateOff, MagReverseStateOn, }; #define CLOCK_COUNT 15 const char* const clock_text[CLOCK_COUNT] = { "200us", "220us", "240us", "250us", "260us", "280us", "300us", "325us", "350us", "375us", "400us", "450us", "500us", "600us", "700us", }; const uint32_t clock_value[CLOCK_COUNT] = { 200, 220, 240, 250, 260, 280, 300, 325, 350, 375, 400, 450, 500, 600, 700, }; #define INTERPACKET_COUNT 13 const char* const interpacket_text[INTERPACKET_COUNT] = { "0us", "2us", "4us", "6us", "8us", "10us", "12us", "14us", "16us", "18us", "20us", "25us", "30us", }; const uint32_t interpacket_value[INTERPACKET_COUNT] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 25, 30, }; static void mag_scene_emulate_config_set_tx(VariableItem* item) { Mag* mag = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, tx_text[index]); mag->state.tx = tx_value[index]; } static void mag_scene_emulate_config_set_track(VariableItem* item) { Mag* mag = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); if(mag->state.reverse == MagReverseStateOff) { variable_item_set_current_value_text(item, track_text[index]); mag->state.track = track_value[index]; } else if(mag->state.reverse == MagReverseStateOn) { variable_item_set_current_value_index( item, value_index_uint32(MagTrackStateOneAndTwo, track_value, TRACK_COUNT)); } // TODO: Check there is data in selected track? // Only display track options with data? } static void mag_scene_emulate_config_set_reverse(VariableItem* item) { Mag* mag = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); if(mag->state.track == MagTrackStateOneAndTwo) { // only allow reverse track to be set when playing both 1 and 2 variable_item_set_current_value_text(item, reverse_text[index]); mag->state.reverse = reverse_value[index]; //FURI_LOG_D(TAG, "%s", reverse_text[index]); //FURI_LOG_D(TAG, "%d", mag->setting->reverse); } else { variable_item_set_current_value_index( item, value_index_uint32(MagReverseStateOff, reverse_value, REVERSE_COUNT)); } } static void mag_scene_emulate_config_set_repeat_mode(VariableItem* item) { Mag* mag = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, reverse_text[index]); mag->state.repeat_mode = (bool)index; } static void mag_scene_emulate_config_set_clock(VariableItem* item) { Mag* mag = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, clock_text[index]); mag->state.us_clock = clock_value[index]; } static void mag_scene_emulate_config_set_interpacket(VariableItem* item) { Mag* mag = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, interpacket_text[index]); mag->state.us_interpacket = interpacket_value[index]; } void mag_scene_emulate_config_on_enter(void* context) { Mag* mag = context; VariableItem* item; uint8_t value_index; // Clock item = variable_item_list_add( mag->variable_item_list, "Clock:", CLOCK_COUNT, mag_scene_emulate_config_set_clock, mag); value_index = value_index_uint32(mag->state.us_clock, clock_value, CLOCK_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, clock_text[value_index]); // Track item = variable_item_list_add( mag->variable_item_list, "Track:", TRACK_COUNT, mag_scene_emulate_config_set_track, mag); value_index = value_index_uint32(mag->state.track, track_value, TRACK_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, track_text[value_index]); // Reverse //FURI_LOG_D(TAG, "%d", mag->setting->reverse); item = variable_item_list_add( mag->variable_item_list, "Reverse:", REVERSE_COUNT, mag_scene_emulate_config_set_reverse, mag); value_index = value_index_uint32(mag->state.reverse, reverse_value, REVERSE_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, reverse_text[value_index]); // Repeated TX item = variable_item_list_add( mag->variable_item_list, "Repeat:", REVERSE_COUNT, mag_scene_emulate_config_set_repeat_mode, mag); value_index = (uint32_t)mag->state.repeat_mode; variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, reverse_text[value_index]); // TX #ifdef FW_ORIGIN_Official if(mag->state.is_debug) { #endif item = variable_item_list_add( mag->variable_item_list, "TX via:", TX_COUNT, mag_scene_emulate_config_set_tx, mag); value_index = value_index_uint32(mag->state.tx, tx_value, TX_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, tx_text[value_index]); #ifdef FW_ORIGIN_Official } #else variable_item_set_locked(item, !mag->state.is_debug, "Enable Debug!"); #endif // Interpacket /* item = variable_item_list_add( mag->variable_item_list, "Interpacket:", INTERPACKET_COUNT, mag_scene_emulate_config_set_interpacket, mag); value_index = value_index_uint32(mag->setting->us_interpacket, interpacket_value, INTERPACKET_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, interpacket_text[value_index]);*/ UNUSED(mag_scene_emulate_config_set_interpacket); variable_item_list_set_selected_item( mag->variable_item_list, scene_manager_get_scene_state(mag->scene_manager, MagSceneEmulateConfig)); view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewVariableItemList); } bool mag_scene_emulate_config_on_event(void* context, SceneManagerEvent event) { Mag* mag = context; SceneManager* scene_manager = mag->scene_manager; bool consumed = false; UNUSED(mag); UNUSED(scene_manager); UNUSED(event); return consumed; } void mag_scene_emulate_config_on_exit(void* context) { Mag* mag = context; variable_item_list_set_selected_item(mag->variable_item_list, 0); variable_item_list_reset(mag->variable_item_list); }