added canChangeBaudRate to the driver interface
authorgroke6
Thu, 07 Feb 2008 10:25:15 +0100
changeset 384 83793fc7ce48
parent 383 7d8afedb8769
child 385 fff25f16c923
added canChangeBaudRate to the driver interface
drivers/AVR/can_AVR.c
drivers/can_can4linux/can_can4linux.c
drivers/can_ixxat_win32/ixxat.cpp
drivers/can_lincan/can_lincan.c
drivers/can_peak_linux/can_peak_linux.c
drivers/can_peak_win32/can_peak_win32.c
drivers/can_socket/can_socket.c
drivers/can_tcp_win32/can_tcp_win32.cpp
drivers/can_uvccm_win32/can_uvccm_win32.cpp
drivers/can_virtual/can_virtual.c
drivers/hcs12/canOpenDriver.c
drivers/unix/unix.c
examples/TestMasterSlaveLSS/Master.c
examples/TestMasterSlaveLSS/Master.h
examples/TestMasterSlaveLSS/SlaveA.c
examples/TestMasterSlaveLSS/SlaveA.h
examples/TestMasterSlaveLSS/SlaveB.c
examples/TestMasterSlaveLSS/SlaveB.h
examples/TestMasterSlaveLSS/TestMasterSlaveLSS.c
include/AVR/can_AVR.h
include/AVR/canfestival.h
include/can_driver.h
include/data.h
include/hcs12/canOpenDriver.h
include/lss.h
include/unix/canfestival.h
include/win32/canfestival.h
src/lss.c
--- a/drivers/AVR/can_AVR.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/AVR/can_AVR.c	Thu Feb 07 10:25:15 2008 +0100
@@ -156,6 +156,13 @@
   }
 }
 
+/***************************************************************************/
+unsigned char canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+{
+
+	return 0;
+}
+
 #ifdef  __IAR_SYSTEMS_ICC__
 #pragma type_attribute = __interrupt
 #pragma vector=CANIT_vect
--- a/drivers/can_can4linux/can_can4linux.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_can4linux/can_can4linux.c	Thu Feb 07 10:25:15 2008 +0100
@@ -32,14 +32,14 @@
 #include "can4linux.h" 
 #include "can_driver.h"
 
-struct timeval init_time,current_time;
+//struct timeval init_time,current_time;
 
 /*********functions which permit to communicate with the board****************/
 UNS8 canReceive_driver(CAN_HANDLE fd0, Message *m)
 {
   int res,i;
   canmsg_t canmsg;
-  long int time_period;
+  //long int time_period;
 
 	canmsg.flags = 0; 
 	do{
@@ -104,26 +104,9 @@
   return 0;
 }
 
-/***************************************************************************/
-int	set_bitrate( CAN_HANDLE fd, int baud)
-{
-    Config_par_t  cfg;	
-    volatile Command_par_t cmd;
-
-    cmd.cmd = CMD_STOP;
-    ioctl(fd, COMMAND, &cmd);
-
-    cfg.target = CONF_TIMING; 
-    cfg.val1   = baud;
-    ioctl(fd, CONFIG, &cfg);
-
-    cmd.cmd = CMD_START;
-    ioctl(fd, COMMAND, &cmd);
-    return 0;
-}
 
 /***************************************************************************/
-int TranslateBaudeRate(char* optarg){
+int TranslateBaudRate(char* optarg){
 	if(!strcmp( optarg, "1M")) return (int)1000;
 	if(!strcmp( optarg, "500K")) return (int)500;
 	if(!strcmp( optarg, "250K")) return (int)250;
@@ -133,8 +116,35 @@
 	if(!strcmp( optarg, "20K")) return (int)20;
 	if(!strcmp( optarg, "10K")) return (int)10;
 	if(!strcmp( optarg, "5K")) return (int)5;
-	if(!strcmp( optarg, "none")) return 0;
-	return 0x0000;
+	return 0;
+}
+
+UNS8 _canChangeBaudRate( CAN_HANDLE fd, int baud)
+{
+    Config_par_t  cfg;	
+    volatile Command_par_t cmd;
+    
+    cmd.cmd = CMD_STOP;
+    ioctl(fd, COMMAND, &cmd);
+
+	cfg.target = CONF_TIMING; 
+    cfg.val1  = baud;
+    ioctl(fd, CONFIG, &cfg);
+
+    cmd.cmd = CMD_START;
+    ioctl(fd, COMMAND, &cmd);
+    
+    return 0;
+}
+
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+{
+    int temp=TranslateBaudRate(baud);
+
+    if(temp==0)return 1;
+    _canChangeBaudRate(fd, temp);
+    printf("Baudrate changed to=>%s\n", baud);
+    return 0;
 }
 
 /***************************************************************************/
@@ -146,8 +156,9 @@
   int prefix_len = strlen(lnx_can_dev_prefix);
   char dev_name[prefix_len+name_len+1];
   int o_flags = 0;
-  int baud = TranslateBaudeRate(board->baudrate);
+  //int baud = TranslateBaudeRate(board->baudrate);
   int fd0;
+  int res;
 
   
   /*o_flags = O_NONBLOCK;*/
@@ -162,7 +173,13 @@
     goto error_ret;
   }
   
-  set_bitrate((CAN_HANDLE)fd0, baud);
+  res=TranslateBaudRate(board->baudrate);
+  if(res == 0){
+    fprintf(stderr,"!!! %s baudrate not supported. See can4linux.c\n", board->baudrate);
+    goto error_ret;
+  }
+	
+  _canChangeBaudRate( (CAN_HANDLE)fd0, res);
 
   printf("CAN device dev/can%s opened. Baudrate=>%s\n",board->busname, board->baudrate);
 
--- a/drivers/can_ixxat_win32/ixxat.cpp	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_ixxat_win32/ixxat.cpp	Thu Feb 07 10:25:15 2008 +0100
@@ -325,3 +325,10 @@
    delete reinterpret_cast<IXXAT*>(inst);
    return 1;
    }
