2
* tranzport 0.1 <tranzport.sf.net>
16
#define VENDORID 0x165b
17
#define PRODUCTID 0x8101
19
#define READ_ENDPOINT 0x81
20
#define WRITE_ENDPOINT 0x02
32
#define BUTTONMASK_BATTERY 0x00004000
33
#define BUTTONMASK_BACKLIGHT 0x00008000
34
#define BUTTONMASK_TRACKLEFT 0x04000000
35
#define BUTTONMASK_TRACKRIGHT 0x40000000
36
#define BUTTONMASK_TRACKREC 0x00040000
37
#define BUTTONMASK_TRACKMUTE 0x00400000
38
#define BUTTONMASK_TRACKSOLO 0x00000400
39
#define BUTTONMASK_UNDO 0x80000000
40
#define BUTTONMASK_IN 0x02000000
41
#define BUTTONMASK_OUT 0x20000000
42
#define BUTTONMASK_PUNCH 0x00800000
43
#define BUTTONMASK_LOOP 0x00080000
44
#define BUTTONMASK_PREV 0x00020000
45
#define BUTTONMASK_ADD 0x00200000
46
#define BUTTONMASK_NEXT 0x00000200
47
#define BUTTONMASK_REWIND 0x01000000
48
#define BUTTONMASK_FASTFORWARD 0x10000000
49
#define BUTTONMASK_STOP 0x00010000
50
#define BUTTONMASK_PLAY 0x00100000
51
#define BUTTONMASK_RECORD 0x00000100
52
#define BUTTONMASK_SHIFT 0x08000000
54
#define STATUS_OFFLINE 0xff
55
#define STATUS_ONLINE 0x01
56
#define STATUS_OK 0x00
63
typedef struct tranzport_s tranzport_t;
65
void log_entry(FILE *fp, char *format, va_list ap)
67
vfprintf(fp, format, ap);
71
void log_error(char *format, ...)
75
log_entry(stderr, format, ap);
79
void vlog_error(char *format, va_list ap)
81
log_entry(stderr, format, ap);
84
void die(char *format, ...)
88
vlog_error(format, ap);
93
tranzport_t *open_tranzport_core()
98
z = malloc(sizeof(tranzport_t));
100
die("not enough memory");
101
memset(z, 0, sizeof(tranzport_t));
103
z->udev = open("/dev/tranzport0",O_RDWR);
105
die("unable to open tranzport");
110
tranzport_t *open_tranzport()
112
return open_tranzport_core();
115
void close_tranzport(tranzport_t *z)
119
val = close(z->udev);
121
log_error("unable to release tranzport");
126
int tranzport_write_core(tranzport_t *z, uint8_t *cmd, int timeout)
129
val = write(z->udev, cmd, 8);
137
int tranzport_lcdwrite(tranzport_t *z, uint8_t cell, char *text, int timeout)
154
return tranzport_write_core(z, cmd, timeout);
157
int tranzport_lighton(tranzport_t *z, uint8_t light, int timeout)
170
return tranzport_write_core(z, &cmd[0], timeout);
173
int tranzport_lightoff(tranzport_t *z, uint8_t light, int timeout)
186
return tranzport_write_core(z, &cmd[0], timeout);
189
int tranzport_read(tranzport_t *z, uint8_t *status, uint32_t *buttons, uint8_t *datawheel, int timeout)
194
memset(buf, 0xff, 8);
195
val = read(z->udev, buf, 8);
197
// printf("errno: %d\n",errno);
203
/*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]);*/
208
*buttons |= buf[2] << 24;
209
*buttons |= buf[3] << 16;
210
*buttons |= buf[4] << 8;
218
void lights_core(tranzport_t *z, uint32_t buttons, uint32_t buttonmask, uint8_t light)
220
if (buttons & buttonmask) {
221
if (buttons & BUTTONMASK_SHIFT) {
222
tranzport_lightoff(z, light, 1000);
224
tranzport_lighton(z, light, 1000);
229
void do_lights(tranzport_t *z, uint32_t buttons)
231
lights_core(z, buttons, BUTTONMASK_RECORD, LIGHT_RECORD);
232
lights_core(z, buttons, BUTTONMASK_TRACKREC, LIGHT_TRACKREC);
233
lights_core(z, buttons, BUTTONMASK_TRACKMUTE, LIGHT_TRACKMUTE);
234
lights_core(z, buttons, BUTTONMASK_TRACKSOLO, LIGHT_TRACKSOLO);
235
lights_core(z, buttons, BUTTONMASK_TRACKSOLO, LIGHT_ANYSOLO);
236
lights_core(z, buttons, BUTTONMASK_PUNCH, LIGHT_PUNCH);
237
lights_core(z, buttons, BUTTONMASK_LOOP, LIGHT_LOOP);
240
void buttons_core(tranzport_t *z, uint32_t buttons, uint32_t buttonmask, char *str)
242
if (buttons & buttonmask)
246
void do_buttons(tranzport_t *z, uint32_t buttons, uint8_t datawheel)
248
printf("buttons: %x ", buttons);
249
buttons_core(z, buttons, BUTTONMASK_BATTERY, "battery");
250
buttons_core(z, buttons, BUTTONMASK_BACKLIGHT, "backlight");
251
buttons_core(z, buttons, BUTTONMASK_TRACKLEFT, "trackleft");
252
buttons_core(z, buttons, BUTTONMASK_TRACKRIGHT, "trackright");
253
buttons_core(z, buttons, BUTTONMASK_TRACKREC, "trackrec");
254
buttons_core(z, buttons, BUTTONMASK_TRACKMUTE, "trackmute");
255
buttons_core(z, buttons, BUTTONMASK_TRACKSOLO, "tracksolo");
256
buttons_core(z, buttons, BUTTONMASK_UNDO, "undo");
257
buttons_core(z, buttons, BUTTONMASK_IN, "in");
258
buttons_core(z, buttons, BUTTONMASK_OUT, "out");
259
buttons_core(z, buttons, BUTTONMASK_PUNCH, "punch");
260
buttons_core(z, buttons, BUTTONMASK_LOOP, "loop");
261
buttons_core(z, buttons, BUTTONMASK_PREV, "prev");
262
buttons_core(z, buttons, BUTTONMASK_ADD, "add");
263
buttons_core(z, buttons, BUTTONMASK_NEXT, "next");
264
buttons_core(z, buttons, BUTTONMASK_REWIND, "rewind");
265
buttons_core(z, buttons, BUTTONMASK_FASTFORWARD, "fastforward");
266
buttons_core(z, buttons, BUTTONMASK_STOP, "stop");
267
buttons_core(z, buttons, BUTTONMASK_PLAY, "play");
268
buttons_core(z, buttons, BUTTONMASK_RECORD, "record");
269
buttons_core(z, buttons, BUTTONMASK_SHIFT, "shift");
271
printf(" datawheel=%02x", datawheel);
275
void do_lcd(tranzport_t *z)
277
tranzport_lcdwrite(z, 0, " ", 1000);
278
tranzport_lcdwrite(z, 1, "DISL", 1000);
279
tranzport_lcdwrite(z, 2, "EXIA", 1000);
280
tranzport_lcdwrite(z, 3, " FOR", 1000);
281
tranzport_lcdwrite(z, 4, " ", 1000);
283
tranzport_lcdwrite(z, 5, " ", 1000);
284
tranzport_lcdwrite(z, 6, " CUR", 1000);
285
tranzport_lcdwrite(z, 7, "E FO", 1000);
286
tranzport_lcdwrite(z, 8, "UND ", 1000);
287
tranzport_lcdwrite(z, 9, " ", 1000);
290
void do_lcd2(tranzport_t *z)
292
tranzport_lcdwrite(z, 0, "THE ", 1000);
293
tranzport_lcdwrite(z, 1, "TRAN", 1000);
294
tranzport_lcdwrite(z, 2, "ZPOR", 1000);
295
tranzport_lcdwrite(z, 3, "T RO", 1000);
296
tranzport_lcdwrite(z, 4, " KS", 1000);
298
tranzport_lcdwrite(z, 5, "AWES", 1000);
299
tranzport_lcdwrite(z, 6, "OMEE", 1000);
300
tranzport_lcdwrite(z, 7, "LEEE", 1000);
301
tranzport_lcdwrite(z, 8, "UND ", 1000);
302
tranzport_lcdwrite(z, 9, "GROK", 1000);
305
lights_off(tranzport_t *z) {
308
tranzport_lightoff(z, i, 1000);
312
lights_on(tranzport_t *z) {
315
tranzport_lighton(z, i, 1000);
327
z = open_tranzport();
338
// val = tranzport_read(z, &status, &buttons, &datawheel, 60000);
343
if (status == STATUS_OFFLINE) {
348
if (status == STATUS_ONLINE) {
353
do_lights(z, buttons);
354
do_buttons(z, buttons, datawheel);