agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
rtu.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_VFS_MODULE_MODBUS_RTU_H
8 #define ZRTOS_VFS_MODULE_MODBUS_RTU_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/vfs_plugin.h>
15 #include <zrtos/cbuffer.h>
16 #include <zrtos/msg_queue.h>
17 #include <zrtos/error_count.h>
18 
20 
21 
22 #ifndef ZRTOS_VFS_MODULE_MODBUS_RTU__CFG_RESPONSE_TIMEOUT_US
23 # define ZRTOS_VFS_MODULE_MODBUS_RTU__CFG_RESPONSE_TIMEOUT_US 1000000
24 #endif
25 
26 typedef enum{
30 
41 
42 
43 static void zrtos_vfs_module_modbus_rtu__crc(void *callback_args,uint8_t ch){
44  uint16_t *crc_ptr = ZRTOS_CAST(uint16_t*,callback_args);
45  uint16_t crc = *crc_ptr;
46 
47  crc ^= (uint16_t)ch;
48 
49  for(size_t i = 8; i--;){
50  bool tmp = (crc & 0x0001) != 0;
51  crc >>= 1;
52  if(tmp){
53  crc ^= 0xA001;
54  }
55  }
56 
57  *crc_ptr = crc;
58 }
59 
60 static uint16_t zrtos_vfs_module_modbus_rtu__crc_str(uint8_t *data,size_t len){
61  uint16_t crc = 0xffff;
62  while(len--){
64  }
65  return crc;
66 }
67 
69  uint16_t crc
70  ,uint16_t crc_msg
71 ){
72  return crc == crc_msg
75  ;
76 }
77 
79  void *thiz
80 ){
84  thiz
85  )
86  );
89  size_t cbuffer_length = zrtos_cbuffer__get_length(cbuffer);
90 
91  if(cbuffer_length > 0){
92  if(cbuffer_length >= 4){
93  uint16_t crc = 0xffff;
94  uint16_t crc_msg;
95  zrtos_error_t ret;
97 
99 
101  cbuffer
102  ,cbuffer_length-2
104  ,&crc
105  );
106 
108  &mod->msg_queue_in
109  ,cbuffer_length-2
110  )))
112  &mod->msg_queue_in
113  ,cbuffer
114  ,cbuffer_length-2
115  )))
117  cbuffer
118  ,crc_msg
119  ,2
120  ,&outlen
121  )))
123  crc
124  ,crc_msg
125  )))
126  ){
127  break;
128  }else{
130  &mod->msg_queue_in
131  ,&txn
132  );
133  }
134  }else{
135  ret = ZRTOS_ERROR__IO;
136  }
137 
139  }
140 }
141 
143  void *callback_data
144 ){
148  ,callback_data
149  );
150  size_t outlen;
151 
156  &thiz->msg_queue_out
157  ,thiz->uart->cbuffer_out
159  ,&outlen
160  );
161  zrtos_error_count__add(&mod->tx_error_count,ret);
162  }
163 
164  return ret;
165 }
166 
168  void *callback_data
169 ){
170  zrtos_error_t ret;
173  ,callback_data
174  );
175 
176  ret = zrtos_vfs_fd__ioctl(
177  thiz->timeout_fd
178  ,(char*)""
180  );
181 
182  return ret;
183 }
184 
188  ,char *timeout_path
189 ){
190  zrtos_error_t ret;
192 
193  thiz->uart = uart;
196  thiz->uart->callback_data = thiz;
199  1750
200  ,char_transmission_us*3+char_transmission_us/2
201  );
202 
203  ret = zrtos_vfs_fd__open(timeout_path,&thiz->timeout_fd,0);
204  if(zrtos_error__is_success(ret)){
205  ret = zrtos_vfs_fd__ioctl(
206  thiz->timeout_fd
207  ,(char*)""
210  ,thiz
211  );
212  if(zrtos_error__is_success(ret)){
213  ret = zrtos_vfs_fd__ioctl(
214  thiz->timeout_fd
215  ,(char*)""
218  ,thiz
219  );
220  if(zrtos_error__is_success(ret)){
223  if(zrtos_msg_queue__init(&thiz->msg_queue_in)){
224  if(zrtos_msg_queue__init(&thiz->msg_queue_out)){
225  return true;
226  }
227  zrtos_msg_queue__deinit(&thiz->msg_queue_in);
228  }
230  }
232  }
234  }
235  }
236  }
237 
238  return false;
239 }
240 
243 ){
244  return &thiz->msg_queue_in;
245 }
246 
249 ){
250  return &thiz->msg_queue_out;
251 }
252 
254  zrtos_vfs_file_t *thiz
255  ,char *path
256  ,void *buf
257  ,size_t len
258  ,zrtos_vfs_offset_t offset
259  ,size_t *out
260 ){
261  zrtos_error_t ret;
265  thiz
266  )
267  );
268 
269  ret = zrtos_msg_queue__get(
270  &mod->msg_queue_in
271  ,buf
272  ,len
273  ,out
274  );
275 
276  return ret;
277 }
278 
280  zrtos_vfs_file_t *thiz
281  ,char *path
282  ,void *buf
283  ,size_t len
284  ,zrtos_vfs_offset_t offset
285  ,size_t *out
286 ){
287  zrtos_error_t ret;
291  thiz
292  )
293  );
294  uint16_t crc = zrtos_vfs_module_modbus_rtu__crc_str(buf,len);
296 
298 
300  &mod->msg_queue_out
301  ,buf
302  ,len+2
303  ,out
304  )))
306  &mod->msg_queue_out
307  ,buf
308  ,len
309  ,out
310  )))
312  &mod->msg_queue_out
313  ,&crc
314  ,2
315  ,out
316  )))
318  &mod->msg_queue_out
319  )))
320  ){
321  ret = rtos_vfs_module_modbus_rtu__on_send(mod);
322  }else{
324  &mod->msg_queue_out
325  ,&txn
326  );
327  }
328 
329  return ret;
330 }
331 
333  zrtos_vfs_file_t *thiz
334  ,char *path
335 ){
339  thiz
340  )
341  );
342 
346  ;
347 }
348 
350  zrtos_vfs_file_t *thiz
351  ,char *path
352 ){
353  return ZRTOS_ERROR__SUCCESS;
354 }
355 
357  zrtos_vfs_file_t *thiz
358  ,char *path
359  ,int request
360  ,va_list args
361 ){
366  thiz
367  )
368  );
369 
371  zrtos_vfs_module_modbus_rtu_ioctl_t
372  ,request
373  )){
376  args
378  );
379  *ret = &mod->rx_error_count;
380  break;
383  args
385  );
386  *ret = &mod->tx_error_count;
387  break;
388  default:
389  ret = ZRTOS_ERROR__INVAL;
390  break;
391  }
392 
393  return ret;
394 }
395 
396 ZRTOS_VFS_PLUGIN__INIT(modbus_rtu,
407 );
408 
409 #ifdef __cplusplus
410 }
411 #endif
412 #endif
zrtos_error_t zrtos_vfs_module_modbus_rtu__on_read(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: rtu.h:253
#define ZRTOS_CAST(type, value)
Definition: cast.h:18
bool zrtos_cbuffer__is_empty(zrtos_cbuffer_t *thiz)
Definition: cbuffer.h:357
zrtos_msg_queue_t * zrtos_vfs_module_modbus_rtu_inode__get_msg_queue_out(zrtos_vfs_module_modbus_rtu_inode_t *thiz)
Definition: rtu.h:247
zrtos_msg_queue_t * zrtos_vfs_module_modbus_rtu_inode__get_msg_queue_in(zrtos_vfs_module_modbus_rtu_inode_t *thiz)
Definition: rtu.h:241
#define ZRTOS_VFS_PLUGIN__3_ON_UMOUNT_DEFAULT()
Definition: vfs_plugin.h:199
void zrtos_msg_queue__start_write_transaction(zrtos_msg_queue_t *thiz, zrtos_msg_queue_write_transaction_t *txn)
Definition: msg_queue.h:33
zrtos_error_t zrtos_msg_queue__pipe_next_message_to_cbuffer(zrtos_msg_queue_t *thiz, zrtos_cbuffer_t *dest, size_t len, size_t *outlen)
Definition: msg_queue.h:180
#define ZRTOS_CAST__REINTERPRET(type, value)
Definition: cast.h:19
static uint16_t zrtos_vfs_module_modbus_rtu__crc_str(uint8_t *data, size_t len)
Definition: rtu.h:60
zrtos_error_t zrtos_vfs_module_modbus_rtu__on_recv(void *callback_data)
Definition: rtu.h:167
zrtos_error_t zrtos_msg_queue__put_length(zrtos_msg_queue_t *thiz, size_t len)
Definition: msg_queue.h:59
Try again.
Definition: error.h:35
zrtos_error_t zrtos_vfs_fd__open(char *path, zrtos_vfs_fd_t *thiz, void *file_ctx)
Definition: vfs_fd.h:70
size_t zrtos_vfs_offset_t
Definition: vfs_plugin.h:49
#define ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT()
Definition: vfs_plugin.h:148
zrtos_error_t zrtos_vfs_fd__close(zrtos_vfs_fd_t thiz)
Definition: vfs_fd.h:77
zrtos_vfs_module_uart_callback_t on_send
Definition: uart/uart.h:209
zrtos_cbuffer_t * zrtos_vfs_module_uart_inode__get_cbuffer_in(zrtos_vfs_module_uart_inode_t *thiz)
Definition: uart/uart.h:244
zrtos_error_t zrtos_cbuffer__get_ex(zrtos_cbuffer_t *thiz, void *data, size_t len, size_t *outlen)
Definition: cbuffer.h:336
zrtos_error_t zrtos_vfs_module_modbus_rtu__cmp_crc(uint16_t crc, uint16_t crc_msg)
Definition: rtu.h:68
struct _zrtos_vfs_module_modbus_rtu_inode_t zrtos_vfs_module_modbus_rtu_inode_t
void zrtos_arch__delay_microseconds(uint16_t us)
Definition: atmega2560.h:296
zrtos_error_t zrtos_msg_queue__put_data(zrtos_msg_queue_t *thiz, void *data, size_t len)
Definition: msg_queue.h:77
zrtos_error_t zrtos_error_count__add(zrtos_error_count_t *thiz, zrtos_error_t err)
Definition: error_count.h:30
#define ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT()
Definition: vfs_plugin.h:294
bool zrtos_vfs_module_modbus_rtu_inode__init(zrtos_vfs_module_modbus_rtu_inode_t *thiz, zrtos_vfs_module_uart_inode_t *uart, char *timeout_path)
Definition: rtu.h:185
#define ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT()
Definition: vfs_plugin.h:165
void zrtos_vfs_module_modbus_rtu__on_recv_timeout(void *thiz)
Definition: rtu.h:78
zrtos_error_t zrtos_vfs_fd__ioctl(zrtos_vfs_fd_t thiz, char *path, int request,...)
Definition: vfs_fd.h:254
bool zrtos_error_count__init(zrtos_error_count_t *thiz)
Definition: error_count.h:20
zrtos_error_t zrtos_vfs_module_modbus_rtu__on_send(void *callback_data)
Definition: rtu.h:142
zrtos_error_count_t rx_error_count
Definition: rtu.h:34
#define ZRTOS_TYPES__SIZE_MAX
Definition: types.h:170
zrtos_msg_queue_t msg_queue_in
Definition: rtu.h:32
#define ZRTOS_VFS_PLUGIN__4_ON_READ(callback)
Definition: vfs_plugin.h:215
#define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(callback)
Definition: vfs_plugin.h:259
#define ZRTOS_VFS_PLUGIN__5_ON_WRITE(callback)
Definition: vfs_plugin.h:237
zrtos_error_t zrtos_vfs_module_modbus_rtu__on_can_write(zrtos_vfs_file_t *thiz, char *path)
Definition: rtu.h:349
bool zrtos_msg_queue__is_empty(zrtos_msg_queue_t *thiz)
Definition: msg_queue.h:55
void * zrtos_vfs_file__get_inode_data(zrtos_vfs_file_t *thiz)
Definition: vfs_file.h:191
bool zrtos_error__is_success(zrtos_error_t thiz)
Definition: error.h:152
#define ZRTOS_TYPES__MIN(a, b)
Definition: types.h:78
zrtos_vfs_module_uart_callback_t on_recv
Definition: uart/uart.h:210
size_t zrtos_cbuffer__get_length(zrtos_cbuffer_t *thiz)
Definition: cbuffer.h:401
#define ZRTOS_VFS_PLUGIN__9_ON_IOCTL(callback)
Definition: vfs_plugin.h:318
Successful program execution status.
Definition: error.h:22
zrtos_msg_queue_t msg_queue_out
Definition: rtu.h:33
zrtos_cbuffer_t cbuffer_out
Definition: uart/uart.h:204
void zrtos_msg_queue__rollback_write_transaction(zrtos_msg_queue_t *thiz, zrtos_msg_queue_write_transaction_t *txn)
Definition: msg_queue.h:44
zrtos_vfs_module_timeout_microseconds_t timeout_frame_us
Definition: rtu.h:38
zrtos_vfs_module_timeout_microseconds_t timeout_response_us
Definition: rtu.h:39
Invalid argument.
Definition: error.h:46
static void zrtos_vfs_module_modbus_rtu__crc(void *callback_args, uint8_t ch)
Definition: rtu.h:43
zrtos_vfs_module_uart_inode_t * uart
Definition: rtu.h:36
zrtos_error_t zrtos_msg_queue__put_cbuffer_data(zrtos_msg_queue_t *thiz, zrtos_cbuffer_t *data, size_t length)
Definition: msg_queue.h:100
zrtos_error_count_t tx_error_count
Definition: rtu.h:35
uint16_t zrtos_vfs_module_timeout_microseconds_t
Definition: timeout.h:24
#define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(callback)
Definition: vfs_plugin.h:276
#define ZRTOS_VFS_MODULE_MODBUS_RTU__CFG_RESPONSE_TIMEOUT_US
Definition: rtu.h:23
I/O error.
Definition: error.h:29
zrtos_vfs_module_modbus_rtu_ioctl_t
Definition: rtu.h:26
ZRTOS_VFS_PLUGIN__INIT(modbus_rtu, ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT() ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT() ZRTOS_VFS_PLUGIN__2_ON_MOUNT_DEFAULT() ZRTOS_VFS_PLUGIN__3_ON_UMOUNT_DEFAULT() ZRTOS_VFS_PLUGIN__4_ON_READ(zrtos_vfs_module_modbus_rtu__on_read) ZRTOS_VFS_PLUGIN__5_ON_WRITE(zrtos_vfs_module_modbus_rtu__on_write) ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(zrtos_vfs_module_modbus_rtu__on_can_read) ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(zrtos_vfs_module_modbus_rtu__on_can_write) ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT() ZRTOS_VFS_PLUGIN__9_ON_IOCTL(zrtos_vfs_module_modbus_rtu__on_ioctl))
zrtos_error_t zrtos_vfs_module_modbus_rtu__on_ioctl(zrtos_vfs_file_t *thiz, char *path, int request, va_list args)
Definition: rtu.h:356
zrtos_error_t zrtos_msg_queue__put_end(zrtos_msg_queue_t *thiz)
Definition: msg_queue.h:93
static uint8_t
Definition: mcp2515.h:159
zrtos_error_t zrtos_vfs_module_modbus_rtu__on_can_read(zrtos_vfs_file_t *thiz, char *path)
Definition: rtu.h:332
void zrtos_error_count__deinit(zrtos_error_count_t *thiz)
Definition: error_count.h:26
zrtos_error_t
Definition: error.h:20
zrtos_error_t zrtos_msg_queue__get(zrtos_msg_queue_t *thiz, void *data, size_t len, size_t *outlen)
Definition: msg_queue.h:140
zrtos_vfs_module_timeout_microseconds_t zrtos_vfs_module_uart__get_char_transmission_time(zrtos_vfs_module_uart_inode_t *thiz)
Definition: uart/uart.h:282
zrtos_error_t zrtos_vfs_module_modbus_rtu__on_write(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: rtu.h:279
#define zrtos_va__arg(ap, type)
Definition: va.h:21
zrtos_error_t zrtos_cbuffer__hash(zrtos_cbuffer_t *thiz, size_t length, void(*callback)(void *callback_args, uint8_t ch), void *callback_args)
Definition: cbuffer.h:245
#define ZRTOS_VFS_PLUGIN__2_ON_MOUNT_DEFAULT()
Definition: vfs_plugin.h:182