# HG changeset patch # User etisserant # Date 1177426180 -7200 # Node ID e255529b6f7d14faac7f8e864152f3721191d3e5 # Parent cd1638bc0cb0042784d6fbf1be5fe6c05df0478f Added writeLocalDict and readLocalDict, that have to be called from application instead of getODEntry and setODEntry. Fix potential endianization problem. diff -r cd1638bc0cb0 -r e255529b6f7d examples/TestMasterMicroMod/TestMasterMicroMod.c --- a/examples/TestMasterMicroMod/TestMasterMicroMod.c Tue Apr 24 16:16:03 2007 +0200 +++ b/examples/TestMasterMicroMod/TestMasterMicroMod.c Tue Apr 24 16:49:40 2007 +0200 @@ -63,7 +63,7 @@ /***************************************** * Define RPDOs to match slave ID=0x40 TPDOs* *****************************************/ - setODentry( &TestMaster_Data, /*CO_Data* d*/ + writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ 0x1400, /*UNS16 index*/ 0x01, /*UNS8 subind*/ &PDO1_COBID, /*void * pSourceData,*/ @@ -74,7 +74,7 @@ /***************************************** * Define TPDOs to match slave ID=0x40 RPDOs* *****************************************/ - setODentry( &TestMaster_Data, /*CO_Data* d*/ + writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ 0x1800, /*UNS16 index*/ 0x01, /*UNS8 subind*/ &PDO2_COBID, /*void * pSourceData,*/ diff -r cd1638bc0cb0 -r e255529b6f7d examples/TestMasterSlave/Master.c --- a/examples/TestMasterSlave/Master.c Tue Apr 24 16:16:03 2007 +0200 +++ b/examples/TestMasterSlave/Master.c Tue Apr 24 16:49:40 2007 +0200 @@ -46,14 +46,14 @@ /***************************************** * Define RPDOs to match slave ID=2 TPDOs* *****************************************/ - setODentry( &TestMaster_Data, /*CO_Data* d*/ + writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ 0x1400, /*UNS16 index*/ 0x01, /*UNS8 subind*/ &PDO1_COBID, /*void * pSourceData,*/ &size, /* UNS8 * pExpectedSize*/ RW); /* UNS8 checkAccess */ - setODentry( &TestMaster_Data, /*CO_Data* d*/ + writeLocalDict( &TestMaster_Data, /*CO_Data* d*/ 0x1401, /*UNS16 index*/ 0x01, /*UNS8 subind*/ &PDO2_COBID, /*void * pSourceData,*/ diff -r cd1638bc0cb0 -r e255529b6f7d examples/win32test/main.c --- a/examples/win32test/main.c Tue Apr 24 16:16:03 2007 +0200 +++ b/examples/win32test/main.c Tue Apr 24 16:49:40 2007 +0200 @@ -134,9 +134,9 @@ UNS32 Node_ID_of_the_SDO_Server = node_id; UNS8 ExpectedSize = sizeof (UNS32); - if (OD_SUCCESSFUL == setODentry(&win32test_Data, 0x1280, 1, &COB_ID_Client_to_Server_Transmit_SDO, &ExpectedSize, RW) - && OD_SUCCESSFUL == setODentry(&win32test_Data, 0x1280, 2, &COB_ID_Server_to_Client_Receive_SDO, &ExpectedSize, RW) - && OD_SUCCESSFUL == setODentry(&win32test_Data, 0x1280, 3, &Node_ID_of_the_SDO_Server, &ExpectedSize, RW)) + if (OD_SUCCESSFUL == writeLocalDict(&win32test_Data, 0x1280, 1, &COB_ID_Client_to_Server_Transmit_SDO, &ExpectedSize, RW) + && OD_SUCCESSFUL == writeLocalDict(&win32test_Data, 0x1280, 2, &COB_ID_Server_to_Client_Receive_SDO, &ExpectedSize, RW) + && OD_SUCCESSFUL == writeLocalDict(&win32test_Data, 0x1280, 3, &Node_ID_of_the_SDO_Server, &ExpectedSize, RW)) { UNS32 dev_type = 0; char device_name[64]=""; diff -r cd1638bc0cb0 -r e255529b6f7d include/objacces.h --- a/include/objacces.h Tue Apr 24 16:16:03 2007 +0200 +++ b/include/objacces.h Tue Apr 24 16:49:40 2007 +0200 @@ -128,6 +128,14 @@ UNS8 * pExpectedSize, UNS8 checkAccess); +/*The same, without endianisation*/ +UNS32 writeLocalDict( CO_Data* d, + UNS16 wIndex, + UNS8 bSubindex, + void * pSourceData, + UNS8 * pExpectedSize, + UNS8 checkAccess); + /* Scan the index of object dictionary. Used only by setODentry and getODentry. * *errorCode : OD_SUCCESSFUL if index foundor SDO abort code. (See file def.h) diff -r cd1638bc0cb0 -r e255529b6f7d src/objacces.c --- a/src/objacces.c Tue Apr 24 16:16:03 2007 +0200 +++ b/src/objacces.c Tue Apr 24 16:49:40 2007 +0200 @@ -65,13 +65,14 @@ } -UNS32 getODentry( CO_Data* d, +UNS32 _getODentry( CO_Data* d, UNS16 wIndex, UNS8 bSubindex, void * pDestData, UNS8 * pExpectedSize, UNS8 * pDataType, - UNS8 checkAccess) + UNS8 checkAccess, + UNS8 endianize) { /* DO NOT USE MSG_ERR because the macro may send a PDO -> infinite loop if it fails. */ UNS32 errorCode; UNS8 szData; @@ -102,7 +103,7 @@ (*pDataType == visible_string && *pExpectedSize < szData)) {/* We allow to fetch a shorter string than expected */ # ifdef CANOPEN_BIG_ENDIAN - if(*pDataType > boolean && *pDataType < visible_string) { + if(endianize && *pDataType > boolean && *pDataType < visible_string) { /* data must be transmited with low byte first */ UNS8 i, j = 0; MSG_WAR(boolean, "data type ", *pDataType); @@ -141,12 +142,49 @@ } } -UNS32 setODentry( CO_Data* d, +UNS32 getODentry( CO_Data* d, + UNS16 wIndex, + UNS8 bSubindex, + void * pDestData, + UNS8 * pExpectedSize, + UNS8 * pDataType, + UNS8 checkAccess) +{ + return _getODentry( d, + wIndex, + bSubindex, + pDestData, + pExpectedSize, + pDataType, + checkAccess, + 1);//endianize +} + +UNS32 readLocalDict( CO_Data* d, + UNS16 wIndex, + UNS8 bSubindex, + void * pDestData, + UNS8 * pExpectedSize, + UNS8 * pDataType, + UNS8 checkAccess) +{ + return _getODentry( d, + wIndex, + bSubindex, + pDestData, + pExpectedSize, + pDataType, + checkAccess, + 0);//do not endianize +} + +UNS32 _setODentry( CO_Data* d, UNS16 wIndex, UNS8 bSubindex, void * pSourceData, UNS8 * pExpectedSize, - UNS8 checkAccess) + UNS8 checkAccess, + UNS8 endianize) { UNS8 szData; UNS8 dataType; @@ -178,7 +216,7 @@ (dataType == visible_string && *pExpectedSize < szData)) /* We allow to store a shorter string than entry size */ { #ifdef CANOPEN_BIG_ENDIAN - if(dataType > boolean && dataType < visible_string) + if(endianize && dataType > boolean && dataType < visible_string) { /* we invert the data source directly. This let us do range testing without */ /* additional temp variable */ @@ -216,6 +254,40 @@ } } +UNS32 setODentry( CO_Data* d, + UNS16 wIndex, + UNS8 bSubindex, + void * pSourceData, + UNS8 * pExpectedSize, + UNS8 checkAccess) +{ + return _setODentry( d, + wIndex, + bSubindex, + pSourceData, + pExpectedSize, + checkAccess, + 1);//endianize +} + +UNS32 writeLocalDict( CO_Data* d, + UNS16 wIndex, + UNS8 bSubindex, + void * pSourceData, + UNS8 * pExpectedSize, + UNS8 checkAccess) +{ + return _setODentry( d, + wIndex, + bSubindex, + pSourceData, + pExpectedSize, + checkAccess, + 0);//do not endianize +} + + + const indextable * scanIndexOD (CO_Data* d, UNS16 wIndex, UNS32 *errorCode, ODCallback_t **Callback) { diff -r cd1638bc0cb0 -r e255529b6f7d src/win32/CanFestival-3.def --- a/src/win32/CanFestival-3.def Tue Apr 24 16:16:03 2007 +0200 +++ b/src/win32/CanFestival-3.def Tue Apr 24 16:49:40 2007 +0200 @@ -15,6 +15,8 @@ accessDictionaryError getODentry setODentry + writeLocalDict + readLocalDict scanIndexOD RegisterSetODentryCallBack sendPDO