remove compiler warnings of new compilerversion /
[owTools.git] / src / main.cpp
old mode 100755 (executable)
new mode 100644 (file)
index 7c28e12..51fd6c0
@@ -44,6 +44,8 @@
 #ifdef WIN
 #include "Windows.h"
 #include "time.h"
+
+
 #endif
 
 #include <stdio.h>
@@ -57,6 +59,7 @@
 #include <fstream>
 #include <sstream> 
 
+
 #ifdef LINUX
 
 #define RB "\e(0\x6a\e(B" // 188 Right Bottom corner
 #define TC "\e(0\x77\e(B" // 203 Top Cross
 #define VL "\e(0\x78\e(B" // 186 Vertical Line
 #define SP " "                   // space string
+#define BLUE_B "\033[1;34m"
+#define COLOR_E "\033[0m"
+#define C2_B "\033[0;36m"
+#define C3_B "\033[3;34m"
+#define C4_B "\033[1;33m"
+#define C5_B "\033[4;33m"
 #endif
 #ifdef WIN
 #define RB " "// 188 Right Bottom corner
 #define TC  " "// 203 Top Cross
 #define VL  " "// 186 Vertical Line
 #define SP " "                   // space string
+#define BLUE_B ""
+#define C2_B ""
+#define C3_B ""
+#define C4_B ""
+#define COLOR_E ""
+#define C5_B ""
+
+
 #endif
 
 void printhelp() {
-printf("owTools - Programm for reading und  controlling 1-Wire Devices from www.tm3d.de\n\n");
+printf("owTools - Program for reading and controlling 1-Wire Devices from www.tm3d.de\n\n");
 printf("run:  owTools -a [COMn|USBn|GPIOn] [options]\n\n");
 printf("    COMn -> Adapter DS9097 and compatible (e.g. LinkUSB)\n");
 printf("         n=1 -> Windows COM1 -> Linux /dev/ttyS1\n");
 printf("    USBn -> Adapter DS2490/DS9490 \n");
 printf("         n=1 -> first USB-Adapter \n");
-printf("    GPIOn -> port of RaspberrPI (port Name not Pin number)\n\n");
-printf("options:\n");
+printf("    GPIOn -> port of RaspberrPI (port Name not Pin number)\n\n");
+printf("Options:\n");
 printf("   -i interactive mode\n");
 printf("          select a device and get information about it\n");
+printf("   -s \"id as 64bit Hex\" try to skip select menu with this id \n");
+printf("               example: -s \"5D02160084D9A220\" \n");
 printf("   -c read and print all continuous\n");
 printf("      -p time in sec between readings\n");
-printf("      -d [config file] put all Data in mysql Database descripted in Config file\n");
+printf("      -d [config file] put all Data in mysql Database descripted in config file\n");
 printf("         Config file: \n");
 printf("            [server]\n");
 printf("            [port] -> 3306\n");
@@ -108,11 +127,18 @@ printf("            [user] \n");
 printf("            [password]\n");
 printf("            [database]\n");
 printf("            [prefix] -> a prefix of all tables \n\n");
-printf("      -r Search everytime for new Devices\n");
-printf("   -f hexfile  Flash new\n");
-printf("   -n change id   \n");
+printf("      -r Search every time for new Devices\n");
+printf("      -t [text_file] append comma separadet to text-file\n");
+printf("      -j Use 0xCC 0x44 to send convert temperature to all DS18B20 and DS2438\n");
+printf("   -f [hexfile]    flash new\n");
+printf("   -n [\"id as 64bit Hex\"] change id   \n");
+printf("               example: -n \"5D02160084D9A220\" \n");
+printf("               no argument increments id by 256 (keep family code) \n");
 printf("      -g get from server\n");
-printf("   -w [1|2] show Warnings (1) or all Infos (2)\n");
+printf("   -w [1|2] show Warnings (1) or all information (2)\n");
+printf("   -m memory functions\n");
+printf("   -x write direct 1-Wire\n");
+
 
 
 
@@ -163,6 +189,10 @@ int getArgi(std::string flag) {
 int database=0;
 mySensorDB *sdb=NULL;
 #endif
+int textfile=0;
+std::string textfilename;
+
+
 /*
 snum_t getArgsnum(std::string flag) {
        snum_t snum;
@@ -200,9 +230,25 @@ void setLogMode() {
 
 }
 
+int appendTextFile(std::string line) {
+       std::ofstream file;
+    file.open(textfilename, std::ios::out | std::ios::app);
+    if (file.fail()) {
+               owi->log->set(OWLOG_ERROR,"Can not open outputfile for text output");
+               return -1;
+       }
+   
+
+    file << line << std::endl;
+    file.close();
+    return 0;
+}
+
 
 void continuous(std::vector<owDevice*> *devices,int intervall,int headline,int searchrom) {
        int first=1;
+       char valbuf[100];
+       std::string tfl;
        while (1) {
                if (searchrom) {
                        owi->log->clear();
@@ -215,7 +261,7 @@ void continuous(std::vector<owDevice*> *devices,int intervall,int headline,int s
                                                if (dev->configstate!=OWDCS_NONE) {
                                                        for (size_t i=0;i<4;i++) {
                                                                if (dev->config->getPropertyID((uint8_t)i)!=0)
-                                                                       printf("\033[1;34m%02X.%02X%02X\033[0m\t",dev->getNum().byte[7],dev->getNum().byte[1],dev->getNum().byte[0]);
+                                                                       printf(BLUE_B "%02X.%02X%02X" COLOR_E "\t",dev->getNum().byte[7],dev->getNum().byte[1],dev->getNum().byte[0]);
                                                        }
                                                }
                                        }
@@ -224,7 +270,7 @@ void continuous(std::vector<owDevice*> *devices,int intervall,int headline,int s
                                                if (dev->configstate!=OWDCS_NONE) {
                                                        for (size_t i=0;i<4;i++) {
                                                                if (dev->config->getPropertyID((uint8_t)i)!=0)
-                                                                       printf("\033[0;36m%s\033[0m\t",dev->config->getQuantity((uint8_t)i).substr(0,7).c_str());
+                                                                       printf(C2_B "%s" COLOR_E "\t",dev->config->getQuantity((uint8_t)i).substr(0,7).c_str());
                                                        }
                                                }
                                        }
@@ -235,7 +281,7 @@ void continuous(std::vector<owDevice*> *devices,int intervall,int headline,int s
                                                                if (dev->config->getPropertyID((uint8_t)i)!=0) {
                                                                        size_t l=utf8_length(dev->config->getUnit((uint8_t)i));
                                                                        std::string ls="           ";
-                                                                       printf("\033[3;34m[%s]%s\033[0m\t",dev->config->getUnit((uint8_t)i).c_str(),ls.substr(0,5-l).c_str());
+                                                                       printf(C3_B "[%s]%s" COLOR_E "\t",dev->config->getUnit((uint8_t)i).c_str(),ls.substr(0,5-l).c_str());
                                                                }
                                                        }
                                                }
@@ -263,9 +309,23 @@ void continuous(std::vector<owDevice*> *devices,int intervall,int headline,int s
                struct tm tm;
                localtime_s(&tm,&t);
 #endif
+
                printf("%d-%02d-%02d %02d:%02d:%02d\t", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+               if (textfile) {
+                       snprintf(valbuf,100,"%d-%02d-%02d %02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+                       tfl=valbuf;
+               }
+
+
                for (owDevice* dev :*devices) {
                        for(int k=0;k<owi->maxrepeat;k++){
+                               if (owCC_44_Temp>0) {
+                                       std::vector<uint8_t> data;
+                                       data.push_back(0xCC);
+                                       data.push_back(0x44);
+                                       owi->Reset();
+                                       owi->Communicate(&data, 2, 0);
+                               }
                                dev->convertAll();
                                if (owi->log->last()<OWLOG_ERROR) break;
                                owi->log->clear();
@@ -287,6 +347,10 @@ void continuous(std::vector<owDevice*> *devices,int intervall,int headline,int s
                                                        else
                                                                printf("%0.1f \t",dev->values[i]);
                                                        fflush(stdout);
+                                                       if (textfile) {
+                                                               snprintf(valbuf,100,",%0.4f",dev->values[i]);
+                                                               tfl.append(valbuf);
+                                                       }
                                                }
                                        }
                                }
@@ -304,6 +368,9 @@ void continuous(std::vector<owDevice*> *devices,int intervall,int headline,int s
                
                }
                printf("\n");
+               if (textfile) {
+                       appendTextFile(tfl);
+               }
                while (((int)time(NULL)) < (st + intervall)) {
 #ifdef LINUX
                        sleep(1);
@@ -319,7 +386,7 @@ void device_menu(owDevice* d) {
        for(int i=0;i<70;i++) printf(HL);printf("\n");
        printf("Selected Device: ");
        snum_t snum=d->getNum();
-       printf("\033[1;34m%016llX\033[0m",(unsigned long long)snum.num);
+       printf(BLUE_B "%016llX" COLOR_E,(unsigned long long)snum.num);
        printf("  \n");
        printf("Chip Info: ");
        std::vector<std::string> info=d->getFamilyInfo();
@@ -335,7 +402,7 @@ void device_menu(owDevice* d) {
        printf("\n");
        d->convertAll();
        for (size_t i=0;i<d->values.size();i++) {
-               printf("\033[1;33m%0.4f %s\033[0m  ",d->values[i],d->config->getUnit((uint8_t)i).c_str());
+               printf(C4_B "%0.4f %s" COLOR_E,d->values[i],d->config->getUnit((uint8_t)i).c_str());
        }
        printf("\n");
        for(int i=0;i<70;i++) printf(HL);printf("\n");
@@ -359,13 +426,28 @@ void device_menu(owDevice* d) {
 }
 
 int selectDevice() {
+       std::string s;
        owi->Find();
-       int i=0;
+       int i = 0;
+       char *end;
+       unsigned long long l = 0;
+       if ((s = getArg("s")) != "") {
+               l = strtoull(s.c_str(), &end, 16);
+               for (owDevice* dev : owi->devices) {
+                       i++;
+                       snum_t snum = dev->getNum();
+                       if (l == snum.num) return i;
+
+               }
+               printf("Number not found -> Select one or exit!\n");
+       }
+
+       i=0;
        for (owDevice* dev :owi->devices) {
                i++;
                snum_t snum=dev->getNum();
                printf("%i) ",i);
-               printf("\033[1;34m%016llX\033[0m",(unsigned long long)snum.num);
+               printf(BLUE_B "%016llX" COLOR_E,(unsigned long long)snum.num);
 
                printf("  ");
                for (int j=0;j<4;j++) printf("%s ",dev->config->getQuantity(j).c_str());
@@ -379,7 +461,7 @@ int selectDevice() {
                dnr=atoi(inp.c_str());
                if (dnr<=0) return 0;
                if (dnr<=i) break; 
-               printf("\033[4;33mSelect a number between 0 and %i\033[0m\n",i);
+               printf(C5_B "Select a number between 0 and %i" COLOR_E "\n",i);
        }
        return dnr;
 
@@ -447,7 +529,7 @@ int main(int argc, char *argv[]) {
        if(adapter.find("COM")!=std::string::npos) {
                owi=new owCOMInterface();
                int port=atoi(adapter.substr(adapter.find("COM")+3).c_str());
-               printf("Open /dev/ttyS%i\n",port);
+               printf("Open /dev/ttyUSB%i\n",port);
                owi->InitAdapter(port);
        } else 
        if(adapter.find("USB")!=std::string::npos) {
@@ -476,6 +558,12 @@ int main(int argc, char *argv[]) {
                        printf("\033[1;31mGPIO works with Raspberry PI only \033[0m\n");
                }
        }  else
+       if(adapter.find("W1")!=std::string::npos) {
+               owi=new owW1Interface();
+               if (owi->InitAdapter(0)) {
+                       printf("Use W1-Kernel 1-Wire functions on /sys/bus/w1\n");
+               } else printf("No W1-Kernel module found!!\n");
+       } else 
 #endif
        if (adapter.find("ARDUINO") != std::string::npos) {
                owi = new owARDUINOInterface();
@@ -501,7 +589,6 @@ int main(int argc, char *argv[]) {
                        }
        else
                if (adapter.find("COM") != std::string::npos) {
-                       printf("USB \n");
                        owi = new owTMEXWIN();
                        int port = atoi(adapter.substr(adapter.find("COM") + 3).c_str());
                        printf("Open Adapter on COM%i\n", port);
@@ -526,6 +613,10 @@ int main(int argc, char *argv[]) {
                interactive(owi);       
        } else 
        if (getArg("c")=="1") {
+               if (getArg("j")=="1") {
+                       printf("Use 1-Wire command 0xCC 0x44 to send convert temperature to all DS18B20 and DS2438\n");
+                       owCC_44_Temp=1;
+               }
                int reload=(getArg("r")=="1");
                owi->Find();
                printf("\n");
@@ -554,7 +645,11 @@ int main(int argc, char *argv[]) {
                        database=1;
                }
 #endif
-                       
+               if      ((s=getArg("t")) !="")  {
+                       textfile=1;
+                       printf("Write values to textfile %s\n",s.c_str());
+                       textfilename=s;
+               }
                
                continuous(&(owi->devices),pause,1,reload);     
        } else 
@@ -570,7 +665,7 @@ int main(int argc, char *argv[]) {
                owi->Find();
                for (owDevice* dev :owi->devices) {
                        snum_t snum=dev->getNum();
-                       printf("\033[1;34m%016llX\033[0m",(unsigned long long)snum.num);
+                       printf(BLUE_B "%016llX" COLOR_E,(unsigned long long)snum.num);
 
                        printf("\n");
                }
@@ -589,7 +684,101 @@ int main(int argc, char *argv[]) {
                cl.push_back(0x1F);
                dev->Communicate(&cl,4,0);
        } else 
+       //------------------------------------------------------------------------------------------
+       // --------------------- Direct Write
+       //------------------------------------------------------------------------------------------
        
+       if ((s=getArg("x"))!="") {
+               std::vector<uint8_t> v;
+               int sp=0;
+               std::string ts="";
+               for ( std::string::iterator  it = s.begin() ; it < s.end(); it++ ,sp++) {
+                       if (isxdigit(*it)) {
+                               char c=(*it);
+                               ts.append(1,c);
+                               if (ts.length()>=2) {
+                                       v.push_back(strtoul(ts.c_str(),NULL, 16));
+                                       ts="";
+                               }
+                       }
+               }
+               if (ts.length()!=0) {
+                       v.push_back(strtoul(ts.c_str(),NULL, 16));
+               }
+               printf("Send ");
+               for (uint8_t val :v) printf("%02X ",val);
+               printf(" to selected Device\n");
+               int sel=selectDevice();
+               if (sel==0) exit(0);
+               sel-=1;
+               owDevice* dev=owi->devices[sel];
+               dev->Communicate(&v,v.size(),0);
+               for (uint8_t val :v) printf("%02X ",val);
+               printf("\n");
+               exit(0);
+               
+               
+       }
+
+       //------------------------------------------------------------------------------------------
+       // --------------------- Memory functions
+       //------------------------------------------------------------------------------------------
+       
+       if ((s=getArg("m"))!="") {
+               int pnr=0;
+               std::vector<uint8_t> mem;
+               if(s.find("read")!=std::string::npos) {
+                       size_t cla=s.find_first_of("(",0);
+                       size_t page=s.find_first_of("p=",cla);
+                       size_t epage=s.find_first_of(";",page);
+                       if (epage==std::string::npos) epage=s.find_first_of(")",page);
+                       std::string pn=s.substr(page+2,epage-page-2);
+                       printf("%s Read Memory Page %s of Device:\n",s.c_str(),pn.c_str());
+                       pnr=atoi(pn.c_str());
+
+               } else 
+               if(s.find("write")!=std::string::npos) {
+                       size_t cla=s.find("(",0);
+                       size_t page=s.find("p=",cla);
+                       size_t epage=s.find(";",page);
+                       if (epage==std::string::npos) epage=s.find_first_of(")",page);
+                       std::string pn=s.substr(page+2,epage-page-2);
+                       size_t data=s.find("d=",cla);
+                       size_t edata=s.find(";",data);
+                       if (edata==std::string::npos) edata=s.find(")",data);
+                       std::string pd=s.substr(data+2,edata-data-2);
+                       std::istringstream pdss(pd);
+                       //std::cout << pd <<std::endl;
+                       while (!pdss.eof()) {
+                               int v;
+                               pdss>>std::hex>>v;
+                               mem.push_back(v);
+                       }
+                       printf("Write ");
+                       for(uint8_t v :mem) printf("%02X ",v);
+                       printf("to Memory Page %s of Device:\n",pn.c_str());
+                       pnr=atoi(pn.c_str());
+
+               } else exit(1);
+               int sel=selectDevice();
+               if (sel==0) exit(0);
+               sel-=1;
+               //snum_t snum=owi->devices[sel]->getNum();
+               owDevice* dev=owi->devices[sel];
+               if(s.find("read")!=std::string::npos) {
+                       int r=dev->readMemory(pnr,0,dev->getPageSize(),&mem);
+                       for(int i=0;i<r;i++) printf("%02X ",mem[i]);
+                       printf("\n");
+                       exit(0);
+               } else 
+               if(s.find("write")!=std::string::npos) {
+                       int r=dev->writeMemory(pnr,0,dev->getPageSize(),&mem);
+                       r=dev->readMemory(pnr,0,dev->getPageSize(),&mem);
+                       for(int i=0;i<r;i++) printf("%02X ",mem[i]);
+                       printf("\n");
+                       exit(0);
+               }
+       }
        if ((s=getArg("n"))!="") {
                printf("Change id of selected Device\n");
                int sel=selectDevice();
@@ -597,6 +786,7 @@ int main(int argc, char *argv[]) {
                sel-=1;
                
                snum_t snum=owi->devices[sel]->getNum();
+               
                if ((getArg("g"))=="1") {
                        printf("get ID from Server\n");
                        char s[255];
@@ -622,7 +812,7 @@ int main(int argc, char *argv[]) {
                                                if (c=='x') br=1;
                                        } else {
                                                if ((c==',')|(c=='}')) {
-                                                       isnum.byte[i]=(uint8_t)strtol(s, NULL, 16);
+                                                       isnum.byte[i]=(uint8_t)strtoull(s, NULL, 16);
                                                        //printf("%x\n",strtol(s, NULL, 16));
                                                        i++;
                                                        br=0;
@@ -641,12 +831,27 @@ int main(int argc, char *argv[]) {
                                snum.num=isnum.num;
                        } else (printf("ERROR %i\n",err));
                } else {
-                       snum.num+=256;
+                       if (s=="1") {
+                               snum.num+=256;
+                       } else {
+                               unsigned long long l=strtoull(s.c_str(),NULL,16);
+                               if ((snum.num&0xFF)!=(l&0xFF)) {
+                                         printf("This command change family-fode of Device 0x%02X->0x%02X\n",(int)(snum.num&0xFF),(int)(l&0xFF));
+                                        int resetid=questionYesNo("Are you sure?");
+                                        if (resetid==0) {
+                                          printf("ERROR: Family of Device 0x%02X->0x%02X can not be changed\n",(int)(snum.num&0xFF),(int)(l&0xFF));
+                                          exit(1);
+                                        }
+                               }
+                               snum.num=l;
+                               //printf("->%016llX\n",(unsigned long long)l);
+                       }
+                       
                }
 
 
                printf("New ID: ");
-               printf("\033[1;34m%016llX\033[0m",(unsigned long long)snum.num);
+               printf(BLUE_B "%016llX" COLOR_E,(unsigned long long)snum.num);
 
                printf("\n");
                
@@ -656,7 +861,7 @@ int main(int argc, char *argv[]) {
                owi->Find();
                for (owDevice* dev :owi->devices) {
                        snum_t snum=dev->getNum();
-                       printf("\033[1;34m%016llX\033[0m",(unsigned long long)snum.num);
+                       printf(BLUE_B "%016llX" COLOR_E,(unsigned long long)snum.num);
 
                        printf("\n");
                }
@@ -667,7 +872,7 @@ int main(int argc, char *argv[]) {
                for (owDevice* dev :owi->devices) {
                        printf("_______________________________________________________________________\n");
                        snum_t snum=dev->getNum();
-                       printf("\033[1;34m%016llX\033[0m ",(unsigned long long)snum.num);
+                       printf(BLUE_B "%016llX " COLOR_E,(unsigned long long)snum.num);
                        switch (dev->configstate) {
                                case OWDCS_16:printf("old Configcode from www.tm3d.de");break;
                                case OWDCS_24:printf("Configcode from www.tm3d.de");break;