Merge further Ica changes
authorEdouard Tisserant
Sat, 21 Jan 2012 19:32:58 +0100
changeset 690 1c2cb6088050
parent 689 d6fcd388f2db (diff)
parent 676 11e95dd60ffc (current diff)
child 691 17d9c0736935
child 699 c26ea35559f8
child 715 5795fb789230
Merge further Ica changes
--- a/drivers/can_ixxat_win32/ixxat.cpp	Sat Jan 21 18:49:54 2012 +0100
+++ b/drivers/can_ixxat_win32/ixxat.cpp	Sat Jan 21 19:32:58 2012 +0100
@@ -70,8 +70,8 @@
       bool send(const Message *m);
       bool receive(Message *m);
    private:
-      bool open(const char* board_name, int board_number, const char* baud_rate);
-      bool close();                             
+      bool open(int board_number, const char* baud_rate);
+      bool close();
       void receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj);
       // VCI2 handler      
       static void VCI_CALLBACKATTR message_handler(char *msg_str);
@@ -108,19 +108,20 @@
                                m_RxQueHdl(0xFFFF)
                                
    {
-   char busname[100];
-   ::strcpy(busname,board->busname);
-   char board_name[100];      
-   long board_number = 0;   
-   char *ptr = ::strrchr(busname,':');
-   if (ptr != 0)
-      {
-      *ptr = 0;
-      ::strcpy(board_name,busname);
-      if (++ptr - busname < (int)::strlen(board->busname))
-         board_number = ::atoi(ptr);
-      }
-   if (!open(board_name,board_number,board->baudrate))
+   if (!board)
+      {
+      close();
+      throw error();
+      }
+
+   long board_number = 0;
+
+   if (board->busname)
+      {
+      board_number = atol(board->busname);
+      }
+
+   if (!open(board_number, board->baudrate))
       {
       close();
       throw error();
@@ -165,7 +166,7 @@
    return false;
    }
 
-bool IXXAT::open(const char* board_name, int board_number, const char* baud_rate)
+bool IXXAT::open(int board_number, const char* baud_rate)
    {
    // check, if baudrate is supported
    struct IXXAT_baud_rate_param 
@@ -196,21 +197,26 @@
        if (::strcmp(br_lut[index].baud_rate,baud_rate)==0)
           break;
        }
-   if (index == br_lut_size)    
+   if (index == br_lut_size)
+   {
+      MSG_ERR_DRV("IXXAT::open: The given baudrate %S is invalid.", baud_rate);
       return false;
+   }
    // close existing board   
    close();
    // init IXXAT board
-   unsigned long board_type = VCI_GetBrdTypeByName(const_cast<char*>(board_name));
-   long res = VCI2_PrepareBoard( board_type,                  // board type
-                                   board_number,              // unique board index
+   long res = VCI2_PrepareBoard(   0,                         // board type, unused in VCI2
+                                   board_number,              // unique board index, see XAT_EnumHwEntry() and XAT_GetConfig()
                                    NULL,                      // pointer to buffer for additional info 
                                    0,                         // length of additional info buffer
                                    message_handler,           // pointer to msg-callbackhandler
                                    receive_queuedata_handler, // pointer to receive-callbackhandler
                                    exception_handler);        // pointer to exception-callbackhandler
    if (res < 0)
+   {
+      MSG_ERR_DRV("IXXAT::open: VCI2_PrepareBoard failed with code '%d'.", res);
       return false;
+   }
    m_BoardHdl = (UINT16)res;
 
    VCI_ResetBoard(m_BoardHdl);
@@ -230,7 +236,7 @@
    res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_RX_QUE, 500, 1, 0, 100,  &m_RxQueHdl);
 
    //  assign the all IDs to the Receive Queue
-   res = VCI_AssignRxQueObj(m_BoardHdl, m_RxQueHdl ,VCI_ACCEPT, 0, 0) ;
+   res = VCI_AssignRxQueObj(m_BoardHdl, m_RxQueHdl ,VCI_ACCEPT, 0, 0);
 
    //  And now start the CAN
    res = VCI_StartCan(m_BoardHdl, CAN_NUM);
@@ -267,9 +273,7 @@
 
 void VCI_CALLBACKATTR IXXAT::message_handler(char *msg_str)
   {
-  char buf[200];
-  ::sprintf(buf,"IXXAT Message: [%s]\n", msg_str);
-  ::OutputDebugString(buf);
+  MSG_ERR_DRV("IXXAT Message: [%S]", msg_str);
   }
 
 void VCI_CALLBACKATTR IXXAT::exception_handler(VCI_FUNC_NUM func_num, INT32 err_code, UINT16 ext_err, char* err_str)
@@ -305,9 +309,8 @@
     "VCI_UpdateBufObj",
     "VCI_CciReqData"
     };
