From 2d637281cefcc16f27911887827217744880e74c Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 4 Nov 2018 21:30:24 +0100 Subject: [PATCH] New Devices Log in Textfiles --- src/main.cpp | 122 ++++++++- src/owDevice.cpp | 605 +++++++++++++++++++++++++++++++++++++++++ src/owDeviceConfig.cpp | 5 + src/owInterface.cpp | 4 + 4 files changed, 735 insertions(+), 1 deletion(-) mode change 100755 => 100644 src/main.cpp diff --git a/src/main.cpp b/src/main.cpp old mode 100755 new mode 100644 index 0a6ccbd..838b99e --- a/src/main.cpp +++ b/src/main.cpp @@ -44,6 +44,8 @@ #ifdef WIN #include "Windows.h" #include "time.h" + + #endif #include @@ -57,6 +59,7 @@ #include #include + #ifdef LINUX #define RB "\e(0\x6a\e(B" // 188 Right Bottom corner @@ -112,6 +115,8 @@ 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"); @@ -123,6 +128,7 @@ printf(" [password]\n"); printf(" [database]\n"); printf(" [prefix] -> a prefix of all tables \n\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"); @@ -130,6 +136,7 @@ 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 information (2)\n"); printf(" -m memory functions\n"); +printf(" -x write direct 1-Wire\n"); @@ -181,6 +188,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; @@ -218,9 +229,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 *devices,int intervall,int headline,int searchrom) { int first=1; + char valbuf[100]; + std::string tfl; while (1) { if (searchrom) { owi->log->clear(); @@ -281,14 +308,28 @@ void continuous(std::vector *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;kmaxrepeat;k++){ + //std::vector data; + //data.push_back(0xCC); + //data.push_back(0x44); + //owi->Reset(); + //owi->Communicate(&data, 2, 0); +======= std::vector data; data.push_back(0xCC); data.push_back(0x44); owi->Reset(); owi->Communicate(&data, 2, 0); +>>>>>>> origin/master dev->convertAll(); if (owi->log->last()log->clear(); @@ -310,6 +351,10 @@ void continuous(std::vector *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); + } } } } @@ -327,6 +372,9 @@ void continuous(std::vector *devices,int intervall,int headline,int s } printf("\n"); + if (textfile) { + appendTextFile(tfl); + } while (((int)time(NULL)) < (st + intervall)) { #ifdef LINUX sleep(1); @@ -382,8 +430,23 @@ 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(); @@ -582,7 +645,15 @@ int main(int argc, char *argv[]) { database=1; } #endif +<<<<<<< HEAD + if ((s=getArg("t")) !="") { + textfile=1; + printf("Write values to textfile %s\n",s.c_str()); + textfilename=s; + } +======= +>>>>>>> origin/master continuous(&(owi->devices),pause,1,reload); } else @@ -618,9 +689,50 @@ int main(int argc, char *argv[]) { dev->Communicate(&cl,4,0); } else //------------------------------------------------------------------------------------------ + // --------------------- Direct Write + //------------------------------------------------------------------------------------------ + + if ((s=getArg("x"))!="") { + std::vector 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 + //------------------------------------------------------------------------------------------ + +======= // --------------------- Memory functions //------------------------------------------------------------------------------------------ +>>>>>>> origin/master if ((s=getArg("m"))!="") { int pnr=0; std::vector mem; @@ -709,7 +821,11 @@ int main(int argc, char *argv[]) { if (c=='x') br=1; } else { if ((c==',')|(c=='}')) { +<<<<<<< HEAD + isnum.byte[i]=(uint8_t)strtoull(s, NULL, 16); +======= isnum.byte[i]=(uint8_t)strtol(s, NULL, 16); +>>>>>>> origin/master //printf("%x\n",strtol(s, NULL, 16)); i++; br=0; @@ -731,7 +847,11 @@ int main(int argc, char *argv[]) { if (s=="1") { snum.num+=256; } else { +<<<<<<< HEAD + unsigned long long l=strtoull(s.c_str(),NULL,16); +======= unsigned long long l=strtol(s.c_str(),NULL,16); +>>>>>>> origin/master 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); diff --git a/src/owDevice.cpp b/src/owDevice.cpp index bdb54a9..de5c52e 100755 --- a/src/owDevice.cpp +++ b/src/owDevice.cpp @@ -1,3 +1,43 @@ +<<<<<<< HEAD +// Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// * All advertising materials mentioning features or use of this +// software must display the following acknowledgement: This product +// includes software developed by tm3d.de and its contributors. +// * Neither the name of tm3d.de nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (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 "owInterface.h" +#ifdef LINUX +#include +#endif +#ifdef WIN +======= // Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de // All rights reserved. // @@ -36,6 +76,7 @@ #include #endif #ifdef WIN +>>>>>>> origin/master void usleep(int waitTime) { __int64 time1 = 0, time2 = 0, freq = 0; @@ -45,6 +86,569 @@ void usleep(int waitTime) { do { QueryPerformanceCounter((LARGE_INTEGER *)&time2); } while ((time2 - time1) < waitTime); +<<<<<<< HEAD +} +#endif +owDevice::owDevice(owInterface *owi_,snum_t num) { + snum=num; + owi=owi_; + config=new owDeviceConfig; + configstate=OWDCS_NONE; + raw.insert(raw.begin(),4,0); + values.insert(values.begin(),4,0); + lastfound=0; + } + +void owDevice::setDefaultConfig() { + config->setInvalid(); + } + +std::vector owDevice::getFamilyInfo() { + return owDeviceConfig::getFamilyInfo(snum.byte[0]); + } +int owDevice::readConfig() { + std::vector cl; + int r=owi->maxrepeat+1; + setDefaultConfig(); + int conf16=0; + do { + owi->log->clear(); + cl.clear(); + cl.push_back(0x85); + Communicate(&cl, 1, 26); + //for (uint8_t v:cl) printf("%02X ",v); + if ((cl[1]==0xFF)||(cl[2]==0xFF)) { + owi->log->set(OWLOG_INFO,"Get Config not work, maybe not a emulation from www.tm3d.de"); + return 0; + } + int oldInfo=1; + //all Code pos +1 + for(int i=19;i<27;i++) if (cl[i]!=0xFF) {oldInfo=0;break;} + if (oldInfo) { + owi->log->set(OWLOG_INFO,"Old 16 Byte Config"); + if (cl[18]==0xFF) { + if (!owi->calcCRC8(std::vector(cl.begin()+1,cl.begin()+17))) { + owi->log->set(OWLOG_WARNING,"CRC8 ERROR Reading Config"); + } + } else { + if (!owi->testCRC16(cl)) { + owi->log->set(OWLOG_WARNING,"CRC16 ERROR Reading Config "); + } + } + if (owi->log->last()calcCRC8(std::vector(cl.begin()+1,cl.begin()+25))) { + owi->log->set(OWLOG_WARNING,"CRC8 ERROR Reading Config"); + } + } else { + if (!owi->testCRC16(cl)) { + owi->log->set(OWLOG_WARNING,"CRC16 ERROR Reading Config "); + } + } + } + r--; + } + while ((owi->log->last()>=OWLOG_WARNING)&&(r>0)); + if (r==0) { + owi->log->set(OWLOG_ERROR,"To much Errors while read config"); + return -1; + } + config->setConfig(std::vector(cl.begin()+1,cl.begin()+25)); + if (config->valid) { + if (conf16) configstate=OWDCS_16; else configstate=OWDCS_24; + } else configstate=OWDCS_NONE; + return 1; +} + + +int owDevice::Communicate(std::vector *data, int scount, int rcount) { + owi->Wait_Free(); + owi->MatchRom(snum); + if (owi->log->last()==OWLOG_ERROR) {owi->Free();return 0;} + owi->Communicate(data, scount, rcount); + if (owi->log->last()==OWLOG_ERROR) {owi->Free();return 0;} + owi->Free(); + return 1; +} + +int owDevice::CommunicateShort(std::vector *data, int scount, int rcount) { + owi->Wait_Free(); + owi->Reset(); + if (owi->log->last()==OWLOG_ERROR) {owi->Free();return 0;} + owi->Communicate(data, scount, rcount); + if (owi->log->last()==OWLOG_ERROR) {owi->Free();return 0;} + owi->Free(); + return 1; +} + + +void owDevice::changeID(snum_t nid) { + int i; + if (nid.byte[0] != snum.byte[0]) { + owi->log->set(OWLOG_ERROR,"Family ID should not be changed, no correct ID"); + return; + } + std::vector id; + for(i=0;i<7;i++) id.push_back(nid.byte[i]); + id.push_back(owi->calcCRC8(id)); + std::vector cl; + int r=owi->maxrepeat+1; + do { + owi->log->clear(); + cl.clear(); + cl.push_back(0x75); + cl.insert(cl.begin()+1,id.begin(),id.end()); + Communicate(&cl, 9,0); + if (owi->log->last()==OWLOG_ERROR) {r--;continue;} + cl.clear(); + cl.push_back(0xA7); + Communicate(&cl, 1, 8); + if (owi->log->last()==OWLOG_ERROR) {r--;continue;} + for (i = 0; i < 8; i++) { + if (cl[i + 1] != id[i]) { + owi->log->set(OWLOG_WARNING,"changeID Comunication ERROR"); + break; + } + } + r--; + } + while ((owi->log->last()>=OWLOG_WARNING)&&(r>0)); + if (r==0) { + owi->log->set(OWLOG_ERROR,"Can not change ID"); + return; + } + cl.clear(); + cl.push_back(0x79); + cl.push_back(snum.byte[1]); + cl.push_back(snum.byte[5]); + cl.push_back(snum.byte[6]); + Communicate(&cl, 4, 0); + usleep(50000); +} + +void owDevice::runFlasher() { + std::vector cl; + cl.push_back(0x88); + this->Communicate(&cl, 1, 0); + this->Communicate(&cl, 1, 0); + this->Communicate(&cl, 1, 0); +} + + + + + + + + + +void owDeviceDS18B20::setDefaultConfig() { + config->setConfig({1,1, 0,0, 0,0, 0,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}); + configstate=OWDCS_DEFAULT; +}; + +int owDeviceDS18B20::readScratchpad(std::vector *sp) { + std::vector cl; + int r=owi->maxrepeat+1; + do { + cl.clear(); + cl.push_back(0xBE); + Communicate(&cl, 1, 9); + if (owi->log->last()>=OWLOG_ERROR) return -1; + sp->clear(); + sp->insert(sp->begin(),cl.begin()+1,cl.end()); + if (owi->calcCRC8(*sp)==0) return 1; + owi->log->set(OWLOG_WARNING,"CRC ERROR reading DS18B20 Scrachpad"); + r--; + } while ((owi->log->last()>=OWLOG_WARNING)&&(r>0)); + + return 0; +} + +int owDeviceDS18B20::convertAll() { + std::vector sp; + sp.push_back(0x44); + Communicate(&sp, 1, 0); ///######################################################## + usleep(750000); + + if (readScratchpad(&sp)) { + int16_t tsht; + tsht = sp[0] | ((int)sp[1] << 8); + if (sp[1] & 0x080) + tsht |= 0xFFFFF0000; + raw[0]=tsht; + values[0]=config->calculateValue(0, raw); + return 1; + } + return 0; +} + + +void owDeviceDS2438::setDefaultConfig() { + config->setConfig({1,6, 6,8, 4,7, 6,17, 0,2,3,12,4,0,0,0,0,0,0,0,0,0,0,0}); + configstate=OWDCS_DEFAULT; +} + + +int owDeviceDS2438::readScratchpad(std::vector *sp, uint8_t page, int recall) { + std::vector cl; + int r=owi->maxrepeat+1; + do { + if (recall) { + cl.clear(); + cl.push_back(0xB8); //recall + cl.push_back(page); + Communicate(&cl, 2, 0); + if (owi->log->last()>=OWLOG_ERROR) return -1; + } + cl.clear(); + cl.push_back(0xBE); + cl.push_back(page); + Communicate(&cl, 2, 9); + if (owi->log->last()>=OWLOG_ERROR) return -1; + sp->clear(); + sp->insert(sp->begin(),cl.begin()+2,cl.end()); + if (owi->calcCRC8(*sp)==0) return 1; + owi->log->set(OWLOG_WARNING,"CRC ERROR reading DS2438 Scrachpad"); + r--; + } while ((owi->log->last()>=OWLOG_WARNING)&&(r>0)); + + return 0; +} + +int owDeviceDS2438::readMemory(int page,int start, int count,std::vector *data) { + if ((page>7)||(page<0)||(start>7)||(start<0)||(start+count>8)) return 0; + std::vector cl; + cl.clear(); + cl.push_back(0xB8); //recall + cl.push_back(page); + Communicate(&cl, 2, 0); + if (owi->log->last()>=OWLOG_ERROR) return -1; + cl.clear(); + cl.push_back(0xBE); + cl.push_back(page); + Communicate(&cl, 2, 9); + if (owi->log->last()>=OWLOG_ERROR) return -1; + cl.erase(cl.begin()); + cl.erase(cl.begin()); + if (owi->calcCRC8(cl)!=0) { + owi->log->set(OWLOG_WARNING,"CRC ERROR reading DS2438 Scrachpad"); + } + data->clear(); + data->insert(data->begin(),cl.begin()+start,cl.begin()+start+count); + return count; +} +int owDeviceDS2438::writeMemory(int page,int start, int count,std::vector *data) { + if ((page>7)||(page<0)||(start>7)||(start<0)||(start+count>8)) return 0; + std::vector sp; + if ((start>0)||(count<8)) { + readMemory(page,0,8,&sp); + } + std::vector cl; + cl.push_back(0x4E); + cl.push_back(page); + int j=0; + for(int i=0;i<8;i++) { + if ((i=start+count)) cl.push_back(sp[i]); else {cl.push_back((*data)[j]);j++;} + } + Communicate(&cl, 10,0); + if (owi->log->last()>=OWLOG_ERROR) return -1; + std::vector cl1; + cl1.push_back(0xBE); + cl1.push_back(page); + Communicate(&cl1, 2, 9); + if (owi->log->last()>=OWLOG_ERROR) return -1; + cl1.erase(cl1.begin()); + cl1.erase(cl1.begin()); + if (owi->calcCRC8(cl1)!=0) { + owi->log->set(OWLOG_WARNING,"CRC ERROR rereading DS2438 Scrachpad"); + } + for(int i=0;i<8;i++) { + if (cl1[i]!=cl[i+2]) { + owi->log->set(OWLOG_ERROR,"Reread not equal, nothing copied"); + return 0; + } + } + cl.clear(); + cl.push_back(0x48); + cl.push_back(page); + Communicate(&cl, 2, 0); + if (owi->log->last()>=OWLOG_ERROR) return -1; + return 1; +} + + + +int owDeviceDS2438::setConfigByte(uint8_t cb) { + std::vector sp; + int k; + for(k=0;kmaxrepeat;k++) { + owi->log->clear(); + sp.clear(); + sp.push_back(0x4E); + sp.push_back(0x00); + sp.push_back(cb); + Communicate(&sp,3,0); + if (owi->log->last()>=OWLOG_ERROR) return -1; + sp.clear(); + readScratchpad(&sp,0,0); + if (owi->log->last()>=OWLOG_ERROR) return -2; + if (cb==sp[0]) return 1; + owi->log->set(OWLOG_WARNING,"ERROR set config byte of DS2438"); + } + owi->log->set(OWLOG_WARNING,"Config of DS2438 byte not set"); + return 0; +} + +inline int16_t ow_fconvert(uint8_t b1, uint16_t b2) { + int tsht; + tsht=b1 |((int)b2<<8); + if (b2 & 0x080) + tsht |= 0xFFFFF0000; + return tsht; +} + +int owDeviceDS2438::convertAll() { + for(int k=0;kmaxrepeat;k++) { + std::vector sp; + sp.push_back(0x44); + Communicate(&sp, 1, 0);///######################################################## + if (owi->log->last()>=OWLOG_ERROR) continue; + usleep(100000); + if (setConfigByte(0x08)<=0) continue; + for(int k=0;kmaxrepeat;k++) { + sp.clear(); + sp.push_back(0xB4); + Communicate(&sp, 1, 0); + } + if (owi->log->last()>=OWLOG_ERROR) continue; + usleep(100000); + + + readScratchpad(&sp,0,1); + int temp=ow_fconvert(sp[1],sp[2]); + int VDD=ow_fconvert(sp[3],sp[4]); + if (setConfigByte(0x00)<=0) continue; + + for(int k=0;kmaxrepeat;k++) { + sp.clear(); + sp.push_back(0xB4); + Communicate(&sp, 1, 0); + } + if (owi->log->last()>=OWLOG_ERROR) continue; + + usleep(100000); + + + + readScratchpad(&sp,0,1); + if (owi->log->last()>=OWLOG_ERROR) continue; + int I=ow_fconvert(sp[5],sp[6]); + int VAD=ow_fconvert(sp[3],sp[4]); + raw[0]=temp; + raw[1]=VDD; + raw[2]=VAD; + raw[3]=I; + for(int i=0;i<4;i++) values[i]=config->calculateValue(i, raw); + break; + } + if (owi->log->last()>=OWLOG_ERROR) return 0; + return 1; +} + + +void owDeviceDS2450::setDefaultConfig() { + config->setConfig({6,9, 6,9, 6,9, 6,9, 0,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0}); + configstate=OWDCS_DEFAULT; +} + +int owDeviceDS2450::convertAll() { + convert(0x0F,0); + if (owi->log->last()>=OWLOG_WARNING) { + return 0; + } + std::vector sp; + readMemory(0,&sp); + if (owi->log->last()>=OWLOG_WARNING) { + return 0; + } + + for(int i=0;i<4;i++) { + raw[i]=(sp[2 * i] | sp[2 * i + 1] << 8); + } + for(int i=0;i<4;i++) { + values[i]=config->calculateValue(i, raw); + } + return 1; + +} + +void owDeviceDS2450::readMemory(uint8_t addr,std::vector *sp) { + std::vector cl; + cl.push_back(0xAA); + cl.push_back(addr); + cl.push_back(0x00); + Communicate(&cl,3,10-addr); + if (owi->log->last()>=OWLOG_WARNING) { + return; + } + if (!owi->testCRC16(cl)) { + for (uint8_t v :cl) printf("%02X ",v); + printf("\n"); + owi->log->set(OWLOG_ERROR,"CRC ERROR Reading Memory of DS2450"); + return; + } + sp->clear(); + sp->insert(sp->begin(),cl.begin()+3,cl.end()-2); +} + +void owDeviceDS2450::writeMemory(uint8_t addr,std::vector *sp) { + std::vector cl; + cl.push_back(0x55); + cl.push_back(addr); + cl.push_back(0x00); + owi->MatchRom(snum); + if (owi->log->last()>=OWLOG_WARNING) { + return; + } + for(uint8_t b: (*sp)) { + cl.push_back(b); + owi->Communicate(&cl,cl.size(),2); + if (owi->log->last()>=OWLOG_WARNING) { + return; + } + if (!owi->testCRC16(cl)) { + owi->log->set(OWLOG_ERROR,"CRC ERROR Writing Memory of DS2450"); + return; + } + cl.clear(); + owi->Communicate(&cl, 0, 1); + if (owi->log->last()>=OWLOG_WARNING) { + return; + } + if (cl[0] != b) { + owi->log->set(OWLOG_ERROR,"ERROR Writing Memory of DS2450"); + return; + } + cl.clear(); + } +} + +void owDeviceDS2450::convert(uint8_t mask, uint8_t preset) { + std::vector cl; + cl.push_back(0x3C); + cl.push_back(mask); + cl.push_back(preset); + Communicate(&cl, 3, 2); + if (!owi->testCRC16(cl)) { + for (uint8_t v :cl) printf("%02X ",v); + printf("\n"); + owi->log->set(OWLOG_ERROR,"CRC ERROR Convert Command of DS2450"); + return; + } + usleep(10000); +} + + + + + + + + + + + +void owDeviceDS2423::setDefaultConfig() { + config->setConfig({9,13, 9,13, 9,13, 9,13, 0,19,19,19,19,0,0,0,0,0,0,0,0,0,0,0}); + configstate=OWDCS_DEFAULT; +} + +int owDeviceDS2423::convertAll() { + for(uint8_t i=12;i<16;i++) { + raw[i-12]=readCounter(i); + } + for(int i=0;i<4;i++) { + values[i]=config->calculateValue(i, raw); + } + return 1; +} +uint32_t owDeviceDS2423::readCounter(uint8_t page) { + std::vector cl; + cl.push_back(0xA5); + uint16_t addr=(page<<5)+31; + cl.push_back(addr&0xFF); + cl.push_back(addr>>8); + Communicate(&cl,3,11); + //for (uint8_t v :cl) printf("%02X ",v); + //printf("\n"); + if (!owi->testCRC16(cl)) { + owi->log->set(OWLOG_ERROR,"CRC ERROR Reading Counter of DS2423"); + return 0; + } + uint32_t ret=0; + + for(size_t i=cl.size()-7;i>cl.size()-11;i--) { + ret<<=8; + ret|=cl[i]; + + } + return ret; +} + + +int owDeviceDS2423::readMemory(int page,int start, int count,std::vector *data){ + std::vector cl; + cl.push_back(0xF0); + uint16_t adr=page<<5; + cl.push_back(adr&0xFF); + cl.push_back((adr>>8)&0xFF); + Communicate(&cl, 3, 32); + //No CRC + data->clear(); + data->insert(data->begin(),cl.begin()+3+start,cl.begin()+start+3+count); + return count; + +} +int owDeviceDS2423::writeMemory(int page,int start, int count,std::vector *data) { + std::vector cl; + cl.push_back(0x0F); + uint16_t adr=(page<<5)+start; + cl.push_back(adr&0xFF); + cl.push_back(adr>>8); + if (count > (int)(*data).size()) count = (*data).size(); + for(int i=0;ilog->set(OWLOG_ERROR,"DS2423 Copy from Scratchpad to Memmory Error"); + //return 0; + } + return count; +} + + + + + + +======= } #endif owDevice::owDevice(owInterface *owi_,snum_t num) { @@ -606,3 +1210,4 @@ int owDeviceDS2423::writeMemory(int page,int start, int count,std::vector>>>>>> origin/master diff --git a/src/owDeviceConfig.cpp b/src/owDeviceConfig.cpp index 1703957..5c86c05 100644 --- a/src/owDeviceConfig.cpp +++ b/src/owDeviceConfig.cpp @@ -284,6 +284,11 @@ double owDeviceConfig::calculateValueFromNumber(int code, int vn, std::vector>>>>>> origin/master default:return V[vn]; } } diff --git a/src/owInterface.cpp b/src/owInterface.cpp index b02c047..0b189fa 100755 --- a/src/owInterface.cpp +++ b/src/owInterface.cpp @@ -476,7 +476,11 @@ int owInterface::owSearch() { } while(rom_byte_number < 8); // loop until through all ROM bytes 0-7 // if the search was successful then +<<<<<<< HEAD + if (!((id_bit_number < 65) || (crc8 != 0))) { +======= if (!((id_bit_number < 65) || (crc8 != 0))) { +>>>>>>> origin/master // search successful so set LastDiscrepancy,LastDeviceFlag,search_result LastDiscrepancy = last_zero; // check for last device -- 2.34.1