8#include <pico/stdlib.h>
9#include "hardware/spi.h"
10#include "hardware/timer.h"
11#include "hardware/pwm.h"
12#include "hardware/clocks.h"
13#include "pico/multicore.h"
16unsigned int toneLoopFrequency;
17unsigned long toneLoopDuration;
21#define SLEEP_1200 416.666
22#define SLEEP_2200 227.272
29 gpio_set_dir(toneLoopPin, GPIO_OUT);
32 if (toneLoopFrequency == 1200) {
33 sleep_dur = SLEEP_1200;
34 }
else if (toneLoopFrequency == 2200) {
35 sleep_dur = SLEEP_2200;
37 sleep_dur = 500000 / toneLoopFrequency;
43 gpio_put(toneLoopPin, 1);
45 gpio_put(toneLoopPin, 0);
47 tight_loop_contents();
57 PicoHal(spi_inst_t *spiChannel, uint32_t misoPin, uint32_t mosiPin, uint32_t sckPin, uint32_t spiSpeed = 500 * 1000)
58 :
RadioLibHal(GPIO_IN, GPIO_OUT, 0, 1, GPIO_IRQ_EDGE_RISE, GPIO_IRQ_EDGE_FALL),
59 _spiChannel(spiChannel),
76 void pinMode(uint32_t pin, uint32_t mode)
override {
77 if (pin == RADIOLIB_NC) {
82 gpio_set_dir(pin, mode);
86 if (pin == RADIOLIB_NC) {
90 gpio_put(pin, (
bool)value);
94 if (pin == RADIOLIB_NC) {
101 void attachInterrupt(uint32_t interruptNum,
void (*interruptCb)(
void), uint32_t mode)
override {
102 if (interruptNum == RADIOLIB_NC) {
106 gpio_set_irq_enabled_with_callback(interruptNum, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL,
true, (gpio_irq_callback_t)interruptCb);
110 if (interruptNum == RADIOLIB_NC) {
114 gpio_set_irq_enabled_with_callback(interruptNum, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL,
false, NULL);
117 void delay(
unsigned long ms)
override {
126 return to_ms_since_boot(get_absolute_time());
130 return to_us_since_boot(get_absolute_time());
133 long pulseIn(uint32_t pin, uint32_t state,
unsigned long timeout)
override {
134 if (pin == RADIOLIB_NC) {
139 uint32_t start = this->
micros();
140 uint32_t curtick = this->
micros();
143 if ((this->
micros() - curtick) > timeout) {
148 return (this->
micros() - start);
151 void tone(uint32_t pin,
unsigned int frequency,
unsigned long duration = 0)
override {
153 multicore_reset_core1();
155 toneLoopFrequency = frequency;
156 toneLoopDuration = duration;
157 multicore_launch_core1(toneLoop);
161 multicore_reset_core1();
165 spi_init(_spiChannel, _spiSpeed);
166 spi_set_format(_spiChannel, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
168 gpio_set_function(_sckPin, GPIO_FUNC_SPI);
169 gpio_set_function(_mosiPin, GPIO_FUNC_SPI);
170 gpio_set_function(_misoPin, GPIO_FUNC_SPI);
176 spi_write_read_blocking(_spiChannel, out, in, len);
180 tight_loop_contents();
186 spi_deinit(_spiChannel);
191 spi_inst_t *_spiChannel;
void delay(unsigned long ms) override
Blocking wait function. Must be implemented by the platform-specific hardware abstraction!
Definition PicoHal.h:117
uint32_t digitalRead(uint32_t pin) override
Digital read method. Must be implemented by the platform-specific hardware abstraction!
Definition PicoHal.h:93
void term() override
Module termination method. This will be called by all radio modules when the destructor is called....
Definition PicoHal.h:70
void spiBeginTransaction()
Method to start SPI transaction.
Definition PicoHal.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 PicoHal.h:109
unsigned long micros() override
Get number of microseconds since start. Must be implemented by the platform-specific hardware abstrac...
Definition PicoHal.h:129
void spiBegin()
SPI initialization method.
Definition PicoHal.h:164
void delayMicroseconds(unsigned long us) override
Blocking microsecond wait function. Must be implemented by the platform-specific hardware abstraction...
Definition PicoHal.h:121
unsigned long millis() override
Get number of milliseconds since start. Must be implemented by the platform-specific hardware abstrac...
Definition PicoHal.h:125
void digitalWrite(uint32_t pin, uint32_t value) override
Digital write method. Must be implemented by the platform-specific hardware abstraction!
Definition PicoHal.h:85
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 PicoHal.h:133
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 PicoHal.h:101
void init() override
Module initialization method. This will be called by all radio modules at the beginning of startup....
Definition PicoHal.h:65
void tone(uint32_t pin, unsigned int frequency, unsigned long duration=0) override
Method to produce a square-wave with 50% duty cycle ("tone") of a given frequency at some pin.
Definition PicoHal.h:151
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 PicoHal.h:76
void spiEnd()
SPI termination method.
Definition PicoHal.h:185
void spiTransfer(uint8_t *out, size_t len, uint8_t *in)
Method to transfer buffer over SPI.
Definition PicoHal.h:175
void yield() override
Yield method, called from long loops in multi-threaded environment (to prevent blocking other threads...
Definition PicoHal.h:179
void spiEndTransaction()
Method to end SPI transaction.
Definition PicoHal.h:183
void noTone(uint32_t pin) override
Method to stop producing a tone.
Definition PicoHal.h:160
Hardware abstraction library base interface.
Definition Hal.h:13