drivers/can_ixxat_win32/ixxat.cpp
author Christian Taedcke <hacking@taedcke.com>
Tue, 22 May 2012 08:10:09 +0200
changeset 726 b52c951dec63
parent 689 d6fcd388f2db
permissions -rw-r--r--
Win32 IXXAT driver:
- prevent crash after calling the close() function
255
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     1
/*
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     2
This file is part of CanFestival, a library implementing CanOpen Stack.
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     3
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     4
CanFestival Copyright (C): Edouard TISSERANT and Francis DUPIN
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     5
CanFestival Win32 port Copyright (C) 2007 Leonid Tochinski, ChattenAssociates, Inc.
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     6
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     7
See COPYING file for copyrights details.
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     8
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
     9
This library is free software; you can redistribute it and/or
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    10
modify it under the terms of the GNU Lesser General Public
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    11
License as published by the Free Software Foundation; either
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    12
version 2.1 of the License, or (at your option) any later version.
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    13
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    14
This library is distributed in the hope that it will be useful,
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    15
but WITHOUT ANY WARRANTY; without even the implied warranty of
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    17
Lesser General Public License for more details.
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    18
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    19
You should have received a copy of the GNU Lesser General Public
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    20
License along with this library; if not, write to the Free Software
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    21
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    22
*/
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    23
// pragma based message
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    24
// http://www.codeproject.com/macro/location_pragma.asp
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    25
#define __STR2__(x) #x
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    26
#define __STR1__(x) __STR2__(x)
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    27
#define __LOC2__ __FILE__ "("__STR1__(__LINE__)") : "
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    28
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    29
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    30
#pragma message("*********************************************************************************")
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    31
#pragma message("  NOTE: IXXAT Win32 drivers and API should be installed in order to build this project!")
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    32
#pragma message(__LOC2__ "See IXXAT.Cpp header for details.")
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    33
#pragma message("*********************************************************************************")
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    34
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    35
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    36
// IXXAT adapter driver for CanFestival-3 Win32 port
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    37
//
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    38
// Notes
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    39
//--------------------------------------------
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    40
// For building of this project you will need 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    41
// the following IXXAT API files
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    42
// Vci2.h
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    43
// Vci11un6.lib
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    44
//
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    45
// IXXAT Win32 drivers and API can be downloaded from
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    46
// http://www.ixxat.com/download_vci_en,7547,5873.html
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    47
//
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    48
// Copy Vci2.h & Vci11un6.lib files to can_ixxat_win32 folder of add path to them in Project settings.
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    49
255
7b9f36dbfe5f *** empty log message ***
leonid
parents: 252
diff changeset
    50
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    51
#include <stdio.h>
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    52
extern "C" {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    53
#include "applicfg.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    54
#include "can_driver.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    55
#include "def.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    56
}
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    57
#include "VCI2.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    58
#include "async_access_que.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    59
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    60
#define CAN_NUM 0
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    61
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    62
class IXXAT
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    63
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    64
   public:
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    65
      class error
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    66
        {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    67
        };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    68
      IXXAT(s_BOARD *board);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    69
      ~IXXAT();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    70
      bool send(const Message *m);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    71
      bool receive(Message *m);
726
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
    72
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
    73
	  static bool isDriverClosed() {return m_driverClosed;}
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    74
   private:
689
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
    75
      bool open(int board_number, const char* baud_rate);
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
    76
      bool close();
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    77
      void receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    78
      // VCI2 handler      
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    79
      static void VCI_CALLBACKATTR message_handler(char *msg_str);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    80
      static void VCI_CALLBACKATTR receive_queuedata_handler(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    81
      static void VCI_CALLBACKATTR exception_handler(VCI_FUNC_NUM func_num, INT32 err_code, UINT16 ext_err, char* err_str);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    82
      
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    83
      static void CALLBACK canBusWatchdog(HWND hwnd, UINT msg, UINT_PTR idEvent, DWORD dwTime);
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    84
      void watchdog();
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    85
   private:
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    86
      UINT16 m_BoardHdl;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    87
      UINT16 m_TxQueHdl;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    88
      UINT16 m_RxQueHdl;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    89
      async_access_que<VCI_CAN_OBJ> m_RX_Que;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    90
      static IXXAT* m_callbackPtr;
726
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
    91
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
    92
	  static bool m_driverClosed;
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    93
      static UINT_PTR m_watchdogTimerId;
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    94
      static const unsigned int CAN_BUS_WATCHDOG_INTERVAL_MSEC = 10000;
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    95
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    96
      /** Bitmask inside sts from VCI_ReadCanStatus() that defines the can bus off state.*/
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    97
      static const unsigned char STS_CAN_BUS_OFF = 0x80;
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    98
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
    99
      /** Bitmask inside sts from VCI_ReadCanStatus() that defines the can data overrun state.*/
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   100
      static const unsigned char STS_CAN_DATA_OVERRUN = 0x20;
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   101
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   102
      /** Bitmask inside sts from VCI_ReadCanStatus() that defines the remote queue overrun state.*/
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   103
      static const unsigned char STS_REMOTE_QUEUE_OVERRUN = 0x04;
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   104
   };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   105
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   106
IXXAT *IXXAT::m_callbackPtr = NULL;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   107
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   108
UINT_PTR IXXAT::m_watchdogTimerId = 0;
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   109
726
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
   110
