Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Revision:
8:211d1b8f730c
Parent:
6:a8c83a2e6fa4
--- a/Links/RomCommands.cpp	Tue Jul 24 08:33:31 2018 +0000
+++ b/Links/RomCommands.cpp	Wed Apr 03 12:33:10 2019 +0000
@@ -30,7 +30,6 @@
 * ownership rights.
 *******************************************************************************/
 
-#include <algorithm>
 #include "RomCommands.hpp"
 
 namespace MaximInterface {
@@ -46,114 +45,106 @@
 };
 
 void skipCurrentFamily(SearchRomState & searchState) {
-  // set the Last discrepancy to last family discrepancy
+  // Set the last discrepancy to last family discrepancy.
   searchState.lastDiscrepancy = searchState.lastFamilyDiscrepancy;
-
-  // clear the last family discrepancy
+  // Clear the last family discrepancy.
   searchState.lastFamilyDiscrepancy = 0;
-
-  // check for end of list
+  // Check for end of list.
   if (searchState.lastDiscrepancy == 0) {
     searchState.lastDevice = true;
   }
 }
 
-error_code verifyRom(OneWireMaster & master, const RomId & romId) {
+error_code verifyRom(OneWireMaster & master, RomId::const_span romId) {
   SearchRomState searchState(romId);
   error_code result = searchRom(master, searchState);
-  if (!result) {
-    // check if same device found
-    if (romId != searchState.romId) {
-      result = make_error_code(OneWireMaster::NoSlaveError);
-    }
+  if (result) {
+    return result;
+  }
+  // Check if same device found.
+  if (romId != make_span(searchState.romId)) {
+    result = make_error_code(OneWireMaster::NoSlaveError);
   }
   return result;
 }
 
-error_code readRom(OneWireMaster & master, RomId & romId) {
+error_code readRom(OneWireMaster & master, RomId::span romId) {
   error_code result = master.reset();
-  if (!result) {
-    result = master.writeByte(ReadRomCmd);
-  }
-
-  // read the ROM
-  RomId readId;
-  if (!result) {
-    result = master.readBlock(readId.data(), readId.size());
+  if (result) {
+    return result;
   }
-
-  // verify CRC8
-  if (!result) {
-    if (valid(readId)) {
-      romId = readId;
-    } else {
-      result = make_error_code(OneWireMaster::NoSlaveError);
-    }
+  result = master.writeByte(ReadRomCmd);
+  if (result) {
+    return result;
   }
-
+  result = master.readBlock(romId);
+  if (result) {
+    return result;
+  }
+  if (!valid(romId)) {
+    result = make_error_code(OneWireMaster::NoSlaveError);
+  }
   return result;
 }
 
 error_code skipRom(OneWireMaster & master) {
   error_code result = master.reset();
-  if (!result) {
-    result = master.writeByte(SkipRomCmd);
+  if (result) {
+    return result;
   }
+  result = master.writeByte(SkipRomCmd);
   return result;
 }
 
-error_code matchRom(OneWireMaster & master, const RomId & romId) {
-  // use MatchROM
+error_code matchRom(OneWireMaster & master, RomId::const_span romId) {
   error_code result = master.reset();
-  if (!result) {
-    uint_least8_t buf[1 + RomId::csize];
-    buf[0] = MatchRomCmd;
-    std::copy(romId.begin(), romId.end(), buf + 1);
-    // send command and rom
-    result = master.writeBlock(buf, sizeof(buf) / sizeof(buf[0]));
+  if (result) {
+    return result;
   }
+  result = master.writeByte(MatchRomCmd);
+  if (result) {
+    return result;
+  }
+  result = master.writeBlock(romId);
   return result;
 }
 
 error_code overdriveSkipRom(OneWireMaster & master) {
-  error_code result = master.setSpeed(OneWireMaster::StandardSpeed);
-
-  if (!result) {
-    result = master.reset();
+  error_code result = master.reset();
+  if (result) {
+    return result;
   }
-
-  if (!result) {
-    result = master.writeByte(OverdriveSkipRomCmd);
+  result = master.writeByte(OverdriveSkipRomCmd);
+  if (result) {
+    return result;
   }
-
-  if (!result) {
-    result = master.setSpeed(OneWireMaster::OverdriveSpeed);
-  }
-
+  result = master.setSpeed(OneWireMaster::OverdriveSpeed);
   return result;
 }
 
-error_code overdriveMatchRom(OneWireMaster & master, const RomId & romId) {
-  // use overdrive MatchROM
-  master.setSpeed(OneWireMaster::StandardSpeed);
-
+error_code overdriveMatchRom(OneWireMaster & master, RomId::const_span romId) {
   error_code result = master.reset();
-  if (!result) {
-    result = master.writeByte(OverdriveMatchRomCmd);
-    if (!result) {
-      master.setSpeed(OneWireMaster::OverdriveSpeed);
-      // send ROM
-      result = master.writeBlock(romId.data(), romId.size());
-    }
+  if (result) {
+    return result;
   }
+  result = master.writeByte(OverdriveMatchRomCmd);
+  if (result) {
+    return result;
+  }
+  result = master.setSpeed(OneWireMaster::OverdriveSpeed);
+  if (result) {
+    return result;
+  }
+  result = master.writeBlock(romId);
   return result;
 }
 
 error_code resumeRom(OneWireMaster & master) {
   error_code result = master.reset();
-  if (!result) {
-    result = master.writeByte(ResumeRomCmd);
+  if (result) {
+    return result;
   }
+  result = master.writeByte(ResumeRomCmd);
   return result;
 }
 
@@ -171,20 +162,20 @@
     return result;
   }
 
-  SearchRomState newSearchState = searchState;
-  for (int idBitNumber = 1; idBitNumber <= 64; idBitNumber++) {
+  SearchRomState newSearchState;
+  newSearchState.lastFamilyDiscrepancy = searchState.lastFamilyDiscrepancy;
+  for (int idBitNumber = 1; idBitNumber <= 64; ++idBitNumber) {
     const int idByteNumber = (idBitNumber - 1) / 8;
     const unsigned int idBitMask = 1 << ((idBitNumber - 1) % 8);
 
     OneWireMaster::TripletData tripletData;
-    if (idBitNumber == newSearchState.lastDiscrepancy) {
+    if (idBitNumber == searchState.lastDiscrepancy) {
       tripletData.writeBit = 1;
-    } else if (idBitNumber > newSearchState.lastDiscrepancy) {
+    } else if (idBitNumber > searchState.lastDiscrepancy) {
       tripletData.writeBit = 0;
-    } else // idBitNumber < searchState.lastDiscrepancy
-    {
+    } else { // idBitNumber < searchState.lastDiscrepancy
       tripletData.writeBit =
-          (newSearchState.romId[idByteNumber] & idBitMask) == idBitMask;
+          (searchState.romId[idByteNumber] & idBitMask) == idBitMask;
     }
 
     result = master.triplet(tripletData);
@@ -197,19 +188,16 @@
 
     if (tripletData.writeBit) {
       newSearchState.romId[idByteNumber] |= idBitMask;
-    } else {
-      newSearchState.romId[idByteNumber] &= ~idBitMask;
-      if (!tripletData.readBit && !tripletData.readBitComplement) {
-        newSearchState.lastDiscrepancy = idBitNumber;
-        if (idBitNumber <= 8) {
-          newSearchState.lastFamilyDiscrepancy = idBitNumber;
-        }
+    } else if (!tripletData.readBit && !tripletData.readBitComplement) {
+      newSearchState.lastDiscrepancy = idBitNumber;
+      if (idBitNumber <= 8) {
+        newSearchState.lastFamilyDiscrepancy = idBitNumber;
       }
     }
   }
 
   if (valid(newSearchState.romId)) {
-    if (newSearchState.lastDiscrepancy == searchState.lastDiscrepancy) {
+    if (newSearchState.lastDiscrepancy == 0) {
       newSearchState.lastDevice = true;
     }
     searchState = newSearchState;