Example #1
0
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;
}
Example #2
0
/*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;
}
Example #3
0
bool FtdiDevices::setSpeed( ULONG baudRate ) {
  FT_STATUS ftStatus;
  ftStatus = FT_SetBaudRate(m_ftHandleA, baudRate);
  if (!FT_SUCCESS(ftStatus)) {
    return false;
  }
  return true;
}
Example #4
0
/*
 * Установка таймаута
 */
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;
}
Example #5
0
/**
 *  TODO: Необходимо отрефакторить код
 */
bool FtdiDevices::reset() {
  FT_STATUS ftStatus;
  ftStatus = FT_ResetDevice(m_ftHandleA);
  if (!FT_SUCCESS(ftStatus)) {
    return false;
  }
  return true;
}
Example #6
0
bool FtdiDevices::getModemStatus() {
  FT_STATUS ftStatus;
  ULONG Status;
  ftStatus = FT_GetModemStatus(m_ftHandleA, &Status);
  if (!FT_SUCCESS(ftStatus)) {
    return false;
  }
  return true;
}
Example #7
0
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;
}
Example #8
0
/* 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;
}
Example #9
0
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;
}
Example #10
0
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;
	
}
Example #11
0
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;
}
Example #12
0
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;
}