bool FtdiDevices::setFlowControl() { USHORT FlowControl; UCHAR XonChar; UCHAR XoffChar; FT_STATUS ftStatus; FlowControl = FT_FLOW_NONE; XonChar = 0; XoffChar = 0; switch(FT_INDEX_FLOW_NONE) { case 0: // NONE default: break; case 1: // RTS FlowControl = FT_FLOW_RTS_CTS; break; case 2: // DTR FlowControl = FT_FLOW_DTR_DSR; break; case 3: // XON/XOFF FlowControl = FT_FLOW_XON_XOFF; XonChar = 0x11; XoffChar = 0x13; break; } ftStatus = FT_SetFlowControl(m_ftHandleA, FlowControl, XonChar, XoffChar); if (!FT_SUCCESS(ftStatus)) { return false; } return true; }
/*Search device parametr*/ quint16 ftdiChip::on_SearchDevice() { FT_STATUS ftStatus; DWORD numDev; // колличество USB устройств BYTE n=(BYTE)NULL; QStringList itm; quint16 Return; quint8 counDevice = (quint8)NULL; if (hdUSB!=NULL){Close();} ftStatus = FT_ListDevices(BufPtrs,&numDev,FT_LIST_ALL|FT_OPEN_BY_DESCRIPTION); // поиск устройств по описанию if((FT_SUCCESS(ftStatus))||(ftStatus==FT_DEVICE_NOT_OPENED)){ itm.clear(); for (int i=0;i<(int)numDev;i++) { QString st; if(!strcmp(BufPtrs[i],"Debag_for_UDZ")){ st.append(BufPtrs[i]);st.append(" "+QString::number(n++)); numDevice = i; // наше устройство counDevice++; }else{ st.append(BufPtrs[i]); } itm.append(st); } }else Return=retErr; // ошибка // if(counDevice!=1)Return=retChoice; // нет устройств или найдено не одно else Return=retOk; emit signalSearchUsb(itm,numDevice,Return); return Return; }
bool FtdiDevices::setSpeed( ULONG baudRate ) { FT_STATUS ftStatus; ftStatus = FT_SetBaudRate(m_ftHandleA, baudRate); if (!FT_SUCCESS(ftStatus)) { return false; } return true; }
/* * Установка таймаута */ int FtdiDevices::setTimeouts(int rxTimeout, int txTimeout ) { FT_STATUS ftStatus; ftStatus = FT_SetTimeouts(m_ftHandleA, rxTimeout, txTimeout); if (!FT_SUCCESS(ftStatus)) { return false; } return true; }
/** * TODO: Необходимо отрефакторить код */ bool FtdiDevices::reset() { FT_STATUS ftStatus; ftStatus = FT_ResetDevice(m_ftHandleA); if (!FT_SUCCESS(ftStatus)) { return false; } return true; }
bool FtdiDevices::getModemStatus() { FT_STATUS ftStatus; ULONG Status; ftStatus = FT_GetModemStatus(m_ftHandleA, &Status); if (!FT_SUCCESS(ftStatus)) { return false; } return true; }
bool FtdiDevices::setChars() { FT_STATUS ftStatus; ftStatus = FT_SetChars(m_ftHandleA, 0, false ? (UCHAR)1 : (UCHAR)0, 0, false ? (UCHAR)1 : (UCHAR)0); if (!FT_SUCCESS(ftStatus)) { return false; } return true; }
/* Search device no parametr*/ quint16 ftdiChip::SearchDevice() { FT_STATUS ftStatus; DWORD numDev; // колличество USB устройств quint8 counDevice = (quint8)NULL; //if (hdUSB!=NULL){Close();} ftStatus = FT_ListDevices(BufPtrs,&numDev,FT_LIST_ALL|FT_OPEN_BY_DESCRIPTION); // поиск устройств по описанию if((FT_SUCCESS(ftStatus))||(ftStatus==FT_DEVICE_NOT_OPENED)){ for (int i=0;i<(int)numDev;i++) { if(!strcmp(BufPtrs[i],"Debag_for_UDZ")){ numDevice = i;counDevice++;} // наше устройство запоминаем } } else{ return retErr; // ошибка отработки команды } if(counDevice!=1)return retChoice; // найдено более одного устройства return retOk; }
bool FtdiDevices::setDataCharacteristics() { UCHAR WordLength; UCHAR StopBits; FT_STATUS ftStatus; WordLength = (UCHAR)(FT_INDEX_DATA_BITS_8 + FT_BITS_7); switch(FT_INDEX_STOP_BITS_1) { default: StopBits = FT_STOP_BITS_1; break; case 1: StopBits = FT_STOP_BITS_2; break; } ftStatus = FT_SetDataCharacteristics(m_ftHandleA, WordLength, StopBits, (UCHAR)FT_INDEX_PARITY_NONE); if (!FT_SUCCESS(ftStatus)) { return false; } return true; }
vector<string> D2xxSerial::getDeviceSerialNumbers() { vector<string> devices; FT_STATUS ftStatus; DWORD numDevs = getNumDevices(); for(int i = 0; i < numDevs; i++) { DWORD devIndex = i; char Buffer[16]; ftStatus = FT_ListDevices((PVOID)devIndex,Buffer,FT_LIST_BY_INDEX|FT_OPEN_BY_SERIAL_NUMBER); if (FT_SUCCESS(ftStatus)) { // FT_ListDevices OK, serial number is in Buffer devices.push_back(string(Buffer)); } else { devices.push_back("error"); // FT_ListDevices failed printf("Couldn't get serial number of device [%d] - error: %s\n", i, getError(ftStatus)); } } return devices; }
bool FTDIDMXDevice::open() { // Change QString to char* (not const char* note) char *serial; QByteArray a = m_path.toLatin1(); serial = (char*)malloc(sizeof(char) * (a.count() + 1)); memcpy(serial, a.constData(), a.count()); serial[a.count()] = 0; #ifndef WIN32 // Windows users cannot dynamiccaly set VID/PID of harward if (FT_SetVIDPID(m_vid, m_pid) == FT_OK && FT_OpenEx(serial, FT_OPEN_BY_SERIAL_NUMBER, &m_handle) == FT_OK) { #else if (FT_OpenEx(serial, FT_OPEN_BY_SERIAL_NUMBER, &m_handle) == FT_OK) { #endif free(serial); if (!FT_SUCCESS(FT_ResetDevice(m_handle))) { qWarning() << "Unable to reset FTDI device" << m_path; return false; } // Set the baud rate 12 will give us 250Kbits if (!FT_SUCCESS(FT_SetDivisor(m_handle, 12))) { qWarning() << "Unable to set divisor on FTDI device" << m_path; return false; } // Set the data characteristics if (!FT_SUCCESS(FT_SetDataCharacteristics(m_handle, FT_BITS_8, FT_STOP_BITS_2, FT_PARITY_NONE))) { qWarning() << "Unable to set data characteristics on" << "FTDI device" << m_path; return false; } // Set flow control if (!FT_SUCCESS(FT_SetFlowControl(m_handle, FT_FLOW_NONE, 0, 0))) { qWarning() << "Unable to set flow control on" << "FTDI device" << m_path; return false; } // set RS485 for sendin FT_ClrRts(m_handle); // Clear TX RX buffers FT_Purge(m_handle,FT_PURGE_TX | FT_PURGE_RX); m_threadRunning = true; start(QThread::TimeCriticalPriority); return true; } else { qWarning() << "Unable to open FTDIDMX" << m_output << ":" << serial; free(serial); return false; } } bool FTDIDMXDevice::close() { // Kill thread m_threadRunning = false; wait(500); FT_Close(m_handle); return true; }
bool CApoxObj::open( const char *szFileName, unsigned long flags ) { const char *p; unsigned long busspeed = 125; m_emergencyInfo = 0; char szDrvParams[ MAX_PATH ]; m_initFlag = flags; m_RxMsgState = USB_IDLE; // save parameter string and conbert to upper case strncpy( szDrvParams, szFileName, MAX_PATH ); _strupr( szDrvParams ); // Initiate statistics m_stat.cntReceiveData = 0; m_stat.cntReceiveFrames = 0; m_stat.cntTransmitData = 0; m_stat.cntTransmitFrames = 0; m_stat.cntBusOff = 0; m_stat.cntBusWarnings = 0; m_stat.cntOverruns = 0; // if open we have noting to do if ( m_bRun ) return true; // serial p = strtok( szDrvParams, ";" ); if ( NULL != p ) { strcpy( m_SerialNumber, p ); } // Bus-Speed p = strtok( NULL, ";" ); if ( NULL != p ) { if ( ( NULL != strstr( p, "0x" ) ) || ( NULL != strstr( p, "0X" ) ) ) { sscanf( p + 2, "%x", &busspeed ); } else { busspeed = atol( p ); } } // Handle busspeed uint8_t nSpeed = CAN_BAUD_1000; switch ( busspeed ) { case 125: nSpeed = CAN_BAUD_125; break; case 250: nSpeed = CAN_BAUD_250; break; case 500: nSpeed = CAN_BAUD_500; break; case 1000: nSpeed = CAN_BAUD_1000; break; default: nSpeed = CAN_BAUD_125; break; } FT_STATUS ftStatus; ftStatus = FT_OpenEx( (void *)m_SerialNumber, FT_OPEN_BY_SERIAL_NUMBER, &m_ftHandle ); if ( !FT_SUCCESS( ftStatus ) ) return false; ftStatus = FT_ResetDevice( m_ftHandle ); ftStatus = FT_Purge( m_ftHandle, FT_PURGE_RX | FT_PURGE_TX ); ftStatus = FT_SetTimeouts(m_ftHandle, 378, 128); ftStatus = FT_SetUSBParameters ( m_ftHandle, 2048, 2048 ); ftStatus = FT_SetLatencyTimer( m_ftHandle, 3 ); // Run run run ..... m_bRun = true; #ifdef WIN32 // Start write thread DWORD threadId; if ( NULL == ( m_hTreadTransmit = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) workThreadTransmit, this, 0, &threadId ) ) ) { // Failure close(); return false; } // Start read thread if ( NULL == ( m_hTreadReceive = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) workThreadReceive, this, 0, &threadId ) ) ) { // Failure close(); return false; } // Release the mutex UNLOCK_MUTEX( m_apoxMutex ); UNLOCK_MUTEX( m_receiveMutex ); UNLOCK_MUTEX( m_transmitMutex ); UNLOCK_MUTEX( m_responseMutex ); #else // LINUX pthread_attr_t thread_attr; pthread_attr_init( &thread_attr ); // Create the log write thread. if ( pthread_create( &m_threadId, &thread_attr, workThreadTransmit, this ) ) { syslog( LOG_CRIT, "canallogger: Unable to create apoxdrv write thread."); rv = false; fclose( m_flog ); } // Create the log write thread. if ( pthread_create( &m_threadId, &thread_attr, workThreadReceive, this ) ) { syslog( LOG_CRIT, "canallogger: Unable to create apoxdrv receive thread."); rv = false; fclose( m_flog ); } // We are open m_bOpen = true; // Release the mutex pthread_mutex_unlock( &m_apoxMutex ); #endif // Switch to main mode if in boot mode if ( RUNMODE_BOOT == getAdapterRunMode() ) { setAdapterRunMode( RUNMODE_MAIN ); } // Set baudrate setBaudrate( nSpeed ); // Set initial filter/mask switch( m_initFlag & 0x03 ) { case 0: case 3: m_filtermask.rx_buff1_ext = 0; m_filtermask.rx_buff2_ext = 1; break; case 1: m_filtermask.rx_buff1_ext = 0; m_filtermask.rx_buff2_ext = 0; break; case 2: m_filtermask.rx_buff1_ext = 1; m_filtermask.rx_buff2_ext = 1; break; } m_filtermask.RXM0 = 0; m_filtermask.RXM1 = 0; m_filtermask.RXF0 = 0; m_filtermask.RXF1 = 0; m_filtermask.RXF2 = 0; m_filtermask.RXF3 = 0; m_filtermask.RXF4 = 0; m_filtermask.RXF5 = 0; setAdapterFilterMask( &m_filtermask ); // Set transmission mode short trmode = ( (short)( m_initFlag & 0x0c ) >> 2 ); if ( 0 == trmode ) trmode = TRMODE_NORMAL; setTransmissionMode( trmode ); return true; }