1
1
#include "uart.h"
2
2
3
- #define UART_CH (FuriHalUartIdUSART1 )
4
- #define LP_UART_CH (FuriHalUartIdLPUART1 )
5
- #define BAUDRATE (115200 )
3
+ #define UART_CH (FuriHalSerialIdUsart )
4
+ #define LP_UART_CH (FuriHalSerialIdLpuart )
5
+ #define BAUDRATE (115200UL )
6
6
7
7
struct Uart {
8
8
void * app ;
9
- FuriHalUartId channel ;
10
9
FuriThread * rx_thread ;
10
+ FuriHalSerialHandle * serial_handle ;
11
+ FuriHalSerialId channel ;
12
+ FuriThread * worker_thread ;
11
13
FuriStreamBuffer * rx_stream ;
12
14
uint8_t rx_buf [RX_BUF_SIZE + 1 ];
13
15
void (* handle_rx_data_cb )(uint8_t * buf , size_t len , void * context );
14
16
};
15
17
16
-
17
18
typedef enum {
18
19
WorkerEvtStop = (1 << 0 ),
19
20
WorkerEvtRxDone = (1 << 1 ),
20
- } WorkerEvtFlags ;
21
+ } WorkerEventFlags ;
22
+
23
+ #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone)
24
+
25
+
21
26
22
27
void uart_set_handle_rx_data_cb (
23
28
Uart * uart ,
@@ -26,17 +31,29 @@ void uart_set_handle_rx_data_cb(
26
31
uart -> handle_rx_data_cb = handle_rx_data_cb ;
27
32
}
28
33
29
- #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone)
30
-
31
- void uart_on_irq_cb (UartIrqEvent ev , uint8_t data , void * context ) {
34
+ static void wifi_marauder_uart_on_irq_cb (
35
+ FuriHalSerialHandle * handle ,
36
+ FuriHalSerialRxEvent event ,
37
+ void * context ) {
32
38
Uart * uart = (Uart * )context ;
33
39
34
- if (ev == UartIrqEventRXNE ) {
40
+ if (event == FuriHalSerialRxEventData ) {
41
+ uint8_t data = furi_hal_serial_async_rx (handle );
35
42
furi_stream_buffer_send (uart -> rx_stream , & data , 1 , 0 );
36
43
furi_thread_flags_set (furi_thread_get_id (uart -> rx_thread ), WorkerEvtRxDone );
37
44
}
38
45
}
39
46
47
+ static void uart_on_irq_cb (FuriHalSerialHandle * handle , FuriHalSerialRxEvent event , void * context ) {
48
+ Uart * uart = (Uart * )context ;
49
+ UNUSED (handle );
50
+
51
+ if (event & (FuriHalSerialRxEventData | FuriHalSerialRxEventIdle )) {
52
+ uint8_t data = furi_hal_serial_async_rx (handle );
53
+ furi_stream_buffer_send (uart -> rx_stream , & data , 1 , 0 );
54
+ furi_thread_flags_set (furi_thread_get_id (uart -> rx_thread ), WorkerEvtRxDone );
55
+ }
56
+ }
40
57
41
58
// Define una constante para el prefijo que estamos buscando
42
59
#define JSON_PREFIX "JSON:"
@@ -50,26 +67,25 @@ static bool json_capture_active = false;
50
67
// Prototipo de la función
51
68
// static void process_json_buffer();
52
69
53
-
54
70
static void process_json_buffer (void * context ) {
55
71
Uart * uart = (Uart * )context ;
56
72
// Agregamos el terminador nulo al final del buffer
57
73
json_buffer [json_buffer_index ] = '\0' ;
58
- if (uart -> handle_rx_data_cb ) {
59
- uart -> handle_rx_data_cb ((uint8_t * )json_buffer , json_buffer_index , uart -> app );
74
+ if (uart -> handle_rx_data_cb ) {
75
+ uart -> handle_rx_data_cb ((uint8_t * )json_buffer , json_buffer_index , uart -> app );
60
76
memset (json_buffer , 0 , sizeof (json_buffer ));
61
77
}
62
-
78
+
63
79
// Reiniciamos el buffer
64
80
json_buffer_index = 0 ;
65
81
}
66
82
67
83
static void uart_echo_push_to_list (void * context , uint8_t data ) {
68
84
Uart * uart = (Uart * )context ;
69
- if (!json_capture_active ) {
70
- if (data == JSON_PREFIX [json_buffer_index ]) {
85
+ if (!json_capture_active ) {
86
+ if (data == JSON_PREFIX [json_buffer_index ]) {
71
87
json_buffer [json_buffer_index ++ ] = data ; // Agregar el carácter al buffer
72
- if (json_buffer_index == strlen (JSON_PREFIX )) {
88
+ if (json_buffer_index == strlen (JSON_PREFIX )) {
73
89
// Encontramos el prefijo, comenzamos a capturar
74
90
json_buffer_index = 0 ;
75
91
json_capture_active = true;
@@ -81,7 +97,7 @@ static void uart_echo_push_to_list(void* context, uint8_t data) {
81
97
} else {
82
98
// Capturamos caracteres hasta encontrar '\n'
83
99
json_buffer [json_buffer_index ++ ] = data ;
84
- if (data == '\n' ) {
100
+ if (data == '\n' ) {
85
101
// Terminamos de capturar la línea, procesamos el buffer
86
102
json_capture_active = false;
87
103
process_json_buffer (uart );
@@ -93,7 +109,8 @@ static int32_t uart_worker(void* context) {
93
109
Uart * uart = (Uart * )context ;
94
110
95
111
while (1 ) {
96
- uint32_t events = furi_thread_flags_wait (WORKER_ALL_RX_EVENTS , FuriFlagWaitAny , FuriWaitForever );
112
+ uint32_t events =
113
+ furi_thread_flags_wait (WORKER_ALL_RX_EVENTS , FuriFlagWaitAny , FuriWaitForever );
97
114
furi_check ((events & FuriFlagError ) == 0 );
98
115
99
116
if (events & WorkerEvtStop ) break ;
@@ -103,17 +120,20 @@ static int32_t uart_worker(void* context) {
103
120
do {
104
121
uint8_t data [64 ];
105
122
length = furi_stream_buffer_receive (uart -> rx_stream , data , 64 , 0 );
106
- // FURI_LOG_I("UART", "[in]: %s", (char*)data);
123
+
107
124
if (length > 0 ) {
108
125
for (size_t i = 0 ; i < length ; i ++ ) {
109
126
uart_echo_push_to_list (uart , data [i ]);
127
+ // FURI_LOG_I("UART", "[in]: %c - %d", (const char)data[i], data[i]);
110
128
}
111
129
}
112
130
} while (length > 0 );
113
131
} else if (uart -> channel == LP_UART_CH ) {
114
- size_t len = furi_stream_buffer_receive (uart -> rx_stream , uart -> rx_buf , RX_BUF_SIZE , 0 );
132
+ size_t len =
133
+ furi_stream_buffer_receive (uart -> rx_stream , uart -> rx_buf , RX_BUF_SIZE , 0 );
115
134
if (len > 0 ) {
116
- if (uart -> handle_rx_data_cb ) uart -> handle_rx_data_cb (uart -> rx_buf , len , uart -> app );
135
+ if (uart -> handle_rx_data_cb )
136
+ uart -> handle_rx_data_cb (uart -> rx_buf , len , uart -> app );
117
137
}
118
138
}
119
139
}
@@ -122,19 +142,13 @@ static int32_t uart_worker(void* context) {
122
142
123
143
return 0 ;
124
144
}
125
-
126
- void uart_tx ( uint8_t * data , size_t len ) {
127
- furi_hal_uart_tx ( UART_CH , data , len );
145
+ void uart_tx ( void * app , uint8_t * data , size_t len ) {
146
+ Uart * uart = ( Uart * ) app ;
147
+ furi_hal_serial_tx ( uart -> serial_handle , data , len );
128
148
}
129
149
130
- void lp_uart_tx (uint8_t * data , size_t len ) {
131
- furi_hal_uart_tx (LP_UART_CH , data , len );
132
- }
133
-
134
- Uart *
135
- _uart_init (void * app , FuriHalUartId channel , const char * thread_name ) {
150
+ Uart * _uart_init (void * app , FuriHalSerialId channel , const char * thread_name ) {
136
151
Uart * uart = (Uart * )malloc (sizeof (Uart ));
137
-
138
152
uart -> app = app ;
139
153
uart -> channel = channel ;
140
154
uart -> rx_stream = furi_stream_buffer_alloc (RX_BUF_SIZE , 1 );
@@ -144,13 +158,18 @@ Uart*
144
158
furi_thread_set_context (uart -> rx_thread , uart );
145
159
furi_thread_set_callback (uart -> rx_thread , uart_worker );
146
160
furi_thread_start (uart -> rx_thread );
147
- if (channel == FuriHalUartIdUSART1 ) {
148
- furi_hal_console_disable ();
149
- } else if (channel == FuriHalUartIdLPUART1 ) {
150
- furi_hal_uart_init (channel , BAUDRATE );
161
+ uart -> serial_handle = furi_hal_serial_control_acquire (channel );
162
+ if (!uart -> serial_handle ) {
163
+ furi_delay_ms (5000 );
151
164
}
152
- furi_hal_uart_set_br (channel , BAUDRATE );
153
- furi_hal_uart_set_irq_cb (channel , uart_on_irq_cb , uart );
165
+ furi_check (uart -> serial_handle );
166
+ furi_hal_serial_init (uart -> serial_handle , BAUDRATE );
167
+ furi_hal_serial_async_rx_start (
168
+ uart -> serial_handle ,
169
+ channel == FuriHalSerialIdUsart ? uart_on_irq_cb : wifi_marauder_uart_on_irq_cb ,
170
+ uart ,
171
+ false);
172
+
154
173
155
174
return uart ;
156
175
}
@@ -166,15 +185,12 @@ Uart* lp_uart_init(void* app) {
166
185
void uart_free (Uart * uart ) {
167
186
furi_assert (uart );
168
187
169
- furi_thread_flags_set (furi_thread_get_id (uart -> rx_thread ), WorkerEvtStop );
188
+ furi_thread_flags_set (furi_thread_get_id (uart -> rx_thread ), WorkerEvtStop );
170
189
furi_thread_join (uart -> rx_thread );
171
190
furi_thread_free (uart -> rx_thread );
172
191
173
- furi_hal_uart_set_irq_cb (uart -> channel , NULL , NULL );
174
- if (uart -> channel == FuriHalUartIdLPUART1 ) {
175
- furi_hal_uart_deinit (uart -> channel );
176
- }
177
- furi_hal_console_enable ();
192
+ furi_hal_serial_deinit (uart -> serial_handle );
193
+ furi_hal_serial_control_release (uart -> serial_handle );
178
194
179
195
free (uart );
180
196
}
0 commit comments