+   
+extern "C"
+   UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+	{
+	//printf("canChangeBaudRate not yet supported by this driver\n");
+	return 0;
+	}
\ No newline at end of file
--- a/drivers/can_lincan/can_lincan.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_lincan/can_lincan.c	Thu Feb 07 10:25:15 2008 +0100
@@ -90,6 +90,13 @@
 }
 
 /***************************************************************************/
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+{
+	printf("canChangeBaudRate not yet supported by this driver\n");
+	return 0;
+}
+
+/***************************************************************************/
 static const char lnx_can_dev_prefix[] = "/dev/can";
 
 CAN_HANDLE canOpen_driver(s_BOARD *board)
--- a/drivers/can_peak_linux/can_peak_linux.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_peak_linux/can_peak_linux.c	Thu Feb 07 10:25:15 2008 +0100
@@ -100,6 +100,12 @@
 	return 0x0000;
 }
 
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+{
+	printf("canChangeBaudRate not yet supported by this driver\n");
+	return 0;
+}
+
 /***************************************************************************/
 CAN_HANDLE canOpen_driver(s_BOARD *board)
 {
--- a/drivers/can_peak_win32/can_peak_win32.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_peak_win32/can_peak_win32.c	Thu Feb 07 10:25:15 2008 +0100
@@ -211,6 +211,13 @@
 }
 
 /***************************************************************************/
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+{
+	printf("canChangeBaudRate not yet supported by this driver\n");
+	return 0;
+}
+
+/***************************************************************************/
 CAN_HANDLE
 canOpen_driver (s_BOARD * board)
 {
--- a/drivers/can_socket/can_socket.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_socket/can_socket.c	Thu Feb 07 10:25:15 2008 +0100
@@ -153,6 +153,12 @@
 }
 #endif
 
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+{
+	printf("canChangeBaudRate not yet supported by this driver\n");
+	return 0;
+}
+
 /***************************************************************************/
 CAN_HANDLE
 canOpen_driver (s_BOARD * board)
--- a/drivers/can_tcp_win32/can_tcp_win32.cpp	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_tcp_win32/can_tcp_win32.cpp	Thu Feb 07 10:25:15 2008 +0100
@@ -117,4 +117,9 @@
    delete reinterpret_cast<SocketClient*>(inst);
    return 1;
    }
-
+extern "C"
+	UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+	{
+	cerr << "canChangeBaudRate not yet supported by this driver\n";
+	return 0;
+	}
\ No newline at end of file
--- a/drivers/can_uvccm_win32/can_uvccm_win32.cpp	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_uvccm_win32/can_uvccm_win32.cpp	Thu Feb 07 10:25:15 2008 +0100
@@ -348,5 +348,8 @@
    return 1;
    }
 
