7e1edb09d1a9d453980d3b465553f6bfe1a86d01
[owTools.git] / src / owInterface.h
1 // Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 //  * Redistributions of source code must retain the above copyright
9 //    notice, this list of conditions and the following disclaimer.
10 //  * Redistributions in binary form must reproduce the above copyright
11 //    notice, this list of conditions and the following disclaimer in the
12 //    documentation and/or other materials provided with the
13 //    distribution.
14 //  * All advertising materials mentioning features or use of this
15 //    software must display the following acknowledgement: This product
16 //    includes software developed by tm3d.de and its contributors.
17 //  * Neither the name of tm3d.de nor the names of its contributors may
18 //    be used to endorse or promote products derived from this software
19 //    without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33
34 #ifndef __OWINTERFACES_H_
35 #define __OWINTERFACES_H_
36
37 #if defined(WIN) || defined(LINUX)
38 #else
39 #if defined(_WINDOWS) || defined(__WINDOWS__) || defined(_WIN32) || defined(WIN32)
40 #define WIN
41 #else
42 #define LINUX
43 #endif
44 #endif
45
46
47 #include <vector>
48 #include <stdint.h>
49 #include <string>
50 #ifdef LINUX
51 #include <termios.h>
52 #endif
53 #include <stdarg.h>
54
55 #ifdef WIN
56 #include <Windows.h>
57
58 #endif
59
60 class owDevice;
61 class owDeviceConfig;
62 #include "owDeviceConfig.h"
63
64 #if defined(_WINDOWS) || defined(__WINDOWS__) || defined(_WIN32) || defined(WIN32)
65    #define USE_WINDOWS_TIME 1
66    #include <windows.h>
67    //#include "win32/usb.h" // libusb header
68 #else
69    #define USE_WINDOWS_TIME 0
70    #include <time.h>
71    #include <sys/time.h>
72
73    #include <usb.h>
74 #endif
75
76 #ifndef FALSE
77 #define FALSE 0
78 #endif
79 #ifndef TRUE
80 #define TRUE 1
81 #endif
82
83 #define OWLOG_INFO 1
84 #define OWLOG_WARNING 2
85 #define OWLOG_ERROR 3
86
87 #ifdef LINUX
88
89 #define BLUE_B "\033[1;34m"
90 #define COLOR_E "\033[0m"
91 #define C2_B "\033[0;36m"
92 #define C3_B "\033[3;34m"
93 #define C4_B "\033[1;33m"
94 #define C5_B "\033[4;33m"
95 #define CLE_B "\033[1;31m"
96 #define CLW_B "\033[1;33m"
97 #endif
98 #ifdef WIN
99 #define BLUE_B ""
100 #define C2_B ""
101 #define C3_B ""
102 #define C4_B ""
103 #define COLOR_E ""
104 #define C5_B ""
105 #define CLE_B ""
106 #define CLW_B ""
107
108 #endif
109
110 class owLog {
111         int lcount;
112         std::string logtext;
113         int level;
114         int loglevel;
115                 
116 public:
117         owLog() {
118                 lcount=0;
119                 loglevel=0;
120         } 
121         virtual int set(int llevel,const char *format, ...) {
122                 char s[300];
123                 va_list arg;
124                 int done;
125                 va_start (arg, format);
126 #ifdef LINUX
127                 done = vsprintf (s, format, arg);
128 #endif
129 #ifdef WIN
130                 done = vsprintf_s(s,300, format, arg);
131 #endif
132                 va_end (arg);
133                 logtext=s;
134                 level=llevel;
135                 lcount++;
136                 if (level>=loglevel) {
137                         if (loglevel==OWLOG_ERROR) printf(CLE_B "%s" COLOR_E "\n",s);
138                         else if (loglevel==OWLOG_WARNING) printf(CLW_B "%s" COLOR_E "\n",s);
139                         else printf("%s\n",s);
140                 }
141                 return done;
142         }
143         virtual void clear() {
144                 lcount=0;
145         }
146         virtual int last() {
147                 if (lcount) return level; else return 0;
148         }
149         virtual void setLogLevel(int llevel ){
150                 loglevel=llevel;
151         }
152         
153 };
154
155
156 typedef union  {
157         uint8_t byte[8];
158         uint64_t num;
159 } snum_t;
160
161 class owInterface {
162 protected:
163         int block;
164         uint8_t crc8;
165         uint16_t crc16;
166         uint8_t docrc8(uint8_t value);
167         uint16_t docrc16(uint16_t cdata);
168         
169         // global search state
170         unsigned char ROM_NO[8];
171         int LastDiscrepancy;
172         int LastFamilyDiscrepancy;
173         int LastDeviceFlag;
174         
175         int devices_changed;
176         
177 public:
178         std::vector<snum_t> device_nums;
179         std::vector<owDevice*> devices;
180         int maxrepeat;
181         owLog *log;
182         owInterface() {
183                 block=0;
184                 log=new owLog();
185                 maxrepeat=4;
186                 devices_changed=0;
187         }
188         void Wait_Free() {
189                 while (block) {};
190                 block = 1;
191         }
192         void Free() {
193                 block = 0;
194         }       
195         
196         int isDevicesChanged() {
197                 int dc=devices_changed;
198                 devices_changed=0;
199                 return dc;
200         }
201         virtual void Clean();
202         virtual int Find() ;
203         virtual int InitAdapter(std::string s) {
204                 uint8_t param=atoi(s.c_str());
205                 return InitAdapter(param);
206         }
207         virtual void ReleaseAdapter() {}
208         virtual int InitAdapter(uint8_t)=0;
209         //Return 1 if Devices Present
210         virtual int Reset()=0;
211         virtual uint8_t sendrecivBit(uint8_t bit) =0;
212         
213
214
215         virtual uint8_t sendrecivByte(uint8_t byte) {
216                 uint8_t b=byte;
217                 uint8_t rb=0;
218                 for(int i=0;i<8;i++) {
219                 rb=rb>>1;
220                         rb|=sendrecivBit(b&1)<<7;
221                 b=b>>1;
222                 }
223                 return rb;
224         }
225         
226         virtual int MatchRom(snum_t snum);
227         virtual int Communicate(std::vector<uint8_t> *data, int scount, int rcount);
228         
229         
230
231         uint8_t calcCRC8(std::vector<uint8_t> data);
232         uint16_t calcCRC16(std::vector<uint8_t> data);
233         int testCRC16(std::vector<uint8_t> data);
234                 
235         void resetFlasher(uint64_t id);
236         void resetID(uint64_t id);
237         int programmPage(uint64_t id,int pagenr, std::vector<uint8_t> page, int pagesize);
238         int flashHEXFile(std::string filename,snum_t dev,int resetid,int progress);
239         
240         
241         virtual int owFirst() {
242                 LastDiscrepancy = 0;
243                 LastDeviceFlag = FALSE;
244                 LastFamilyDiscrepancy = 0;
245                 return owSearch();              
246         }
247         virtual int owNext()  {
248                 return owSearch();
249         }
250         virtual ~owInterface()  {
251                 ReleaseAdapter();
252         }
253 protected:
254         int owSearch();
255         
256 };
257
258 #define OWDCS_NONE 0
259 #define OWDCS_DEFAULT 1
260 #define OWDCS_16 2
261 #define OWDCS_24 3
262
263
264 class owDevice {
265 protected:
266         owInterface* owi;
267         snum_t snum;
268         std::vector<int32_t> raw;
269 public:
270         owDeviceConfig *config;
271         int configstate;
272         std::vector<double> values;
273         int lastfound; //0 found in last searchrom, 1 found in the searchrom befor, and so on
274         owDevice(owInterface *owi_,snum_t num);
275         //return 1 for real Config, return 0 for DefaultConig
276         int readConfig();
277         virtual void setDefaultConfig();
278                 //Information zum owDevice      
279         std::vector<std::string> getFamilyInfo();
280         
281         snum_t getNum() {return snum;}
282
283         int Communicate(std::vector<uint8_t> *data, int scount, int rcount);
284         int CommunicateShort(std::vector<uint8_t> *data, int scount, int rcount);
285         void changeID(snum_t nid);
286         void runFlasher();
287         virtual int convertAll() {return 1;}
288         virtual int readMemory(int page,int start, int count,std::vector<uint8_t> *data) {return 0;};
289         virtual int writeMemory(int page,int start, int count,std::vector<uint8_t> *data) {return 0;};
290         virtual int getPageSize() {return 0;}
291         virtual ~owDevice() {}
292 };
293
294 class owDeviceDS18B20:public owDevice {
295 public:
296         owDeviceDS18B20(owInterface *owi_,snum_t num):owDevice(owi_,num) {      }
297         virtual void setDefaultConfig();
298         int readScratchpad(std::vector<uint8_t> *sp);
299         virtual int convertAll();
300         virtual int getPageSize() {return 8;}
301 } ;
302
303
304 class owDeviceDS2438:public owDevice {
305 public:
306         owDeviceDS2438(owInterface *owi_,snum_t num):owDevice(owi_,num) {}
307         virtual void setDefaultConfig();
308
309         int setConfigByte(uint8_t cb);
310         int readScratchpad(std::vector<uint8_t> *sp, uint8_t page, int recall);
311         virtual int readMemory(int page,int start, int count,std::vector<uint8_t> *data);
312         virtual int writeMemory(int page,int start, int count,std::vector<uint8_t> *data);
313         virtual int convertAll();
314         virtual int getPageSize() {return 8;}
315
316 } ;
317 class owDeviceDS2450:public owDevice {
318 public:
319         owDeviceDS2450(owInterface *owi_,snum_t num):owDevice(owi_,num) {}
320
321         virtual void setDefaultConfig();
322         virtual int convertAll();
323         void readMemory(uint8_t addr,std::vector<uint8_t> *sp);
324         void writeMemory(uint8_t addr,std::vector<uint8_t> *sp);
325         void convert(uint8_t mask, uint8_t preset); 
326         virtual int getPageSize() {return 8;}
327
328 } ;
329
330
331 class owDeviceDS2423:public owDevice {
332 public:
333         owDeviceDS2423(owInterface *owi_,snum_t num):owDevice(owi_,num) {}
334
335         virtual void setDefaultConfig();
336         virtual int convertAll();
337         uint32_t readCounter(uint8_t page);
338         virtual int readMemory(int page,int start, int count,std::vector<uint8_t> *data);
339         virtual int writeMemory(int page,int start, int count,std::vector<uint8_t> *data);
340         virtual int getPageSize() {return 32;}
341
342
343 } ;
344
345
346 #endif