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)(); + +}