htu21d_for_weather_shield

Dependents:   SPARKFUN_WEATHER_SHIELD

Fork of htu21d by Kevin Braun

Revision:
3:5c0f8e91d319
Parent:
2:8fbe84ed61e6
Child:
4:fe060047cc24
--- a/htu21d.cpp	Thu May 22 18:48:46 2014 +0000
+++ b/htu21d.cpp	Thu Apr 30 00:34:03 2015 +0000
@@ -6,13 +6,13 @@
 
 #include "htu21d.h"
 
-#ifdef RTOS_H
-extern Mutex MutexI2cWait;
-#endif
-
 double theTempIs = 0.0;
 double theHumIs = 0.0;
 
+#if not defined HTU21Di2cLOWLEVEL
+char htuBuffer[8];
+#endif
+
 //--------------------------------------------------------------------------------------------------------------------------------------//
 //Contstructor
 
@@ -34,12 +34,8 @@
 //Perform a soft reset on the HTU21D. REturn of 1 = ok, 0 = timeout.
 
 int htu21d::softReset() {
-    
-#ifdef RTOS_H
-    MutexI2cWait.lock();
-#endif
-
     int htu21 = 0;
+#if defined HTU21Di2cLOWLEVEL
     _i2c.start();
     htu21 = _i2c.write(HTU21Di2cWRITE);     //i2c, 1 = ack
     if(htu21 == 1) {
@@ -48,23 +44,21 @@
         wait_ms(16);                        //must wait a least 15mS for reset to finish
         htu21d::getSNReg();                 //go load up the s/n registers
     }
-
-#ifdef RTOS_H
-    MutexI2cWait.unlock();
+    return(htu21);
+#else
+    htuBuffer[0] = HTU21DRESET;
+    htu21 = _i2c.write(HTU21Di2cWRITE, htuBuffer, 1, false);
+    wait_ms(16);
+    htu21d::getSNReg();
+    return(!(htu21));
 #endif
-
-    return(htu21);
 }
 
 //--------------------------------------------------------------------------------------------------------------------------------------//
 //Get the HTU21D user register. Returns 8 bit register.
 
 uint8_t htu21d::getUserReg() {
-    
-#ifdef RTOS_H
-    MutexI2cWait.lock();
-#endif
-
+#if defined HTU21Di2cLOWLEVEL
     int htu21 = 0;
     uint8_t htu21data = 0;
     _i2c.start();
@@ -76,12 +70,16 @@
         htu21data = _i2c.read(0);
         _i2c.stop();
     }
-    
-#ifdef RTOS_H
-    MutexI2cWait.unlock();
+    return(htu21data);
+#else
+    htuBuffer[0] = HTU21DREADUSER;
+    _i2c.write(HTU21Di2cWRITE, htuBuffer, 1, true);
+    if(!(_i2c.read(HTU21Di2cREAD, htuBuffer, 1, false))) {
+        return(htuBuffer[0]);
+    } else {
+        return(0);
+    }
 #endif
-
-    return(htu21data);
 }
 
 //--------------------------------------------------------------------------------------------------------------------------------------//
@@ -90,11 +88,7 @@
 int htu21d::heaterOn() {
     uint8_t htu21data = htu21d::getUserReg();
     htu21data |= HTU21DHEATER;
-    
-#ifdef RTOS_H
-    MutexI2cWait.lock();
-#endif
-
+#if defined HTU21Di2cLOWLEVEL
     int htu21 = 0;
     _i2c.start();
     htu21 = _i2c.write(HTU21Di2cWRITE);     //i2c, 1 = ack
@@ -103,12 +97,12 @@
         htu21 = _i2c.write(htu21data);
         _i2c.stop();
     }
-    
-#ifdef RTOS_H
-    MutexI2cWait.unlock();
+    return(htu21);
+#else
+    htuBuffer[0] = HTU21DWRITEUSER;
+    htuBuffer[1] = htu21data;
+    return(_i2c.write(HTU21Di2cWRITE, htuBuffer, 2, false));
 #endif
-
-    return(htu21);
 }
 
 //--------------------------------------------------------------------------------------------------------------------------------------//
@@ -117,11 +111,7 @@
 int htu21d::heaterOff() {
     uint8_t htu21data = htu21d::getUserReg();
     htu21data &= ~HTU21DHEATER;
-    
-#ifdef RTOS_H
-    MutexI2cWait.lock();
-#endif
-
+#if defined HTU21Di2cLOWLEVEL
     int htu21 = 0;
     _i2c.start();
     htu21 = _i2c.write(HTU21Di2cWRITE);     //i2c, 1 = ack
@@ -130,12 +120,13 @@
         htu21 = _i2c.write(htu21data);
         _i2c.stop();
     }
-    
-#ifdef RTOS_H
-    MutexI2cWait.unlock();
+    return(htu21);
+#else
+    htuBuffer[0] = HTU21DWRITEUSER;
+    htuBuffer[1] = htu21data;
+    return(_i2c.write(HTU21Di2cWRITE, htuBuffer, 2, false));
 #endif
 
-    return(htu21);
 }
 
 //--------------------------------------------------------------------------------------------------------------------------------------//
