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
--- a/MaximInterfaceCore/I2CMaster.hpp	Mon Jul 22 11:44:07 2019 -0500
+++ b/MaximInterfaceCore/I2CMaster.hpp	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"),
@@ -30,11 +30,12 @@
 * ownership rights.
 *******************************************************************************/
 
-#ifndef MaximInterfaceCore_I2CMaster
-#define MaximInterfaceCore_I2CMaster
+#ifndef MaximInterfaceCore_I2CMaster_hpp
+#define MaximInterfaceCore_I2CMaster_hpp
 
 #include <stdint.h>
 #include "Config.hpp"
+#include "Result.hpp"
 #include "span.hpp"
 #include "system_error.hpp"
 
@@ -47,69 +48,58 @@
     NackError = 1 ///< Transaction stopped due to a NACK from the slave device.
   };
 
-  enum AckStatus { Nack, Ack };
+  enum DoAck { Ack, Nack };
+
+  enum DoStop { Stop, StopOnError, NoStop };
 
   virtual ~I2CMaster() {}
 
   /// @brief Send start condition and address on the bus.
   /// @param address Address with R/W bit.
-  virtual error_code start(uint_least8_t address) = 0;
+  virtual Result<void> start(uint_least8_t address) = 0;
 
   /// Send stop condition on the bus.
-  virtual error_code stop() = 0;
+  virtual Result<void> stop() = 0;
 
   /// Write data byte to the bus.
-  virtual error_code writeByte(uint_least8_t data) = 0;
+  virtual Result<void> writeByte(uint_least8_t data) = 0;
 
   /// Write data block to the bus.
-  MaximInterfaceCore_EXPORT virtual error_code
+  MaximInterfaceCore_EXPORT virtual Result<void>
   writeBlock(span<const uint_least8_t> data);
 
-  /// @brief
-  /// Perform a complete write transaction on the bus with optional stop
-  /// condition.
+  /// @brief Perform a complete write transaction on the bus.
   /// @param address Address in 8-bit format.
   /// @param data Data to write to the bus.
-  /// @param sendStop
-  /// True to send a stop condition or false to set up a repeated start.
-  error_code writePacket(uint_least8_t address, span<const uint_least8_t> data,
-                         bool sendStop = true) {
-    return doWritePacket(address, data, sendStop);
-  }
+  /// @param doStop
+  /// Determines whether to do a stop condition or set up a repeated start.
+  MaximInterfaceCore_EXPORT virtual Result<void>
+  writePacket(uint_least8_t address, span<const uint_least8_t> data,
+              DoStop doStop);
 
   /// @brief Read data byte from the bus.
-  /// @param status Determines whether an ACK or NACK is sent after reading.
-  /// @param[out] data Data read from the bus if successful.
-  virtual error_code readByte(AckStatus status, uint_least8_t & data) = 0;
+  /// @param doAck Determines whether an ACK or NACK is done after reading.
+  /// @returns data Data read from the bus if successful.
+  virtual Result<uint_least8_t> readByte(DoAck doAck) = 0;
 
   /// @brief Read data block from the bus.
-  /// @param status Determines whether an ACK or NACK is sent after reading.
   /// @param[out] data Data read from the bus if successful.
-  MaximInterfaceCore_EXPORT virtual error_code
-  readBlock(AckStatus status, span<uint_least8_t> data);
+  /// @param doAck Determines whether an ACK or NACK is done after reading.
+  MaximInterfaceCore_EXPORT virtual Result<void>
+  readBlock(span<uint_least8_t> data, DoAck doAck);
 
-  /// @brief
-  /// Perform a complete read transaction on the bus with optional stop
-  /// condition.
+  /// @brief Perform a complete read transaction on the bus.
   /// @param address Address in 8-bit format.
   /// @param[out] data Data read from the bus if successful.
-  /// @param sendStop
-  /// True to send a stop condition or false to set up a repeated start.
-  error_code readPacket(uint_least8_t address, span<uint_least8_t> data,
-                        bool sendStop = true) {
-    return doReadPacket(address, data, sendStop);
-  }
+  /// @param doStop
+  /// Determines whether to do a stop condition or set up a repeated start.
+  MaximInterfaceCore_EXPORT virtual Result<void>
+  readPacket(uint_least8_t address, span<uint_least8_t> data, DoStop doStop);
 
   MaximInterfaceCore_EXPORT static const error_category & errorCategory();
+};
 
-protected:
-  MaximInterfaceCore_EXPORT virtual error_code
-  doWritePacket(uint_least8_t address, span<const uint_least8_t> data,
-                bool sendStop);
-
-  MaximInterfaceCore_EXPORT virtual error_code
-  doReadPacket(uint_least8_t address, span<uint_least8_t> data, bool sendStop);
-};
+template <> struct is_error_code_enum<I2CMaster::ErrorValue> : true_type {};
 
 inline error_code make_error_code(I2CMaster::ErrorValue e) {
   return error_code(e, I2CMaster::errorCategory());