-
-   
\ No newline at end of file
+extern "C"
+	UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+	{
+	return 0;
+	} 
\ No newline at end of file
--- a/drivers/can_virtual/can_virtual.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/can_virtual/can_virtual.c	Thu Feb 07 10:25:15 2008 +0100
@@ -76,20 +76,28 @@
   }
   return 0;
 }
-/*
-int TranslateBaudeRate(char* optarg){
-	if(!strcmp( optarg, "1M")) return 1000;
-	if(!strcmp( optarg, "500K")) return 500;
-	if(!strcmp( optarg, "250K")) return 250;
-	if(!strcmp( optarg, "125K")) return 125;
-	if(!strcmp( optarg, "100K")) return 100;
-	if(!strcmp( optarg, "50K")) return 50;
-	if(!strcmp( optarg, "20K")) return 20;
-	if(!strcmp( optarg, "10K")) return 10;
-	if(!strcmp( optarg, "5K")) return 5;
+
+/***************************************************************************/
+int TranslateBaudRate(char* optarg){
+	if(!strcmp( optarg, "1M")) return (int)1000;
+	if(!strcmp( optarg, "500K")) return (int)500;
+	if(!strcmp( optarg, "250K")) return (int)250;
+	if(!strcmp( optarg, "125K")) return (int)125;
+	if(!strcmp( optarg, "100K")) return (int)100;
+	if(!strcmp( optarg, "50K")) return (int)50;
+	if(!strcmp( optarg, "20K")) return (int)20;
+	if(!strcmp( optarg, "10K")) return (int)10;
+	if(!strcmp( optarg, "5K")) return (int)5;
 	if(!strcmp( optarg, "none")) return 0;
-	return 0;
-}*/
+	return 0x0000;
+}
+
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd0, char* baud)
+{
+    printf("%x-> changing to baud rate %s[%d]\n", (CANPipe*)fd0 - &canpipes[0],baud,TranslateBaudRate(baud)); 
+    return 0;
+}
+
 /***************************************************************************/
 CAN_HANDLE canOpen_driver(s_BOARD *board)
 {
--- a/drivers/hcs12/canOpenDriver.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/hcs12/canOpenDriver.c	Thu Feb 07 10:25:15 2008 +0100
@@ -134,7 +134,7 @@
 char *
 hex_convert (char *buf, unsigned long value, char lastCar)
 {
-  //Thanks to Stéphane Carrez for this function
+  //Thanks to Stphane Carrez for this function
   char num[32];
   int pos;
 
@@ -508,7 +508,10 @@
   return 0;
 }
 
-
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
+{
+    return 0;
+}
 /**************************************************************************/
 UNS8 f_can_receive(UNS8 notused, Message *msgRcv)
 { 
--- a/drivers/unix/unix.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/drivers/unix/unix.c	Thu Feb 07 10:25:15 2008 +0100
@@ -101,6 +101,7 @@
 	DLSYM(canReceive)
 	DLSYM(canSend)
 	DLSYM(canOpen)
+	DLSYM(canChangeBaudRate)
 	DLSYM(canClose)
 
 	return handle;
@@ -188,3 +189,16 @@
 	WaitReceiveTaskEnd(tmp->receiveTask);
 	return res;
 }
+
+
+UNS8 canChangeBaudRate(CAN_PORT port, char* baud)
+{
+   if(port){
+		UNS8 res;
+	        //LeaveMutex();
+		res = DLL_CALL(canChangeBaudRate)(((CANPort*)port)->fd, baud);
+		//EnterMutex();
+		return res; // OK
+	}               
+	return 1; // NOT OK
+}
--- a/examples/TestMasterSlaveLSS/Master.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/examples/TestMasterSlaveLSS/Master.c	Thu Feb 07 10:25:15 2008 +0100
@@ -23,10 +23,9 @@
 #include "Master.h"
 #include "SlaveA.h"
 #include "SlaveB.h"
-#include "TestMasterSlaveLSS.h"
-
-extern s_BOARD MasterBoard; 
-
+#include "TestMasterSlaveLSS.h" 
+
+extern s_BOARD MasterBoard;
 /*****************************************************************************/
 void TestMaster_heartbeatError(CO_Data* d, UNS8 heartbeatID)
 {
@@ -217,15 +216,16 @@
 	
 				/* The slaves are now configured (nodeId and Baudrate) via the LSS services.
    			 	* Switch the LSS state to WAITING and restart the slaves. */
+   			 	MasterBoard.baudrate="250K";
    	
 	   			printf("Master : Switch Delay period finished. Switching to LSS WAITING state\n");
-   				configNetworkNode(&TestMaster_Data,LSS_SM_GLOBAL,&LSS_mode,0,NULL);
+   				configNetworkNode(d,LSS_SM_GLOBAL,&LSS_mode,0,NULL);
 	   			
    				printf("Master : Restarting all the slaves\n");
-   				masterSendNMTstateChange (&TestMaster_Data, 0x00, NMT_Reset_Node);
+   				masterSendNMTstateChange (d, 0x00, NMT_Reset_Node);
 	   			
    				printf("Master : Starting the SYNC producer\n");
-   				writeLocalDict( &TestMaster_Data, /*CO_Data* d*/
+   				writeLocalDict( d, /*CO_Data* d*/
 					0x1006, /*UNS16 index*/
 					0x00, /*UNS8 subind*/ 
 					&SINC_cicle, /*void * pSourceData,*/ 
@@ -235,8 +235,12 @@
 				return;
 			}
    			else{
-	   			printf("Master : unable to activate bit timing. trying again\n");
-   				init_step_LSS--;
+   				UNS16 Switch_delay=1;
+				UNS8 LSS_mode=LSS_CONFIGURATION_MODE;
+				
+	   			eprintf("Master : unable to activate bit timing. trying again\n");
+				configNetworkNode(d,LSS_CONF_ACT_BIT_TIMING,&Switch_delay,0,CheckLSSAndContinue);
+				return;
    			}
    			break;	
 		case LSS_SM_SELECTIVE_SERIAL:
@@ -257,9 +261,9 @@
 				 * Start the configuration of the baud rate. */
 				eprintf("Master : There are not no-configured slaves in the net\n", command);
 				eprintf("Switching all the nodes to LSS CONFIGURATION state\n");
-				configNetworkNode(&TestMaster_Data,LSS_SM_GLOBAL,&LSS_mode,0,NULL);
+				configNetworkNode(d,LSS_SM_GLOBAL,&LSS_mode,0,NULL);
 				eprintf("LSS=>Activate Bit Timing\n");
-				configNetworkNode(&TestMaster_Data,LSS_CONF_ACT_BIT_TIMING,&Switch_delay,0,CheckLSSAndContinue);
+				configNetworkNode(d,LSS_CONF_ACT_BIT_TIMING,&Switch_delay,0,CheckLSSAndContinue);
 				return;
    			}
    			break;
@@ -326,7 +330,8 @@
 	UNS32 Serial_Number_low=0x56789010;
 	UNS8 LSS_mode=LSS_WAITING_MODE;
 	UNS8 Baud_Table=0;
-	UNS8 Baud_BitTiming=3;
+	//UNS8 Baud_BitTiming=3;
+	char* Baud_BitTiming="250K";
 	UNS8 res;
 	eprintf("ConfigureLSSNode step %d -> ",init_step_LSS);
 
@@ -450,9 +455,3 @@
 		ConfigureSlaveNode(d, nodeid);
 }
 
-void TestMaster_ChangeBaudRate(CO_Data* d, char *baudrate)
-{
-	eprintf("TestMaster_ChangeBaudRate from %s to %s\n", MasterBoard.baudrate, baudrate);
-	MasterBoard.baudrate=baudrate;
-	/* something to do with the new baudrate */
-}
--- a/examples/TestMasterSlaveLSS/Master.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/examples/TestMasterSlaveLSS/Master.h	Thu Feb 07 10:25:15 2008 +0100
@@ -13,4 +13,4 @@
 void TestMaster_post_TPDO(CO_Data* d);
 void TestMaster_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg);
 void TestMaster_post_SlaveBootup(CO_Data* d, UNS8 nodeid);
