Program Listing for File xensiv_pas_gas_pal_ino.cpp

Return to documentation for file (src/xensiv_pas_gas_pal_ino.cpp)

                   ((x & 0xff00U) >> 8)));

#include "corelib/xensiv_pas_gas.h"
#include "corelib/xensiv_pas_gas_platform.h"
#include <Arduino.h>
#include <Wire.h>

#define XENSIV_PAS_GAS_UART_TIMEOUT_MS (500U)

#define INO_ASSERT(x)                                                                                                  \
    do                                                                                                                 \
    {                                                                                                                  \
        if (!(x))                                                                                                      \
        {                                                                                                              \
            abort();                                                                                                   \
        }                                                                                                              \
    } while (false)

int32_t xensiv_pas_gas_plat_i2c_transfer(void *ctx, uint16_t dev_addr, const uint8_t *tx_buffer, size_t tx_len,
                                         uint8_t *rx_buffer, size_t rx_len)
{
    INO_ASSERT(ctx != NULL);
    INO_ASSERT(tx_buffer != NULL);

    TwoWire *wire = (TwoWire *)ctx;
    bool send_stop = (rx_buffer != NULL) ? false : true;

    wire->beginTransmission((uint8_t)dev_addr);

    uint8_t written = wire->write(tx_buffer, tx_len);

    if (written != tx_len)
    {
        return XENSIV_PAS_GAS_ERR_COMM;
    }

    if (0 != wire->endTransmission(send_stop))
    {
        return XENSIV_PAS_GAS_ERR_COMM;
    }

    if (NULL != rx_buffer)
    {
        uint8_t bytes_read = wire->requestFrom((uint8_t)dev_addr, (uint8_t)rx_len);

        if (bytes_read != rx_len)
        {
            return XENSIV_PAS_GAS_ERR_COMM;
        }

        for (uint16_t i = 0; (i < rx_len) && (wire->available() > 0); i++)
        {
            rx_buffer[i] = wire->read();
        }

        if (0 != wire->endTransmission(true))
        {
            return XENSIV_PAS_GAS_ERR_COMM;
        }
    }

    return XENSIV_PAS_GAS_OK;
}

int32_t xensiv_pas_gas_plat_uart_read(void *ctx, uint8_t *data, size_t len)
{
    INO_ASSERT(ctx != NULL);
    INO_ASSERT(data != NULL);

    HardwareSerial *uart = (HardwareSerial *)ctx;
    uint32_t timeout = XENSIV_PAS_GAS_UART_TIMEOUT_MS;
    size_t xfer_len = 0;

    while (((size_t)(uart->available()) < len) && (timeout > 0U))
    {
        delay(1);
        timeout--;
    }

    if (timeout != 0U)
    {
        xfer_len = uart->readBytes(data, len);
    }

    return (len == xfer_len) ? XENSIV_PAS_GAS_OK : XENSIV_PAS_GAS_ERR_COMM;
}

int32_t xensiv_pas_gas_plat_uart_write(void *ctx, uint8_t *data, size_t len)
{
    INO_ASSERT(ctx != NULL);
    INO_ASSERT(data != NULL);

    HardwareSerial *uart = (HardwareSerial *)ctx;

    uart->flush();

    size_t xfer_len = uart->write(data, len);

    return (len == xfer_len) ? XENSIV_PAS_GAS_OK : XENSIV_PAS_GAS_ERR_COMM;
}

void xensiv_pas_gas_plat_delay(uint32_t ms)
{
    delay(ms);
}

uint16_t xensiv_pas_gas_plat_htons(uint16_t x)
{
    uint16_t rev_x = ((x & 0xFF) << 8) | ((x & 0xFF00) >> 8);

    return rev_x;
}

void xensiv_pas_gas_plat_assert(int expr)
{
    INO_ASSERT(expr);
}