-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathnfc_relay.c
155 lines (125 loc) · 5.24 KB
/
nfc_relay.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include "nfc_relay.h"
#define TAG "NfcRelay"
bool nfc_relay_custom_event_callback(void* context, uint32_t event) {
furi_assert(context);
NfcRelay* nfc_relay = context;
return scene_manager_handle_custom_event(nfc_relay->scene_manager, event);
}
bool nfc_relay_back_event_callback(void* context) {
furi_assert(context);
FURI_LOG_D(TAG, "back_event_callback");
NfcRelay* nfc_relay = context;
return scene_manager_handle_back_event(nfc_relay->scene_manager);
}
void nfc_relay_tick_event_callback(void* context) {
furi_assert(context);
NfcRelay* nfc_relay = context;
scene_manager_handle_tick_event(nfc_relay->scene_manager);
}
void nfc_relay_show_loading_popup(void* context, bool show) {
NfcRelay* nfc_relay = context;
if(show) {
// Raise timer priority so that animations can play
furi_timer_set_thread_priority(FuriTimerThreadPriorityElevated);
view_dispatcher_switch_to_view(nfc_relay->view_dispatcher, NfcRelayViewLoading);
} else {
// Restore default timer priority
furi_timer_set_thread_priority(FuriTimerThreadPriorityNormal);
}
}
NfcRelay* nfc_relay_alloc() {
NfcRelay* nfc_relay = malloc(sizeof(NfcRelay));
nfc_relay->view_dispatcher = view_dispatcher_alloc();
nfc_relay->scene_manager = scene_manager_alloc(&nfc_relay_scene_handlers, nfc_relay);
view_dispatcher_enable_queue(nfc_relay->view_dispatcher);
view_dispatcher_set_event_callback_context(nfc_relay->view_dispatcher, nfc_relay);
view_dispatcher_set_custom_event_callback(
nfc_relay->view_dispatcher, nfc_relay_custom_event_callback);
view_dispatcher_set_navigation_event_callback(
nfc_relay->view_dispatcher, nfc_relay_back_event_callback);
view_dispatcher_set_tick_event_callback(
nfc_relay->view_dispatcher, nfc_relay_tick_event_callback, 100);
nfc_relay->gui = furi_record_open(RECORD_GUI);
view_dispatcher_attach_to_gui(
nfc_relay->view_dispatcher, nfc_relay->gui, ViewDispatcherTypeFullscreen);
// Open Notification record
nfc_relay->notifications = furi_record_open(RECORD_NOTIFICATION);
// Submenu
nfc_relay->submenu = submenu_alloc();
view_dispatcher_add_view(
nfc_relay->view_dispatcher, NfcRelayViewMenu, submenu_get_view(nfc_relay->submenu));
// Popup
nfc_relay->popup = popup_alloc();
view_dispatcher_add_view(
nfc_relay->view_dispatcher, NfcRelayViewPopup, popup_get_view(nfc_relay->popup));
// Loading
nfc_relay->loading = loading_alloc();
view_dispatcher_add_view(
nfc_relay->view_dispatcher, NfcRelayViewLoading, loading_get_view(nfc_relay->loading));
// Text Input
nfc_relay->text_input = text_input_alloc();
view_dispatcher_add_view(
nfc_relay->view_dispatcher,
NfcRelayViewTextInput,
text_input_get_view(nfc_relay->text_input));
nfc_relay->widget = widget_alloc();
view_dispatcher_add_view(
nfc_relay->view_dispatcher, NfcRelayViewWidget, widget_get_view(nfc_relay->widget));
// TODO: not static config
nfc_relay->config = malloc(sizeof(NfcRelayConfig));
nfc_relay->config->mode = NfcRelayModeUart;
nfc_relay->config->uart_config.baudrate = 38400; //115200;
nfc_relay->config->uart_config.serialId = FuriHalSerialIdLpuart;
return nfc_relay;
}
void nfc_relay_free(NfcRelay* nfc_relay) {
furi_assert(nfc_relay);
// view
view_dispatcher_remove_view(nfc_relay->view_dispatcher, NfcRelayViewMenu);
submenu_free(nfc_relay->submenu);
view_dispatcher_remove_view(nfc_relay->view_dispatcher, NfcRelayViewPopup);
popup_free(nfc_relay->popup);
view_dispatcher_remove_view(nfc_relay->view_dispatcher, NfcRelayViewLoading);
loading_free(nfc_relay->loading);
view_dispatcher_remove_view(nfc_relay->view_dispatcher, NfcRelayViewTextInput);
text_input_free(nfc_relay->text_input);
view_dispatcher_remove_view(nfc_relay->view_dispatcher, NfcRelayViewWidget);
widget_free(nfc_relay->widget);
view_dispatcher_free(nfc_relay->view_dispatcher);
scene_manager_free(nfc_relay->scene_manager);
furi_record_close(RECORD_GUI);
nfc_relay->gui = NULL;
furi_record_close(RECORD_NOTIFICATION);
nfc_relay->notifications = NULL;
free(nfc_relay);
}
int32_t nfc_relay_app(void* p) {
UNUSED(p);
NfcRelay* nfc_relay = nfc_relay_alloc();
scene_manager_next_scene(nfc_relay->scene_manager, NfcRelaySceneStart);
view_dispatcher_run(nfc_relay->view_dispatcher);
nfc_relay_free(nfc_relay);
return 0;
}
void trace_bit_buffer_hexdump(char* tag, char* prompt, BitBuffer* bitbuffer) {
#ifdef TRACE_TRX
FuriString* debug_buf;
debug_buf = furi_string_alloc();
for(size_t i = 0; i < bit_buffer_get_size_bytes(bitbuffer); i++) {
furi_string_cat_printf(debug_buf, " %02X", bit_buffer_get_byte(bitbuffer, i));
}
furi_string_trim(debug_buf);
FURI_LOG_T(
tag,
"%s (%d): %s",
prompt,
bit_buffer_get_size(bitbuffer),
furi_string_get_cstr(debug_buf));
furi_string_free(debug_buf);
#else
UNUSED(tag);
UNUSED(prompt);
UNUSED(bitbuffer);
#endif
return;
}