Skip to content

Commit

Permalink
Add "repeat" setting
Browse files Browse the repository at this point in the history
Bump settings file ver
Bump app ver
Repeat mode setting in setting menu and emulate config
Saved # repeats & default repeat mode
Emulation logic
  • Loading branch information
zacharyweiss committed May 10, 2024
1 parent 40433b8 commit 08781c7
Show file tree
Hide file tree
Showing 7 changed files with 203 additions and 45 deletions.
2 changes: 1 addition & 1 deletion application.fam
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ App(
fap_category="GPIO",
fap_icon_assets="icons",
fap_icon_assets_symbol="mag",
fap_version=(0, 7), # major, minor
fap_version=(0, 8), # major, minor
fap_description="Enables wireless transmission of magstripe data",
fap_author="Zachary Weiss",
fap_weburl="https://github.com/zacharyweiss/magspoof_flipper",
Expand Down
61 changes: 34 additions & 27 deletions helpers/mag_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,40 +331,47 @@ void mag_spoof(Mag* mag) {

if(!tx_init(state)) return;

FURI_CRITICAL_ENTER();
for(uint16_t i = 0; i < (ZERO_PREFIX * 2); i++) {
// is this right?
if(!!(i % 2)) bit ^= 1;
play_halfbit(bit, state);
furi_delay_us(state->us_clock);
}

if((state->track == MagTrackStateOneAndTwo) || (state->track == MagTrackStateOne))
play_track((uint8_t*)bits_t1_manchester, bits_t1_count, state, false);

if((state->track == MagTrackStateOneAndTwo))
for(uint16_t i = 0; i < (ZERO_BETWEEN * 2); i++) {
uint8_t i = 0;
do {
FURI_CRITICAL_ENTER();
for(uint16_t i = 0; i < (ZERO_PREFIX * 2); i++) {
// is this right?
if(!!(i % 2)) bit ^= 1;
play_halfbit(bit, state);
furi_delay_us(state->us_clock);
}

if((state->track == MagTrackStateOneAndTwo) || (state->track == MagTrackStateTwo))
play_track(
(uint8_t*)bits_t2_manchester,
bits_t2_count,
state,
(state->reverse == MagReverseStateOn));
if((state->track == MagTrackStateOneAndTwo) || (state->track == MagTrackStateOne))
play_track((uint8_t*)bits_t1_manchester, bits_t1_count, state, false);

if((state->track == MagTrackStateThree))
play_track((uint8_t*)bits_t3_manchester, bits_t3_count, state, false);
if((state->track == MagTrackStateOneAndTwo))
for(uint16_t i = 0; i < (ZERO_BETWEEN * 2); i++) {
if(!!(i % 2)) bit ^= 1;
play_halfbit(bit, state);
furi_delay_us(state->us_clock);
}

for(uint16_t i = 0; i < (ZERO_SUFFIX * 2); i++) {
if(!!(i % 2)) bit ^= 1;
play_halfbit(bit, state);
furi_delay_us(state->us_clock);
}
FURI_CRITICAL_EXIT();
if((state->track == MagTrackStateOneAndTwo) || (state->track == MagTrackStateTwo))
play_track(
(uint8_t*)bits_t2_manchester,
bits_t2_count,
state,
(state->reverse == MagReverseStateOn));

if((state->track == MagTrackStateThree))
play_track((uint8_t*)bits_t3_manchester, bits_t3_count, state, false);

for(uint16_t i = 0; i < (ZERO_SUFFIX * 2); i++) {
if(!!(i % 2)) bit ^= 1;
play_halfbit(bit, state);
furi_delay_us(state->us_clock);
}
FURI_CRITICAL_EXIT();

i++;
FURI_LOG_D(
TAG, "TX %u (n_repeats: %u, repeat_mode: %u)", i, state->n_repeats, state->repeat_mode);
} while((i < state->n_repeats) && state->repeat_mode);

free(data1);
free(data2);
Expand Down
2 changes: 2 additions & 0 deletions helpers/mag_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ typedef enum {
#define MAG_STATE_DEFAULT_PIN_OUTPUT MagPinA6
#define MAG_STATE_DEFAULT_PIN_ENABLE MagPinA4
#define MAG_STATE_DEFAULT_ALLOW_UART false
#define MAG_STATE_DEFAULT_N_REPEATS 3
#define MAG_STATE_DEFAULT_REPEAT_MODE true

typedef enum {
MagViewSubmenu,
Expand Down
20 changes: 14 additions & 6 deletions mag_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,15 @@ bool mag_state_load(MagState* out_state) {
if(tmp != MAG_STATE_VER) break;

if(!flipper_format_read_uint32(file, "pin_input", &tmp, 1)) break;
state.pin_input = tmp;
state.pin_input = (MagPin)tmp;
if(!flipper_format_read_uint32(file, "pin_output", &tmp, 1)) break;
state.pin_output = tmp;
state.pin_output = (MagPin)tmp;
if(!flipper_format_read_uint32(file, "pin_enable", &tmp, 1)) break;
state.pin_enable = tmp;
state.pin_enable = (MagPin)tmp;
if(!flipper_format_read_bool(file, "allow_uart", &state.allow_uart, 1)) break;
if(!flipper_format_read_uint32(file, "n_repeats", &tmp, 1)) break;
state.n_repeats = (uint8_t)tmp;
if(!flipper_format_read_bool(file, "repeat_mode", &state.repeat_mode, 1)) break;

loaded_from_file = true;
} while(0);
Expand All @@ -76,6 +79,8 @@ bool mag_state_load(MagState* out_state) {

if(!loaded_from_file) {
state.allow_uart = MAG_STATE_DEFAULT_ALLOW_UART;
state.n_repeats = MAG_STATE_DEFAULT_N_REPEATS;
state.repeat_mode = MAG_STATE_DEFAULT_REPEAT_MODE;
}

// set defaults we don't save
Expand All @@ -102,13 +107,16 @@ void mag_state_save(MagState* state) {
if(!flipper_format_file_open_always(file, MAG_STATE_PATH)) break;
if(!flipper_format_write_header_cstr(file, MAG_STATE_HEADER, MAG_STATE_VER)) break;

tmp = state->pin_input;
tmp = (uint32_t)state->pin_input;
if(!flipper_format_write_uint32(file, "pin_input", &tmp, 1)) break;
tmp = state->pin_output;
tmp = (uint32_t)state->pin_output;
if(!flipper_format_write_uint32(file, "pin_output", &tmp, 1)) break;
tmp = state->pin_enable;
tmp = (uint32_t)state->pin_enable;
if(!flipper_format_write_uint32(file, "pin_enable", &tmp, 1)) break;
if(!flipper_format_write_bool(file, "allow_uart", &state->allow_uart, 1)) break;
tmp = (uint32_t)state->n_repeats;
if(!flipper_format_write_uint32(file, "n_repeats", &tmp, 1)) break;
if(!flipper_format_write_bool(file, "repeat_mode", &state->repeat_mode, 1)) break;

} while(0);
flipper_format_free(file);
Expand Down
4 changes: 3 additions & 1 deletion mag_state.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include "helpers/mag_types.h"

#define MAG_STATE_HEADER "Mag State"
#define MAG_STATE_VER 1
#define MAG_STATE_VER 2
#define MAG_STATE_DIR STORAGE_APP_DATA_PATH_PREFIX
#define MAG_STATE_PATH MAG_STATE_DIR "/mag_state.txt"

Expand All @@ -29,6 +29,8 @@ typedef struct {
MagPin pin_enable;
bool allow_uart;
bool is_debug;
uint8_t n_repeats;
bool repeat_mode;
} MagState;

const GpioPin* mag_state_enum_to_pin(MagPin pin);
Expand Down
41 changes: 32 additions & 9 deletions scenes/mag_scene_emulate_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
#define TAG "MagSceneEmulateConfig"

enum MagEmulateConfigIndex {
MagEmulateConfigIndexTx,
MagEmulateConfigIndexClock,
MagEmulateConfigIndexTrack,
MagEmulateConfigIndexReverse,
MagEmulateConfigIndexClock,
MagEmulateConfigIndexInterpacket,
MagEmulateConfigIndexRepeat,
MagEmulateConfigIndexTx,
// MagEmulateConfigIndexInterpacket,
};

#define TX_COUNT 7
Expand Down Expand Up @@ -163,6 +164,14 @@ static void mag_scene_emulate_config_set_reverse(VariableItem* item) {
}
};

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);
Expand Down Expand Up @@ -190,15 +199,15 @@ void mag_scene_emulate_config_on_enter(void* context) {
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);
scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
// scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
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);
scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
//scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, track_text[value_index]);

Expand All @@ -211,7 +220,19 @@ void mag_scene_emulate_config_on_enter(void* context) {
mag_scene_emulate_config_set_reverse,
mag);
value_index = value_index_uint32(mag->state.reverse, reverse_value, REVERSE_COUNT);
scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
//scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
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;
//scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, reverse_text[value_index]);

Expand All @@ -222,7 +243,7 @@ void mag_scene_emulate_config_on_enter(void* context) {
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);
scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
//scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, tx_text[value_index]);
#ifdef FW_ORIGIN_Official
Expand All @@ -245,6 +266,10 @@ void mag_scene_emulate_config_on_enter(void* context) {
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);
}

Expand All @@ -264,6 +289,4 @@ 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);
// mag_last_settings_save?
// scene_manager_set_scene_state? Using subghz_scene_reciever_config as framework/inspo
}
Loading

0 comments on commit 08781c7

Please sign in to comment.