2011/usb11/RainbowPyWin7: rainbow.py

File rainbow.py, 1.9 KB (added by dfasnacht, 6 years ago)
Line 
1#!/usr/bin/env python
2
3import sys, os
4import array
5import usb
6import colorsys
7import time
8import math
9
10busses = usb.busses()
11
12
13VENDOR = 0x03eb
14PRODUCT = 0x2300
15IFACE = 0
16EP_IN = 0x81
17EP_OUT = 0x02
18
19
20deltah = 0.0003
21T = 0.001
22PWMperADC = 33
23BAR = 80
24
25tstart = time.time()
26
27def get_device():
28    for bus in busses:
29        devices = bus.devices
30        for dev in devices:
31            if dev.idVendor == VENDOR and dev.idProduct == PRODUCT:
32                return dev
33    return None
34
35
36vmax = 1
37vmin = 2**16
38def adc(v):
39    global vmax, vmin
40    if v > vmax: vmax = v
41    if v < vmin: vmin = v
42    if vmax <= vmin: vmin -= 1
43
44    t = time.time() - tstart
45    hz = usbiocnt / t
46
47    o = '% 4d Hz  ' % hz
48    o += '#' * int( BAR * (v - vmin) / (vmax - vmin) )
49    print o
50
51
52usbiocnt = 0L
53def usbio(dh, r, g, b):
54    global usbiocnt
55    usbiocnt += 1
56   
57    dout = array.array('B', [0]*4)
58
59    dout[0] = 0xFF & 0x00
60    dout[1] = 0xFF & (r)
61    dout[2] = 0xFF & (g)
62    dout[3] = 0xFF & (b) 
63
64    print `dout`
65
66    dh.bulkWrite(EP_OUT, dout.tostring())
67
68    #if usbiocnt % PWMperADC == 0:
69    if 1:
70
71        din = dh.bulkRead(EP_IN, 4)
72        l = len(din)
73        if l != 4:
74            print "unexpected bulk read length: %d" % l
75        else:
76            if usbiocnt % PWMperADC == 0:
77                adc( (din[2] << 8) + din[3] )
78
79
80def intcol(v):
81    v = int(v*256)
82    if v > 255: v = 255
83    if v < 0: v = 0
84    return v
85
86
87def rainbow(dh):
88
89    h = 0.
90    s = 1.
91    v = 1.
92   
93    while 1:
94        if h > 1.:
95            h = 0.
96        else:
97            h += deltah
98
99        rgb = colorsys.hsv_to_rgb(h, s, v)
100        (ri, gi, bi) = map(intcol, rgb)
101
102        usbio(dh, ri, gi, bi)
103
104        time.sleep(T)
105
106 
107def main():
108
109    dev = get_device()
110    dh = dev.open()
111    dh.claimInterface(IFACE)
112
113    rainbow(dh)
114
115    dh.releaseInterface()
116    del dh
117    return 0
118
119
120if __name__ == '__main__':
121    sys.exit( main() )