-void TestMaster_ChangeBaudRate(CO_Data* d,char *baudrate);
+
--- a/examples/TestMasterSlaveLSS/SlaveA.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/examples/TestMasterSlaveLSS/SlaveA.c	Thu Feb 07 10:25:15 2008 +0100
@@ -24,7 +24,6 @@
 #include "Master.h"
 #include "TestMasterSlaveLSS.h"
 
-extern s_BOARD SlaveBoardA;
 /*****************************************************************************/
 void TestSlaveA_heartbeatError(CO_Data* d, UNS8 heartbeatID)
 {
@@ -87,9 +86,3 @@
 	printf("TestSlaveA_StoreConfiguration\n");
 }
 
-void TestSlaveA_ChangeBaudRate(CO_Data* d, char *baudrate)
-{
-	eprintf("TestSlaveA_ChangeBaudRate from %s to %s\n", SlaveBoardA.baudrate, baudrate);
-	SlaveBoardA.baudrate=baudrate;
-	/* something to do with the new baudrate */
-}
--- a/examples/TestMasterSlaveLSS/SlaveA.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/examples/TestMasterSlaveLSS/SlaveA.h	Thu Feb 07 10:25:15 2008 +0100
@@ -14,4 +14,3 @@
 void TestSlaveA_storeODSubIndex(CO_Data* d, UNS16 wIndex, UNS8 bSubindex);
 void TestSlaveA_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg);
 void TestSlaveA_StoreConfiguration(CO_Data* d, UNS8 *error, UNS8 *spec_error);
