Device interface library for multiple platforms including Mbed.

Dependents:   DeepCover Embedded Security in IoT MaximInterface MAXREFDES155#

Maxim Interface is a library framework focused on providing flexible and expressive hardware interfaces. Both communication interfaces such as I2C and 1-Wire and device interfaces such as DS18B20 are supported. Modern C++ concepts are used extensively while keeping compatibility with C++98/C++03 and requiring no external dependencies. The embedded-friendly design does not depend on exceptions or RTTI.

The full version of the project is hosted on GitLab: https://gitlab.com/iabenz/MaximInterface

Revision:
8:5ea891c7d1a1
Parent:
7:9cd16581b578
Child:
11:3f3bf6bf5e6c
--- a/MaximInterfaceDevices/DS1920.cpp	Mon Jul 22 11:44:07 2019 -0500
+++ b/MaximInterfaceDevices/DS1920.cpp	Mon Sep 16 11:13:37 2019 -0500
@@ -1,5 +1,5 @@
 /*******************************************************************************
-* Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
+* Copyright (C) Maxim Integrated Products, Inc., All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -38,38 +38,42 @@
 
 using namespace Core;
 
-error_code DS1920::writeScratchpad(uint_least8_t th, uint_least8_t tl) {
-  error_code result = selectRom(*master);
-  if (!result) {
+Result<void> DS1920::writeScratchpad(uint_least8_t th, uint_least8_t tl) {
+  Result<void> result = selectRom(*master);
+  if (result) {
     const uint_least8_t sendBlock[] = {0x4E, th, tl};
     result = master->writeBlock(sendBlock);
   }
   return result;
 }
 
-error_code DS1920::readScratchpad(Scratchpad::span scratchpad) {
-  error_code result = selectRom(*master);
+Result<DS1920::Scratchpad> DS1920::readScratchpad() const {
+  Result<void> result = selectRom(*master);
+  if (!result) {
+    return result.error();
+  }
+  result = master->writeByte(0xBE);
   if (!result) {
-    result = master->writeByte(0xBE);
-    if (!result) {
-      result = master->readBlock(scratchpad);
-      if (!result) {
-        uint_least8_t receivedCrc;
-        result = master->readByte(receivedCrc);
-        if (!result && (receivedCrc != calculateCrc8(scratchpad))) {
-          result = make_error_code(CrcError);
-        }
-      }
-    }
+    return result.error();
+  }
+  Scratchpad scratchpad;
+  result = master->readBlock(scratchpad);
+  if (!result) {
+    return result.error();
   }
-  return result;
+  uint_least8_t receivedCrc;
+  MaximInterfaceCore_TRY_VALUE(receivedCrc, master->readByte());
+  if (receivedCrc != calculateCrc8(scratchpad)) {
+    return CrcError;
+  }
+  return scratchpad;
 }
 
-error_code DS1920::copyScratchpad() {
-  error_code result = selectRom(*master);
-  if (!result) {
+Result<void> DS1920::copyScratchpad() {
+  Result<void> result = selectRom(*master);
+  if (result) {
     result = master->writeByteSetLevel(0x48, OneWireMaster::StrongLevel);
-    if (!result) {
+    if (result) {
       sleep->invoke(10);
       result = master->setLevel(OneWireMaster::NormalLevel);
     }
@@ -77,11 +81,11 @@
   return result;
 }
 
-error_code DS1920::convertTemperature() {
-  error_code result = selectRom(*master);
-  if (!result) {
+Result<void> DS1920::convertTemperature() {
+  Result<void> result = selectRom(*master);
+  if (result) {
     result = master->writeByteSetLevel(0x44, OneWireMaster::StrongLevel);
-    if (!result) {
+    if (result) {
       sleep->invoke(750);
       result = master->setLevel(OneWireMaster::NormalLevel);
     }
@@ -89,9 +93,9 @@
   return result;
 }
 
-error_code DS1920::recallEeprom() {
-  error_code result = selectRom(*master);
-  if (!result) {
+Result<void> DS1920::recallEeprom() {
+  Result<void> result = selectRom(*master);
+  if (result) {
     result = master->writeByte(0xB8);
   }
   return result;
@@ -109,39 +113,32 @@
 
       case DataError:
         return "Data Error";
-
-      default:
-        return defaultErrorMessage(condition);
       }
+      return defaultErrorMessage(condition);
     }
   } instance;
   return instance;
 }
 
-error_code readTemperature(DS1920 & ds1920, int & temperature) {
-  error_code result = ds1920.convertTemperature();
-  if (result) {
-    return result;
-  }
-  DS1920::Scratchpad::array scratchpad;
-  result = ds1920.readScratchpad(scratchpad);
-  if (result) {
-    return result;
-  }
+Result<int> readTemperature(DS1920 & ds1920) {
+  MaximInterfaceCore_TRY(ds1920.convertTemperature());
+  DS1920::Scratchpad scratchpad;
+  MaximInterfaceCore_TRY_VALUE(scratchpad, ds1920.readScratchpad());
 
   unsigned int tempData =
       (static_cast<unsigned int>(scratchpad[1]) << 8) | scratchpad[0];
   const unsigned int signMask = 0xFF00;
+  int temperature;
   if ((tempData & signMask) == signMask) {
     temperature = -0x100;
     tempData &= ~signMask;
   } else if ((tempData & signMask) == 0) {
     temperature = 0;
   } else {
-    return make_error_code(DS1920::DataError);
+    return DS1920::DataError;
   }
   temperature += static_cast<int>(tempData);
-  return error_code();
+  return temperature;
 }
 
 } // namespace MaximInterfaceDevices