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/I2CMaster.cpp	Mon Jul 22 11:44:07 2019 -0500
+++ b/MaximInterfaceCore/I2CMaster.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"),
@@ -35,48 +35,46 @@
 
 namespace MaximInterfaceCore {
 
-error_code I2CMaster::writeBlock(span<const uint_least8_t> data) {
-  error_code result;
-  for (span<const uint_least8_t>::index_type i = 0;
-       i < data.size() && !result; ++i) {
-    result = writeByte(data[i]);
+Result<void> I2CMaster::writeBlock(span<const uint_least8_t> data) {
+  for (span<const uint_least8_t>::index_type i = 0; i < data.size(); ++i) {
+    MaximInterfaceCore_TRY(writeByte(data[i]));
   }
-  return result;
+  return none;
 }
 
-error_code I2CMaster::doWritePacket(uint_least8_t address,
+Result<void> I2CMaster::writePacket(uint_least8_t address,
                                     span<const uint_least8_t> data,
-                                    bool sendStop) {
-  error_code result = start(address & 0xFE);
-  if (!result) {
+                                    DoStop doStop) {
+  Result<void> result = start(address & 0xFE);
+  if (result) {
     result = writeBlock(data);
   }
-  if (sendStop) {
-    error_code stopResult = stop();
-    if (!result) {
+  if (doStop == Stop || (doStop == StopOnError && !result)) {
+    const Result<void> stopResult = stop();
+    if (result) {
       result = stopResult;
     }
   }
   return result;
 }
 
-error_code I2CMaster::readBlock(AckStatus status, span<uint_least8_t> data) {
-  error_code result;
-  for (span<uint_least8_t>::index_type i = 0; i < data.size() && !result; ++i) {
-    result = readByte(i == (data.size() - 1) ? status : Ack, data[i]);
+Result<void> I2CMaster::readBlock(span<uint_least8_t> data, DoAck doAck) {
+  for (span<uint_least8_t>::index_type i = 0; i < data.size(); ++i) {
+    MaximInterfaceCore_TRY_VALUE(
+        data[i], readByte(i == (data.size() - 1) ? doAck : Ack));
   }
-  return result;
+  return none;
 }
 
-error_code I2CMaster::doReadPacket(uint_least8_t address,
-                                   span<uint_least8_t> data, bool sendStop) {
-  error_code result = start(address | 0x01);
-  if (!result) {
-    result = readBlock(Nack, data);
+Result<void> I2CMaster::readPacket(uint_least8_t address,
+                                   span<uint_least8_t> data, DoStop doStop) {
+  Result<void> result = start(address | 0x01);
+  if (result) {
+    result = readBlock(data, Nack);
   }
-  if (sendStop) {
-    error_code stopResult = stop();
-    if (!result) {
+  if (doStop == Stop || (doStop == StopOnError && !result)) {
+    const Result<void> stopResult = stop();
+    if (result) {
       result = stopResult;
     }
   }
@@ -92,10 +90,8 @@
       switch (condition) {
       case NackError:
         return "Nack Error";
-
-      default:
-        return defaultErrorMessage(condition);
       }
+      return defaultErrorMessage(condition);
     }
   } instance;
   return instance;