-void TestSlaveA_ChangeBaudRate(CO_Data* d, char *baudrate);
--- a/examples/TestMasterSlaveLSS/SlaveB.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/examples/TestMasterSlaveLSS/SlaveB.c	Thu Feb 07 10:25:15 2008 +0100
@@ -24,7 +24,6 @@
 #include "Master.h"
 #include "TestMasterSlaveLSS.h"
 
-extern s_BOARD SlaveBoardB;
 /*****************************************************************************/
 void TestSlaveB_heartbeatError(CO_Data* d, UNS8 heartbeatID)
 {
@@ -86,9 +85,3 @@
 	printf("TestSlaveB_StoreConfiguration\n");
 }
 
-void TestSlaveB_ChangeBaudRate(CO_Data* d, char *baudrate)
-{
-	eprintf("TestSlave2_ChangeBaudRate from %s to %s\n", SlaveBoardB.baudrate, baudrate);
-	SlaveBoardB.baudrate=baudrate;
-	/* something to do with the new baudrate */
-}
--- a/examples/TestMasterSlaveLSS/SlaveB.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/examples/TestMasterSlaveLSS/SlaveB.h	Thu Feb 07 10:25:15 2008 +0100
@@ -14,4 +14,3 @@
 void TestSlaveB_storeODSubIndex(CO_Data* d, UNS16 wIndex, UNS8 bSubindex);
 void TestSlaveB_post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg);
 void TestSlaveB_StoreConfiguration(CO_Data* d, UNS8 *error, UNS8 *spec_error);
-void TestSlaveB_ChangeBaudRate(CO_Data* d, char *baudrate);
--- a/examples/TestMasterSlaveLSS/TestMasterSlaveLSS.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/examples/TestMasterSlaveLSS/TestMasterSlaveLSS.c	Thu Feb 07 10:25:15 2008 +0100
@@ -203,7 +203,6 @@
 		TestSlaveA_Data.post_emcy = TestSlaveA_post_emcy;
 		/* in this example the slave doesn't support Store configuration*/
 		TestSlaveA_Data.lss_StoreConfiguration = TestSlaveA_StoreConfiguration;
