PacketUsbCdc::Status PacketUsbCdc::close()
{
	exit = true;
	usbClose( );
	msleep( 50 ); // wait a second before returning, because we'll be deleted right after we're removed form the GUI
	return PacketInterface::OK;
}
Exemple #2
0
int main(int argc, char **argv)
{
	driver glove = driver();

	// Initialize ncurses
	nc_init();
	
	FILE * file = fopen("output.dat", "w");

	for(int key;;) {

		// User hat eine Taste gedrückt
		if ((key = getch()) != ERR) {
			break;
		}

		// Daten abrufen
		int_least16_t x(0), y(0), z(0), test(0);

		clock_t start = clock();
		glove.catch_data(x, y, z, test);
		clock_t end = clock();
		
		fprintf(file, "%d %d %d\n", x, y, z);
		
		setStatus(x, y, z, start, end, test);
	}

	usbClose();
	fclose(file);
	endwin();
	return 0;
}
UsbSerial::UsbStatus UsbSerial::usbWrite( char* buffer, int length )
{
  if( !deviceOpen )
  {
    UsbStatus portIsOpen = usbOpen( );
    if( portIsOpen != OK )
		{
				usbClose( );
			return NOT_OPEN;
		}
  }
  
	QMutexLocker locker( &usbMutex );
	
  // Linux Only
  #if (defined(Q_WS_LINUX))
    return NOT_OPEN;
  #endif

  //Mac-only
	#ifdef Q_WS_MAC
 
	int size = ::write( deviceHandle, buffer, length );
	if ( length == size )
    return OK;
	else if( errno == EAGAIN )
	  return NOTHING_AVAILABLE;
  else
    return IO_ERROR;
	
	#endif //Mac-only UsbSerial::write( )

  //Windows-only
  #ifdef Q_WS_WIN
  DWORD cout, ret, numWritten;
  bool success;
  UsbSerial::UsbStatus retval = OK;
  
  overlappedWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  
	// reset the write overlapped structure
  overlappedWrite.Offset = overlappedWrite.OffsetHigh = 0;
  
  success = WriteFile( deviceHandle, buffer, length, &cout, &overlappedWrite );
  if( !success )
  {
  	if ( GetLastError() == ERROR_IO_PENDING)
	  {
	  	int waitCount = 0;
		  do
		  {
	  		if( waitCount++ > 5 )
	  			break;
		  	ret = WaitForSingleObject( overlappedWrite.hEvent, 100 );
		  }  while ( ret == WAIT_TIMEOUT );
	
	    if ( ret == WAIT_OBJECT_0 )
	    {			
				//do
				//{
					GetOverlappedResult( deviceHandle, &overlappedWrite, &numWritten, TRUE);
					//read = numWritten;
				//} while( read != length );
				if( numWritten == (DWORD)length )
					retval = OK;
				else
				  retval = IO_ERROR;
	    }
	    else
	      retval = IO_ERROR;
	  }
	  else
	  {
	    //usbClose( );
	    retval = IO_ERROR;
	  }
  }
  
  CloseHandle( overlappedWrite.hEvent );
  return retval;
  
  #endif //Windows-only UsbSerial::write( )
}
int UsbSerial::usbRead( char* buffer, int length )
{
  // make sure we're open
  if( !deviceOpen )
  {
    UsbStatus portIsOpen = usbOpen( );
    if( portIsOpen != OK )
		{
			usbClose( );
			return NOT_OPEN;
		}
  }
	
	QMutexLocker locker( &usbMutex );
  
  // Linux Only
  #if (defined(Q_WS_LINUX))
  // make sure we're open
  //if( !deviceOpen )
    return NOT_OPEN;
  #endif

  //Mac-only
	#ifdef Q_WS_MAC
	int count;
		
	count = ::read( deviceHandle, buffer, length );
	if( count > 1 )
		return count;
	else
	{
		switch ( count )
		{
			case 0:
			return ERROR_CLOSE; // EOF; possibly file was closed
				break;

			case -1:
				if ( errno == EAGAIN )
					return NOTHING_AVAILABLE;
				else
					return IO_ERROR;
				break;
		}
	}
	return 0; // should never get here
	#endif //Mac-only UsbSerial::read( )
	
  //Windows-only///////////////////////////////////////////////////////////////////////
  #ifdef Q_WS_WIN
  DWORD count;
  int retval = -1;
  DWORD numTransferred;
    
  retval = OK;  
  readInProgress = false;
  overlappedRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  // reset the read overlapped structure
  overlappedRead.Offset = overlappedRead.OffsetHigh = 0;
  
  if ( !ReadFile( deviceHandle, buffer, length, &count, &overlappedRead ) )
  {
  	DWORD lastError = GetLastError();
		// messageInterface->message( 1, "USB Read Error: %d \n", lastError );
	  if ( lastError != ERROR_IO_PENDING)     // read not delayed?
	  {
	    usbClose( );
	    //messageInterface->message( 1, "Closed trying to read the file\n" );
	    retval = -1; //UNKNOWN_ERROR;
	  }
	  else
	    readInProgress = true;
  }
  else          	
  	retval = count;


  if( readInProgress )
  {
  	DWORD r;
	  do
	  {
	    r = WaitForSingleObject( overlappedRead.hEvent, 1000 );	 
	  } while ( r == WAIT_TIMEOUT );
	  switch( r )
		{
		  case WAIT_FAILED:
		    usbClose( );
		    retval = -1; //UNKNOWN_ERROR;
	      break;
		  case WAIT_TIMEOUT:
		    retval = -1; // NOTHING_AVAILABLE;
		    break;
		  case WAIT_OBJECT_0:
	  		// check to see if the pending operation completed
        	if( !GetOverlappedResult( deviceHandle, &overlappedRead, &numTransferred, FALSE )  ) // don't wait
			{
		      usbClose( );
		      SetEvent( overlappedRead.hEvent );
		      retval = -1; //IO_ERROR;
		      break;
			}
  			retval = numTransferred;
			  break; 
		  case WAIT_ABANDONED:
		  default:
		    usbClose( );
		    retval = -1; //IO_ERROR;
			  break;
		} // end of switch
  }
  
  CloseHandle( overlappedRead.hEvent );
  return retval;
  	
  #endif //Windows-only UsbSerial::read( )//////////////////////////////////////////////////////////////
}
PacketUsbCdc::Status PacketUsbCdc::close()
{
	usbClose( );
	return PacketInterface::OK;
}
PacketUsbCdc::Status PacketUsbCdc::close()
{
	usbWriteChar( END );
	usbClose( );
	return PacketInterface::OK;
}
UsbSerial::UsbStatus UsbSerial::usbWrite( char* buffer, int length )
{
  // Linux Only
  #if (defined(Q_WS_LINUX))
  // make sure we're open
  //if( !deviceOpen )
    return NOT_OPEN;
  #endif

  //Mac-only
	#ifdef Q_WS_MAC
	
	if( !deviceOpen )  //then try to open it
	{
	  UsbStatus portIsOpen = usbOpen( );
		if( portIsOpen != OK )
		  return NOT_OPEN;
	}
 
	int size = ::write( deviceHandle, buffer, length );
	if ( length == size )
    return OK;
	else if( errno == EAGAIN )
	  return NOTHING_AVAILABLE;
  else
  {
	  //printf("usbWrite: write failed, errno %d", errno);
    usbClose( );
    return IO_ERROR;
  }
	
	#endif //Mac-only UsbSerial::write( )

  //Windows-only
  #ifdef Q_WS_WIN
  DWORD cout;
  int count = 1;
  bool success;
  DWORD ret;
  UsbSerial::UsbStatus retval = OK;
  DWORD numWritten;
    
  if( !deviceOpen )
  {
    UsbStatus portIsOpen = usbOpen( );
    if( portIsOpen != OK )
	{
      usbClose( );
	  return NOT_OPEN;
	}
  }
  
  overlappedWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  
	// reset the write overlapped structure
  overlappedWrite.Offset = overlappedWrite.OffsetHigh = 0; 
  // messageInterface->message( 1, "Writing...\n" );
  success = WriteFile( deviceHandle, buffer, count, &cout, &overlappedWrite ) ;
  
  if( !success )
  {
  	if ( GetLastError() == ERROR_IO_PENDING)
	  {
	  	// messageInterface->message( 1, "Write: IO PENDING.\n" );
		  do
		  {
	  		//if( debug > 4 )TRACE_MESSAGE("TI_put(): Waiting for overlapped write to complete");
		  	ret = WaitForSingleObject( overlappedWrite.hEvent, 1000 );
		  }  while ( ret == WAIT_TIMEOUT );
	
	    if ( ret == WAIT_OBJECT_0 )
	    {
				// messageInterface->message( 1, "Write: IO PENDING.\n" );
			  GetOverlappedResult( deviceHandle, &overlappedWrite, &numWritten, TRUE);	
			  if( count == numWritten )
			  {
			  	// messageInterface->message( 1, "Write: COMPLETE.\n" );
			    retval = OK; 
			  }
			  else
			  {
			  	// messageInterface->message( 1, "write event, but only wrote %d\n", numWritten );
		      usbClose( );
			    retval = IO_ERROR;
			  }
	    }
	    else
	    {
	      usbClose( );
	      retval = IO_ERROR;
	    }
	  }
	  else
	  {
	    usbClose( );
	    retval = IO_ERROR;
	  }
  }
  
  CloseHandle( overlappedWrite.hEvent );
  return retval;
  
  #endif //Windows-only UsbSerial::write( )
}
UsbSerial::UsbStatus UsbSerial::usbRead( char* buffer, int length )
{
  // Linux Only
  #if (defined(Q_WS_LINUX))
  // make sure we're open
  //if( !deviceOpen )
    return NOT_OPEN;
  #endif

  //Mac-only
	#ifdef Q_WS_MAC
	int count;
	
	if( !deviceOpen )
	{
	  UsbStatus portIsOpen = usbOpen( );
		if( portIsOpen == OK )
		  deviceOpen = true;
		else 
		  return NOT_OPEN;
	}
		
	count = ::read( deviceHandle, buffer, length );
	printf( "Reading...count = %d\n", count );
	switch ( count )
  {
    case 0:
      // EOF; possibly file was closed
			//printf( "End of file.\n" );
			return ERROR_CLOSE;
      break;

    case 1:
      // got a character
			//printf( "Got a character: %s\n", buffer );
      return GOT_CHAR;
      break;

    case -1:
      if ( errno == EAGAIN )
			{
	      // non-blocking but no data available
				//printf( "No data available.\n" );
	      return NOTHING_AVAILABLE;
			}
      else
			  //printf( "Some other error...\n" );
	      return IO_ERROR;
      break;

    default:
		  //printf( "Unknown error.\n" );
      return IO_ERROR;
      break;
  }
	return OK;
	#endif //Mac-only UsbSerial::read( )
	
  //Windows-only///////////////////////////////////////////////////////////////////////
  #ifdef Q_WS_WIN
  DWORD count;
  UsbStatus retval;
  DWORD numTransferred;
  //int length = 0;
  
  // make sure we're open
  if( !deviceOpen )
  {
    UsbStatus portIsOpen = usbOpen( );
    if( portIsOpen != OK )
	{
	  usbClose( );
	  return NOT_OPEN;
	}
  }
    
  retval = OK;  
  readInProgress = false;
  overlappedRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  // reset the read overlapped structure
  overlappedRead.Offset = overlappedRead.OffsetHigh = 0;
  
  if ( !ReadFile( deviceHandle, buffer, length, &count, &overlappedRead ) )
  {
  	DWORD lastError = GetLastError();
		// messageInterface->message( 1, "USB Read Error: %d \n", lastError );
	  if ( lastError != ERROR_IO_PENDING)     // read not delayed?
	  {
	    usbClose();
	    //messageInterface->message( 1, "Closed trying to read the file\n" );
	    retval = UNKNOWN_ERROR;
	  }
	  else
	    readInProgress = true;
  }
  else          	
  {
		// messageInterface->message( 1, "USB read D: %c \n", *buffer );
  	retval = GOT_CHAR;
  }

  if( readInProgress )
  {
  	DWORD r;
	  do
	  {
	    r = WaitForSingleObject( overlappedRead.hEvent, 10000 );	 
	  } while ( r == WAIT_TIMEOUT );
	  switch( r )
		{
		  case WAIT_FAILED:
		    //FIXME is there anything else i need to clean up?
		    // reset events? terminate anything?
		    usbClose(  );
		    //messageInterface->message( 1, "Closed after wait failed\n" );
		    retval = UNKNOWN_ERROR; //( 100 );
	      break;
		  case WAIT_TIMEOUT:
			  //if( debug > 1 ) TRACE_MESSAGE( "timeout occurred while waiting for event\n" );
		    retval = NOTHING_AVAILABLE; //( TELEO_E_NOTHING );
		    //messageInterface->message( 1, "Nothing available\n" );
		    break;
		  case WAIT_OBJECT_0:
	  		// check to see if the pending operation completed
        if( !GetOverlappedResult( deviceHandle, &overlappedRead, &numTransferred, FALSE )  ) // don't wait
				{
	        ///FIXME is there anything else i need to clean up?
		      // reset events? terminate anything?
		      usbClose( );
		      SetEvent( overlappedRead.hEvent );
		      //messageInterface->message( 1, "Closed because error getting overlapped result\n" );
		      retval = IO_ERROR;
		      break;
				}
		    //messageInterface->message( 1, "Successfully got overlapped result\n" );
  			retval = GOT_CHAR;
			  break; 
		  case WAIT_ABANDONED:
		  default:
		    usbClose( );
		    //messageInterface->message( 1, "Closed - wait abandoned or default\n" );
		    retval = IO_ERROR;
			  break;
		} // end of switch
  }
  
  CloseHandle( overlappedRead.hEvent );
  return retval;
  	
  #endif //Windows-only UsbSerial::read( )//////////////////////////////////////////////////////////////
}
int Sdr1kUsb::Open(BOOL rfe, BOOL adc, int select)
{
	if (usbStatus >= 0) Close();
	GetNumDevs();
	int idx = select;
	if (select < 0) idx = 0;
	while (idx < devcount) {
		if (usbOpen(device[idx])) {
			if (usbSetConfiguration(1) == 0
				&& usbClaimInterface(0) == 0
				&& usbSetAltinterface(1) == 0)
			{
				usbStatus = 0;
				break;
			}
			usbClose();
		}
		if (select < 0) idx++;
		else return usbStatus;
	}
	if (usbStatus < 0) return usbStatus;

#ifdef SDR1KUSB_INFO
	printf("device %d: %s\n", idx, device[idx]->filename);
	printf("hardware: %s\n", hw[idx]->name);
#endif

	inEP = hw[idx]->inEP;
	outEP = hw[idx]->outEP;
	usbClearHalt(inEP);
	usbClearHalt(outEP);

	int* fwSize = hw[idx]->fwSize;
	int* fwAddr = hw[idx]->fwAddr;
	BYTE** fwBytes = hw[idx]->fwBytes;
	for (int i = 0; fwSize[i] > 0; i++) {
		ezusbFirmwareDownload(fwAddr[i], fwBytes[i], fwSize[i]);
	}

	int eepromSize = hw[idx]->eepromSize;
	if (eepromSize == 16) {
		BYTE eeprom[16];
		usbBulkRead(inEP, eeprom, 16);
#ifdef SDR1KUSB_INFO
		printf("EEPROM:");
		for (int i = 0; i < 16; i++) {
			printf(" %02X", eeprom[i]);
		}
		printf("\n");
#endif
	}

	inputEvent = 0;
	usbUpdatePeriod = USB_UPDATE_DEFAULT;

	outcount = 0;
	startUsbThread();

	Latch(0x0F, 0);
	DDSReset();

	rfeEnabled = rfe;
	if (rfeEnabled) {
		LatchBpf(0);	// bpfBits |= 0x24
		adcEnabled = adc;
		SRLoadIC11(0);
		SRLoadIC7(0);
		SRLoadIC10(0);
		SRLoadIC9(0);
	}
	else adcEnabled = 0;

	if (Commit() < 0) {
		Close();
		return usbStatus;
	}
	return idx;
}