2 * tranzport 0.1 <tranzport.sf.net>
17 #define VENDORID 0x165b
18 #define PRODUCTID 0x8101
20 #define READ_ENDPOINT 0x81
21 #define WRITE_ENDPOINT 0x02
33 #define BUTTONMASK_BATTERY 0x00004000
34 #define BUTTONMASK_BACKLIGHT 0x00008000
35 #define BUTTONMASK_TRACKLEFT 0x04000000
36 #define BUTTONMASK_TRACKRIGHT 0x40000000
37 #define BUTTONMASK_TRACKREC 0x00040000
38 #define BUTTONMASK_TRACKMUTE 0x00400000
39 #define BUTTONMASK_TRACKSOLO 0x00000400
40 #define BUTTONMASK_UNDO 0x80000000
41 #define BUTTONMASK_IN 0x02000000
42 #define BUTTONMASK_OUT 0x20000000
43 #define BUTTONMASK_PUNCH 0x00800000
44 #define BUTTONMASK_LOOP 0x00080000
45 #define BUTTONMASK_PREV 0x00020000
46 #define BUTTONMASK_ADD 0x00200000
47 #define BUTTONMASK_NEXT 0x00000200
48 #define BUTTONMASK_REWIND 0x01000000
49 #define BUTTONMASK_FASTFORWARD 0x10000000
50 #define BUTTONMASK_STOP 0x00010000
51 #define BUTTONMASK_PLAY 0x00100000
52 #define BUTTONMASK_RECORD 0x00000100
53 #define BUTTONMASK_SHIFT 0x08000000
55 #define STATUS_OFFLINE 0xff
56 #define STATUS_ONLINE 0x01
57 #define STATUS_OK 0x00
64 typedef struct tranzport_s tranzport_t;
66 void log_entry(FILE *fp, char *format, va_list ap)
68 vfprintf(fp, format, ap);
72 void log_error(char *format, ...)
76 log_entry(stderr, format, ap);
80 void vlog_error(char *format, va_list ap)
82 log_entry(stderr, format, ap);
85 void die(char *format, ...)
89 vlog_error(format, ap);
94 tranzport_t *open_tranzport_core()
99 z = malloc(sizeof(tranzport_t));
101 die("not enough memory");
102 memset(z, 0, sizeof(tranzport_t));
104 z->udev = open("/dev/tranzport0",O_RDWR);
106 die("unable to open tranzport");
111 tranzport_t *open_tranzport()
113 return open_tranzport_core();
116 void close_tranzport(tranzport_t *z)
120 val = close(z->udev);
122 log_error("unable to release tranzport");
127 int tranzport_write_core(tranzport_t *z, uint8_t *cmd, int timeout)
130 val = write(z->udev, cmd, 8);
138 int tranzport_lcdwrite(tranzport_t *z, uint8_t cell, char *text, int timeout)
155 return tranzport_write_core(z, cmd, timeout);
158 int tranzport_lighton(tranzport_t *z, uint8_t light, int timeout)
171 return tranzport_write_core(z, &cmd[0], timeout);
174 int tranzport_lightoff(tranzport_t *z, uint8_t light, int timeout)
187 return tranzport_write_core(z, &cmd[0], timeout);
190 int tranzport_read(tranzport_t *z, uint8_t *status, uint32_t *buttons, uint8_t *datawheel, int timeout)
195 memset(buf, 0xff, 8);
196 val = read(z->udev, buf, 8);
198 printf("errno: %d\n",errno);
202 case ESHUTDOWN: printf("dying\n"); exit(1); break;
209 /*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]);*/
214 *buttons |= buf[2] << 24;
215 *buttons |= buf[3] << 16;
216 *buttons |= buf[4] << 8;
224 void lights_core(tranzport_t *z, uint32_t buttons, uint32_t buttonmask, uint8_t light)
226 if (buttons & buttonmask) {
227 if (buttons & BUTTONMASK_SHIFT) {
228 tranzport_lightoff(z, light, 10);
230 tranzport_lighton(z, light, 10);
235 void do_lights(tranzport_t *z, uint32_t buttons)
237 lights_core(z, buttons, BUTTONMASK_RECORD, LIGHT_RECORD);
238 lights_core(z, buttons, BUTTONMASK_TRACKREC, LIGHT_TRACKREC);
239 lights_core(z, buttons, BUTTONMASK_TRACKMUTE, LIGHT_TRACKMUTE);
240 lights_core(z, buttons, BUTTONMASK_TRACKSOLO, LIGHT_TRACKSOLO);
241 lights_core(z, buttons, BUTTONMASK_TRACKSOLO, LIGHT_ANYSOLO);
242 lights_core(z, buttons, BUTTONMASK_PUNCH, LIGHT_PUNCH);
243 lights_core(z, buttons, BUTTONMASK_LOOP, LIGHT_LOOP);
246 void buttons_core(tranzport_t *z, uint32_t buttons, uint32_t buttonmask, char *str)
248 if (buttons & buttonmask)
252 void do_buttons(tranzport_t *z, uint32_t buttons, uint8_t datawheel)
254 printf("buttons: %x ", buttons);
255 buttons_core(z, buttons, BUTTONMASK_BATTERY, "battery");
256 buttons_core(z, buttons, BUTTONMASK_BACKLIGHT, "backlight");
257 buttons_core(z, buttons, BUTTONMASK_TRACKLEFT, "trackleft");
258 buttons_core(z, buttons, BUTTONMASK_TRACKRIGHT, "trackright");
259 buttons_core(z, buttons, BUTTONMASK_TRACKREC, "trackrec");
260 buttons_core(z, buttons, BUTTONMASK_TRACKMUTE, "trackmute");
261 buttons_core(z, buttons, BUTTONMASK_TRACKSOLO, "tracksolo");
262 buttons_core(z, buttons, BUTTONMASK_UNDO, "undo");
263 buttons_core(z, buttons, BUTTONMASK_IN, "in");
264 buttons_core(z, buttons, BUTTONMASK_OUT, "out");
265 buttons_core(z, buttons, BUTTONMASK_PUNCH, "punch");
266 buttons_core(z, buttons, BUTTONMASK_LOOP, "loop");
267 buttons_core(z, buttons, BUTTONMASK_PREV, "prev");
268 buttons_core(z, buttons, BUTTONMASK_ADD, "add");
269 buttons_core(z, buttons, BUTTONMASK_NEXT, "next");
270 buttons_core(z, buttons, BUTTONMASK_REWIND, "rewind");
271 buttons_core(z, buttons, BUTTONMASK_FASTFORWARD, "fastforward");
272 buttons_core(z, buttons, BUTTONMASK_STOP, "stop");
273 buttons_core(z, buttons, BUTTONMASK_PLAY, "play");
274 buttons_core(z, buttons, BUTTONMASK_RECORD, "record");
275 buttons_core(z, buttons, BUTTONMASK_SHIFT, "shift");
277 printf(" datawheel=%02x", datawheel);
281 void do_lcd(tranzport_t *z)
283 tranzport_lcdwrite(z, 0, " ", 10);
284 tranzport_lcdwrite(z, 1, "DISL", 10);
285 tranzport_lcdwrite(z, 2, "EXIA", 10);
286 tranzport_lcdwrite(z, 3, " FOR", 10);
287 tranzport_lcdwrite(z, 4, " ", 10);
289 tranzport_lcdwrite(z, 5, " ", 10);
290 tranzport_lcdwrite(z, 6, " CUR", 10);
291 tranzport_lcdwrite(z, 7, "E FO", 10);
292 tranzport_lcdwrite(z, 8, "UND ", 10);
293 tranzport_lcdwrite(z, 9, " ", 10);
296 void do_lcd2(tranzport_t *z)
298 tranzport_lcdwrite(z, 0, "THE ", 10);
299 tranzport_lcdwrite(z, 1, "TRAN", 10);
300 tranzport_lcdwrite(z, 2, "ZPOR", 10);
301 tranzport_lcdwrite(z, 3, "T RO", 10);
302 tranzport_lcdwrite(z, 4, " KS", 10);
304 tranzport_lcdwrite(z, 5, "AWES", 10);
305 tranzport_lcdwrite(z, 6, "OMEE", 10);
306 tranzport_lcdwrite(z, 7, "LEEE", 10);
307 tranzport_lcdwrite(z, 8, "UND ", 10);
308 tranzport_lcdwrite(z, 9, "GROK", 10);
311 int lights_off(tranzport_t *z) {
314 for(;j<2; j++,i = (i+1) % 7) {
315 tranzport_lightoff(z, i, 10);
320 int lights_on(tranzport_t *z) {
323 for(;j<2; j++,i = (i+1) % 7) {
324 tranzport_lighton(z, i, 10);
337 z = open_tranzport();
347 val = tranzport_read(z, &status, &buttons, &datawheel, 60000);
351 if (status == STATUS_OFFLINE) {
356 if (status == STATUS_ONLINE) {
361 if (status == STATUS_OK) {
366 // do_lights(z, buttons);
367 do_buttons(z, buttons, datawheel);