1*10465441SEvalZero /*
2*10465441SEvalZero * FreeModbus Libary: RT-Thread Port
3*10465441SEvalZero * Copyright (C) 2013 Armink <[email protected]>
4*10465441SEvalZero *
5*10465441SEvalZero * This library is free software; you can redistribute it and/or
6*10465441SEvalZero * modify it under the terms of the GNU Lesser General Public
7*10465441SEvalZero * License as published by the Free Software Foundation; either
8*10465441SEvalZero * version 2.1 of the License, or (at your option) any later version.
9*10465441SEvalZero *
10*10465441SEvalZero * This library is distributed in the hope that it will be useful,
11*10465441SEvalZero * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*10465441SEvalZero * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13*10465441SEvalZero * Lesser General Public License for more details.
14*10465441SEvalZero *
15*10465441SEvalZero * You should have received a copy of the GNU Lesser General Public
16*10465441SEvalZero * License along with this library; if not, write to the Free Software
17*10465441SEvalZero * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18*10465441SEvalZero *
19*10465441SEvalZero * File: $Id: portevent_m.c v 1.60 2013/08/13 15:07:05 Armink add Master Functions$
20*10465441SEvalZero */
21*10465441SEvalZero
22*10465441SEvalZero /* ----------------------- Modbus includes ----------------------------------*/
23*10465441SEvalZero #include "mb.h"
24*10465441SEvalZero #include "mb_m.h"
25*10465441SEvalZero #include "mbport.h"
26*10465441SEvalZero #include "port.h"
27*10465441SEvalZero
28*10465441SEvalZero #if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
29*10465441SEvalZero /* ----------------------- Defines ------------------------------------------*/
30*10465441SEvalZero /* ----------------------- Variables ----------------------------------------*/
31*10465441SEvalZero static struct rt_semaphore xMasterRunRes;
32*10465441SEvalZero static struct rt_event xMasterOsEvent;
33*10465441SEvalZero /* ----------------------- Start implementation -----------------------------*/
34*10465441SEvalZero BOOL
xMBMasterPortEventInit(void)35*10465441SEvalZero xMBMasterPortEventInit( void )
36*10465441SEvalZero {
37*10465441SEvalZero rt_event_init(&xMasterOsEvent,"master event",RT_IPC_FLAG_PRIO);
38*10465441SEvalZero return TRUE;
39*10465441SEvalZero }
40*10465441SEvalZero
41*10465441SEvalZero BOOL
xMBMasterPortEventPost(eMBMasterEventType eEvent)42*10465441SEvalZero xMBMasterPortEventPost( eMBMasterEventType eEvent )
43*10465441SEvalZero {
44*10465441SEvalZero rt_event_send(&xMasterOsEvent, eEvent);
45*10465441SEvalZero return TRUE;
46*10465441SEvalZero }
47*10465441SEvalZero
48*10465441SEvalZero BOOL
xMBMasterPortEventGet(eMBMasterEventType * eEvent)49*10465441SEvalZero xMBMasterPortEventGet( eMBMasterEventType * eEvent )
50*10465441SEvalZero {
51*10465441SEvalZero rt_uint32_t recvedEvent;
52*10465441SEvalZero /* waiting forever OS event */
53*10465441SEvalZero rt_event_recv(&xMasterOsEvent,
54*10465441SEvalZero EV_MASTER_READY | EV_MASTER_FRAME_RECEIVED | EV_MASTER_EXECUTE |
55*10465441SEvalZero EV_MASTER_FRAME_SENT | EV_MASTER_ERROR_PROCESS,
56*10465441SEvalZero RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
57*10465441SEvalZero &recvedEvent);
58*10465441SEvalZero /* the enum type couldn't convert to int type */
59*10465441SEvalZero switch (recvedEvent)
60*10465441SEvalZero {
61*10465441SEvalZero case EV_MASTER_READY:
62*10465441SEvalZero *eEvent = EV_MASTER_READY;
63*10465441SEvalZero break;
64*10465441SEvalZero case EV_MASTER_FRAME_RECEIVED:
65*10465441SEvalZero *eEvent = EV_MASTER_FRAME_RECEIVED;
66*10465441SEvalZero break;
67*10465441SEvalZero case EV_MASTER_EXECUTE:
68*10465441SEvalZero *eEvent = EV_MASTER_EXECUTE;
69*10465441SEvalZero break;
70*10465441SEvalZero case EV_MASTER_FRAME_SENT:
71*10465441SEvalZero *eEvent = EV_MASTER_FRAME_SENT;
72*10465441SEvalZero break;
73*10465441SEvalZero case EV_MASTER_ERROR_PROCESS:
74*10465441SEvalZero *eEvent = EV_MASTER_ERROR_PROCESS;
75*10465441SEvalZero break;
76*10465441SEvalZero }
77*10465441SEvalZero return TRUE;
78*10465441SEvalZero }
79*10465441SEvalZero /**
80*10465441SEvalZero * This function is initialize the OS resource for modbus master.
81*10465441SEvalZero * Note:The resource is define by OS.If you not use OS this function can be empty.
82*10465441SEvalZero *
83*10465441SEvalZero */
vMBMasterOsResInit(void)84*10465441SEvalZero void vMBMasterOsResInit( void )
85*10465441SEvalZero {
86*10465441SEvalZero rt_sem_init(&xMasterRunRes, "master res", 0x01 , RT_IPC_FLAG_PRIO);
87*10465441SEvalZero }
88*10465441SEvalZero
89*10465441SEvalZero /**
90*10465441SEvalZero * This function is take Mobus Master running resource.
91*10465441SEvalZero * Note:The resource is define by Operating System.If you not use OS this function can be just return TRUE.
92*10465441SEvalZero *
93*10465441SEvalZero * @param lTimeOut the waiting time.
94*10465441SEvalZero *
95*10465441SEvalZero * @return resource taked result
96*10465441SEvalZero */
xMBMasterRunResTake(LONG lTimeOut)97*10465441SEvalZero BOOL xMBMasterRunResTake( LONG lTimeOut )
98*10465441SEvalZero {
99*10465441SEvalZero /*If waiting time is -1 .It will wait forever */
100*10465441SEvalZero return rt_sem_take(&xMasterRunRes, lTimeOut) ? FALSE : TRUE ;
101*10465441SEvalZero }
102*10465441SEvalZero
103*10465441SEvalZero /**
104*10465441SEvalZero * This function is release Mobus Master running resource.
105*10465441SEvalZero * Note:The resource is define by Operating System.If you not use OS this function can be empty.
106*10465441SEvalZero *
107*10465441SEvalZero */
vMBMasterRunResRelease(void)108*10465441SEvalZero void vMBMasterRunResRelease( void )
109*10465441SEvalZero {
110*10465441SEvalZero /* release resource */
111*10465441SEvalZero rt_sem_release(&xMasterRunRes);
112*10465441SEvalZero }
113*10465441SEvalZero
114*10465441SEvalZero /**
115*10465441SEvalZero * This is modbus master respond timeout error process callback function.
116*10465441SEvalZero * @note There functions will block modbus master poll while execute OS waiting.
117*10465441SEvalZero * So,for real-time of system.Do not execute too much waiting process.
118*10465441SEvalZero *
119*10465441SEvalZero * @param ucDestAddress destination salve address
120*10465441SEvalZero * @param pucPDUData PDU buffer data
121*10465441SEvalZero * @param ucPDULength PDU buffer length
122*10465441SEvalZero *
123*10465441SEvalZero */
vMBMasterErrorCBRespondTimeout(UCHAR ucDestAddress,const UCHAR * pucPDUData,USHORT ucPDULength)124*10465441SEvalZero void vMBMasterErrorCBRespondTimeout(UCHAR ucDestAddress, const UCHAR* pucPDUData,
125*10465441SEvalZero USHORT ucPDULength) {
126*10465441SEvalZero /**
127*10465441SEvalZero * @note This code is use OS's event mechanism for modbus master protocol stack.
128*10465441SEvalZero * If you don't use OS, you can change it.
129*10465441SEvalZero */
130*10465441SEvalZero rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_RESPOND_TIMEOUT);
131*10465441SEvalZero
132*10465441SEvalZero /* You can add your code under here. */
133*10465441SEvalZero
134*10465441SEvalZero }
135*10465441SEvalZero
136*10465441SEvalZero /**
137*10465441SEvalZero * This is modbus master receive data error process callback function.
138*10465441SEvalZero * @note There functions will block modbus master poll while execute OS waiting.
139*10465441SEvalZero * So,for real-time of system.Do not execute too much waiting process.
140*10465441SEvalZero *
141*10465441SEvalZero * @param ucDestAddress destination salve address
142*10465441SEvalZero * @param pucPDUData PDU buffer data
143*10465441SEvalZero * @param ucPDULength PDU buffer length
144*10465441SEvalZero *
145*10465441SEvalZero */
vMBMasterErrorCBReceiveData(UCHAR ucDestAddress,const UCHAR * pucPDUData,USHORT ucPDULength)146*10465441SEvalZero void vMBMasterErrorCBReceiveData(UCHAR ucDestAddress, const UCHAR* pucPDUData,
147*10465441SEvalZero USHORT ucPDULength) {
148*10465441SEvalZero /**
149*10465441SEvalZero * @note This code is use OS's event mechanism for modbus master protocol stack.
150*10465441SEvalZero * If you don't use OS, you can change it.
151*10465441SEvalZero */
152*10465441SEvalZero rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_RECEIVE_DATA);
153*10465441SEvalZero
154*10465441SEvalZero /* You can add your code under here. */
155*10465441SEvalZero
156*10465441SEvalZero }
157*10465441SEvalZero
158*10465441SEvalZero /**
159*10465441SEvalZero * This is modbus master execute function error process callback function.
160*10465441SEvalZero * @note There functions will block modbus master poll while execute OS waiting.
161*10465441SEvalZero * So,for real-time of system.Do not execute too much waiting process.
162*10465441SEvalZero *
163*10465441SEvalZero * @param ucDestAddress destination salve address
164*10465441SEvalZero * @param pucPDUData PDU buffer data
165*10465441SEvalZero * @param ucPDULength PDU buffer length
166*10465441SEvalZero *
167*10465441SEvalZero */
vMBMasterErrorCBExecuteFunction(UCHAR ucDestAddress,const UCHAR * pucPDUData,USHORT ucPDULength)168*10465441SEvalZero void vMBMasterErrorCBExecuteFunction(UCHAR ucDestAddress, const UCHAR* pucPDUData,
169*10465441SEvalZero USHORT ucPDULength) {
170*10465441SEvalZero /**
171*10465441SEvalZero * @note This code is use OS's event mechanism for modbus master protocol stack.
172*10465441SEvalZero * If you don't use OS, you can change it.
173*10465441SEvalZero */
174*10465441SEvalZero rt_event_send(&xMasterOsEvent, EV_MASTER_ERROR_EXECUTE_FUNCTION);
175*10465441SEvalZero
176*10465441SEvalZero /* You can add your code under here. */
177*10465441SEvalZero
178*10465441SEvalZero }
179*10465441SEvalZero
180*10465441SEvalZero /**
181*10465441SEvalZero * This is modbus master request process success callback function.
182*10465441SEvalZero * @note There functions will block modbus master poll while execute OS waiting.
183*10465441SEvalZero * So,for real-time of system.Do not execute too much waiting process.
184*10465441SEvalZero *
185*10465441SEvalZero */
vMBMasterCBRequestScuuess(void)186*10465441SEvalZero void vMBMasterCBRequestScuuess( void ) {
187*10465441SEvalZero /**
188*10465441SEvalZero * @note This code is use OS's event mechanism for modbus master protocol stack.
189*10465441SEvalZero * If you don't use OS, you can change it.
190*10465441SEvalZero */
191*10465441SEvalZero rt_event_send(&xMasterOsEvent, EV_MASTER_PROCESS_SUCESS);
192*10465441SEvalZero
193*10465441SEvalZero /* You can add your code under here. */
194*10465441SEvalZero
195*10465441SEvalZero }
196*10465441SEvalZero
197*10465441SEvalZero /**
198*10465441SEvalZero * This function is wait for modbus master request finish and return result.
199*10465441SEvalZero * Waiting result include request process success, request respond timeout,
200*10465441SEvalZero * receive data error and execute function error.You can use the above callback function.
201*10465441SEvalZero * @note If you are use OS, you can use OS's event mechanism. Otherwise you have to run
202*10465441SEvalZero * much user custom delay for waiting.
203*10465441SEvalZero *
204*10465441SEvalZero * @return request error code
205*10465441SEvalZero */
eMBMasterWaitRequestFinish(void)206*10465441SEvalZero eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ) {
207*10465441SEvalZero eMBMasterReqErrCode eErrStatus = MB_MRE_NO_ERR;
208*10465441SEvalZero rt_uint32_t recvedEvent;
209*10465441SEvalZero /* waiting for OS event */
210*10465441SEvalZero rt_event_recv(&xMasterOsEvent,
211*10465441SEvalZero EV_MASTER_PROCESS_SUCESS | EV_MASTER_ERROR_RESPOND_TIMEOUT
212*10465441SEvalZero | EV_MASTER_ERROR_RECEIVE_DATA
213*10465441SEvalZero | EV_MASTER_ERROR_EXECUTE_FUNCTION,
214*10465441SEvalZero RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER,
215*10465441SEvalZero &recvedEvent);
216*10465441SEvalZero switch (recvedEvent)
217*10465441SEvalZero {
218*10465441SEvalZero case EV_MASTER_PROCESS_SUCESS:
219*10465441SEvalZero break;
220*10465441SEvalZero case EV_MASTER_ERROR_RESPOND_TIMEOUT:
221*10465441SEvalZero {
222*10465441SEvalZero eErrStatus = MB_MRE_TIMEDOUT;
223*10465441SEvalZero break;
224*10465441SEvalZero }
225*10465441SEvalZero case EV_MASTER_ERROR_RECEIVE_DATA:
226*10465441SEvalZero {
227*10465441SEvalZero eErrStatus = MB_MRE_REV_DATA;
228*10465441SEvalZero break;
229*10465441SEvalZero }
230*10465441SEvalZero case EV_MASTER_ERROR_EXECUTE_FUNCTION:
231*10465441SEvalZero {
232*10465441SEvalZero eErrStatus = MB_MRE_EXE_FUN;
233*10465441SEvalZero break;
234*10465441SEvalZero }
235*10465441SEvalZero }
236*10465441SEvalZero return eErrStatus;
237*10465441SEvalZero }
238*10465441SEvalZero
239*10465441SEvalZero #endif
240