-  char buf[200];
-  ::sprintf(buf, "IXXAT Exception: %s (%i / %u) [%s]\n", Num2Function[func_num], err_code, ext_err, err_str);
-  ::OutputDebugString(buf);
+
+  MSG_ERR_DRV("IXXAT Exception: %S (%i / %u) [%S]", Num2Function[func_num], err_code, ext_err, err_str);
   }
 
   void IXXAT::watchdog()
@@ -317,9 +320,7 @@
 
     if (res < 0)
     {
-      char buf[200];
-      ::sprintf(buf, "\nIXXAT canBusWatchdog: ERROR: Reading the can state failed!\n");
-      ::OutputDebugString(buf);
+      MSG_ERR_DRV("IXXAT canBusWatchdog: ERROR: Reading the can state failed!");
     }
     else
     {
@@ -327,34 +328,34 @@
       {
         if (sts.sts & STS_CAN_BUS_OFF)
         {
-          ::OutputDebugString("\nIXXAT canBusWatchdog: CAN bus off detected!\n");
+          MSG_ERR_DRV("IXXAT canBusWatchdog: CAN bus off detected!");
         }
         if (sts.sts & STS_CAN_DATA_OVERRUN)
         {
-          ::OutputDebugString("\nIXXAT canBusWatchdog: CAN data overrun detected!\n");
+          MSG_ERR_DRV("IXXAT canBusWatchdog: CAN data overrun detected!");
         }
         if (sts.sts & STS_REMOTE_QUEUE_OVERRUN)
         {
-          ::OutputDebugString("\nIXXAT canBusWatchdog: Remote queue overrun detected!\n");
+          MSG_ERR_DRV("IXXAT canBusWatchdog: Remote queue overrun detected!");
         }
 
-        if (VCI_ResetCan(m_BoardHdl, CAN_NUM) < 0)
-        {
-          ::OutputDebugString("\nIXXAT canBusWatchdog: ERROR: Resetting the can module failed!\n");
+        res = VCI_ResetCan(m_BoardHdl, CAN_NUM);
+        if (res <= 0)
+        {
+          MSG_ERR_DRV("IXXAT canBusWatchdog: ERROR: Resetting the can module failed with code '%d'!", res);
         }
 
-        if (VCI_StartCan(m_BoardHdl, CAN_NUM) < 0)
-        {
-          ::OutputDebugString("\nIXXAT canBusWatchdog: ERROR: Restaring the can module failed!\n");
+        res = VCI_StartCan(m_BoardHdl, CAN_NUM);
+        if (res <= 0)
+        {
+          MSG_ERR_DRV("IXXAT canBusWatchdog: ERROR: Restaring the can module failed with code '%d'!", res);
         }
       }
     }
 
     if (SetTimer(NULL, m_watchdogTimerId, IXXAT::CAN_BUS_WATCHDOG_INTERVAL_MSEC, IXXAT::canBusWatchdog) == 0)
     {
-      char buf[200];
-      ::sprintf(buf, "\nIXXAT canBusWatchdog: ERROR: Creation of the watchdog timer failed!\n");
-      ::OutputDebugString(buf);
+      MSG_ERR_DRV("IXXAT canBusWatchdog: ERROR: Creation of the watchdog timer failed!");
     }
   }
 
--- a/drivers/timers_win32/timers_win32.c	Sat Jan 21 18:49:54 2012 +0100
+++ b/drivers/timers_win32/timers_win32.c	Sat Jan 21 19:32:58 2012 +0100
@@ -38,7 +38,7 @@
 };
 #endif
 
