/** * \brief connects to the channels and initiates read thread. * \param void * \return S_OK for success, S_FALSE for failure */ HRESULT CDIL_CAN_MHS::CAN_StartHardware(void) { USES_CONVERSION; HRESULT hResult; char str[100]; //VALIDATE_VALUE_RETURN_VAL(sg_bCurrState, STATE_HW_INTERFACE_SELECTED, ERR_IMPROPER_STATE); if (!str_has_char(sg_MhsCanCfg.CanSnrStr)) sprintf(str, "Snr=%s", sg_MhsCanCfg.CanSnrStr); else str[0]='\0'; if (!CanDeviceOpen(0, str)) { (void)CanSetOptions("CanTxAckEnable=1"); // **** CAN Bus Start if (CanSetMode(0, OP_CAN_START, CAN_CMD_FIFOS_ERROR_CLEAR) >= 0) hResult = S_OK; else { hResult = S_FALSE; sg_pIlog->vLogAMessage(A2T(__FILE__), __LINE__, _T("could not start the controller in running mode")); } sg_bCurrState = STATE_CONNECTED; } else { //log the error for open port failure sg_pIlog->vLogAMessage(A2T(__FILE__), __LINE__, _T("error opening \"Tiny-CAN\" interface")); hResult = ERR_LOAD_HW_INTERFACE; } return(hResult); }
tCanDeviceT<TCanDescriptor>::tCanDeviceT(const char *device_name, int flags, unsigned char acceptance_code, unsigned char acceptance_mask, unsigned int baud_rate, unsigned send_fifo_size, unsigned receive_fifo_size) : m_can_user(-1) { m_can_device = InvalidCanDescriptor(); bool success = false; #ifdef _SYSTEM_LXRT_ if (m_canlxrt_available && icl_core::os::IsThisLxrtTask() && CanDriverLxrtSupport()) { char *check_pointer; const char *convert_string = device_name + strlen(device_name) - 1; m_can_device = (TCanDescriptor)strtol(convert_string, &check_pointer, 10); if (check_pointer == convert_string) { LOGGING_ERROR_CO(CAN, tCanDevice, CanDriverName(), "Error converting given device name '" << device_name << "' to LXRT-device id" << endl); } else { LOGGING_INFO_CO(CAN, tCanDevice, CanDriverName(), "Using LXRT extension for accessing can device " << (int)m_can_device << endl); m_can_user = CreateCanFifoUser(m_can_device, acceptance_code, acceptance_mask, baud_rate, send_fifo_size, receive_fifo_size); if (m_can_user >= 0) { success = true; LOGGING_INFO_CO(CAN, tCanDevice, CanDriverName(), "Can User: "******"Error creating can fifo of LXRT-CAN-device " << (int)m_can_device << endl); } } } else #endif { // Achtung, falls wir nicht lxrt-task sind oder kein lxrt can // interface zur Verf¸gung steht, wird der folgende code ausgef¸hrt: m_can_device = CanDeviceOpen(device_name, flags, acceptance_code, acceptance_mask, baud_rate, send_fifo_size, receive_fifo_size); if (CanDescriptorValid(m_can_device)) { success = true; LOGGING_INFO_CO(CAN, tCanDevice, CanDriverName(), "Opened device " << device_name << " -> " << (uint64_t)m_can_device << endl); } else { LOGGING_ERROR_CO(CAN, tCanDevice, CanDriverName(), "Error open CAN-device '" << device_name << "' (errno=" << strerror(errno) << ")" << endl); } } if (!success) m_can_device = InvalidCanDescriptor(); }
/** * \brief Lists the hardware interface available. * \param[out] asSelHwInterface, is INTERFACE_HW_LIST structure * \param[out] nCount , is INT contains the selected channel count. * \return S_OK for success, S_FALSE for failure */ HRESULT CDIL_CAN_MHS::CAN_ListHwInterfaces(INTERFACE_HW_LIST& asSelHwInterface, INT& nCount) { USES_CONVERSION; char str[2]; str[0] = '\0'; if (CanDeviceOpen(0, str) == CAN_STATUS_OK) { (void)CanDeviceClose(0); nCount = 1; //set the current number of channels sg_nNoOfChannels = 1; asSelHwInterface[0].m_dwIdInterface = 0; asSelHwInterface[0].m_acDescription = "0"; sg_bCurrState = STATE_HW_INTERFACE_LISTED; } else { nCount = 0; return (S_FALSE); } return(S_OK); }