2
* tranzport 0.1 <tranzport.sf.net>
13
#define VENDORID 0x165b
14
#define PRODUCTID 0x8101
16
#define READ_ENDPOINT 0x81
17
#define WRITE_ENDPOINT 0x02
29
#define BUTTONMASK_BATTERY 0x00004000
30
#define BUTTONMASK_BACKLIGHT 0x00008000
31
#define BUTTONMASK_TRACKLEFT 0x04000000
32
#define BUTTONMASK_TRACKRIGHT 0x40000000
33
#define BUTTONMASK_TRACKREC 0x00040000
34
#define BUTTONMASK_TRACKMUTE 0x00400000
35
#define BUTTONMASK_TRACKSOLO 0x00000400
36
#define BUTTONMASK_UNDO 0x80000000
37
#define BUTTONMASK_IN 0x02000000
38
#define BUTTONMASK_OUT 0x20000000
39
#define BUTTONMASK_PUNCH 0x00800000
40
#define BUTTONMASK_LOOP 0x00080000
41
#define BUTTONMASK_PREV 0x00020000
42
#define BUTTONMASK_ADD 0x00200000
43
#define BUTTONMASK_NEXT 0x00000200
44
#define BUTTONMASK_REWIND 0x01000000
45
#define BUTTONMASK_FASTFORWARD 0x10000000
46
#define BUTTONMASK_STOP 0x00010000
47
#define BUTTONMASK_PLAY 0x00100000
48
#define BUTTONMASK_RECORD 0x00000100
49
#define BUTTONMASK_SHIFT 0x08000000
51
#define STATUS_OFFLINE 0xff
52
#define STATUS_ONLINE 0x01
55
struct usb_device *dev;
59
typedef struct tranzport_s tranzport_t;
61
void log_entry(FILE *fp, char *format, va_list ap)
63
vfprintf(fp, format, ap);
67
void log_error(char *format, ...)
71
log_entry(stderr, format, ap);
75
void vlog_error(char *format, va_list ap)
77
log_entry(stderr, format, ap);
80
void die(char *format, ...)
84
vlog_error(format, ap);
89
tranzport_t *open_tranzport_core(struct usb_device *dev)
94
z = malloc(sizeof(tranzport_t));
96
die("not enough memory");
97
memset(z, 0, sizeof(tranzport_t));
100
z->udev = usb_open(z->dev);
102
die("unable to open tranzport");
104
val = usb_claim_interface(z->udev, 0);
106
die("unable to claim tranzport");
111
tranzport_t *open_tranzport()
114
struct usb_device *dev;
120
for(bus=usb_busses; bus; bus=bus->next) {
121
for(dev=bus->devices; dev; dev=dev->next) {
122
if (dev->descriptor.idVendor != VENDORID)
124
if (dev->descriptor.idProduct != PRODUCTID)
127
return open_tranzport_core(dev);
131
die("can't find tranzport");
135
void close_tranzport(tranzport_t *z)
139
val = usb_release_interface(z->udev, 0);
141
log_error("unable to release tranzport");
143
val = usb_close(z->udev);
145
log_error("unable to close tranzport");
150
int tranzport_write_core(tranzport_t *z, uint8_t *cmd, int timeout)
153
val = usb_interrupt_write(z->udev, WRITE_ENDPOINT, cmd, 8, timeout);
161
int tranzport_lcdwrite(tranzport_t *z, uint8_t cell, char *text, int timeout)
178
return tranzport_write_core(z, cmd, timeout);
181
int tranzport_lighton(tranzport_t *z, uint8_t light, int timeout)
194
return tranzport_write_core(z, cmd, timeout);
197
int tranzport_lightoff(tranzport_t *z, uint8_t light, int timeout)
210
return tranzport_write_core(z, cmd, timeout);
213
int tranzport_read(tranzport_t *z, uint8_t *status, uint32_t *buttons, uint8_t *datawheel, int timeout)
219
val = usb_interrupt_read(z->udev, READ_ENDPOINT, buf, 8, timeout);
225
/*printf("read: %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);*/
230
*buttons |= buf[2] << 24;
231
*buttons |= buf[3] << 16;
232
*buttons |= buf[4] << 8;
240
void lights_core(tranzport_t *z, uint32_t buttons, uint32_t buttonmask, uint8_t light)
242
if (buttons & buttonmask) {
243
if (buttons & BUTTONMASK_SHIFT) {
244
tranzport_lightoff(z, light, 1000);
246
tranzport_lighton(z, light, 1000);
251
void do_lights(tranzport_t *z, uint32_t buttons)
253
lights_core(z, buttons, BUTTONMASK_RECORD, LIGHT_RECORD);
254
lights_core(z, buttons, BUTTONMASK_TRACKREC, LIGHT_TRACKREC);
255
lights_core(z, buttons, BUTTONMASK_TRACKMUTE, LIGHT_TRACKMUTE);
256
lights_core(z, buttons, BUTTONMASK_TRACKSOLO, LIGHT_TRACKSOLO);
257
lights_core(z, buttons, BUTTONMASK_TRACKSOLO, LIGHT_ANYSOLO);
258
lights_core(z, buttons, BUTTONMASK_PUNCH, LIGHT_PUNCH);
259
lights_core(z, buttons, BUTTONMASK_LOOP, LIGHT_LOOP);
262
void buttons_core(tranzport_t *z, uint32_t buttons, uint32_t buttonmask, char *str)
264
if (buttons & buttonmask)
268
void do_buttons(tranzport_t *z, uint32_t buttons, uint8_t datawheel)
271
buttons_core(z, buttons, BUTTONMASK_BATTERY, "battery");
272
buttons_core(z, buttons, BUTTONMASK_BACKLIGHT, "backlight");
273
buttons_core(z, buttons, BUTTONMASK_TRACKLEFT, "trackleft");
274
buttons_core(z, buttons, BUTTONMASK_TRACKRIGHT, "trackright");
275
buttons_core(z, buttons, BUTTONMASK_TRACKREC, "trackrec");
276
buttons_core(z, buttons, BUTTONMASK_TRACKMUTE, "trackmute");
277
buttons_core(z, buttons, BUTTONMASK_TRACKSOLO, "tracksolo");
278
buttons_core(z, buttons, BUTTONMASK_UNDO, "undo");
279
buttons_core(z, buttons, BUTTONMASK_IN, "in");
280
buttons_core(z, buttons, BUTTONMASK_OUT, "out");
281
buttons_core(z, buttons, BUTTONMASK_PUNCH, "punch");
282
buttons_core(z, buttons, BUTTONMASK_LOOP, "loop");
283
buttons_core(z, buttons, BUTTONMASK_PREV, "prev");
284
buttons_core(z, buttons, BUTTONMASK_ADD, "add");
285
buttons_core(z, buttons, BUTTONMASK_NEXT, "next");
286
buttons_core(z, buttons, BUTTONMASK_REWIND, "rewind");
287
buttons_core(z, buttons, BUTTONMASK_FASTFORWARD, "fastforward");
288
buttons_core(z, buttons, BUTTONMASK_STOP, "stop");
289
buttons_core(z, buttons, BUTTONMASK_PLAY, "play");
290
buttons_core(z, buttons, BUTTONMASK_RECORD, "record");
291
buttons_core(z, buttons, BUTTONMASK_SHIFT, "shift");
293
printf(" datawheel=%02x", datawheel);
297
void do_lcd(tranzport_t *z)
299
tranzport_lcdwrite(z, 0, " ", 1000);
300
tranzport_lcdwrite(z, 1, "DISL", 1000);
301
tranzport_lcdwrite(z, 2, "EXIA", 1000);
302
tranzport_lcdwrite(z, 3, " FOR", 1000);
303
tranzport_lcdwrite(z, 4, " ", 1000);
305
tranzport_lcdwrite(z, 5, " ", 1000);
306
tranzport_lcdwrite(z, 6, " CUR", 1000);
307
tranzport_lcdwrite(z, 7, "E FO", 1000);
308
tranzport_lcdwrite(z, 8, "UND ", 1000);
309
tranzport_lcdwrite(z, 9, " ", 1000);
320
z = open_tranzport();
325
val = tranzport_read(z, &status, &buttons, &datawheel, 60000);
329
if (status == STATUS_OFFLINE) {
334
if (status == STATUS_ONLINE) {
339
do_lights(z, buttons);
340
do_buttons(z, buttons, datawheel);