00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00037 #include "objacces.h"
00038 #include "sdo.h"
00039 #include "dcf.h"
00040 #include "sysdep.h"
00041
00042 extern UNS8 _writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index,
00043 UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback, UNS8 endianize);
00044
00045 const indextable *ptrTable;
00046
00053 static void CheckSDOAndContinue(CO_Data* d, UNS8 nodeId)
00054 {
00055 UNS32 abortCode;
00056
00057 if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED)
00058 {
00059 MSG_ERR(0x1A01, "SDO error in consise DCF", abortCode);
00060 MSG_WAR(0x2A02, "server node : ", nodeId);
00061 }
00062
00063 closeSDOtransfer(d, nodeId, SDO_CLIENT);
00064 decompo_dcf(d,nodeId);
00065 }
00066
00075 UNS32 decompo_dcf(CO_Data* d,UNS8 nodeId)
00076 {
00077 UNS32 errorCode;
00078 UNS16 target_Index;
00079 UNS8 target_Subindex;
00080 UNS32 target_Size;
00081 UNS32 res;
00082 ODCallback_t *Callback;
00083
00084 ptrTable = (*d->scanIndexOD)(0x1F22, &errorCode, &Callback);
00085 if (errorCode != OD_SUCCESSFUL)
00086 {
00087 return errorCode;
00088 }
00089
00090
00091 while (nodeId < ptrTable->bSubCount){
00092 UNS32 nb_targets;
00093
00094 UNS8 szData = ptrTable->pSubindex[nodeId].size;
00095 UNS8* dcfend;
00096
00097 {
00098 UNS8* dcf = *((UNS8**)ptrTable->pSubindex[nodeId].pObject);
00099 dcfend = dcf + szData;
00100 if (!d->dcf_cursor){
00101 d->dcf_cursor = (UNS8*)dcf + 4;
00102 d->dcf_count_targets = 0;
00103 }
00104 nb_targets = UNS32_LE(*((UNS32*)dcf));
00105 }
00106
00107
00108 if((UNS8*)d->dcf_cursor + 7 < (UNS8*)dcfend && d->dcf_count_targets < nb_targets)
00109 {
00110
00111 target_Index = UNS16_LE(*((UNS16*)(d->dcf_cursor))); d->dcf_cursor += 2;
00112 target_Subindex = *((UNS8*)(((UNS8*)d->dcf_cursor)++));
00113 target_Size = UNS32_LE(*((UNS32*)(d->dcf_cursor))); d->dcf_cursor += 4;
00114
00115
00116
00117 res = _writeNetworkDict(d,
00118 nodeId,
00119 target_Index,
00120 target_Subindex,
00121 target_Size,
00122 0,
00123 d->dcf_cursor,
00124 CheckSDOAndContinue,
00125
00126 0);
00127
00128
00129 d->dcf_cursor += target_Size;
00130 d->dcf_count_targets++;
00131
00132 return ;
00133 }
00134 nodeId++;
00135 d->dcf_cursor = NULL;
00136 }
00137
00138 (*d->preOperational)();
00139
00140 }