Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hitag #2658

Open
wants to merge 25 commits into
base: dev
Choose a base branch
from
Open

Hitag #2658

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
30e251a
Included full (read & emulate)Reader Talks First mode in LFRFID app, …
May 10, 2023
203f4ad
updated byte_input gui module to handle +256 databytes
May 10, 2023
a4f2ae9
updated api symbols cf the gui module byte_input updates
May 10, 2023
5fcd2b0
Merge branch 'dev' into hitag
hedger May 11, 2023
c9fe4a4
hal: f18: Updated api_symbols.csv
hedger May 11, 2023
810d864
Merge branch 'flipperdevices:dev' into hitag
blackvault88 May 11, 2023
d8704f6
minor memory correction in decoder_feed
May 15, 2023
8baacc8
improved decoder feed with flexible startbits and bit sequence termin…
May 17, 2023
e061685
Merge branch 'dev' into hitag
blackvault88 Jul 13, 2023
1485b46
Merge branch 'flipperdevices:dev' into hitag
blackvault88 Jul 17, 2023
3c9574f
code formatted and reworked in line with bus abstraction mods
Jul 17, 2023
bde8deb
Merge branch 'dev' into hitag
skotopes Aug 14, 2023
dc6a1e9
Sync api symbols
skotopes Aug 14, 2023
a4885ed
Gui: fix merge artifact in byte_input
skotopes Aug 15, 2023
0208f34
Merge branch 'dev' into hitag
skotopes Aug 23, 2023
7c7d15d
Merge branch 'dev' into hitag
blackvault88 Sep 27, 2023
bbec615
Merge branch 'flipperdevices:dev' into hitag
blackvault88 Oct 25, 2023
16947f9
low level code moved to furi_hal_rfid + PVS warnings fixed
Oct 25, 2023
80f8f86
Merge branch 'hitag' of https://github.com/blackvault88/flipperzero-f…
Oct 25, 2023
117cb4c
Merge remote-tracking branch 'origin/dev' into hitag
skotopes Nov 21, 2023
336de4b
Format Sources
skotopes Nov 26, 2023
c4d4ba1
Rfid: initialize default state in lfrfid_worker_mode_read_process
skotopes Nov 26, 2023
21d0ff0
Merge branch 'dev' into hitag
hedger Feb 29, 2024
b0666b9
hal: rfid: signature fix
hedger Feb 29, 2024
88f977c
linter fixes
hedger Feb 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions applications/main/lfrfid/lfrfid_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ enum LfRfidCustomEvent {
LfRfidEventReadSenseCardEnd,
LfRfidEventReadStartASK,
LfRfidEventReadStartPSK,
LfRfidEventReadStartRTF,
LfRfidEventReadSenseHitag, //TODO combine with sensecardstart?
LfRfidEventReadDone,
LfRfidEventReadOverrun,
LfRfidEventReadError,
Expand Down
12 changes: 12 additions & 0 deletions applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
typedef enum {
SubmenuIndexASK,
SubmenuIndexPSK,
SubmenuIndexHitag,
SubmenuIndexRAW,
} SubmenuIndex;

Expand All @@ -29,6 +30,12 @@ void lfrfid_scene_extra_actions_on_enter(void* context) {
SubmenuIndexPSK,
lfrfid_scene_extra_actions_submenu_callback,
app);
submenu_add_item(
submenu,
"Read RTF (Reader Talks First)",
SubmenuIndexHitag,
lfrfid_scene_extra_actions_submenu_callback,
app);

if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
submenu_add_item(
Expand Down Expand Up @@ -65,6 +72,11 @@ bool lfrfid_scene_extra_actions_on_event(void* context, SceneManagerEvent event)
scene_manager_next_scene(app->scene_manager, LfRfidSceneRead);
dolphin_deed(DolphinDeedRfidRead);
consumed = true;
} else if(event.event == SubmenuIndexHitag) {
app->read_type = LFRFIDWorkerReadTypeRTFOnly;
scene_manager_next_scene(app->scene_manager, LfRfidSceneRead);
dolphin_deed(DolphinDeedRfidRead);
consumed = true;
} else if(event.event == SubmenuIndexRAW) {
scene_manager_next_scene(app->scene_manager, LfRfidSceneRawName);
consumed = true;
Expand Down
18 changes: 18 additions & 0 deletions applications/main/lfrfid/scenes/lfrfid_scene_read.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ static void
event = LfRfidEventReadStartASK;
} else if(result == LFRFIDWorkerReadStartPSK) {
event = LfRfidEventReadStartPSK;
} else if(result == LFRFIDWorkerReadStartRTF) {
event = LfRfidEventReadStartRTF;
} else if(result == LFRFIDWorkerReadSenseHitag) { //TODO combine with sensecardstart?
event = LfRfidEventReadSenseHitag;
} else {
return;
}
Expand All @@ -50,6 +54,9 @@ void lfrfid_scene_read_on_enter(void* context) {
lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadPskOnly);
} else if(app->read_type == LFRFIDWorkerReadTypeASKOnly) {
lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadAskOnly);
} else if(app->read_type == LFRFIDWorkerReadTypeRTFOnly) {
lfrfid_view_read_set_read_state(app->read_view, LfRfidReadScanning);
lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadRtfOnly);
}

