Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Revision:
6:a8c83a2e6fa4
Parent:
0:f77ad7f72d04
--- a/Devices/DS18B20.cpp	Fri Jan 19 10:25:02 2018 -0600
+++ b/Devices/DS18B20.cpp	Wed Jan 23 13:11:04 2019 -0600
@@ -36,27 +36,22 @@
 
 namespace MaximInterface {
 
-enum DS18B20_CMDS {
-  WRITE_SCRATCHPAD = 0x4E,
-  READ_SCRATCHPAD = 0xBE,
-  COPY_SCRATCHPAD = 0x48,
-  CONV_TEMPERATURE = 0x44,
-  READ_POWER_SUPPY = 0xB4,
-  RECALL = 0xB8
-};
+const uint_least8_t DS18B20::nineBitResolution;
+const uint_least8_t DS18B20::tenBitResolution;
+const uint_least8_t DS18B20::elevenBitResolution;
+const uint_least8_t DS18B20::twelveBitResolution;
 
 error_code DS18B20::initialize() {
-  Scratchpad scratchpad;
+  Scratchpad::array scratchpad;
   return readScratchpad(scratchpad);
 }
 
 error_code DS18B20::writeScratchpad(uint_least8_t th, uint_least8_t tl,
-                                    uint_least8_t res) {
+                                    uint_least8_t res) {  
   error_code result = selectRom(*master);
   if (!result) {
-    const uint_least8_t sendBlock[] = {WRITE_SCRATCHPAD, th, tl, res};
-    result =
-        master->writeBlock(sendBlock, sizeof(sendBlock) / sizeof(sendBlock[0]));
+    const uint_least8_t sendBlock[] = {0x4E, th, tl, res};
+    result = master->writeBlock(sendBlock);
     if (!result) {
       resolution = res;
     }
@@ -64,17 +59,16 @@
   return result;
 }
 
-error_code DS18B20::readScratchpad(Scratchpad & scratchpad) {
+error_code DS18B20::readScratchpad(Scratchpad::span scratchpad) {  
   error_code result = selectRom(*master);
   if (result) {
     return result;
   }
-  result =
-      master->writeByteSetLevel(READ_SCRATCHPAD, OneWireMaster::NormalLevel);
+  result = master->writeByte(0xBE);
   if (result) {
     return result;
   }
-  result = master->readBlock(scratchpad.data(), scratchpad.size());
+  result = master->readBlock(scratchpad);
   if (result) {
     return result;
   }
@@ -83,7 +77,7 @@
   if (result) {
     return result;
   }
-  if (receivedCrc == calculateCrc8(scratchpad.data(), scratchpad.size())) {
+  if (receivedCrc == calculateCrc8(scratchpad)) {
     resolution = scratchpad[4];
   } else {
     result = make_error_code(CrcError);
@@ -91,21 +85,22 @@
   return result;
 }
 
-error_code DS18B20::readPowerSupply(bool & localPower) {
+error_code DS18B20::readPowerSupply(bool & localPower) {  
   error_code result = selectRom(*master);
   if (result) {
     return result;
   }
-  result =
-      master->writeByteSetLevel(READ_POWER_SUPPY, OneWireMaster::NormalLevel);
+  result = master->writeByte(0xB4);
   if (result) {
     return result;
   }
-  result = master->touchBitSetLevel(localPower, OneWireMaster::NormalLevel);
+  result = master->touchBit(localPower);
   return result;
 }
 
 error_code DS18B20::copyScratchpad() {
+  const uint_least8_t copyScratchpadCmd = 0x48;
+  
   bool hasLocalPower;
   error_code result = readPowerSupply(hasLocalPower);
   if (result) {
@@ -116,17 +111,16 @@
     return result;
   }
   if (hasLocalPower) {
-    result =
-        master->writeByteSetLevel(COPY_SCRATCHPAD, OneWireMaster::NormalLevel);
+    result = master->writeByte(copyScratchpadCmd);
     bool recvbit = 0;
     while (!recvbit && !result) {
-      result = master->touchBitSetLevel(recvbit, OneWireMaster::NormalLevel);
+      result = master->touchBit(recvbit);
     }
   } else {
-    result =
-        master->writeByteSetLevel(COPY_SCRATCHPAD, OneWireMaster::StrongLevel);
+    result = master->writeByteSetLevel(copyScratchpadCmd,
+                                       OneWireMaster::StrongLevel);
     if (!result) {
-      (*sleep)(10);
+      sleep->invoke(10);
       result = master->setLevel(OneWireMaster::NormalLevel);
     }
   }
@@ -134,6 +128,8 @@
 }
 
 error_code DS18B20::convertTemperature() {
+  const uint_least8_t convertTemperatureCmd = 0x44;
+  
   bool hasLocalPower;
   error_code result = readPowerSupply(hasLocalPower);
   if (result) {
@@ -144,15 +140,14 @@
     return result;
   }
   if (hasLocalPower) {
-    result =
-        master->writeByteSetLevel(CONV_TEMPERATURE, OneWireMaster::NormalLevel);
+    result = master->writeByte(convertTemperatureCmd);
     bool recvbit = 0;
     while (!result && !recvbit) {
-      result = master->touchBitSetLevel(recvbit, OneWireMaster::NormalLevel);
+      result = master->touchBit(recvbit);
     }
   } else {
-    result =
-        master->writeByteSetLevel(CONV_TEMPERATURE, OneWireMaster::StrongLevel);
+    result = master->writeByteSetLevel(convertTemperatureCmd,
+                                       OneWireMaster::StrongLevel);
     if (!result) {
       int sleepTime;
       switch (resolution) {
@@ -173,17 +168,17 @@
         sleepTime = 750;
         break;
       }
-      (*sleep)(sleepTime);
+      sleep->invoke(sleepTime);
       result = master->setLevel(OneWireMaster::NormalLevel);
     }
   }
   return result;
 }
 
-error_code DS18B20::recallEeprom() {
+error_code DS18B20::recallEeprom() {  
   error_code result = selectRom(*master);
   if (!result) {
-    result = master->writeByte(RECALL);
+    result = master->writeByte(0xB8);
   }
   return result;
 }
@@ -214,13 +209,13 @@
   if (result) {
     return result;
   }
-  DS18B20::Scratchpad scratchpad;
+  DS18B20::Scratchpad::array scratchpad;
   result = ds18b20.readScratchpad(scratchpad);
   if (result) {
     return result;
   }
 
-  unsigned int tempData =
+  const unsigned int tempData =
       (static_cast<unsigned int>(scratchpad[1]) << 8) | scratchpad[0];
   const unsigned int signMask = 0xF800;
   if ((tempData & signMask) == signMask) {