Last active
November 10, 2015 04:40
-
-
Save deckerego/a5e77dd01df00db92f21 to your computer and use it in GitHub Desktop.
Read data from an Adafruit Trinket over USB
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.nio.*; | |
import org.usb4java.*; | |
public class ReadTrinket { | |
public static void main(String args[]) { | |
Context context = init(); | |
DeviceHandle trinketHandle = openDevice(); | |
try { | |
int result = LibUsb.claimInterface(trinketHandle, (short) 0x00); | |
if (result != LibUsb.SUCCESS) throw new LibUsbException("Cannot open Trinket interface", result); | |
try { | |
System.out.println("Found Trinket, Data: "); | |
for(int i=10; i >= 0; --i) | |
System.out.println(read(trinketHandle, 5000)); | |
} finally { | |
result = LibUsb.releaseInterface(trinketHandle, (short) 0x00); | |
if (result != LibUsb.SUCCESS) throw new LibUsbException("Failure releasing Trinket interface", result); | |
} | |
} finally { | |
LibUsb.close(trinketHandle); | |
} | |
LibUsb.exit(context); | |
} | |
public static Context init() { | |
Context context = new Context(); | |
int result = LibUsb.init(context); | |
if (result != LibUsb.SUCCESS) throw new LibUsbException("Unable to initialize libusb", result); | |
return context; | |
} | |
public static DeviceHandle openDevice() { | |
Device trinketDev = findDevice(); | |
DeviceHandle trinketHandle = new DeviceHandle(); | |
int result = LibUsb.open(trinketDev, trinketHandle); | |
if (result != LibUsb.SUCCESS) throw new LibUsbException("Cannot find Trinket", result); | |
return trinketHandle; | |
} | |
public static Device findDevice() { | |
short vendorId = 0x1781; | |
short productId = 0x1111; | |
DeviceList list = new DeviceList(); | |
int result = LibUsb.getDeviceList(null, list); | |
if (result < 0) throw new LibUsbException("Unable to fetch device list", result); | |
try { | |
for (Device device: list) { | |
DeviceDescriptor descriptor = new DeviceDescriptor(); | |
result = LibUsb.getDeviceDescriptor(device, descriptor); | |
if (result != LibUsb.SUCCESS) throw new LibUsbException("Failure in reading device", result); | |
if (descriptor.idVendor() == vendorId && descriptor.idProduct() == productId) return device; | |
} | |
} finally { | |
LibUsb.freeDeviceList(list, true); | |
} | |
return null; | |
} | |
public static String read(DeviceHandle handle, long timeout) { | |
byte endpointId = (byte) 0x81; | |
StringBuilder stringBuilder = new StringBuilder(); | |
boolean started = false; | |
while(true) { | |
ByteBuffer buffer = BufferUtils.allocateByteBuffer(2).order(ByteOrder.LITTLE_ENDIAN); | |
IntBuffer transferred = BufferUtils.allocateIntBuffer(); | |
int result = LibUsb.bulkTransfer(handle, endpointId, buffer, transferred, timeout); | |
if (result != LibUsb.SUCCESS) throw new LibUsbException("Failure reading data", result); | |
CharBuffer charBuffer = buffer.asCharBuffer(); | |
while(charBuffer.hasRemaining()) { | |
char nextChar = charBuffer.get(); | |
if(nextChar == '\n') started = true; //Start Character | |
else if(nextChar == '\r' && started) return stringBuilder.toString(); //End Character | |
else if(started) stringBuilder.append(nextChar); | |
} | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import sys, time, getopt, subprocess | |
import usb.core, usb.util | |
import logging | |
import inspect | |
logging.basicConfig() | |
logger = logging.getLogger() | |
logger.setLevel(10) | |
class Sensor: | |
trinket = False | |
endpoint = 0x81 | |
def __init__(self): | |
self.reconnect() | |
def __del__(self): | |
self.trinket = False | |
def reconnect(self): | |
self.trinket = self.__findTrinket() | |
if self.trinket != False: | |
self.endpoint = self.trinket[0][(0,0)][0] | |
logger.info("Button Ready"); | |
def readline(self): | |
if not self.trinket: | |
logging.error('No trinket connected, trying again...') | |
self.reconnect() | |
return self.readline() | |
try: | |
char_buffer = '' | |
while True: | |
data = self.trinket.read(self.endpoint.bEndpointAddress, self.endpoint.wMaxPacketSize) | |
readCnt = len(data) | |
if readCnt > 0: | |
char_buffer += bytearray(data) | |
if '\r\n' in char_buffer[-2:] and len(char_buffer.strip()) > 0: | |
return char_buffer.strip() | |
except Exception as ex: | |
exStr = str(ex).lower() | |
if 'timeout' not in exStr: | |
logging.error('USB read error', ex) | |
self.trinket = False | |
def __findTrinket(self): | |
device = usb.core.find(idVendor = 0x1781, idProduct = 0x1111) | |
if device == None or device == False or device == 0 : | |
return False | |
device.set_configuration() | |
return device | |
sensor = Sensor() | |
while True: | |
print sensor.readline() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "TrinketFakeUsbSerial.h" | |
void setup() | |
{ | |
TFUSerial.begin(); | |
pinMode(1, OUTPUT); | |
pinMode(2, INPUT); | |
} | |
void loop() | |
{ | |
TFUSerial.task(); | |
analogWrite(1, analogRead(1)); | |
TFUSerial.println(analogRead(1)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment