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