grblHAL core  20241107
stream.h
Go to the documentation of this file.
1 /*
2  stream.h - high level (serial) stream handling
3 
4  Part of grblHAL
5 
6  Copyright (c) 2019-2024 Terje Io
7 
8  grblHAL is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 3 of the License, or
11  (at your option) any later version.
12 
13  grblHAL is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with grblHAL. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
28 #ifndef _STREAM_H_
29 #define _STREAM_H_
30 
31 #define ASCII_SOH 0x01
32 #define ASCII_STX 0x02
33 #define ASCII_ETX 0x03
34 #define ASCII_EOT 0x04
35 #define ASCII_ENQ 0x05
36 #define ASCII_ACK 0x06
37 #define ASCII_BS 0x08
38 #define ASCII_TAB 0x09
39 #define ASCII_LF 0x0A
40 #define ASCII_CR 0x0D
41 #define ASCII_XON 0x11
42 #define ASCII_XOFF 0x13
43 #define ASCII_NAK 0x15
44 #define ASCII_EOF 0x1A
45 #define ASCII_CAN 0x18
46 #define ASCII_EM 0x19
47 #define ASCII_ESC 0x1B
48 #define ASCII_DEL 0x7F
49 #define ASCII_EOL "\r\n"
50 
51 #ifndef RX_BUFFER_SIZE
52 #define RX_BUFFER_SIZE 1024 // must be a power of 2
53 #endif
54 
55 #ifndef TX_BUFFER_SIZE
56 #define TX_BUFFER_SIZE 512 // must be a power of 2
57 #endif
58 
59 #ifndef BLOCK_TX_BUFFER_SIZE
60 #define BLOCK_TX_BUFFER_SIZE 256
61 #endif
62 
63 // Serial baud rate
64 #ifndef BAUD_RATE
65 #define BAUD_RATE 115200
66 #endif
67 
68 // Value to be returned from input stream when no data is available
69 #ifndef SERIAL_NO_DATA
70 #define SERIAL_NO_DATA -1
71 #endif
72 
73 #define BUFNEXT(ptr, buffer) ((ptr + 1) & (sizeof(buffer.data) - 1))
74 #define BUFCOUNT(head, tail, size) ((head >= tail) ? (head - tail) : (size - tail + head))
75 
76 #include <stddef.h>
77 #include <stdint.h>
78 #include <stdbool.h>
79 
80 #include "vfs.h"
81 
82 typedef enum {
88  StreamType_SDCard, // deprecated, use StreamType_File instead
93 
94 typedef union {
95  uint8_t value;
96  struct {
97  uint8_t dtr :1,
98  rts :1,
99  unused :6;
100  };
102 
106 typedef bool (*stream_is_connected_ptr)(void);
107 
111 typedef uint16_t (*get_stream_buffer_count_ptr)(void);
112 
116 typedef int16_t (*stream_read_ptr)(void);
117 
123 typedef void (*stream_write_ptr)(const char *s);
124 
129 typedef void (*stream_write_n_ptr)(const char *s, uint16_t len);
130 
131 
135 typedef bool (*stream_write_char_ptr)(const char c);
136 
142 typedef bool (*enqueue_realtime_command_ptr)(char c);
143 
144 
153 typedef bool (*enqueue_realtime_command2_ptr)(char c);
154 
155 
164 
165 
170 typedef bool (*set_baud_rate_ptr)(uint32_t baud_rate);
171 
173 typedef void (*flush_stream_buffer_ptr)(void);
174 
180 typedef void (*cancel_read_buffer_ptr)(void);
181 
200 typedef bool (*suspend_read_ptr)(bool await);
201 
211 typedef bool (*disable_rx_stream_ptr)(bool disable);
212 
218 
219 typedef union {
220  uint8_t value;
221  struct {
222  uint8_t claimable :1,
228  unused :2;
229  };
231 
232 typedef union {
233  uint8_t value;
234  struct {
235  uint8_t webui_connected :1,
236  is_usb :1,
238  unused :5;
239  };
241 
243 typedef struct {
245  uint8_t instance;
266 } io_stream_t;
267 
268 typedef const io_stream_t *(*stream_claim_ptr)(uint32_t baud_rate);
269 
270 typedef struct {
272  uint8_t instance;
276 
277 typedef bool (*stream_enumerate_callback_ptr)(io_stream_properties_t const *properties);
278 
279 typedef struct io_stream_details {
280  uint8_t n_streams;
284 
285 // The following structures and functions are not referenced in the core code, may be used by drivers
286 
287 typedef struct {
288  volatile uint_fast16_t head;
289  volatile uint_fast16_t tail;
290  volatile bool rts_state;
291  bool overflow;
292  bool backup;
293  char data[RX_BUFFER_SIZE];
295 
296 typedef struct {
297  volatile uint_fast16_t head;
298  volatile uint_fast16_t tail;
299  char data[TX_BUFFER_SIZE];
301 
302 typedef struct {
303  uint_fast16_t length;
304  uint_fast16_t max_length;
305  char *s;
308 
309 // double buffered tx stream
310 typedef struct {
311  uint_fast16_t length;
312  uint_fast16_t max_length;
313  char *s;
316  char data2[BLOCK_TX_BUFFER_SIZE];
318 
319 #ifdef __cplusplus
320 extern "C" {
321 #endif
322 
326 int16_t stream_get_null (void);
327 
333 bool stream_rx_suspend (stream_rx_buffer_t *rxbuffer, bool suspend);
334 
335 bool stream_mpg_register (const io_stream_t *stream, bool rx_only, stream_write_char_ptr write_char);
336 
341 bool stream_mpg_enable (bool on);
342 
343 void stream_mpg_set_mode (void *data);
344 
345 bool stream_mpg_check_enable (char c);
346 
347 bool stream_buffer_all (char c);
348 
349 bool stream_tx_blocking (void);
350 
351 bool stream_enqueue_realtime_command (char c);
352 
354 
356 
357 bool stream_connect (const io_stream_t *stream);
358 
359 bool stream_connect_instance (uint8_t instance, uint32_t baud_rate);
360 
361 void stream_disconnect (const io_stream_t *stream);
362 
363 bool stream_connected (void);
364 
365 const io_stream_t *stream_get_base (void);
366 
368 
369 const io_stream_t *stream_null_init (uint32_t baud_rate);
370 
371 io_stream_t const *stream_open_instance (uint8_t instance, uint32_t baud_rate, stream_write_char_ptr rx_handler, const char *description);
372 
373 bool stream_set_description (const io_stream_t *stream, const char *description);
374 
375 void debug_printf(const char *fmt, ...);
376 
377 #if defined(DEBUG) || defined(DEBUGOUT)
378 #define DEBUG_PRINT 1
379 #ifdef DEBUGOUT
380 void debug_write (const char *s);
381 void debug_writeln (const char *s);
382 bool debug_stream_init (void);
383 #endif
384 #else
385 #define DEBUG_PRINT 0
386 #endif
387 
388 #define debug_print(fmt, ...) \
389  do { if(DEBUG_PRINT) debug_printf(fmt, __VA_ARGS__); } while(0)
390 
391 #ifdef __cplusplus
392 }
393 #endif
394 
395 #endif
uint8_t instance
Definition: stream.c:414
bool debug_stream_init(void)
Definition: stream.c:678
uint32_t baud_rate
Definition: stream.c:415
void debug_writeln(const char *s)
Definition: stream.c:660
bool(* enqueue_realtime_command_ptr)(char c)
Pointer to function for extracting real-time commands from the input stream and enqueue them for proc...
Definition: stream.h:142
void(* stream_write_n_ptr)(const char *s, uint16_t len)
Pointer to function for writing a n character long string to the output stream.
Definition: stream.h:129
bool stream_connected(void)
Definition: stream.c:181
void stream_disconnect(const io_stream_t *stream)
Definition: stream.c:436
uint16_t(* get_stream_buffer_count_ptr)(void)
Pointer to function for getting number of characters available or free in a stream buffer.
Definition: stream.h:111
bool(* stream_is_connected_ptr)(void)
Pointer to function for getting stream connected status.
Definition: stream.h:106
void(* stream_write_ptr)(const char *s)
Pointer to function for writing a null terminated string to the output stream.
Definition: stream.h:123
bool stream_enumerate_streams(stream_enumerate_callback_ptr callback)
Definition: stream.c:88
bool(* stream_enumerate_callback_ptr)(io_stream_properties_t const *properties)
Definition: stream.h:277
bool stream_mpg_check_enable(char c)
Definition: stream.c:464
void stream_mpg_set_mode(void *data)
Definition: stream.c:459
bool stream_enqueue_realtime_command(char c)
Definition: stream.c:169
bool stream_tx_blocking(void)
Definition: stream.c:109
void(* on_linestate_changed_ptr)(serial_linestate_t state)
Pointer to function for handling line state changed events.
Definition: stream.h:217
bool(* stream_write_char_ptr)(const char c)
Pointer to function for writing a single character to the output stream.
Definition: stream.h:135
io_stream_t const * stream_open_instance(uint8_t instance, uint32_t baud_rate, stream_write_char_ptr rx_handler, const char *description)
Definition: stream.c:442
void(* cancel_read_buffer_ptr)(void)
Pointer to function for flushing the input buffer and inserting an ASCII_CAN character.
Definition: stream.h:180
void stream_register_streams(io_stream_details_t *details)
Definition: stream.c:80
io_stream_flags_t stream_get_flags(io_stream_t stream)
Definition: stream.c:372
bool stream_mpg_enable(bool on)
Function for enabling/disabling input from a secondary input stream.
Definition: stream.c:519
#define RX_BUFFER_SIZE
Definition: stream.h:52
int16_t stream_get_null(void)
Dummy function for reading data from a virtual empty input buffer.
Definition: stream.c:119
bool stream_connect_instance(uint8_t instance, uint32_t baud_rate)
Definition: stream.c:427
const io_stream_t * stream_null_init(uint32_t baud_rate)
Definition: stream.c:626
void debug_printf(const char *fmt,...)
Definition: stream.c:666
bool stream_connect(const io_stream_t *stream)
Definition: stream.c:403
bool(* enqueue_realtime_command2_ptr)(char c)
Optional, but recommended, pointer to function for enqueueing realtime command characters.
Definition: stream.h:153
bool stream_mpg_register(const io_stream_t *stream, bool rx_only, stream_write_char_ptr write_char)
Definition: stream.c:477
void(* flush_stream_buffer_ptr)(void)
Pointer to function for flushing a stream buffer.
Definition: stream.h:173
#define TX_BUFFER_SIZE
Definition: stream.h:56
bool stream_set_description(const io_stream_t *stream, const char *description)
Definition: stream.c:391
bool(* set_baud_rate_ptr)(uint32_t baud_rate)
Pointer to function for setting the stream baud rate.
Definition: stream.h:170
struct io_stream_details io_stream_details_t
const io_stream_t *(* stream_claim_ptr)(uint32_t baud_rate)
Definition: stream.h:268
bool stream_rx_suspend(stream_rx_buffer_t *rxbuffer, bool suspend)
Function for blocking reads from or restoring an input buffer.
Definition: stream.c:141
int16_t(* stream_read_ptr)(void)
Pointer to function for reading a single character from a input stream.
Definition: stream.h:116
#define BLOCK_TX_BUFFER_SIZE
Definition: stream.h:60
bool stream_buffer_all(char c)
Definition: stream.c:164
bool(* disable_rx_stream_ptr)(bool disable)
Pointer to function for disabling/enabling stream input.
Definition: stream.h:211
enqueue_realtime_command_ptr(* set_enqueue_rt_handler_ptr)(enqueue_realtime_command_ptr handler)
Pointer to function for setting the enqueue realtime commands handler.
Definition: stream.h:163
stream_type_t
Definition: stream.h:82
@ StreamType_Bluetooth
Definition: stream.h:85
@ StreamType_Telnet
Definition: stream.h:86
@ StreamType_SDCard
Definition: stream.h:88
@ StreamType_MPG
Definition: stream.h:84
@ StreamType_WebSocket
Definition: stream.h:87
@ StreamType_File
Definition: stream.h:89
@ StreamType_Null
Definition: stream.h:91
@ StreamType_Serial
Definition: stream.h:83
@ StreamType_Redirected
Definition: stream.h:90
bool(* suspend_read_ptr)(bool await)
Pointer to function for blocking reads from and restoring a input buffer.
Definition: stream.h:200
const io_stream_t * stream_get_base(void)
Definition: stream.c:367
Definition: stream.h:279
struct io_stream_details * next
Definition: stream.h:282
io_stream_properties_t * streams
Definition: stream.h:281
uint8_t n_streams
Definition: stream.h:280
Definition: stream.h:270
uint8_t instance
Instance of stream type, starts from 0.
Definition: stream.h:272
stream_type_t type
Type of stream.
Definition: stream.h:271
stream_claim_ptr claim
Definition: stream.h:274
io_stream_flags_t flags
Definition: stream.h:273
Properties and handlers for stream I/O.
Definition: stream.h:243
uint8_t instance
Instance of stream type, starts from 0.
Definition: stream.h:245
flush_stream_buffer_ptr reset_read_buffer
Handler for flushing the input buffer.
Definition: stream.h:254
stream_write_char_ptr write_char
Handler for writing a single character to current stream only.
Definition: stream.h:251
set_enqueue_rt_handler_ptr set_enqueue_rt_handler
Handler for setting the enqueue realtime command character handler.
Definition: stream.h:256
stream_write_ptr write
Handler for writing string to current output stream only.
Definition: stream.h:249
enqueue_realtime_command2_ptr enqueue_rt_command
(Optional) handler for enqueueing a realtime command character.
Definition: stream.h:252
io_stream_state_t state
Optional status flags such as connected status.
Definition: stream.h:246
get_stream_buffer_count_ptr get_rx_buffer_count
Optional handler for getting number of characters in the input buffer.
Definition: stream.h:260
stream_type_t type
Type of stream.
Definition: stream.h:244
on_linestate_changed_ptr on_linestate_changed
Optional handler to be called when line state changes. Set by client.
Definition: stream.h:264
stream_write_n_ptr write_n
Optional handler for writing n characters to current output stream only. Required for Modbus support.
Definition: stream.h:258
get_stream_buffer_count_ptr get_tx_buffer_count
Optional handler for getting number of characters in the output buffer(s). Count shall include any un...
Definition: stream.h:261
disable_rx_stream_ptr disable_rx
Optional handler for disabling/enabling a stream. Recommended?
Definition: stream.h:259
set_baud_rate_ptr set_baud_rate
Optional handler for setting the stream baud rate. Required for Modbus support, recommended for Bluet...
Definition: stream.h:263
stream_is_connected_ptr is_connected
Handler for getting stream connected status.
Definition: stream.h:247
cancel_read_buffer_ptr cancel_read_buffer
Handler for flushing the input buffer and inserting an ASCII_CAN character.
Definition: stream.h:255
stream_write_ptr write_all
Handler for writing string to all active output streams.
Definition: stream.h:250
vfs_file_t * file
File handle, non-null if streaming from a file.
Definition: stream.h:265
stream_read_ptr read
Handler for reading a single character from the input stream.
Definition: stream.h:253
flush_stream_buffer_ptr reset_write_buffer
Optional handler for flushing the output buffer. Any transmit FIFO shall be flushed as well....
Definition: stream.h:262
get_stream_buffer_count_ptr get_rx_buffer_free
Handler for getting number of free characters in the input buffer.
Definition: stream.h:248
suspend_read_ptr suspend_read
Optional handler for saving away and restoring the current input buffer.
Definition: stream.h:257
Definition: stream.h:310
bool use_tx2data
Definition: stream.h:314
uint_fast16_t length
Definition: stream.h:311
uint_fast16_t max_length
Definition: stream.h:312
char * s
Definition: stream.h:313
Definition: stream.h:302
uint_fast16_t length
Definition: stream.h:303
uint_fast16_t max_length
Definition: stream.h:304
char * s
Definition: stream.h:305
Definition: stream.h:287
bool overflow
Definition: stream.h:291
volatile uint_fast16_t head
Definition: stream.h:288
volatile bool rts_state
Definition: stream.h:290
bool backup
Definition: stream.h:292
volatile uint_fast16_t tail
Definition: stream.h:289
Definition: stream.h:296
volatile uint_fast16_t head
Definition: stream.h:297
volatile uint_fast16_t tail
Definition: stream.h:298
Definition: vfs.h:80
Definition: stream.h:219
uint8_t can_set_baud
Definition: stream.h:224
uint8_t claimed
Definition: stream.h:223
uint8_t value
Definition: stream.h:220
uint8_t rx_only
Definition: stream.h:225
uint8_t modbus_ready
Definition: stream.h:226
uint8_t rts_handshake
Definition: stream.h:227
uint8_t claimable
Definition: stream.h:222
uint8_t unused
Definition: stream.h:228
Definition: stream.h:232
uint8_t is_usb
Definition: stream.h:236
uint8_t value
Definition: stream.h:233
uint8_t webui_connected
Definition: stream.h:235
uint8_t linestate_event
Set when driver supports on_linestate_changed event.
Definition: stream.h:237
uint8_t unused
Definition: stream.h:238
Definition: stream.h:94
uint8_t rts
Definition: stream.h:98
uint8_t dtr
Definition: stream.h:97
uint8_t value
Definition: stream.h:95
uint8_t unused
Definition: stream.h:99