Skip to content
This repository has been archived by the owner on Jul 28, 2024. It is now read-only.

Commit

Permalink
Update mag_scene_emulate_test.c
Browse files Browse the repository at this point in the history
  • Loading branch information
zacharyweiss committed Dec 27, 2022
1 parent 3a13a51 commit 258e46b
Showing 1 changed file with 31 additions and 35 deletions.
66 changes: 31 additions & 35 deletions scenes/mag_scene_emulate_test.c
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
#include "../mag_i.h"

#define PIN_A 0
#define PIN_B 1 // currently unused
#define PIN_B 1 // currently unused
#define CLOCK_US 250 // typically set between 200-500us
#define TEST_STR "%B123456781234567^LASTNAME/FIRST^YYMMSSSDDDDDDDDDDDDDDDDDDDDDDDDD?;1234567812?"
// TODO: better way of setting temp test str,
// text wrapping on screen? (Will be relevant for any loaded data too)

uint8_t magspoof_bit_dir = 0;
const char* test_str = TEST_STR;

void mag_scene_emulate_test_dialog_callback(DialogExResult result, void* context) {
Mag* mag = context;

view_dispatcher_send_custom_event(mag->view_dispatcher, result);
}
const char *test_str = TEST_STR;

void gpio_item_set_rfid_pin(uint8_t index, bool level) {
if(index == 0) {
if (index == 0) {
furi_hal_gpio_write(&gpio_rfid_carrier_out, level);
// A7 GPIO pin for debugging purposes
//furi_hal_gpio_write(&gpio_ext_pa7, level);
// furi_hal_gpio_write(&gpio_ext_pa7, level);
}
}

Expand All @@ -31,37 +27,37 @@ static void play_bit(uint8_t send_bit) {
gpio_item_set_rfid_pin(PIN_B, !magspoof_bit_dir);
furi_delay_us(CLOCK_US);

if(send_bit) {
if (send_bit) {
magspoof_bit_dir ^= 1;
gpio_item_set_rfid_pin(PIN_A, magspoof_bit_dir);
gpio_item_set_rfid_pin(PIN_B, !magspoof_bit_dir);
}
furi_delay_us(CLOCK_US);
}

static void mag_spoof(FuriString* track_str, uint8_t track) {
static void mag_spoof(FuriString *track_str, uint8_t track) {
furi_hal_power_enable_otg();

size_t from;
size_t to;

// TODO ';' in first track case
if(track == 0) {
if (track == 0) {
from = furi_string_search_char(track_str, '%');
to = furi_string_search_char(track_str, '?', from);
} else if(track == 1) {
} else if (track == 1) {
from = furi_string_search_char(track_str, ';');
to = furi_string_search_char(track_str, '?', from);
} else {
from = 0;
to = furi_string_size(track_str);
}
if(from >= to) {
if (from >= to) {
return;
}
furi_string_mid(track_str, from, to - from + 1);

const char* data = furi_string_get_cstr(track_str);
const char *data = furi_string_get_cstr(track_str);

printf("%s", data);

Expand All @@ -83,7 +79,7 @@ static void mag_spoof(FuriString* track_str, uint8_t track) {
furi_hal_gpio_init(&gpio_rfid_carrier_out, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);

// A7 GPIO pin for debugging purposes
//furi_hal_gpio_init(&gpio_ext_pa7, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
// furi_hal_gpio_init(&gpio_ext_pa7, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);

// TODO: initialize pins on scene enter, perhaps, so as to avoid this delay each time the button is pressed?
// Also, why is such a long delay needed?
Expand All @@ -98,15 +94,15 @@ static void mag_spoof(FuriString* track_str, uint8_t track) {
magspoof_bit_dir = 0;

// First put out a bunch of leading zeros.
for(uint8_t i = 0; i < 25; i++) {
for (uint8_t i = 0; i < 25; i++) {
play_bit(0);
}

for(uint8_t i = 0; data[i] != '\0'; i++) {
for (uint8_t i = 0; data[i] != '\0'; i++) {
crc = 1;
tmp = data[i] - sublen[track];

for(uint8_t j = 0; j < bitlen[track] - 1; j++) {
for (uint8_t j = 0; j < bitlen[track] - 1; j++) {
crc ^= tmp & 1;
lrc ^= (tmp & 1) << j;
play_bit(tmp & 1);
Expand All @@ -118,15 +114,15 @@ static void mag_spoof(FuriString* track_str, uint8_t track) {
// finish calculating and send last "byte" (LRC)
tmp = lrc;
crc = 1;
for(uint8_t j = 0; j < bitlen[track] - 1; j++) {
for (uint8_t j = 0; j < bitlen[track] - 1; j++) {
crc ^= tmp & 1;
play_bit(tmp & 1);
tmp >>= 1;
}
play_bit(crc);

// finish with 0's
for(uint8_t i = 0; i < 5 * 5; i++) {
for (uint8_t i = 0; i < 5 * 5; i++) {
play_bit(0);
}

Expand All @@ -140,11 +136,11 @@ static void mag_spoof(FuriString* track_str, uint8_t track) {
furi_hal_power_disable_otg();
}

void mag_scene_emulate_test_on_enter(void* context) {
Mag* mag = context;
Widget* widget = mag->widget;
void mag_scene_emulate_test_on_enter(void *context) {
Mag *mag = context;
Widget *widget = mag->widget;

FuriString* tmp_string;
FuriString *tmp_string;
tmp_string = furi_string_alloc();

widget_add_button_element(widget, GuiButtonTypeLeft, "Back", mag_widget_callback, mag);
Expand All @@ -159,23 +155,23 @@ void mag_scene_emulate_test_on_enter(void* context) {
furi_string_free(tmp_string);
}

bool mag_scene_emulate_test_on_event(void* context, SceneManagerEvent event) {
Mag* mag = context;
SceneManager* scene_manager = mag->scene_manager;
bool mag_scene_emulate_test_on_event(void *context, SceneManagerEvent event) {
Mag *mag = context;
SceneManager *scene_manager = mag->scene_manager;
bool consumed = false;

if(event.type == SceneManagerEventTypeCustom) {
if(event.event == GuiButtonTypeRight) {
if (event.type == SceneManagerEventTypeCustom) {
if (event.event == GuiButtonTypeRight) {
consumed = true;

// Hardcoding a test string for the time being, while we debug/improve LF RFID TX
FuriString* v = furi_string_alloc();
FuriString *v = furi_string_alloc();
furi_string_set_str(v, test_str);
notification_message(mag->notifications, &sequence_blink_start_magenta);
mag_spoof(v, 0);
notification_message(mag->notifications, &sequence_blink_stop);
furi_string_free(v);
} else if(event.event == GuiButtonTypeLeft) {
} else if (event.event == GuiButtonTypeLeft) {
consumed = true;

scene_manager_previous_scene(scene_manager);
Expand All @@ -185,7 +181,7 @@ bool mag_scene_emulate_test_on_event(void* context, SceneManagerEvent event) {
return consumed;
}

void mag_scene_emulate_test_on_exit(void* context) {
Mag* mag = context;
void mag_scene_emulate_test_on_exit(void *context) {
Mag *mag = context;
widget_reset(mag->widget);
}

0 comments on commit 258e46b

Please sign in to comment.