24#include "canfestival.h"
33#define getLSSIdent(msg) (((UNS32)msg->data[4] << 24) | ((UNS32)msg->data[3] << 16) | (msg->data[2] << 8) | (msg->data[1]))
37#define getLSSDelay(msg) ((msg->data[2] << 8) | (msg->data[1]))
40#define getLSSBitCheck(msg) msg->data[5]
43#define getLSSSub(msg) msg->data[6]
46#define getLSSNext(msg) msg->data[7]
49UNS8 sendMasterLSSMessage(
CO_Data* d,
UNS8 command,
void *dat1,
void *dat2);
54#define StopLSS_MSG_TIMER(){\
55 MSG_WAR(0x3D01, "StopLSS_MSG_TIMER", 0);\
56 d->lss_transfer.timerMSG = DelAlarm(d->lss_transfer.timerMSG);}
58#define StartLSS_MSG_TIMER(){\
59 MSG_WAR(0x3D02, "StartLSS_MSG_TIMER",0);\
60 d->lss_transfer.timerMSG = SetAlarm(d,0,&LssAlarmMSG,MS_TO_TIMEVAL(LSS_TIMEOUT_MS),0);}
62#define StopLSS_SDELAY_TIMER(){\
63 MSG_WAR(0x3D03, "StopLSS_SDELAY_TIMER", 0);\
64 d->lss_transfer.timerSDELAY = DelAlarm(d->lss_transfer.timerSDELAY);}
66#define StartLSS_SDELAY_TIMER(){\
67 MSG_WAR(0x3D04, "StartLSS_SDELAY_TIMER",0);\
68 d->lss_transfer.timerSDELAY= SetAlarm(d,0,&LssAlarmSDELAY,MS_TO_TIMEVAL(d->lss_transfer.switchDelay),MS_TO_TIMEVAL(d->lss_transfer.switchDelay));}
71#ifdef CO_ENABLE_LSS_FS
75#define StopLSS_FS_TIMER(){\
76 MSG_WAR(0x3D05, "StopLSS_FS_TIMER", id);\
77 d->lss_transfer.timerFS = DelAlarm(d->lss_transfer.timerFS);}
79#define StartLSS_FS_TIMER(){\
80 MSG_WAR(0x3D06, "StartLSS_FS_TIMER",0);\
81 d->lss_transfer.timerFS = SetAlarm(d,0,&LssAlarmFS,MS_TO_TIMEVAL(LSS_FS_TIMEOUT_MS),0);}
88#ifdef CO_ENABLE_LSS_FS
89 if(d->lss_transfer.command==LSS_IDENT_FASTSCAN){
90 if(d->lss_transfer.FastScan_SM==LSS_FS_RESET){
92 if(d->lss_transfer.LSSanswer!=0){
93 UNS32 Mask=0xFFFFFFFF;
94 d->lss_transfer.LSSanswer=0;
95 d->lss_transfer.BitChecked=d->lss_transfer.lss_fs_transfer.FS_BitChecked[0];
96 Mask=(
UNS32)((
UNS64)Mask<<(d->lss_transfer.BitChecked+1));
97 d->lss_transfer.IDNumber=d->lss_transfer.lss_fs_transfer.FS_LSS_ID[0] & Mask;
98 d->lss_transfer.FastScan_SM=LSS_FS_PROCESSING;
101 sendMasterLSSMessage(d,LSS_IDENT_FASTSCAN,0,0);
106 d->lss_transfer.state = LSS_FINISHED;
108 d->lss_transfer.dat1=1;
113 MSG_ERR(0x1D07,
"LSS FastScan timeout. FastScan_SM inconsisten state.", d->lss_transfer.FastScan_SM);
114 d->lss_transfer.state = LSS_ABORTED_INTERNAL;
115 d->lss_transfer.FastScan_SM=LSS_FS_RESET;
120 if(d->lss_transfer.command==LSS_IDENT_REMOTE_NON_CONF){
121 MSG_WAR(0x2D08,
"LSS timeout. There are not no-configured slaves in the net", 0);
122 d->lss_transfer.state = LSS_FINISHED;
123 d->lss_transfer.dat1=1;
126 MSG_ERR(0x1D09,
"LSS timeout. LSS response not received.", 0);
127 MSG_WAR(0x2D0A,
"LSS timeout command specifier : ", d->lss_transfer.command);
129 d->lss_transfer.state = LSS_ABORTED_INTERNAL;
130#ifdef CO_ENABLE_LSS_FS
131 d->lss_transfer.FastScan_SM = LSS_FS_RESET;
136 if(d->lss_transfer.Callback){
138 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
154 if(d->lss_transfer.switchDelayState==SDELAY_FIRST){
155 MSG_WAR(0x3D0B,
"LSS switch delay first period expired",0);
156 d->lss_transfer.switchDelayState=SDELAY_SECOND;
158 canChangeBaudRate(d->lss_transfer.canHandle_t, d->lss_transfer.baudRate);
161 MSG_WAR(0x3D0C,
"LSS switch delay second period expired",0);
162 d->lss_transfer.switchDelayState=SDELAY_OFF;
163 StopLSS_SDELAY_TIMER();
165 if (*(d->iam_a_slave))
166 d->canHandle=d->lss_transfer.canHandle_t;
168 d->lss_transfer.dat1=0;
169 d->lss_transfer.state=LSS_FINISHED;
171 if(d->lss_transfer.Callback){
172 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
178#ifdef CO_ENABLE_LSS_FS
189 switch(d->lss_transfer.FastScan_SM){
193 MSG_ERR(0x1D0D,
"LSS FastScan timeout. FastScan_SM inconsisten state.", d->lss_transfer.FastScan_SM);
196 case LSS_FS_PROCESSING:
199 if(d->lss_transfer.LSSanswer==0){
201 Mask<<=d->lss_transfer.BitChecked;
202 d->lss_transfer.IDNumber|=Mask;
205 if(d->lss_transfer.BitChecked==0){
207 d->lss_transfer.FastScan_SM=LSS_FS_CONFIRMATION;
208 if(d->lss_transfer.LSSNext<3)d->lss_transfer.LSSNext++;
211 d->lss_transfer.BitChecked--;
214 d->lss_transfer.LSSanswer=0;
216 sendMasterLSSMessage(d,LSS_IDENT_FASTSCAN,0,0);
220 case LSS_FS_CONFIRMATION:
222 if(d->lss_transfer.LSSanswer!=0){
223 d->lss_transfer.LSSanswer=0;
225 if(d->lss_transfer.LSSSub==3){
227 d->lss_transfer.BitChecked=128;
228 d->lss_transfer.FastScan_SM=LSS_FS_RESET;
229 d->lss_transfer.LSSSub=0;
230 d->lss_transfer.LSSNext=0;
231 d->lss_transfer.IDNumber=0;
234 d->lss_transfer.state = LSS_FINISHED;
235 d->lss_transfer.dat1=0;
238 UNS32 Mask=0xFFFFFFFF;
240 d->lss_transfer.LSSSub++;
241 d->lss_transfer.BitChecked=d->lss_transfer.lss_fs_transfer.FS_BitChecked[d->lss_transfer.LSSSub];
242 Mask=(
UNS32)((
UNS64)Mask<<(d->lss_transfer.BitChecked+1));
243 d->lss_transfer.IDNumber=d->lss_transfer.lss_fs_transfer.FS_LSS_ID[d->lss_transfer.LSSSub] & Mask;
244 d->lss_transfer.FastScan_SM=LSS_FS_PROCESSING;
247 sendMasterLSSMessage(d,LSS_IDENT_FASTSCAN,0,0);
253 MSG_ERR(0x1D0E,
"LSS FastScan timeout. FastScan response not received.", 0);
254 MSG_ERR(0x1D0E,
"There is not any node with LSS_ID# =>", d->lss_transfer.LSSSub);
255 MSG_ERR(0x1D0E,
"with the value =>", d->lss_transfer.IDNumber);
257 d->lss_transfer.state = LSS_ABORTED_INTERNAL;
258 d->lss_transfer.FastScan_SM = LSS_FS_RESET;
265 if(d->lss_transfer.Callback){
267 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
301UNS8 sendSlaveLSSMessage(
CO_Data* d,
UNS8 command,
void *dat1,
void *dat2)
306 if (!d->CurrentCommunicationState.csLSS){
307 MSG_WAR(0x2D17,
"unable to send the LSS message, not in the proper state =>", d->nodeState);
311 for(i=1;i<8;i++)m.
data[i]=0;
313 m.
rtr = NOT_A_REQUEST;
315 m.
cob_id=UNS16_LE(SLSS_ADRESS);
319 case LSS_INQ_NODE_ID:
322 case LSS_CONF_NODE_ID:
323 case LSS_CONF_BIT_TIMING:
328 case LSS_INQ_VENDOR_ID:
329 case LSS_INQ_PRODUCT_CODE:
330 case LSS_INQ_REV_NUMBER:
331 case LSS_INQ_SERIAL_NUMBER:
337 case LSS_SM_SELECTIVE_RESP:
338 case LSS_IDENT_SLAVE:
339 case LSS_IDENT_NON_CONF_SLAVE:
342 MSG_ERR(0x1D18,
"send Slave LSS command not implemented", command);
346 return canSend(d->canHandle, &m);
350static UNS8 CO_TranslateBaudRate(
char* optarg){
356 if(!strcmp( optarg,
"100K"))
return 0x05;
371UNS8 sendMasterLSSMessage(
CO_Data* d,
UNS8 command,
void *dat1,
void *dat2)
378 for(i=1;i<8;i++)m.
data[i]=0;
380 m.
rtr = NOT_A_REQUEST;
382 m.
cob_id=UNS16_LE(MLSS_ADRESS);
386 case LSS_CONF_NODE_ID:
391 case LSS_CONF_BIT_TIMING:
394 d->lss_transfer.baudRate=*(
char **)dat2;
396 if((m.
data[2]=CO_TranslateBaudRate(d->lss_transfer.baudRate))!=0xFF){
401 MSG_ERR(0x1D19,
"Master-> Baud rate not supported",0);
402 d->lss_transfer.dat1=0xFF;
410 d->lss_transfer.dat2=0;
412 if(d->lss_transfer.Callback)
413 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
416 case LSS_CONF_ACT_BIT_TIMING:
419 if(d->lss_transfer.baudRate!=
"none"){
420 d->lss_transfer.switchDelay=(
UNS16)(*(
UNS32*)dat1 & 0xFFFF);
421 d->lss_transfer.switchDelayState=SDELAY_FIRST;
422 d->lss_transfer.canHandle_t=d->canHandle;
423 res=canSend(d->canHandle,&m);
425 StartLSS_SDELAY_TIMER();
426 d->lss_transfer.state=LSS_TRANS_IN_PROGRESS;
431 MSG_ERR(0x1D1B,
"Master-> Baud rate not specified",0);
432 d->lss_transfer.dat1=1;
434 if(d->lss_transfer.Callback){
435 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
440 case LSS_SM_SELECTIVE_SERIAL:
441 case LSS_IDENT_REMOTE_SERIAL_HIGH:
443 case LSS_SM_SELECTIVE_VENDOR:
444 case LSS_SM_SELECTIVE_PRODUCT:
445 case LSS_SM_SELECTIVE_REVISION:
446 case LSS_IDENT_REMOTE_VENDOR:
447 case LSS_IDENT_REMOTE_PRODUCT:
448 case LSS_IDENT_REMOTE_REV_LOW:
449 case LSS_IDENT_REMOTE_REV_HIGH:
450 case LSS_IDENT_REMOTE_SERIAL_LOW:
458 case LSS_IDENT_REMOTE_NON_CONF:
459 case LSS_INQ_VENDOR_ID:
460 case LSS_INQ_PRODUCT_CODE:
461 case LSS_INQ_REV_NUMBER:
462 case LSS_INQ_SERIAL_NUMBER:
463 case LSS_INQ_NODE_ID:
466#ifdef CO_ENABLE_LSS_FS
467 case LSS_IDENT_FASTSCAN:
468 if(d->lss_transfer.FastScan_SM==LSS_FS_RESET){
472 d->lss_transfer.lss_fs_transfer.FS_LSS_ID[i]=(*(lss_fs_transfer_t*)dat1).FS_LSS_ID[i];
473 d->lss_transfer.lss_fs_transfer.FS_BitChecked[i]=(*(lss_fs_transfer_t*)dat1).FS_BitChecked[i];
475 if(d->lss_transfer.lss_fs_transfer.FS_BitChecked[i]>0)d->lss_transfer.lss_fs_transfer.FS_BitChecked[i]--;
478 d->lss_transfer.IDNumber=0;
479 d->lss_transfer.BitChecked=128;
480 d->lss_transfer.LSSSub=0;
481 d->lss_transfer.LSSNext=0;
486 m.
data[1]=(
UNS8)(d->lss_transfer.IDNumber & 0xFF);
487 m.
data[2]=(
UNS8)(d->lss_transfer.IDNumber>>8 & 0xFF);
488 m.
data[3]=(
UNS8)(d->lss_transfer.IDNumber>>16 & 0xFF);
489 m.
data[4]=(
UNS8)(d->lss_transfer.IDNumber>>24 & 0xFF);
490 m.
data[5]=d->lss_transfer.BitChecked;
491 m.
data[6]=d->lss_transfer.LSSSub;
492 m.
data[7]=d->lss_transfer.LSSNext;
496 MSG_ERR(0x1D1C,
"send Master LSS command not implemented", command);
500 res=canSend(d->canHandle,&m);
501 if(res==0 && hasResponse==1){
502 StartLSS_MSG_TIMER();
503 d->lss_transfer.state=LSS_TRANS_IN_PROGRESS;
522 if (*(d->iam_a_slave)){
523 res = sendSlaveLSSMessage(d, command,dat1,dat2);
526 res = sendMasterLSSMessage(d, command,dat1,dat2);
547 if(d->lss_transfer.state!=LSS_TRANS_IN_PROGRESS)
551 goto ErrorProcessMaster;
554 MSG_WAR(0x3D1E,
"MasterLSS proceedLSS; command ", m->
data[0]);
556 switch(msg_cs=m->
data[0]){
557 case LSS_INQ_NODE_ID:
558 if(d->lss_transfer.command!=LSS_INQ_NODE_ID)
goto ErrorProcessMaster;
561 case LSS_CONF_NODE_ID:
562 case LSS_CONF_BIT_TIMING:
564 if(d->lss_transfer.command!=msg_cs)
goto ErrorProcessMaster;
568 case LSS_INQ_VENDOR_ID:
569 case LSS_INQ_PRODUCT_CODE:
570 case LSS_INQ_REV_NUMBER:
571 case LSS_INQ_SERIAL_NUMBER:
572 if(d->lss_transfer.command!=msg_cs)
goto ErrorProcessMaster;
575 case LSS_IDENT_SLAVE:
576#ifdef CO_ENABLE_LSS_FS
577 if(d->lss_transfer.command==LSS_IDENT_FASTSCAN){
579 d->lss_transfer.LSSanswer=1;
584 if(d->lss_transfer.command!=LSS_IDENT_REMOTE_VENDOR && \
585 d->lss_transfer.command!=LSS_IDENT_REMOTE_PRODUCT && \
586 d->lss_transfer.command!=LSS_IDENT_REMOTE_REV_LOW && \
587 d->lss_transfer.command!=LSS_IDENT_REMOTE_REV_HIGH && \
588 d->lss_transfer.command!=LSS_IDENT_REMOTE_SERIAL_LOW && \
589 d->lss_transfer.command!=LSS_IDENT_REMOTE_SERIAL_HIGH )
590 goto ErrorProcessMaster;
592 case LSS_SM_SELECTIVE_RESP:
593 if(d->lss_transfer.command!=LSS_SM_SELECTIVE_VENDOR && \
594 d->lss_transfer.command!=LSS_SM_SELECTIVE_PRODUCT && \
595 d->lss_transfer.command!=LSS_SM_SELECTIVE_REVISION && \
596 d->lss_transfer.command!=LSS_SM_SELECTIVE_SERIAL )
597 goto ErrorProcessMaster;
599 case LSS_IDENT_NON_CONF_SLAVE:
600 if(d->lss_transfer.command!=LSS_IDENT_REMOTE_NON_CONF)
goto ErrorProcessMaster;
603 MSG_ERR(0x1D1F,
"Master LSS command not implemented", msg_cs);
608 d->lss_transfer.state = LSS_FINISHED;
610 d->lss_transfer.dat1=Dat1;
611 d->lss_transfer.dat2=Dat2;
613 if(d->lss_transfer.Callback)
614 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
619 MSG_WAR(0x3D20,
"MasterLSS proceedLSS; unexpected message arrived;command ", m->
data[0]);
636 MSG_WAR(0x3D21,
"SlaveLSS proceedLSS; command ", m->
data[0]);
638 switch(msg_cs=m->
data[0]){
641 if(m->
data[1] == d->lss_transfer.mode){
642 MSG_WAR(0x3D22,
"SlaveLSS already in the mode ", m->
data[1]);
646 if(m->
data[1]==LSS_CONFIGURATION_MODE) {
647 MSG_WAR(0x3D23,
"SlaveLSS switching to configuration mode ", 0);
650 d->lss_transfer.mode=LSS_CONFIGURATION_MODE;
652 else if(m->
data[1]==LSS_WAITING_MODE){
653 MSG_WAR(0x3D24,
"SlaveLSS switching to operational mode ", 0);
656 if(d->lss_transfer.nodeID!=
getNodeId(d)){
658 MSG_WAR(0x3D25,
"The node Id has changed. Reseting to Initialisation state",0);
665 d->lss_transfer.mode=LSS_WAITING_MODE;
668 case LSS_CONF_NODE_ID:
673 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE){
674 if(m->
data[1]>127 && m->
data[1]!=0xFF){
675 MSG_ERR(0x1D26,
"NodeID out of range",0);
679 d->lss_transfer.nodeID=m->
data[1];
683 MSG_WAR(0x3D27,
"SlaveLSS not in configuration mode",0);
687 sendSlaveLSSMessage(d,msg_cs,&error_code,&spec_error);
690 case LSS_CONF_BIT_TIMING:
695 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE){
698 case 0x00:d->lss_transfer.baudRate=
"1M";
break;
699 case 0x01:d->lss_transfer.baudRate=
"800K";
break;
700 case 0x02:d->lss_transfer.baudRate=
"500K";
break;
701 case 0x03:d->lss_transfer.baudRate=
"250K";
break;
702 case 0x04:d->lss_transfer.baudRate=
"125K";
break;
703 case 0x05:d->lss_transfer.baudRate=
"100K";
break;
704 case 0x06:d->lss_transfer.baudRate=
"50K";
break;
705 case 0x07:d->lss_transfer.baudRate=
"20K";
break;
706 case 0x08:d->lss_transfer.baudRate=
"10K";
break;
708 MSG_ERR(0x1D28,
"Baud rate not supported",0);
714 MSG_WAR(0x3D2A,
"SlaveLSS not in configuration mode",0);
725 sendSlaveLSSMessage(d,msg_cs,&error_code,&spec_error);
728 case LSS_CONF_ACT_BIT_TIMING:
730 if(d->lss_transfer.mode!=LSS_CONFIGURATION_MODE){
731 MSG_ERR(0x3D2B,
"SlaveLSS not in configuration mode",0);
735 if(d->lss_transfer.baudRate!=
"none"){
736 d->lss_transfer.switchDelay=getLSSDelay(m);
737 MSG_WAR(0x3D2C,
"Slave Switch Delay set to: ",d->lss_transfer.switchDelay);
738 d->lss_transfer.switchDelayState=SDELAY_FIRST;
741 d->lss_transfer.canHandle_t=d->canHandle;
743 StartLSS_SDELAY_TIMER();
751 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE){
752 if(d->lss_StoreConfiguration){
754 (*d->lss_StoreConfiguration)(d,&error_code,&spec_error);
757 MSG_ERR(0x1D2E,
"Store configuration not supported",0);
762 MSG_WAR(0x3D2F,
"SlaveLSS not in configuration mode",0);
766 sendSlaveLSSMessage(d,msg_cs,&error_code,&spec_error);
769 case LSS_SM_SELECTIVE_VENDOR:
770 case LSS_SM_SELECTIVE_PRODUCT:
771 case LSS_SM_SELECTIVE_REVISION:
772 case LSS_SM_SELECTIVE_SERIAL:
776 ODCallback_t *Callback;
777 UNS32 _SpecificNodeInfo;
779 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE)
781 MSG_ERR(0x1D30,
"Switch Mode Selective only supported in operational mode",0);
785 _SpecificNodeInfo=getLSSIdent(m);
787 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
788 if(_SpecificNodeInfo==*(
UNS32*)ptrTable->pSubindex[msg_cs-(LSS_SM_SELECTIVE_VENDOR-1)].pObject){
790 d->lss_transfer.addr_sel_match|=(0x01<<(msg_cs-LSS_SM_SELECTIVE_VENDOR));
792 if(d->lss_transfer.addr_sel_match==0x0F){
794 MSG_WAR(0x3D31,
"SlaveLSS switching to configuration mode ", 0);
795 d->lss_transfer.addr_sel_match=0;
797 d->lss_transfer.mode=LSS_CONFIGURATION_MODE;
799 sendSlaveLSSMessage(d,LSS_SM_SELECTIVE_RESP,0,0);
803 MSG_WAR(0x3D32,
"LSS identity field doesn't match ", _SpecificNodeInfo);
804 d->lss_transfer.addr_sel_match=0;
808 case LSS_IDENT_REMOTE_VENDOR:
809 case LSS_IDENT_REMOTE_PRODUCT:
810 case LSS_IDENT_REMOTE_REV_LOW:
811 case LSS_IDENT_REMOTE_REV_HIGH:
812 case LSS_IDENT_REMOTE_SERIAL_LOW:
813 case LSS_IDENT_REMOTE_SERIAL_HIGH:
817 ODCallback_t *Callback;
818 UNS32 _SpecificNodeInfo;
820 _SpecificNodeInfo=getLSSIdent(m);
822 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
826 case LSS_IDENT_REMOTE_VENDOR:d->lss_transfer.addr_ident_match=(_SpecificNodeInfo == *(
UNS32*)ptrTable->pSubindex[1].pObject)? d->lss_transfer.addr_ident_match|0x01:0;
break;
827 case LSS_IDENT_REMOTE_PRODUCT:d->lss_transfer.addr_ident_match=(_SpecificNodeInfo == *(
UNS32*)ptrTable->pSubindex[2].pObject)? d->lss_transfer.addr_ident_match|0x02:0;
break;
828 case LSS_IDENT_REMOTE_REV_LOW:d->lss_transfer.addr_ident_match=(_SpecificNodeInfo <= *(
UNS32*)ptrTable->pSubindex[3].pObject)? d->lss_transfer.addr_ident_match|0x04:0;
break;
829 case LSS_IDENT_REMOTE_REV_HIGH:d->lss_transfer.addr_ident_match=(_SpecificNodeInfo >= *(
UNS32*)ptrTable->pSubindex[3].pObject)? d->lss_transfer.addr_ident_match|0x08:0;
break;
830 case LSS_IDENT_REMOTE_SERIAL_LOW:d->lss_transfer.addr_ident_match=(_SpecificNodeInfo <= *(
UNS32*)ptrTable->pSubindex[4].pObject)? d->lss_transfer.addr_ident_match|0x10:0;
break;
831 case LSS_IDENT_REMOTE_SERIAL_HIGH:d->lss_transfer.addr_ident_match=(_SpecificNodeInfo >= *(
UNS32*)ptrTable->pSubindex[4].pObject)? d->lss_transfer.addr_ident_match|0x20:0;
break;
834 if(d->lss_transfer.addr_ident_match==0x3F){
835 MSG_WAR(0x3D33,
"SlaveLSS identified ", 0);
836 d->lss_transfer.addr_ident_match=0;
837 sendSlaveLSSMessage(d,LSS_IDENT_SLAVE,0,0);
839 else if(d->lss_transfer.addr_ident_match==0){
840 MSG_WAR(0x3D34,
"LSS identify field doesn't match ", _SpecificNodeInfo);
844 case LSS_IDENT_REMOTE_NON_CONF:
847 MSG_WAR(0x3D35,
"SlaveLSS non-configured ", 0);
848 sendSlaveLSSMessage(d,LSS_IDENT_NON_CONF_SLAVE,0,0);
851 MSG_WAR(0x3D36,
"SlaveLSS already configured ", 0);
855 case LSS_INQ_VENDOR_ID:
856 case LSS_INQ_PRODUCT_CODE:
857 case LSS_INQ_REV_NUMBER:
858 case LSS_INQ_SERIAL_NUMBER:
859 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE)
864 ODCallback_t *Callback;
865 UNS32 _SpecificNodeInfo;
867 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
868 _SpecificNodeInfo=*(
UNS32*)ptrTable->pSubindex[msg_cs-(LSS_INQ_VENDOR_ID-1)].pObject;
869 MSG_WAR(0x3D37,
"SlaveLSS identity field inquired ", _SpecificNodeInfo);
871 sendSlaveLSSMessage(d,msg_cs,&_SpecificNodeInfo,0);
874 case LSS_INQ_NODE_ID:
875 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE)
880 MSG_WAR(0x3D38,
"SlaveLSS Node ID inquired ", NodeID);
881 sendSlaveLSSMessage(d,msg_cs,&NodeID,0);
884 MSG_WAR(0x3D39,
"SlaveLSS not in configuration mode",0);
887#ifdef CO_ENABLE_LSS_FS
888 case LSS_IDENT_FASTSCAN:
892 if(getLSSBitCheck(m)==128)d->lss_transfer.FastScan_SM=LSS_FS_RESET;
894 switch(d->lss_transfer.FastScan_SM){
899 ODCallback_t *Callback;
901 MSG_WAR(0x3D3A,
"SlaveLSS Reseting LSSPos", 0);
902 d->lss_transfer.LSSPos=0;
903 d->lss_transfer.FastScan_SM=LSS_FS_PROCESSING;
905 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
906 d->lss_transfer.IDNumber=*(
UNS32*)ptrTable->pSubindex[d->lss_transfer.LSSPos+1].pObject;
908 sendSlaveLSSMessage(d,LSS_IDENT_SLAVE,0,0);
911 case LSS_FS_PROCESSING:
912 if(d->lss_transfer.LSSPos==getLSSSub(m))
914 UNS32 Mask=0xFFFFFFFF<<getLSSBitCheck(m);
916 MSG_WAR(0x3D3B,
"SlaveLSS FastScan IDNumber", getLSSIdent(m));
917 MSG_WAR(0x3D3C,
"SlaveLSS FastScan BitMask ", Mask);
918 MSG_WAR(0x3D3D,
"SlaveLSS FastScan LSS-ID ", d->lss_transfer.IDNumber);
920 if((getLSSIdent(m) & Mask)==(d->lss_transfer.IDNumber & Mask))
922 sendSlaveLSSMessage(d,LSS_IDENT_SLAVE,0,0);
925 if(getLSSBitCheck(m)==0)
927 d->lss_transfer.FastScan_SM=LSS_FS_CONFIRMATION;
931 case LSS_FS_CONFIRMATION:
932 if(d->lss_transfer.LSSPos==getLSSSub(m))
934 if(getLSSIdent(m)==d->lss_transfer.IDNumber)
937 MSG_WAR(0x3D3E,
"SlaveLSS FastScan IDNumber and LSS-ID match=>", d->lss_transfer.IDNumber);
938 if(d->lss_transfer.LSSPos==3)
941 MSG_WAR(0x3D3F,
"SlaveLSS switching to configuration mode ", 0);
943 d->lss_transfer.mode=LSS_CONFIGURATION_MODE;
944 d->lss_transfer.FastScan_SM=LSS_FS_RESET;
945 d->lss_transfer.LSSPos=0xFF;
952 ODCallback_t *Callback;
954 d->lss_transfer.LSSPos=getLSSNext(m);
955 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
956 d->lss_transfer.IDNumber=*(
UNS32*)ptrTable->pSubindex[d->lss_transfer.LSSPos+1].pObject;
957 d->lss_transfer.FastScan_SM=LSS_FS_PROCESSING;
959 sendSlaveLSSMessage(d,LSS_IDENT_SLAVE,0,0);
968 MSG_ERR(0x1D40,
"SlaveLSS command not implemented", msg_cs);
998UNS8 configNetworkNode (
CO_Data* d,
UNS8 command,
void *dat1,
void* dat2, LSSCallback_t Callback)
1001 d->lss_transfer.Callback=Callback;
1002 d->lss_transfer.command=command;
1004 StopLSS_MSG_TIMER();
1007 return sendMasterLSSMessage(d,command,dat1,dat2);
1032 *dat1=d->lss_transfer.dat1;
1033 *dat2=d->lss_transfer.dat2;
1034 return d->lss_transfer.state;
#define UNS8
Unsigned int8 representation in CANFest.
#define UNS16
Unsigned int16 representation in CANFest.
#define UNS64
Unsigned int64 representation in CANFest.
#define MSG_WAR(num, str, val)
Definition of MSG_WAR.
#define UNS32
Unsigned int32 representation in CANFest.
#define MSG_ERR(num, str, val)
Definition of MSG_ERR.
UNS8 setState(CO_Data *d, e_nodeState newState)
Change the state of the node.
UNS8 getNodeId(CO_Data *d)
Returns the nodId.
void setNodeId(CO_Data *d, UNS8 nodeId)
Define the node ID. Initialize the object dictionary.
This structure contains all necessary informations to define a CANOpen node.