1 /*
2  * Copyright (C) 2015-2018 Alibaba Group Holding Limited
3  */
4 
5 #include <mbmaster.h>
6 #include "../physical/serial.h"
7 #include "../adu/rtu/rtu.h"
8 #include "../pdu/pdu.h"
9 
10 #if (MBMASTER_CONFIG_RTU_ENABLED > 0)
mbmaster_rtu_init(mb_handler_t ** req_handler,uint8_t port,uint32_t baud_rate,mb_parity_t parity,uint32_t timeout)11 mb_status_t mbmaster_rtu_init(mb_handler_t **req_handler, uint8_t port, uint32_t baud_rate, mb_parity_t parity, uint32_t timeout)
12 {
13     mb_handler_t *handler;
14     mb_status_t   status = MB_SUCCESS;
15 
16     handler = mb_alloc_handler();
17     if (handler == NULL) {
18         return MB_CANNOT_GET_HANDLER;
19     }
20 
21     status = mb_serial_init(handler, port, baud_rate, 8, parity);
22     if (status != MB_SUCCESS) {
23         return status;
24     }
25 
26     MB_MUTEX_CREATE(&handler->mb_mutex);
27 
28     handler->mode            = MB_RTU;
29     handler->frame_recv      = mb_serial_frame_recv;
30     handler->frame_send      = mb_serial_frame_send;
31     handler->adu_assemble    = rtu_assemble;
32     handler->adu_disassemble = rtu_disassemble;
33     handler->respond_timeout = timeout;
34     handler->pdu_offset      = ADU_SER_PDU_OFF;
35 
36     *req_handler = handler;
37 
38     return status;
39 }
40 
mbmaster_rtu_uninit(mb_handler_t * req_handler)41 mb_status_t mbmaster_rtu_uninit(mb_handler_t *req_handler)
42 {
43     mb_status_t status = MB_SUCCESS;
44 
45     MB_MUTEX_LOCK(&req_handler->mb_mutex);
46     MB_MUTEX_DEL(&req_handler->mb_mutex);
47     mb_serial_finalize(req_handler);
48     mb_free_handler(req_handler);
49 
50     return status;
51 }
52 #endif /* MBMASTER_CONFIG_RTU_ENABLED */
53