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:
10:947d3f44e0a0
--- a/MaximInterfaceCore/RunCommand.cpp	Mon Jul 22 11:44:07 2019 -0500
+++ b/MaximInterfaceCore/RunCommand.cpp	Mon Sep 16 11:13:37 2019 -0500
@@ -1,5 +1,5 @@
 /*******************************************************************************
-* Copyright (C) 2018 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"),
@@ -30,7 +30,7 @@
 * ownership rights.
 *******************************************************************************/
 
-#include "crc.hpp"
+#include "Crc.hpp"
 #include "Error.hpp"
 #include "I2CMaster.hpp"
 #include "OneWireMaster.hpp"
@@ -58,37 +58,37 @@
   return instance;
 }
 
-error_code RunCommandWithOneWireMaster::
+Result<span<uint_least8_t> > RunCommandWithOneWireMaster::
 operator()(span<const uint_least8_t> request, int delayTime,
-           span<uint_least8_t> & response) const {
+           span<uint_least8_t> response) const {
   // Write request.
-  error_code result = selectRom(*master);
-  if (result) {
-    return result;
+  Result<void> result = selectRom(*master);
+  if (!result) {
+    return result.error();
   }
   uint_least8_t xpcBuffer[2] = {0x66,
                                 static_cast<uint_least8_t>(request.size())};
   result = master->writeBlock(xpcBuffer);
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
   result = master->writeBlock(request);
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
   uint_fast16_t expectedCrc =
       calculateCrc16(calculateCrc16(xpcBuffer), request) ^ 0xFFFFu;
   result = master->readBlock(xpcBuffer);
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
   if (expectedCrc !=
       ((static_cast<uint_fast16_t>(xpcBuffer[1]) << 8) | xpcBuffer[0])) {
-    return make_error_code(CrcError);
+    return CrcError;
   }
   result = master->writeBytePower(0xAA);
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
 
   // Wait for device to process.
@@ -96,33 +96,33 @@
 
   // Read response.
   result = master->setLevel(OneWireMaster::NormalLevel);
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
   result = master->readBlock(xpcBuffer);
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
   if (xpcBuffer[1] > response.size()) {
-    return make_error_code(InvalidResponseError);
+    return InvalidResponseError;
   }
   response = response.first(xpcBuffer[1]);
   result = master->readBlock(response);
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
   expectedCrc =
       calculateCrc16(calculateCrc16(make_span(xpcBuffer + 1, 1)), response) ^
       0xFFFFu;
   result = master->readBlock(xpcBuffer);
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
   if (expectedCrc !=
       ((static_cast<uint_fast16_t>(xpcBuffer[1]) << 8) | xpcBuffer[0])) {
-    return make_error_code(CrcError);
+    return CrcError;
   }
-  return result;
+  return response;
 }
 
 const error_category & RunCommandWithI2CMaster::errorCategory() {
@@ -141,41 +141,42 @@
   return instance;
 }
 
-error_code RunCommandWithI2CMaster::
+Result<span<uint_least8_t> > RunCommandWithI2CMaster::
 operator()(span<const uint_least8_t> request, int delayTime,
-           span<uint_least8_t> & response) const {
+           span<uint_least8_t> response) const {
   // Write request.
-  error_code result = master->start(address_);
-  if (result == make_error_condition(I2CMaster::NackError) && address_ != 0) {
+  Result<void> result = master->start(address_);
+  if (!result && result.error() == make_error_condition(I2CMaster::NackError) &&
+      address_ != 0) {
     result = master->start(0);
   }
-  if (result) {
+  if (!result) {
     master->stop();
-    return result;
+    return result.error();
   }
   if (!request.empty()) {
     result = master->writeByte(request[0]);
-    if (result) {
+    if (!result) {
       master->stop();
-      return result;
+      return result.error();
     }
     request = request.subspan(1);
     if (!request.empty()) {
       result = master->writeByte(static_cast<uint_least8_t>(request.size()));
-      if (result) {
+      if (!result) {
         master->stop();
-        return result;
+        return result.error();
       }
       result = master->writeBlock(request);
-      if (result) {
+      if (!result) {
         master->stop();
-        return result;
+        return result.error();
       }
     }
   }
   result = master->stop();
-  if (result) {
-    return result;
+  if (!result) {
+    return result.error();
   }
 
   // Wait for device to process.
@@ -183,28 +184,32 @@
 
   // Read response.
   result = master->start(address_ | 1);
-  if (result) {
+  if (!result) {
     master->stop();
-    return result;
+    return result.error();
   }
   uint_least8_t length;
-  result = master->readByte(I2CMaster::Ack, length);
-  if (result) {
+  if (const Result<uint_least8_t> result = master->readByte(I2CMaster::Ack)) {
+    length = result.value();
+  } else {
     master->stop();
-    return result;
+    return result.error();
   }
   if (length > response.size()) {
     master->stop();
-    return make_error_code(InvalidResponseError);
+    return InvalidResponseError;
   }
   response = response.first(length);
-  result = master->readBlock(I2CMaster::Nack, response);
-  if (result) {
+  result = master->readBlock(response, I2CMaster::Nack);
+  if (!result) {
     master->stop();
-    return result;
+    return result.error();
   }
   result = master->stop();
-  return result;
+  if (!result) {
+    return result.error();
+  }
+  return response;
 }
 
 } // namespace MaximInterfaceCore