-		TestSlaveA_Data.lss_ChangeBaudRate=TestSlaveA_ChangeBaudRate;
 
 		if(!canOpen(&SlaveBoardA,&TestSlaveA_Data)){
 			eprintf("Cannot open SlaveA Board (%s,%s)\n",SlaveBoardA.busname, SlaveBoardA.baudrate);
@@ -223,8 +222,6 @@
 		TestSlaveB_Data.storeODSubIndex = TestSlaveB_storeODSubIndex;
 		TestSlaveB_Data.post_emcy = TestSlaveB_post_emcy;
 		TestSlaveB_Data.lss_StoreConfiguration = TestSlaveB_StoreConfiguration;
-		TestSlaveB_Data.lss_ChangeBaudRate=TestSlaveB_ChangeBaudRate;
-
 
 		if(!canOpen(&SlaveBoardB,&TestSlaveB_Data)){
 			eprintf("Cannot open SlaveB Board (%s,%s)\n",SlaveBoardB.busname, SlaveBoardB.baudrate);
@@ -243,7 +240,6 @@
 		TestMaster_Data.post_TPDO = TestMaster_post_TPDO;
 		TestMaster_Data.post_emcy = TestMaster_post_emcy;
 		TestMaster_Data.post_SlaveBootup=TestMaster_post_SlaveBootup;
-		TestMaster_Data.lss_ChangeBaudRate=TestMaster_ChangeBaudRate;
 		
 		if(!canOpen(&MasterBoard,&TestMaster_Data)){
 			eprintf("Cannot open Master Board (%s,%s)\n",MasterBoard.busname, MasterBoard.baudrate);
--- a/include/AVR/can_AVR.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/include/AVR/can_AVR.h	Thu Feb 07 10:25:15 2008 +0100
@@ -51,4 +51,5 @@
 unsigned char canInit(unsigned int bitrate);
 unsigned char canSend(CAN_PORT notused, Message *m);
 unsigned char canReceive(Message *m);
+unsigned char canChangeBaudRate_driver( CAN_HANDLE fd, char* baud);
 #endif
--- a/include/AVR/canfestival.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/include/AVR/canfestival.h	Thu Feb 07 10:25:15 2008 +0100
@@ -30,5 +30,6 @@
 // ---------  to be called by user app ---------
 void initTimer(void);
 UNS8 canSend(CAN_PORT notused, Message *m);
+UNS8 canChangeBaudRate(CAN_PORT port, char* baud);
 
 #endif
--- a/include/can_driver.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/include/can_driver.h	Thu Feb 07 10:25:15 2008 +0100
@@ -48,6 +48,7 @@
 UNS8 DLL_CALL(canSend)(CAN_HANDLE, Message *)FCT_PTR_INIT;
 CAN_HANDLE DLL_CALL(canOpen)(s_BOARD *)FCT_PTR_INIT;
 int DLL_CALL(canClose)(CAN_HANDLE)FCT_PTR_INIT;
+UNS8 DLL_CALL(canChangeBaudRate)(CAN_HANDLE, char *)FCT_PTR_INIT;
 
 #if defined DEBUG_MSG_CONSOLE_ON || defined NEED_PRINT_MESSAGE
 #include "def.h"
--- a/include/data.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/include/data.h	Thu Feb 07 10:25:15 2008 +0100
@@ -117,7 +117,6 @@
 	/* LSS */
 	lss_transfer_t lss_transfer;
 	lss_StoreConfiguration_t lss_StoreConfiguration;
-	lss_ChangeBaudRate_t lss_ChangeBaudRate;
 #endif	
 };
 
@@ -180,8 +179,7 @@
 		0						/* LSSanswer */\
 		lss_fs_Initializer		/*FastScan service initialization */\
 	  },\
-	  NULL, 	/* _lss_StoreConfiguration*/\
-	  NULL    /* _lss_ChangeBaudRate */
+	  NULL 	/* _lss_StoreConfiguration*/
 #else
 #define lss_Initializer
 #endif
--- a/include/hcs12/canOpenDriver.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/include/hcs12/canOpenDriver.h	Thu Feb 07 10:25:15 2008 +0100
@@ -39,5 +39,6 @@
 (see include/hcs12/canOpenDriver.c)
  */
 UNS8 f_can_receive(UNS8 notused, Message *m);
+UNS8 canChangeBaudRate_driver( CAN_HANDLE fd, char* baud);
 
 #endif
--- a/include/lss.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/include/lss.h	Thu Feb 07 10:25:15 2008 +0100
@@ -74,7 +74,7 @@
 typedef void (*lss_StoreConfiguration_t)(CO_Data* d,UNS8*,UNS8*);
 //void _lss_StoreConfiguration(UNS8 *error, UNS8 *spec_error);
 
-typedef void (*lss_ChangeBaudRate_t)(CO_Data* d,char*);
+//typedef void (*lss_ChangeBaudRate_t)(CO_Data* d,char*);
 //void _lss_ChangeBaudRate(char *BaudRate);
 
 
--- a/include/unix/canfestival.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/include/unix/canfestival.h	Thu Feb 07 10:25:15 2008 +0100
@@ -18,6 +18,7 @@
 UNS8 canSend(CAN_PORT port, Message *m);
 CAN_PORT canOpen(s_BOARD *board, CO_Data * d);
 int canClose(CO_Data * d);
+UNS8 canChangeBaudRate(CAN_PORT port, char* baud);
 
 #ifdef __cplusplus
 };
