drivers/can_ixxat_win32/ixxat.cpp
changeset 689 d6fcd388f2db
parent 688 514108c6e4c4
child 726 b52c951dec63
equal deleted inserted replaced
688:514108c6e4c4 689:d6fcd388f2db
    68       IXXAT(s_BOARD *board);
    68       IXXAT(s_BOARD *board);
    69       ~IXXAT();
    69       ~IXXAT();
    70       bool send(const Message *m);
    70       bool send(const Message *m);
    71       bool receive(Message *m);
    71       bool receive(Message *m);
    72    private:
    72    private:
    73       bool open(const char* board_name, int board_number, const char* baud_rate);
    73       bool open(int board_number, const char* baud_rate);
    74       bool close();                             
    74       bool close();
    75       void receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj);
    75       void receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj);
    76       // VCI2 handler      
    76       // VCI2 handler      
    77       static void VCI_CALLBACKATTR message_handler(char *msg_str);
    77       static void VCI_CALLBACKATTR message_handler(char *msg_str);
    78       static void VCI_CALLBACKATTR receive_queuedata_handler(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj);
    78       static void VCI_CALLBACKATTR receive_queuedata_handler(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ* p_obj);
    79       static void VCI_CALLBACKATTR exception_handler(VCI_FUNC_NUM func_num, INT32 err_code, UINT16 ext_err, char* err_str);
    79       static void VCI_CALLBACKATTR exception_handler(VCI_FUNC_NUM func_num, INT32 err_code, UINT16 ext_err, char* err_str);
   106 IXXAT::IXXAT(s_BOARD *board) : m_BoardHdl(0xFFFF),
   106 IXXAT::IXXAT(s_BOARD *board) : m_BoardHdl(0xFFFF),
   107                                m_TxQueHdl(0xFFFF),
   107                                m_TxQueHdl(0xFFFF),
   108                                m_RxQueHdl(0xFFFF)
   108                                m_RxQueHdl(0xFFFF)
   109                                
   109                                
   110    {
   110    {
   111    char busname[100];
   111    if (!board)
   112    ::strcpy(busname,board->busname);
   112       {
   113    char board_name[100];      
   113       close();
   114    long board_number = 0;   
   114       throw error();
   115    char *ptr = ::strrchr(busname,':');
   115       }
   116    if (ptr != 0)
   116 
   117       {
   117    long board_number = 0;
   118       *ptr = 0;
   118 
   119       ::strcpy(board_name,busname);
   119    if (board->busname)
   120       if (++ptr - busname < (int)::strlen(board->busname))
   120       {
   121          board_number = ::atoi(ptr);
   121       board_number = atol(board->busname);
   122       }
   122       }
   123    if (!open(board_name,board_number,board->baudrate))
   123 
       
   124    if (!open(board_number, board->baudrate))
   124       {
   125       {
   125       close();
   126       close();
   126       throw error();
   127       throw error();
   127       }
   128       }
   128    m_callbackPtr = this;
   129    m_callbackPtr = this;
   163       return true;
   164       return true;
   164       }
   165       }
   165    return false;
   166    return false;
   166    }
   167    }
   167 
   168 
   168 bool IXXAT::open(const char* board_name, int board_number, const char* baud_rate)
   169 bool IXXAT::open(int board_number, const char* baud_rate)
   169    {
   170    {
   170    // check, if baudrate is supported
   171    // check, if baudrate is supported
   171    struct IXXAT_baud_rate_param 
   172    struct IXXAT_baud_rate_param 
   172      { 
   173      { 
   173      UINT8  bt0; 
   174      UINT8  bt0; 
   202       return false;
   203       return false;
   203    }
   204    }
   204    // close existing board   
   205    // close existing board   
   205    close();
   206    close();
   206    // init IXXAT board
   207    // init IXXAT board
   207    unsigned long board_type = VCI_GetBrdTypeByName(const_cast<char*>(board_name));
   208    long res = VCI2_PrepareBoard(   0,                         // board type, unused in VCI2
   208    long res = VCI2_PrepareBoard( board_type,                  // board type
   209                                    board_number,              // unique board index, see XAT_EnumHwEntry() and XAT_GetConfig()
   209                                    board_number,              // unique board index
       
   210                                    NULL,                      // pointer to buffer for additional info 
   210                                    NULL,                      // pointer to buffer for additional info 
   211                                    0,                         // length of additional info buffer
   211                                    0,                         // length of additional info buffer
   212                                    message_handler,           // pointer to msg-callbackhandler
   212                                    message_handler,           // pointer to msg-callbackhandler
   213                                    receive_queuedata_handler, // pointer to receive-callbackhandler
   213                                    receive_queuedata_handler, // pointer to receive-callbackhandler
   214                                    exception_handler);        // pointer to exception-callbackhandler
   214                                    exception_handler);        // pointer to exception-callbackhandler
   234    
   234    
   235    //  definition of Receive Queue (interrupt mode)
   235    //  definition of Receive Queue (interrupt mode)
   236    res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_RX_QUE, 500, 1, 0, 100,  &m_RxQueHdl);
   236    res = VCI_ConfigQueue(m_BoardHdl, CAN_NUM, VCI_RX_QUE, 500, 1, 0, 100,  &m_RxQueHdl);
   237 
   237 
   238    //  assign the all IDs to the Receive Queue
   238    //  assign the all IDs to the Receive Queue
   239    res = VCI_AssignRxQueObj(m_BoardHdl, m_RxQueHdl ,VCI_ACCEPT, 0, 0) ;
   239    res = VCI_AssignRxQueObj(m_BoardHdl, m_RxQueHdl ,VCI_ACCEPT, 0, 0);
   240 
   240 
   241    //  And now start the CAN
   241    //  And now start the CAN
   242    res = VCI_StartCan(m_BoardHdl, CAN_NUM);
   242    res = VCI_StartCan(m_BoardHdl, CAN_NUM);
   243 
   243 
   244    //Start CAN Bus-Off watchdog
   244    //Start CAN Bus-Off watchdog