Skip to content

Commit 8b9a9fb

Browse files
committed
Rework mbed serial (not tested)
1 parent c24482b commit 8b9a9fb

File tree

2 files changed

+26
-93
lines changed

2 files changed

+26
-93
lines changed

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ typedef struct {
5151
UDPSocket *_udp; // As pointer to cross the boundary between C and C++
5252
#endif
5353
#if Z_FEATURE_LINK_SERIAL == 1
54-
BufferedSerial *_serial; // As pointer to cross the boundary between C and C++
54+
struct {
55+
BufferedSerial *_serial; // As pointer to cross the boundary between C and C++
56+
uint8_t *tmp_buf;
57+
uint8_t *raw_buf;
58+
};
5559
#endif
5660
};
5761
} _z_sys_net_socket_t;

src/system/mbed/network.cpp

+21-92
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,10 @@ z_result_t _z_open_serial_from_pins(_z_sys_net_socket_t *sock, uint32_t txpin, u
332332
ret = _Z_ERR_GENERIC;
333333
}
334334

335-
return ret;
335+
sock->tmp_buf = (uint8_t *)z_malloc(_Z_SERIAL_MFS_SIZE);
336+
sock->raw_buf = (uint8_t *)z_malloc(_Z_SERIAL_MAX_COBS_BUF_SIZE);
337+
338+
return _z_connect_serial(*sock);
336339
}
337340

338341
z_result_t _z_open_serial_from_dev(_z_sys_net_socket_t *sock, char *device, uint32_t baudrate) {
@@ -370,113 +373,39 @@ z_result_t _z_listen_serial_from_dev(_z_sys_net_socket_t *sock, char *device, ui
370373
return ret;
371374
}
372375

373-
void _z_close_serial(_z_sys_net_socket_t *sock) { delete sock->_serial; }
376+
void _z_close_serial(_z_sys_net_socket_t *sock) {
377+
delete sock->_serial;
378+
z_free(sock->tmp_buf);
379+
z_free(sock->raw_buf);
380+
}
374381

375382
size_t _z_read_serial(const _z_sys_net_socket_t sock, uint8_t *ptr, size_t len) {
376-
z_result_t ret = _Z_RES_OK;
377-
378-
uint8_t *before_cobs = new uint8_t[_Z_SERIAL_MAX_COBS_BUF_SIZE]();
379383
size_t rb = 0;
380384
for (size_t i = 0; i < _Z_SERIAL_MAX_COBS_BUF_SIZE; i++) {
381-
sock._serial->read(&before_cobs[i], 1);
382-
rb = rb + (size_t)1;
385+
sock._serial->read(&sock.raw_buf[i], 1);
386+
rb++;
383387
if (before_cobs[i] == (uint8_t)0x00) {
384388
break;
385389
}
386390
}
387391

388-
uint8_t *after_cobs = new uint8_t[_Z_SERIAL_MFS_SIZE]();
389-
size_t trb = _z_cobs_decode(before_cobs, rb, after_cobs);
390-
391-
size_t i = 0;
392-
uint16_t payload_len = 0;
393-
for (i = 0; i < sizeof(payload_len); i++) {
394-
payload_len |= (after_cobs[i] << ((uint8_t)i * (uint8_t)8));
395-
}
396-
397-
if (trb == (size_t)(payload_len + (uint16_t)6)) {
398-
(void)memcpy(ptr, &after_cobs[i], payload_len);
399-
i = i + (size_t)payload_len;
400-
401-
uint32_t crc = 0;
402-
for (uint8_t j = 0; j < sizeof(crc); j++) {
403-
crc |= (uint32_t)(after_cobs[i] << (j * (uint8_t)8));
404-
i = i + (size_t)1;
405-
}
406-
407-
uint32_t c_crc = _z_crc32(ptr, payload_len);
408-
if (c_crc != crc) {
409-
ret = _Z_ERR_GENERIC;
410-
}
411-
} else {
412-
ret = _Z_ERR_GENERIC;
413-
}
414-
415-
delete before_cobs;
416-
delete after_cobs;
417-
418-
rb = payload_len;
419-
if (ret != _Z_RES_OK) {
420-
rb = SIZE_MAX;
421-
}
422-
423-
return rb;
392+
return _z_serial_msg_deserialize(sock.raw_buf, rb, ptr, len, header, sock.tmp_buf, _Z_SERIAL_MFS_SIZE);
424393
}
425394

426-
size_t _z_read_exact_serial(const _z_sys_net_socket_t sock, uint8_t *ptr, size_t len) {
427-
size_t n = 0;
428-
uint8_t *pos = &ptr[0];
395+
size_t _z_send_serial_internal(const _z_sys_net_socket_t sock, uint8_t header, const uint8_t *ptr, size_t len) {
396+
size_t ret = _z_serial_msg_serialize(sock.raw_buf, _Z_SERIAL_MAX_COBS_BUF_SIZE, ptr, len, header, sock.tmp_buf,
397+
_Z_SERIAL_MFS_SIZE);
429398

430-
do {
431-
size_t rb = _z_read_serial(sock, ptr, len - n);
432-
if (rb == SIZE_MAX) {
433-
n = rb;
434-
break;
435-
}
436-
437-
n = n + rb;
438-
pos = _z_ptr_u8_offset(pos, n);
439-
} while (n != len);
440-
441-
return n;
442-
}
443-
444-
size_t _z_send_serial(const _z_sys_net_socket_t sock, const uint8_t *ptr, size_t len) {
445-
z_result_t ret = _Z_RES_OK;
446-
447-
uint8_t *before_cobs = new uint8_t[_Z_SERIAL_MFS_SIZE]();
448-
size_t i = 0;
449-
for (; i < sizeof(uint16_t); ++i) {
450-
before_cobs[i] = (len >> (i * (size_t)8)) & (size_t)0XFF;
451-
}
452-
453-
(void)memcpy(&before_cobs[i], ptr, len);
454-
i = i + len;
455-
456-
uint32_t crc = _z_crc32(ptr, len);
457-
for (uint8_t j = 0; j < sizeof(crc); j++) {
458-
before_cobs[i] = (crc >> (j * (uint8_t)8)) & (uint32_t)0XFF;
459-
i = i + (size_t)1;
460-
}
461-
462-
uint8_t *after_cobs = new uint8_t[_Z_SERIAL_MAX_COBS_BUF_SIZE]();
463-
ssize_t twb = _z_cobs_encode(before_cobs, i, after_cobs);
464-
after_cobs[twb] = 0x00; // Manually add the COBS delimiter
465-
466-
ssize_t wb = sock._serial->write(after_cobs, twb + (ssize_t)1);
467-
if (wb != (twb + (ssize_t)1)) {
468-
ret = _Z_ERR_GENERIC;
399+
if (ret == SIZE_MAX) {
400+
return ret;
469401
}
470402

471-
delete before_cobs;
472-
delete after_cobs;
473-
474-
size_t sb = len;
475-
if (ret != _Z_RES_OK) {
476-
sb = SIZE_MAX;
403+
ssize_t wb = sock._serial->write(after_cobs, sock.raw_buf, ret);
404+
if (wb != (ssize_t)ret) {
405+
ret = SIZE_MAX;
477406
}
478407

479-
return sb;
408+
return len;
480409
}
481410
#endif
482411

0 commit comments

Comments
 (0)