--- a/include/win32/canfestival.h	Tue Feb 05 10:18:25 2008 +0100
+++ b/include/win32/canfestival.h	Thu Feb 07 10:25:15 2008 +0100
@@ -36,5 +36,6 @@
 UNS8 canSend(CAN_PORT port, Message *m);
 CAN_PORT canOpen(s_BOARD *board, CO_Data * d);
 int canClose(CO_Data * d);
+UNS8 canChangeBaudRate(CAN_PORT port, char* baud);
 
 #endif /*CANFESTIVAL_H_*/
--- a/src/lss.c	Tue Feb 05 10:18:25 2008 +0100
+++ b/src/lss.c	Thu Feb 07 10:25:15 2008 +0100
@@ -162,7 +162,8 @@
    	if(d->lss_transfer.switchDelayState==SDELAY_FIRST){
    		MSG_WAR(0x3D0B, "LSS switch delay first period expired",0);
     	d->lss_transfer.switchDelayState=SDELAY_SECOND;
-    	(*d->lss_ChangeBaudRate)(d,d->lss_transfer.baudRate);
+    	//(*d->lss_ChangeBaudRate)(d,d->lss_transfer.baudRate);
+    	canChangeBaudRate(d->lss_transfer.canHandle_t, d->lss_transfer.baudRate);
     }
     else{ /* d->lss_transfer.switchDelayState==SDELAY_SECOND */
     	MSG_WAR(0x3D0C, "LSS switch delay second period expired",0);
@@ -346,6 +347,20 @@
   
   return canSend(d->canHandle,&m);
 }
+			
+/* If a baud rate is not supported just comment the line. */
+static UNS8 CO_TranslateBaudRate(char* optarg){
+	if(!strcmp( optarg, "1M")) return 0x00;
+	if(!strcmp( optarg, "800K")) return 0x01;
+	if(!strcmp( optarg, "500K")) return 0x02;
+	if(!strcmp( optarg, "250K")) return 0x03;
+	if(!strcmp( optarg, "125K")) return 0x04;
+	if(!strcmp( optarg, "100K")) return 0x05;
+	if(!strcmp( optarg, "50K")) return 0x06;
+	if(!strcmp( optarg, "20K")) return 0x07;
+	if(!strcmp( optarg, "10K")) return 0x08;
+	return -1;
+}
 
 /*!                                                                                                
 **                                                                                                 
@@ -376,39 +391,28 @@
   	m.data[1]=*(UNS8 *)dat1;
   	break;
   case LSS_CONF_BIT_TIMING: /* Configure Bit Timing Parameters */
+  	
   	m.data[1]=*(UNS8 *)dat1;