@@ -154,27 +145,17 @@
 //NOTE: Use non-hold commands
 
 uint16_t htu21d::getData(uint8_t reg) {
-    int htu21 = 0;              //ACK flag
     int htu21cnt = 0;           //number of NACKs before ACK or timeout 
+#if defined HTU21Di2cLOWLEVEL
     uint16_t htu21data = 0;     //returned data
-
-#ifdef RTOS_H
-    MutexI2cWait.lock();
-#endif
+    int htu21 = 0;              //ACK flag
     _i2c.start();
     htu21 = _i2c.write(HTU21Di2cWRITE);
     _i2c.write(reg);            //read temp, no hold
     _i2c.stop();
-#ifdef RTOS_H
-        MutexI2cWait.unlock();
-#endif
-
     if(htu21 == 0) return 0;    //HTU21T not responding
     do {
         htu21cnt++;
-#ifdef RTOS_H
-        MutexI2cWait.lock();
-#endif
         _i2c.start();
         htu21 = _i2c.write(HTU21Di2cREAD);
         if(htu21 == 1) {
@@ -182,16 +163,23 @@
             htu21data |= _i2c.read(0) & 0xFC;
             _i2c.stop();
         }
-#ifdef RTOS_H
-        MutexI2cWait.unlock();                  //free up the I2C bus
-        Thread::wait(1);                        //allow other RTOS functions to sneak in
-#else
         wait_us(1000);
-#endif
     } while((htu21cnt < 100) && (htu21 == 0));  //htu21cnt takes 55 to get temp, 16 for humidity (at 1mS loops)
         
     if(htu21 == 0) return 0;    //HTU21D ACK response timed out
     return(htu21data);          //return 14 bit value
+#else
+    htuBuffer[0] = reg;
+    _i2c.write(HTU21Di2cWRITE, htuBuffer, 1, false);
+    do {
+        htu21cnt++;
+        if(!(_i2c.read(HTU21Di2cREAD, htuBuffer, 2, false))) {
+            return((htuBuffer[0] << 8) | htuBuffer[1]);
+        }
+        wait_us(1000);
+    } while(htu21cnt < 100);
+    return 0;
+#endif
 }
 
 //--------------------------------------------------------------------------------------------------------------------------------------//
@@ -254,12 +242,8 @@
 //should return 0x4854 00xx xxxx 32xx
 
 void htu21d::getSNReg() {
-
-#ifdef RTOS_H
-    MutexI2cWait.lock();
-#endif
-
     //get 16 bit SNC register, 8 bit SNC-CRC, 16 bit SNA register, 8 bit SNA-CRC
+#if defined HTU21Di2cLOWLEVEL
     int htu21 = 0;
     _i2c.start();
     htu21 = _i2c.write(HTU21Di2cWRITE);     //i2c, 1 = ack
@@ -275,9 +259,25 @@
         HTU21sn.HTU21D_sna |= _i2c.read(1);
         HTU21sn.HTU21D_crca = _i2c.read(0);
         _i2c.stop();
+    } else {
+        HTU21sn.HTU21D_snc = HTU21sn.HTU21D_crcc = HTU21sn.HTU21D_sna = HTU21sn.HTU21D_crca = 0;
     }
+#else
+    htuBuffer[0] = HTU21SNAC1;
+    htuBuffer[1] = HTU21SNAC2;
+    _i2c.write(HTU21Di2cWRITE, htuBuffer, 2, true);
+    if(!(_i2c.read(HTU21Di2cREAD, htuBuffer, 6, false))) {
+        HTU21sn.HTU21D_snc = (htuBuffer[0] << 8) | htuBuffer[1];
+        HTU21sn.HTU21D_crcc = htuBuffer[2];
+        HTU21sn.HTU21D_sna = (htuBuffer[3] << 8) | htuBuffer[4];
+        HTU21sn.HTU21D_crca = htuBuffer[5];
+    } else {
+        HTU21sn.HTU21D_snc = HTU21sn.HTU21D_crcc = HTU21sn.HTU21D_sna = HTU21sn.HTU21D_crca = 0;
+    }
+#endif
     
     //get 32 bit SNB register, 32 bit SNB-CRC - regs are intermixed
+#if defined HTU21Di2cLOWLEVEL
     htu21 = 0;
     _i2c.start();
     htu21 = _i2c.write(HTU21Di2cWRITE);     //i2c, 1 = ack
@@ -295,11 +295,19 @@
         HTU21sn.HTU21D_snb |= _i2c.read(1);
         HTU21sn.HTU21D_crcb |= _i2c.read(0);
         _i2c.stop();
+    } else {
+        HTU21sn.HTU21D_snb = HTU21sn.HTU21D_crcb = 0;
     }
-    
-#ifdef RTOS_H
-    MutexI2cWait.unlock();
+#else
+    htuBuffer[0] = HTU21SNB1;
+    htuBuffer[1] = HTU21SNB2;
+    _i2c.write(HTU21Di2cWRITE, htuBuffer, 2, true);
+    if(!(_i2c.read(HTU21Di2cREAD, htuBuffer, 8, false))) {
+        HTU21sn.HTU21D_snb = (htuBuffer[0] << 24) | (htuBuffer[2] << 16) | (htuBuffer[4] << 8) | htuBuffer[6];
+        HTU21sn.HTU21D_crcb = (htuBuffer[1] << 24) | (htuBuffer[3] << 16) | (htuBuffer[5] << 8) | htuBuffer[7];
+    } else {
+        HTU21sn.HTU21D_snb = HTU21sn.HTU21D_crcb = 0;
+    }
 #endif
-
 }