25#include <kernel/scheduler/scheduler.h>
36 if (state.irq_wait_thread)
38 state.irq_wait_thread->IRQwakeup();
39 if (state.irq_wait_thread->IRQgetPriority() >
40 miosix::Thread::IRQgetCurrentThread()->IRQgetPriority())
42 miosix::Scheduler::IRQfindNextThread();
45 state.irq_wait_thread =
nullptr;
49void SX1278Common::enableIrqs()
56void SX1278Common::disableIrqs()
67 miosix::Lock<miosix::FastMutex> lock(mutex);
80 miosix::FastInterruptDisableLock lock;
81 state.irq_wait_thread = miosix::Thread::IRQgetCurrentThread();
88 if (!waitForIrqInner(
guard, unlock))
115 const unsigned int DELAY = 100;
118 for (
unsigned int i = 0; i < 1000 /
DELAY; i++)
124 miosix::delayUs(
DELAY);
131bool SX1278Common::waitForIrqInner(LockMode& _guard,
bool unlock)
142 miosix::TimedWaitResult result = miosix::TimedWaitResult::NoTimeout;
145 miosix::FastInterruptDisableLock lock;
146 while (state.irq_wait_thread &&
147 result == miosix::TimedWaitResult::NoTimeout)
150 lock, start + IRQ_TIMEOUT);
159 return result == miosix::TimedWaitResult::NoTimeout;
179SX1278Common::DeviceState SX1278Common::lockMode(Mode mode,
DioMapping mapping,
185 DeviceState old_state = state;
187 enterMode(mode, mapping, dio1_trigger, tx_frontend, rx_frontend);
188 state.irq_wait_thread =
nullptr;
193void SX1278Common::unlockMode(DeviceState old_state)
196 state.irq_wait_thread = old_state.irq_wait_thread;
197 enterMode(old_state.mode, old_state.mapping, old_state.dio1_trigger,
198 old_state.is_tx_frontend_on, old_state.is_rx_frontend_on);
201void SX1278Common::lock() { mutex.lock(); }
203void SX1278Common::unlock() { mutex.unlock(); }
205void SX1278Common::enterMode(Mode mode,
DioMapping mapping,
207 bool set_tx_frontend_on,
bool set_rx_frontend_on)
213 if (set_tx_frontend_on != state.is_tx_frontend_on && !set_tx_frontend_on)
216 if (set_rx_frontend_on != state.is_rx_frontend_on && !set_rx_frontend_on)
220 if (set_tx_frontend_on != state.is_tx_frontend_on && set_tx_frontend_on)
223 if (set_rx_frontend_on != state.is_rx_frontend_on && set_rx_frontend_on)
226 state.is_tx_frontend_on = set_tx_frontend_on;
227 state.is_rx_frontend_on = set_rx_frontend_on;
229 if (mode != state.mode)
236 if (dio1_trigger != state.dio1_trigger)
239 state.dio1_trigger = dio1_trigger;
243 if (mapping != state.mapping)
246 state.mapping = mapping;
Shared interface between all SX1278 frontends.
virtual void enableRx()=0
virtual void disableRx()=0
virtual void disableTx()=0
virtual void enableTx()=0
virtual IrqFlags getIrqFlags()=0
virtual void setMode(Mode mode)=0
virtual void setMapping(DioMapping mapping)=0
virtual void resetIrqFlags(IrqFlags flags)=0
RAII scoped bus lock guard.
RAII scoped mode lock, requires a previous lock.
void handleDioIRQ()
Handle generic DIO irq.
ISX1278Frontend & getFrontend()
IrqFlags waitForIrqBusy(LockMode &guard, IrqFlags set_irq, IrqFlags reset_irq, int timeout)
Busy waits for an interrupt by polling the irq register.
void setDefaultMode(Mode mode, DioMapping mapping, InterruptTrigger dio1_trigger, bool set_tx_frontend_on, bool set_rx_frontend_on)
Set default device mode.
IrqFlags checkForIrqAndReset(IrqFlags set_irq, IrqFlags reset_irq)
Returns a mask containing triggered interrupts.
IrqFlags waitForIrq(LockMode &guard, IrqFlags set_irq, IrqFlags reset_irq, bool unlock=false)
Wait for generic irq.
void changeInterruptTrigger(unsigned int gpioPort, unsigned int gpioNum, InterruptTrigger trigger)
Changes interrupt trigger on an enabled interrupt.
void disableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum)
Disables external interrupts on the provided pin.
void enableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum, InterruptTrigger trigger, unsigned int priority)
Enables external interrupts on the provided pin. Remember to set the GPIO to input mode!
miosix::TimedWaitResult IRQenableIrqAndTimedWaitMs(miosix::FastInterruptDisableLock &dLock, long long absoluteTimeMs)
Stops the thread until wakeup() is called or the specified absolute time in milliseconds is reached.
long long getOldTick()
Get the current time in milliseconds.
RegDioMapping::Mapping DioMapping
This file includes all the types the logdecoder script will decode.
Contains information about a single SPI slave device.
Represents an actual Dio mapping..