[IMP] point_of_sale, hw_scale: first commit for the hw_scale module, which handles...
[odoo/odoo.git] / addons / hw_scale / mettler.py
1 #!/usr/bin/python
2 import serial
3 import time
4 import sys
5 from bitstring import BitArray
6
7 path = "/dev/serial/by-id/usb-METTLER_TOLEDO_15_kg_DI_Firmware_CKOR_F_Ser_CDC-if00"
8
9 device = serial.Serial(path,
10         baudrate = 9600, 
11         bytesize = serial.SEVENBITS, 
12         stopbits = serial.STOPBITS_ONE, 
13         parity   = serial.PARITY_EVEN, 
14         #xonxoff  = serial.XON,
15         timeout  = 0.1, 
16         writeTimeout= 0.1)
17
18 if len(sys.argv) == 1:
19     cmd = 'weight'
20 else:
21     cmd = sys.argv[1]
22
23 def write(stuff):
24     print stuff
25     device.write(stuff)
26
27 def read_answer():
28     answer = []
29     while True:
30         char = device.read(1)
31         if not char:
32             return answer
33         else:
34             answer.append(char)
35
36 def print_answer(answer):
37     print answer
38     if '?' in answer:
39         status = answer[answer.index('?')+1]
40         print 'status_bits: '+BitArray(int=ord(status),length=8).bin
41     
42
43 if cmd == 'weight':
44     while True:
45         time.sleep(0.25)
46         write('W')
47         time.sleep(0.25)
48         print_answer(read_answer())
49
50 if cmd == 'interactive':
51     weight = 0
52     status = ''
53     while True:
54         time.sleep(0.25)
55         device.write('W')
56         answer = read_answer()
57         if '?' in answer:
58             oldstatus = status
59             b = answer[answer.index('?')+1]
60             if b == '\x00' or b == ' ':
61                 pass # ignore status
62             elif b == 'B':
63                 status = 'too_heavy'
64             elif b == 'D':
65                 status = 'negative'
66             elif b == 'A' or b == 'Q' or b == '\x01':
67                 status = 'moving'
68             else:
69                 status = 'unknown'
70                 print b.__repr__(), BitArray(int=ord(b),length=8).bin
71             if oldstatus != status:
72                 print status
73         else:
74             oldweight = weight
75             answer = answer[1:-1]
76             if 'N' in answer:
77                 answer = answer[0:-1]
78             weight = float(''.join(answer))
79             if oldweight != weight:
80                 print weight
81
82
83 elif cmd == 'zero':
84     time.sleep(1)
85     write('Z')
86     time.sleep(1)
87     print_answer(read_answer())
88
89 elif cmd == 'test':
90     time.sleep(1)
91     write('A')
92     time.sleep(1)
93     write('B')
94     time.sleep(1)
95     answer = read_answer()
96     if '@' in answer:
97         print 'all test passed'
98     else:
99         print_answer(answer)
100