Skip to content

File wiring_private.h

File List > arduino > src > wiring > wiring_private.h

Go to the documentation of this file.

/* Copyright (c) Kuba Szczodrzyński 2023-05-24. */

#pragma once

#include <Arduino.h>

#if __has_include(<sdk_private.h>)
#include <sdk_private.h>
#endif

#if __has_include(<wiring_data.h>)
#include <wiring_data.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

PinData *pinData(PinInfo *pin);
void pinRemoveData(PinInfo *pin);

inline void pinEnable(PinInfo *pin, uint32_t mask) {
    pin->enabled |= mask;
}

inline void pinDisable(PinInfo *pin, uint32_t mask) {
    pin->enabled &= ~mask;
}

#define pinCheckGetInfo(pinNumber, mask, ret) \
    PinInfo *pin = pinInfo(pinNumber);        \
    if (!pin)                                 \
        return ret;                           \
    if (!pinSupported(pin, mask))             \
        return ret;

#define pinCheckGetData(pinNumber, mask, ret) \
    PinInfo *pin = pinInfo(pinNumber);        \
    if (!pin)                                 \
        return ret;                           \
    if (!pinSupported(pin, mask))             \
        return ret;                           \
    PinData *data = pinData(pin);

#define pinIsOutput(pin, data) (pinEnabled(pin, PIN_GPIO) && (data->gpioMode ^ 0b101) < 5)
#define pinIsInput(pin, data)  (pinEnabled(pin, PIN_GPIO) && (data->gpioMode ^ 0b101) > 4)

#define pinSetOutputPull(pin, data, pinNumber, status)     \
    do {                                                   \
        if (!pinIsOutput(pin, data)) {                     \
            pinMode(pinNumber, INPUT_PULLDOWN ^ !!status); \
            return;                                        \
        }                                                  \
    } while (0);

#define pinSetInputMode(pin, data, pinNumber) \
    do {                                      \
        if (!pinIsInput(pin, data))           \
            pinMode(pinNumber, INPUT);        \
    } while (0);

#ifdef __cplusplus
} // extern "C"
#endif