10#if LGPIO_VERSION < 0x00020200
11 #warning "lgpio version is lower than 0.2.2 - some functionality (e.g. pull-up control) may be unavailable!"
14#define PI_RISING (LG_RISING_EDGE)
15#define PI_FALLING (LG_FALLING_EDGE)
18#define PI_MAX_USER_GPIO (31)
21#define RADIOLIB_ERR_HAL_PI_GPIO_HANDLE_FAILED RADIOLIB_ERR_HAL(-1)
22#define RADIOLIB_ERR_HAL_PI_SPI_HANDLE_FAILED RADIOLIB_ERR_HAL(-2)
23#define RADIOLIB_ERR_HAL_PI_SPI_XFER_FAILED RADIOLIB_ERR_HAL(-3)
26static void lgpioAlertHandler(
int num_alerts, lgGpioAlert_p alerts,
void *userdata);
35 PiHal(uint8_t spiChannel, uint32_t spiSpeed = 2000000, uint8_t spiDevice = 0, uint8_t gpioDevice = 0)
36 :
RadioLibHal(PI_INPUT, PI_OUTPUT, LG_LOW, LG_HIGH, PI_RISING, PI_FALLING),
37 _gpioDevice(gpioDevice),
38 _spiDevice(spiDevice),
40 _spiChannel(spiChannel) {
44 if(_gpioHandle != -1) {
50 if((_gpioHandle = lgGpiochipOpen(_gpioDevice)) < 0) {
51 fprintf(stderr,
"Could not open GPIO chip: %s\n", lguErrorText(_gpioHandle));
52 return(RADIOLIB_ERR_HAL_PI_GPIO_HANDLE_FAILED);
64 lgGpiochipClose(_gpioHandle);
71 void pinMode(uint32_t pin, uint32_t mode)
override {
72 if(pin == RADIOLIB_NC) {
79 result = lgGpioClaimInput(_gpioHandle, pinFlags[pin], pin);
82 result = lgGpioClaimOutput(_gpioHandle, pinFlags[pin], pin, LG_HIGH);
85 fprintf(stderr,
"Unknown pinMode mode %" PRIu32
"\n", mode);
90 fprintf(stderr,
"Could not claim pin %" PRIu32
" for mode %" PRIu32
": %s\n",
91 pin, mode, lguErrorText(result));
96 if(pin == RADIOLIB_NC) {
100 int result = lgGpioWrite(_gpioHandle, pin, value);
102 fprintf(stderr,
"Error writing value to pin %" PRIu32
": %s\n", pin, lguErrorText(result));
107 if(pin == RADIOLIB_NC) {
111 int result = lgGpioRead(_gpioHandle, pin);
113 fprintf(stderr,
"Error writing reading from pin %" PRIu32
": %s\n", pin, lguErrorText(result));
118 void attachInterrupt(uint32_t interruptNum,
void (*interruptCb)(
void), uint32_t mode)
override {
119 if((interruptNum == RADIOLIB_NC) || (interruptNum > PI_MAX_USER_GPIO)) {
124 int result = lgGpioClaimAlert(_gpioHandle, 0, mode, interruptNum, -1);
126 fprintf(stderr,
"Could not claim pin %" PRIu32
" for alert: %s\n", interruptNum, lguErrorText(result));
131 interruptEnabled[interruptNum] =
true;
132 interruptCallbacks[interruptNum] = interruptCb;
137 lgGpioSetAlertsFunc(_gpioHandle, interruptNum, lgpioAlertHandler, (
void *)
this);
141 if((interruptNum == RADIOLIB_NC) || (interruptNum > PI_MAX_USER_GPIO)) {
146 interruptEnabled[interruptNum] =
false;
147 interruptModes[interruptNum] = 0;
148 interruptCallbacks[interruptNum] = NULL;
151 lgGpioFree(_gpioHandle, interruptNum);
152 lgGpioSetAlertsFunc(_gpioHandle, interruptNum, NULL, NULL);
155 void delay(
unsigned long ms)
override {
161 lguSleep(ms / 1000.0);
170 lguSleep(us / 1000000.0);
178 uint32_t time = lguTimestamp() / 1000000UL;
183 uint32_t time = lguTimestamp() / 1000UL;
187 long pulseIn(uint32_t pin, uint32_t state,
unsigned long timeout)
override {
188 if(pin == RADIOLIB_NC) {
193 uint32_t start = this->
micros();
194 uint32_t curtick = this->
micros();
197 if((this->
micros() - curtick) > timeout) {
202 return(this->
micros() - start);
207 if((_spiHandle = lgSpiOpen(_spiDevice, _spiChannel, _spiSpeed, 0)) < 0) {
208 fprintf(stderr,
"Could not open SPI handle on 0: %s\n", lguErrorText(_spiHandle));
209 return(RADIOLIB_ERR_HAL_PI_SPI_HANDLE_FAILED);
219 int result = lgSpiXfer(_spiHandle, (
char *)out, (
char*)in, len);
221 fprintf(stderr,
"Could not perform SPI transfer: %s\n", lguErrorText(result));
222 return(RADIOLIB_ERR_HAL_PI_SPI_XFER_FAILED);
230 if(_spiHandle >= 0) {
231 lgSpiClose(_spiHandle);
237 void tone(uint32_t pin,
unsigned int frequency,
unsigned long duration = 0) {
238 lgTxPwm(_gpioHandle, pin, frequency, 50, 0, duration);
242 lgTxPwm(_gpioHandle, pin, 0, 0, 0, 0);
245#if LGPIO_VERSION > 0x00010000
246 void pullUpDown(uint32_t pin,
bool enable,
bool up) {
247 if((pin == RADIOLIB_NC) || (pin > PI_MAX_USER_GPIO)) {
251 pinFlags[pin] = enable ? (up ? LG_SET_PULL_UP : LG_SET_PULL_DOWN) : LG_SET_PULL_NONE;
256 bool interruptEnabled[PI_MAX_USER_GPIO + 1];
257 uint32_t interruptModes[PI_MAX_USER_GPIO + 1];
258 typedef void (*RadioLibISR)(void);
259 RadioLibISR interruptCallbacks[PI_MAX_USER_GPIO + 1];
263 const uint8_t _gpioDevice;
264 const uint8_t _spiDevice;
265 const unsigned int _spiSpeed;
266 const uint8_t _spiChannel;
267 int _gpioHandle = -1;
270 int pinFlags[PI_MAX_USER_GPIO + 1] = { 0 };
274static void lgpioAlertHandler(
int num_alerts, lgGpioAlert_p alerts,
void *userdata) {
282 for(lgGpioAlert_t *alert = alerts; alert < (alerts + num_alerts); alert++) {
283 if((hal->interruptEnabled[alert->report.gpio]) &&
284 (hal->interruptModes[alert->report.gpio] == alert->report.level) &&
285 (hal->interruptCallbacks[alert->report.gpio])) {
286 hal->interruptCallbacks[alert->report.gpio]();
void noTone(uint32_t pin)
Method to stop producing a tone.
Definition PiHal.h:241
unsigned long millis() override
Get number of milliseconds since start. Must be implemented by the platform-specific hardware abstrac...
Definition PiHal.h:177
int16_t term() override
Module termination method. This will be called by all radio modules when the destructor is called....
Definition PiHal.h:59
void digitalWrite(uint32_t pin, uint32_t value) override
Digital write method. Must be implemented by the platform-specific hardware abstraction!
Definition PiHal.h:95
long pulseIn(uint32_t pin, uint32_t state, unsigned long timeout) override
Measure the length of incoming digital pulse in microseconds. Must be implemented by the platform-spe...
Definition PiHal.h:187
int16_t init() override
Module initialization method. This will be called by all radio modules at the beginning of startup....
Definition PiHal.h:43
int16_t spiTransfer(uint8_t *out, size_t len, uint8_t *in)
Method to transfer buffer over SPI.
Definition PiHal.h:218
void spiEndTransaction()
Method to end SPI transaction.
Definition PiHal.h:227
int16_t spiEnd()
SPI termination method.
Definition PiHal.h:229
int16_t spiBegin()
SPI initialization method.
Definition PiHal.h:205
void tone(uint32_t pin, unsigned int frequency, unsigned long duration=0)
Method to produce a square-wave with 50% duty cycle ("tone") of a given frequency at some pin.
Definition PiHal.h:237
unsigned long micros() override
Get number of microseconds since start. Must be implemented by the platform-specific hardware abstrac...
Definition PiHal.h:182
void spiBeginTransaction()
Method to start SPI transaction.
Definition PiHal.h:216
uint32_t digitalRead(uint32_t pin) override
Digital read method. Must be implemented by the platform-specific hardware abstraction!
Definition PiHal.h:106
void delayMicroseconds(unsigned long us) override
Blocking microsecond wait function. Must be implemented by the platform-specific hardware abstraction...
Definition PiHal.h:164
void attachInterrupt(uint32_t interruptNum, void(*interruptCb)(void), uint32_t mode) override
Method to attach function to an external interrupt. Must be implemented by the platform-specific hard...
Definition PiHal.h:118
void pinMode(uint32_t pin, uint32_t mode) override
GPIO pin mode (input/output/...) configuration method. Must be implemented by the platform-specific h...
Definition PiHal.h:71
void delay(unsigned long ms) override
Blocking wait function. Must be implemented by the platform-specific hardware abstraction!
Definition PiHal.h:155
void yield() override
Yield method, called from long loops in multi-threaded environment (to prevent blocking other threads...
Definition PiHal.h:173
void detachInterrupt(uint32_t interruptNum) override
Method to detach function from an external interrupt. Must be implemented by the platform-specific ha...
Definition PiHal.h:140
const uint32_t GpioInterruptFalling
Value to be used as the "falling" GPIO level change direction.
Definition Hal.h:52
virtual void pullUpDown(uint32_t pin, bool enable, bool up)
Enable or disable pull up or pull down for a specific pin.
Definition Hal.cpp:45
RadioLibHal(const uint32_t input, const uint32_t output, const uint32_t low, const uint32_t high, const uint32_t rising, const uint32_t falling)
Default constructor.
Definition Hal.cpp:5
#define RADIOLIB_ERR_NONE
No error, method executed successfully.
Definition TypeDef.h:109