lfrfid_worker_start_thread(app->lfworker);
Expand Down Expand Up @@ -93,6 +100,17 @@ bool lfrfid_scene_read_on_event(void* context, SceneManagerEvent event) {
lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadAsk);
}
consumed = true;
} else if(event.event == LfRfidEventReadStartRTF) {
if(app->read_type == LFRFIDWorkerReadTypeAuto) {
lfrfid_view_read_set_read_state(app->read_view, LfRfidReadScanning);
lfrfid_view_read_set_read_mode(app->read_view, LfRfidReadHitag);
}
consumed = true;
} else if(event.event == LfRfidEventReadSenseHitag) { //TODO combine with sensecardstart?
if(app->read_type == LFRFIDWorkerReadTypeAuto ||
app->read_type == LFRFIDWorkerReadTypeRTFOnly) {
lfrfid_view_read_set_read_state(app->read_view, LfRfidReadTagDetected);
}
}
}

Expand Down
12 changes: 8 additions & 4 deletions applications/main/lfrfid/scenes/lfrfid_scene_saved_info.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,15 @@ void lfrfid_scene_saved_info_on_enter(void* context) {
uint8_t* data = (uint8_t*)malloc(size);
protocol_dict_get_data(app->dict, app->protocol_id, data, size);
for(uint8_t i = 0; i < size; i++) {
if(i != 0) {
furi_string_cat_printf(tmp_string, " ");
if(i >= 18) {
furi_string_cat_printf(tmp_string, "..");
break;
} else {
if(i != 0) {
furi_string_cat_printf(tmp_string, " ");
}
furi_string_cat_printf(tmp_string, "%02X", data[i]);
}

furi_string_cat_printf(tmp_string, "%02X", data[i]);
}
free(data);

Expand Down
75 changes: 57 additions & 18 deletions applications/main/lfrfid/views/lfrfid_view_read.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ struct LfRfidReadView {
typedef struct {
IconAnimation* icon;
LfRfidReadViewMode read_mode;
LfRfidReadViewState read_state;
} LfRfidReadViewModel;

static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) {
Expand All @@ -22,36 +23,69 @@ static void lfrfid_view_read_draw_callback(Canvas* canvas, void* _model) {
canvas_set_font(canvas, FontPrimary);

if(model->read_mode == LfRfidReadAsk) {
canvas_draw_str(canvas, 70, 16, "Reading 1/2");
canvas_draw_str(canvas, 70, 8, "Reading 1/3");

canvas_draw_str(canvas, 77, 29, "ASK");
canvas_draw_icon(canvas, 70, 22, &I_ButtonRight_4x7);
canvas_draw_icon_animation(canvas, 102, 21, model->icon);
canvas_draw_str(canvas, 77, 20, "ASK");
canvas_draw_icon(canvas, 70, 13, &I_ButtonRight_4x7);
canvas_draw_icon_animation(canvas, 112, 12, model->icon);

canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 77, 43, "PSK");
canvas_draw_str(canvas, 77, 33, "PSK");
canvas_draw_str(canvas, 77, 46, "RTF");
} else if(model->read_mode == LfRfidReadPsk) {
canvas_draw_str(canvas, 70, 16, "Reading 2/2");
canvas_draw_str(canvas, 70, 8, "Reading 2/3");

canvas_draw_str(canvas, 77, 43, "PSK");
canvas_draw_icon(canvas, 70, 36, &I_ButtonRight_4x7);
canvas_draw_icon_animation(canvas, 102, 35, model->icon);
canvas_draw_str(canvas, 77, 33, "PSK");
canvas_draw_icon(canvas, 70, 26, &I_ButtonRight_4x7);
canvas_draw_icon_animation(canvas, 112, 25, model->icon);

canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 77, 29, "ASK");
} else {
canvas_draw_str(canvas, 77, 20, "ASK");
canvas_draw_str(canvas, 77, 46, "RTF");
} else if(model->read_mode == LfRfidReadHitag) {
if(model->read_state == LfRfidReadScanning) {
canvas_draw_str(canvas, 70, 8, "Reading 3/3");

canvas_draw_str(canvas, 77, 46, "RTF");
canvas_draw_icon(canvas, 70, 39, &I_ButtonRight_4x7);
canvas_draw_icon_animation(canvas, 112, 38, model->icon);

canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 77, 20, "ASK");
canvas_draw_str(canvas, 77, 33, "PSK");
} else if(model->read_state == LfRfidReadTagDetected) { //TODO switch to other scene?
canvas_draw_str(canvas, 65, 8, "Hitag1 found");

canvas_set_font(canvas, FontSecondary);
//canvas_draw_str(canvas, 70, 20, "## ## ## ##"); //TODO get tag SN from hitag worker
canvas_draw_str(canvas, 70, 33, "Reading data");
//canvas_draw_str(canvas, 70, 46, "Page: X/64"); //TODO get current page index from hitag worker
}
} else if(model->read_mode == LfRfidReadAskOnly) {
canvas_draw_str(canvas, 72, 16, "Reading");

if(model->read_mode == LfRfidReadAskOnly) {
canvas_draw_str(canvas, 77, 35, "ASK");
} else {
canvas_draw_str(canvas, 77, 35, "PSK");
canvas_draw_str(canvas, 77, 35, "ASK");
canvas_draw_icon_animation(canvas, 112, 27, model->icon);
} else if(model->read_mode == LfRfidReadPskOnly) {
canvas_draw_str(canvas, 72, 16, "Reading");
canvas_draw_str(canvas, 77, 35, "PSK");
canvas_draw_icon_animation(canvas, 112, 27, model->icon);
} else if(model->read_mode == LfRfidReadRtfOnly) {
if(model->read_state == LfRfidReadScanning) {
canvas_draw_str(canvas, 72, 16, "Reading");
canvas_draw_str(canvas, 77, 35, "RTF");
canvas_draw_icon_animation(canvas, 112, 27, model->icon);
} else if(model->read_state == LfRfidReadTagDetected) { //TODO switch to other scene?
canvas_draw_str(canvas, 65, 8, "Hitag1 found");

canvas_set_font(canvas, FontSecondary);
//canvas_draw_str(canvas, 70, 20, "## ## ## ##"); //TODO get tag SN from hitag worker
canvas_draw_str(canvas, 70, 33, "Reading data");
//canvas_draw_str(canvas, 70, 46, "Page: X/64"); //TODO get current page index from hitag worker
}
canvas_draw_icon_animation(canvas, 102, 27, model->icon);
}

canvas_set_font(canvas, FontSecondary);
canvas_draw_str(canvas, 61, 56, "Don't move card");
canvas_draw_str(canvas, 61, 60, "Don't move card");
}

void lfrfid_view_read_enter(void* context) {
Expand Down Expand Up @@ -111,3 +145,8 @@ void lfrfid_view_read_set_read_mode(LfRfidReadView* read_view, LfRfidReadViewMod
},
true);
}