-  	m.data[2]=*(UNS8 *)dat2;
-  	if(d->lss_ChangeBaudRate){
-		/* If a baud rate is not supported just comment the line. */
-		switch(m.data[2]){
-			case 0x00:d->lss_transfer.baudRate="1M";break;
-			case 0x01:d->lss_transfer.baudRate="800K";break;
-			case 0x02:d->lss_transfer.baudRate="500K";break;
-			case 0x03:d->lss_transfer.baudRate="250K";break;
-			case 0x04:d->lss_transfer.baudRate="125K";break;
-			case 0x05:d->lss_transfer.baudRate="100K";break;
-			case 0x06:d->lss_transfer.baudRate="50K";break;
-			case 0x07:d->lss_transfer.baudRate="20K";break;
-			case 0x08:d->lss_transfer.baudRate="10K";break;
-			default:
-				MSG_ERR(0x1D19, "Master-> Baud rate not supported",0);
-				d->lss_transfer.dat1=0xFF;
-				goto ErrorBitRateMaster;
-				break; 
-			}		
-		hasResponse=1;
-		break;
-	}
-	else{
+  	d->lss_transfer.baudRate=*(char **)dat2;
+  	
+  	if((m.data[2]=CO_TranslateBaudRate(d->lss_transfer.baudRate))>0){
+  		hasResponse=1;
+		break;	 
+  	}
+  		
+	MSG_ERR(0x1D19, "Master-> Baud rate not supported",0);
+	d->lss_transfer.dat1=0xFF;
+	
+	/* if bit timing is not supported comment the previous code and uncomment the following one*/
+	/*{
 		MSG_ERR(0x1D1A, "Master-> Bit timing not supported",0);
 		d->lss_transfer.dat1=0x01;
-	}
-	
-ErrorBitRateMaster:
+	}*/
+	
 	d->lss_transfer.dat2=0;
  	/* If there is a callback, it is responsible of the error */
 	if(d->lss_transfer.Callback)
-    	(*d->lss_transfer.Callback)(d,d->lss_transfer.command);
+	   	(*d->lss_transfer.Callback)(d,d->lss_transfer.command);
 	return 0xFF;
   	break;
   case LSS_CONF_ACT_BIT_TIMING: /* Activate Bit Timing Parameters */
@@ -417,6 +421,7 @@
 	if(d->lss_transfer.baudRate!="none"){
 		d->lss_transfer.switchDelay=(UNS16)(*(UNS32*)dat1 & 0xFFFF);
 		d->lss_transfer.switchDelayState=SDELAY_FIRST;
+		d->lss_transfer.canHandle_t=d->canHandle;
 		res=canSend(d->canHandle,&m);
   		if(res==0){
   			StartLSS_SDELAY_TIMER();
@@ -673,31 +678,21 @@
 		UNS8 spec_error=0;
 			
 		if(d->lss_transfer.mode==LSS_CONFIGURATION_MODE){
-			/* Change the baud rate only if the function lss_ChangeBaudRate 
-			 * has been implemented. If not send an error.
-			 */
-			if(d->lss_ChangeBaudRate){
-				/* If a baud rate is not supported just comment the line. */
-				switch(m->data[2]){
-				case 0x00:d->lss_transfer.baudRate="1M";break;
-				case 0x01:d->lss_transfer.baudRate="800K";break;
-				case 0x02:d->lss_transfer.baudRate="500K";break;
-				case 0x03:d->lss_transfer.baudRate="250K";break;
-				case 0x04:d->lss_transfer.baudRate="125K";break;
-				case 0x05:d->lss_transfer.baudRate="100K";break;
-				case 0x06:d->lss_transfer.baudRate="50K";break;
-				case 0x07:d->lss_transfer.baudRate="20K";break;
-				case 0x08:d->lss_transfer.baudRate="10K";break;
-				default:
-					MSG_ERR(0x1D28, "Baud rate not supported",0);
-					error_code=0xFF; /* Baud rate not supported*/
-					break; 
-				}		
-			}
-			else
-			{
-				MSG_ERR(0x1D29, "Bit timing not supported",0);
-				error_code=0x01; /* bit timing not supported */
+			/* If a baud rate is not supported just comment the line. */
+			switch(m->data[2]){
+			case 0x00:d->lss_transfer.baudRate="1M";break;
+			case 0x01:d->lss_transfer.baudRate="800K";break;
+			case 0x02:d->lss_transfer.baudRate="500K";break;
+			case 0x03:d->lss_transfer.baudRate="250K";break;
+			case 0x04:d->lss_transfer.baudRate="125K";break;
+			case 0x05:d->lss_transfer.baudRate="100K";break;
+			case 0x06:d->lss_transfer.baudRate="50K";break;
+			case 0x07:d->lss_transfer.baudRate="20K";break;
+			case 0x08:d->lss_transfer.baudRate="10K";break;
+			default:
+				MSG_ERR(0x1D28, "Baud rate not supported",0);
+				error_code=0xFF; /* Baud rate not supported*/
+				break; 		
 			}
 		}
 		else{
@@ -706,6 +701,12 @@
 			break;
 		}
 		
+		/* if bit timing is not supported comment the previous code and uncomment the following */
+		/*{
+			MSG_ERR(0x1D29, "Bit timing not supported",0);
+			error_code=0x01; // bit timing not supported 
+		}*/
+			
 		sendSlaveLSSMessage(d,msg_cs,&error_code,&spec_error);
 	}
 	break;
@@ -981,6 +982,5 @@
 }
 
 //void _lss_StoreConfiguration(UNS8 *error, UNS8 *spec_error){printf("_lss_StoreConfiguration\n");}
-//void _lss_ChangeBaudRate(char *BaudRate){printf("_lss_ChangeBaudRate\n");}
 
 #endif