bool IXXAT::m_driverClosed = false;
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
   111
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   112
IXXAT::IXXAT(s_BOARD *board) : m_BoardHdl(0xFFFF),
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   113
                               m_TxQueHdl(0xFFFF),
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   114
                               m_RxQueHdl(0xFFFF)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   115
                               
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   116
   {
689
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   117
   if (!board)
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   118
      {
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   119
      close();
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   120
      throw error();
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   121
      }
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   122
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   123
   long board_number = 0;
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   124
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   125
   if (board->busname)
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   126
      {
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   127
      board_number = atol(board->busname);
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   128
      }
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   129
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   130
   if (!open(board_number, board->baudrate))
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   131
      {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   132
      close();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   133
      throw error();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   134
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   135
   m_callbackPtr = this;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   136
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   137
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   138
IXXAT::~IXXAT()
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   139
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   140
   close();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   141
   m_callbackPtr = 0;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   142
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   143
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   144
bool IXXAT::send(const Message *m)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   145
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   146
   if (m_BoardHdl == 0xFFFF)
267
96c688ebcde7 Add win32 target (--can=win32) to compile with msys and mingw32
greg
parents: 255
diff changeset
   147
      return true; // true -> NOT OK
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   148
   long res = VCI_ERR;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   149
   if (m->rtr == NOT_A_REQUEST)
365
9b76e0881beb Changed cob_id from struct{UNS32} to UNS16
etisserant
parents: 267
diff changeset
   150
      res = VCI_TransmitObj(m_BoardHdl, m_TxQueHdl, m->cob_id, m->len, const_cast<unsigned char*>(m->data));
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   151
   else
365
9b76e0881beb Changed cob_id from struct{UNS32} to UNS16
etisserant
parents: 267
diff changeset
   152
      res = VCI_RequestObj(m_BoardHdl, m_TxQueHdl, m->cob_id, m->len);
647
8203ce2b9752 CHANGED: - canReceive and canSend return now 1 on error and 0 on success
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 646
diff changeset
   153
8203ce2b9752 CHANGED: - canReceive and canSend return now 1 on error and 0 on success
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 646
diff changeset
   154
   return (res == VCI_OK);
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   155
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   156
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   157
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   158
bool IXXAT::receive(Message *m)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   159
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   160
   if (m_BoardHdl == 0xFFFF)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   161
      return false;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   162
   VCI_CAN_OBJ obj;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   163
   if (m_RX_Que.extract_top(obj))
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   164
      {
646
4177b05ab835 CHANGED: - added explicit cast to remove compiler warning
Christian Taedcke
parents: 645
diff changeset
   165
      m->cob_id = static_cast<UNS16>(obj.id); //valid for 11Bit ids
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   166
      m->len = obj.len;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   167
      m->rtr = (obj.rtr == VCI_RX_BUF) ? NOT_A_REQUEST : REQUEST;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   168
      if (m->rtr == NOT_A_REQUEST)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   169
         ::memcpy(m->data, obj.a_data, m->len);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   170
      return true;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   171
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   172
   return false;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   173
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   174
689
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   175
bool IXXAT::open(int board_number, const char* baud_rate)
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   176
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   177
   // check, if baudrate is supported
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   178
   struct IXXAT_baud_rate_param 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   179
     { 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   180
     UINT8  bt0; 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   181
     UINT8  bt1;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   182
     };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   183
   struct IXXAT_look_up_table
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   184
     {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   185
     char baud_rate[20];
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   186
     IXXAT_baud_rate_param bt;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   187
     };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   188
   static const IXXAT_look_up_table br_lut[] = {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   189
               {"10K",{VCI_10KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   190
               {"20K",{VCI_20KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   191
               {"50K",{VCI_50KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   192
               {"100K",{VCI_100KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   193
               {"125K",{VCI_125KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   194
               {"250K",{VCI_250KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   195
               {"500K",{VCI_500KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   196
               {"800K",{VCI_800KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   197
               {"1M",{VCI_1000KB}}
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   198
               };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   199
   static const long br_lut_size = sizeof (br_lut)/sizeof(IXXAT_look_up_table);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   200
   int index;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   201
   for (index = 0; index < br_lut_size; ++index)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   202
       {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   203
       if (::strcmp(br_lut[index].baud_rate,baud_rate)==0)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   204
          break;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   205
       }
685
b38d2d8e291d Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 683
diff changeset
   206
   if (index == br_lut_size)
b38d2d8e291d Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 683
diff changeset
   207
   {
687
Christian Taedcke <hacking@taedcke.com>
parents: 685
diff changeset
   208
      MSG_ERR_DRV("IXXAT::open: The given baudrate %S is invalid.", baud_rate);
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   209
      return false;
685
b38d2d8e291d Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 683
diff changeset
   210
   }
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   211
   // close existing board   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   212
   close();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   213
   // init IXXAT board
689
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   214
   long res = VCI2_PrepareBoard(   0,                         // board type, unused in VCI2
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   215
                                   board_number,              // unique board index, see XAT_EnumHwEntry() and XAT_GetConfig()
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   216
                                   NULL,                      // pointer to buffer for additional info 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   217
                                   0,                         // length of additional info buffer
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   218
                                   message_handler,           // pointer to msg-callbackhandler
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   219
                                   receive_queuedata_handler, // pointer to receive-callbackhandler
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   220
                                   exception_handler);        // pointer to exception-callbackhandler
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   221
   if (res < 0)
685
b38d2d8e291d Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 683
diff changeset
   222
   {
b38d2d8e291d Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 683
diff changeset
   223
      MSG_ERR_DRV("IXXAT::open: VCI2_PrepareBoard failed with code '%d'.", res);
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   224
      return false;
685
b38d2d8e291d Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 683
diff changeset
   225
   }
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   226
   m_BoardHdl = (UINT16)res;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   227
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   228
   VCI_ResetBoard(m_BoardHdl);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   229
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   230
   // init CAN parameters
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   231
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   232
   // initialize CAN-Controller
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   233
   res = VCI_InitCan(m_BoardHdl, CAN_NUM, br_lut[index].bt.bt0,br_lut[index].bt.bt1, VCI_11B);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   234
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   235
   //  definition of Acceptance-Mask (define to receive all IDs)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   236
   res = VCI_SetAccMask(m_BoardHdl, CAN_NUM, 0x0UL, 0x0UL);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   237
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   238
   // definition of Transmit Queue
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   239
   res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_TX_QUE, 100 , 0, 0, 0,  &m_TxQueHdl);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   240
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   241
   //  definition of Receive Queue (interrupt mode)
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   242
   res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_RX_QUE, 500, 1, 0, 100,  &m_RxQueHdl);
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   243
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   244
   //  assign the all IDs to the Receive Queue
689
d6fcd388f2db Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 688
diff changeset
   245
   res = VCI_AssignRxQueObj(m_BoardHdl, m_RxQueHdl ,VCI_ACCEPT, 0, 0);
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   246
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   247
   //  And now start the CAN
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   248
   res = VCI_StartCan(m_BoardHdl, CAN_NUM);
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   249
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   250
   //Start CAN Bus-Off watchdog
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   251
   m_watchdogTimerId = SetTimer(NULL, NULL, IXXAT::CAN_BUS_WATCHDOG_INTERVAL_MSEC, IXXAT::canBusWatchdog);
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   252
   
726
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
   253
   m_driverClosed = false;
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
   254
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   255
   return true;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   256
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   257
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   258
bool IXXAT::close()
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   259
   {
726
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
   260
	m_driverClosed = true;
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   261
   if (m_BoardHdl == 0xFFFF)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   262
      return true;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   263
   VCI_ResetBoard(m_BoardHdl);   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   264
   VCI_CancelBoard(m_BoardHdl);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   265
   m_BoardHdl = 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   266
   m_TxQueHdl = 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   267
   m_RxQueHdl = 0xFFFF;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   268
   return true;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   269
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   270
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   271
void IXXAT::receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ *p_obj)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   272
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   273
   for (int i = 0; i < count; ++i)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   274
       m_RX_Que.append(p_obj[i]); // can packet
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   275
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   276
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   277
void VCI_CALLBACKATTR IXXAT::receive_queuedata_handler(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ *p_obj)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   278
  {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   279
   if (m_callbackPtr != NULL)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   280
      m_callbackPtr->receive_queuedata(que_hdl, count, p_obj);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   281
  }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   282
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   283
void VCI_CALLBACKATTR IXXAT::message_handler(char *msg_str)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   284
  {
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   285
  MSG_ERR_DRV("IXXAT Message: [%S]", msg_str);
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   286
  }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   287
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   288
void VCI_CALLBACKATTR IXXAT::exception_handler(VCI_FUNC_NUM func_num, INT32 err_code, UINT16 ext_err, char* err_str)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   289
  {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   290
  static const char* Num2Function[] =
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   291
    {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   292
    "VCI_Init",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   293
    "VCI_Searchboard",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   294
    "VCI_Prepareboard",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   295
    "VCI_Cancel_board",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   296
    "VCI_Testboard",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   297
    "VCI_ReadBoardInfo",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   298
    "VCI_ReadBoardStatus",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   299
    "VCI_Resetboard",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   300
    "VCI_ReadCANInfo",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   301
    "VCI_ReadCANStatus",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   302
    "VCI_InitCAN",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   303
    "VCI_SetAccMask",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   304
    "VCI_ResetCAN",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   305
    "VCI_StartCAN",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   306
    "VCI_ResetTimeStamps",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   307
    "VCI_ConfigQueue",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   308
    "VCI_AssignRxQueObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   309
    "VCI_ConfigBuffer",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   310
    "VCI_ReconfigBuffer",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   311
    "VCI_ConfigTimer",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   312
    "VCI_ReadQueStatus",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   313
    "VCI_ReadQueObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   314
    "VCI_ReadBufStatus",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   315
    "VCI_ReadBufData",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   316
    "VCI_TransmitObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   317
    "VCI_RequestObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   318
    "VCI_UpdateBufObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   319
    "VCI_CciReqData"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   320
    };
685
b38d2d8e291d Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 683
diff changeset
   321
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   322
  MSG_ERR_DRV("IXXAT Exception: %S (%i / %u) [%S]", Num2Function[func_num], err_code, ext_err, err_str);
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   323
  }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   324
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   325
  void IXXAT::watchdog()
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   326
  {
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   327
    VCI_CAN_STS sts;
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   328
    long res = VCI_ReadCanStatus(m_BoardHdl, CAN_NUM, &sts);
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   329
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   330
    if (res < 0)
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   331
    {
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   332
      MSG_ERR_DRV("IXXAT canBusWatchdog: ERROR: Reading the can state failed!");
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   333
    }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   334
    else
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   335
    {
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   336
      if (sts.sts & (STS_CAN_BUS_OFF | STS_CAN_DATA_OVERRUN | STS_REMOTE_QUEUE_OVERRUN))
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   337
      {
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   338
        if (sts.sts & STS_CAN_BUS_OFF)
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   339
        {
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   340
          MSG_ERR_DRV("IXXAT canBusWatchdog: CAN bus off detected!");
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   341
        }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   342
        if (sts.sts & STS_CAN_DATA_OVERRUN)
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   343
        {
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   344
          MSG_ERR_DRV("IXXAT canBusWatchdog: CAN data overrun detected!");
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   345
        }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   346
        if (sts.sts & STS_REMOTE_QUEUE_OVERRUN)
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   347
        {
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   348
          MSG_ERR_DRV("IXXAT canBusWatchdog: Remote queue overrun detected!");
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   349
        }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   350
683
a3ff0e3e9829 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 655
diff changeset
   351
        res = VCI_ResetCan(m_BoardHdl, CAN_NUM);
a3ff0e3e9829 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 655
diff changeset
   352
        if (res <= 0)
a3ff0e3e9829 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 655
diff changeset
   353
        {
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   354
          MSG_ERR_DRV("IXXAT canBusWatchdog: ERROR: Resetting the can module failed with code '%d'!", res);
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   355
        }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   356
683
a3ff0e3e9829 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 655
diff changeset
   357
        res = VCI_StartCan(m_BoardHdl, CAN_NUM);
a3ff0e3e9829 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 655
diff changeset
   358
        if (res <= 0)
a3ff0e3e9829 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 655
diff changeset
   359
        {
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   360
          MSG_ERR_DRV("IXXAT canBusWatchdog: ERROR: Restaring the can module failed with code '%d'!", res);
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   361
        }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   362
      }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   363
    }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   364
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   365
    if (SetTimer(NULL, m_watchdogTimerId, IXXAT::CAN_BUS_WATCHDOG_INTERVAL_MSEC, IXXAT::canBusWatchdog) == 0)
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   366
    {
688
514108c6e4c4 Win32 IXXAT::
Christian Taedcke <hacking@taedcke.com>
parents: 687
diff changeset
   367
      MSG_ERR_DRV("IXXAT canBusWatchdog: ERROR: Creation of the watchdog timer failed!");
655
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   368
    }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   369
  }
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   370
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   371
void CALLBACK IXXAT::canBusWatchdog(HWND hwnd, UINT msg, UINT_PTR idEvent, DWORD dwTime)
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   372
{
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   373
   if (m_callbackPtr != NULL)
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   374
      m_callbackPtr->watchdog();
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   375
}
ea1ddcc77acf CHANGED: - canSend message parameter is now a const pointer
Christian Taedcke
parents: 647
diff changeset
   376
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   377
//------------------------------------------------------------------------
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   378
extern "C"
645
93ad82ee0426 FIXED: - added CALLBACK to can callback function prototypes
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 631
diff changeset
   379
   UNS8 __stdcall canReceive_driver(CAN_HANDLE inst, Message *m)
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   380
   {
726
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
   381
	 if (IXXAT::isDriverClosed()) return 0;
647
8203ce2b9752 CHANGED: - canReceive and canSend return now 1 on error and 0 on success
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 646
diff changeset
   382
     return reinterpret_cast<IXXAT*>(inst)->receive(m) ? 0 : 1;
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   383
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   384
                            
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   385
extern "C"
645
93ad82ee0426 FIXED: - added CALLBACK to can callback function prototypes
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 631
diff changeset
   386
   UNS8 __stdcall canSend_driver(CAN_HANDLE inst, Message const *m)
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   387
   {
726
b52c951dec63 Win32 IXXAT driver:
Christian Taedcke <hacking@taedcke.com>
parents: 689
diff changeset
   388
	 if (IXXAT::isDriverClosed()) return 0;
647
8203ce2b9752 CHANGED: - canReceive and canSend return now 1 on error and 0 on success
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 646
diff changeset
   389
     return reinterpret_cast<IXXAT*>(inst)->send(m) ? 0 : 1;
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   390
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   391
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   392
extern "C"
645
93ad82ee0426 FIXED: - added CALLBACK to can callback function prototypes
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 631
diff changeset
   393
   CAN_HANDLE __stdcall canOpen_driver(s_BOARD *board)
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   394
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   395
   try
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   396
      {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   397
      return new IXXAT(board);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   398
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   399
   catch (IXXAT::error&)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   400
      {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   401
      return 0;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   402
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   403
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   404
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   405
extern "C"
645
93ad82ee0426 FIXED: - added CALLBACK to can callback function prototypes
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 631
diff changeset
   406
   int __stdcall canClose_driver(CAN_HANDLE inst)
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   407
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   408
   delete reinterpret_cast<IXXAT*>(inst);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   409
   return 1;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   410
   }
384
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   411
   
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   412
extern "C"
645
93ad82ee0426 FIXED: - added CALLBACK to can callback function prototypes
Christian Taedcke <Christian.Taedcke@ica-traffic.de>
parents: 631
diff changeset
   413
   UNS8 __stdcall canChangeBaudRate_driver( CAN_HANDLE fd, char* baud)
384
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   414
	{
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   415
	//printf("canChangeBaudRate not yet supported by this driver\n");
83793fc7ce48 added canChangeBaudRate to the driver interface
groke6
parents: 365
diff changeset
   416
	return 0;
631
08b6b903f84a Piotr Trojanek (ptroja) cleanup patche. Thanks.
edouard
parents: 384
diff changeset
   417
	}