1 /****************************************************************************
2
3 (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
4 www.systec-electronic.com
5
6 Project: openPOWERLINK
7
8 Description: source file for kernel PDO module
9
10 License:
11
12 Redistribution and use in source and binary forms, with or without
13 modification, are permitted provided that the following conditions
14 are met:
15
16 1. Redistributions of source code must retain the above copyright
17 notice, this list of conditions and the following disclaimer.
18
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.
22
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.
27
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.
40
41 Severability Clause:
42
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.
49
50 -------------------------------------------------------------------------
51
52 $RCSfile: EplPdok.c,v $
53
54 $Author: D.Krueger $
55
56 $Revision: 1.8 $ $Date: 2008/10/17 15:32:32 $
57
58 $State: Exp $
59
60 Build Environment:
61 GCC V3.4
62
63 -------------------------------------------------------------------------
64
65 Revision History:
66
67 2006/05/22 d.k.: start of the implementation, version 1.00
68
69 ****************************************************************************/
70
71 #include "kernel/EplPdok.h"
72 #include "kernel/EplPdokCal.h"
73 #include "kernel/EplEventk.h"
74 #include "kernel/EplObdk.h"
75
76 #if (DEV_SYSTEM == _DEV_GNU_CF548X_)
77 #include "plccore.h"
78 #define PDO_LED 0x08
79 #endif
80
81 #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
82
83 #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) == 0)
84
85 #error 'ERROR: Missing DLLk-Modul!'
86
87 #endif
88
89 #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) == 0)
90
91 #error 'ERROR: Missing OBDk-Modul!'
92
93 #endif
94 /***************************************************************************/
95 /* */
96 /* */
97 /* G L O B A L D E F I N I T I O N S */
98 /* */
99 /* */
100 /***************************************************************************/
101
102 //---------------------------------------------------------------------------
103 // const defines
104 //---------------------------------------------------------------------------
105
106 #define EPL_PDOK_OBD_IDX_RX_COMM_PARAM 0x1400
107 #define EPL_PDOK_OBD_IDX_RX_MAPP_PARAM 0x1600
108 #define EPL_PDOK_OBD_IDX_TX_COMM_PARAM 0x1800
109 #define EPL_PDOK_OBD_IDX_TX_MAPP_PARAM 0x1A00
110
111 //---------------------------------------------------------------------------
112 // local types
113 //---------------------------------------------------------------------------
114
115 //---------------------------------------------------------------------------
116 // modul globale vars
117 //---------------------------------------------------------------------------
118
119 //---------------------------------------------------------------------------
120 // local function prototypes
121 //---------------------------------------------------------------------------
122
123 /***************************************************************************/
124 /* */
125 /* */
126 /* C L A S S EplPdok */
127 /* */
128 /* */
129 /***************************************************************************/
130 //
131 // Description:
132 //
133 //
134 /***************************************************************************/
135
136 //=========================================================================//
137 // //
138 // P R I V A T E D E F I N I T I O N S //
139 // //
140 //=========================================================================//
141
142 //---------------------------------------------------------------------------
143 // const defines
144 //---------------------------------------------------------------------------
145
146 //---------------------------------------------------------------------------
147 // local types
148 //---------------------------------------------------------------------------
149
150 //---------------------------------------------------------------------------
151 // local vars
152 //---------------------------------------------------------------------------
153
154 //---------------------------------------------------------------------------
155 // local function prototypes
156 //---------------------------------------------------------------------------
157
158 //=========================================================================//
159 // //
160 // P U B L I C F U N C T I O N S //
161 // //
162 //=========================================================================//
163
164 //---------------------------------------------------------------------------
165 //
166 // Function: EplPdokAddInstance()
167 //
168 // Description: add and initialize new instance of EPL stack
169 //
170 // Parameters: none
171 //
172 // Returns: tEplKernel = error code
173 //
174 //
175 // State:
176 //
177 //---------------------------------------------------------------------------
178
EplPdokAddInstance(void)179 tEplKernel EplPdokAddInstance(void)
180 {
181
182 return kEplSuccessful;
183 }
184
185 //---------------------------------------------------------------------------
186 //
187 // Function: EplPdokDelInstance()
188 //
189 // Description: deletes an instance of EPL stack
190 //
191 // Parameters: none
192 //
193 // Returns: tEplKernel = error code
194 //
195 //
196 // State:
197 //
198 //---------------------------------------------------------------------------
199
EplPdokDelInstance(void)200 tEplKernel EplPdokDelInstance(void)
201 {
202
203 return kEplSuccessful;
204 }
205
206 //---------------------------------------------------------------------------
207 //
208 // Function: EplPdokCbPdoReceived
209 //
210 // Description: This function is called by DLL if PRes or PReq frame was
211 // received. It posts the frame to the event queue.
212 // It is called in states NMT_CS_READY_TO_OPERATE and NMT_CS_OPERATIONAL.
213 // The passed PDO needs not to be valid.
214 //
215 // Parameters: pFrameInfo_p = pointer to frame info structure
216 //
217 // Returns: tEplKernel = error code
218 //
219 //
220 // State:
221 //
222 //---------------------------------------------------------------------------
223
EplPdokCbPdoReceived(tEplFrameInfo * pFrameInfo_p)224 tEplKernel EplPdokCbPdoReceived(tEplFrameInfo * pFrameInfo_p)
225 {
226 tEplKernel Ret = kEplSuccessful;
227 tEplEvent Event;
228
229 #if (DEV_SYSTEM == _DEV_GNU_CF548X_)
230 // reset LED
231 // MCF_GPIO_PODR_PCIBG &= ~PDO_LED; // Level
232 #endif
233
234 Event.m_EventSink = kEplEventSinkPdok;
235 Event.m_EventType = kEplEventTypePdoRx;
236 // limit copied data to size of PDO (because from some CNs the frame is larger than necessary)
237 Event.m_uiSize = AmiGetWordFromLe(&pFrameInfo_p->m_pFrame->m_Data.m_Pres.m_le_wSize) + 24; // pFrameInfo_p->m_uiFrameSize;
238 Event.m_pArg = pFrameInfo_p->m_pFrame;
239 Ret = EplEventkPost(&Event);
240
241 #if (DEV_SYSTEM == _DEV_GNU_CF548X_)
242 // set LED
243 // MCF_GPIO_PODR_PCIBG |= PDO_LED; // Level
244 #endif
245
246 return Ret;
247 }
248
249 //---------------------------------------------------------------------------
250 //
251 // Function: EplPdokCbPdoTransmitted
252 //
253 // Description: This function is called by DLL if PRes or PReq frame was
254 // sent. It posts the pointer to the frame to the event queue.
255 // It is called in NMT_CS_PRE_OPERATIONAL_2,
256 // NMT_CS_READY_TO_OPERATE and NMT_CS_OPERATIONAL.
257 //
258 // Parameters: pFrameInfo_p = pointer to frame info structure
259 //
260 // Returns: tEplKernel = error code
261 //
262 //
263 // State:
264 //
265 //---------------------------------------------------------------------------
266
EplPdokCbPdoTransmitted(tEplFrameInfo * pFrameInfo_p)267 tEplKernel EplPdokCbPdoTransmitted(tEplFrameInfo * pFrameInfo_p)
268 {
269 tEplKernel Ret = kEplSuccessful;
270 tEplEvent Event;
271
272 #if (DEV_SYSTEM == _DEV_GNU_CF548X_)
273 // reset LED
274 MCF_GPIO_PODR_PCIBG &= ~PDO_LED; // Level
275 #endif
276
277 Event.m_EventSink = kEplEventSinkPdok;
278 Event.m_EventType = kEplEventTypePdoTx;
279 Event.m_uiSize = sizeof(tEplFrameInfo);
280 Event.m_pArg = pFrameInfo_p;
281 Ret = EplEventkPost(&Event);
282
283 #if (DEV_SYSTEM == _DEV_GNU_CF548X_)
284 // set LED
285 MCF_GPIO_PODR_PCIBG |= PDO_LED; // Level
286 #endif
287
288 return Ret;
289 }
290
291 //---------------------------------------------------------------------------
292 //
293 // Function: EplPdokCbSoa
294 //
295 // Description: This function is called by DLL if SoA frame was
296 // received resp. sent. It posts this event to the event queue.
297 //
298 // Parameters: pFrameInfo_p = pointer to frame info structure
299 //
300 // Returns: tEplKernel = error code
301 //
302 //
303 // State:
304 //
305 //---------------------------------------------------------------------------
306
EplPdokCbSoa(tEplFrameInfo * pFrameInfo_p)307 tEplKernel EplPdokCbSoa(tEplFrameInfo * pFrameInfo_p)
308 {
309 tEplKernel Ret = kEplSuccessful;
310 tEplEvent Event;
311
312 Event.m_EventSink = kEplEventSinkPdok;
313 Event.m_EventType = kEplEventTypePdoSoa;
314 Event.m_uiSize = 0;
315 Event.m_pArg = NULL;
316 Ret = EplEventkPost(&Event);
317
318 return Ret;
319 }
320
321 //---------------------------------------------------------------------------
322 //
323 // Function: EplPdokProcess
324 //
325 // Description: This function processes all received and transmitted PDOs.
326 // This function must not be interrupted by any other task
327 // except ISRs (like the ethernet driver ISR, which may call
328 // EplPdokCbFrameReceived() or EplPdokCbFrameTransmitted()).
329 //
330 // Parameters: pEvent_p = pointer to event structure
331 //
332 // Returns: tEplKernel = error code
333 //
334 //
335 // State:
336 //
337 //---------------------------------------------------------------------------
338
EplPdokProcess(tEplEvent * pEvent_p)339 tEplKernel EplPdokProcess(tEplEvent * pEvent_p)
340 {
341 tEplKernel Ret = kEplSuccessful;
342 WORD wPdoSize;
343 WORD wBitOffset;
344 WORD wBitSize;
345 WORD wVarSize;
346 QWORD qwObjectMapping;
347 BYTE bMappSubindex;
348 BYTE bObdSubindex;
349 WORD wObdMappIndex;
350 WORD wObdCommIndex;
351 WORD wPdoId;
352 BYTE bObdData;
353 BYTE bObjectCount;
354 BYTE bFrameData;
355 BOOL fValid;
356 tEplObdSize ObdSize;
357 tEplFrame *pFrame;
358 tEplFrameInfo *pFrameInfo;
359 unsigned int uiNodeId;
360 tEplMsgType MsgType;
361
362 // 0xFF=invalid, RPDO: 0x00=PReq, localNodeId=PRes, remoteNodeId=PRes
363 // TPDO: 0x00=PRes, MN: CnNodeId=PReq
364
365 switch (pEvent_p->m_EventType) {
366 case kEplEventTypePdoRx: // RPDO received
367 pFrame = (tEplFrame *) pEvent_p->m_pArg;
368
369 // check if received RPDO is valid
370 bFrameData =
371 AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
372 if ((bFrameData & EPL_FRAME_FLAG1_RD) == 0) { // RPDO invalid
373 goto Exit;
374 }
375 // retrieve EPL message type
376 MsgType = AmiGetByteFromLe(&pFrame->m_le_bMessageType);
377 if (MsgType == kEplMsgTypePreq) { // RPDO is PReq frame
378 uiNodeId = EPL_PDO_PREQ_NODE_ID; // 0x00
379 } else { // RPDO is PRes frame
380 // retrieve node ID
381 uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
382 }
383
384 // search for appropriate valid RPDO in OD
385 wObdMappIndex = EPL_PDOK_OBD_IDX_RX_MAPP_PARAM;
386 for (wObdCommIndex = EPL_PDOK_OBD_IDX_RX_COMM_PARAM;
387 wObdCommIndex < (EPL_PDOK_OBD_IDX_RX_COMM_PARAM + 0x00FF);
388 wObdCommIndex++, wObdMappIndex++) {
389 ObdSize = 1;
390 // read node ID from OD
391 Ret =
392 EplObdReadEntry(wObdCommIndex, 0x01, &bObdData,
393 &ObdSize);
394 if ((Ret == kEplObdIndexNotExist)
395 || (Ret == kEplObdSubindexNotExist)
396 || (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
397 Ret = kEplSuccessful;
398 goto Exit;
399 } else if (Ret != kEplSuccessful) { // other fatal error occured
400 goto Exit;
401 }
402 // entry read successfully
403 if (bObdData != uiNodeId) { // node ID does not equal - wrong PDO, try next PDO in OD
404 continue;
405 }
406 ObdSize = 1;
407 // read number of mapped objects from OD; this indicates if the PDO is valid
408 Ret =
409 EplObdReadEntry(wObdMappIndex, 0x00, &bObjectCount,
410 &ObdSize);
411 if ((Ret == kEplObdIndexNotExist)
412 || (Ret == kEplObdSubindexNotExist)
413 || (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
414 Ret = kEplSuccessful;
415 goto Exit;
416 } else if (Ret != kEplSuccessful) { // other fatal error occured
417 goto Exit;
418 }
419 // entry read successfully
420 if (bObjectCount == 0) { // PDO in OD not valid, try next PDO in OD
421 continue;
422 }
423
424 ObdSize = 1;
425 // check PDO mapping version
426 Ret =
427 EplObdReadEntry(wObdCommIndex, 0x02, &bObdData,
428 &ObdSize);
429 if (Ret != kEplSuccessful) { // other fatal error occured
430 goto Exit;
431 }
432 // entry read successfully
433 // retrieve PDO version from frame
434 bFrameData =
435 AmiGetByteFromLe(&pFrame->m_Data.m_Pres.
436 m_le_bPdoVersion);
437 if ((bObdData & EPL_VERSION_MAIN) != (bFrameData & EPL_VERSION_MAIN)) { // PDO versions do not match
438 // $$$ raise PDO error
439 // termiate processing of this RPDO
440 goto Exit;
441 }
442 // valid RPDO found
443
444 // retrieve PDO size
445 wPdoSize =
446 AmiGetWordFromLe(&pFrame->m_Data.m_Pres.m_le_wSize);
447
448 // process mapping
449 for (bMappSubindex = 1; bMappSubindex <= bObjectCount;
450 bMappSubindex++) {
451 ObdSize = 8; // QWORD
452 // read object mapping from OD
453 Ret =
454 EplObdReadEntry(wObdMappIndex,
455 bMappSubindex,
456 &qwObjectMapping, &ObdSize);
457 if (Ret != kEplSuccessful) { // other fatal error occured
458 goto Exit;
459 }
460 // check if object mapping entry is valid, i.e. unequal zero, because "empty" entries are allowed
461 if (qwObjectMapping == 0) { // invalid entry, continue with next entry
462 continue;
463 }
464 // decode object mapping
465 wObdCommIndex =
466 (WORD) (qwObjectMapping &
467 0x000000000000FFFFLL);
468 bObdSubindex =
469 (BYTE) ((qwObjectMapping &
470 0x0000000000FF0000LL) >> 16);
471 wBitOffset =
472 (WORD) ((qwObjectMapping &
473 0x0000FFFF00000000LL) >> 32);
474 wBitSize =
475 (WORD) ((qwObjectMapping &
476 0xFFFF000000000000LL) >> 48);
477
478 // check if object exceeds PDO size
479 if (((wBitOffset + wBitSize) >> 3) > wPdoSize) { // wrong object mapping; PDO size is too low
480 // $$$ raise PDO error
481 // terminate processing of this RPDO
482 goto Exit;
483 }
484 // copy object from RPDO to process/OD variable
485 ObdSize = wBitSize >> 3;
486 Ret =
487 EplObdWriteEntryFromLe(wObdCommIndex,
488 bObdSubindex,
489 &pFrame->m_Data.
490 m_Pres.
491 m_le_abPayload[(wBitOffset >> 3)], ObdSize);
492 if (Ret != kEplSuccessful) { // other fatal error occured
493 goto Exit;
494 }
495
496 }
497
498 // processing finished successfully
499 goto Exit;
500 }
501 break;
502
503 case kEplEventTypePdoTx: // TPDO transmitted
504 pFrameInfo = (tEplFrameInfo *) pEvent_p->m_pArg;
505 pFrame = pFrameInfo->m_pFrame;
506
507 // set TPDO invalid, so that only fully processed TPDOs are sent as valid
508 bFrameData =
509 AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
510 AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bFlag1,
511 (bFrameData & ~EPL_FRAME_FLAG1_RD));
512
513 // retrieve EPL message type
514 MsgType = AmiGetByteFromLe(&pFrame->m_le_bMessageType);
515 if (MsgType == kEplMsgTypePres) { // TPDO is PRes frame
516 uiNodeId = EPL_PDO_PRES_NODE_ID; // 0x00
517 } else { // TPDO is PReq frame
518 // retrieve node ID
519 uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bDstNodeId);
520 }
521
522 // search for appropriate valid TPDO in OD
523 wObdMappIndex = EPL_PDOK_OBD_IDX_TX_MAPP_PARAM;
524 wObdCommIndex = EPL_PDOK_OBD_IDX_TX_COMM_PARAM;
525 for (wPdoId = 0;; wPdoId++, wObdCommIndex++, wObdMappIndex++) {
526 ObdSize = 1;
527 // read node ID from OD
528 Ret =
529 EplObdReadEntry(wObdCommIndex, 0x01, &bObdData,
530 &ObdSize);
531 if ((Ret == kEplObdIndexNotExist)
532 || (Ret == kEplObdSubindexNotExist)
533 || (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
534 Ret = kEplSuccessful;
535 goto Exit;
536 } else if (Ret != kEplSuccessful) { // other fatal error occured
537 goto Exit;
538 }
539 // entry read successfully
540 if (bObdData != uiNodeId) { // node ID does not equal - wrong PDO, try next PDO in OD
541 continue;
542 }
543 ObdSize = 1;
544 // read number of mapped objects from OD; this indicates if the PDO is valid
545 Ret =
546 EplObdReadEntry(wObdMappIndex, 0x00, &bObjectCount,
547 &ObdSize);
548 if ((Ret == kEplObdIndexNotExist)
549 || (Ret == kEplObdSubindexNotExist)
550 || (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
551 Ret = kEplSuccessful;
552 goto Exit;
553 } else if (Ret != kEplSuccessful) { // other fatal error occured
554 goto Exit;
555 }
556 // entry read successfully
557 if (bObjectCount == 0) { // PDO in OD not valid, try next PDO in OD
558 continue;
559 }
560 // valid TPDO found
561
562 ObdSize = 1;
563 // get PDO mapping version from OD
564 Ret =
565 EplObdReadEntry(wObdCommIndex, 0x02, &bObdData,
566 &ObdSize);
567 if (Ret != kEplSuccessful) { // other fatal error occured
568 goto Exit;
569 }
570 // entry read successfully
571 // set PDO version in frame
572 AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bPdoVersion,
573 bObdData);
574
575 // calculate PDO size
576 wPdoSize = 0;
577
578 // process mapping
579 for (bMappSubindex = 1; bMappSubindex <= bObjectCount;
580 bMappSubindex++) {
581 ObdSize = 8; // QWORD
582 // read object mapping from OD
583 Ret =
584 EplObdReadEntry(wObdMappIndex,
585 bMappSubindex,
586 &qwObjectMapping, &ObdSize);
587 if (Ret != kEplSuccessful) { // other fatal error occured
588 goto Exit;
589 }
590 // check if object mapping entry is valid, i.e. unequal zero, because "empty" entries are allowed
591 if (qwObjectMapping == 0) { // invalid entry, continue with next entry
592 continue;
593 }
594 // decode object mapping
595 wObdCommIndex =
596 (WORD) (qwObjectMapping &
597 0x000000000000FFFFLL);
598 bObdSubindex =
599 (BYTE) ((qwObjectMapping &
600 0x0000000000FF0000LL) >> 16);
601 wBitOffset =
602 (WORD) ((qwObjectMapping &
603 0x0000FFFF00000000LL) >> 32);
604 wBitSize =
605 (WORD) ((qwObjectMapping &
606 0xFFFF000000000000LL) >> 48);
607
608 // calculate max PDO size
609 ObdSize = wBitSize >> 3;
610 wVarSize = (wBitOffset >> 3) + (WORD) ObdSize;
611 if ((unsigned int)(wVarSize + 24) > pFrameInfo->m_uiFrameSize) { // TPDO is too short
612 // $$$ raise PDO error, set Ret
613 goto Exit;
614 }
615 if (wVarSize > wPdoSize) { // memorize new PDO size
616 wPdoSize = wVarSize;
617 }
618 // copy object from process/OD variable to TPDO
619 Ret =
620 EplObdReadEntryToLe(wObdCommIndex,
621 bObdSubindex,
622 &pFrame->m_Data.m_Pres.
623 m_le_abPayload[(wBitOffset >> 3)], &ObdSize);
624 if (Ret != kEplSuccessful) { // other fatal error occured
625 goto Exit;
626 }
627
628 }
629
630 // set PDO size in frame
631 AmiSetWordToLe(&pFrame->m_Data.m_Pres.m_le_wSize,
632 wPdoSize);
633
634 Ret = EplPdokCalAreTpdosValid(&fValid);
635 if (fValid != FALSE) {
636 // set TPDO valid
637 bFrameData =
638 AmiGetByteFromLe(&pFrame->m_Data.m_Pres.
639 m_le_bFlag1);
640 AmiSetByteToLe(&pFrame->m_Data.m_Pres.
641 m_le_bFlag1,
642 (bFrameData |
643 EPL_FRAME_FLAG1_RD));
644 }
645 // processing finished successfully
646
647 goto Exit;
648 }
649 break;
650
651 case kEplEventTypePdoSoa: // SoA received
652
653 // invalidate TPDOs
654 Ret = EplPdokCalSetTpdosValid(FALSE);
655 break;
656
657 default:
658 {
659 ASSERTMSG(FALSE,
660 "EplPdokProcess(): unhandled event type!\n");
661 }
662 }
663
664 Exit:
665 return Ret;
666 }
667
668 //=========================================================================//
669 // //
670 // P R I V A T E F U N C T I O N S //
671 // //
672 //=========================================================================//
673
674 //---------------------------------------------------------------------------
675 //
676 // Function:
677 //
678 // Description:
679 //
680 //
681 //
682 // Parameters:
683 //
684 //
685 // Returns:
686 //
687 //
688 // State:
689 //
690 //---------------------------------------------------------------------------
691
692 #endif // #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
693
694 // EOF
695