5c28895eb0276b6b26714c625559d1b691d9335c
[owSlave2.git] / stest / find.py
1 import sys
2 import os
3 import os.path
4 import subprocess
5 import io
6 import time
7 import math
8 import shutil
9
10 toolstr="/home/muto/owtools/src/owtools USB1 DC "
11 devdict={}
12 devwholist=[]
13 f=open("DEVLIST.txt","r")
14 for l in f.readlines():
15         ls=l.split(" ")
16         if (len(ls)>1):
17                 devdict[ls[0]]=l.replace("\n","")
18                 devwholist.append(ls[0])
19 f.close()
20
21 def id2string(id):
22         s=""
23         for i in range(8):
24                 s=s+"%02X" %(id[7-i])
25         return s
26
27 def string2id(s):
28         for i in range(8):
29                 bl=[]
30                 i2=14-i*2;
31                 bl.append(int(s[i2:i2+2],16))
32         return bl
33
34
35 def calculateValues(code, V, vn):
36         if code==1:
37                 return V[vn] / 16.0; 
38         elif code==2:
39                 return V[vn]/1.6; 
40         elif code==3:
41                 return V[vn]*0.2 + 700; 
42         elif code==4:
43                 return math.exp(V[vn] / 160.0); 
44         elif code==5:
45                 return V[vn]*62.5 + 55000; 
46         elif code==6:
47                 return V[vn] / 256.0; 
48         elif code==7:
49                 if V[1]!=0:
50                         return ((float(V[2]) / float(V[1]) - 0.16) / 0.0062) / (1.0546 - 0.00216*V[0]/256.0); 
51                 else:
52                         return 0
53         elif code==8:
54                 return V[vn] / 100.0; 
55         elif code==9:
56                 return V[vn] / 65535.0*5.1; 
57         elif code==10:
58                 return V[vn] / 65535.0*2.55; 
59         elif code==11:
60                 return V[vn] / 65535.0*1.1; 
61         elif code==12:
62                 return V[vn] / 10.0; 
63         elif code==13:
64                 return V[vn];  
65         elif code==14:
66                 return (V[vn] - 32767.0) / 100.0;  
67         elif code==15:
68                 return math.exp((V[vn]-32767.0)/1000.0); 
69         elif code==16:
70                 return V[vn]/32.0; 
71         else:
72                 return 0;
73
74 def getName(code        ):
75         if code==1:
76                 return ["Temperatur","C"]
77         if code==2:
78                 return ["Druck","hPa"]
79         if code==3:
80                 return ["Beleuchtungsstaerke","lux"]
81         if code==4:
82                 return ["Luftfeuchte","%%"]
83         if code==5:
84                 return ["Konstante",""]
85         if code==6:
86                 return ["Spannung","V"]
87         if code==7:
88                 return ["Strom","mA"]
89         if code==8:
90                 return ["VOC","ppm"]
91         if code==9:
92                 return ["Counter",""]
93         return []
94
95
96 def owCom(dev,send,rcount):
97         cmd=toolstr+id2string(dev)
98         #for i in range(8):
99         #       cmd=cmd+"%02X" %(dev[7-i])
100         cmd=cmd+" "
101         for b in send:
102                 cmd=cmd+"%02X" % (b)
103         for i in range(rcount):
104                 cmd=cmd+"FF"
105         #print(cmd.split(' '));
106         p = subprocess.Popen(cmd.split(' '), shell=False, bufsize=14000, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
107         p.wait()
108         s=p.stdout.read().decode("utf-8")
109         l=s.split("\n");
110         #print(l[2])
111         bl=[]
112         for i in range(int(len(l[2])/2)):
113                 i2=i*2;
114                 bl.append(int(l[2][i2:i2+2],16))
115         return bl
116
117 def owComStr(dev,sendstr):
118         cmd=toolstr+id2string(dev)
119         #for i in range(8):
120         #       cmd=cmd+"%02X" %(dev[7-i])
121         cmd=cmd+" "+sendstr
122         p = subprocess.Popen(cmd.split(' '), shell=False, bufsize=14000, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
123         p.wait()
124         s=p.stdout.read().decode("utf-8")
125         #print(s);
126         ll=s.split("\n");
127         bll=[]
128         for l in ll[2:]:
129                 bl=[]
130                 for i in range(int(len(l)/2)):
131                         i2=i*2;
132                         bl.append(int(l[i2:i2+2],16))
133                 bll.append(bl)
134         return bll
135
136 def getValues(dev,voc):
137         pl=[]
138         #print(id2string(dev[0]),voc)
139         if dev[0][0]==0x26:
140                 vnok=1
141                 rc=0
142                 while (vnok):
143                         sbl=owComStr(dev[0],"4E000F_RB4_R_P7044_R_P70B800_RBE00FFFFFFFFFFFFFFFFFF_R4E0000_RB4_R_P70B800_RBE00FFFFFFFFFFFFFFFFFF_RBE03FFFFFFFFFFFFFFFFFF")
144                         #print(sbl)
145                         sb=sbl[4]
146                         VDD=(sb[5]+sb[6]*256)
147                         sb=sbl[8]
148                         VAD=(sb[5]+sb[6]*256)
149                         Temp=(sb[3]+sb[4]*256)
150                         if (sb[4] & 0x80):
151                                 Temp-=0x10000
152                         curr=sb[7]+sb[8]*256
153                         if (sb[8] & 0x80):
154                                 curr-=0x10000
155                         vals=[Temp,VDD,VAD,curr]
156                         formellist=[6,8,7,8]
157                         if dev[1][0]!=0xFF:
158                                 formellist=[]
159                                 for i in range(4):
160                                         if (dev[1][i*2+1])!=0:
161                                                 formellist.append(dev[1][i*2+1])
162                                         else:
163                                                 break
164                         cvals=[]
165                         for i in range(len(formellist)):
166                                 cvals.append(calculateValues(formellist[i],vals,i))
167                         if (cvals[2]<=110):
168                                 vnok=0
169                         else:
170                                 rc=rc+1
171                                 if (rc==3):
172                                         vnok=0
173                                         cvals[2]=100
174                         if voc!=0:
175                                 #R0,VS,Corr,cmode,RS,RSR0,VOC1,VOC2
176                                 sb=sbl[9]
177                                 R0=(sb[2]+sb[3]*256)/100.0
178                                 VS=(sb[4]+sb[5]*256)/10000.0
179                                 Corr=(sb[7]+sb[8]*256)/1000.0
180                                 cmode=sb[6]
181                                 RS=(3/VS-1)*30
182                                 RSR0=(RS/R0)
183                                 VOC1=RSR0*Corr
184                                 VOC2=RSR0/Corr
185                                 cvals.append(R0)
186                                 cvals.append(VS)
187                                 cvals.append(Corr)
188                                 cvals.append(cmode)
189                                 cvals.append(RS)
190                                 cvals.append(RSR0)
191                                 cvals.append(VOC1)
192                                 cvals.append(VOC2)
193                 return cvals
194         if dev[0][0]==0x28:
195                 sbl=owComStr(dev[0],"44_R_PFF_PFF_PFF_PFFBEFFFFFFFFFFFFFFFFFF")
196                 Temp=sbl[1][1]+sbl[1][2]*256
197                 if (sbl[1][2] & 0x80):
198                         Temp=-(Temp&0x7FFF)
199                 if dev[1][0]!=0xFF:
200                         return [calculateValues(dev[1][1],[Temp],0)]
201                 else:
202                         return [calculateValues(1,[Temp],0)]
203         return []
204
205         
206 def owList(): 
207         cmd=toolstr[0:-3]
208         print(cmd)
209         p = subprocess.Popen(["./owtools","USB1"], shell=False, bufsize=14000, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
210         p.wait()
211         s=p.stdout.read()
212         l=s.split("\n")
213         #print(l);
214         l=l[1:-1]
215         devlist=[]
216         ic=0
217         for d in l:
218                 dev=[]
219                 bl=[]
220                 for i in range(8):
221                         i2=14-i*2;
222                         bl.append(int(d[i2:i2+2],16))
223                 dev.append(bl)
224                 #print(bl)
225                 config=owCom(bl,[0x85],18)
226                 #print(config)
227                 if (config[1]==0xFF):
228                         if (bl[0]==0x26):
229                                 config=[0,1,6,6,8,4,7,7,8,0]
230                         if (bl[0]==0x28):
231                                 config=[0,1,1,0,0,0,0,0,0,0]
232                 dev.append(config[1:])
233                 bls=id2string(bl)
234                 cs="%i: " %(ic)
235                 ic=ic+1
236                 cs=cs+bls+": "
237                 if bls in devdict:
238                         cs=cs+devdict[bls].split(",")[0].split(" ")[1]+" "
239                 for i in range(4):
240                         c=config[i*2+1]
241                         if (c==0xFF):
242                                 cs=cs+"Noconfig "
243                                 if (bl[0]==0x26):
244                                         config=[0,1,6,6,8,4,7,7,8,0]
245                                 if (bl[0]==0x28):
246                                         config=[0,1,1,0,0,0,0,0,0,0]
247                                 break
248                         if (c==0):
249                                 break
250                         cs=cs+getName(c)[0]+" "
251                 voc=0
252                 if bls in devdict:
253                         if "VOC" in devdict[bls]:
254                                 voc=1
255                 l=getValues([bl,config[1:]],voc)
256                 for v in l:
257                         cs=cs+" %0.2f " %(v)
258                 print(cs)
259                 ddev=0
260                 vm=0
261                 if config[1]==0x08:
262                         vm=1
263                 #print("Test_configs")
264                 i=0
265                 for dv in devlist:
266                         #print("c",dv[1][9:16])
267                         #print("d",bl[0:7])
268                         if dv[1][9:16]==bl[0:7]:
269                                 print("Double Device")
270                                 ddev=1
271                                 dv.append(dev[0])
272                                 dv.append(dev[1])
273                                 #if vm==1:
274                                         #voc_marker[i]=2
275                         i=i+1
276                 if ddev==0:
277                         devlist.append(dev)
278                         #voc_marker.append(vm)
279                 #print("devlist",devlist)
280         return devlist
281
282 dl=owList()
283 #for d in dl:
284 #       print(d)
285
286 #while (1):
287 #       for d in dl:
288 #               ds=id2string(d[0])
289 #               print(ds)
290                 
291         
292