-struct _timeb timebuffer;
+DWORD timebuffer;
 
 /* Synchronization Object Implementation */
 CRITICAL_SECTION CanFestival_mutex;
@@ -90,8 +90,8 @@
 		WaitForSingleObject(timer, INFINITE);
 		if(stop_timer)
 			break;
-		_ftime(&timebuffer);
 		EnterMutex();
+		timebuffer = GetTickCount();
 		TimeDispatch();
 		LeaveMutex();
 	}
@@ -112,7 +112,7 @@
     }
 
 	// Take first absolute time ref in milliseconds.
-	_ftime(&timebuffer);
+	timebuffer = GetTickCount();
 }
 
 void TimerCleanup(void)
@@ -158,7 +158,7 @@
 		LARGE_INTEGER liDueTime;
 
 		/* arg 2 of SetWaitableTimer take 100 ns interval */
-		liDueTime.QuadPart = (-1 * value);
+		liDueTime.QuadPart = ((long long) (-1) * value * 10000);
 		//printf("SetTimer(%llu)\n", value);
 
 		if (!SetWaitableTimer(timer, &liDueTime, 0, NULL, NULL, FALSE))
@@ -171,8 +171,7 @@
 /* Get the elapsed time since the last occured alarm */
 TIMEVAL getElapsedTime(void)
 {
-	struct _timeb timetmp;
-	_ftime(&timetmp);
-	return (timetmp.time - timebuffer.time) * 10000000 + (timetmp.millitm - timebuffer.millitm) * 10000;
+  DWORD timetmp = GetTickCount();
+  return (timetmp - timebuffer);
 }
 
--- a/drivers/win32/win32.c	Sat Jan 21 18:49:54 2012 +0100
+++ b/drivers/win32/win32.c	Sat Jan 21 19:32:58 2012 +0100
@@ -189,7 +189,7 @@
 	}
 	else
 	{
-		MSG(("CanOpen : Cannot open board {busname='%s',baudrate='%s'}\n",board->busname, board->baudrate));
+		MSG("CanOpen : Cannot open board {busname='%S',baudrate='%S'}\n",board->busname, board->baudrate);
 		return NULL;
 	}
 }
