Skip to content

Commit ae5ca16

Browse files
committed
Prelim state save/load, refactoring
1 parent 0acc57d commit ae5ca16

14 files changed

+308
-161
lines changed

helpers/mag_helpers.c

+28-51
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,8 @@ const int sublen[] = {32, 48, 48};
1919

2020
uint8_t last_value = 2;
2121

22-
const GpioPin* mag_gpio_enum_to_pin(MagSettingPin pin) {
23-
switch(pin) {
24-
case MagSettingPinA7:
25-
return &gpio_ext_pa7;
26-
case MagSettingPinA6:
27-
return &gpio_ext_pa6;
28-
case MagSettingPinA4:
29-
return &gpio_ext_pa4;
30-
case MagSettingPinB3:
31-
return &gpio_ext_pb3;
32-
case MagSettingPinB2:
33-
return &gpio_ext_pb2;
34-
case MagSettingPinC3:
35-
return &gpio_ext_pc3;
36-
case MagSettingPinC1:
37-
return &gpio_ext_pc1;
38-
case MagSettingPinC0:
39-
return &gpio_ext_pc0;
40-
default:
41-
return NULL;
42-
}
43-
}
44-
45-
void play_halfbit(bool value, MagSetting* setting) {
46-
switch(setting->tx) {
22+
void play_halfbit(bool value, MagState* state) {
23+
switch(state->tx) {
4724
case MagTxStateRFID:
4825
furi_hal_gpio_write(RFID_PIN_OUT, value);
4926
/*furi_hal_gpio_write(RFID_PIN_OUT, !value);
@@ -111,7 +88,7 @@ void play_halfbit(bool value, MagSetting* setting) {
11188
last_value = value;
11289
}
11390

114-
void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagSetting* setting, bool reverse) {
91+
void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagState* state, bool reverse) {
11592
for(uint16_t i = 0; i < n_bits; i++) {
11693
uint16_t j = (reverse) ? (n_bits - i - 1) : i;
11794
uint8_t byte = j / 8;
@@ -140,9 +117,9 @@ void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagSetting* setting,
140117
// for DWT->CYCCNT. Note timer is aliased to 64us as per
141118
// #define FURI_HAL_CORTEX_INSTRUCTIONS_PER_MICROSECOND (SystemCoreClock / 1000000) | furi_hal_cortex.c
142119

143-
play_halfbit(bit, setting);
144-
furi_delay_us(setting->us_clock);
145-
// if (i % 2 == 1) furi_delay_us(setting->us_interpacket);
120+
play_halfbit(bit, state);
121+
furi_delay_us(state->us_clock);
122+
// if (i % 2 == 1) furi_delay_us(state->us_interpacket);
146123
}
147124
}
148125

@@ -154,7 +131,7 @@ void tx_init_rfid() {
154131
// furi_hal_ibutton_start_drive();
155132
furi_hal_ibutton_pin_write(false);
156133

157-
// Initializing at GpioSpeedLow seems sufficient for our needs; no improvements seen by increasing speed setting
134+
// Initializing at GpioSpeedLow seems sufficient for our needs; no improvements seen by increasing speed state
158135

159136
// this doesn't seem to make a difference, leaving it in
160137
furi_hal_gpio_init(&gpio_rfid_data_in, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
@@ -202,9 +179,9 @@ void tx_deinit_piezo() {
202179
furi_hal_gpio_init(&gpio_speaker, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
203180
}
204181

205-
bool tx_init(MagSetting* setting) {
182+
bool tx_init(MagState* state) {
206183
// Initialize configured TX method
207-
switch(setting->tx) {
184+
switch(state->tx) {
208185
case MagTxStateRFID:
209186
tx_init_rfid();
210187
break;
@@ -242,9 +219,9 @@ bool tx_init(MagSetting* setting) {
242219
return true;
243220
}
244221

245-
bool tx_deinit(MagSetting* setting) {
222+
bool tx_deinit(MagState* state) {
246223
// Reset configured TX method
247-
switch(setting->tx) {
224+
switch(state->tx) {
248225
case MagTxStateRFID:
249226
tx_deinit_rfid();
250227
break;
@@ -285,7 +262,7 @@ bool tx_deinit(MagSetting* setting) {
285262
}
286263

287264
void mag_spoof(Mag* mag) {
288-
MagSetting* setting = mag->setting;
265+
MagState* state = &mag->state;
289266

290267
// TODO: cleanup this section. Possibly move precompute + tx_init to emulate_on_enter?
291268
FuriString* ft1 = mag->mag_dev->dev_data.track[0].str;
@@ -343,47 +320,47 @@ void mag_spoof(Mag* mag) {
343320
last_value = 2;
344321
bool bit = false;
345322

346-
if(!tx_init(setting)) return;
323+
if(!tx_init(state)) return;
347324

348325
FURI_CRITICAL_ENTER();
349326
for(uint16_t i = 0; i < (ZERO_PREFIX * 2); i++) {
350327
// is this right?
351328
if(!!(i % 2)) bit ^= 1;
352-
play_halfbit(bit, setting);
353-
furi_delay_us(setting->us_clock);
329+
play_halfbit(bit, state);
330+
furi_delay_us(state->us_clock);
354331
}
355332

356-
if((setting->track == MagTrackStateOneAndTwo) || (setting->track == MagTrackStateOne))
357-
play_track((uint8_t*)bits_t1_manchester, bits_t1_count, setting, false);
333+
if((state->track == MagTrackStateOneAndTwo) || (state->track == MagTrackStateOne))
334+
play_track((uint8_t*)bits_t1_manchester, bits_t1_count, state, false);
358335

359-
if((setting->track == MagTrackStateOneAndTwo))
336+
if((state->track == MagTrackStateOneAndTwo))
360337
for(uint16_t i = 0; i < (ZERO_BETWEEN * 2); i++) {
361338
if(!!(i % 2)) bit ^= 1;
362-
play_halfbit(bit, setting);
363-
furi_delay_us(setting->us_clock);
339+
play_halfbit(bit, state);
340+
furi_delay_us(state->us_clock);
364341
}
365342

366-
if((setting->track == MagTrackStateOneAndTwo) || (setting->track == MagTrackStateTwo))
343+
if((state->track == MagTrackStateOneAndTwo) || (state->track == MagTrackStateTwo))
367344
play_track(
368345
(uint8_t*)bits_t2_manchester,
369346
bits_t2_count,
370-
setting,
371-
(setting->reverse == MagReverseStateOn));
347+
state,
348+
(state->reverse == MagReverseStateOn));
372349

373-
if((setting->track == MagTrackStateThree))
374-
play_track((uint8_t*)bits_t3_manchester, bits_t3_count, setting, false);
350+
if((state->track == MagTrackStateThree))
351+
play_track((uint8_t*)bits_t3_manchester, bits_t3_count, state, false);
375352

376353
for(uint16_t i = 0; i < (ZERO_SUFFIX * 2); i++) {
377354
if(!!(i % 2)) bit ^= 1;
378-
play_halfbit(bit, setting);
379-
furi_delay_us(setting->us_clock);
355+
play_halfbit(bit, state);
356+
furi_delay_us(state->us_clock);
380357
}
381358
FURI_CRITICAL_EXIT();
382359

383360
free(data1);
384361
free(data2);
385362
free(data3);
386-
tx_deinit(setting);
363+
tx_deinit(state);
387364
}
388365

389366
uint16_t add_bit(bool value, uint8_t* out, uint16_t count) {

helpers/mag_helpers.h

+4-6
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,16 @@
22
#include <stdio.h>
33
#include <string.h>
44

5-
const GpioPin* mag_gpio_enum_to_pin(MagSettingPin pin);
6-
7-
void play_halfbit(bool value, MagSetting* setting);
8-
void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagSetting* setting, bool reverse);
5+
void play_halfbit(bool value, MagState* state);
6+
void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagState* state, bool reverse);
97

108
void tx_init_rf(int hz);
119
void tx_init_rfid();
1210
void tx_init_piezo();
13-
bool tx_init(MagSetting* setting);
11+
bool tx_init(MagState* state);
1412
void tx_deinit_piezo();
1513
void tx_deinit_rfid();
16-
bool tx_deinit(MagSetting* setting);
14+
bool tx_deinit(MagState* state);
1715

1816
uint16_t add_bit(bool value, uint8_t* out, uint16_t count);
1917
uint16_t add_bit_manchester(bool value, uint8_t* out, uint16_t count);

helpers/mag_types.h

-11
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,6 @@ typedef enum {
1414
MagViewTextInput,
1515
} MagView;
1616

17-
typedef enum {
18-
MagSettingPinA7,
19-
MagSettingPinA6,
20-
MagSettingPinA4,
21-
MagSettingPinB3,
22-
MagSettingPinB2,
23-
MagSettingPinC3,
24-
MagSettingPinC1,
25-
MagSettingPinC0,
26-
} MagSettingPin;
27-
2817
typedef enum {
2918
MagReverseStateOff,
3019
MagReverseStateOn,

mag.c

+3-29
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,6 @@ static bool mag_debug_back_event_callback(void* context) {
1414
return scene_manager_handle_back_event(mag->scene_manager);
1515
}
1616

17-
static MagSetting* mag_setting_alloc() {
18-
// temp hardcoded defaults
19-
MagSetting* setting = malloc(sizeof(MagSetting));
20-
setting->reverse = SETTING_DEFAULT_REVERSE;
21-
setting->track = SETTING_DEFAULT_TRACK;
22-
setting->tx = SETTING_DEFAULT_TX;
23-
setting->us_clock = SETTING_DEFAULT_US_CLOCK;
24-
setting->us_interpacket = SETTING_DEFAULT_US_INTERPACKET;
25-
26-
setting->pin_input = SETTING_DEFAULT_PIN_INPUT;
27-
setting->pin_output = SETTING_DEFAULT_PIN_OUTPUT;
28-
setting->pin_enable = SETTING_DEFAULT_PIN_ENABLE;
29-
30-
setting->is_debug = furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug);
31-
32-
return setting;
33-
}
34-
3517
static Mag* mag_alloc() {
3618
Mag* mag = malloc(sizeof(Mag));
3719

@@ -52,7 +34,7 @@ static Mag* mag_alloc() {
5234
mag->view_dispatcher, mag_debug_back_event_callback);
5335

5436
mag->mag_dev = mag_device_alloc();
55-
mag->setting = mag_setting_alloc();
37+
mag_state_load(&mag->state);
5638

5739
// Open GUI record
5840
mag->gui = furi_record_open(RECORD_GUI);
@@ -97,13 +79,9 @@ static Mag* mag_alloc() {
9779
mag->expansion = furi_record_open(RECORD_EXPANSION);
9880
expansion_disable(mag->expansion);
9981

100-
return mag;
101-
}
82+
// Move UART here? conditional upon setting?
10283

103-
static void mag_setting_free(MagSetting* setting) {
104-
furi_assert(setting);
105-
106-
free(setting);
84+
return mag;
10785
}
10886

10987
static void mag_free(Mag* mag) {
@@ -117,10 +95,6 @@ static void mag_free(Mag* mag) {
11795
mag_device_free(mag->mag_dev);
11896
mag->mag_dev = NULL;
11997

120-
// Mag setting
121-
mag_setting_free(mag->setting);
122-
mag->setting = NULL;
123-
12498
// Submenu
12599
view_dispatcher_remove_view(mag->view_dispatcher, MagViewSubmenu);
126100
submenu_free(mag->submenu);

mag_i.h

+2-22
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include "mag_device.h"
4+
#include "mag_state.h"
45
//#include "helpers/mag_helpers.h"
56
#include "helpers/mag_types.h"
67

@@ -47,33 +48,12 @@
4748
}
4849
#endif
4950

50-
#define SETTING_DEFAULT_REVERSE MagReverseStateOff
51-
#define SETTING_DEFAULT_TRACK MagTrackStateOneAndTwo
52-
#define SETTING_DEFAULT_TX MagTxStateGPIO
53-
#define SETTING_DEFAULT_US_CLOCK 240
54-
#define SETTING_DEFAULT_US_INTERPACKET 10
55-
#define SETTING_DEFAULT_PIN_INPUT MagSettingPinA7
56-
#define SETTING_DEFAULT_PIN_OUTPUT MagSettingPinA6
57-
#define SETTING_DEFAULT_PIN_ENABLE MagSettingPinA4
58-
5951
enum MagCustomEvent {
6052
MagEventNext = 100,
6153
MagEventExit,
6254
MagEventPopupClosed,
6355
};
6456

65-
typedef struct {
66-
MagTxState tx;
67-
MagTrackState track;
68-
MagReverseState reverse;
69-
uint32_t us_clock;
70-
uint32_t us_interpacket;
71-
MagSettingPin pin_input;
72-
MagSettingPin pin_output;
73-
MagSettingPin pin_enable;
74-
bool is_debug;
75-
} MagSetting;
76-
7757
typedef struct {
7858
ViewDispatcher* view_dispatcher;
7959
Gui* gui;
@@ -88,7 +68,7 @@ typedef struct {
8868
FuriString* file_name;
8969
FuriString* args;
9070

91-
MagSetting* setting;
71+
MagState state;
9272

9373
// Common views
9474
Submenu* submenu;

0 commit comments

Comments
 (0)