-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathuhf_uart.c
127 lines (117 loc) · 4.7 KB
/
uhf_uart.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
#include "uhf_uart.h"
// int32_t uhf_uart_worker_callback(void *ctx){
// UHFUart* uart = (UHFUart*)ctx;
// Buffer* buffer = (Buffer*)uart->buffer;
// uint32_t events;
// size_t length_read = 0;
// uint8_t read_buffer[1];
// FURI_LOG_E("UHF_UART_WORKER", "UHF UART WORKER STARTED");
// do{
// events = furi_thread_flags_wait(
// UHFUartWorkerWaitingDataFlag | UHFUartWorkerExitingFlag, FuriFlagWaitAny, FuriWaitForever
// );
// FURI_LOG_E("UHF_UART_WORKER", "events = %lu", events);
// if(events & UHFUartWorkerWaitingDataFlag){
// FURI_LOG_E("UHF_UART_WORKER", "Waiting data...");
// length_read = furi_stream_buffer_receive(uart->rx_buff_stream, read_buffer, 1, 0);
// if(length_read){
// do{
// length_read = furi_stream_buffer_receive(uart->rx_buff_stream, read_buffer, 1, 0);
// uhf_buffer_append_single(buffer, read_buffer[0]);
// uhf_uart_tick_reset(uart);
// }while(read_buffer[0] != UHF_UART_FRAME_END && length_read > 0);
// FURI_LOG_E("UHF_UART_WORKER", "UHF Total length read = %u", uhf_buffer_get_size(buffer));
// uhf_buffer_close(buffer);
// furi_stream_buffer_reset(uart->rx_buff_stream);
// }
// }
// }while((events & UHFUartWorkerExitingFlag) != UHFUartWorkerExitingFlag);
// return 0;
// }
void uhf_uart_default_rx_callback(
FuriHalSerialHandle* handle,
FuriHalSerialRxEvent event,
void* ctx) {
UHFUart* uart = (UHFUart*)ctx;
// FURI_LOG_E("UHF_UART", "UHF UART RX CALLBACK");
if((event & FuriHalSerialRxEventData) == FuriHalSerialRxEventData) {
uint8_t data = furi_hal_serial_async_rx(handle);
// if(data == UHF_UART_FRAME_START){
// uhf_buffer_reset(uart->buffer);
// }
if(uhf_is_buffer_closed(uart->buffer)) {
return;
}
if(data == UHF_UART_FRAME_END) {
uhf_buffer_append_single(uart->buffer, data);
uhf_buffer_close(uart->buffer);
FURI_LOG_E(
"UHF_UART", "UHF Total length read = %u", uhf_buffer_get_size(uart->buffer));
}
uhf_buffer_append_single(uart->buffer, data);
uhf_uart_tick_reset(uart);
// furi_stream_buffer_send(uart->rx_buff_stream, (void*)&data, 1, 0);
// furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
}
}
UHFUart* uhf_uart_alloc() {
UHFUart* uart = (UHFUart*)malloc(sizeof(UHFUart));
uart->bus = FuriHalBusUSART1;
uart->handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
furi_check(uart->handle, "UHF UART HANDLE IS NULL");
uart->init_by_app = !furi_hal_bus_is_enabled(uart->bus);
uart->tick = UHF_UART_WAIT_TICK;
uart->baudrate = UHF_UART_DEFAULT_BAUDRATE;
// expansion_disable();
if(uart->init_by_app) {
FURI_LOG_E("UHF_UART", "UHF UART INIT BY APP");
furi_hal_serial_init(uart->handle, uart->baudrate);
} else {
FURI_LOG_E("UHF_UART", "UHF UART INIT BY HAL");
}
uart->buffer = uhf_buffer_alloc(UHF_UART_RX_BUFFER_SIZE);
furi_hal_serial_async_rx_start(uart->handle, uhf_uart_default_rx_callback, uart, false);
return uart;
}
void uhf_uart_free(UHFUart* uart) {
furi_assert(uart);
// furi_assert(uart->thread);
// furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerExitingFlag);
// furi_thread_join(uart->thread);
// furi_thread_free(uart->thread);
// furi_stream_buffer_free(uart->rx_buff_stream);
uhf_buffer_free(uart->buffer);
if(uart->init_by_app) {
furi_hal_serial_deinit(uart->handle);
}
furi_hal_serial_control_release(uart->handle);
free(uart);
}
void uhf_uart_set_receive_byte_callback(
UHFUart* uart,
FuriHalSerialAsyncRxCallback callback,
void* ctx,
bool report_errors) {
furi_hal_serial_async_rx_start(uart->handle, callback, ctx, report_errors);
}
void uhf_uart_send(UHFUart* uart, uint8_t* data, size_t size) {
furi_hal_serial_tx(uart->handle, data, size);
}
void uhf_uart_send_wait(UHFUart* uart, uint8_t* data, size_t size) {
uhf_uart_send(uart, data, size);
furi_hal_serial_tx_wait_complete(uart->handle);
// furi_thread_flags_set(furi_thread_get_id(uart->thread), UHFUartWorkerWaitingDataFlag);
}
void uhf_uart_set_baudrate(UHFUart* uart, uint32_t baudrate) {
furi_hal_serial_set_br(uart->handle, baudrate);
uart->baudrate = baudrate;
}
bool uhf_uart_tick(UHFUart* uart) {
if(uart->tick > 0) {
uart->tick--;
}
return uart->tick == 0;
}
void uhf_uart_tick_reset(UHFUart* uart) {
uart->tick = UHF_UART_WAIT_TICK;
}