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);
77 auto oldPriority = miosix::Thread::getCurrentThread()->getPriority();
81 miosix::Thread::getCurrentThread()->setPriority(MIN_IRQ_PRIORITY);
87 miosix::FastInterruptDisableLock lock;
88 state.irq_wait_thread = miosix::Thread::IRQgetCurrentThread();
95 if (!waitForIrqInner(
guard, unlock))
107 miosix::Thread::getCurrentThread()->setPriority(
oldPriority);
126 const unsigned int DELAY = 100;
129 for (
unsigned int i = 0; i < 1000 /
DELAY; i++)
135 miosix::delayUs(
DELAY);
142bool SX1278Common::waitForIrqInner(LockMode& _guard,
bool unlock)
153 miosix::TimedWaitResult result = miosix::TimedWaitResult::NoTimeout;
156 miosix::FastInterruptDisableLock lock;
157 while (state.irq_wait_thread &&
158 result == miosix::TimedWaitResult::NoTimeout)
161 lock, start + IRQ_TIMEOUT);
170 return result == miosix::TimedWaitResult::NoTimeout;
190SX1278Common::DeviceState SX1278Common::lockMode(Mode mode,
DioMapping mapping,
196 DeviceState old_state = state;
198 enterMode(mode, mapping, dio1_trigger, tx_frontend, rx_frontend);
199 state.irq_wait_thread =
nullptr;
204void SX1278Common::unlockMode(DeviceState old_state)
207 state.irq_wait_thread = old_state.irq_wait_thread;
208 enterMode(old_state.mode, old_state.mapping, old_state.dio1_trigger,
209 old_state.is_tx_frontend_on, old_state.is_rx_frontend_on);
212void SX1278Common::lock() { mutex.lock(); }
214void SX1278Common::unlock() { mutex.unlock(); }
216void SX1278Common::enterMode(Mode mode,
DioMapping mapping,
218 bool set_tx_frontend_on,
bool set_rx_frontend_on)
224 if (set_tx_frontend_on != state.is_tx_frontend_on && !set_tx_frontend_on)
227 if (set_rx_frontend_on != state.is_rx_frontend_on && !set_rx_frontend_on)
231 if (set_tx_frontend_on != state.is_tx_frontend_on && set_tx_frontend_on)
234 if (set_rx_frontend_on != state.is_rx_frontend_on && set_rx_frontend_on)
237 state.is_tx_frontend_on = set_tx_frontend_on;
238 state.is_rx_frontend_on = set_rx_frontend_on;
240 if (mode != state.mode)
247 if (dio1_trigger != state.dio1_trigger)
250 state.dio1_trigger = dio1_trigger;
254 if (mapping != state.mapping)
257 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
Driver for the VN100S IMU.
Contains information about a single SPI slave device.
Represents an actual Dio mapping..