30 const indextable *TPDO_com = d->objdict + d->firstIndex->PDO_TRS + numPdo;
31 const indextable *TPDO_map = d->objdict + d->firstIndex->PDO_TRS_MAP + numPdo;
35 const UNS8 *pMappingCount = (
UNS8 *) TPDO_map->pSubindex[0].pObject;
37 pdo->
cob_id = UNS16_LE(*(
UNS32*)TPDO_com->pSubindex[1].pObject & 0x7FF);
38 pdo->
rtr = NOT_A_REQUEST;
40 MSG_WAR (0x3009,
" PDO CobId is : ",
41 *(
UNS32 *) TPDO_com->pSubindex[1].pObject);
42 MSG_WAR (0x300D,
" Number of objects mapped : ", *pMappingCount);
47 UNS8 tmp[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
50 UNS32 *pMappingParameter =
51 (
UNS32 *) TPDO_map->pSubindex[prp_j + 1].pObject;
52 UNS16 index = (
UNS16) ((*pMappingParameter) >> 16);
56 if (Size && ((offset + Size) <= 64))
58 UNS32 ByteSize = 1 + ((Size - 1) >> 3);
60 (
UNS8) (((*pMappingParameter) >> (
UNS8) 8) & (
UNS32) 0x000000FF);
62 MSG_WAR (0x300F,
" got mapping parameter : ", *pMappingParameter);
63 MSG_WAR (0x3050,
" at index : ", TPDO_map->index);
64 MSG_WAR (0x3051,
" sub-index : ", prp_j + 1);
66 if (getODentry (d, index, subIndex, tmp, &ByteSize, &dataType, 0) !=
70 " Couldn't find mapped variable at index-subindex-size : ",
71 (
UNS16) (*pMappingParameter));
76 (
UNS8 *) & pdo->
data[offset >> 3], offset % 8, 0);
82 while (prp_j < *pMappingCount);
84 pdo->
len = 1 + ((offset - 1) >> 3);
86 MSG_WAR (0x3015,
" End scan mapped variable", 0);
148 UNS8 *pMappingCount = NULL;
153 UNS32 *pMappingParameter = NULL;
154 UNS8 *pTransmissionType = NULL;
156 UNS32 *pwCobId = NULL;
166 MSG_WAR (0x3935,
"proceedPDO, cobID : ", (UNS16_LE(m->
cob_id) & 0x7ff));
170 if ((*m).rtr == NOT_A_REQUEST)
174 offsetObjdict = d->firstIndex->PDO_RCV;
175 lastIndex = d->lastIndex->PDO_RCV;
179 while (offsetObjdict <= lastIndex)
189 d->objdict[offsetObjdict].pSubindex[1].pObject;
193 if (*pwCobId == UNS16_LE(m->
cob_id))
197 MSG_WAR (0x3936,
"cobId found at index ",
214 offsetObjdict = d->firstIndex->PDO_RCV_MAP;
215 lastIndex = d->lastIndex->PDO_RCV_MAP;
217 (
UNS8 *) (d->objdict + offsetObjdict +
218 numPdo)->pSubindex[0].pObject;
220 while (numMap < *pMappingCount)
222 UNS8 tmp[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
225 (
UNS32 *) (d->objdict + offsetObjdict +
226 numPdo)->pSubindex[numMap + 1].pObject;
227 if (pMappingParameter == NULL)
229 MSG_ERR (0x1937,
"Couldn't get mapping parameter : ",
240 Size = (
UNS8) (*pMappingParameter & (
UNS32) 0x000000FF);
244 if (Size && ((offset + Size) <= (m->
len << 3)))
248 offset % 8, 0, ((
UNS8 *) tmp), 0, 0);
250 ByteSize = (
UNS32)(1 + ((Size - 1) >> 3));
253 setODentry (d, (
UNS16) ((*pMappingParameter) >> 16),
254 (
UNS8) (((*pMappingParameter) >> 8) &
255 0xFF), tmp, &ByteSize, 0);
260 "error accessing to the mapped var : ",
262 MSG_WAR (0x2939,
" Mapped at index : ",
263 (*pMappingParameter) >> 16);
264 MSG_WAR (0x2940,
" subindex : ",
265 ((*pMappingParameter) >> 8) & 0xFF);
270 "Variable updated by PDO cobid : ",
272 MSG_WAR (0x3943,
" Mapped at index : ",
273 (*pMappingParameter) >> 16);
274 MSG_WAR (0x3944,
" subindex : ",
275 ((*pMappingParameter) >> 8) & 0xFF);
288 MSG_WAR (0x3946,
"Receive a PDO request cobId : ", UNS16_LE(m->
cob_id));
290 offsetObjdict = d->firstIndex->PDO_TRS;
291 lastIndex = d->lastIndex->PDO_TRS;
293 while (offsetObjdict <= lastIndex)
305 offsetObjdict)->pSubindex[1].pObject;
306 if (*pwCobId == UNS16_LE(m->
cob_id))
322 (
UNS8 *) d->objdict[offsetObjdict].pSubindex[2].pObject;
324 if ((*pTransmissionType == TRANS_RTR))
330 else if ((*pTransmissionType == TRANS_RTR_SYNC))
332 if (d->PDO_status[numPdo].
333 transmit_type_parameter & PDO_RTR_SYNC_READY)
336 canSend (d->canHandle,
337 &d->PDO_status[numPdo].last_message);
345 "Not ready RTR_SYNC TPDO send current data : ",
351 else if ((*pTransmissionType == TRANS_EVENT_PROFILE) ||
352 (*pTransmissionType == TRANS_EVENT_SPECIFIC))
355 d->PDO_status[numPdo].event_timer =
356 DelAlarm (d->PDO_status[numPdo].event_timer);
357 d->PDO_status[numPdo].inhibit_timer =
358 DelAlarm (d->PDO_status[numPdo].inhibit_timer);
359 d->PDO_status[numPdo].transmit_type_parameter &=
370 MSG_WAR (0x2947,
"PDO is not to send on request : ",
380 MSG_ERR (0x1948,
" Couldn't build TPDO n�", numPdo);
383 canSend (d->canHandle, &pdo);
405 UNS8 SrcBigEndian,
UNS8 * DestByteIndex,
UNS8 DestBitIndex,
414 INTEGER8 Vect = DestBitIndex - SrcBitIndex;
418 Vect > 0 ? *SrcByteIndex << Vect : *SrcByteIndex >> -Vect;
421 UNS8 BoudaryLimit = (Vect > 0 ? 8 - DestBitIndex : 8 - SrcBitIndex);
422 UNS8 BitsToCopy = BoudaryLimit > NbBits ? NbBits : BoudaryLimit;
426 ((0xff << (DestBitIndex + BitsToCopy)) |
427 (0xff >> (8 - DestBitIndex)));
430 UNS8 Filtered = Aligned & ~Mask;
433 *DestByteIndex &= Mask;
436 *DestByteIndex |= Filtered;
439 if ((SrcBitIndex += BitsToCopy) > 7)
442 SrcByteIndex += (SrcBigEndian ? -1 : 1);
447 if ((DestBitIndex += BitsToCopy) > 7)
450 DestByteIndex += (DestBigEndian ? -1 : 1);
454 NbBits -= BitsToCopy;
515 UNS8 *pTransmissionType = NULL;
516 UNS8 status = state3;
517 UNS16 offsetObjdict = d->firstIndex->PDO_TRS;
518 UNS16 offsetObjdictMap = d->firstIndex->PDO_TRS_MAP;
519 UNS16 lastIndex = d->lastIndex->PDO_TRS;
525 memset(&pdo, 0,
sizeof(pdo));
526 while (offsetObjdict <= lastIndex)
535 *(
UNS32 *) d->objdict[offsetObjdict].pSubindex[1].
536 pObject & 0x80000000)
538 MSG_WAR (0x3960,
"Not a valid PDO ", 0x1800 + pdoNum);
545 (
UNS8 *) d->objdict[offsetObjdict].pSubindex[2].pObject;
546 MSG_WAR (0x3962,
"Reading PDO at index : ", 0x1800 + pdoNum);
551 (*pTransmissionType >= TRANS_SYNC_MIN) &&
552 (*pTransmissionType <= TRANS_SYNC_MAX) &&
553 (++d->PDO_status[pdoNum].transmit_type_parameter ==
557 d->PDO_status[pdoNum].transmit_type_parameter = 0;
558 MSG_WAR (0x3964,
" PDO is on SYNCHRO. Trans type : ",
560 memset(&pdo, 0,
sizeof(pdo));
567 MSG_ERR (0x1906,
" Couldn't build TPDO number : ",
576 else if (isSyncEvent && (*pTransmissionType == TRANS_RTR_SYNC))
579 (d, pdoNum, &d->PDO_status[pdoNum].last_message))
581 MSG_ERR (0x1966,
" Couldn't build TPDO number : ",
583 d->PDO_status[pdoNum].transmit_type_parameter &=
588 d->PDO_status[pdoNum].transmit_type_parameter |=
597 && (*pTransmissionType == TRANS_SYNC_ACYCLIC))
599 ((*pTransmissionType == TRANS_EVENT_PROFILE
600 || *pTransmissionType == TRANS_EVENT_SPECIFIC)
601 && !(d->PDO_status[pdoNum].
602 transmit_type_parameter & PDO_INHIBITED)))
604 MSG_WAR (0x3968,
" PDO is on EVENT. Trans type : ",
606 memset(&pdo, 0,
sizeof(pdo));
613 MSG_ERR (0x3907,
" Couldn't build TPDO number : ",
620 if (d->PDO_status[pdoNum].last_message.
cob_id == pdo.
cob_id
621 && d->PDO_status[pdoNum].last_message.
len == pdo.
len
622 && memcmp(d->PDO_status[pdoNum].last_message.
data,
633 TIMEVAL EventTimerDuration;
634 TIMEVAL InhibitTimerDuration;
636 MSG_WAR (0x306A,
"Changes TPDO number : ", pdoNum);
639 *(
UNS16 *) d->objdict[offsetObjdict].pSubindex[5].
641 InhibitTimerDuration =
642 *(
UNS16 *) d->objdict[offsetObjdict].pSubindex[3].
648 if (EventTimerDuration)
650 DelAlarm (d->PDO_status[pdoNum].event_timer);
651 d->PDO_status[pdoNum].event_timer =
653 MS_TO_TIMEVAL (EventTimerDuration), 0);
656 if (InhibitTimerDuration)
658 DelAlarm (d->PDO_status[pdoNum].inhibit_timer);
659 d->PDO_status[pdoNum].inhibit_timer =
661 US_TO_TIMEVAL (InhibitTimerDuration *
664 d->PDO_status[pdoNum].transmit_type_parameter |=
673 " PDO is not on EVENT or synchro or not at this SYNC. Trans type : ",
681 d->PDO_status[pdoNum].last_message = pdo;
685 canSend (d->canHandle, &pdo);
692 MSG_WAR (0x3970,
"next pdo index : ", pdoNum);
697 MSG_ERR (0x1972,
"Unknown state has been reached : %d", status);
720 if (d->CurrentCommunicationState.csPDO)
727 const indextable *TPDO_com = d->objdict + d->firstIndex->PDO_TRS;
728 UNS8 numPdo = OD_entry - TPDO_com;
731 d->PDO_status[numPdo].event_timer =
732 DelAlarm (d->PDO_status[numPdo].event_timer);
733 d->PDO_status[numPdo].inhibit_timer =
734 DelAlarm (d->PDO_status[numPdo].inhibit_timer);
735 d->PDO_status[numPdo].transmit_type_parameter = 0;
794 UNS16 offsetObjdict = d->firstIndex->PDO_TRS;
795 UNS16 lastIndex = d->lastIndex->PDO_TRS;
797 while (offsetObjdict <= lastIndex)
800 d->PDO_status[pdoNum].event_timer =
801 DelAlarm (d->PDO_status[pdoNum].event_timer);
802 d->PDO_status[pdoNum].inhibit_timer =
803 DelAlarm (d->PDO_status[pdoNum].inhibit_timer);
805 d->PDO_status[pdoNum].transmit_type_parameter = 0;
806 d->PDO_status[pdoNum].last_message.
cob_id = 0;
void CopyBits(UNS8 NbBits, UNS8 *SrcByteIndex, UNS8 SrcBitIndex, UNS8 SrcBigEndian, UNS8 *DestByteIndex, UNS8 DestBitIndex, UNS8 DestBigEndian)
copy bit per bit in little endian
TIMER_HANDLE SetAlarm(CO_Data *d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period)
Set an alarm to execute a callback function when expired.
const indextable * scanIndexOD(CO_Data *d, UNS16 wIndex, UNS32 *errorCode, ODCallback_t **Callback)
Scan the index of object dictionary. Used only by setODentry and getODentry.