@@ -77,7 +77,11 @@ z_result_t _z_open_serial_from_dev(_z_sys_net_socket_t* sock, char* dev, uint32_
77
77
furi_hal_serial_async_rx_start (sock -> _serial , _z_serial_received_byte_callback , sock -> _rx_stream , false);
78
78
79
79
_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 );
81
85
}
82
86
83
87
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) {
112
116
113
117
sock -> _serial = 0 ;
114
118
sock -> _rx_stream = 0 ;
119
+
120
+ z_free (sock -> tmp_buf );
121
+ z_free (sock -> raw_buf );
115
122
}
116
123
_Z_DEBUG ("Serial port closed" );
117
124
}
118
125
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 ) {
123
127
size_t rb = 0 ;
124
128
for (size_t i = 0 ; i < _Z_SERIAL_MAX_COBS_BUF_SIZE ; i ++ ) {
125
129
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 );
127
131
if (!len ) {
128
- z_free (before_cobs );
129
132
return SIZE_MAX ;
130
133
}
131
- rb += 1 ;
134
+ rb ++ ;
132
135
133
- if (before_cobs [i ] == (uint8_t )0x00 ) {
136
+ if (sock . raw_buf [i ] == (uint8_t )0x00 ) {
134
137
break ;
135
138
}
136
139
}
137
140
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 );
189
142
}
190
143
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 );
193
147
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 ;
198
150
}
199
151
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 );
214
153
furi_hal_serial_tx_wait_complete (sock ._serial );
215
154
216
- z_free (before_cobs );
217
- z_free (after_cobs );
218
-
219
155
return len ;
220
156
}
221
157
#endif
0 commit comments