Can_open_masternode

Dependencies:   mbed

Committer:
sam_grove
Date:
Wed Sep 26 05:48:14 2012 +0000
Revision:
7:537bae5a6fc6
Parent:
0:9dd7c6129683
Pushing the project into the new repo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:9dd7c6129683 1 /*
sam_grove 0:9dd7c6129683 2 This file is part of CanFestival, a library implementing CanOpen Stack.
sam_grove 0:9dd7c6129683 3
sam_grove 0:9dd7c6129683 4
sam_grove 0:9dd7c6129683 5 Copyright (C): Jorge Berzosa
sam_grove 0:9dd7c6129683 6
sam_grove 0:9dd7c6129683 7
sam_grove 0:9dd7c6129683 8 See COPYING file for copyrights details.
sam_grove 0:9dd7c6129683 9
sam_grove 0:9dd7c6129683 10
sam_grove 0:9dd7c6129683 11 This library is free software; you can redistribute it and/or
sam_grove 0:9dd7c6129683 12 modify it under the terms of the GNU Lesser General Public
sam_grove 0:9dd7c6129683 13 License as published by the Free Software Foundation; either
sam_grove 0:9dd7c6129683 14 version 2.1 of the License, or (at your option) any later version.
sam_grove 0:9dd7c6129683 15
sam_grove 0:9dd7c6129683 16
sam_grove 0:9dd7c6129683 17 This library is distributed in the hope that it will be useful,
sam_grove 0:9dd7c6129683 18 but WITHOUT ANY WARRANTY; without even the implied warranty of
sam_grove 0:9dd7c6129683 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
sam_grove 0:9dd7c6129683 20 Lesser General Public License for more details.
sam_grove 0:9dd7c6129683 21
sam_grove 0:9dd7c6129683 22
sam_grove 0:9dd7c6129683 23 You should have received a copy of the GNU Lesser General Public
sam_grove 0:9dd7c6129683 24 License along with this library; if not, write to the Free Software
sam_grove 0:9dd7c6129683 25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
sam_grove 0:9dd7c6129683 26 */
sam_grove 0:9dd7c6129683 27
sam_grove 0:9dd7c6129683 28
sam_grove 0:9dd7c6129683 29 /*!
sam_grove 0:9dd7c6129683 30 ** @file lss.c
sam_grove 0:9dd7c6129683 31 ** @author Jorge Berzosa
sam_grove 0:9dd7c6129683 32 ** @date Mon Oct 22 05:44:32 2007
sam_grove 0:9dd7c6129683 33 **
sam_grove 0:9dd7c6129683 34 ** @brief
sam_grove 0:9dd7c6129683 35 **
sam_grove 0:9dd7c6129683 36 **
sam_grove 0:9dd7c6129683 37 */
sam_grove 0:9dd7c6129683 38
sam_grove 0:9dd7c6129683 39
sam_grove 0:9dd7c6129683 40 #include "data.h"
sam_grove 0:9dd7c6129683 41 #include "lss.h"
sam_grove 0:9dd7c6129683 42 #include "canfestival.h"
sam_grove 0:9dd7c6129683 43 #include "sysdep.h"
sam_grove 0:9dd7c6129683 44
sam_grove 0:9dd7c6129683 45 #ifdef CO_ENABLE_LSS
sam_grove 0:9dd7c6129683 46
sam_grove 0:9dd7c6129683 47 //#define LSS_TIMEOUT_MS (TIMEVAL)1000 /* ms */
sam_grove 0:9dd7c6129683 48 //#define LSS_FS_TIMEOUT_MS (TIMEVAL)100 /* ms */
sam_grove 0:9dd7c6129683 49
sam_grove 0:9dd7c6129683 50 /* Returns the LSS ident field from a Message struct */
sam_grove 0:9dd7c6129683 51 #define getLSSIdent(msg) (((UNS32)msg->data[4] << 24) | ((UNS32)msg->data[3] << 16) | (msg->data[2] << 8) | (msg->data[1]))
sam_grove 0:9dd7c6129683 52
sam_grove 0:9dd7c6129683 53
sam_grove 0:9dd7c6129683 54 /* Returns the LSS switch delay field from a Message struct */
sam_grove 0:9dd7c6129683 55 #define getLSSDelay(msg) ((msg->data[2] << 8) | (msg->data[1]))
sam_grove 0:9dd7c6129683 56
sam_grove 0:9dd7c6129683 57 /* Returns the LSS FastScan BitCheck field from a Message struct */
sam_grove 0:9dd7c6129683 58 #define getLSSBitCheck(msg) msg->data[5]
sam_grove 0:9dd7c6129683 59
sam_grove 0:9dd7c6129683 60 /* Returns the LSS FastScan LSSSub field from a Message struct */
sam_grove 0:9dd7c6129683 61 #define getLSSSub(msg) msg->data[6]
sam_grove 0:9dd7c6129683 62
sam_grove 0:9dd7c6129683 63 /* Returns the LSS FastScan LSSNext field from a Message struct */
sam_grove 0:9dd7c6129683 64 #define getLSSNext(msg) msg->data[7]
sam_grove 0:9dd7c6129683 65
sam_grove 0:9dd7c6129683 66 /* Prototypes for internals functions */
sam_grove 0:9dd7c6129683 67 UNS8 sendMasterLSSMessage(CO_Data* d, UNS8 command,void *dat1,void *dat2);
sam_grove 0:9dd7c6129683 68 void LssAlarmMSG(CO_Data* d, UNS32 id);
sam_grove 0:9dd7c6129683 69 void LssAlarmSDELAY(CO_Data* d, UNS32 id);
sam_grove 0:9dd7c6129683 70
sam_grove 0:9dd7c6129683 71
sam_grove 0:9dd7c6129683 72 #define StopLSS_MSG_TIMER(){\
sam_grove 0:9dd7c6129683 73 MSG_WAR(0x3D01, "StopLSS_MSG_TIMER", 0);\
sam_grove 0:9dd7c6129683 74 d->lss_transfer.timerMSG = DelAlarm(d->lss_transfer.timerMSG);}
sam_grove 0:9dd7c6129683 75
sam_grove 0:9dd7c6129683 76 #define StartLSS_MSG_TIMER(){\
sam_grove 0:9dd7c6129683 77 MSG_WAR(0x3D02, "StartLSS_MSG_TIMER",0);\
sam_grove 0:9dd7c6129683 78 d->lss_transfer.timerMSG = SetAlarm(d,0,&LssAlarmMSG,MS_TO_TIMEVAL(LSS_TIMEOUT_MS),0);}
sam_grove 0:9dd7c6129683 79
sam_grove 0:9dd7c6129683 80 #define StopLSS_SDELAY_TIMER(){\
sam_grove 0:9dd7c6129683 81 MSG_WAR(0x3D03, "StopLSS_SDELAY_TIMER", 0);\
sam_grove 0:9dd7c6129683 82 d->lss_transfer.timerSDELAY = DelAlarm(d->lss_transfer.timerSDELAY);}
sam_grove 0:9dd7c6129683 83
sam_grove 0:9dd7c6129683 84 #define StartLSS_SDELAY_TIMER(){\
sam_grove 0:9dd7c6129683 85 MSG_WAR(0x3D04, "StartLSS_SDELAY_TIMER",0);\
sam_grove 0:9dd7c6129683 86 d->lss_transfer.timerSDELAY= SetAlarm(d,0,&LssAlarmSDELAY,MS_TO_TIMEVAL(d->lss_transfer.switchDelay),MS_TO_TIMEVAL(d->lss_transfer.switchDelay));}
sam_grove 0:9dd7c6129683 87
sam_grove 0:9dd7c6129683 88
sam_grove 0:9dd7c6129683 89 #ifdef CO_ENABLE_LSS_FS
sam_grove 0:9dd7c6129683 90 /* Prototypes for internals functions */
sam_grove 0:9dd7c6129683 91 void LssAlarmFS(CO_Data* d, UNS32 id);
sam_grove 0:9dd7c6129683 92
sam_grove 0:9dd7c6129683 93 #define StopLSS_FS_TIMER(){\
sam_grove 0:9dd7c6129683 94 MSG_WAR(0x3D05, "StopLSS_FS_TIMER", id);\
sam_grove 0:9dd7c6129683 95 d->lss_transfer.timerFS = DelAlarm(d->lss_transfer.timerFS);}
sam_grove 0:9dd7c6129683 96
sam_grove 0:9dd7c6129683 97 #define StartLSS_FS_TIMER(){\
sam_grove 0:9dd7c6129683 98 MSG_WAR(0x3D06, "StartLSS_FS_TIMER",0);\
sam_grove 0:9dd7c6129683 99 d->lss_transfer.timerFS = SetAlarm(d,0,&LssAlarmFS,MS_TO_TIMEVAL(LSS_FS_TIMEOUT_MS),0);}
sam_grove 0:9dd7c6129683 100 #endif
sam_grove 0:9dd7c6129683 101
sam_grove 0:9dd7c6129683 102
sam_grove 0:9dd7c6129683 103 void LssAlarmMSG(CO_Data* d, UNS32 id)
sam_grove 0:9dd7c6129683 104 {
sam_grove 0:9dd7c6129683 105 StopLSS_MSG_TIMER();
sam_grove 0:9dd7c6129683 106 #ifdef CO_ENABLE_LSS_FS
sam_grove 0:9dd7c6129683 107 if(d->lss_transfer.command==LSS_IDENT_FASTSCAN){
sam_grove 0:9dd7c6129683 108 if(d->lss_transfer.FastScan_SM==LSS_FS_RESET){
sam_grove 0:9dd7c6129683 109 /* if at least one node had answered before the timer expired, start the FastScan protocol*/
sam_grove 0:9dd7c6129683 110 if(d->lss_transfer.LSSanswer!=0){
sam_grove 0:9dd7c6129683 111 UNS32 Mask=0xFFFFFFFF;
sam_grove 0:9dd7c6129683 112 d->lss_transfer.LSSanswer=0;
sam_grove 0:9dd7c6129683 113 d->lss_transfer.BitChecked=d->lss_transfer.lss_fs_transfer.FS_BitChecked[0];
sam_grove 0:9dd7c6129683 114 Mask=(UNS32)((UNS64)Mask<<(d->lss_transfer.BitChecked+1));
sam_grove 0:9dd7c6129683 115 d->lss_transfer.IDNumber=d->lss_transfer.lss_fs_transfer.FS_LSS_ID[0] & Mask;
sam_grove 0:9dd7c6129683 116 d->lss_transfer.FastScan_SM=LSS_FS_PROCESSING;
sam_grove 0:9dd7c6129683 117 //printf("BitChecked=%d, IDNumber=%x MASK=%x\n",d->lss_transfer.BitChecked,d->lss_transfer.IDNumber,Mask);
sam_grove 0:9dd7c6129683 118 StartLSS_FS_TIMER();
sam_grove 0:9dd7c6129683 119 sendMasterLSSMessage(d,LSS_IDENT_FASTSCAN,0,0);
sam_grove 0:9dd7c6129683 120 return;
sam_grove 0:9dd7c6129683 121 }
sam_grove 0:9dd7c6129683 122 else{
sam_grove 0:9dd7c6129683 123
sam_grove 0:9dd7c6129683 124 d->lss_transfer.state = LSS_FINISHED;
sam_grove 0:9dd7c6129683 125 /* Inform the application that there aren't not configured nodes in the net */
sam_grove 0:9dd7c6129683 126 d->lss_transfer.dat1=1;
sam_grove 0:9dd7c6129683 127 }
sam_grove 0:9dd7c6129683 128 }
sam_grove 0:9dd7c6129683 129 else{
sam_grove 0:9dd7c6129683 130 /* This should not happen, an error ocurred*/
sam_grove 0:9dd7c6129683 131 MSG_ERR(0x1D07, "LSS FastScan timeout. FastScan_SM inconsisten state.", d->lss_transfer.FastScan_SM);
sam_grove 0:9dd7c6129683 132 d->lss_transfer.state = LSS_ABORTED_INTERNAL;
sam_grove 0:9dd7c6129683 133 d->lss_transfer.FastScan_SM=LSS_FS_RESET;
sam_grove 0:9dd7c6129683 134 }
sam_grove 0:9dd7c6129683 135 }
sam_grove 0:9dd7c6129683 136 else
sam_grove 0:9dd7c6129683 137 #endif
sam_grove 0:9dd7c6129683 138 if(d->lss_transfer.command==LSS_IDENT_REMOTE_NON_CONF){
sam_grove 0:9dd7c6129683 139 MSG_WAR(0x2D08, "LSS timeout. There are not no-configured slaves in the net", 0);
sam_grove 0:9dd7c6129683 140 d->lss_transfer.state = LSS_FINISHED;
sam_grove 0:9dd7c6129683 141 d->lss_transfer.dat1=1;
sam_grove 0:9dd7c6129683 142 }
sam_grove 0:9dd7c6129683 143 else{
sam_grove 0:9dd7c6129683 144 MSG_ERR(0x1D09, "LSS timeout. LSS response not received.", 0);
sam_grove 0:9dd7c6129683 145 MSG_WAR(0x2D0A, "LSS timeout command specifier : ", d->lss_transfer.command);
sam_grove 0:9dd7c6129683 146 /* Set aborted state */
sam_grove 0:9dd7c6129683 147 d->lss_transfer.state = LSS_ABORTED_INTERNAL;
sam_grove 0:9dd7c6129683 148 #ifdef CO_ENABLE_LSS_FS
sam_grove 0:9dd7c6129683 149 d->lss_transfer.FastScan_SM = LSS_FS_RESET;
sam_grove 0:9dd7c6129683 150 #endif
sam_grove 0:9dd7c6129683 151 }
sam_grove 0:9dd7c6129683 152
sam_grove 0:9dd7c6129683 153 /* Call the user function to inform of the problem.*/
sam_grove 0:9dd7c6129683 154 if(d->lss_transfer.Callback){
sam_grove 0:9dd7c6129683 155 /*If there is a callback, it is responsible of the error*/
sam_grove 0:9dd7c6129683 156 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
sam_grove 0:9dd7c6129683 157 }
sam_grove 0:9dd7c6129683 158 }
sam_grove 0:9dd7c6129683 159
sam_grove 0:9dd7c6129683 160
sam_grove 0:9dd7c6129683 161 /*!
sam_grove 0:9dd7c6129683 162 **
sam_grove 0:9dd7c6129683 163 **
sam_grove 0:9dd7c6129683 164 ** @param d
sam_grove 0:9dd7c6129683 165 ** @param id
sam_grove 0:9dd7c6129683 166 **/
sam_grove 0:9dd7c6129683 167 void LssAlarmSDELAY(CO_Data* d, UNS32 id)
sam_grove 0:9dd7c6129683 168 {
sam_grove 0:9dd7c6129683 169
sam_grove 0:9dd7c6129683 170 /* The first switch_delay period expired. Store the node state, change it
sam_grove 0:9dd7c6129683 171 * so no CAN messages will be sent or received, call the ChangeBaudRate function*/
sam_grove 0:9dd7c6129683 172 if(d->lss_transfer.switchDelayState==SDELAY_FIRST){
sam_grove 0:9dd7c6129683 173 MSG_WAR(0x3D0B, "LSS switch delay first period expired",0);
sam_grove 0:9dd7c6129683 174 d->lss_transfer.switchDelayState=SDELAY_SECOND;
sam_grove 0:9dd7c6129683 175 //(*d->lss_ChangeBaudRate)(d,d->lss_transfer.baudRate);
sam_grove 0:9dd7c6129683 176 canChangeBaudRate(d->lss_transfer.canHandle_t, d->lss_transfer.baudRate);
sam_grove 0:9dd7c6129683 177 }
sam_grove 0:9dd7c6129683 178 else{ /* d->lss_transfer.switchDelayState==SDELAY_SECOND */
sam_grove 0:9dd7c6129683 179 MSG_WAR(0x3D0C, "LSS switch delay second period expired",0);
sam_grove 0:9dd7c6129683 180 d->lss_transfer.switchDelayState=SDELAY_OFF;
sam_grove 0:9dd7c6129683 181 StopLSS_SDELAY_TIMER();
sam_grove 0:9dd7c6129683 182
sam_grove 0:9dd7c6129683 183 if (*(d->iam_a_slave))
sam_grove 0:9dd7c6129683 184 d->canHandle=d->lss_transfer.canHandle_t;
sam_grove 0:9dd7c6129683 185 else{
sam_grove 0:9dd7c6129683 186 d->lss_transfer.dat1=0;
sam_grove 0:9dd7c6129683 187 d->lss_transfer.state=LSS_FINISHED;
sam_grove 0:9dd7c6129683 188 /* Call the user function */
sam_grove 0:9dd7c6129683 189 if(d->lss_transfer.Callback){
sam_grove 0:9dd7c6129683 190 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
sam_grove 0:9dd7c6129683 191 }
sam_grove 0:9dd7c6129683 192 }
sam_grove 0:9dd7c6129683 193 }
sam_grove 0:9dd7c6129683 194 }
sam_grove 0:9dd7c6129683 195
sam_grove 0:9dd7c6129683 196 #ifdef CO_ENABLE_LSS_FS
sam_grove 0:9dd7c6129683 197 /*!
sam_grove 0:9dd7c6129683 198 **
sam_grove 0:9dd7c6129683 199 **
sam_grove 0:9dd7c6129683 200 ** @param d
sam_grove 0:9dd7c6129683 201 ** @param id
sam_grove 0:9dd7c6129683 202 **/
sam_grove 0:9dd7c6129683 203 void LssAlarmFS(CO_Data* d, UNS32 id)
sam_grove 0:9dd7c6129683 204 {
sam_grove 0:9dd7c6129683 205 StopLSS_FS_TIMER();
sam_grove 0:9dd7c6129683 206
sam_grove 0:9dd7c6129683 207 switch(d->lss_transfer.FastScan_SM){
sam_grove 0:9dd7c6129683 208 case LSS_FS_RESET:
sam_grove 0:9dd7c6129683 209 {
sam_grove 0:9dd7c6129683 210 /* This should not happen, an error ocurred*/
sam_grove 0:9dd7c6129683 211 MSG_ERR(0x1D0D, "LSS FastScan timeout. FastScan_SM inconsisten state.", d->lss_transfer.FastScan_SM);
sam_grove 0:9dd7c6129683 212 }
sam_grove 0:9dd7c6129683 213 break;
sam_grove 0:9dd7c6129683 214 case LSS_FS_PROCESSING:
sam_grove 0:9dd7c6129683 215 {
sam_grove 0:9dd7c6129683 216 /* If there isn't any answer, set the bit */
sam_grove 0:9dd7c6129683 217 if(d->lss_transfer.LSSanswer==0){
sam_grove 0:9dd7c6129683 218 UNS32 Mask=0x1;
sam_grove 0:9dd7c6129683 219 Mask<<=d->lss_transfer.BitChecked;
sam_grove 0:9dd7c6129683 220 d->lss_transfer.IDNumber|=Mask;
sam_grove 0:9dd7c6129683 221 }
sam_grove 0:9dd7c6129683 222
sam_grove 0:9dd7c6129683 223 if(d->lss_transfer.BitChecked==0){
sam_grove 0:9dd7c6129683 224 /* We finished with the current LSS-ID[sub], confirm it */
sam_grove 0:9dd7c6129683 225 d->lss_transfer.FastScan_SM=LSS_FS_CONFIRMATION;
sam_grove 0:9dd7c6129683 226 if(d->lss_transfer.LSSNext<3)d->lss_transfer.LSSNext++;
sam_grove 0:9dd7c6129683 227 }
sam_grove 0:9dd7c6129683 228 else{
sam_grove 0:9dd7c6129683 229 d->lss_transfer.BitChecked--;
sam_grove 0:9dd7c6129683 230 }
sam_grove 0:9dd7c6129683 231 //printf("BitChecked=%d, IDNumber=%x\n",d->lss_transfer.BitChecked,d->lss_transfer.IDNumber);
sam_grove 0:9dd7c6129683 232 d->lss_transfer.LSSanswer=0;
sam_grove 0:9dd7c6129683 233 StartLSS_FS_TIMER();
sam_grove 0:9dd7c6129683 234 sendMasterLSSMessage(d,LSS_IDENT_FASTSCAN,0,0);
sam_grove 0:9dd7c6129683 235 return;
sam_grove 0:9dd7c6129683 236 }
sam_grove 0:9dd7c6129683 237 break;
sam_grove 0:9dd7c6129683 238 case LSS_FS_CONFIRMATION:
sam_grove 0:9dd7c6129683 239 {
sam_grove 0:9dd7c6129683 240 if(d->lss_transfer.LSSanswer!=0){
sam_grove 0:9dd7c6129683 241 d->lss_transfer.LSSanswer=0;
sam_grove 0:9dd7c6129683 242
sam_grove 0:9dd7c6129683 243 if(d->lss_transfer.LSSSub==3){
sam_grove 0:9dd7c6129683 244 /* The LSS FastScan protocol finished correctly. Restore the parameters */
sam_grove 0:9dd7c6129683 245 d->lss_transfer.BitChecked=128;
sam_grove 0:9dd7c6129683 246 d->lss_transfer.FastScan_SM=LSS_FS_RESET;
sam_grove 0:9dd7c6129683 247 d->lss_transfer.LSSSub=0;
sam_grove 0:9dd7c6129683 248 d->lss_transfer.LSSNext=0;
sam_grove 0:9dd7c6129683 249 d->lss_transfer.IDNumber=0;
sam_grove 0:9dd7c6129683 250
sam_grove 0:9dd7c6129683 251 /* Inform the application that the FastScan finished correctly */
sam_grove 0:9dd7c6129683 252 d->lss_transfer.state = LSS_FINISHED;
sam_grove 0:9dd7c6129683 253 d->lss_transfer.dat1=0;
sam_grove 0:9dd7c6129683 254 }
sam_grove 0:9dd7c6129683 255 else{
sam_grove 0:9dd7c6129683 256 UNS32 Mask=0xFFFFFFFF;
sam_grove 0:9dd7c6129683 257 /* Start with the next LSS-ID[sub] */
sam_grove 0:9dd7c6129683 258 d->lss_transfer.LSSSub++;
sam_grove 0:9dd7c6129683 259 d->lss_transfer.BitChecked=d->lss_transfer.lss_fs_transfer.FS_BitChecked[d->lss_transfer.LSSSub];
sam_grove 0:9dd7c6129683 260 Mask=(UNS32)((UNS64)Mask<<(d->lss_transfer.BitChecked+1));
sam_grove 0:9dd7c6129683 261 d->lss_transfer.IDNumber=d->lss_transfer.lss_fs_transfer.FS_LSS_ID[d->lss_transfer.LSSSub] & Mask;
sam_grove 0:9dd7c6129683 262 d->lss_transfer.FastScan_SM=LSS_FS_PROCESSING;
sam_grove 0:9dd7c6129683 263 //printf("BitChecked=%d, IDNumber=%x MASK=%x\n",d->lss_transfer.BitChecked,d->lss_transfer.IDNumber,Mask);
sam_grove 0:9dd7c6129683 264 StartLSS_FS_TIMER();
sam_grove 0:9dd7c6129683 265 sendMasterLSSMessage(d,LSS_IDENT_FASTSCAN,0,0);
sam_grove 0:9dd7c6129683 266 return;
sam_grove 0:9dd7c6129683 267 }
sam_grove 0:9dd7c6129683 268 }
sam_grove 0:9dd7c6129683 269 else{
sam_grove 0:9dd7c6129683 270 /* This should not happen, an error ocurred*/
sam_grove 0:9dd7c6129683 271 MSG_ERR(0x1D0E, "LSS FastScan timeout. FastScan response not received.", 0);
sam_grove 0:9dd7c6129683 272 MSG_ERR(0x1D0E, "There is not any node with LSS_ID# =>", d->lss_transfer.LSSSub);
sam_grove 0:9dd7c6129683 273 MSG_ERR(0x1D0E, "with the value =>", d->lss_transfer.IDNumber);
sam_grove 0:9dd7c6129683 274 /* Set aborted state */
sam_grove 0:9dd7c6129683 275 d->lss_transfer.state = LSS_ABORTED_INTERNAL;
sam_grove 0:9dd7c6129683 276 d->lss_transfer.FastScan_SM = LSS_FS_RESET;
sam_grove 0:9dd7c6129683 277 }
sam_grove 0:9dd7c6129683 278 }
sam_grove 0:9dd7c6129683 279 break;
sam_grove 0:9dd7c6129683 280 }
sam_grove 0:9dd7c6129683 281
sam_grove 0:9dd7c6129683 282 /* Call the user function to inform of the problem.*/
sam_grove 0:9dd7c6129683 283 if(d->lss_transfer.Callback){
sam_grove 0:9dd7c6129683 284 /*If there is a callback, it is responsible of the error*/
sam_grove 0:9dd7c6129683 285 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
sam_grove 0:9dd7c6129683 286 }
sam_grove 0:9dd7c6129683 287 }
sam_grove 0:9dd7c6129683 288 #endif
sam_grove 0:9dd7c6129683 289
sam_grove 0:9dd7c6129683 290
sam_grove 0:9dd7c6129683 291 /*!
sam_grove 0:9dd7c6129683 292 **
sam_grove 0:9dd7c6129683 293 **
sam_grove 0:9dd7c6129683 294 ** @param d
sam_grove 0:9dd7c6129683 295 **/
sam_grove 0:9dd7c6129683 296 void startLSS(CO_Data* d)
sam_grove 0:9dd7c6129683 297 {
sam_grove 0:9dd7c6129683 298 /*MSG_WAR(0x3D09, "LSS services started",0);*/
sam_grove 0:9dd7c6129683 299 }
sam_grove 0:9dd7c6129683 300
sam_grove 0:9dd7c6129683 301 /*!
sam_grove 0:9dd7c6129683 302 **
sam_grove 0:9dd7c6129683 303 **
sam_grove 0:9dd7c6129683 304 ** @param d
sam_grove 0:9dd7c6129683 305 **/
sam_grove 0:9dd7c6129683 306 void stopLSS(CO_Data* d)
sam_grove 0:9dd7c6129683 307 {
sam_grove 0:9dd7c6129683 308 /*MSG_WAR(0x3D09, "LSS services stopped",0);*/
sam_grove 0:9dd7c6129683 309 }
sam_grove 0:9dd7c6129683 310
sam_grove 0:9dd7c6129683 311 /*!
sam_grove 0:9dd7c6129683 312 **
sam_grove 0:9dd7c6129683 313 **
sam_grove 0:9dd7c6129683 314 ** @param d
sam_grove 0:9dd7c6129683 315 ** @param cob_id
sam_grove 0:9dd7c6129683 316 **
sam_grove 0:9dd7c6129683 317 ** @return
sam_grove 0:9dd7c6129683 318 **/
sam_grove 0:9dd7c6129683 319 UNS8 sendSlaveLSSMessage(CO_Data* d, UNS8 command,void *dat1,void *dat2)
sam_grove 0:9dd7c6129683 320 {
sam_grove 0:9dd7c6129683 321 Message m;
sam_grove 0:9dd7c6129683 322 UNS8 i;
sam_grove 0:9dd7c6129683 323
sam_grove 0:9dd7c6129683 324 if (!d->CurrentCommunicationState.csLSS){
sam_grove 0:9dd7c6129683 325 MSG_WAR(0x2D17, "unable to send the LSS message, not in the proper state =>", d->nodeState);
sam_grove 0:9dd7c6129683 326 return 0xFF;
sam_grove 0:9dd7c6129683 327 }
sam_grove 0:9dd7c6129683 328
sam_grove 0:9dd7c6129683 329 for(i=1;i<8;i++)m.data[i]=0;
sam_grove 0:9dd7c6129683 330 m.len = 8;
sam_grove 0:9dd7c6129683 331 m.rtr = NOT_A_REQUEST;
sam_grove 0:9dd7c6129683 332 m.data[0]=command;
sam_grove 0:9dd7c6129683 333 m.cob_id=UNS16_LE(SLSS_ADRESS);
sam_grove 0:9dd7c6129683 334
sam_grove 0:9dd7c6129683 335 /* Tha data sent with the msg depends on the command */
sam_grove 0:9dd7c6129683 336 switch(command){
sam_grove 0:9dd7c6129683 337 case LSS_INQ_NODE_ID: /* Inquire Node-ID */
sam_grove 0:9dd7c6129683 338 m.data[1]=*(UNS8 *)dat1;
sam_grove 0:9dd7c6129683 339 break;
sam_grove 0:9dd7c6129683 340 case LSS_CONF_NODE_ID: /* Configure Node-ID */
sam_grove 0:9dd7c6129683 341 case LSS_CONF_BIT_TIMING: /* Configure Bit Timing Parameters */
sam_grove 0:9dd7c6129683 342 case LSS_CONF_STORE: /* Store Configured Parameters */
sam_grove 0:9dd7c6129683 343 m.data[1]=*(UNS8 *)dat1;
sam_grove 0:9dd7c6129683 344 m.data[2]=*(UNS8 *)dat2;
sam_grove 0:9dd7c6129683 345 break;
sam_grove 0:9dd7c6129683 346 case LSS_INQ_VENDOR_ID: /* Inquire Identity Vendor-ID */
sam_grove 0:9dd7c6129683 347 case LSS_INQ_PRODUCT_CODE: /* Inquire Identity Product-Code */
sam_grove 0:9dd7c6129683 348 case LSS_INQ_REV_NUMBER: /* Inquire Identity Revision-Number */
sam_grove 0:9dd7c6129683 349 case LSS_INQ_SERIAL_NUMBER: /* Inquire Identity Serial-Number */
sam_grove 0:9dd7c6129683 350 m.data[1]=(UNS8)(*(UNS32*)dat1 & 0xFF);
sam_grove 0:9dd7c6129683 351 m.data[2]=(UNS8)(*(UNS32*)dat1>>8 & 0xFF);
sam_grove 0:9dd7c6129683 352 m.data[3]=(UNS8)(*(UNS32*)dat1>>16 & 0xFF);
sam_grove 0:9dd7c6129683 353 m.data[4]=(UNS8)(*(UNS32*)dat1>>24 & 0xFF);
sam_grove 0:9dd7c6129683 354 break;
sam_grove 0:9dd7c6129683 355 case LSS_SM_SELECTIVE_RESP: /* Switch Mode Selective response*/
sam_grove 0:9dd7c6129683 356 case LSS_IDENT_SLAVE: /* LSS Identify Slave */
sam_grove 0:9dd7c6129683 357 case LSS_IDENT_NON_CONF_SLAVE: /* LSS identify non-configured remote slave */
sam_grove 0:9dd7c6129683 358 break;
sam_grove 0:9dd7c6129683 359 default:
sam_grove 0:9dd7c6129683 360 MSG_ERR(0x1D18, "send Slave LSS command not implemented", command);
sam_grove 0:9dd7c6129683 361 return 0xFF;
sam_grove 0:9dd7c6129683 362 }
sam_grove 0:9dd7c6129683 363
sam_grove 0:9dd7c6129683 364 return canSend(d->canHandle,&m);
sam_grove 0:9dd7c6129683 365 }
sam_grove 0:9dd7c6129683 366
sam_grove 0:9dd7c6129683 367 /* If a baud rate is not supported just comment the line. */
sam_grove 0:9dd7c6129683 368 static UNS8 CO_TranslateBaudRate(char* optarg){
sam_grove 0:9dd7c6129683 369 if(!strcmp( optarg, "1M")) return 0x00;
sam_grove 0:9dd7c6129683 370 if(!strcmp( optarg, "800K")) return 0x01;
sam_grove 0:9dd7c6129683 371 if(!strcmp( optarg, "500K")) return 0x02;
sam_grove 0:9dd7c6129683 372 if(!strcmp( optarg, "250K")) return 0x03;
sam_grove 0:9dd7c6129683 373 if(!strcmp( optarg, "125K")) return 0x04;
sam_grove 0:9dd7c6129683 374 if(!strcmp( optarg, "100K")) return 0x05;
sam_grove 0:9dd7c6129683 375 if(!strcmp( optarg, "50K")) return 0x06;
sam_grove 0:9dd7c6129683 376 if(!strcmp( optarg, "20K")) return 0x07;
sam_grove 0:9dd7c6129683 377 if(!strcmp( optarg, "10K")) return 0x08;
sam_grove 0:9dd7c6129683 378 return 0xFF;
sam_grove 0:9dd7c6129683 379 }
sam_grove 0:9dd7c6129683 380
sam_grove 0:9dd7c6129683 381 /*!
sam_grove 0:9dd7c6129683 382 **
sam_grove 0:9dd7c6129683 383 **
sam_grove 0:9dd7c6129683 384 ** @param d
sam_grove 0:9dd7c6129683 385 ** @param cob_id
sam_grove 0:9dd7c6129683 386 **
sam_grove 0:9dd7c6129683 387 ** @return
sam_grove 0:9dd7c6129683 388 **/
sam_grove 0:9dd7c6129683 389 UNS8 sendMasterLSSMessage(CO_Data* d, UNS8 command,void *dat1,void *dat2)
sam_grove 0:9dd7c6129683 390 {
sam_grove 0:9dd7c6129683 391 Message m;
sam_grove 0:9dd7c6129683 392 UNS8 i;
sam_grove 0:9dd7c6129683 393 UNS8 res;
sam_grove 0:9dd7c6129683 394 UNS8 hasResponse=0;
sam_grove 0:9dd7c6129683 395
sam_grove 0:9dd7c6129683 396 for(i=1;i<8;i++)m.data[i]=0;
sam_grove 0:9dd7c6129683 397 m.len = 8;
sam_grove 0:9dd7c6129683 398 m.rtr = NOT_A_REQUEST;
sam_grove 0:9dd7c6129683 399 m.data[0]=command;
sam_grove 0:9dd7c6129683 400 m.cob_id=UNS16_LE(MLSS_ADRESS);
sam_grove 0:9dd7c6129683 401
sam_grove 0:9dd7c6129683 402 /* Tha data sent with the msg depends on the command */
sam_grove 0:9dd7c6129683 403 switch(command){
sam_grove 0:9dd7c6129683 404 case LSS_CONF_NODE_ID: /* Configure Node-ID */
sam_grove 0:9dd7c6129683 405 hasResponse=1;
sam_grove 0:9dd7c6129683 406 case LSS_SM_GLOBAL: /* Switch Mode Global */
sam_grove 0:9dd7c6129683 407 m.data[1]=*(UNS8 *)dat1;
sam_grove 0:9dd7c6129683 408 break;
sam_grove 0:9dd7c6129683 409 case LSS_CONF_BIT_TIMING: /* Configure Bit Timing Parameters */
sam_grove 0:9dd7c6129683 410
sam_grove 0:9dd7c6129683 411 m.data[1]=*(UNS8 *)dat1;
sam_grove 0:9dd7c6129683 412 d->lss_transfer.baudRate=*(char **)dat2;
sam_grove 0:9dd7c6129683 413
sam_grove 0:9dd7c6129683 414 if((m.data[2]=CO_TranslateBaudRate(d->lss_transfer.baudRate))!=0xFF){
sam_grove 0:9dd7c6129683 415 hasResponse=1;
sam_grove 0:9dd7c6129683 416 break;
sam_grove 0:9dd7c6129683 417 }
sam_grove 0:9dd7c6129683 418
sam_grove 0:9dd7c6129683 419 MSG_ERR(0x1D19, "Master-> Baud rate not supported",0);
sam_grove 0:9dd7c6129683 420 d->lss_transfer.dat1=0xFF;
sam_grove 0:9dd7c6129683 421
sam_grove 0:9dd7c6129683 422 /* if bit timing is not supported comment the previous code and uncomment the following one*/
sam_grove 0:9dd7c6129683 423 /*{
sam_grove 0:9dd7c6129683 424 MSG_ERR(0x1D1A, "Master-> Bit timing not supported",0);
sam_grove 0:9dd7c6129683 425 d->lss_transfer.dat1=0x01;
sam_grove 0:9dd7c6129683 426 }*/
sam_grove 0:9dd7c6129683 427
sam_grove 0:9dd7c6129683 428 d->lss_transfer.dat2=0;
sam_grove 0:9dd7c6129683 429 /* If there is a callback, it is responsible of the error */
sam_grove 0:9dd7c6129683 430 if(d->lss_transfer.Callback)
sam_grove 0:9dd7c6129683 431 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
sam_grove 0:9dd7c6129683 432 return 0xFF;
sam_grove 0:9dd7c6129683 433 //break;
sam_grove 0:9dd7c6129683 434 case LSS_CONF_ACT_BIT_TIMING: /* Activate Bit Timing Parameters */
sam_grove 0:9dd7c6129683 435 m.data[1]=(UNS8)(*(UNS32*)dat1 & 0xFF);
sam_grove 0:9dd7c6129683 436 m.data[2]=(UNS8)(*(UNS32*)dat1>>8 & 0xFF);
sam_grove 0:9dd7c6129683 437 if(d->lss_transfer.baudRate!="none"){
sam_grove 0:9dd7c6129683 438 d->lss_transfer.switchDelay=(UNS16)(*(UNS32*)dat1 & 0xFFFF);
sam_grove 0:9dd7c6129683 439 d->lss_transfer.switchDelayState=SDELAY_FIRST;
sam_grove 0:9dd7c6129683 440 d->lss_transfer.canHandle_t=d->canHandle;
sam_grove 0:9dd7c6129683 441 res=canSend(d->canHandle,&m);
sam_grove 0:9dd7c6129683 442 if(res==0){
sam_grove 0:9dd7c6129683 443 StartLSS_SDELAY_TIMER();
sam_grove 0:9dd7c6129683 444 d->lss_transfer.state=LSS_TRANS_IN_PROGRESS;
sam_grove 0:9dd7c6129683 445 }
sam_grove 0:9dd7c6129683 446 return res;
sam_grove 0:9dd7c6129683 447 }
sam_grove 0:9dd7c6129683 448 else{
sam_grove 0:9dd7c6129683 449 MSG_ERR(0x1D1B, "Master-> Baud rate not specified",0);
sam_grove 0:9dd7c6129683 450 d->lss_transfer.dat1=1;
sam_grove 0:9dd7c6129683 451 /* If there is a callback, it is responsible of the error */
sam_grove 0:9dd7c6129683 452 if(d->lss_transfer.Callback){
sam_grove 0:9dd7c6129683 453 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
sam_grove 0:9dd7c6129683 454 }
sam_grove 0:9dd7c6129683 455 return 0xFF;
sam_grove 0:9dd7c6129683 456 }
sam_grove 0:9dd7c6129683 457 //break;
sam_grove 0:9dd7c6129683 458 case LSS_SM_SELECTIVE_SERIAL:
sam_grove 0:9dd7c6129683 459 case LSS_IDENT_REMOTE_SERIAL_HIGH:
sam_grove 0:9dd7c6129683 460 hasResponse=1;
sam_grove 0:9dd7c6129683 461 case LSS_SM_SELECTIVE_VENDOR: /* Switch Mode Selective */
sam_grove 0:9dd7c6129683 462 case LSS_SM_SELECTIVE_PRODUCT:
sam_grove 0:9dd7c6129683 463 case LSS_SM_SELECTIVE_REVISION:
sam_grove 0:9dd7c6129683 464 case LSS_IDENT_REMOTE_VENDOR: /* LSS Identify Remote Slaves */
sam_grove 0:9dd7c6129683 465 case LSS_IDENT_REMOTE_PRODUCT:
sam_grove 0:9dd7c6129683 466 case LSS_IDENT_REMOTE_REV_LOW:
sam_grove 0:9dd7c6129683 467 case LSS_IDENT_REMOTE_REV_HIGH:
sam_grove 0:9dd7c6129683 468 case LSS_IDENT_REMOTE_SERIAL_LOW:
sam_grove 0:9dd7c6129683 469 m.data[1]=(UNS8)(*(UNS32*)dat1 & 0xFF);
sam_grove 0:9dd7c6129683 470 m.data[2]=(UNS8)(*(UNS32*)dat1>>8 & 0xFF);
sam_grove 0:9dd7c6129683 471 m.data[3]=(UNS8)(*(UNS32*)dat1>>16 & 0xFF);
sam_grove 0:9dd7c6129683 472 m.data[4]=(UNS8)(*(UNS32*)dat1>>24 & 0xFF);
sam_grove 0:9dd7c6129683 473 break;
sam_grove 0:9dd7c6129683 474
sam_grove 0:9dd7c6129683 475 case LSS_CONF_STORE: /* Store Configured Parameters */
sam_grove 0:9dd7c6129683 476 case LSS_IDENT_REMOTE_NON_CONF: /* LSS identify non-configured remote slave */
sam_grove 0:9dd7c6129683 477 case LSS_INQ_VENDOR_ID: /* Inquire Identity Vendor-ID */
sam_grove 0:9dd7c6129683 478 case LSS_INQ_PRODUCT_CODE: /* Inquire Identity Product-Code */
sam_grove 0:9dd7c6129683 479 case LSS_INQ_REV_NUMBER: /* Inquire Identity Revision-Number */
sam_grove 0:9dd7c6129683 480 case LSS_INQ_SERIAL_NUMBER: /* Inquire Identity Serial-Number */
sam_grove 0:9dd7c6129683 481 case LSS_INQ_NODE_ID: /* Inquire Node-ID */
sam_grove 0:9dd7c6129683 482 hasResponse=1;
sam_grove 0:9dd7c6129683 483 break;
sam_grove 0:9dd7c6129683 484 #ifdef CO_ENABLE_LSS_FS
sam_grove 0:9dd7c6129683 485 case LSS_IDENT_FASTSCAN:
sam_grove 0:9dd7c6129683 486 if(d->lss_transfer.FastScan_SM==LSS_FS_RESET){
sam_grove 0:9dd7c6129683 487 UNS8 i;
sam_grove 0:9dd7c6129683 488 /* Initialize the lss_fs_transfer FastScan parameters */
sam_grove 0:9dd7c6129683 489 for(i=0;i<4;i++){
sam_grove 0:9dd7c6129683 490 d->lss_transfer.lss_fs_transfer.FS_LSS_ID[i]=(*(lss_fs_transfer_t*)dat1).FS_LSS_ID[i];
sam_grove 0:9dd7c6129683 491 d->lss_transfer.lss_fs_transfer.FS_BitChecked[i]=(*(lss_fs_transfer_t*)dat1).FS_BitChecked[i];
sam_grove 0:9dd7c6129683 492 /* Adjust BitChecked from 32-1 to 31-0 */
sam_grove 0:9dd7c6129683 493 if(d->lss_transfer.lss_fs_transfer.FS_BitChecked[i]>0)d->lss_transfer.lss_fs_transfer.FS_BitChecked[i]--;
sam_grove 0:9dd7c6129683 494 }
sam_grove 0:9dd7c6129683 495
sam_grove 0:9dd7c6129683 496 d->lss_transfer.IDNumber=0;
sam_grove 0:9dd7c6129683 497 d->lss_transfer.BitChecked=128;
sam_grove 0:9dd7c6129683 498 d->lss_transfer.LSSSub=0;
sam_grove 0:9dd7c6129683 499 d->lss_transfer.LSSNext=0;
sam_grove 0:9dd7c6129683 500
sam_grove 0:9dd7c6129683 501 /* it will generate a response only if it is the start of the FastScan protocol*/
sam_grove 0:9dd7c6129683 502 hasResponse=1;
sam_grove 0:9dd7c6129683 503 }
sam_grove 0:9dd7c6129683 504 m.data[1]=(UNS8)(d->lss_transfer.IDNumber & 0xFF);
sam_grove 0:9dd7c6129683 505 m.data[2]=(UNS8)(d->lss_transfer.IDNumber>>8 & 0xFF);
sam_grove 0:9dd7c6129683 506 m.data[3]=(UNS8)(d->lss_transfer.IDNumber>>16 & 0xFF);
sam_grove 0:9dd7c6129683 507 m.data[4]=(UNS8)(d->lss_transfer.IDNumber>>24 & 0xFF);
sam_grove 0:9dd7c6129683 508 m.data[5]=d->lss_transfer.BitChecked;
sam_grove 0:9dd7c6129683 509 m.data[6]=d->lss_transfer.LSSSub;
sam_grove 0:9dd7c6129683 510 m.data[7]=d->lss_transfer.LSSNext;
sam_grove 0:9dd7c6129683 511 break;
sam_grove 0:9dd7c6129683 512 #endif
sam_grove 0:9dd7c6129683 513 default:
sam_grove 0:9dd7c6129683 514 MSG_ERR(0x1D1C, "send Master LSS command not implemented", command);
sam_grove 0:9dd7c6129683 515 return 0xFF;
sam_grove 0:9dd7c6129683 516 }
sam_grove 0:9dd7c6129683 517
sam_grove 0:9dd7c6129683 518 res=canSend(d->canHandle,&m);
sam_grove 0:9dd7c6129683 519 if(res==0 && hasResponse==1){
sam_grove 0:9dd7c6129683 520 StartLSS_MSG_TIMER();
sam_grove 0:9dd7c6129683 521 d->lss_transfer.state=LSS_TRANS_IN_PROGRESS;
sam_grove 0:9dd7c6129683 522 }
sam_grove 0:9dd7c6129683 523 return res;
sam_grove 0:9dd7c6129683 524 }
sam_grove 0:9dd7c6129683 525
sam_grove 0:9dd7c6129683 526 /*!
sam_grove 0:9dd7c6129683 527 **
sam_grove 0:9dd7c6129683 528 **
sam_grove 0:9dd7c6129683 529 ** @param d
sam_grove 0:9dd7c6129683 530 ** @param cob_id
sam_grove 0:9dd7c6129683 531 **
sam_grove 0:9dd7c6129683 532 ** @return
sam_grove 0:9dd7c6129683 533 **/
sam_grove 0:9dd7c6129683 534 UNS8 sendLSS(CO_Data* d, UNS8 command,void *dat1,void *dat2)
sam_grove 0:9dd7c6129683 535 {
sam_grove 0:9dd7c6129683 536 UNS8 res=1;
sam_grove 0:9dd7c6129683 537
sam_grove 0:9dd7c6129683 538 /* Tha data sent with the msg depends on the command and if the sender is a master or a slave */
sam_grove 0:9dd7c6129683 539 if (*(d->iam_a_slave)){
sam_grove 0:9dd7c6129683 540 res = sendSlaveLSSMessage(d, command,dat1,dat2);
sam_grove 0:9dd7c6129683 541 }
sam_grove 0:9dd7c6129683 542 else {/* It is a Master */
sam_grove 0:9dd7c6129683 543 res = sendMasterLSSMessage(d, command,dat1,dat2);
sam_grove 0:9dd7c6129683 544 }
sam_grove 0:9dd7c6129683 545 return res ;
sam_grove 0:9dd7c6129683 546 }
sam_grove 0:9dd7c6129683 547
sam_grove 0:9dd7c6129683 548
sam_grove 0:9dd7c6129683 549 /*!
sam_grove 0:9dd7c6129683 550 **
sam_grove 0:9dd7c6129683 551 **
sam_grove 0:9dd7c6129683 552 ** @param d
sam_grove 0:9dd7c6129683 553 ** @param m
sam_grove 0:9dd7c6129683 554 **
sam_grove 0:9dd7c6129683 555 ** @return
sam_grove 0:9dd7c6129683 556 **/
sam_grove 0:9dd7c6129683 557 UNS8 proceedLSS_Master(CO_Data* d, Message* m )
sam_grove 0:9dd7c6129683 558 {
sam_grove 0:9dd7c6129683 559 UNS8 msg_cs;
sam_grove 0:9dd7c6129683 560 UNS32 Dat1=0;
sam_grove 0:9dd7c6129683 561 UNS8 Dat2=0;
sam_grove 0:9dd7c6129683 562
sam_grove 0:9dd7c6129683 563 if(d->lss_transfer.state!=LSS_TRANS_IN_PROGRESS)
sam_grove 0:9dd7c6129683 564 {
sam_grove 0:9dd7c6129683 565 //MSG_WAR(0x3D0D, "MasterLSS proceedLSS; unexpected message arrived;command ", m->data[0]);
sam_grove 0:9dd7c6129683 566 //return 0;
sam_grove 0:9dd7c6129683 567 goto ErrorProcessMaster;
sam_grove 0:9dd7c6129683 568 }
sam_grove 0:9dd7c6129683 569
sam_grove 0:9dd7c6129683 570 MSG_WAR(0x3D1E, "MasterLSS proceedLSS; command ", m->data[0]);
sam_grove 0:9dd7c6129683 571
sam_grove 0:9dd7c6129683 572 switch(msg_cs=m->data[0]){
sam_grove 0:9dd7c6129683 573 case LSS_INQ_NODE_ID: /* Inquire Node-ID */
sam_grove 0:9dd7c6129683 574 if(d->lss_transfer.command!=LSS_INQ_NODE_ID)goto ErrorProcessMaster;
sam_grove 0:9dd7c6129683 575 Dat1=m->data[1];
sam_grove 0:9dd7c6129683 576 break;
sam_grove 0:9dd7c6129683 577 case LSS_CONF_NODE_ID: /* Configure Node-ID */
sam_grove 0:9dd7c6129683 578 case LSS_CONF_BIT_TIMING: /* Configure Bit Timing Parameters */
sam_grove 0:9dd7c6129683 579 case LSS_CONF_STORE: /* Store Configured Parameters */
sam_grove 0:9dd7c6129683 580 if(d->lss_transfer.command!=msg_cs)goto ErrorProcessMaster;
sam_grove 0:9dd7c6129683 581 Dat1=m->data[1];
sam_grove 0:9dd7c6129683 582 Dat2=m->data[2];
sam_grove 0:9dd7c6129683 583 break;
sam_grove 0:9dd7c6129683 584 case LSS_INQ_VENDOR_ID: /* Inquire Identity Vendor-ID */
sam_grove 0:9dd7c6129683 585 case LSS_INQ_PRODUCT_CODE: /* Inquire Identity Product-Code */
sam_grove 0:9dd7c6129683 586 case LSS_INQ_REV_NUMBER: /* Inquire Identity Revision-Number */
sam_grove 0:9dd7c6129683 587 case LSS_INQ_SERIAL_NUMBER: /* Inquire Identity Serial-Number */
sam_grove 0:9dd7c6129683 588 if(d->lss_transfer.command!=msg_cs)goto ErrorProcessMaster;
sam_grove 0:9dd7c6129683 589 Dat1=getLSSIdent(m);
sam_grove 0:9dd7c6129683 590 break;
sam_grove 0:9dd7c6129683 591 case LSS_IDENT_SLAVE: /* LSS Identify Slave */
sam_grove 0:9dd7c6129683 592 #ifdef CO_ENABLE_LSS_FS
sam_grove 0:9dd7c6129683 593 if(d->lss_transfer.command==LSS_IDENT_FASTSCAN){
sam_grove 0:9dd7c6129683 594 /* A message arrived during the timer period */
sam_grove 0:9dd7c6129683 595 d->lss_transfer.LSSanswer=1;
sam_grove 0:9dd7c6129683 596 return 0;
sam_grove 0:9dd7c6129683 597 }
sam_grove 0:9dd7c6129683 598 else
sam_grove 0:9dd7c6129683 599 #endif
sam_grove 0:9dd7c6129683 600 if(d->lss_transfer.command!=LSS_IDENT_REMOTE_VENDOR && \
sam_grove 0:9dd7c6129683 601 d->lss_transfer.command!=LSS_IDENT_REMOTE_PRODUCT && \
sam_grove 0:9dd7c6129683 602 d->lss_transfer.command!=LSS_IDENT_REMOTE_REV_LOW && \
sam_grove 0:9dd7c6129683 603 d->lss_transfer.command!=LSS_IDENT_REMOTE_REV_HIGH && \
sam_grove 0:9dd7c6129683 604 d->lss_transfer.command!=LSS_IDENT_REMOTE_SERIAL_LOW && \
sam_grove 0:9dd7c6129683 605 d->lss_transfer.command!=LSS_IDENT_REMOTE_SERIAL_HIGH )
sam_grove 0:9dd7c6129683 606 goto ErrorProcessMaster;
sam_grove 0:9dd7c6129683 607 break;
sam_grove 0:9dd7c6129683 608 case LSS_SM_SELECTIVE_RESP: /* Switch Mode Selective response */
sam_grove 0:9dd7c6129683 609 if(d->lss_transfer.command!=LSS_SM_SELECTIVE_VENDOR && \
sam_grove 0:9dd7c6129683 610 d->lss_transfer.command!=LSS_SM_SELECTIVE_PRODUCT && \
sam_grove 0:9dd7c6129683 611 d->lss_transfer.command!=LSS_SM_SELECTIVE_REVISION && \
sam_grove 0:9dd7c6129683 612 d->lss_transfer.command!=LSS_SM_SELECTIVE_SERIAL )
sam_grove 0:9dd7c6129683 613 goto ErrorProcessMaster;
sam_grove 0:9dd7c6129683 614 break;
sam_grove 0:9dd7c6129683 615 case LSS_IDENT_NON_CONF_SLAVE: /* LSS identify non-configured remote slave */
sam_grove 0:9dd7c6129683 616 if(d->lss_transfer.command!=LSS_IDENT_REMOTE_NON_CONF)goto ErrorProcessMaster;
sam_grove 0:9dd7c6129683 617 break;
sam_grove 0:9dd7c6129683 618 default:
sam_grove 0:9dd7c6129683 619 MSG_ERR(0x1D1F, "Master LSS command not implemented", msg_cs);
sam_grove 0:9dd7c6129683 620 return 0xFF;
sam_grove 0:9dd7c6129683 621 }
sam_grove 0:9dd7c6129683 622
sam_grove 0:9dd7c6129683 623 StopLSS_MSG_TIMER();
sam_grove 0:9dd7c6129683 624 d->lss_transfer.state = LSS_FINISHED;
sam_grove 0:9dd7c6129683 625
sam_grove 0:9dd7c6129683 626 d->lss_transfer.dat1=Dat1;
sam_grove 0:9dd7c6129683 627 d->lss_transfer.dat2=Dat2;
sam_grove 0:9dd7c6129683 628 /* If there is a callback, it is responsible of the received response */
sam_grove 0:9dd7c6129683 629 if(d->lss_transfer.Callback)
sam_grove 0:9dd7c6129683 630 (*d->lss_transfer.Callback)(d,d->lss_transfer.command);
sam_grove 0:9dd7c6129683 631
sam_grove 0:9dd7c6129683 632 return 0;
sam_grove 0:9dd7c6129683 633
sam_grove 0:9dd7c6129683 634 ErrorProcessMaster:
sam_grove 0:9dd7c6129683 635 MSG_WAR(0x3D20, "MasterLSS proceedLSS; unexpected message arrived;command ", m->data[0]);
sam_grove 0:9dd7c6129683 636 return 0xFF;
sam_grove 0:9dd7c6129683 637
sam_grove 0:9dd7c6129683 638 }
sam_grove 0:9dd7c6129683 639
sam_grove 0:9dd7c6129683 640 /*!
sam_grove 0:9dd7c6129683 641 **
sam_grove 0:9dd7c6129683 642 **
sam_grove 0:9dd7c6129683 643 ** @param d
sam_grove 0:9dd7c6129683 644 ** @param m
sam_grove 0:9dd7c6129683 645 **
sam_grove 0:9dd7c6129683 646 ** @return
sam_grove 0:9dd7c6129683 647 **/
sam_grove 0:9dd7c6129683 648 UNS8 proceedLSS_Slave(CO_Data* d, Message* m )
sam_grove 0:9dd7c6129683 649 {
sam_grove 0:9dd7c6129683 650 UNS8 msg_cs;
sam_grove 0:9dd7c6129683 651
sam_grove 0:9dd7c6129683 652 MSG_WAR(0x3D21, "SlaveLSS proceedLSS; command ", m->data[0]);
sam_grove 0:9dd7c6129683 653
sam_grove 0:9dd7c6129683 654 switch(msg_cs=m->data[0]){
sam_grove 0:9dd7c6129683 655 case LSS_SM_GLOBAL: /* Switch Mode Global */
sam_grove 0:9dd7c6129683 656 /* if there is not a mode change break*/
sam_grove 0:9dd7c6129683 657 if(m->data[1] == d->lss_transfer.mode){
sam_grove 0:9dd7c6129683 658 MSG_WAR(0x3D22, "SlaveLSS already in the mode ", m->data[1]);
sam_grove 0:9dd7c6129683 659 break;
sam_grove 0:9dd7c6129683 660 }
sam_grove 0:9dd7c6129683 661
sam_grove 0:9dd7c6129683 662 if(m->data[1]==LSS_CONFIGURATION_MODE) {
sam_grove 0:9dd7c6129683 663 MSG_WAR(0x3D23, "SlaveLSS switching to configuration mode ", 0);
sam_grove 0:9dd7c6129683 664 /* Store the NodeId in case it will be changed */
sam_grove 0:9dd7c6129683 665 //d->lss_transfer.nodeID=getNodeId(d);
sam_grove 0:9dd7c6129683 666 d->lss_transfer.mode=LSS_CONFIGURATION_MODE;
sam_grove 0:9dd7c6129683 667 }
sam_grove 0:9dd7c6129683 668 else if(m->data[1]==LSS_WAITING_MODE){
sam_grove 0:9dd7c6129683 669 MSG_WAR(0x3D24, "SlaveLSS switching to operational mode ", 0);
sam_grove 0:9dd7c6129683 670
sam_grove 0:9dd7c6129683 671 /* If the nodeID has changed update it and put the node state to Initialisation. */
sam_grove 0:9dd7c6129683 672 if(d->lss_transfer.nodeID!=getNodeId(d)){
sam_grove 0:9dd7c6129683 673 if(getNodeId(d)==0xFF){/* The nodeID was 0xFF; initialize the application*/
sam_grove 0:9dd7c6129683 674 MSG_WAR(0x3D25, "The node Id has changed. Reseting to Initialisation state",0);
sam_grove 0:9dd7c6129683 675 setNodeId(d, d->lss_transfer.nodeID);
sam_grove 0:9dd7c6129683 676 setState(d, Initialisation);
sam_grove 0:9dd7c6129683 677 }
sam_grove 0:9dd7c6129683 678 else{/* The nodeID will be changed on NMT_Reset_Comunication Request*/
sam_grove 0:9dd7c6129683 679 }
sam_grove 0:9dd7c6129683 680 }
sam_grove 0:9dd7c6129683 681 d->lss_transfer.mode=LSS_WAITING_MODE;
sam_grove 0:9dd7c6129683 682 }
sam_grove 0:9dd7c6129683 683 break;
sam_grove 0:9dd7c6129683 684 case LSS_CONF_NODE_ID: /* Configure Node-ID */
sam_grove 0:9dd7c6129683 685 {
sam_grove 0:9dd7c6129683 686 UNS8 error_code=0;
sam_grove 0:9dd7c6129683 687 UNS8 spec_error=0;
sam_grove 0:9dd7c6129683 688
sam_grove 0:9dd7c6129683 689 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE){
sam_grove 0:9dd7c6129683 690 if(m->data[1]>127 && m->data[1]!=0xFF){
sam_grove 0:9dd7c6129683 691 MSG_ERR(0x1D26, "NodeID out of range",0);
sam_grove 0:9dd7c6129683 692 error_code=1; /* NodeID out of range */
sam_grove 0:9dd7c6129683 693 }
sam_grove 0:9dd7c6129683 694 else{
sam_grove 0:9dd7c6129683 695 d->lss_transfer.nodeID=m->data[1];
sam_grove 0:9dd7c6129683 696 }
sam_grove 0:9dd7c6129683 697 }
sam_grove 0:9dd7c6129683 698 else{
sam_grove 0:9dd7c6129683 699 MSG_WAR(0x3D27, "SlaveLSS not in configuration mode",0);
sam_grove 0:9dd7c6129683 700 //error_code=0xFF;
sam_grove 0:9dd7c6129683 701 break;
sam_grove 0:9dd7c6129683 702 }
sam_grove 0:9dd7c6129683 703 sendSlaveLSSMessage(d,msg_cs,&error_code,&spec_error);
sam_grove 0:9dd7c6129683 704 }
sam_grove 0:9dd7c6129683 705 break;
sam_grove 0:9dd7c6129683 706 case LSS_CONF_BIT_TIMING: /* Configure Bit Timing Parameters */
sam_grove 0:9dd7c6129683 707 {
sam_grove 0:9dd7c6129683 708 UNS8 error_code=0;
sam_grove 0:9dd7c6129683 709 UNS8 spec_error=0;
sam_grove 0:9dd7c6129683 710
sam_grove 0:9dd7c6129683 711 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE){
sam_grove 0:9dd7c6129683 712 /* If a baud rate is not supported just comment the line. */
sam_grove 0:9dd7c6129683 713 switch(m->data[2]){
sam_grove 0:9dd7c6129683 714 case 0x00:d->lss_transfer.baudRate="1M";break;
sam_grove 0:9dd7c6129683 715 case 0x01:d->lss_transfer.baudRate="800K";break;
sam_grove 0:9dd7c6129683 716 case 0x02:d->lss_transfer.baudRate="500K";break;
sam_grove 0:9dd7c6129683 717 case 0x03:d->lss_transfer.baudRate="250K";break;
sam_grove 0:9dd7c6129683 718 case 0x04:d->lss_transfer.baudRate="125K";break;
sam_grove 0:9dd7c6129683 719 case 0x05:d->lss_transfer.baudRate="100K";break;
sam_grove 0:9dd7c6129683 720 case 0x06:d->lss_transfer.baudRate="50K";break;
sam_grove 0:9dd7c6129683 721 case 0x07:d->lss_transfer.baudRate="20K";break;
sam_grove 0:9dd7c6129683 722 case 0x08:d->lss_transfer.baudRate="10K";break;
sam_grove 0:9dd7c6129683 723 default:
sam_grove 0:9dd7c6129683 724 MSG_ERR(0x1D28, "Baud rate not supported",0);
sam_grove 0:9dd7c6129683 725 error_code=0xFF; /* Baud rate not supported*/
sam_grove 0:9dd7c6129683 726 break;
sam_grove 0:9dd7c6129683 727 }
sam_grove 0:9dd7c6129683 728 }
sam_grove 0:9dd7c6129683 729 else{
sam_grove 0:9dd7c6129683 730 MSG_WAR(0x3D2A, "SlaveLSS not in configuration mode",0);
sam_grove 0:9dd7c6129683 731 //error_code=0xFF;
sam_grove 0:9dd7c6129683 732 break;
sam_grove 0:9dd7c6129683 733 }
sam_grove 0:9dd7c6129683 734
sam_grove 0:9dd7c6129683 735 /* if bit timing is not supported comment the previous code and uncomment the following */
sam_grove 0:9dd7c6129683 736 /*{
sam_grove 0:9dd7c6129683 737 MSG_ERR(0x1D29, "Bit timing not supported",0);
sam_grove 0:9dd7c6129683 738 error_code=0x01; // bit timing not supported
sam_grove 0:9dd7c6129683 739 }*/
sam_grove 0:9dd7c6129683 740
sam_grove 0:9dd7c6129683 741 sendSlaveLSSMessage(d,msg_cs,&error_code,&spec_error);
sam_grove 0:9dd7c6129683 742 }
sam_grove 0:9dd7c6129683 743 break;
sam_grove 0:9dd7c6129683 744 case LSS_CONF_ACT_BIT_TIMING: /* Activate Bit Timing Parameters */
sam_grove 0:9dd7c6129683 745
sam_grove 0:9dd7c6129683 746 if(d->lss_transfer.mode!=LSS_CONFIGURATION_MODE){
sam_grove 0:9dd7c6129683 747 MSG_ERR(0x3D2B, "SlaveLSS not in configuration mode",0);
sam_grove 0:9dd7c6129683 748 break;
sam_grove 0:9dd7c6129683 749 }
sam_grove 0:9dd7c6129683 750
sam_grove 0:9dd7c6129683 751 if(d->lss_transfer.baudRate!="none"){
sam_grove 0:9dd7c6129683 752 d->lss_transfer.switchDelay=getLSSDelay(m);
sam_grove 0:9dd7c6129683 753 MSG_WAR(0x3D2C, "Slave Switch Delay set to: ",d->lss_transfer.switchDelay);
sam_grove 0:9dd7c6129683 754 d->lss_transfer.switchDelayState=SDELAY_FIRST;
sam_grove 0:9dd7c6129683 755 //d->lss_transfer.currentState=getState(d);
sam_grove 0:9dd7c6129683 756 //setState(d, LssTimingDelay);
sam_grove 0:9dd7c6129683 757 d->lss_transfer.canHandle_t=d->canHandle;
sam_grove 0:9dd7c6129683 758 d->canHandle=NULL;
sam_grove 0:9dd7c6129683 759 StartLSS_SDELAY_TIMER();
sam_grove 0:9dd7c6129683 760 }
sam_grove 0:9dd7c6129683 761 break;
sam_grove 0:9dd7c6129683 762 case LSS_CONF_STORE: /* Store Configured Parameters */
sam_grove 0:9dd7c6129683 763 {
sam_grove 0:9dd7c6129683 764 UNS8 error_code=0;
sam_grove 0:9dd7c6129683 765 UNS8 spec_error=0;
sam_grove 0:9dd7c6129683 766
sam_grove 0:9dd7c6129683 767 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE){
sam_grove 0:9dd7c6129683 768 if(d->lss_StoreConfiguration){
sam_grove 0:9dd7c6129683 769 /* call lss_StoreConfiguration with NodeId */
sam_grove 0:9dd7c6129683 770 (*d->lss_StoreConfiguration)(d,&error_code,&spec_error);
sam_grove 0:9dd7c6129683 771 }
sam_grove 0:9dd7c6129683 772 else{
sam_grove 0:9dd7c6129683 773 MSG_ERR(0x1D2E, "Store configuration not supported",0);
sam_grove 0:9dd7c6129683 774 error_code=1; /* store configuration is not supported */
sam_grove 0:9dd7c6129683 775 }
sam_grove 0:9dd7c6129683 776 }
sam_grove 0:9dd7c6129683 777 else{
sam_grove 0:9dd7c6129683 778 MSG_WAR(0x3D2F, "SlaveLSS not in configuration mode",0);
sam_grove 0:9dd7c6129683 779 //error_code=0xFF;
sam_grove 0:9dd7c6129683 780 break;
sam_grove 0:9dd7c6129683 781 }
sam_grove 0:9dd7c6129683 782 sendSlaveLSSMessage(d,msg_cs,&error_code,&spec_error);
sam_grove 0:9dd7c6129683 783 }
sam_grove 0:9dd7c6129683 784 break;
sam_grove 0:9dd7c6129683 785 case LSS_SM_SELECTIVE_VENDOR: /* Switch Mode Selective */
sam_grove 0:9dd7c6129683 786 case LSS_SM_SELECTIVE_PRODUCT:
sam_grove 0:9dd7c6129683 787 case LSS_SM_SELECTIVE_REVISION:
sam_grove 0:9dd7c6129683 788 case LSS_SM_SELECTIVE_SERIAL:
sam_grove 0:9dd7c6129683 789 {
sam_grove 0:9dd7c6129683 790 UNS32 errorCode;
sam_grove 0:9dd7c6129683 791 const indextable *ptrTable;
sam_grove 0:9dd7c6129683 792 ODCallback_t *Callback;
sam_grove 0:9dd7c6129683 793 UNS32 _SpecificNodeInfo;
sam_grove 0:9dd7c6129683 794
sam_grove 0:9dd7c6129683 795 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE)
sam_grove 0:9dd7c6129683 796 {
sam_grove 0:9dd7c6129683 797 MSG_ERR(0x1D30, "Switch Mode Selective only supported in operational mode",0);
sam_grove 0:9dd7c6129683 798 break;
sam_grove 0:9dd7c6129683 799 }
sam_grove 0:9dd7c6129683 800
sam_grove 0:9dd7c6129683 801 _SpecificNodeInfo=getLSSIdent(m);
sam_grove 0:9dd7c6129683 802
sam_grove 0:9dd7c6129683 803 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
sam_grove 0:9dd7c6129683 804 if(_SpecificNodeInfo==*(UNS32*)ptrTable->pSubindex[msg_cs-(LSS_SM_SELECTIVE_VENDOR-1)].pObject){
sam_grove 0:9dd7c6129683 805
sam_grove 0:9dd7c6129683 806 d->lss_transfer.addr_sel_match|=(0x01<<(msg_cs-LSS_SM_SELECTIVE_VENDOR));
sam_grove 0:9dd7c6129683 807 /* If all the fields has been set */
sam_grove 0:9dd7c6129683 808 if(d->lss_transfer.addr_sel_match==0x0F){
sam_grove 0:9dd7c6129683 809
sam_grove 0:9dd7c6129683 810 MSG_WAR(0x3D31, "SlaveLSS switching to configuration mode ", 0);
sam_grove 0:9dd7c6129683 811 d->lss_transfer.addr_sel_match=0;
sam_grove 0:9dd7c6129683 812 d->lss_transfer.nodeID=getNodeId(d);
sam_grove 0:9dd7c6129683 813 d->lss_transfer.mode=LSS_CONFIGURATION_MODE;
sam_grove 0:9dd7c6129683 814
sam_grove 0:9dd7c6129683 815 sendSlaveLSSMessage(d,LSS_SM_SELECTIVE_RESP,0,0);
sam_grove 0:9dd7c6129683 816 }
sam_grove 0:9dd7c6129683 817 }
sam_grove 0:9dd7c6129683 818 else {
sam_grove 0:9dd7c6129683 819 MSG_WAR(0x3D32, "LSS identity field doesn't match ", _SpecificNodeInfo);
sam_grove 0:9dd7c6129683 820 d->lss_transfer.addr_sel_match=0;
sam_grove 0:9dd7c6129683 821 }
sam_grove 0:9dd7c6129683 822 }
sam_grove 0:9dd7c6129683 823 break;
sam_grove 0:9dd7c6129683 824 case LSS_IDENT_REMOTE_VENDOR: /* LSS Identify Remote Slaves */
sam_grove 0:9dd7c6129683 825 case LSS_IDENT_REMOTE_PRODUCT:
sam_grove 0:9dd7c6129683 826 case LSS_IDENT_REMOTE_REV_LOW:
sam_grove 0:9dd7c6129683 827 case LSS_IDENT_REMOTE_REV_HIGH:
sam_grove 0:9dd7c6129683 828 case LSS_IDENT_REMOTE_SERIAL_LOW:
sam_grove 0:9dd7c6129683 829 case LSS_IDENT_REMOTE_SERIAL_HIGH:
sam_grove 0:9dd7c6129683 830 {
sam_grove 0:9dd7c6129683 831 UNS32 errorCode;
sam_grove 0:9dd7c6129683 832 const indextable *ptrTable;
sam_grove 0:9dd7c6129683 833 ODCallback_t *Callback;
sam_grove 0:9dd7c6129683 834 UNS32 _SpecificNodeInfo;
sam_grove 0:9dd7c6129683 835
sam_grove 0:9dd7c6129683 836 _SpecificNodeInfo=getLSSIdent(m);
sam_grove 0:9dd7c6129683 837
sam_grove 0:9dd7c6129683 838 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
sam_grove 0:9dd7c6129683 839
sam_grove 0:9dd7c6129683 840 /* Check if the data match the identity object. */
sam_grove 0:9dd7c6129683 841 switch(msg_cs){
sam_grove 0:9dd7c6129683 842 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;
sam_grove 0:9dd7c6129683 843 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;
sam_grove 0:9dd7c6129683 844 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;
sam_grove 0:9dd7c6129683 845 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;
sam_grove 0:9dd7c6129683 846 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;
sam_grove 0:9dd7c6129683 847 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;
sam_grove 0:9dd7c6129683 848 }
sam_grove 0:9dd7c6129683 849 /* If all the fields has been set.. */
sam_grove 0:9dd7c6129683 850 if(d->lss_transfer.addr_ident_match==0x3F){
sam_grove 0:9dd7c6129683 851 MSG_WAR(0x3D33, "SlaveLSS identified ", 0);
sam_grove 0:9dd7c6129683 852 d->lss_transfer.addr_ident_match=0;
sam_grove 0:9dd7c6129683 853 sendSlaveLSSMessage(d,LSS_IDENT_SLAVE,0,0);
sam_grove 0:9dd7c6129683 854 }
sam_grove 0:9dd7c6129683 855 else if(d->lss_transfer.addr_ident_match==0){
sam_grove 0:9dd7c6129683 856 MSG_WAR(0x3D34, "LSS identify field doesn't match ", _SpecificNodeInfo);
sam_grove 0:9dd7c6129683 857 }
sam_grove 0:9dd7c6129683 858 }
sam_grove 0:9dd7c6129683 859 break;
sam_grove 0:9dd7c6129683 860 case LSS_IDENT_REMOTE_NON_CONF: /* LSS identify non-configured remote slave */
sam_grove 0:9dd7c6129683 861 {
sam_grove 0:9dd7c6129683 862 if(getNodeId(d)==0xFF){
sam_grove 0:9dd7c6129683 863 MSG_WAR(0x3D35, "SlaveLSS non-configured ", 0);
sam_grove 0:9dd7c6129683 864 sendSlaveLSSMessage(d,LSS_IDENT_NON_CONF_SLAVE,0,0);
sam_grove 0:9dd7c6129683 865 }
sam_grove 0:9dd7c6129683 866 else{
sam_grove 0:9dd7c6129683 867 MSG_WAR(0x3D36, "SlaveLSS already configured ", 0);
sam_grove 0:9dd7c6129683 868 }
sam_grove 0:9dd7c6129683 869 }
sam_grove 0:9dd7c6129683 870 break;
sam_grove 0:9dd7c6129683 871 case LSS_INQ_VENDOR_ID: /* Inquire Identity Vendor-ID */
sam_grove 0:9dd7c6129683 872 case LSS_INQ_PRODUCT_CODE: /* Inquire Identity Product-Code */
sam_grove 0:9dd7c6129683 873 case LSS_INQ_REV_NUMBER: /* Inquire Identity Revision-Number */
sam_grove 0:9dd7c6129683 874 case LSS_INQ_SERIAL_NUMBER: /* Inquire Identity Serial-Number */
sam_grove 0:9dd7c6129683 875 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE)
sam_grove 0:9dd7c6129683 876 {
sam_grove 0:9dd7c6129683 877
sam_grove 0:9dd7c6129683 878 UNS32 errorCode;
sam_grove 0:9dd7c6129683 879 const indextable *ptrTable;
sam_grove 0:9dd7c6129683 880 ODCallback_t *Callback;
sam_grove 0:9dd7c6129683 881 UNS32 _SpecificNodeInfo;
sam_grove 0:9dd7c6129683 882
sam_grove 0:9dd7c6129683 883 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
sam_grove 0:9dd7c6129683 884 _SpecificNodeInfo=*(UNS32*)ptrTable->pSubindex[msg_cs-(LSS_INQ_VENDOR_ID-1)].pObject;
sam_grove 0:9dd7c6129683 885 MSG_WAR(0x3D37, "SlaveLSS identity field inquired ", _SpecificNodeInfo);
sam_grove 0:9dd7c6129683 886
sam_grove 0:9dd7c6129683 887 sendSlaveLSSMessage(d,msg_cs,&_SpecificNodeInfo,0);
sam_grove 0:9dd7c6129683 888 }
sam_grove 0:9dd7c6129683 889 break;
sam_grove 0:9dd7c6129683 890 case LSS_INQ_NODE_ID: /* Inquire Node-ID */
sam_grove 0:9dd7c6129683 891 if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE)
sam_grove 0:9dd7c6129683 892 {
sam_grove 0:9dd7c6129683 893 UNS8 NodeID;
sam_grove 0:9dd7c6129683 894
sam_grove 0:9dd7c6129683 895 NodeID=getNodeId(d);
sam_grove 0:9dd7c6129683 896 MSG_WAR(0x3D38, "SlaveLSS Node ID inquired ", NodeID);
sam_grove 0:9dd7c6129683 897 sendSlaveLSSMessage(d,msg_cs,&NodeID,0);
sam_grove 0:9dd7c6129683 898 }
sam_grove 0:9dd7c6129683 899 else{
sam_grove 0:9dd7c6129683 900 MSG_WAR(0x3D39, "SlaveLSS not in configuration mode",0);
sam_grove 0:9dd7c6129683 901 }
sam_grove 0:9dd7c6129683 902 break;
sam_grove 0:9dd7c6129683 903 #ifdef CO_ENABLE_LSS_FS
sam_grove 0:9dd7c6129683 904 case LSS_IDENT_FASTSCAN:
sam_grove 0:9dd7c6129683 905 {
sam_grove 0:9dd7c6129683 906 /* If the nodeID isn't 0xFF the slave shall not participate */
sam_grove 0:9dd7c6129683 907 if(getNodeId(d)!=0xFF)break;
sam_grove 0:9dd7c6129683 908 if(getLSSBitCheck(m)==128)d->lss_transfer.FastScan_SM=LSS_FS_RESET;
sam_grove 0:9dd7c6129683 909
sam_grove 0:9dd7c6129683 910 switch(d->lss_transfer.FastScan_SM){
sam_grove 0:9dd7c6129683 911 case LSS_FS_RESET:
sam_grove 0:9dd7c6129683 912 {
sam_grove 0:9dd7c6129683 913 UNS32 errorCode;
sam_grove 0:9dd7c6129683 914 const indextable *ptrTable;
sam_grove 0:9dd7c6129683 915 ODCallback_t *Callback;
sam_grove 0:9dd7c6129683 916
sam_grove 0:9dd7c6129683 917 MSG_WAR(0x3D3A, "SlaveLSS Reseting LSSPos", 0);
sam_grove 0:9dd7c6129683 918 d->lss_transfer.LSSPos=0;
sam_grove 0:9dd7c6129683 919 d->lss_transfer.FastScan_SM=LSS_FS_PROCESSING;
sam_grove 0:9dd7c6129683 920
sam_grove 0:9dd7c6129683 921 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
sam_grove 0:9dd7c6129683 922 d->lss_transfer.IDNumber=*(UNS32*)ptrTable->pSubindex[d->lss_transfer.LSSPos+1].pObject;
sam_grove 0:9dd7c6129683 923
sam_grove 0:9dd7c6129683 924 sendSlaveLSSMessage(d,LSS_IDENT_SLAVE,0,0);
sam_grove 0:9dd7c6129683 925 }
sam_grove 0:9dd7c6129683 926 break;
sam_grove 0:9dd7c6129683 927 case LSS_FS_PROCESSING:/*if(getLSSBitCheck(m)<32)*/
sam_grove 0:9dd7c6129683 928 if(d->lss_transfer.LSSPos==getLSSSub(m))
sam_grove 0:9dd7c6129683 929 {
sam_grove 0:9dd7c6129683 930 UNS32 Mask=0xFFFFFFFF<<getLSSBitCheck(m);
sam_grove 0:9dd7c6129683 931
sam_grove 0:9dd7c6129683 932 MSG_WAR(0x3D3B, "SlaveLSS FastScan IDNumber", getLSSIdent(m));
sam_grove 0:9dd7c6129683 933 MSG_WAR(0x3D3C, "SlaveLSS FastScan BitMask ", Mask);
sam_grove 0:9dd7c6129683 934 MSG_WAR(0x3D3D, "SlaveLSS FastScan LSS-ID ", d->lss_transfer.IDNumber);
sam_grove 0:9dd7c6129683 935
sam_grove 0:9dd7c6129683 936 if((getLSSIdent(m) & Mask)==(d->lss_transfer.IDNumber & Mask))
sam_grove 0:9dd7c6129683 937 {
sam_grove 0:9dd7c6129683 938 sendSlaveLSSMessage(d,LSS_IDENT_SLAVE,0,0);
sam_grove 0:9dd7c6129683 939 }
sam_grove 0:9dd7c6129683 940
sam_grove 0:9dd7c6129683 941 if(getLSSBitCheck(m)==0)
sam_grove 0:9dd7c6129683 942 {
sam_grove 0:9dd7c6129683 943 d->lss_transfer.FastScan_SM=LSS_FS_CONFIRMATION;
sam_grove 0:9dd7c6129683 944 }
sam_grove 0:9dd7c6129683 945 }
sam_grove 0:9dd7c6129683 946 break;
sam_grove 0:9dd7c6129683 947 case LSS_FS_CONFIRMATION:
sam_grove 0:9dd7c6129683 948 if(d->lss_transfer.LSSPos==getLSSSub(m))
sam_grove 0:9dd7c6129683 949 {
sam_grove 0:9dd7c6129683 950 if(getLSSIdent(m)==d->lss_transfer.IDNumber)
sam_grove 0:9dd7c6129683 951 {
sam_grove 0:9dd7c6129683 952 /* Current LSS-ID[sub] confirmed correctly */
sam_grove 0:9dd7c6129683 953 MSG_WAR(0x3D3E, "SlaveLSS FastScan IDNumber and LSS-ID match=>", d->lss_transfer.IDNumber);
sam_grove 0:9dd7c6129683 954 if(d->lss_transfer.LSSPos==3)
sam_grove 0:9dd7c6129683 955 {
sam_grove 0:9dd7c6129683 956 /* All LSS-ID[sub] identified correctly, switching to configuration mode */
sam_grove 0:9dd7c6129683 957 MSG_WAR(0x3D3F, "SlaveLSS switching to configuration mode ", 0);
sam_grove 0:9dd7c6129683 958 d->lss_transfer.nodeID=getNodeId(d);
sam_grove 0:9dd7c6129683 959 d->lss_transfer.mode=LSS_CONFIGURATION_MODE;
sam_grove 0:9dd7c6129683 960 d->lss_transfer.FastScan_SM=LSS_FS_RESET;
sam_grove 0:9dd7c6129683 961 d->lss_transfer.LSSPos=0xFF;
sam_grove 0:9dd7c6129683 962 }
sam_grove 0:9dd7c6129683 963 else
sam_grove 0:9dd7c6129683 964 {
sam_grove 0:9dd7c6129683 965 /* Switch to the next LSS-ID[sub] */
sam_grove 0:9dd7c6129683 966 UNS32 errorCode;
sam_grove 0:9dd7c6129683 967 const indextable *ptrTable;
sam_grove 0:9dd7c6129683 968 ODCallback_t *Callback;
sam_grove 0:9dd7c6129683 969
sam_grove 0:9dd7c6129683 970 d->lss_transfer.LSSPos=getLSSNext(m);
sam_grove 0:9dd7c6129683 971 ptrTable = (*d->scanIndexOD)(0x1018, &errorCode, &Callback);
sam_grove 0:9dd7c6129683 972 d->lss_transfer.IDNumber=*(UNS32*)ptrTable->pSubindex[d->lss_transfer.LSSPos+1].pObject;
sam_grove 0:9dd7c6129683 973 d->lss_transfer.FastScan_SM=LSS_FS_PROCESSING;
sam_grove 0:9dd7c6129683 974 }
sam_grove 0:9dd7c6129683 975 sendSlaveLSSMessage(d,LSS_IDENT_SLAVE,0,0);
sam_grove 0:9dd7c6129683 976 }
sam_grove 0:9dd7c6129683 977 }
sam_grove 0:9dd7c6129683 978 break;
sam_grove 0:9dd7c6129683 979 }
sam_grove 0:9dd7c6129683 980 }
sam_grove 0:9dd7c6129683 981 break;
sam_grove 0:9dd7c6129683 982 #endif
sam_grove 0:9dd7c6129683 983 default:
sam_grove 0:9dd7c6129683 984 MSG_ERR(0x1D40, "SlaveLSS command not implemented", msg_cs);
sam_grove 0:9dd7c6129683 985 return 0xFF;
sam_grove 0:9dd7c6129683 986 }
sam_grove 0:9dd7c6129683 987
sam_grove 0:9dd7c6129683 988 return 0;
sam_grove 0:9dd7c6129683 989 }
sam_grove 0:9dd7c6129683 990
sam_grove 0:9dd7c6129683 991 /*UNS8 configNetworkNode(CO_Data* d, UNS8 command, void *dat1, void* dat2)
sam_grove 0:9dd7c6129683 992 {
sam_grove 0:9dd7c6129683 993 return sendMasterLSSMessage(d,command,dat1,dat2);
sam_grove 0:9dd7c6129683 994 }*/
sam_grove 0:9dd7c6129683 995
sam_grove 0:9dd7c6129683 996 UNS8 configNetworkNode (CO_Data* d, UNS8 command, void *dat1, void* dat2, LSSCallback_t Callback)
sam_grove 0:9dd7c6129683 997 {
sam_grove 0:9dd7c6129683 998 //d->lss_transfer.state=LSS_TRANS_IN_PROGRESS;
sam_grove 0:9dd7c6129683 999 d->lss_transfer.Callback=Callback;
sam_grove 0:9dd7c6129683 1000 d->lss_transfer.command=command;
sam_grove 0:9dd7c6129683 1001
sam_grove 0:9dd7c6129683 1002 StopLSS_MSG_TIMER();
sam_grove 0:9dd7c6129683 1003 //StartLSS_MSG_TIMER();
sam_grove 0:9dd7c6129683 1004
sam_grove 0:9dd7c6129683 1005 return sendMasterLSSMessage(d,command,dat1,dat2);
sam_grove 0:9dd7c6129683 1006 }
sam_grove 0:9dd7c6129683 1007
sam_grove 0:9dd7c6129683 1008 UNS8 getConfigResultNetworkNode (CO_Data* d, UNS8 command, UNS32* dat1, UNS8* dat2)
sam_grove 0:9dd7c6129683 1009 {
sam_grove 0:9dd7c6129683 1010 *dat1=d->lss_transfer.dat1;
sam_grove 0:9dd7c6129683 1011 *dat2=d->lss_transfer.dat2;
sam_grove 0:9dd7c6129683 1012 return d->lss_transfer.state;
sam_grove 0:9dd7c6129683 1013 }
sam_grove 0:9dd7c6129683 1014
sam_grove 0:9dd7c6129683 1015 //void _lss_StoreConfiguration(UNS8 *error, UNS8 *spec_error){printf("_lss_StoreConfiguration\n");}
sam_grove 0:9dd7c6129683 1016
sam_grove 0:9dd7c6129683 1017 #endif