// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "owTools.h"
+#ifdef LINUX
#include <mysql.h>
#include "mySensorDB.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
#include <sys/mman.h>
-#include <fcntl.h> /* For O_RDWR */
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
+#endif
+
+#ifdef WIN
+#include "Windows.h"
+#include "time.h"
+
+
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <fcntl.h> /* For O_RDWR */
#include <memory.h>
-#include "owTools.h"
#include "hexfile.h"
#include <iostream>
#include <algorithm>
#include <sstream>
+#ifdef LINUX
#define RB "\e(0\x6a\e(B" // 188 Right Bottom corner
#define RT "\e(0\x6b\e(B" // 187 Right Top 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 RT " "// 187 Right Top corner
+#define LT " "// 201 Left Top cornet
+#define LB " "// 200 Left Bottom corner
+#define MC " " // 206 Midle Cross
+#define HL " "// 205 Horizontal Line
+#define LC " "// 204 Left Cross
+#define RC " "// 185 Right Cross
+#define BC " "// 202 Bottom Cross
+#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 Raspberry PI (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");
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(" -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");
+
return atoi(getArg(flag).c_str());
}
-
+#ifdef LINUX
int database=0;
mySensorDB *sdb=NULL;
+#endif
+int textfile=0;
+std::string textfilename;
+/*
snum_t getArgsnum(std::string flag) {
snum_t snum;
snum.num=0;
return snum;
}
-
+*/
int findCPU(std::string cpu) {
std::ifstream fileInput;
std::string line;
}
+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();
for (owDevice* dev :*devices) {
if (dev->configstate!=OWDCS_NONE) {
for (size_t i=0;i<4;i++) {
- if (dev->config->getPropertyID(i)!=0)
- printf("\033[1;34m%02X.%02X%02X\033[0m\t",dev->getNum().byte[7],dev->getNum().byte[1],dev->getNum().byte[0]);
+ if (dev->config->getPropertyID((uint8_t)i)!=0)
+ printf(BLUE_B "%02X.%02X%02X" COLOR_E "\t",dev->getNum().byte[7],dev->getNum().byte[1],dev->getNum().byte[0]);
}
}
}
for (owDevice* dev :*devices) {
if (dev->configstate!=OWDCS_NONE) {
for (size_t i=0;i<4;i++) {
- if (dev->config->getPropertyID(i)!=0)
- printf("\033[0;36m%s\033[0m\t",dev->config->getQuantity(i).substr(0,7).c_str());
+ if (dev->config->getPropertyID((uint8_t)i)!=0)
+ printf(C2_B "%s" COLOR_E "\t",dev->config->getQuantity((uint8_t)i).substr(0,7).c_str());
}
}
}
for (owDevice* dev :*devices) {
if (dev->configstate!=OWDCS_NONE) {
for (size_t i=0;i<4;i++) {
- if (dev->config->getPropertyID(i)!=0)
- printf("\033[3;34m[%s] \033[0m\t",dev->config->getUnit(i).c_str());
+ if (dev->config->getPropertyID((uint8_t)i)!=0) {
+ size_t l=utf8_length(dev->config->getUnit((uint8_t)i));
+ std::string ls=" ";
+ printf(C3_B "[%s]%s" COLOR_E "\t",dev->config->getUnit((uint8_t)i).c_str(),ls.substr(0,5-l).c_str());
+ }
}
}
}
}
printf("\n");
-
+#ifdef LINUX
if (database) {
//owi->log->setLogLevel(0);
for (owDevice* dev : *devices) {
sdb->createDeviceTable(dev);
}
}
+#endif
}
}
time_t t=time(NULL);
int st=(int)t;
+#ifdef LINUX
struct tm tm = *localtime(&t);
+#endif
+#ifdef WIN
+ 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++){
+ //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();
if (owi->log->last()<OWLOG_ERROR) {
if (dev->configstate!=OWDCS_NONE) {
for (size_t i=0;i<4;i++) {
- if (dev->config->getPropertyID(i)!=0) {
- if (dev->values[i]<10)
+ if (dev->config->getPropertyID((int8_t)i)!=0) {
+ if (dev->values[i]<=-10)
+ printf("%0.2f \t",dev->values[i]);
+ else if (dev->values[i]<0)
+ printf("%0.3f \t",dev->values[i]);
+ else if (dev->values[i]<10)
printf("%0.4f \t",dev->values[i]);
else if (dev->values[i]<100)
printf("%0.3f \t",dev->values[i]);
else
printf("%0.1f \t",dev->values[i]);
fflush(stdout);
+ if (textfile) {
+ snprintf(valbuf,100,",%0.4f",dev->values[i]);
+ tfl.append(valbuf);
+ }
}
}
}
+#ifdef LINUX
if (database) {
sdb->insertValues(dev);
}
+#endif
} else {
owi->log->setLogLevel(OWLOG_INFO);
owi->log->set(OWLOG_ERROR,"Too many errors, mybee conection is dead.");
}
printf("\n");
- while (((int)time(NULL))<(st+intervall)) sleep(1);
+ if (textfile) {
+ appendTextFile(tfl);
+ }
+ while (((int)time(NULL)) < (st + intervall)) {
+#ifdef LINUX
+ sleep(1);
+#endif
+#ifdef WIN
+ Sleep(1000);
+#endif
+ }
}
}
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();
printf("Values info: ");
int tm3d=d->readConfig();
for (size_t i=0;i<4;i++) {
- printf("%s in %s",d->config->getQuantity(i).c_str(),d->config->getUnit(i).c_str());
+ printf("%s in %s",d->config->getQuantity((uint8_t)i).c_str(),d->config->getUnit((uint8_t)i).c_str());
if (i<4) printf("; ");
}
if (tm3d) printf(" (tm3d.de)"); else printf(" (default)");
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(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");
}
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());
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;
std::transform(adapter.begin(), adapter.end(),adapter.begin(), ::toupper);
std::string s;
-
+#ifdef LINUX
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) {
} else {
printf("\033[1;31mGPIO works with Raspberry PI only \033[0m\n");
}
- }
- if (owi==NULL) {
- return 0;
+ } 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();
+ int port = atoi(adapter.substr(adapter.find("ARDUINO") + 7).c_str());
+ printf("Open /dev/ttyS%i\n", port);
+ owi->InitAdapter(port);
}
+#ifdef WIN
+ else
+ if (adapter.find("USB") != std::string::npos) {
+ printf("USB \n");
+ owi = new owTMEXWIN();
+ int port = atoi(adapter.substr(adapter.find("USB") + 3).c_str());
+ printf("Open the %i. USB Adapter\n", port);
+ int err;
+ char cs[20];
+ sprintf_s(cs, 20, "{%i,6}", port);
+ if ((err = owi->InitAdapter(cs))==0) {
+ printf("ERROR Init USB Adapter\n");
+ exit(0);
+ }
+ }
+ else
+ if (adapter.find("COM") != std::string::npos) {
+ owi = new owTMEXWIN();
+ int port = atoi(adapter.substr(adapter.find("COM") + 3).c_str());
+ printf("Open Adapter on COM%i\n", port);
+ int err;
+ char cs[20];
+ sprintf_s(cs, 20, "{%i,5}", port);
+ if ((err = owi->InitAdapter(cs))==0) {
+ printf("ERROR Init Serial Adapter\n");
+ exit(0);
+ }
+ }
+#endif
+ if (owi == NULL) {
+ printf("No 1-Wiremaster found\n");
+ return 0;
+ }
setLogMode();
-
+
+
if (getArg("i")=="1") {
interactive(owi);
if ((s=getArg("p")) !="") {
pause=atoi(s.c_str());
} else pause=30;
+#ifdef LINUX
if ((s=getArg("d")) !="") {
reload=1;
printf("Use Database\n");
exit(1);
}
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
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");
}
printf("%i Devices found\n",(int)owi->devices.size());
} else
+ if ((s=getArg("v"))!="") {
+ printf("Reset VOC\n");
+ int sel=selectDevice();
+ if (sel==0) exit(0);
+ owDevice* dev=owi->devices[sel-1];
+ std::vector<uint8_t> cl;
+ cl.push_back(0x4E);
+ cl.push_back(0x1F);
+ cl.push_back(0x1F);
+ 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();
sel-=1;
snum_t snum=owi->devices[sel]->getNum();
+
if ((getArg("g"))=="1") {
printf("get ID from Server\n");
char s[255];
+#ifdef LINUX
sprintf(s,"wget -q http://www.tm3d.de/shop99/owid.php?fam=%02X -O id.txt",snum.byte[0]);
+#endif
+#ifdef WIN
+ sprintf_s(s, "wget -q http://www.tm3d.de/shop99/owid.php?fam=%02X -O id.txt", snum.byte[0]);
+#endif
int err;
if ((err=system(s))==0) {
printf("OK!\n");
if (c=='x') br=1;
} else {
if ((c==',')|(c=='}')) {
- isnum.byte[i]=strtol(s, NULL, 16);
+ isnum.byte[i]=(uint8_t)strtoull(s, NULL, 16);
//printf("%x\n",strtol(s, NULL, 16));
i++;
br=0;
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("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");
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");
}
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;
colm.push_back("");
} else {
char hs[50];
+#ifdef LINUX
sprintf(hs,"%0.3f",dev->values[i]);
+#endif
+#ifdef WIN
+ sprintf_s(hs, "%0.3f", dev->values[i]);
+#endif
colm.push_back(hs);
}
if (max<utf8_length(colm[3])) max=utf8_length(colm[3]);