void lfrfid_view_read_set_read_state(LfRfidReadView* read_view, LfRfidReadViewState state) {
with_view_model(
read_view->view, LfRfidReadViewModel * model, { model->read_state = state; }, true);
}
11 changes: 10 additions & 1 deletion applications/main/lfrfid/views/lfrfid_view_read.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,17 @@
typedef enum {
LfRfidReadAsk,
LfRfidReadPsk,
LfRfidReadHitag,
LfRfidReadAskOnly,
LfRfidReadPskOnly
LfRfidReadPskOnly,
LfRfidReadRtfOnly,
} LfRfidReadViewMode;

typedef enum {
LfRfidReadScanning,
LfRfidReadTagDetected,
} LfRfidReadViewState;

typedef struct LfRfidReadView LfRfidReadView;

LfRfidReadView* lfrfid_view_read_alloc();
Expand All @@ -17,3 +24,5 @@ void lfrfid_view_read_free(LfRfidReadView* read_view);
View* lfrfid_view_read_get_view(LfRfidReadView* read_view);

void lfrfid_view_read_set_read_mode(LfRfidReadView* read_view, LfRfidReadViewMode mode);

void lfrfid_view_read_set_read_state(LfRfidReadView* read_view, LfRfidReadViewState state);
14 changes: 7 additions & 7 deletions applications/services/gui/modules/byte_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@ typedef struct {
typedef struct {
const char* header;
uint8_t* bytes;
uint8_t bytes_count;
uint16_t bytes_count;

ByteInputCallback input_callback;
ByteChangedCallback changed_callback;
void* callback_context;

bool selected_high_nibble;
uint8_t selected_byte;
uint16_t selected_byte;
int8_t selected_row; // row -2 - mini_editor, -1 - input, row 0 & 1 - keyboard
uint8_t selected_column;
uint8_t first_visible_byte;
uint16_t first_visible_byte;
} ByteInputModel;

static const uint8_t keyboard_origin_x = 7;
Expand Down Expand Up @@ -170,7 +170,7 @@ static void byte_input_draw_input(Canvas* canvas, ByteInputModel* model) {
canvas_draw_icon(canvas, 2, 19, &I_ButtonLeftSmall_3x5);
canvas_draw_icon(canvas, 123, 19, &I_ButtonRightSmall_3x5);

for(uint8_t i = model->first_visible_byte;
for(uint16_t i = model->first_visible_byte;
i < model->first_visible_byte + MIN(model->bytes_count, max_drawable_bytes);
i++) {
uint8_t byte_position = i - model->first_visible_byte;
Expand Down Expand Up @@ -295,7 +295,7 @@ static void byte_input_draw_input_selected(Canvas* canvas, ByteInputModel* model
canvas_draw_icon(canvas, 2, 19, &I_ButtonLeftSmall_3x5);
canvas_draw_icon(canvas, 122, 19, &I_ButtonRightSmall_3x5);

for(uint8_t i = model->first_visible_byte;
for(uint16_t i = model->first_visible_byte;
i < model->first_visible_byte + MIN(model->bytes_count, max_drawable_bytes);
i++) {
uint8_t byte_position = i - model->first_visible_byte;
Expand Down Expand Up @@ -355,7 +355,7 @@ static void byte_input_draw_input_selected(Canvas* canvas, ByteInputModel* model
* @param value char value
* @param high_nibble set high nibble
*/
static void byte_input_set_nibble(uint8_t* data, uint8_t position, char value, bool high_nibble) {
static void byte_input_set_nibble(uint8_t* data, uint16_t position, char value, bool high_nibble) {
switch(value) {
case '0':
case '1':
Expand Down Expand Up @@ -848,7 +848,7 @@ void byte_input_set_result_callback(
ByteChangedCallback changed_callback,
void* callback_context,
uint8_t* bytes,
uint8_t bytes_count) {
uint16_t bytes_count) {
with_view_model(
byte_input->view,
ByteInputModel * model,
Expand Down
2 changes: 1 addition & 1 deletion applications/services/gui/modules/byte_input.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ void byte_input_set_result_callback(
ByteChangedCallback changed_callback,
void* callback_context,
uint8_t* bytes,
uint8_t bytes_count);
uint16_t bytes_count);

/** Set byte input header text
*
Expand Down
Loading
Loading