CAN_HANDLE canOpen_driver(s_BOARD *board) { VSCAN_HANDLE fd0 = 0; char busname[64]; char* pEnd; int i; int baudrate; printf("bus %s ", board->busname); fd0 = VSCAN_Open(board->busname, VSCAN_MODE_NORMAL); if(fd0 <= 0) { fprintf(stderr, "canOpen_driver (VScom): error opening %s\n", board->busname); return (CAN_HANDLE)fd0; } printf("(fd = %d)\n", fd0); baudrate = TranslateBaudeRate(board->baudrate); if(baudrate == 0) return 0; if (VSCAN_Ioctl((VSCAN_HANDLE)fd0, VSCAN_IOCTL_SET_SPEED, (void *)baudrate) != VSCAN_ERR_OK) { fprintf(stderr, "canOpen_driver (VScom): IOCTL set speed failed\n"); return 0; } return (CAN_HANDLE)fd0; }
/** * \brief Default constructor */ CanBus::CanBus(QString device, int baudRate) { printf("CanBus::CanBus: %s %d\n", device.toStdString().c_str(), baudRate); rDebug("CanBus initialize"); // Open and initialize the device devHandler = VSCAN_Open(device.toAscii().data(), VSCAN_MODE_NORMAL); if(devHandler < 0) { qFatal("Failed to open Can device "); return; } rDebug("Can device "+device+" oppened correctly"); if(setBaudRate(baudRate) != 0) rDebug("Failed setting baudRate"); }
/** * @brief connects to the channels and initiates read thread. * @param void * @return S_OK for success, S_FALSE for failure */ HRESULT CDIL_CAN_VSCOM::startHardware(void) { USES_CONVERSION; HRESULT hResult = S_FALSE; //VALIDATE_VALUE_RETURN_VAL(sg_bCurrState, STATE_HW_INTERFACE_SELECTED, ERR_IMPROPER_STATE); /* If no device available, exit */ if (strcmp(sg_VSCanCfg.szLocation, "") == NULL || strcmp(sg_VSCanCfg.szLocation, "\\\\.\\") == NULL ) { return S_FALSE; } if (sg_VSCanCfg.bDebug) { VSCAN_Ioctl(0, VSCAN_IOCTL_SET_DEBUG_MODE, VSCAN_DEBUG_MODE_FILE); VSCAN_Ioctl(0, VSCAN_IOCTL_SET_DEBUG, VSCAN_DEBUG_HIGH); } else { VSCAN_Ioctl(0, VSCAN_IOCTL_SET_DEBUG, VSCAN_DEBUG_NONE); } sg_VSCanCfg.hCan = VSCAN_Open(sg_VSCanCfg.szLocation, sg_VSCanCfg.dwMode); if (sg_VSCanCfg.hCan > 0) { if (VSCAN_Ioctl(sg_VSCanCfg.hCan, VSCAN_IOCTL_SET_TIMESTAMP, sg_VSCanCfg.bTimestamps?VSCAN_TIMESTAMP_ON:VSCAN_TIMESTAMP_OFF) != VSCAN_ERR_OK) { sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("set timestamp ioctl failed")); return (S_FALSE); } if (VSCAN_Ioctl(sg_VSCanCfg.hCan, VSCAN_IOCTL_SET_FILTER_MODE, sg_VSCanCfg.bDualFilter?VSCAN_FILTER_MODE_DUAL:VSCAN_FILTER_MODE_SINGLE) != VSCAN_ERR_OK) { sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("set filter mode ioctl failed")); return (S_FALSE); } if (VSCAN_Ioctl(sg_VSCanCfg.hCan, VSCAN_IOCTL_SET_ACC_CODE_MASK, &sg_VSCanCfg.codeMask) != VSCAN_ERR_OK) { sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("set acceptance code mask ioctl failed")); return (S_FALSE); } if (sg_VSCanCfg.vSpeed) { if (VSCAN_Ioctl(sg_VSCanCfg.hCan, VSCAN_IOCTL_SET_SPEED, (void*)sg_VSCanCfg.vSpeed) != VSCAN_ERR_OK) { sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("set speed ioctl failed")); return (S_FALSE); } } else { if (VSCAN_Ioctl(sg_VSCanCfg.hCan, VSCAN_IOCTL_SET_BTR, &sg_VSCanCfg.btr) != VSCAN_ERR_OK) { sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("set btr ioctl failed")); return (S_FALSE); } } sg_hEventRecv = CreateEvent(NULL, FALSE, FALSE, NULL); if (sg_hEventRecv == NULL) { sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("could not create the receive event")); hResult = S_FALSE; } if (VSCAN_SetRcvEvent(sg_VSCanCfg.hCan, sg_hEventRecv) != VSCAN_ERR_OK) { sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("VSCAN_SetRcvEvent failed")); hResult = S_FALSE; } sg_hReadThread = CreateThread(NULL, 0, CanRxEvent, NULL, 0, &sg_dwReadThreadId); if (sg_hReadThread == NULL) { sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("could not create the receive thread")); hResult = S_FALSE; } hResult = S_OK; sg_bCurrState = STATE_CONNECTED; } else { //log the error for open port failure sg_pIlog->logMessage(A2T(__FILE__), __LINE__, _("error opening \"VScom CAN\" interface")); hResult = ERR_LOAD_HW_INTERFACE; } return(hResult); }