655 UNS8 *pNodeId = NULL;
656 UNS8 whoami = SDO_UNKNOWN;
661 UNS8 numberOfIndexes;
665 UNS32 *pCobId = NULL;
670 MSG_WAR(0x3A60,
"processSDO ", 0);
671 whoami = SDO_UNKNOWN;
674 offset = d->firstIndex->SDO_SVR;
675 lastIndex = d->lastIndex->SDO_SVR;
677 if(offset)
while (offset <= lastIndex) {
678 if (d->objdict[offset].bSubCount <= 1) {
679 MSG_ERR(0x1A61,
"Subindex 1 not found at index ", 0x1200 + j);
682 pCobId = (
UNS32*) d->objdict[offset].pSubindex[1].pObject;
683 if ( *pCobId == UNS16_LE(m->
cob_id) ) {
685 MSG_WAR(0x3A62,
"proceedSDO. I am server. index : ", 0x1200 + j);
694 if (whoami == SDO_UNKNOWN) {
696 offset = d->firstIndex->SDO_CLT;
697 lastIndex = d->lastIndex->SDO_CLT;
699 if(offset)
while (offset <= lastIndex) {
700 if (d->objdict[offset].bSubCount <= 3) {
701 MSG_ERR(0x1A63,
"Subindex 3 not found at index ", 0x1280 + j);
705 pCobId = (
UNS32*) d->objdict[offset].pSubindex[2].pObject;
706 if (*pCobId == UNS16_LE(m->
cob_id) ) {
708 pNodeId = (
UNS8*) d->objdict[offset].pSubindex[3].pObject;
711 MSG_WAR(0x3A64,
"proceedSDO. I am server. index : ", 0x1280 + j);
712 MSG_WAR(0x3A65,
" Server nodeId : ", nodeId);
719 if (whoami == SDO_UNKNOWN) {
724 if ( (*m).len != 8) {
725 MSG_ERR(0x1A67,
"Error size SDO. CobId : ", UNS16_LE(m->
cob_id));
726 failedSDO(d, nodeId, whoami, 0, 0, SDOABT_GENERAL_ERROR);
730 if (whoami == SDO_CLIENT) {
731 MSG_WAR(0x3A68,
"I am CLIENT. Received SDO from nodeId : ", nodeId);
734 MSG_WAR(0x3A69,
"I am SERVER. Received SDO cobId : ", UNS16_LE(m->
cob_id));
744 if (whoami == SDO_SERVER)
750 err = d->transfers[line].
state != SDO_DOWNLOAD_IN_PROGRESS;
753 MSG_ERR(0x1A70,
"SDO error : Received download segment for unstarted trans. index 0x1200 + ",
755 failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
759 RestartSDO_TIMER(line)
760 MSG_WAR(0x3A71,
"Received SDO download segment defined at index 0x1200 + ", nodeId);
761 index = d->transfers[line].index;
762 subIndex = d->transfers[line].subIndex;
764 if (d->transfers[line].toggle !=
getSDOt(m->
data[0]))
767 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_TOGGLE_NOT_ALTERNED);
773 err =
SDOtoLine(d, line, nbBytes, (*m).data + 1);
776 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
780 sdo.
nodeId = *d->bDeviceNodeId;
781 sdo.body.
data[0] = (1 << 5) | (d->transfers[line].toggle << 4);
782 for (i = 1 ; i < 8 ; i++)
783 sdo.body.
data[i] = 0;
784 MSG_WAR(0x3A73,
"SDO. Send response to download request defined at index 0x1200 + ", nodeId);
787 d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
794 MSG_ERR(0x1A54,
"SDO error : Unable to copy the data in the object dictionary", 0);
795 failedSDO(d, nodeId, whoami, index, subIndex, errorCode);
800 MSG_WAR(0x3A74,
"SDO. End of download defined at index 0x1200 + ", nodeId);
809 err = d->transfers[line].
state != SDO_UPLOAD_IN_PROGRESS;
811 MSG_ERR(0x1A75,
"SDO error : Received segment response for unknown trans. from nodeId", nodeId);
812 failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
816 RestartSDO_TIMER(line)
817 index = d->transfers[line].index;
818 subIndex = d->transfers[line].subIndex;
820 if (d->transfers[line].toggle !=
getSDOt(m->
data[0])) {
821 MSG_ERR(0x1A76,
"SDO error : Received segment response Toggle error. from nodeId", nodeId);
822 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_TOGGLE_NOT_ALTERNED);
828 err =
SDOtoLine(d, line, nbBytes, (*m).data + 1);
830 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
834 d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
840 d->transfers[line].
state = SDO_FINISHED;
843 MSG_WAR(0x3A77,
"SDO. End of upload from node : ", nodeId);
849 sdo.body.
data[0] = (3 << 5) | (d->transfers[line].toggle << 4);
850 for (i = 1 ; i < 8 ; i++)
851 sdo.body.
data[i] = 0;
853 MSG_WAR(0x3A78,
"SDO send upload segment request to nodeId", nodeId);
861 if (whoami == SDO_SERVER) {
864 MSG_WAR(0x3A79,
"Received SDO Initiate Download (to store data) defined at index 0x1200 + ",
866 MSG_WAR(0x3A80,
"Writing at index : ", index);
867 MSG_WAR(0x3A80,
"Writing at subIndex : ", subIndex);
872 MSG_ERR(0x1A81,
"SDO error : Transmission yet started.", 0);
873 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
880 MSG_ERR(0x1A82,
"SDO error : No line free, too many SDO in progress. Aborted.", 0);
881 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
884 initSDOline(d, line, nodeId, index, subIndex, SDO_DOWNLOAD_IN_PROGRESS);
890 d->transfers[line].
count = nbBytes;
891 err =
SDOtoLine(d, line, nbBytes, (*m).data + 4);
894 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
900 MSG_WAR(0x3A83,
"SDO Initiate Download is an expedited transfert. Finished.: ", nodeId);
904 MSG_ERR(0x1A84,
"SDO error : Unable to copy the data in the object dictionary", 0);
905 failedSDO(d, nodeId, whoami, index, subIndex, errorCode);
917 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
923 sdo.
nodeId = *d->bDeviceNodeId;
924 sdo.body.
data[0] = 3 << 5;
925 sdo.body.
data[1] = index & 0xFF;
926 sdo.body.
data[2] = (index >> 8) & 0xFF;
927 sdo.body.
data[3] = subIndex;
928 for (i = 4 ; i < 8 ; i++)
929 sdo.body.
data[i] = 0;
938 err = d->transfers[line].
state != SDO_DOWNLOAD_IN_PROGRESS;
940 MSG_ERR(0x1A85,
"SDO error : Received segment response for unknown trans. from nodeId", nodeId);
941 failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
945 RestartSDO_TIMER(line)
946 index = d->transfers[line].index;
947 subIndex = d->transfers[line].subIndex;
949 if (d->transfers[line].toggle !=
getSDOt(m->
data[0])) {
950 MSG_ERR(0x1A86,
"SDO error : Received segment response Toggle error. from nodeId", nodeId);
951 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_TOGGLE_NOT_ALTERNED);
958 MSG_WAR(0x3A87,
"SDO End download. segment response received. OK. from nodeId", nodeId);
960 d->transfers[line].
state = SDO_FINISHED;
968 d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
970 sdo.body.
data[0] = (d->transfers[line].toggle << 4);
973 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
981 d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
983 sdo.body.
data[0] = (
UNS8)((d->transfers[line].toggle << 4) | ((7 - nbBytes) << 1) | 1);
986 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
989 for (i = nbBytes + 1 ; i < 8 ; i++)
990 sdo.body.
data[i] = 0;
992 MSG_WAR(0x3A88,
"SDO sending download segment to nodeId", nodeId);
1000 if (whoami == SDO_SERVER)
1004 MSG_WAR(0x3A89,
"Received SDO Initiate upload (to send data) defined at index 0x1200 + ",
1006 MSG_WAR(0x3A90,
"Reading at index : ", index);
1007 MSG_WAR(0x3A91,
"Reading at subIndex : ", subIndex);
1012 MSG_ERR(0x1A92,
"SDO error : Transmission yet started at line : ", line);
1013 MSG_WAR(0x3A93,
"nodeId = ", nodeId);
1014 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
1022 MSG_ERR(0x1A71,
"SDO error : No line free, too many SDO in progress. Aborted.", 0);
1023 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
1026 initSDOline(d, line, nodeId, index, subIndex, SDO_UPLOAD_IN_PROGRESS);
1031 MSG_ERR(0x1A94,
"SDO error : Unable to copy the data from object dictionary. Err code : ",
1033 failedSDO(d, nodeId, whoami, index, subIndex, errorCode);
1042 sdo.body.
data[0] = (2 << 5) | 1;
1043 sdo.body.
data[1] = index & 0xFF;
1044 sdo.body.
data[2] = (index >> 8) & 0xFF;
1045 sdo.body.
data[3] = subIndex;
1049 for (i = 5 ; i < 8 ; i++)
1050 sdo.body.
data[i] = 0;
1051 MSG_WAR(0x3A95,
"SDO. Sending normal upload initiate response defined at index 0x1200 + ", nodeId);
1057 sdo.body.
data[0] = (
UNS8)((2 << 5) | ((4 - nbBytes) << 2) | 3);
1058 sdo.body.
data[1] = index & 0xFF;
1059 sdo.body.
data[2] = (index >> 8) & 0xFF;
1060 sdo.body.
data[3] = subIndex;
1063 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1066 for (i = 4 + nbBytes ; i < 8 ; i++)
1067 sdo.body.
data[i] = 0;
1068 MSG_WAR(0x3A96,
"SDO. Sending expedited upload initiate response defined at index 0x1200 + ",
1082 err = d->transfers[line].
state != SDO_UPLOAD_IN_PROGRESS;
1084 MSG_ERR(0x1A97,
"SDO error : Received response for unknown upload request from nodeId", nodeId);
1085 failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
1089 RestartSDO_TIMER(line)
1090 index = d->transfers[line].index;
1091 subIndex = d->transfers[line].subIndex;
1097 err =
SDOtoLine(d, line, nbBytes, (*m).data + 4);
1099 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1103 MSG_WAR(0x3A98,
"SDO expedited upload finished. Response received from node : ", nodeId);
1105 d->transfers[line].
count = nbBytes;
1106 d->transfers[line].
state = SDO_FINISHED;
1117 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1123 sdo.body.
data[0] = 3 << 5;
1124 for (i = 1 ; i < 8 ; i++)
1125 sdo.body.
data[i] = 0;
1126 MSG_WAR(0x3A99,
"SDO. Sending upload segment request to node : ", nodeId);
1134 if (whoami == SDO_SERVER) {
1139 err = d->transfers[line].
state != SDO_UPLOAD_IN_PROGRESS;
1141 MSG_ERR(0x1AA0,
"SDO error : Received upload segment for unstarted trans. index 0x1200 + ",
1143 failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
1147 RestartSDO_TIMER(line)
1148 MSG_WAR(0x3AA1,
"Received SDO upload segment defined at index 0x1200 + ", nodeId);
1149 index = d->transfers[line].index;
1150 subIndex = d->transfers[line].subIndex;
1152 if (d->transfers[line].toggle !=
getSDOt(m->
data[0])) {
1154 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_TOGGLE_NOT_ALTERNED);
1163 sdo.body.
data[0] = (d->transfers[line].toggle << 4);
1166 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1170 d->transfers[line].toggle = ! d->transfers[line].toggle & 1;
1171 MSG_WAR(0x3AA3,
"SDO. Sending upload segment defined at index 0x1200 + ", nodeId);
1179 sdo.body.
data[0] = (
UNS8)((d->transfers[line].toggle << 4) | ((7 - nbBytes) << 1) | 1);
1182 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1185 for (i = nbBytes + 1 ; i < 8 ; i++)
1186 sdo.body.
data[i] = 0;
1187 MSG_WAR(0x3AA4,
"SDO. Sending last upload segment defined at index 0x1200 + ", nodeId);
1200 err = d->transfers[line].
state != SDO_DOWNLOAD_IN_PROGRESS;
1202 MSG_ERR(0x1AA5,
"SDO error : Received response for unknown download request from nodeId", nodeId);
1203 failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
1207 RestartSDO_TIMER(line)
1208 index = d->transfers[line].index;
1209 subIndex = d->transfers[line].subIndex;
1213 MSG_WAR(0x3AA6,
"SDO End download expedited. Response received. from nodeId", nodeId);
1215 d->transfers[line].
state = SDO_FINISHED;
1223 sdo.body.
data[0] = (d->transfers[line].toggle << 4);
1226 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1235 sdo.body.
data[0] = (
UNS8)((d->transfers[line].toggle << 4) | ((7 - nbBytes) << 1) | 1);
1238 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1241 for (i = nbBytes + 1 ; i < 8 ; i++)
1242 sdo.body.
data[i] = 0;
1244 MSG_WAR(0x3AA7,
"SDO sending download segment to nodeId", nodeId);
1258 if (whoami == SDO_SERVER) {
1262 MSG_WAR(0x3AA8,
"SD0. Received SDO abort. Line released. Code : ", abortCode);
1265 MSG_WAR(0x3AA9,
"SD0. Received SDO abort. No line found. Code : ", abortCode);
1275 d->transfers[line].
state = SDO_ABORTED_RCV;
1276 d->transfers[line].
abortCode = abortCode;
1277 MSG_WAR(0x3AB0,
"SD0. Received SDO abort. Line state ABORTED. Code : ", abortCode);
1282 MSG_WAR(0x3AB1,
"SD0. Received SDO abort. No line found. Code : ", abortCode);
1289 if (whoami == SDO_SERVER)
1293 numberOfIndexes = m->
data[4];
1299 MSG_ERR(0x1A92,
"SDO error : Transmission yet started at line : ", line);
1300 MSG_WAR(0x3A93,
"nodeId = ", nodeId);
1301 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
1309 MSG_ERR(0x1A71,
"SDO error : No line free, too many SDO in progress. Aborted.", 0);
1310 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_LOCAL_CTRL_ERROR);
1313 initSDOline(d, line, nodeId, index, subIndex, SDO_UPLOAD_IN_PROGRESS);
1320 MSG_ERR(0x1A94,
"SDO error : Unable to copy the data from object dictionary. Err code : ",
1322 failedSDO(d, nodeId, whoami, index, subIndex, errorCode);
1334 sdo.body.
data[0] = (2 << 5) | 1;
1335 sdo.body.
data[1] = index & 0xFF;
1336 sdo.body.
data[2] = (index >> 8) & 0xFF;
1337 sdo.body.
data[3] = subIndex;
1341 for (i = 5 ; i < 8 ; i++)
1342 sdo.body.
data[i] = 0;
1343 MSG_WAR(0x3A95,
"SDO. Sending normal upload initiate response defined at index 0x1200 + ", nodeId);
1349 sdo.body.
data[0] = (
UNS8)((2 << 5) | ((4 - nbBytes) << 2) | 3);
1350 sdo.body.
data[1] = index & 0xFF;
1351 sdo.body.
data[2] = (index >> 8) & 0xFF;
1352 sdo.body.
data[3] = subIndex;
1355 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1358 for (i = 4 + nbBytes ; i < 8 ; i++)
1359 sdo.body.
data[i] = 0;
1360 MSG_WAR(0x3A96,
"SDO. Sending expedited upload initiate response defined at index 0x1200 + ",
1374 err = d->transfers[line].
state != SDO_UPLOAD_IN_PROGRESS;
1376 MSG_ERR(0x1A97,
"SDO error : Received response for unknown upload request from nodeId", nodeId);
1377 failedSDO(d, nodeId, whoami, 0, 0, SDOABT_LOCAL_CTRL_ERROR);
1381 RestartSDO_TIMER(line)
1382 index = d->transfers[line].index;
1383 subIndex = d->transfers[line].subIndex;
1389 err =
SDOtoLine(d, line, nbBytes, (*m).data + 4);
1391 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1395 MSG_WAR(0x3A98,
"SDO expedited upload finished. Response received from node : ", nodeId);
1397 d->transfers[line].
count = nbBytes;
1398 d->transfers[line].
state = SDO_FINISHED;
1409 failedSDO(d, nodeId, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
1415 sdo.body.
data[0] = 3 << 5;
1416 for (i = 1 ; i < 8 ; i++)
1417 sdo.body.
data[i] = 0;
1418 MSG_WAR(0x3A99,
"SDO. Sending upload segment request to node : ", nodeId);