1 /****************************************************************************
3 (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
4 www.systec-electronic.com
8 Description: source file for DLL Communication Abstraction Layer module in EPL user part
12 Redistribution and use in source and binary forms, with or without
13 modification, are permitted provided that the following conditions
16 1. Redistributions of source code must retain the above copyright
17 notice, this list of conditions and the following disclaimer.
19 2. Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in the
21 documentation and/or other materials provided with the distribution.
23 3. Neither the name of SYSTEC electronic GmbH nor the names of its
24 contributors may be used to endorse or promote products derived
25 from this software without prior written permission. For written
26 permission, please contact info@systec-electronic.com.
28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
31 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
32 COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
33 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
35 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
36 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
38 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 POSSIBILITY OF SUCH DAMAGE.
43 If a provision of this License is or becomes illegal, invalid or
44 unenforceable in any jurisdiction, that shall not affect:
45 1. the validity or enforceability in that jurisdiction of any other
46 provision of this License; or
47 2. the validity or enforceability in other jurisdictions of that or
48 any other provision of this License.
50 -------------------------------------------------------------------------
52 $RCSfile: EplDlluCal.c,v $
56 $Revision: 1.7 $ $Date: 2008/10/17 15:32:32 $
63 -------------------------------------------------------------------------
67 2006/06/20 d.k.: start of the implementation, version 1.00
69 ****************************************************************************/
71 #include "user/EplDlluCal.h"
72 #include "user/EplEventu.h"
74 #include "EplDllCal.h"
76 // include only if direct call between user- and kernelspace is enabled
77 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
78 #include "kernel/EplDllkCal.h"
82 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
84 /***************************************************************************/
87 /* G L O B A L D E F I N I T I O N S */
90 /***************************************************************************/
92 //---------------------------------------------------------------------------
94 //---------------------------------------------------------------------------
96 //---------------------------------------------------------------------------
98 //---------------------------------------------------------------------------
100 //---------------------------------------------------------------------------
101 // modul globale vars
102 //---------------------------------------------------------------------------
104 //---------------------------------------------------------------------------
105 // local function prototypes
106 //---------------------------------------------------------------------------
109 /***************************************************************************/
112 /* C L A S S EplDlluCal */
115 /***************************************************************************/
120 /***************************************************************************/
123 //=========================================================================//
125 // P R I V A T E D E F I N I T I O N S //
127 //=========================================================================//
129 //---------------------------------------------------------------------------
131 //---------------------------------------------------------------------------
133 //---------------------------------------------------------------------------
135 //---------------------------------------------------------------------------
139 tEplDlluCbAsnd m_apfnDlluCbAsnd[EPL_DLL_MAX_ASND_SERVICE_ID];
141 } tEplDlluCalInstance;
143 //---------------------------------------------------------------------------
145 //---------------------------------------------------------------------------
147 // if no dynamic memory allocation shall be used
148 // define structures statically
149 static tEplDlluCalInstance EplDlluCalInstance_g;
151 //---------------------------------------------------------------------------
152 // local function prototypes
153 //---------------------------------------------------------------------------
155 static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceId_p, tEplDllAsndFilter Filter_p);
157 //=========================================================================//
159 // P U B L I C F U N C T I O N S //
161 //=========================================================================//
163 //---------------------------------------------------------------------------
165 // Function: EplDlluCalAddInstance()
167 // Description: add and initialize new instance of DLL CAL module
171 // Returns: tEplKernel = error code
176 //---------------------------------------------------------------------------
178 tEplKernel EplDlluCalAddInstance()
180 tEplKernel Ret = kEplSuccessful;
182 // reset instance structure
183 EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof (EplDlluCalInstance_g));
188 //---------------------------------------------------------------------------
190 // Function: EplDlluCalDelInstance()
192 // Description: deletes an instance of DLL CAL module
196 // Returns: tEplKernel = error code
201 //---------------------------------------------------------------------------
203 tEplKernel EplDlluCalDelInstance()
205 tEplKernel Ret = kEplSuccessful;
207 // reset instance structure
208 EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof (EplDlluCalInstance_g));
214 //---------------------------------------------------------------------------
216 // Function: EplDlluCalProcess
218 // Description: process the passed asynch frame
220 // Parameters: pEvent_p = event containing frame to be processed
222 // Returns: tEplKernel = error code
227 //---------------------------------------------------------------------------
229 tEplKernel EplDlluCalProcess(tEplEvent * pEvent_p)
231 tEplKernel Ret = kEplSuccessful;
233 unsigned int uiAsndServiceId;
234 tEplFrameInfo FrameInfo;
236 if (pEvent_p->m_EventType == kEplEventTypeAsndRx)
238 FrameInfo.m_pFrame = (tEplFrame*) pEvent_p->m_pArg;
239 FrameInfo.m_uiFrameSize = pEvent_p->m_uiSize;
241 FrameInfo.m_NetTime = pEvent_p->m_NetTime;
243 MsgType = (tEplMsgType)AmiGetByteFromLe(&FrameInfo.m_pFrame->m_le_bMessageType);
244 if (MsgType != kEplMsgTypeAsnd)
246 Ret = kEplInvalidOperation;
250 uiAsndServiceId = (unsigned int) AmiGetByteFromLe(&FrameInfo.m_pFrame->m_Data.m_Asnd.m_le_bServiceId);
251 if (uiAsndServiceId < EPL_DLL_MAX_ASND_SERVICE_ID)
252 { // ASnd service ID is valid
253 if (EplDlluCalInstance_g.m_apfnDlluCbAsnd[uiAsndServiceId] != NULL)
254 { // handler was registered
255 Ret = EplDlluCalInstance_g.m_apfnDlluCbAsnd[uiAsndServiceId](&FrameInfo);
264 //---------------------------------------------------------------------------
266 // Function: EplDlluCalRegAsndService()
268 // Description: registers the specified handler for the specified
269 // AsndServiceId with the specified node ID filter.
271 // Parameters: ServiceId_p = ASnd Service ID
272 // pfnDlluCbAsnd_p = callback function
273 // Filter_p = node ID filter
275 // Returns: tEplKernel = error code
280 //---------------------------------------------------------------------------
282 tEplKernel EplDlluCalRegAsndService(tEplDllAsndServiceId ServiceId_p, tEplDlluCbAsnd pfnDlluCbAsnd_p, tEplDllAsndFilter Filter_p)
284 tEplKernel Ret = kEplSuccessful;
286 if (ServiceId_p < tabentries (EplDlluCalInstance_g.m_apfnDlluCbAsnd))
288 // memorize function pointer
289 EplDlluCalInstance_g.m_apfnDlluCbAsnd[ServiceId_p] = pfnDlluCbAsnd_p;
291 if (pfnDlluCbAsnd_p == NULL)
293 Filter_p = kEplDllAsndFilterNone;
296 // set filter in DLL module in kernel part
297 Ret = EplDlluCalSetAsndServiceIdFilter(ServiceId_p, Filter_p);
304 //---------------------------------------------------------------------------
306 // Function: EplDlluCalAsyncSend()
308 // Description: sends the frame with the specified priority.
310 // Parameters: pFrameInfo_p = frame
311 // m_uiFrameSize does not include the
312 // ethernet header (14 bytes)
313 // Priority_p = priority
315 // Returns: tEplKernel = error code
320 //---------------------------------------------------------------------------
322 tEplKernel EplDlluCalAsyncSend(tEplFrameInfo * pFrameInfo_p, tEplDllAsyncReqPriority Priority_p)
324 tEplKernel Ret = kEplSuccessful;
326 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
327 pFrameInfo_p->m_uiFrameSize += 14; // add size of ethernet header
328 Ret = EplDllkCalAsyncSend(pFrameInfo_p, Priority_p);
330 Ret = kEplSuccessful;
337 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
339 //---------------------------------------------------------------------------
341 // Function: EplDlluCalIssueRequest()
343 // Description: issues a StatusRequest or a IdentRequest to the specified node.
345 // Parameters: Service_p = request service ID
346 // uiNodeId_p = node ID
347 // bSoaFlag1_p = flag1 for this node (transmit in SoA and PReq)
348 // If 0xFF this flag is ignored.
350 // Returns: tEplKernel = error code
355 //---------------------------------------------------------------------------
357 tEplKernel EplDlluCalIssueRequest(tEplDllReqServiceId Service_p, unsigned int uiNodeId_p, BYTE bSoaFlag1_p)
359 tEplKernel Ret = kEplSuccessful;
361 // add node to appropriate request queue
364 case kEplDllReqServiceIdent:
365 case kEplDllReqServiceStatus:
368 tEplDllCalIssueRequest IssueReq;
370 Event.m_EventSink = kEplEventSinkDllkCal;
371 Event.m_EventType = kEplEventTypeDllkIssueReq;
372 IssueReq.m_Service = Service_p;
373 IssueReq.m_uiNodeId = uiNodeId_p;
374 IssueReq.m_bSoaFlag1 = bSoaFlag1_p;
375 Event.m_pArg = &IssueReq;
376 Event.m_uiSize = sizeof (IssueReq);
378 Ret = EplEventuPost(&Event);
384 Ret = kEplDllInvalidParam;
394 //---------------------------------------------------------------------------
396 // Function: EplDlluCalAddNode()
398 // Description: adds the specified node to the isochronous phase.
400 // Parameters: pNodeInfo_p = pointer of node info structure
402 // Returns: tEplKernel = error code
407 //---------------------------------------------------------------------------
409 tEplKernel EplDlluCalAddNode(tEplDllNodeInfo * pNodeInfo_p)
411 tEplKernel Ret = kEplSuccessful;
414 Event.m_EventSink = kEplEventSinkDllkCal;
415 Event.m_EventType = kEplEventTypeDllkAddNode;
416 Event.m_pArg = pNodeInfo_p;
417 Event.m_uiSize = sizeof (tEplDllNodeInfo);
419 Ret = EplEventuPost(&Event);
425 //---------------------------------------------------------------------------
427 // Function: EplDlluCalDeleteNode()
429 // Description: removes the specified node from the isochronous phase.
431 // Parameters: uiNodeId_p = node ID
433 // Returns: tEplKernel = error code
438 //---------------------------------------------------------------------------
440 tEplKernel EplDlluCalDeleteNode(unsigned int uiNodeId_p)
442 tEplKernel Ret = kEplSuccessful;
445 Event.m_EventSink = kEplEventSinkDllkCal;
446 Event.m_EventType = kEplEventTypeDllkDelNode;
447 Event.m_pArg = &uiNodeId_p;
448 Event.m_uiSize = sizeof (uiNodeId_p);
450 Ret = EplEventuPost(&Event);
456 //---------------------------------------------------------------------------
458 // Function: EplDlluCalSoftDeleteNode()
460 // Description: removes the specified node softly from the isochronous phase.
462 // Parameters: uiNodeId_p = node ID
464 // Returns: tEplKernel = error code
469 //---------------------------------------------------------------------------
471 tEplKernel EplDlluCalSoftDeleteNode(unsigned int uiNodeId_p)
473 tEplKernel Ret = kEplSuccessful;
476 Event.m_EventSink = kEplEventSinkDllkCal;
477 Event.m_EventType = kEplEventTypeDllkSoftDelNode;
478 Event.m_pArg = &uiNodeId_p;
479 Event.m_uiSize = sizeof (uiNodeId_p);
481 Ret = EplEventuPost(&Event);
487 #endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
490 //=========================================================================//
492 // P R I V A T E F U N C T I O N S //
494 //=========================================================================//
496 //---------------------------------------------------------------------------
498 // Function: EplDlluCalSetAsndServiceIdFilter()
500 // Description: forwards call to EplDllkSetAsndServiceIdFilter() in kernel part
502 // Parameters: ServiceId_p = ASnd Service ID
503 // Filter_p = node ID filter
505 // Returns: tEplKernel = error code
510 //---------------------------------------------------------------------------
512 static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceId_p, tEplDllAsndFilter Filter_p)
514 tEplKernel Ret = kEplSuccessful;
516 tEplDllCalAsndServiceIdFilter ServFilter;
518 Event.m_EventSink = kEplEventSinkDllkCal;
519 Event.m_EventType = kEplEventTypeDllkServFilter;
520 ServFilter.m_ServiceId = ServiceId_p;
521 ServFilter.m_Filter = Filter_p;
522 Event.m_pArg = &ServFilter;
523 Event.m_uiSize = sizeof (ServFilter);
525 Ret = EplEventuPost(&Event);
531 #endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)