Skip to content

Commit ab15432

Browse files
committed
Refactor track autoselect
Prior hacky approach didn't work for launches w/ args (straight to emulate scene), this fixes it
1 parent 51179f0 commit ab15432

File tree

6 files changed

+63
-31
lines changed

6 files changed

+63
-31
lines changed

helpers/mag_types.h

+31-10
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,6 @@
44
#define MAG_DEVELOPER "Zachary Weiss"
55
#define MAG_GITHUB "github.com/zacharyweiss/magspoof_flipper"
66

7-
typedef enum {
8-
MagViewSubmenu,
9-
MagViewDialogEx,
10-
MagViewPopup,
11-
MagViewLoading,
12-
MagViewWidget,
13-
MagViewVariableItemList,
14-
MagViewTextInput,
15-
} MagView;
16-
177
typedef enum {
188
MagReverseStateOff,
199
MagReverseStateOn,
@@ -36,6 +26,37 @@ typedef enum {
3626
MagTxCC1101_868,
3727
} MagTxState;
3828

29+
typedef enum {
30+
MagPinA7,
31+
MagPinA6,
32+
MagPinA4,
33+
MagPinB3,
34+
MagPinB2,
35+
MagPinC3,
36+
MagPinC1,
37+
MagPinC0,
38+
} MagPin;
39+
40+
#define MAG_STATE_DEFAULT_REVERSE MagReverseStateOff
41+
#define MAG_STATE_DEFAULT_TRACK MagTrackStateOneAndTwo
42+
#define MAG_STATE_DEFAULT_TX MagTxStateGPIO
43+
#define MAG_STATE_DEFAULT_US_CLOCK 240
44+
#define MAG_STATE_DEFAULT_US_INTERPACKET 10
45+
#define MAG_STATE_DEFAULT_PIN_INPUT MagPinA7
46+
#define MAG_STATE_DEFAULT_PIN_OUTPUT MagPinA6
47+
#define MAG_STATE_DEFAULT_PIN_ENABLE MagPinA4
48+
#define MAG_STATE_DEFAULT_ALLOW_UART false
49+
50+
typedef enum {
51+
MagViewSubmenu,
52+
MagViewDialogEx,
53+
MagViewPopup,
54+
MagViewLoading,
55+
MagViewWidget,
56+
MagViewVariableItemList,
57+
MagViewTextInput,
58+
} MagView;
59+
3960
typedef enum {
4061
UART_TerminalEventRefreshConsoleOutput = 0,
4162
UART_TerminalEventStartConsole,

mag.c

+4
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ int32_t mag_app(void* p) {
164164
scene_manager_next_scene(mag->scene_manager, MagSceneStart);
165165
} else {
166166
mag_device_load_data(mag->mag_dev, mag->args, true);
167+
MagTrackState auto_track = mag_device_autoselect_track_state(mag->mag_dev);
168+
if(auto_track) {
169+
mag->state.track = auto_track;
170+
}
167171
scene_manager_next_scene(mag->scene_manager, MagSceneEmulate);
168172
}
169173

mag_device.c

+21
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,27 @@ bool mag_device_parse_card_string(MagDevice* mag_dev, FuriString* f_card_str) {
301301
return true;
302302
}
303303

304+
MagTrackState mag_device_autoselect_track_state(MagDevice* mag_dev) {
305+
// messy code to quickly check which tracks are available for emulation/display
306+
bool is_empty_t1 = furi_string_empty(mag_dev->dev_data.track[0].str);
307+
bool is_empty_t2 = furi_string_empty(mag_dev->dev_data.track[1].str);
308+
bool is_empty_t3 = furi_string_empty(mag_dev->dev_data.track[2].str);
309+
310+
if(!is_empty_t1 && !is_empty_t2) {
311+
return MagTrackStateOneAndTwo;
312+
} else if(!is_empty_t1) {
313+
return MagTrackStateOne;
314+
} else if(!is_empty_t2) {
315+
return MagTrackStateTwo;
316+
} else if(!is_empty_t3) {
317+
return MagTrackStateThree;
318+
}
319+
320+
// if all empty (or something wrong with the above code)
321+
// return default value
322+
return MAG_STATE_DEFAULT_TRACK;
323+
}
324+
304325
void mag_device_set_loading_callback(
305326
MagDevice* mag_dev,
306327
MagLoadingCallback callback,

mag_device.h

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <dialogs/dialogs.h>
77

88
#include "mag_icons.h"
9+
#include "helpers/mag_types.h"
910

1011
#include <assets_icons.h>
1112

@@ -56,6 +57,8 @@ bool mag_device_delete(MagDevice* mag_dev, bool use_load_path);
5657

5758
bool mag_device_parse_card_string(MagDevice* mag_dev, FuriString* card_str);
5859

60+
MagTrackState mag_device_autoselect_track_state(MagDevice* mag_dev);
61+
5962
void mag_device_set_loading_callback(
6063
MagDevice* mag_dev,
6164
MagLoadingCallback callback,

mag_state.h

-21
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,6 @@
1818
#define MAG_STATE_DIR STORAGE_APP_DATA_PATH_PREFIX
1919
#define MAG_STATE_PATH MAG_STATE_DIR "/mag_state.txt"
2020

21-
typedef enum {
22-
MagPinA7,
23-
MagPinA6,
24-
MagPinA4,
25-
MagPinB3,
26-
MagPinB2,
27-
MagPinC3,
28-
MagPinC1,
29-
MagPinC0,
30-
} MagPin;
31-
32-
#define MAG_STATE_DEFAULT_REVERSE MagReverseStateOff
33-
#define MAG_STATE_DEFAULT_TRACK MagTrackStateOneAndTwo
34-
#define MAG_STATE_DEFAULT_TX MagTxStateGPIO
35-
#define MAG_STATE_DEFAULT_US_CLOCK 240
36-
#define MAG_STATE_DEFAULT_US_INTERPACKET 10
37-
#define MAG_STATE_DEFAULT_PIN_INPUT MagPinA7
38-
#define MAG_STATE_DEFAULT_PIN_OUTPUT MagPinA6
39-
#define MAG_STATE_DEFAULT_PIN_ENABLE MagPinA4
40-
#define MAG_STATE_DEFAULT_ALLOW_UART false
41-
4221
typedef struct {
4322
MagTxState tx;
4423
MagTrackState track;

scenes/mag_scene_file_select.c

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ void mag_scene_file_select_on_enter(void* context) {
55
Mag* mag = context;
66
mag_device_set_loading_callback(mag->mag_dev, mag_show_loading_popup, mag);
77
if(mag_file_select(mag->mag_dev)) {
8+
MagTrackState auto_track = mag_device_autoselect_track_state(mag->mag_dev);
9+
if(auto_track) {
10+
mag->state.track = auto_track;
11+
}
812
scene_manager_next_scene(mag->scene_manager, MagSceneSavedMenu);
913
} else {
1014
scene_manager_search_and_switch_to_previous_scene(mag->scene_manager, MagSceneStart);

0 commit comments

Comments
 (0)