diff --git a/Arduino/Drv/I2cDriver/I2cDriver.cpp b/Arduino/Drv/I2cDriver/I2cDriver.cpp index a592697..39223d2 100644 --- a/Arduino/Drv/I2cDriver/I2cDriver.cpp +++ b/Arduino/Drv/I2cDriver/I2cDriver.cpp @@ -35,4 +35,17 @@ Drv::I2cStatus I2cDriver ::write_handler(const FwIndexType portNum, U32 addr, Fw return write_data(addr, serBuffer); } +Drv::I2cStatus I2cDriver ::writeRead_handler(const FwIndexType portNum, U32 addr, Fw::Buffer& writeBuffer, Fw::Buffer& readBuffer) { + // Ensure buffer is not a nullptr + FW_ASSERT(writeBuffer.getData()); + FW_ASSERT(readBuffer.getData()); + + Drv::I2cStatus status = write_data(addr, writeBuffer); + if (status == Drv::I2cStatus::I2C_OK) { + return read_data(addr, readBuffer); + } + + return Drv::I2cStatus::I2C_OTHER_ERR; +} + } // end namespace Arduino diff --git a/Arduino/Drv/I2cDriver/I2cDriver.fpp b/Arduino/Drv/I2cDriver/I2cDriver.fpp index cd6ce30..94ff571 100644 --- a/Arduino/Drv/I2cDriver/I2cDriver.fpp +++ b/Arduino/Drv/I2cDriver/I2cDriver.fpp @@ -6,5 +6,7 @@ module Arduino { guarded input port read: Drv.I2c + guarded input port writeRead: Drv.I2cWriteRead + } } diff --git a/Arduino/Drv/I2cDriver/I2cDriver.hpp b/Arduino/Drv/I2cDriver/I2cDriver.hpp index 64e09b5..2770742 100644 --- a/Arduino/Drv/I2cDriver/I2cDriver.hpp +++ b/Arduino/Drv/I2cDriver/I2cDriver.hpp @@ -71,6 +71,21 @@ namespace Arduino { */ ); + //! Handler implementation for writeRead + //! + Drv::I2cStatus writeRead_handler( + const FwIndexType portNum, /*!< The port number*/ + U32 addr, /*!< + I2C slave device address + */ + Fw::Buffer &writeBuffer, /*!< + Buffer with data to read/write to/from + */ + Fw::Buffer &readBuffer /*!< + Buffer with data to read/write to/from + */ + ); + //! Stores the open wire port, POINTER_CAST so Linux and Ardunio may use different types void* m_port_pointer; diff --git a/Arduino/Drv/StreamDriver/StreamDriver.cpp b/Arduino/Drv/StreamDriver/StreamDriver.cpp index d943ddf..746f426 100644 --- a/Arduino/Drv/StreamDriver/StreamDriver.cpp +++ b/Arduino/Drv/StreamDriver/StreamDriver.cpp @@ -14,7 +14,9 @@ namespace Arduino { // ---------------------------------------------------------------------- StreamDriver ::StreamDriver(const char* compName) - : StreamDriverComponentBase(compName), m_port_number(0), m_port_pointer(nullptr) {} + : StreamDriverComponentBase(compName), m_port_number(0), m_port_pointer(nullptr) { + connection_status = ConnectionStatus::DISCONNECTED; + } StreamDriver ::~StreamDriver(void) {} @@ -26,12 +28,20 @@ void StreamDriver::recvReturnIn_handler(FwIndexType portNum, Fw::Buffer& fwBuffe this->deallocate_out(0, fwBuffer); } -Drv::ByteStreamStatus StreamDriver ::send_handler(const FwIndexType portNum, Fw::Buffer& serBuffer) { - (void) write_data(serBuffer); - return Drv::ByteStreamStatus::OP_OK; +Drv::ByteStreamStatus StreamDriver ::send_handler(const FwIndexType portNum, Fw::Buffer& serBuffer) { + Drv::ByteStreamStatus status = write_data(serBuffer); + if (status != Drv::ByteStreamStatus::OP_OK) { + connection_status = ConnectionStatus::DISCONNECTED; + } + return status; } void StreamDriver ::schedIn_handler(const FwIndexType portNum, U32 context) { + //If the connection was previously disconnected but is now available, re-configure + if ((connection_status == ConnectionStatus::DISCONNECTED) && Serial) { + connection_status = ConnectionStatus::CONNECTED; + configure(&Serial); + } if (not reinterpret_cast(m_port_pointer)->available()) { return; } diff --git a/Arduino/Drv/StreamDriver/StreamDriver.hpp b/Arduino/Drv/StreamDriver/StreamDriver.hpp index 9a384dd..135e059 100644 --- a/Arduino/Drv/StreamDriver/StreamDriver.hpp +++ b/Arduino/Drv/StreamDriver/StreamDriver.hpp @@ -61,10 +61,17 @@ class StreamDriver : public StreamDriverComponentBase { U32 context /*!< The call order*/ ); + enum ConnectionStatus { + DISCONNECTED, + CONNECTED + }; + //! Port number to open FwIndexType m_port_number; //! Stores the open stream port, POINTER_CAST so Linux and Ardunio may use different types void* m_port_pointer; + //! Stores the current connection status + ConnectionStatus connection_status; }; } // end namespace Arduino