Skip to content

Instantly share code, notes, and snippets.

@deckerego
Last active November 10, 2015 04:40
Show Gist options
  • Save deckerego/a5e77dd01df00db92f21 to your computer and use it in GitHub Desktop.
Save deckerego/a5e77dd01df00db92f21 to your computer and use it in GitHub Desktop.
Read data from an Adafruit Trinket over USB
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);
}
}
}
}
#!/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()
#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