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