Skip to content

Commit 6d0fa84

Browse files
committed
Rework flipper serial (not tested)
1 parent fd8078a commit 6d0fa84

File tree

2 files changed

+21
-83
lines changed

2 files changed

+21
-83
lines changed

include/zenoh-pico/system/platform/flipper.h

+2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ typedef struct {
4444
#if Z_FEATURE_LINK_SERIAL == 1
4545
FuriStreamBuffer* _rx_stream;
4646
FuriHalSerialHandle* _serial;
47+
uint8_t* tmp_buf;
48+
uint8_t* raw_buf;
4749
#endif
4850
} _z_sys_net_socket_t;
4951

src/system/flipper/network.c

+19-83
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,11 @@ z_result_t _z_open_serial_from_dev(_z_sys_net_socket_t* sock, char* dev, uint32_
7777
furi_hal_serial_async_rx_start(sock->_serial, _z_serial_received_byte_callback, sock->_rx_stream, false);
7878

7979
_Z_DEBUG("Serial port opened: %s (%li)", dev, baudrate);
80-
return _Z_RES_OK;
80+
81+
sock->tmp_buf = (uint8_t*)z_malloc(_Z_SERIAL_MFS_SIZE);
82+
sock->raw_buf = (uint8_t*)z_malloc(_Z_SERIAL_MAX_COBS_BUF_SIZE);
83+
84+
return _z_connect_serial(*sock);
8185
}
8286

8387
z_result_t _z_listen_serial_from_pins(_z_sys_net_socket_t* sock, uint32_t txpin, uint32_t rxpin, uint32_t baudrate) {
@@ -112,110 +116,42 @@ void _z_close_serial(_z_sys_net_socket_t* sock) {
112116

113117
sock->_serial = 0;
114118
sock->_rx_stream = 0;
119+
120+
z_free(sock->tmp_buf);
121+
z_free(sock->raw_buf);
115122
}
116123
_Z_DEBUG("Serial port closed");
117124
}
118125

119-
size_t _z_read_serial(const _z_sys_net_socket_t sock, uint8_t* ptr, size_t len) {
120-
z_result_t ret = _Z_RES_OK;
121-
122-
uint8_t* before_cobs = (uint8_t*)z_malloc(_Z_SERIAL_MAX_COBS_BUF_SIZE);
126+
size_t _z_read_serial_internal(const _z_sys_net_socket_t sock, uint8_t* header, uint8_t* ptr, size_t len) {
123127
size_t rb = 0;
124128
for (size_t i = 0; i < _Z_SERIAL_MAX_COBS_BUF_SIZE; i++) {
125129
size_t len = 0;
126-
len = furi_stream_buffer_receive(sock._rx_stream, &before_cobs[i], 1, FLIPPER_SERIAL_TIMEOUT_MS);
130+
len = furi_stream_buffer_receive(sock._rx_stream, &sock.raw_buf[i], 1, FLIPPER_SERIAL_TIMEOUT_MS);
127131
if (!len) {
128-
z_free(before_cobs);
129132
return SIZE_MAX;
130133
}
131-
rb += 1;
134+
rb++;
132135

133-
if (before_cobs[i] == (uint8_t)0x00) {
136+
if (sock.raw_buf[i] == (uint8_t)0x00) {
134137
break;
135138
}
136139
}
137140

138-
uint8_t* after_cobs = (uint8_t*)z_malloc(_Z_SERIAL_MFS_SIZE);
139-
size_t trb = _z_cobs_decode(before_cobs, rb, after_cobs);
140-
141-
size_t i = 0;
142-
uint16_t payload_len = 0;
143-
for (i = 0; i < sizeof(payload_len); i++) {
144-
payload_len |= (after_cobs[i] << ((uint8_t)i * (uint8_t)8));
145-
}
146-
147-
if (trb == (size_t)(payload_len + (uint16_t)6)) {
148-
(void)memcpy(ptr, &after_cobs[i], payload_len);
149-
i += (size_t)payload_len;
150-
151-
uint32_t crc = 0;
152-
for (uint8_t j = 0; j < sizeof(crc); j++) {
153-
crc |= (uint32_t)(after_cobs[i] << (j * (uint8_t)8));
154-
i += 1;
155-
}
156-
157-
uint32_t c_crc = _z_crc32(ptr, payload_len);
158-
if (c_crc != crc) {
159-
ret = _Z_ERR_GENERIC;
160-
}
161-
} else {
162-
ret = _Z_ERR_GENERIC;
163-
}
164-
165-
z_free(before_cobs);
166-
z_free(after_cobs);
167-
168-
rb = payload_len;
169-
if (ret != _Z_RES_OK) {
170-
rb = SIZE_MAX;
171-
}
172-
173-
return rb;
174-
}
175-
176-
size_t _z_read_exact_serial(const _z_sys_net_socket_t sock, uint8_t* ptr, size_t len) {
177-
size_t n = len;
178-
179-
do {
180-
size_t rb = _z_read_serial(sock, ptr, n);
181-
if (rb == SIZE_MAX) {
182-
return rb;
183-
}
184-
n -= rb;
185-
ptr += len - n;
186-
} while (n > 0);
187-
188-
return len;
141+
return _z_serial_msg_deserialize(sock.raw_buf, rb, ptr, len, header, sock.tmp_buf, _Z_SERIAL_MFS_SIZE);
189142
}
190143

191-
size_t _z_send_serial(const _z_sys_net_socket_t sock, const uint8_t* ptr, size_t len) {
192-
z_result_t ret = _Z_RES_OK;
144+
size_t _z_send_serial_internal(const _z_sys_net_socket_t sock, uint8_t header, const uint8_t* ptr, size_t len) {
145+
size_t ret = _z_serial_msg_serialize(sock.raw_buf, _Z_SERIAL_MAX_COBS_BUF_SIZE, ptr, len, header, sock.tmp_buf,
146+
_Z_SERIAL_MFS_SIZE);
193147

194-
uint8_t* before_cobs = (uint8_t*)z_malloc(_Z_SERIAL_MFS_SIZE);
195-
size_t i = 0;
196-
for (i = 0; i < sizeof(uint16_t); ++i) {
197-
before_cobs[i] = (len >> (i * (size_t)8)) & (size_t)0XFF;
148+
if (ret == SIZE_MAX) {
149+
return ret;
198150
}
199151

200-
(void)memcpy(&before_cobs[i], ptr, len);
201-
i += len;
202-
203-
uint32_t crc = _z_crc32(ptr, len);
204-
for (uint8_t j = 0; j < sizeof(crc); j++) {
205-
before_cobs[i] = (crc >> (j * (uint8_t)8)) & (uint32_t)0XFF;
206-
i++;
207-
}
208-
209-
uint8_t* after_cobs = (uint8_t*)z_malloc(_Z_SERIAL_MAX_COBS_BUF_SIZE);
210-
ssize_t twb = _z_cobs_encode(before_cobs, i, after_cobs);
211-
after_cobs[twb] = 0x00; // Manually add the COBS delimiter
212-
213-
furi_hal_serial_tx(sock._serial, after_cobs, twb + (ssize_t)1);
152+
furi_hal_serial_tx(sock._serial, sock.raw_buf, ret);
214153
furi_hal_serial_tx_wait_complete(sock._serial);
215154

216-
z_free(before_cobs);
217-
z_free(after_cobs);
218-
219155
return len;
220156
}
221157
#endif

0 commit comments

Comments
 (0)