Memory access for DS2423
authorTobias <tm@tm3d.de>
Wed, 28 Feb 2018 15:36:47 +0000 (16:36 +0100)
committerTobias <tm@tm3d.de>
Wed, 28 Feb 2018 15:36:47 +0000 (16:36 +0100)
src/main.cpp
src/owDevice.cpp
src/owInterface.h

index de17078..0a6ccbd 100755 (executable)
@@ -663,14 +663,14 @@ int main(int argc, char *argv[]) {
                //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,8,&mem);
+                       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,8,&mem);
-                       r=dev->readMemory(pnr,0,8,&mem);
+                       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);
index 60a8e99..bdb54a9 100755 (executable)
@@ -562,6 +562,45 @@ uint32_t owDeviceDS2423::readCounter(uint8_t page) {
 }
 
 
+int owDeviceDS2423::readMemory(int page,int start, int count,std::vector<uint8_t> *data){
+       std::vector<uint8_t> 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<uint8_t> *data) {
+       std::vector<uint8_t> cl;
+       cl.push_back(0x0F);
+       uint16_t adr=(page<<5)+start;
+       cl.push_back(adr&0xFF);
+       cl.push_back(adr>>8);
+       for(int i=0;i<count;i++) {
+               cl.push_back((*data)[i]);
+       }
+       Communicate(&cl, 3+count, 0);
+       for (uint8_t v :cl) printf("%02X ",v);printf("\n");
+       cl.clear();
+       cl.push_back(0xAA);
+       Communicate(&cl, 1, 36);
+       //for (uint8_t v :cl) printf("%02X ",v);;printf("\n");
+       cl[0]=0x5A;
+       Communicate(&cl, 4, 1);
+       usleep(100000);
+       if (cl[4]!=0xAA) {
+               for (uint8_t v :cl) printf("%02X ",v);;printf("\n");
+               owi->log->set(OWLOG_ERROR,"DS2423 Copy from Scratchpad to Memmory Error");
+               //return 0;
+       }
+       return count;
+}
+
 
 
 
index 664de85..7e1edb0 100755 (executable)
@@ -287,6 +287,7 @@ public:
        virtual int convertAll() {return 1;}
        virtual int readMemory(int page,int start, int count,std::vector<uint8_t> *data) {return 0;};
        virtual int writeMemory(int page,int start, int count,std::vector<uint8_t> *data) {return 0;};
+       virtual int getPageSize() {return 0;}
        virtual ~owDevice() {}
 };
 
@@ -296,6 +297,7 @@ public:
        virtual void setDefaultConfig();
        int readScratchpad(std::vector<uint8_t> *sp);
        virtual int convertAll();
+       virtual int getPageSize() {return 8;}
 } ;
 
 
@@ -309,6 +311,7 @@ public:
        virtual int readMemory(int page,int start, int count,std::vector<uint8_t> *data);
        virtual int writeMemory(int page,int start, int count,std::vector<uint8_t> *data);
        virtual int convertAll();
+       virtual int getPageSize() {return 8;}
 
 } ;
 class owDeviceDS2450:public owDevice {
@@ -320,6 +323,7 @@ public:
        void readMemory(uint8_t addr,std::vector<uint8_t> *sp);
        void writeMemory(uint8_t addr,std::vector<uint8_t> *sp);
        void convert(uint8_t mask, uint8_t preset); 
+       virtual int getPageSize() {return 8;}
 
 } ;
 
@@ -331,6 +335,10 @@ public:
        virtual void setDefaultConfig();
        virtual int convertAll();
        uint32_t readCounter(uint8_t page);
+       virtual int readMemory(int page,int start, int count,std::vector<uint8_t> *data);
+       virtual int writeMemory(int page,int start, int count,std::vector<uint8_t> *data);
+       virtual int getPageSize() {return 32;}
+
 
 } ;