@@ -332,7 +332,10 @@ z_result_t _z_open_serial_from_pins(_z_sys_net_socket_t *sock, uint32_t txpin, u
332
332
ret = _Z_ERR_GENERIC;
333
333
}
334
334
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);
336
339
}
337
340
338
341
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
370
373
return ret;
371
374
}
372
375
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
+ }
374
381
375
382
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]();
379
383
size_t rb = 0 ;
380
384
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++ ;
383
387
if (before_cobs[i] == (uint8_t )0x00 ) {
384
388
break ;
385
389
}
386
390
}
387
391
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);
424
393
}
425
394
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) ;
429
398
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;
469
401
}
470
402
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;
477
406
}
478
407
479
- return sb ;
408
+ return len ;
480
409
}
481
410
#endif
482
411
0 commit comments