# HG changeset patch # User greg # Date 1178274406 -7200 # Node ID 01d81faa3350c2d4873860aff708dc24cdd34c47 # Parent d485a3fc57397fa4772a5cc41f14b5116bb1c3bc Add concise DCF support diff -r d485a3fc5739 -r 01d81faa3350 doc/manual/en/manual.odt Binary file doc/manual/en/manual.odt has changed diff -r d485a3fc5739 -r 01d81faa3350 include/data.h --- a/include/data.h Fri May 04 12:22:48 2007 +0200 +++ b/include/data.h Fri May 04 12:26:46 2007 +0200 @@ -90,6 +90,11 @@ CAN_HANDLE canHandle; scanIndexOD_t scanIndexOD; storeODSubIndex_t storeODSubIndex; + + /* DCF concise */ + void* dcf_cursor; + UNS32 dcf_count_targets; + }; #define NMTable_Initializer Unknown_state, @@ -173,7 +178,9 @@ 0, /* toggle */\ NULL, /* canSend */\ NODE_PREFIX ## _scanIndexOD, /* scanIndexOD */\ - _storeODSubIndex /* storeODSubIndex */\ + _storeODSubIndex, /* storeODSubIndex */\ + NULL, /*dcf_cursor*/\ + 1 /*dcf_count_targets*/\ } #endif /* __data_h__ */ diff -r d485a3fc5739 -r 01d81faa3350 include/dcf.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/dcf.h Fri May 04 12:26:46 2007 +0200 @@ -0,0 +1,24 @@ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN + +See COPYING file for copyrights details. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +UNS32 decompo_dcf(CO_Data* d, UNS8 nodeId); diff -r d485a3fc5739 -r 01d81faa3350 src/Makefile.in --- a/src/Makefile.in Fri May 04 12:22:48 2007 +0200 +++ b/src/Makefile.in Fri May 04 12:26:46 2007 +0200 @@ -34,7 +34,7 @@ INCLUDES = -I../include -I../include/$(TARGET) -I../include/$(CAN_DRIVER) -I../include/$(TIMERS_DRIVER) -I../drivers/$(TARGET) OBJS = $(TARGET)_objacces.o $(TARGET)_lifegrd.o $(TARGET)_sdo.o\ - $(TARGET)_pdo.o $(TARGET)_sync.o $(TARGET)_nmtSlave.o $(TARGET)_nmtMaster.o $(TARGET)_states.o $(TARGET)_timer.o + $(TARGET)_pdo.o $(TARGET)_sync.o $(TARGET)_nmtSlave.o $(TARGET)_nmtMaster.o $(TARGET)_states.o $(TARGET)_timer.o $(TARGET)_dcf.o # # # # Target specific paramters # # # # diff -r d485a3fc5739 -r 01d81faa3350 src/dcf.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dcf.c Fri May 04 12:26:46 2007 +0200 @@ -0,0 +1,118 @@ +/* +This file is part of CanFestival, a library implementing CanOpen Stack. + +Copyright (C): Edouard TISSERANT and Francis DUPIN + +See COPYING file for copyrights details. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "objacces.h" +#include "sdo.h" +#include "dcf.h" + +const indextable *ptrTable; + +static void CheckSDOAndContinue(CO_Data* d, UNS8 nodeId) +{ + UNS32 res; + UNS8 line; + UNS8 err; + UNS16 Index; + UNS8 SubIndex; + UNS32 abortCode; + + if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED) + printf("Master : Failed in initializing slave %2.2x, AbortCode :%4.4x \n", nodeId, abortCode); + + closeSDOtransfer(d, nodeId, SDO_CLIENT); + res = decompo_dcf(d,nodeId); +} + +UNS32 decompo_dcf(CO_Data* d,UNS8 nodeId) +{ + UNS32 errorCode; + UNS16 target_Index; + UNS8 target_Subindex; + UNS32 target_Size; + void* target_data = NULL; + UNS32 res; + ODCallback_t *Callback; + + ptrTable = (*d->scanIndexOD)(0x1F22, &errorCode, &Callback); + if (errorCode != OD_SUCCESSFUL) + { + return errorCode; + } + + /*Loop on all Nodes supported in DCF subindexes*/ + while (nodeId < ptrTable->bSubCount){ + UNS32 nb_targets; + + UNS8 szData = ptrTable->pSubindex[nodeId].size; + void* dcfend; + + { + void* dcf = *((void**)ptrTable->pSubindex[nodeId].pObject); + dcfend = dcf + szData; + if (!d->dcf_cursor) { + d->dcf_cursor = dcf + 4; + d->dcf_count_targets = 0; + } + #ifdef CANOPEN_BIG_ENDIAN + nb_targets = ((UNS8*)d->dcf++) | ((UNS8*)d->dcf++) << 8 | ((UNS8*)d->dcf++) << 16 | ((UNS8*)d->dcf++) << 24; + #else + nb_targets = *((UNS32*)dcf); + #endif + } + + // condition on consise DCF string for NodeID, if big enough + if(d->dcf_cursor + 7 < dcfend && d->dcf_count_targets < nb_targets) + { + // pointer to the DCF string for NodeID + #ifdef CANOPEN_BIG_ENDIAN + target_Index = ((UNS8*)d->dcf_cursor++) | ((UNS8*)d->dcf_cursor++) << 8; + target_Subindex = ((UNS8*)d->dcf_cursor++); + target_Size = ((UNS8*)d->dcf_cursor++) | ((UNS8*)d->dcf_cursor++) << 8 | ((UNS8*)d->dcf_cursor++) << 16 | ((UNS8*)d->dcf_cursor++) << 24; + #else + target_Index = *((UNS16*)(d->dcf_cursor)); d->dcf_cursor += 2; + target_Subindex = *((UNS8*)(d->dcf_cursor++)); + target_Size = *((UNS32*)(d->dcf_cursor)); d->dcf_cursor += 4; + #endif + + printf("Master : ConfigureSlaveNode %2.2x (Concise DCF)\n",nodeId); + res = writeNetworkDictCallBack(d, /*CO_Data* d*/ + nodeId, /*UNS8 nodeId*/ + target_Index, /*UNS16 index*/ + target_Subindex, /*UNS8 subindex*/ + target_Size, /*UNS8 count*/ + 0, /*UNS8 dataType*/ + d->dcf_cursor,/*void *data*/ + CheckSDOAndContinue); /*SDOCallback_t Callback*/ + /*Push d->dcf_cursor to the end of data*/ + + d->dcf_cursor += target_Size; + d->dcf_count_targets++; + + return ; + } + nodeId++; + d->dcf_cursor = NULL; + } + /* Switch Master to preOperational state */ + (*d->preOperational)(); + +} diff -r d485a3fc5739 -r 01d81faa3350 src/states.c --- a/src/states.c Fri May 04 12:22:48 2007 +0200 +++ b/src/states.c Fri May 04 12:26:46 2007 +0200 @@ -110,16 +110,26 @@ switchCommunicationState(d, &newCommunicationState); /* call user app related state func. */ (*d->initialisation)(); + } break; case Pre_operational: { + s_state_communication newCommunicationState = {0, 1, 1, 1, 1, 0}; d->nodeState = Pre_operational; newState = Pre_operational; switchCommunicationState(d, &newCommunicationState); - (*d->preOperational)(); + if (!(*(d->iam_a_slave))) + { + UNS32 res; + res = decompo_dcf(d,0x01); + } + else + { + (*d->preOperational)(); + } } break;