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/MaximInterfaceCore/OneWireMaster.cpp	Mon Jul 22 11:44:07 2019 -0500
+++ b/MaximInterfaceCore/OneWireMaster.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"),
@@ -33,71 +33,62 @@
 #include "Error.hpp"
 #include "OneWireMaster.hpp"
 
+#define TRY MaximInterfaceCore_TRY
+#define TRY_VALUE MaximInterfaceCore_TRY_VALUE
+
 namespace MaximInterfaceCore {
 
 static const int maxBitNum = 7;
 
-error_code OneWireMaster::writeByteSetLevel(uint_least8_t sendByte,
-                                            Level afterLevel) {
-  error_code result;
-  for (int bitNum = 0; (bitNum <= maxBitNum) && !result; ++bitNum) {
-    result = writeBitSetLevel(((sendByte >> bitNum) & 1) == 1,
-                              (bitNum == maxBitNum) ? afterLevel : NormalLevel);
+Result<void> OneWireMaster::writeByteSetLevel(uint_least8_t sendByte,
+                                              Level afterLevel) {
+  for (int bitNum = 0; bitNum <= maxBitNum; ++bitNum) {
+    TRY(writeBitSetLevel(((sendByte >> bitNum) & 1) == 1,
+                         (bitNum == maxBitNum) ? afterLevel : NormalLevel));
   }
-  return result;
+  return none;
 }
 
-error_code OneWireMaster::readByteSetLevel(uint_least8_t & recvByte,
-                                           Level afterLevel) {
-  recvByte = 0;
-  error_code result;
+Result<uint_least8_t> OneWireMaster::readByteSetLevel(Level afterLevel) {
+  uint_least8_t recvByte = 0;
   for (int bitNum = 0; bitNum <= maxBitNum; ++bitNum) {
     bool recvBit;
-    result = readBitSetLevel(recvBit,
-                             (bitNum == maxBitNum) ? afterLevel : NormalLevel);
-    if (result) {
-      break;
-    }
+    TRY_VALUE(recvBit, readBitSetLevel((bitNum == maxBitNum) ? afterLevel
+                                                             : NormalLevel));
     if (recvBit) {
       recvByte |= (1 << bitNum);
     }
   }
-  return result;
+  return recvByte;
 }
 
-error_code OneWireMaster::writeBlock(span<const uint_least8_t> sendBuf) {
-  error_code result;
-  for (span<const uint_least8_t>::index_type i = 0;
-       i < sendBuf.size() && !result; ++i) {
-    result = writeByte(sendBuf[i]);
+Result<void> OneWireMaster::writeBlock(span<const uint_least8_t> sendBuf) {
+  for (span<const uint_least8_t>::index_type i = 0; i < sendBuf.size(); ++i) {
+    TRY(writeByte(sendBuf[i]));
   }
-  return result;
+  return none;
 }
 
-error_code OneWireMaster::readBlock(span<uint_least8_t> recvBuf) {
-  error_code result;
-  for (span<uint_least8_t>::index_type i = 0; i < recvBuf.size() && !result;
-       ++i) {
-    result = readByte(recvBuf[i]);
+Result<void> OneWireMaster::readBlock(span<uint_least8_t> recvBuf) {
+  for (span<uint_least8_t>::index_type i = 0; i < recvBuf.size(); ++i) {
+    TRY_VALUE(recvBuf[i], readByte());
   }
-  return result;
+  return none;
 }
 
-error_code OneWireMaster::triplet(TripletData & data) {
-  error_code result = readBit(data.readBit);
-  if (!result) {
-    result = readBit(data.readBitComplement);
+Result<OneWireMaster::TripletData> OneWireMaster::triplet(bool sendBit) {
+  TripletData data;
+  TRY_VALUE(data.readBit, readBit());
+  TRY_VALUE(data.readBitComplement, readBit());
+  if (data.readBit) {
+    data.writeBit = 1;
+  } else if (data.readBitComplement) {
+    data.writeBit = 0;
+  } else {
+    data.writeBit = sendBit;
   }
-  if (!result) {
-    if (data.readBit) {
-      data.writeBit = 1;
-    } else if (data.readBitComplement) {
-      data.writeBit = 0;
-    }
-    // else: use data.writeBit parameter
-    result = writeBit(data.writeBit);
-  }
-  return result;
+  TRY(writeBit(data.writeBit));
+  return data;
 }
 
 const error_category & OneWireMaster::errorCategory() {
@@ -118,10 +109,8 @@
 
       case InvalidLevelError:
         return "Invalid Level Error";
-
-      default:
-        return defaultErrorMessage(condition);
       }
+      return defaultErrorMessage(condition);
     }
   } instance;
   return instance;