drivers/can_ixxat_win32/ixxat.cpp
author leonid
Wed, 08 Aug 2007 01:43:02 +0200
changeset 252 b0dd37421d28
child 255 7b9f36dbfe5f
permissions -rw-r--r--
*** empty log message ***
252
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     1
// IXXAT adapter driver for CanFestival-3 Win32 port
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     2
// Copyright (C) 2007 Leonid Tochinski, ChattenAssociates, Inc.
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     3
//
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     4
// Notes
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     5
//--------------------------------------------
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     6
// For building of this project you will need 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     7
// the following IXXAT API files
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     8
// Vci2.h
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
     9
// Vci11un6.lib
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    10
//
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    11
// IXXAT Win32 drivers and API can be downloaded from
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    12
// http://www.ixxat.com/download_vci_en,7547,5873.html
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    13
//
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    14
// 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
    15
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    16
#include <stdio.h>
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    17
extern "C" {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    18
#include "applicfg.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    19
#include "can_driver.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    20
#include "def.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    21
}
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    22
#include "VCI2.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    23
#include "async_access_que.h"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    24
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    25
#pragma warning(disable:4996)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    26
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    27
#define CAN_NUM 0
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    28
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    29
class IXXAT
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    30
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    31
   public:
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    32
      class error
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    33
        {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    34
        };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    35
      IXXAT(s_BOARD *board);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    36
      ~IXXAT();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    37
      bool send(const Message *m);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    38
      bool receive(Message *m);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    39
   private:
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    40
      bool open(const char* board_name, int board_number, const char* baud_rate);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    41
      bool close();                             
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    42
      void receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    43
      // VCI2 handler      
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    44
      static void VCI_CALLBACKATTR message_handler(char *msg_str);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    45
      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
    46
      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
    47
      
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    48
   private:
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    49
      UINT16 m_BoardHdl;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    50
      UINT16 m_TxQueHdl;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    51
      UINT16 m_RxQueHdl;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    52
      async_access_que<VCI_CAN_OBJ> m_RX_Que;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    53
      static IXXAT* m_callbackPtr;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    54
   };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    55
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    56
IXXAT *IXXAT::m_callbackPtr = NULL;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    57
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    58
IXXAT::IXXAT(s_BOARD *board) : m_BoardHdl(0xFFFF),
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    59
                               m_TxQueHdl(0xFFFF),
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    60
                               m_RxQueHdl(0xFFFF)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    61
                               
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    62
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    63
   char busname[100];
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    64
   ::strcpy(busname,board->busname);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    65
   char board_name[100];      
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    66
   long board_number = 0;   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    67
   char *ptr = ::strrchr(busname,':');
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    68
   if (ptr != 0)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    69
      {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    70
      *ptr = 0;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    71
      ::strcpy(board_name,busname);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    72
      if (++ptr - busname < (int)::strlen(board->busname))
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    73
         board_number = ::atoi(ptr);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    74
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    75
   if (!open(board_name,board_number,board->baudrate))
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    76
      {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    77
      close();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    78
      throw error();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    79
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    80
   m_callbackPtr = this;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    81
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    82
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    83
IXXAT::~IXXAT()
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    84
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    85
   close();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    86
   m_callbackPtr = 0;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    87
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    88
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    89
bool IXXAT::send(const Message *m)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    90
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    91
   if (m_BoardHdl == 0xFFFF)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    92
      return false;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    93
   long res = VCI_ERR;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    94
   if (m->rtr == NOT_A_REQUEST)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    95
      res = VCI_TransmitObj(m_BoardHdl, m_TxQueHdl, m->cob_id.w, m->len, const_cast<unsigned char*>(m->data));
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    96
   else
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    97
      res = VCI_RequestObj(m_BoardHdl, m_TxQueHdl, m->cob_id.w, m->len);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    98
   return (res == VCI_OK);   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
    99
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   100
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   101
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   102
bool IXXAT::receive(Message *m)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   103
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   104
   if (m_BoardHdl == 0xFFFF)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   105
      return false;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   106
   VCI_CAN_OBJ obj;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   107
   if (m_RX_Que.extract_top(obj))
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   108
      {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   109
      m->cob_id.w = obj.id;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   110
      m->len = obj.len;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   111
      m->rtr = (obj.rtr == VCI_RX_BUF) ? NOT_A_REQUEST : REQUEST;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   112
      if (m->rtr == NOT_A_REQUEST)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   113
         ::memcpy(m->data, obj.a_data, m->len);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   114
      return true;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   115
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   116
   return false;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   117
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   118
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   119
bool IXXAT::open(const char* board_name, int board_number, const char* baud_rate)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   120
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   121
   // check, if baudrate is supported
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   122
   struct IXXAT_baud_rate_param 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   123
     { 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   124
     UINT8  bt0; 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   125
     UINT8  bt1;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   126
     };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   127
   struct IXXAT_look_up_table
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   128
     {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   129
     char baud_rate[20];
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   130
     IXXAT_baud_rate_param bt;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   131
     };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   132
   static const IXXAT_look_up_table br_lut[] = {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   133
               {"10K",{VCI_10KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   134
               {"20K",{VCI_20KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   135
               {"50K",{VCI_50KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   136
               {"100K",{VCI_100KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   137
               {"125K",{VCI_125KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   138
               {"250K",{VCI_250KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   139
               {"500K",{VCI_500KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   140
               {"800K",{VCI_800KB}},
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   141
               {"1M",{VCI_1000KB}}
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   142
               };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   143
   static const long br_lut_size = sizeof (br_lut)/sizeof(IXXAT_look_up_table);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   144
   int index;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   145
   for (index = 0; index < br_lut_size; ++index)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   146
       {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   147
       if (::strcmp(br_lut[index].baud_rate,baud_rate)==0)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   148
          break;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   149
       }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   150
   if (index == br_lut_size)    
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   151
      return false;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   152
   // close existing board   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   153
   close();
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   154
   // init IXXAT board
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   155
   unsigned long board_type = VCI_GetBrdTypeByName(const_cast<char*>(board_name));
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   156
   long res = VCI2_PrepareBoard( board_type,                  // board type
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   157
                                   board_number,              // unique board index
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   158
                                   NULL,                      // pointer to buffer for additional info 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   159
                                   0,                         // length of additional info buffer
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   160
                                   message_handler,           // pointer to msg-callbackhandler
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   161
                                   receive_queuedata_handler, // pointer to receive-callbackhandler
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   162
                                   exception_handler);        // pointer to exception-callbackhandler
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   163
   if (res < 0)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   164
      return false;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   165
   m_BoardHdl = (UINT16)res;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   166
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   167
   VCI_ResetBoard(m_BoardHdl);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   168
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   169
   // init CAN parameters
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   170
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   171
   // initialize CAN-Controller
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   172
   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
   173
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   174
   //  definition of Acceptance-Mask (define to receive all IDs)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   175
   res = VCI_SetAccMask(m_BoardHdl, CAN_NUM, 0x0UL, 0x0UL);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   176
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   177
   // definition of Transmit Queue
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   178
   res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_TX_QUE, 100 , 0, 0, 0,  &m_TxQueHdl);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   179
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   180
   //  definition of Receive Queue (interrupt mode)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   181
   res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_RX_QUE, 50, 1, 0, 100,  &m_RxQueHdl);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   182
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   183
   //  assign the all IDs to the Receive Queue
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   184
   res = VCI_AssignRxQueObj(m_BoardHdl, m_RxQueHdl ,VCI_ACCEPT, 0, 0) ;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   185
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   186
   //  And now start the CAN
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   187
   res = VCI_StartCan(m_BoardHdl, CAN_NUM);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   188
   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   189
   return true;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   190
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   191
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   192
bool IXXAT::close()
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   193
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   194
   if (m_BoardHdl == 0xFFFF)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   195
      return true;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   196
   VCI_ResetBoard(m_BoardHdl);   
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   197
   VCI_CancelBoard(m_BoardHdl);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   198
   m_BoardHdl = 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   199
   m_TxQueHdl = 
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   200
   m_RxQueHdl = 0xFFFF;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   201
   return true;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   202
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   203
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   204
void IXXAT::receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ *p_obj)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   205
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   206
   for (int i = 0; i < count; ++i)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   207
       m_RX_Que.append(p_obj[i]); // can packet
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   208
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   209
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   210
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
   211
  {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   212
   if (m_callbackPtr != NULL)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   213
      m_callbackPtr->receive_queuedata(que_hdl, count, p_obj);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   214
  }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   215
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   216
void VCI_CALLBACKATTR IXXAT::message_handler(char *msg_str)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   217
  {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   218
  char buf[200];
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   219
  ::sprintf(buf,"IXXAT Message: [%s]\n", msg_str);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   220
  ::OutputDebugString(buf);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   221
  }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   222
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   223
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
   224
  {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   225
  static const char* Num2Function[] =
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   226
    {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   227
    "VCI_Init",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   228
    "VCI_Searchboard",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   229
    "VCI_Prepareboard",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   230
    "VCI_Cancel_board",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   231
    "VCI_Testboard",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   232
    "VCI_ReadBoardInfo",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   233
    "VCI_ReadBoardStatus",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   234
    "VCI_Resetboard",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   235
    "VCI_ReadCANInfo",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   236
    "VCI_ReadCANStatus",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   237
    "VCI_InitCAN",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   238
    "VCI_SetAccMask",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   239
    "VCI_ResetCAN",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   240
    "VCI_StartCAN",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   241
    "VCI_ResetTimeStamps",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   242
    "VCI_ConfigQueue",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   243
    "VCI_AssignRxQueObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   244
    "VCI_ConfigBuffer",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   245
    "VCI_ReconfigBuffer",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   246
    "VCI_ConfigTimer",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   247
    "VCI_ReadQueStatus",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   248
    "VCI_ReadQueObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   249
    "VCI_ReadBufStatus",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   250
    "VCI_ReadBufData",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   251
    "VCI_TransmitObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   252
    "VCI_RequestObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   253
    "VCI_UpdateBufObj",
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   254
    "VCI_CciReqData"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   255
    };
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   256
  char buf[200];
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   257
  ::sprintf(buf, "IXXAT Exception: %s (%i / %u) [%s]\n", Num2Function[func_num], err_code, ext_err, err_str);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   258
  ::OutputDebugString(buf);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   259
  }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   260
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   261
//------------------------------------------------------------------------
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   262
extern "C"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   263
   UNS8 canReceive_driver(CAN_HANDLE inst, Message *m)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   264
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   265
   return (UNS8)reinterpret_cast<IXXAT*>(inst)->receive(m);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   266
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   267
                            
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   268
extern "C"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   269
   UNS8 canSend_driver(CAN_HANDLE inst, Message *m)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   270
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   271
   return (UNS8)reinterpret_cast<IXXAT*>(inst)->send(m);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   272
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   273
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   274
extern "C"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   275
   CAN_HANDLE canOpen_driver(s_BOARD *board)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   276
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   277
   try
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   278
      {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   279
      return new IXXAT(board);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   280
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   281
   catch (IXXAT::error&)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   282
      {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   283
      return 0;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   284
      }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   285
   }
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   286
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   287
extern "C"
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   288
   int canClose_driver(CAN_HANDLE inst)
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   289
   {
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   290
   delete reinterpret_cast<IXXAT*>(inst);
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   291
   return 1;
b0dd37421d28 *** empty log message ***
leonid
parents:
diff changeset
   292
   }