# HG changeset patch # User etisserant # Date 1183139499 -7200 # Node ID f812bf6b7237839369414eb449c88e4ea1939d7f # Parent 5a17bcb520efc909d7a795996d723110d8f36e78 Preliminary implementation of Event Timer and Inhibit Timer driven TPDO + re-organisation and cleanup of pdo.c. diff -r 5a17bcb520ef -r f812bf6b7237 examples/TestMasterMicroMod/TestMaster.c --- a/examples/TestMasterMicroMod/TestMaster.c Fri Jun 29 19:48:22 2007 +0200 +++ b/examples/TestMasterMicroMod/TestMaster.c Fri Jun 29 19:51:39 2007 +0200 @@ -310,11 +310,12 @@ return &TestMaster_objdict[i]; } -/* To count at which received SYNC a PDO must be sent. +/* + * To count at which received SYNC a PDO must be sent. * Even if no pdoTransmit are defined, at least one entry is computed * for compilations issues. */ -UNS8 TestMaster_count_sync[1] = {0,}; +s_PDO_status TestMaster_PDO_status[1] = {s_PDO_staus_Initializer}; quick_index TestMaster_firstIndex = { 0, /* SDO_SVR */ diff -r 5a17bcb520ef -r f812bf6b7237 examples/TestMasterSlave/TestMaster.c --- a/examples/TestMasterSlave/TestMaster.c Fri Jun 29 19:48:22 2007 +0200 +++ b/examples/TestMasterSlave/TestMaster.c Fri Jun 29 19:51:39 2007 +0200 @@ -382,11 +382,12 @@ return &TestMaster_objdict[i]; } -/* To count at which received SYNC a PDO must be sent. +/* + * To count at which received SYNC a PDO must be sent. * Even if no pdoTransmit are defined, at least one entry is computed * for compilations issues. */ -UNS8 TestMaster_count_sync[1] = {0,}; +s_PDO_status TestMaster_PDO_status[1] = {s_PDO_staus_Initializer}; quick_index TestMaster_firstIndex = { 0, /* SDO_SVR */ diff -r 5a17bcb520ef -r f812bf6b7237 examples/TestMasterSlave/TestMaster.h --- a/examples/TestMasterSlave/TestMaster.h Fri Jun 29 19:48:22 2007 +0200 +++ b/examples/TestMasterSlave/TestMaster.h Fri Jun 29 19:51:39 2007 +0200 @@ -1,6 +1,9 @@ /* File generated by gen_cfile.py. Should not be modified. */ +#ifndef TESTMASTER_H +#define TESTMASTER_H + #include "data.h" /* Prototypes of function provided by object dictionnary */ @@ -9,7 +12,6 @@ /* Master node data struct */ extern CO_Data TestMaster_Data; - extern UNS8 MasterMap1; /* Mapped at index 0x2000, subindex 0x00*/ extern UNS8 MasterMap2; /* Mapped at index 0x2001, subindex 0x00*/ extern UNS8 MasterMap3; /* Mapped at index 0x2002, subindex 0x00*/ @@ -21,3 +23,5 @@ extern UNS8 MasterMap9; /* Mapped at index 0x2008, subindex 0x00*/ extern UNS32 MasterMap10; /* Mapped at index 0x2009, subindex 0x00*/ extern UNS16 MasterMap11; /* Mapped at index 0x200A, subindex 0x00*/ + +#endif // TESTMASTER_H diff -r 5a17bcb520ef -r f812bf6b7237 examples/TestMasterSlave/TestSlave.c --- a/examples/TestMasterSlave/TestSlave.c Fri Jun 29 19:48:22 2007 +0200 +++ b/examples/TestMasterSlave/TestSlave.c Fri Jun 29 19:51:39 2007 +0200 @@ -17,6 +17,7 @@ UNS8 SlaveMap9 = 0x0; /* Mapped at index 0x2008, subindex 0x00 */ UNS32 SlaveMap10 = 0x0; /* Mapped at index 0x2009, subindex 0x00 */ UNS16 SlaveMap11 = 0x0; /* Mapped at index 0x200A, subindex 0x00 */ +INTEGER16 SlaveMap12 = 0x0; /* Mapped at index 0x200B, subindex 0x00 */ /**************************************************************************/ /* Declaration of the value range types */ @@ -207,6 +208,23 @@ { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1801_Event_Timer } }; +/* index 0x1802 : Transmit PDO 3 Parameter. */ + UNS8 TestSlave_highestSubIndex_obj1802 = 5; /* number of subindex - 1*/ + UNS32 TestSlave_obj1802_COB_ID_used_by_PDO = 0x380; /* 896 */ + UNS8 TestSlave_obj1802_Transmission_Type = 0xFF; /* 255 */ + UNS16 TestSlave_obj1802_Inhibit_Time = 0x1388; /* 5000 */ + UNS8 TestSlave_obj1802_Compatibility_Entry = 0x0; /* 0 */ + UNS16 TestSlave_obj1802_Event_Timer = 0x3E8; /* 1000 */ + subindex TestSlave_Index1802[] = + { + { RO, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1802 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1802_COB_ID_used_by_PDO }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1802_Transmission_Type }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1802_Inhibit_Time }, + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_obj1802_Compatibility_Entry }, + { RW, uint16, sizeof (UNS16), (void*)&TestSlave_obj1802_Event_Timer } + }; + /* index 0x1A00 : Transmit PDO 1 Mapping. */ UNS8 TestSlave_highestSubIndex_obj1A00 = 10; /* number of subindex - 1*/ UNS32 TestSlave_obj1A00[] = @@ -249,6 +267,18 @@ { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A01[0] } }; +/* index 0x1A02 : Transmit PDO 3 Mapping. */ + UNS8 TestSlave_highestSubIndex_obj1A02 = 1; /* number of subindex - 1*/ + UNS32 TestSlave_obj1A02[] = + { + 0x200B0010 /* 537591824 */ + }; + subindex TestSlave_Index1A02[] = + { + { RW, uint8, sizeof (UNS8), (void*)&TestSlave_highestSubIndex_obj1A02 }, + { RW, uint32, sizeof (UNS32), (void*)&TestSlave_obj1A02[0] } + }; + /* index 0x2000 : Mapped variable SlaveMap1 */ subindex TestSlave_Index2000[] = { @@ -315,6 +345,12 @@ { RW, uint16, sizeof (UNS16), (void*)&SlaveMap11 } }; +/* index 0x200B : Mapped variable SlaveMap12 */ + subindex TestSlave_Index200B[] = + { + { RW, int16, sizeof (INTEGER16), (void*)&SlaveMap12 } + }; + const indextable TestSlave_objdict[] = { { (subindex*)TestSlave_Index1000,sizeof(TestSlave_Index1000)/sizeof(TestSlave_Index1000[0]), 0x1000}, @@ -328,8 +364,10 @@ { (subindex*)TestSlave_Index1200,sizeof(TestSlave_Index1200)/sizeof(TestSlave_Index1200[0]), 0x1200}, { (subindex*)TestSlave_Index1800,sizeof(TestSlave_Index1800)/sizeof(TestSlave_Index1800[0]), 0x1800}, { (subindex*)TestSlave_Index1801,sizeof(TestSlave_Index1801)/sizeof(TestSlave_Index1801[0]), 0x1801}, + { (subindex*)TestSlave_Index1802,sizeof(TestSlave_Index1802)/sizeof(TestSlave_Index1802[0]), 0x1802}, { (subindex*)TestSlave_Index1A00,sizeof(TestSlave_Index1A00)/sizeof(TestSlave_Index1A00[0]), 0x1A00}, { (subindex*)TestSlave_Index1A01,sizeof(TestSlave_Index1A01)/sizeof(TestSlave_Index1A01[0]), 0x1A01}, + { (subindex*)TestSlave_Index1A02,sizeof(TestSlave_Index1A02)/sizeof(TestSlave_Index1A02[0]), 0x1A02}, { (subindex*)TestSlave_Index2000,sizeof(TestSlave_Index2000)/sizeof(TestSlave_Index2000[0]), 0x2000}, { (subindex*)TestSlave_Index2001,sizeof(TestSlave_Index2001)/sizeof(TestSlave_Index2001[0]), 0x2001}, { (subindex*)TestSlave_Index2002,sizeof(TestSlave_Index2002)/sizeof(TestSlave_Index2002[0]), 0x2002}, @@ -341,6 +379,7 @@ { (subindex*)TestSlave_Index2008,sizeof(TestSlave_Index2008)/sizeof(TestSlave_Index2008[0]), 0x2008}, { (subindex*)TestSlave_Index2009,sizeof(TestSlave_Index2009)/sizeof(TestSlave_Index2009[0]), 0x2009}, { (subindex*)TestSlave_Index200A,sizeof(TestSlave_Index200A)/sizeof(TestSlave_Index200A[0]), 0x200A}, + { (subindex*)TestSlave_Index200B,sizeof(TestSlave_Index200B)/sizeof(TestSlave_Index200B[0]), 0x200B}, }; const indextable * TestSlave_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks) @@ -359,19 +398,22 @@ case 0x1200: i = 8;break; case 0x1800: i = 9;break; case 0x1801: i = 10;break; - case 0x1A00: i = 11;break; - case 0x1A01: i = 12;break; - case 0x2000: i = 13;break; - case 0x2001: i = 14;break; - case 0x2002: i = 15;break; - case 0x2003: i = 16;break; - case 0x2004: i = 17;break; - case 0x2005: i = 18;break; - case 0x2006: i = 19;break; - case 0x2007: i = 20;break; - case 0x2008: i = 21;break; - case 0x2009: i = 22;break; - case 0x200A: i = 23;break; + case 0x1802: i = 11;break; + case 0x1A00: i = 12;break; + case 0x1A01: i = 13;break; + case 0x1A02: i = 14;break; + case 0x2000: i = 15;break; + case 0x2001: i = 16;break; + case 0x2002: i = 17;break; + case 0x2003: i = 18;break; + case 0x2004: i = 19;break; + case 0x2005: i = 20;break; + case 0x2006: i = 21;break; + case 0x2007: i = 22;break; + case 0x2008: i = 23;break; + case 0x2009: i = 24;break; + case 0x200A: i = 25;break; + case 0x200B: i = 26;break; default: *errorCode = OD_NO_SUCH_OBJECT; return NULL; @@ -380,11 +422,12 @@ return &TestSlave_objdict[i]; } -/* To count at which received SYNC a PDO must be sent. +/* + * To count at which received SYNC a PDO must be sent. * Even if no pdoTransmit are defined, at least one entry is computed * for compilations issues. */ -UNS8 TestSlave_count_sync[2] = {0,}; +s_PDO_status TestSlave_PDO_status[3] = {s_PDO_staus_Initializer,s_PDO_staus_Initializer,s_PDO_staus_Initializer}; quick_index TestSlave_firstIndex = { 8, /* SDO_SVR */ @@ -392,7 +435,7 @@ 0, /* PDO_RCV */ 0, /* PDO_RCV_MAP */ 9, /* PDO_TRS */ - 11 /* PDO_TRS_MAP */ + 12 /* PDO_TRS_MAP */ }; quick_index TestSlave_lastIndex = { @@ -400,8 +443,8 @@ 0, /* SDO_CLT */ 0, /* PDO_RCV */ 0, /* PDO_RCV_MAP */ - 10, /* PDO_TRS */ - 12 /* PDO_TRS_MAP */ + 11, /* PDO_TRS */ + 14 /* PDO_TRS_MAP */ }; UNS16 TestSlave_ObjdictSize = sizeof(TestSlave_objdict)/sizeof(TestSlave_objdict[0]); diff -r 5a17bcb520ef -r f812bf6b7237 examples/TestMasterSlave/TestSlave.h --- a/examples/TestMasterSlave/TestSlave.h Fri Jun 29 19:48:22 2007 +0200 +++ b/examples/TestMasterSlave/TestSlave.h Fri Jun 29 19:51:39 2007 +0200 @@ -1,6 +1,9 @@ /* File generated by gen_cfile.py. Should not be modified. */ +#ifndef TESTSLAVE_H +#define TESTSLAVE_H + #include "data.h" /* Prototypes of function provided by object dictionnary */ @@ -9,7 +12,6 @@ /* Master node data struct */ extern CO_Data TestSlave_Data; - extern ODCallback_t Store_parameters_callbacks[]; /* Callbacks of index0x1010 */ extern ODCallback_t Restore_Default_Parameters_callbacks[]; /* Callbacks of index0x1011 */ extern UNS8 SlaveMap1; /* Mapped at index 0x2000, subindex 0x00*/ @@ -23,3 +25,6 @@ extern UNS8 SlaveMap9; /* Mapped at index 0x2008, subindex 0x00*/ extern UNS32 SlaveMap10; /* Mapped at index 0x2009, subindex 0x00*/ extern UNS16 SlaveMap11; /* Mapped at index 0x200A, subindex 0x00*/ +extern INTEGER16 SlaveMap12; /* Mapped at index 0x200B, subindex 0x00*/ + +#endif // TESTSLAVE_H diff -r 5a17bcb520ef -r f812bf6b7237 examples/TestMasterSlave/TestSlave.od --- a/examples/TestMasterSlave/TestSlave.od Fri Jun 29 19:48:22 2007 +0200 +++ b/examples/TestMasterSlave/TestSlave.od Fri Jun 29 19:51:39 2007 +0200 @@ -1,10 +1,10 @@ - - + + - + @@ -50,8 +50,22 @@ + + + + + + + + + + + + + + - + @@ -60,16 +74,22 @@ - - - - - + + + + + + + + + + + - + @@ -80,7 +100,7 @@ - + @@ -92,20 +112,20 @@ + + + + + + + + - - - - - - - - - + @@ -115,7 +135,7 @@ - + @@ -130,7 +150,7 @@ - + @@ -140,17 +160,17 @@ - + - + - + - + @@ -158,29 +178,11 @@ - - - - - - - - - - - - - - - - - - - + - + @@ -189,7 +191,7 @@ - + @@ -199,27 +201,77 @@ - - + + + + + + + + 5000*100 µC = 500 ms + + + + + + + + + + + + + + + + + + 1000 ms + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - + + + + + + + + + @@ -251,15 +303,15 @@ - - - - - - - - - + + + + + + + + + @@ -291,15 +343,15 @@ - - - - - - - - - + + + + + + + + + @@ -331,15 +383,15 @@ - - - - - - - - - + + + + + + + + + @@ -371,15 +423,15 @@ - - - - - - - - - + + + + + + + + + @@ -411,15 +463,15 @@ - - - - - - - - - + + + + + + + + + @@ -451,15 +503,15 @@ - - - - - - - - - + + + + + + + + + @@ -491,15 +543,15 @@ - - - - - - - - - + + + + + + + + + @@ -531,15 +583,15 @@ - - - - - - - - - + + + + + + + + + @@ -571,15 +623,15 @@ - - - - - - - - - + + + + + + + + + @@ -611,15 +663,15 @@ - - - - - - - - - + + + + + + + + + @@ -649,8 +701,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + SlaveMap12 + + + + + + + SlaveMap12 + + + + + + + - + diff -r 5a17bcb520ef -r f812bf6b7237 include/can.h --- a/include/can.h Fri Jun 29 19:48:22 2007 +0200 +++ b/include/can.h Fri Jun 29 19:51:39 2007 +0200 @@ -46,6 +46,7 @@ UNS8 data[8]; /* data */ } Message; +#define Message_Initializer {0,0,0,{0,0,0,0,0,0,0,0}} typedef UNS8 (*canSend_t)(Message *); diff -r 5a17bcb520ef -r f812bf6b7237 include/data.h --- a/include/data.h Fri Jun 29 19:48:22 2007 +0200 +++ b/include/data.h Fri Jun 29 19:51:39 2007 +0200 @@ -46,7 +46,7 @@ /* Object dictionary */ UNS8 *bDeviceNodeId; const indextable *objdict; - UNS8 *count_sync; + s_PDO_status *PDO_status; quick_index *firstIndex; quick_index *lastIndex; UNS16 *ObjdictSize; @@ -82,9 +82,6 @@ post_sync_t post_sync; post_TPDO_t post_TPDO; - /* PDO */ - s_process_var process_var; - /* General */ UNS8 toggle; CAN_HANDLE canHandle; @@ -121,7 +118,7 @@ /* Object dictionary*/\ & NODE_PREFIX ## _bDeviceNodeId, /* bDeviceNodeId */\ NODE_PREFIX ## _objdict, /* objdict */\ - NODE_PREFIX ## _count_sync, /* count_sync */\ + NODE_PREFIX ## _PDO_status, /* PDO_status */\ & NODE_PREFIX ## _firstIndex, /* firstIndex */\ & NODE_PREFIX ## _lastIndex, /* lastIndex */\ & NODE_PREFIX ## _ObjdictSize, /* ObjdictSize */\ @@ -168,12 +165,6 @@ _post_sync, /* post_sync */\ _post_TPDO, /* post_TPDO */\ \ - /* PDO, structure s_process_var */\ - {\ - 0, /* count */\ - {0} /* data (static use, so that all the table is initialize at 0)*/\ - },\ - \ /* General */\ 0, /* toggle */\ NULL, /* canSend */\ diff -r 5a17bcb520ef -r f812bf6b7237 include/def.h --- a/include/def.h Fri Jun 29 19:48:22 2007 +0200 +++ b/include/def.h Fri Jun 29 19:51:39 2007 +0200 @@ -62,9 +62,7 @@ #define TRUE 1 #define FALSE 0 -/* TODO: remove this limitation. do bit granularity mapping */ -#define PDO_MAX_LEN 8 - + /** Status of the SDO transmission */ #define SDO_RESET 0x0 /* Transmission not started. Init state. */ diff -r 5a17bcb520ef -r f812bf6b7237 include/objdictdef.h --- a/include/objdictdef.h Fri Jun 29 19:48:22 2007 +0200 +++ b/include/objdictdef.h Fri Jun 29 19:51:39 2007 +0200 @@ -67,18 +67,6 @@ */ - -/** definitions of the different types of PDOs' transmission - * - * SYNCHRO(n) means that the PDO will be transmited every n SYNC signal. - */ -#define TRANS_EVERY_N_SYNC(n) (n) /*n = 1 to 240 */ -#define TRANS_SYNC_MIN 1 /* Trans after reception of n SYNC. n = 1 to 240 */ -#define TRANS_SYNC_MAX 240 /* Trans after reception of n SYNC. n = 1 to 240 */ -#define TRANS_RTR_SYNC 252 /* Transmission on request */ -#define TRANS_RTR 253 /* Transmission on request */ -#define TRANS_EVENT 255 /* Transmission on event */ - /** Each entry of the object dictionary can be READONLY (RO), READ/WRITE (RW), * WRITE-ONLY (WO) */ diff -r 5a17bcb520ef -r f812bf6b7237 include/pdo.h --- a/include/pdo.h Fri Jun 29 19:48:22 2007 +0200 +++ b/include/pdo.h Fri Jun 29 19:51:39 2007 +0200 @@ -26,49 +26,46 @@ #include #include -/* The process_var structure - Used to store the PDO before the transmission or the reception. -*/ -typedef struct struct_s_process_var { - UNS8 count; /* Size of data. Ex : for a PDO of 6 bytes of data, count = 6 */ - /* WARNING s_process_var.data is subject to ENDIANISATION - * (with respect to CANOPEN_BIG_ENDIAN) - */ - UNS8 data[PDO_MAX_LEN]; -}s_process_var; +#include "can.h" + +typedef struct struct_s_PDO_status s_PDO_status; #include "data.h" +/* Status of the TPDO : */ +#define PDO_INHIBITED 0x01 + /** The PDO structure */ -typedef struct struct_s_PDO { - UNS32 cobId; /* COB-ID */ - UNS8 len; /* Number of data transmitted (in data[]) */ - UNS8 data[8]; /* Contain the data */ -}s_PDO; +struct struct_s_PDO_status { + UNS8 transmit_type_parameter; + TIMER_HANDLE event_timer; + TIMER_HANDLE inhibit_timer; + Message last_message; +}; -/** Transmit a PDO data frame on the bus bus_id - * pdo is a structure which contains the pdo to transmit - * bus_id is hardware dependant - * return canSend(bus_id,&m) or 0xFF if error - * request can take the value REQUEST or NOT_A_REQUEST +#define s_PDO_staus_Initializer {0, TIMER_NONE, TIMER_NONE, Message_Initializer} + +/** definitions of the different types of PDOs' transmission + * + * SYNCHRO(n) means that the PDO will be transmited every n SYNC signal. */ -UNS8 sendPDO (CO_Data* d, s_PDO pdo, UNS8 request); +#define TRANS_EVERY_N_SYNC(n) (n) /*n = 1 to 240 */ +#define TRANS_SYNC_MIN 1 /* Trans after reception of n SYNC. n = 1 to 240 */ +#define TRANS_SYNC_MAX 240 /* Trans after reception of n SYNC. n = 1 to 240 */ +#define TRANS_RTR_SYNC 252 /* Transmission on request */ +#define TRANS_RTR 253 /* Transmission on request */ +#define TRANS_EVENT_SPECIFIC 254 /* Transmission on event */ +#define TRANS_EVENT_PROFILE 255 /* Transmission on event */ -/** Prepare a PDO frame transmission, - * whose different parameters are stored in process_var table, - * to the slave. - * bus_id is hardware dependant - * call the function sendPDO - * return the result of the function sendPDO or 0xFF if error - */ -UNS8 PDOmGR (CO_Data* d, UNS32 cobId); - -/** Prepare the PDO defined at index to be sent by PDOmGR +/** Prepare the PDO defined at index to be sent + * + * + * * Copy all the data to transmit in process_var * *pwCobId : returns the value of the cobid. (subindex 1) * Return 0 or 0xFF if error. */ -UNS8 buildPDO (CO_Data* d, UNS16 index); +UNS8 buildPDO(CO_Data* d, UNS8 numPdo, Message *pdo); /** Transmit a PDO request frame on the bus bus_id * to the slave. @@ -83,16 +80,24 @@ */ UNS8 proceedPDO (CO_Data* d, Message *m); -/* used by the application to send a variable by PDO. - * Check in which PDO the variable is mapped, and send the PDO. - * of course, the others variables mapped in the PDO are also sent ! - * ( ie when a specific event occured) - * bus_id is hardware dependant - * variable is a pointer to the variable which has to be sent. Must be - * defined in the object dictionary - * return 0xFF if error, else return 0 +/** Used by the application to signal changes in process data + * that could be mapped to some TPDO. + * This do not necessarily imply PDO emission. + * Function iterates on all TPDO and look TPDO transmit + * type and content change before sending it. */ -UNS8 sendPDOevent (CO_Data* d, void * variable); +UNS8 sendPDOevent (CO_Data* d); + +/** Function iterates on all TPDO and look TPDO transmit + * type and content change before sending it. + */ +UNS8 _sendPDOevent(CO_Data* d, UNS8 isSyncEvent); + + +void PDOInit(CO_Data* d); +void PDOStop(CO_Data* d); +void PDOEventTimerAlarm(CO_Data* d, UNS32 pdoNum); +void PDOInhibitTimerAlarm(CO_Data* d, UNS32 pdoNum); /* copy bit per bit in little endian */ void CopyBits(UNS8 NbBits, UNS8* SrcByteIndex, UNS8 SrcBitIndex, UNS8 SrcBigEndian, UNS8* DestByteIndex, UNS8 DestBitIndex, UNS8 DestBigEndian); diff -r 5a17bcb520ef -r f812bf6b7237 include/sync.h --- a/include/sync.h Fri Jun 29 19:48:22 2007 +0200 +++ b/include/sync.h Fri Jun 29 19:51:39 2007 +0200 @@ -39,20 +39,11 @@ */ UNS8 sendSYNC (CO_Data* d, UNS32 cob_id); -/** This function is called when the node is receiving a SYNC - * message (cob-id = 0x80). - * What does the function : - * check if the node is in OERATIONAL mode. (other mode : return 0 but does nothing). - * Get the SYNC cobId by reading the dictionary index 1005. (Return -1 if it does not correspond - * to the cobId received). - * Scan the dictionary from index 0x1800 to the last PDO defined (dict_cstes.max_count_of_PDO_transmit) - * for each PDO whose transmission type is on synchro (transmission type < 241) and if the msg must - * be send at this SYNC. read the COBID. Verify that the nodeId inside the - * nodeId correspond to bDeviceNodeId. (Assume that the cobId of a PDO Transmit is made - * with the node id of the node who transmit), get the mapping, launch PDOmGR to send the PDO - * *m is a pointer to the message received - * bus_id is hardware dependant - * return 0 if OK, 0xFF if error +/** This function is called when the node is receiving a SYNC message (cob-id = 0x80). + * - check if the node is in OERATIONAL mode. (other mode : return 0 but does nothing). + * - Get the SYNC cobId by reading the dictionary index 1005, check it does correspond to the received cobId + * - Trigger sync TPDO emission + * - return 0 if OK, 0xFF if error */ UNS8 proceedSYNC (CO_Data* d, Message * m); diff -r 5a17bcb520ef -r f812bf6b7237 objdictgen/gen_cfile.py --- a/objdictgen/gen_cfile.py Fri Jun 29 19:48:22 2007 +0200 +++ b/objdictgen/gen_cfile.py Fri Jun 29 19:51:39 2007 +0200 @@ -448,12 +448,16 @@ return &%(NodeName)s_objdict[i]; } -/* To count at which received SYNC a PDO must be sent. +/* + * To count at which received SYNC a PDO must be sent. * Even if no pdoTransmit are defined, at least one entry is computed * for compilations issues. */ -UNS8 %(NodeName)s_count_sync[%(maxPDOtransmit)d] = {0,}; -"""%texts +s_PDO_status %(NodeName)s_PDO_status[%(maxPDOtransmit)d] = {"""%texts + + fileContent += ",".join(["s_PDO_staus_Initializer"]*texts["maxPDOtransmit"]) + """}; +""" + fileContent += strQuickIndex fileContent += """ UNS16 %(NodeName)s_ObjdictSize = sizeof(%(NodeName)s_objdict)/sizeof(%(NodeName)s_objdict[0]); diff -r 5a17bcb520ef -r f812bf6b7237 src/pdo.c --- a/src/pdo.c Fri Jun 29 19:48:22 2007 +0200 +++ b/src/pdo.c Fri Jun 29 19:51:39 2007 +0200 @@ -34,141 +34,64 @@ ** ** */ -UNS8 sendPDO(CO_Data* d, s_PDO pdo, UNS8 req) -{ - UNS8 i; - if( d->nodeState == Operational ) { - Message m; - - /* Message copy for sending */ - m.cob_id.w = pdo.cobId & 0x7FF; /* Because the cobId is 11 bytes - length */ - if ( req == NOT_A_REQUEST ) { - UNS8 i; - m.rtr = NOT_A_REQUEST; - m.len = pdo.len; - /* memcpy(&m.data, &pdo.data, m.len); */ - /* This Memcpy depends on packing structure. Avoid */ - for (i = 0 ; i < pdo.len ; i++) - m.data[i] = pdo.data[i]; - } - else { - m.rtr = REQUEST; - m.len = 0; - } - - MSG_WAR(0x3901, "sendPDO cobId :", m.cob_id.w); - MSG_WAR(0x3902, " Nb octets : ", m.len); - for (i = 0 ; i < m.len ; i++) { - MSG_WAR(0x3903," data : ", m.data[i]); - } - - return canSend(d->canHandle,&m); - } /* end if */ - return 0xFF; -} - -/*! -** PDO Manager + +/*! +** ** ** @param d -** @param cobId +** @param TPDO_com TPDO communication parameters OD entry +** @param TPDO_map TPDO mapping parameters OD entry ** ** @return **/ -UNS8 PDOmGR(CO_Data* d, UNS32 cobId) -{ - UNS8 res; - UNS8 i; - s_PDO pdo; - - MSG_WAR(0x3905, "PDOmGR",0); - - /* if PDO is waiting for transmission, - preparation of the message to send */ - pdo.cobId = cobId; - pdo.len = d->process_var.count; - /* memcpy(&(pdo.data), &(process_var.data), pdo.len); */ - /* Ce memcpy devrait tre portable */ - for ( i = 0 ; i < pdo.len ; i++) - pdo.data[i] = d->process_var.data[i]; - - res = sendPDO(d, pdo, NOT_A_REQUEST); - - return res; -} - -#if 0 -/*********************************************************************/ -/* TODO : implement bit mapping */ -/*********************************************************************/ - -UNS8 buildPDO(CO_Data* d, UNS16 index) -{ /* DO NOT USE MSG_ERR because the macro may send a PDO -> infinite loop if it fails. */ - UNS16 ind; - UNS8 subInd; - - UNS8 * pMappingCount = NULL; /* count of mapped objects... */ - /* pointer to the var which is mapped to a pdo */ -/* void * pMappedAppObject = NULL; */ - /* pointer fo the var which holds the mapping parameter of an mapping entry */ - - UNS32 * pMappingParameter = NULL; - - UNS8 Size; - UNS8 dataType; - UNS8 offset; - UNS16 offsetObjdict; - UNS16 offsetObjdictPrm; - UNS32 objDict; - - subInd=(UNS8)0x00; - offset = 0x00; - ind = index - 0x1800; - - MSG_WAR(0x3910,"Prepare PDO to send index :", index); - - /* only operational state allows PDO transmission */ - if( d->nodeState != Operational ) { - MSG_WAR(0x2911, "Unable to send the PDO (node not in OPERATIONAL mode). Node : ", index); - return 0xFF; - } - offsetObjdictPrm = d->firstIndex->PDO_TRS; - offsetObjdict = d->firstIndex->PDO_TRS_MAP; - - if (offsetObjdictPrm && offsetObjdict) - { - /* get mapped objects number to transmit with this PDO */ - pMappingCount = (d->objdict + offsetObjdict + ind)->pSubindex[0].pObject; - MSG_WAR(0x3912, "Nb maped objects : ",* pMappingCount); - MSG_WAR(0x3913, " at index : ", 0x1A00 + ind); - while (subInd < *pMappingCount) { /* Loop on mapped variables */ - /* get mapping parameters */ - pMappingParameter = (d->objdict + offsetObjdict + ind)->pSubindex[subInd + 1].pObject; - MSG_WAR(0x3914, "Get the mapping at index : ", (UNS16)0x1A00 + ind); - MSG_WAR(0x3915, " subIndex : ", subInd + 1); - MSG_WAR(0x3916, " value : ", *(UNS32 *)pMappingParameter); - /* Get the mapped variable */ - Size = ((UNS8)(((*pMappingParameter) & 0xFF) >> 3)); - objDict = getODentry(d, (UNS16)((*pMappingParameter) >> 16), - (UNS8)(((*pMappingParameter) >> 8 ) & 0x000000FF), - (void *)&d->process_var.data[offset], &Size, &dataType, 0 ); - - if (objDict != OD_SUCCESSFUL) { - MSG_WAR(0x2919, "error accessing to the mapped var : ", subInd + 1); - MSG_WAR(0x2920, " Mapped at index : ", (*pMappingParameter) >> 16); - MSG_WAR(0x2921, " subindex : ", ((*pMappingParameter) >> 8 ) & 0xFF); - return 0xFF; - } - - offset += Size; - d->process_var.count = offset; - subInd++; - }/* end Loop on mapped variables */ - } - return 0; -} -#endif + +UNS8 buildPDO(CO_Data* d, UNS8 numPdo, Message *pdo) +{ + const indextable* TPDO_com = d->objdict + d->firstIndex->PDO_TRS + numPdo; + const indextable* TPDO_map = d->objdict + d->firstIndex->PDO_TRS_MAP + numPdo; + + UNS8 prp_j = 0x00; + UNS8 offset = 0x00; + const UNS8* pMappingCount = (UNS8*) TPDO_map->pSubindex[0].pObject; + + pdo->cob_id.w = *(UNS32*)TPDO_com->pSubindex[1].pObject; + pdo->rtr = NOT_A_REQUEST; + + MSG_WAR(0x3009, " PDO CobId is : ", *(UNS32*)TPDO_com->pSubindex[1].pObject); + MSG_WAR(0x300D, " Number of objects mapped : ",*pMappingCount ); + + do{ + UNS8 dataType; /* Unused */ + UNS8 tmp[]= {0,0,0,0,0,0,0,0}; /* temporary space to hold bits */ + + /* pointer fo the var which holds the mapping parameter of an mapping entry */ + UNS32* pMappingParameter = (UNS32*) TPDO_map->pSubindex[prp_j + 1].pObject; + UNS16 index = (UNS16)((*pMappingParameter) >> 16); + UNS8 Size = (UNS8)(*pMappingParameter); /* Size in bits */ + UNS8 ByteSize = 1 + ((Size - 1) >> 3); /*1->8 => 1 ; 9->16 => 2, ... */ + UNS8 subIndex = (UNS8)(( (*pMappingParameter) >> (UNS8)8 ) & (UNS32)0x000000FF); + + MSG_WAR(0x300F, " got mapping parameter : ", *pMappingParameter); + MSG_WAR(0x3050, " at index : ", TPDO_map->index); + MSG_WAR(0x3051, " sub-index : ", prp_j + 1); + + if( getODentry(d, index, subIndex, tmp, &ByteSize, &dataType, 0 ) != OD_SUCCESSFUL ){ + MSG_ERR(0x1013, " Couldn't find mapped variable at index-subindex-size : ", (UNS16)(*pMappingParameter)); + return 0xFF; + } + /* copy bit per bit in little endian*/ + CopyBits(Size, ((UNS8*)tmp), 0 , 0, (UNS8*)&pdo->data[offset>>3], offset%8, 0); + + offset += Size ; + prp_j++; + }while( prp_j < *pMappingCount ); + + pdo->len = 1 + ((offset - 1) >> 3); + + MSG_WAR(0x3015, " End scan mapped variable", 0); + + return 0; +} /*! ** @@ -197,11 +120,8 @@ pwCobId = (UNS32*) d->objdict[offset].pSubindex[1].pObject; if ( *pwCobId == cobId ) { - s_PDO pdo; - pdo.cobId = *pwCobId; - pdo.len = 0; - err = sendPDO(d, pdo, REQUEST); - return err; + Message pdo = {*pwCobId, REQUEST, 0}; + return canSend(d->canHandle,&pdo); } offset++; } @@ -239,7 +159,8 @@ UNS32 objDict; UNS16 offsetObjdict; UNS16 lastIndex; - status = state1; + + status = state2; MSG_WAR(0x3935, "proceedPDO, cobID : ", ((*m).cob_id.w & 0x7ff)); offset = 0x00; @@ -247,6 +168,7 @@ numMap = 0; if((*m).rtr == NOT_A_REQUEST ) { /* The PDO received is not a request. */ + offsetObjdict = d->firstIndex->PDO_RCV; lastIndex = d->lastIndex->PDO_RCV; @@ -256,16 +178,6 @@ switch( status ) { - case state1:/* data are stored in process_var array */ - /* memcpy(&(process_var.data), &m->data, (*m).len); */ - /* Ce memcpy devrait etre portable */ - for ( i = 0 ; i < m->len ; i++) - d->process_var.data[i] = m->data[i]; - d->process_var.count = (*m).len; - - status = state2; - break; - case state2: /* get CobId of the dictionary correspondant to the received PDO */ @@ -313,7 +225,7 @@ Size = (UNS8)(*pMappingParameter); /* copy bit per bit in little endian */ - CopyBits(Size, (UNS8*)&d->process_var.data[offset>>3], offset%8, 0, ((UNS8*)tmp), 0, 0); + CopyBits(Size, (UNS8*)&m->data[offset>>3], offset%8, 0, ((UNS8*)tmp), 0, 0); ByteSize = 1 + ((Size - 1) >> 3); /*1->8 => 1 ; 9->16 => 2, ... */ @@ -335,6 +247,7 @@ /* MSG_WAR(0x3945, " data : ",*((UNS32*)pMappedAppObject)); */ offset += Size; numMap++; + /*TODO : check that offset is not not greater that message size (in bit) */ } /* end loop while on mapped variables */ offset=0x00; @@ -372,43 +285,38 @@ case state4:/* check transmission type (after request?) */ pTransmissionType = (UNS8*) d->objdict[offsetObjdict].pSubindex[2].pObject; - if ( (*pTransmissionType == TRANS_RTR) || (*pTransmissionType == TRANS_RTR_SYNC ) || (*pTransmissionType == TRANS_EVENT) ) { + if ( (*pTransmissionType == TRANS_RTR) || + (*pTransmissionType == TRANS_RTR_SYNC )) { status = state5; break; - } - else { + }else if( + (*pTransmissionType == TRANS_EVENT_PROFILE) || + (*pTransmissionType == TRANS_EVENT_SPECIFIC) ) { + /* Zap all timers and inhibit flag */ + d->PDO_status[numPdo].event_timer = DelAlarm(d->PDO_status[numPdo].event_timer); + d->PDO_status[numPdo].inhibit_timer = DelAlarm(d->PDO_status[numPdo].inhibit_timer); + d->PDO_status[numPdo].transmit_type_parameter &= ~PDO_INHIBITED; + /* Call PDOEventTimerAlarm for this TPDO, this will trigger emission et reset timers */ + PDOEventTimerAlarm(d, numPdo); + return 0; + }else { /* The requested PDO is not to send on request. So, does nothing. */ MSG_WAR(0x2947, "PDO is not to send on request : ", m->cob_id.w); return 0xFF; } - case state5:/* get mapped objects number */ - offsetObjdict = d->firstIndex->PDO_TRS_MAP; - lastIndex = d->lastIndex->PDO_TRS_MAP; - pMappingCount = (UNS8*) (d->objdict + offsetObjdict + numPdo)->pSubindex[0].pObject; - numMap = 0; - while (numMap < *pMappingCount) { - pMappingParameter = (UNS32*) (d->objdict + offsetObjdict + numPdo)->pSubindex[numMap + 1].pObject; - /* Get the mapped variable */ - Size = ((UNS8)(((*pMappingParameter) & 0xFF) >> 3)); - objDict = getODentry( d, (UNS16)((*pMappingParameter) >> (UNS8)16), - (UNS8)(( (*pMappingParameter) >> (UNS8)8 ) & 0xFF), - (void *)&d->process_var.data[offset], &Size, &dataType, 0 ); - if (objDict != OD_SUCCESSFUL) { - MSG_ERR(0x1948, "error accessing to the mapped var : ", numMap + 1); - MSG_WAR(0x2949, " Mapped at index : ", (*pMappingParameter) >> 16); - MSG_WAR(0x2950, " subindex : ", ((*pMappingParameter) >> 8 ) & 0xFF); - return 0xFF; - } - offset += (UNS8) (((*pMappingParameter) & 0xFF) >> 3); - d->process_var.count = offset; - numMap++; - - } /* end while */ - PDOmGR( d, *pwCobId ); /* Transmit the PDO */ + case state5:/* build and send requested PDO */ + { + Message pdo; + if( buildPDO(d, numPdo, &pdo)) + { + MSG_ERR(0x1013, " Couldn't find mapped variable at index-subindex-size : ", (UNS16)(*pMappingParameter)); + //return 0xFF; /*No real reason to stop...*/ + } + canSend(d->canHandle,&pdo); return 0; - + } }/* end switch status */ }/* end while */ }/* end if Requete */ @@ -476,109 +384,191 @@ } } - -#if 0 - -/*********************************************************************/ -/* TODO : reimplement this using CallBacks - */ -/*********************************************************************/ - /*! ** ** ** @param d -** @param variable ** ** @return **/ -UNS8 sendPDOevent( CO_Data* d, void * variable ) -{ /* DO NOT USE MSG_ERR because the macro may send a PDO -> infinite - loop if it fails.*/ - UNS32 objDict = 0; - UNS8 ind, sub_ind; - UNS8 status; - UNS8 offset; - UNS8 * pMappingCount = NULL; - UNS32 * pMappingParameter = NULL; - void * pMappedAppObject = NULL; - UNS8 * pTransmissionType = NULL; /* pointer to the transmission - type */ - UNS32 * pwCobId = NULL; - UNS8 * pSize; - UNS8 size; - UNS8 dataType; - UNS16 offsetObjdict; - UNS16 offsetObjdictPrm; - UNS16 lastIndex; - UNS8 numMap; - ind = 0x00; - sub_ind = 1; - offset = 0x00; - pSize = &size; - status = state1; - - - /* look for the index and subindex where the variable is mapped */ - /* Then, send the pdo which contains the variable. */ - - MSG_WAR (0x3960, "sendPDOevent", 0); - offsetObjdictPrm = d->firstIndex->PDO_TRS; - - offsetObjdict = d->firstIndex->PDO_TRS_MAP; - lastIndex = d->lastIndex->PDO_TRS_MAP; - - if (offsetObjdictPrm && offsetObjdict) - /* Loop on PDO Transmit */ - while(offsetObjdict <= lastIndex){ - /* Check the transmission mode */ - pTransmissionType = d->objdict[offsetObjdictPrm].pSubindex[2].pObject; - if (*pTransmissionType != TRANS_EVENT) { - ind++; - offsetObjdict++; - offsetObjdictPrm++; - continue; + +UNS8 sendPDOevent( CO_Data* d) +{ + /* Calls _sendPDOevent specifying it is not a sync event */ + return _sendPDOevent(d, 0); +} + + +void PDOEventTimerAlarm(CO_Data* d, UNS32 pdoNum) +{ + printf("EV PDOEventTimerAlarm : %d\n", pdoNum); + + /* This is needed to avoid deletion of re-attribuated timer */ + d->PDO_status[pdoNum].event_timer = TIMER_NONE; + /* force emission of PDO by artificially changing last emitted*/ + d->PDO_status[pdoNum].last_message.cob_id.w = 0; + _sendPDOevent( d, 0 ); /* not a Sync Event*/ +} + +void PDOInhibitTimerAlarm(CO_Data* d, UNS32 pdoNum) +{ + printf("EV PDOInhibitTimerAlarm : %d\n", pdoNum); + + /* This is needed to avoid deletion of re-attribuated timer */ + d->PDO_status[pdoNum].inhibit_timer = TIMER_NONE; + /* Remove inhibit flag */ + d->PDO_status[pdoNum].transmit_type_parameter &= ~PDO_INHIBITED; + _sendPDOevent( d, 0 ); /* not a Sync Event*/ +} + +/*! +** +** +** @param d +** @param isSyncEvent +** +** @return +**/ + +UNS8 _sendPDOevent( CO_Data* d, UNS8 isSyncEvent ) +{ + UNS8 pdoNum = 0x00; /* number of the actual processed pdo-nr. */ + UNS8* pTransmissionType = NULL; + UNS8 status = state3; + UNS16 offsetObjdict = d->firstIndex->PDO_TRS; + UNS16 offsetObjdictMap = d->firstIndex->PDO_TRS_MAP; + UNS16 lastIndex = d->lastIndex->PDO_TRS; + + /* study all PDO stored in the objects dictionary */ + if(offsetObjdict){ + Message clean = Message_Initializer; + Message pdo = Message_Initializer; + while( offsetObjdict <= lastIndex) { + switch( status ) { + case state3: /* get the PDO transmission type */ + if (d->objdict[offsetObjdict].bSubCount <= 2) { + MSG_ERR(0x1004, "Subindex 2 not found at index ", 0x1800 + pdoNum); + return 0xFF; + } + pTransmissionType = (UNS8*) d->objdict[offsetObjdict].pSubindex[2].pObject; + MSG_WAR(0x3005, "Reading PDO at index : ", 0x1800 + pdoNum); + + /* check if transmission type is after (this) SYNC */ + /* The message may not be transmited every SYNC but every n SYNC */ + if( isSyncEvent && + (*pTransmissionType >= TRANS_SYNC_MIN) && + (*pTransmissionType <= TRANS_SYNC_MAX) && + (++d->PDO_status[pdoNum].transmit_type_parameter == *pTransmissionType) ) { + d->PDO_status[pdoNum].transmit_type_parameter = 0; + MSG_WAR(0x3007, " PDO is on SYNCHRO. Trans type : ", *pTransmissionType); + pdo = clean; + if(buildPDO(d, pdoNum, &pdo)) + { + MSG_ERR(0x3006, " Couldn't build TPDO number : ", pdoNum); + status = state11; + break; + } + status = state5; } - pMappingCount = d->objdict[offsetObjdict].pSubindex[0].pObject; - numMap = 1; /* mapped variable */ - while (numMap <= *pMappingCount) { - pMappingParameter = d->objdict[offsetObjdict].pSubindex[numMap].pObject; - /* Get the variable */ - objDict = getODentry( d, - (UNS16)((*pMappingParameter) >> 16), - (UNS8)(( (*pMappingParameter) >> (UNS8)8 ) & (UNS32)0x000000FF), - (void * *)&pMappedAppObject, pSize, &dataType, 0 ); - if( objDict != OD_SUCCESSFUL ) { - MSG_WAR(0x2961, "Error in dict. at index : ", - (*pMappingParameter) >> (UNS8)16); - - MSG_WAR(0x2962, " subindex : ", - ((*pMappingParameter) >> (UNS8)8 ) & (UNS32)0x000000FF); - return 0xFF; - } - if (pMappedAppObject == variable) { // Variable found ! - MSG_WAR(0x3963, "Variable to send found at index : ", - (*pMappingParameter) >> 16); - MSG_WAR(0x3964, " subIndex : ", - ((*pMappingParameter) >> 8 ) & 0x000000FF); - buildPDO(d, 0x1800 + ind); - /* Get the cobId */ - pwCobId = d->objdict[offsetObjdictPrm].pSubindex[1].pObject; - PDOmGR( d, *pwCobId ); /* Send the PDO */ - return 0; - } - numMap++; - } /* End loop on mapped variable */ - ind++; - offsetObjdict++; - offsetObjdictPrm++; - } /* End loop while on PDO */ - - MSG_WAR(0x2965, "Variable not found in a PDO to send on event", 0); - return 0xFF; - -} -#endif - - - + /* If transmission on Event and not inhibited, check for changes */ + else if((*pTransmissionType == TRANS_EVENT_PROFILE || + *pTransmissionType == TRANS_EVENT_SPECIFIC )&& + !(d->PDO_status[pdoNum].transmit_type_parameter & PDO_INHIBITED)) { + MSG_WAR(0x3008, " PDO is on EVENT. Trans type : ", *pTransmissionType); + pdo = pdo = clean; + if(buildPDO(d, pdoNum, &pdo)) + { + MSG_ERR(0x3007, " Couldn't build TPDO number : ", pdoNum); + status = state11; + break; + } + + /*Compare new and old PDO*/ + if(d->PDO_status[pdoNum].last_message.cob_id.w == pdo.cob_id.w && + d->PDO_status[pdoNum].last_message.len == pdo.len && + *(UNS64*)(&d->PDO_status[pdoNum].last_message.data[0]) == *(UNS64*)(&pdo.data[0])){ + /* No changes -> go to next pdo*/ + status = state11; + }else{ + MSG_WAR(0x3008, "Changes TPDO number : ", pdoNum); + printf("EV Changes TPDO number : %d\n", pdoNum); + /* Changes detected -> transmit message */ + status = state5; + + /* Start both event_timer and inhibit_timer*/ + DelAlarm(d->PDO_status[pdoNum].event_timer); + d->PDO_status[pdoNum].event_timer = SetAlarm(d, pdoNum, &PDOEventTimerAlarm, MS_TO_TIMEVAL(*(UNS16*)d->objdict[offsetObjdict].pSubindex[5].pObject), 0); + + DelAlarm(d->PDO_status[pdoNum].inhibit_timer); + d->PDO_status[pdoNum].inhibit_timer = SetAlarm(d, pdoNum, &PDOInhibitTimerAlarm, US_TO_TIMEVAL(*(UNS16*)d->objdict[offsetObjdict].pSubindex[3].pObject * 100), 0); + + /* and inhibit TPDO */ + d->PDO_status[pdoNum].transmit_type_parameter |= PDO_INHIBITED; + } + }else{ + MSG_WAR(0x3009, " PDO is not on EVENT or synchro or not at this SYNC. Trans type : ", *pTransmissionType); + status = state11; + } + break; + case state5: /*Send the pdo*/ + /*store_as_last_message*/ + d->PDO_status[pdoNum].last_message = pdo; + MSG_WAR(0x3901, "sendPDO cobId :", pdo.cob_id.w); + MSG_WAR(0x3902, " Nb octets : ", pdo.len); + {int i; + for (i = 0 ; i < pdo.len ; i++) { + MSG_WAR(0x3903," data : ", pdo.data[i]); + }} + + canSend(d->canHandle,&pdo); + status = state11; + break; + case state11: /*Go to next TPDO*/ + pdoNum++; + offsetObjdict++; + offsetObjdictMap++; + MSG_WAR(0x3017, "next pdo index : ", pdoNum); + status = state3; + break; + + default: + MSG_ERR(0x1019,"Unknown state has been reached : %d",status); + return 0xFF; + }/* end switch case */ + + }/* end while */ + } + return 0; +} + +void PDOInit(CO_Data* d) +{ + + /* TODO: implement callbacks on 140xh + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx + */ + + _sendPDOevent(d, 0 ); +} + +void PDOStop(CO_Data* d) +{ + UNS8 pdoNum = 0x00; /* number of the actual processed pdo-nr. */ + UNS16 offsetObjdict = d->firstIndex->PDO_TRS; + UNS16 lastIndex = d->lastIndex->PDO_TRS; + if(offsetObjdict) while( offsetObjdict <= lastIndex) { + d->PDO_status[pdoNum].event_timer = DelAlarm(d->PDO_status[pdoNum].event_timer); + d->PDO_status[pdoNum].inhibit_timer = DelAlarm(d->PDO_status[pdoNum].inhibit_timer); + d->PDO_status[pdoNum].transmit_type_parameter = 0; + d->PDO_status[pdoNum].last_message.cob_id.w = 0; + pdoNum++; + offsetObjdict++; + } +} diff -r 5a17bcb520ef -r f812bf6b7237 src/states.c --- a/src/states.c Fri Jun 29 19:48:22 2007 +0200 +++ b/src/states.c Fri Jun 29 19:51:39 2007 +0200 @@ -123,7 +123,7 @@ StartOrStop(csSYNC, startSYNC(d), stopSYNC(d)) StartOrStop(csHeartbeat, heartbeatInit(d), heartbeatStop(d)) /* StartOrStop(Emergency,,) */ - StartOrStop(csPDO, None, None) + StartOrStop(csPDO, PDOInit(d), PDOStop(d)) StartOrStop(csBoot_Up, None, slaveSendBootUp(d)) } diff -r 5a17bcb520ef -r f812bf6b7237 src/sync.c --- a/src/sync.c Fri Jun 29 19:48:22 2007 +0200 +++ b/src/sync.c Fri Jun 29 19:51:39 2007 +0200 @@ -141,33 +141,7 @@ UNS8 proceedSYNC(CO_Data* d, Message *m) { - UNS8 pdoNum, /* number of the actual processed pdo-nr. */ - prp_j; - - const UNS8 * pMappingCount = NULL; /* count of mapped objects...*/ - /* pointer to the var which is mapped to a pdo */ - /* void * pMappedAppObject = NULL; */ - /* pointer fo the var which holds the mapping parameter of an mapping entry */ - UNS32 * pMappingParameter = NULL; - /* pointer to the transmissiontype...*/ - UNS8 * pTransmissionType = NULL; - UNS32 * pwCobId = NULL; - - UNS8 dataType; - UNS16 index; - UNS8 subIndex; - UNS8 offset; - UNS8 status; - UNS8 Size; - UNS32 objDict; - UNS16 offsetObjdict; - UNS16 offsetObjdictMap; - UNS16 lastIndex; - - status = state3; - pdoNum = 0x00; - prp_j = 0x00; - offset = 0x00; + UNS8 res; MSG_WAR(0x3002, "SYNC received. Proceed. ", 0); @@ -176,117 +150,14 @@ /* only operational state allows PDO transmission */ if( d->nodeState != Operational ) return 0; + + res = _sendPDOevent(d, 1 /*isSyncEvent*/ ); - /* So, the node is in operational state */ - /* study all PDO stored in the objects dictionary */ - - offsetObjdict = d->firstIndex->PDO_TRS; - lastIndex = d->lastIndex->PDO_TRS; - offsetObjdictMap = d->firstIndex->PDO_TRS_MAP; + /*Call user app callback*/ + (*d->post_TPDO)(); - if(offsetObjdict) while( offsetObjdict <= lastIndex) { - switch( status ) { - - case state3: /* get the PDO transmission type */ - if (d->objdict[offsetObjdict].bSubCount <= 2) { - MSG_ERR(0x1004, "Subindex 2 not found at index ", 0x1800 + pdoNum); - return 0xFF; - } - pTransmissionType = (UNS8*) d->objdict[offsetObjdict].pSubindex[2].pObject; - MSG_WAR(0x3005, "Reading PDO at index : ", 0x1800 + pdoNum); - status = state4; - break; - case state4: /* check if transmission type is after (this) SYNC */ - /* The message may not be transmited every SYNC but every n SYNC */ - if( (*pTransmissionType >= TRANS_SYNC_MIN) && (*pTransmissionType <= TRANS_SYNC_MAX) && - (++d->count_sync[pdoNum] == *pTransmissionType) ) { - d->count_sync[pdoNum] = 0; - MSG_WAR(0x3007, " PDO is on SYNCHRO. Trans type : ", *pTransmissionType); - status = state5; - break; - } - else { - MSG_WAR(0x3008, " Not on synchro or not at this SYNC. Trans type : ", - *pTransmissionType); - pdoNum++; - offsetObjdict++; - offsetObjdictMap++; - status = state11; - break; - } - case state5: /* get PDO CobId */ - pwCobId = (UNS32*) d->objdict[offsetObjdict].pSubindex[1].pObject; - MSG_WAR(0x3009, " PDO CobId is : ", *pwCobId); - status = state7; - break; - case state7: /* get mapped objects number to transmit with this PDO */ - pMappingCount = (UNS8*) d->objdict[offsetObjdictMap].pSubindex[0].pObject; - MSG_WAR(0x300D, " Number of objects mapped : ",*pMappingCount ); - status = state8; - case state8: /* get mapping parameters */ - pMappingParameter = (UNS32*) d->objdict[offsetObjdictMap].pSubindex[prp_j + 1].pObject; - MSG_WAR(0x300F, " got mapping parameter : ", *pMappingParameter); - MSG_WAR(0x3050, " at index : ", 0x1A00 + pdoNum); - MSG_WAR(0x3051, " sub-index : ", prp_j + 1); - status = state9; - - case state9: /* get data to transmit */ - { - UNS8 ByteSize; - UNS8 tmp[]= {0,0,0,0,0,0,0,0}; - index = (UNS16)((*pMappingParameter) >> 16); - subIndex = (UNS8)(( (*pMappingParameter) >> (UNS8)8 ) & (UNS32)0x000000FF); - Size = (UNS8)(*pMappingParameter); /* Size in bits */ - ByteSize = 1 + ((Size - 1) >> 3); /*1->8 => 1 ; 9->16 => 2, ... */ - objDict = getODentry(d, index, subIndex, tmp, &ByteSize, &dataType, 0 ); - /* copy bit per bit in little endian*/ - CopyBits(Size, ((UNS8*)tmp), 0 , 0, (UNS8*)&d->process_var.data[offset>>3], offset%8, 0); - } - if( objDict != OD_SUCCESSFUL ){ - MSG_ERR(0x1013, " Couldn't find mapped variable at index-subindex-size : ", (UNS16)(*pMappingParameter)); - return 0xFF; - } - - offset += Size ; - d->process_var.count = 1 + ((offset - 1) >> 3); - prp_j++; - status = state10; - break; - - case state10: /* loop to get all the data to transmit */ - if( prp_j < *pMappingCount ){ - MSG_WAR(0x3014, " next variable mapped : ", prp_j); - status = state8; - break; - } - else { - MSG_WAR(0x3015, " End scan mapped variable", 0); - PDOmGR( d, *pwCobId ); - MSG_WAR(0x3016, " End of this pdo. Should have been sent", 0); - pdoNum++; - offsetObjdict++; - offsetObjdictMap++; - offset = 0x00; - prp_j = 0x00; - status = state11; - break; - } - - case state11: - MSG_WAR(0x3017, "next pdo index : ", pdoNum); - status = state3; - break; - - default: - MSG_ERR(0x1019,"Unknown state has been reached : %d",status); - return 0xFF; - }/* end switch case */ - - }/* end while( prp_ipost_TPDO)(); - - return 0; + return res; + }