--- a/include/win32/applicfg.h	Sat Jan 21 18:49:54 2012 +0100
+++ b/include/win32/applicfg.h	Sat Jan 21 19:32:58 2012 +0100
@@ -102,16 +102,13 @@
 #ifdef UNICODE
 #define MSG(...) \
   do{wchar_t msg[300];\
-   swprintf(msg,L##__VA_ARGS__);\
+   swprintf(msg,sizeof(msg)/sizeof(msg[0]), L##__VA_ARGS__); \
    OutputDebugString(msg);}while(0)
 #else
 #define MSG(...) \
-  do{printf(__VA_ARGS__);fflush(stdout);}while(0)
-
-/*do{char msg[300];\
+do{char msg[300];\
    sprintf(msg,##__VA_ARGS__);\
    OutputDebugString(msg);}while(0)
-*/
 #endif
 #else //(_MSC_VER < 1400)
 //For Visual Studio 2003 and below, without VA_ARGS
@@ -132,6 +129,9 @@
    MSG(("%s(%d) : 0x%X %s 0x%lX\n",__FILE__, __LINE__,num, str, value)); \
    }
 
+#define CANFESTIVAL_DEBUG_DRV_MSG(...)\
+  MSG(__VA_ARGS__);
+
 /// Definition of MSG_WAR
 // ---------------------
 #ifdef DEBUG_WAR_CONSOLE_ON
@@ -148,6 +148,11 @@
 #    define MSG_ERR(num, str, val)
 #endif
 
+#ifdef DEBUG_ERR_DRIVER_CONSOLE_ON
+#    define MSG_ERR_DRV(...) CANFESTIVAL_DEBUG_DRV_MSG(__VA_ARGS__)
+#else
+#    define MSG_ERR_DRV(...)
+#endif
 
 
 typedef void* CAN_HANDLE;
--- a/include/win32/canfestival.h	Sat Jan 21 18:49:54 2012 +0100
+++ b/include/win32/canfestival.h	Sat Jan 21 19:32:58 2012 +0100
@@ -32,7 +32,7 @@
 typedef HINSTANCE LIB_HANDLE;
 
 UNS8 UnLoadCanDriver(LIB_HANDLE handle);
-LIB_HANDLE LoadCanDriver(const char* driver_name);
+LIB_HANDLE LoadCanDriver(LPCTSTR driver_name);
 UNS8 canSend(CAN_PORT port, Message *m);
 CAN_PORT canOpen(s_BOARD *board, CO_Data * d);
 int canClose(CO_Data * d);
--- a/include/win32/timerscfg.h	Sat Jan 21 18:49:54 2012 +0100
+++ b/include/win32/timerscfg.h	Sat Jan 21 19:32:58 2012 +0100
@@ -26,12 +26,12 @@
 
 #include <windows.h>
 
-// Time unit : 100 ns
-#define TIMEVAL unsigned long long
+// Time unit : 1msec
+#define TIMEVAL DWORD
 #define TIMEVAL_MAX ~(TIMEVAL)0
 
-#define MS_TO_TIMEVAL(ms) ms*10000
-#define US_TO_TIMEVAL(us) us*10
+#define MS_TO_TIMEVAL(ms) ms
+#define US_TO_TIMEVAL(us) (us / 1000)
 
 #define TASK_HANDLE HANDLE
 
--- a/src/pdo.c	Sat Jan 21 18:49:54 2012 +0100
+++ b/src/pdo.c	Sat Jan 21 19:32:58 2012 +0100
@@ -410,7 +410,7 @@
                   Message pdo;
                   if (buildPDO (d, numPdo, &pdo))
                     {
-                      MSG_ERR (0x1948, " Couldn't build TPDO n�", numPdo);
+                      MSG_ERR (0x1948, " Couldn't build TPDO number : ", numPdo);
                       return 0xFF;
                     }
                   canSend (d->canHandle, &pdo);
@@ -743,7 +743,7 @@
               break;
 
             default:
-              MSG_ERR (0x1972, "Unknown state has been reached : %d", status);
+              MSG_ERR (0x1972, "Unknown state has been reached :", status);
               return 0xFF;
             }                   /* end switch case */
 
--- a/src/sdo.c	Sat Jan 21 18:49:54 2012 +0100
+++ b/src/sdo.c	Sat Jan 21 19:32:58 2012 +0100
@@ -1017,7 +1017,7 @@
 				else {/* So, if it is not an expedited transfert */
 					if (getSDOs(m->data[0])) {
 						nbBytes = (m->data[4]) + ((UNS32)(m->data[5])<<8) + ((UNS32)(m->data[6])<<16) + ((UNS32)(m->data[7])<<24);
-						err = setSDOlineRestBytes(d, CliServNbr, nbBytes);
+						err = setSDOlineRestBytes(d, line, nbBytes);
 						if (err) {
 							failedSDO(d, CliServNbr, whoami, index, subIndex, SDOABT_GENERAL_ERROR);
 							return 0xFF;
--- a/src/win32/CanFestival-3.def	Sat Jan 21 18:49:54 2012 +0100
+++ b/src/win32/CanFestival-3.def	Sat Jan 21 19:32:58 2012 +0100
@@ -60,6 +60,7 @@
         proceedPDO
         sendPDOevent
         _sendPDOevent
+        sendOnePDOevent
 		PDOInit
 		PDOStop
 		PDOEventTimerAlarm