picolibrary

I2C Facilities

I2C facilities are defined in the include/picolibrary/i2c.h/source/picolibrary/i2c.cc header/source file pair.

Table of Contents

  1. Device Addressing
  2. Operation Identification
  3. Response Identification
  4. Controller
  5. Device

Device Addressing

The ::picolibrary::I2C::Address_Numeric class is used to store an I2C device address in numeric (right justified) format.

::picolibrary::I2C::Address_Numeric automated tests are defined in the test/automated/picolibrary/i2c/address_numeric/main.cc source file.

A std::ostream insertion operator is defined for ::picolibrary::I2C::Address_Numeric if the PICOLIBRARY_ENABLE_AUTOMATED_TESTING project configuration option is ON. The insertion operator is defined in the include/picolibrary/testing/automated/i2c.h/source/picolibrary/testing/automated/i2c.cc header/source file pair.

The ::picolibrary::I2C::Address_Transmitted class is used to store an I2C device address in transmitted (left shifted) format.

::picolibrary::I2C::Address_Transmitted automated tests are defined in the test/automated/picolibrary/i2c/address_transmitted/main.cc source file.

A std::ostream insertion operator is defined for ::picolibrary::I2C::Address_Transmitted if the PICOLIBRARY_ENABLE_AUTOMATED_TESTING project configuration option is ON. The insertion operator is defined in the include/picolibrary/testing/automated/i2c.h/source/picolibrary/testing/automated/i2c.cc header/source file pair.

Operation Identification

The ::picolibrary::I2C::Operation enum class is used to identify I2C operations.

A std::ostream insertion operator is defined for ::picolibrary::I2C::Operation if the PICOLIBRARY_ENABLE_AUTOMATED_TESTING project configuration option is ON. The insertion operator is defined in the include/picolibrary/testing/automated/i2c.h/source/picolibrary/testing/automated/i2c.cc header/source file pair.

Response Identification

The ::picolibrary::I2C::Response enum class is used to identify I2C responses.

A std::ostream insertion operator is defined for ::picolibrary::I2C::Response if the PICOLIBRARY_ENABLE_AUTOMATED_TESTING project configuration option is ON. The insertion operator is defined in the include/picolibrary/testing/automated/i2c.h/source/picolibrary/testing/automated/i2c.cc header/source file pair.

Controller

picolibrary I2C controllers should consider the following to be fatal errors:

The ::picolibrary::I2C::Basic_Controller_Concept concept class defines the expected interface of an I2C basic controller.

The ::picolibrary::Testing::Automated::I2C::Mock_Basic_Controller mock I2C basic controller class is available if the PICOLIBRARY_ENABLE_AUTOMATED_TESTING project configuration option is ON. The mock is defined in the include/picolibrary/testing/automated/i2c.h/source/picolibrary/testing/automated/i2c.cc header/source file pair.

The ::picolibrary::I2C::Controller_Concept concept class defines the expected interface of an I2C controller.

To add I2C controller functionality to an I2C basic controller implementation, use the ::picolibrary::I2C::Controller template class. ::picolibrary::I2C::Controller automated tests are defined in the test/automated/picolibrary/i2c/controller/main.cc source file.

The ::picolibrary::Testing::Automated::I2C::Mock_Controller mock I2C controller class is available if the PICOLIBRARY_ENABLE_AUTOMATED_TESTING project configuration option is ON. The mock is defined in the include/picolibrary/testing/automated/i2c.h/source/picolibrary/testing/automated/i2c.cc header/source file pair.

The ::picolibrary::Testing::Interactive::I2C::scan() interactive test helper is available if the PICOLIBRARY_ENABLE_INTERACTIVE_TESTING project configuration option is ON. The interactive test helper is defined in the include/picolibrary/testing/interactive/i2c.h/source/picolibrary/testing/interactive/i2c.cc header/source file pair.

To ensure that I2C bus interactions are properly terminated, use the ::picolibrary::I2C::Bus_Control_Guard RAII bus control guard template class to transmit start and stop conditions. ::picolibrary::I2C::Bus_Control_Guard automated tests are defined in the test/automated/picolibrary/i2c/bus_control_guard/main.cc source file.

To check if an I2C device is responsive, use the ::picolibrary::I2C::ping() functions. ::picolibrary::I2C::ping() automated tests are defined in the test/automated/picolibrary/i2c/main.cc source file.

To scan an I2C bus, use the ::picolibrary::I2C::scan() functions. To report functor errors to the caller, use the ::picolibrary::Functor_Can_Fail_Return_Functor or ::picolibrary::Functor_Can_Fail_Discard_Functor policy. ::picolibrary::I2C::scan() automated tests are defined in the test/automated/picolibrary/i2c/main.cc source file.

#include "picolibrary/algorithm.h"
#include "picolibrary/i2c.h"
#include "picolibrary/result.h"

void foo(
    ::picolibrary::I2C::Address_Numeric address,
    ::picolibrary::I2C::Operation operation,
    ::picolibrary::I2C::Response response ) noexcept;

auto bar(
    ::picolibrary::I2C::Address_Numeric address,
    ::picolibrary::I2C::Operation operation,
    ::picolibrary::I2C::Response response ) noexcept -> Result<void>;

template<typename Controller>
auto wibble( Controller & controller ) noexcept
{
    return ::picolibrary::I2C::scan( controller, foo );
}

template<typename Controller>
auto wobble( Controller & controller ) noexcept
{
    auto result = ::picolibrary::I2C::scan<::picolibrary::Functor_Can_Fail_Return_Functor>(
        controller,
        bar );
    if ( result.is_error() ) {
        // handle error
    } // if

    return result.value();
}

template<typename Controller>
void wubble( Controller & controller ) noexcept
{
    auto result = ::picolibrary::I2C::scan<::picolibrary::Functor_Can_Fail_Discard_Functor>(
        controller,
        bar );
    if ( result.is_error() ) {
        // handle error
    } // if
}

Device

The ::picolibrary::I2C::Device_Address_Numeric class is used to restrict ::picolibrary::I2C::Address_Numeric to the range of I2C device addresses used by a specific type of I2C device.

The ::picolibrary::I2C::Device_Address_Transmitted class is used to restrict ::picolibrary::I2C::Address_Transmitted to the range of I2C device addresses used by a specific type of I2C device.

The ::picolibrary::I2C::Device template class implements low level functionality for interacting with an I2C device. If an I2C bus does not have any multiplexers, use the ::picolibrary::I2C::Bus_Multiplexer_Aligner class as a device’s bus multiplexer aligner.

::picolibrary::I2C::Device automated tests are defined in the test/automated/picolibrary/i2c/device/main.cc source file.

The ::picolibrary::Testing::Automated::I2C::Mock_Device mock I2C device class is available if the PICOLIBRARY_ENABLE_AUTOMATED_TESTING project configuration option is ON. The mock is defined in the include/picolibrary/testing/automated/i2c.h/source/picolibrary/testing/automated/i2c.cc header/source file pair.