diff --git a/app/include/app_board.hpp b/app/include/app_board.hpp new file mode 100644 index 0000000..2b07f96 --- /dev/null +++ b/app/include/app_board.hpp @@ -0,0 +1,19 @@ +// +// Created by erki on 15.07.22. +// + +#ifndef SKL_TUNNEL_APP_BOARD_HPP +#define SKL_TUNNEL_APP_BOARD_HPP + +#include + +namespace App::Board +{ + +void setup(); + +std::uint32_t systickGet(); + +} + +#endif //SKL_TUNNEL_APP_BOARD_HPP diff --git a/app/include/app_transparent_client.hpp b/app/include/app_transparent_client.hpp index 65d07da..fb428a9 100644 --- a/app/include/app_transparent_client.hpp +++ b/app/include/app_transparent_client.hpp @@ -5,7 +5,11 @@ #ifndef SKL_TUNNEL_APP_TRANSPARENT_CLIENT_HPP #define SKL_TUNNEL_APP_TRANSPARENT_CLIENT_HPP +#include +#include + #include "app_settings.hpp" +#include "radio_interrupts.hpp" namespace radio { @@ -20,14 +24,20 @@ class TransparentClient public: TransparentClient(const RadioSettings& initial_settings); - void apply_settings(const RadioSettings& settings); - TransparentClient(const TransparentClient&) = delete; TransparentClient(TransparentClient&&) = delete; TransparentClient& operator=(const TransparentClient&) = delete; TransparentClient& operator=(TransparentClient&&) = delete; + + void apply_settings(const RadioSettings& settings); + void process(); private: radio::HwInstance* m_radio; + Utility::FunctionOwned m_isr_cb_pointer; + std::optional m_pending_irqs = std::nullopt; + + void m_cbRadioIrqHandler(radio::HwInstance*); + void m_processInterrupts(); }; } diff --git a/app/src/app_board.cpp b/app/src/app_board.cpp new file mode 100644 index 0000000..96b42e5 --- /dev/null +++ b/app/src/app_board.cpp @@ -0,0 +1,57 @@ +// +// Created by erki on 15.07.22. +// + +#include "app_board.hpp" + +#include "driver_init.h" + +#include +#include +#include + +#include "skullc_samd21_hal.hpp" + +namespace Hal = Peripherals::Hal::Samd; + +using Logger = Utility::AsyncLogger, Hal::StaticHal, 5, 255>; + +namespace +{ + +Utility::StaticPointer m_logger; +std::uint32_t m_systick_counter = 0; + +void m_txCompleteCb(const usart_async_descriptor* const) +{ + m_logger->txCompleteCallback(); +} + +} + +extern "C" void SysTick_Handler() +{ + m_systick_counter++; +} + +namespace App::Board +{ + +void setup() +{ + // Logging + Hal::SerialInterfaceAsync usart0{&USART_0}; + usart0.registerTxCallback(m_txCompleteCb); + + m_logger.setup(usart0); + Utility::setLogger(*m_logger); + + SysTick_Config(1000); +} + +std::uint32_t systickGet() +{ + return m_systick_counter; +} + +} diff --git a/app/src/app_transparent_client.cpp b/app/src/app_transparent_client.cpp index dafecd3..81ef9f0 100644 --- a/app/src/app_transparent_client.cpp +++ b/app/src/app_transparent_client.cpp @@ -11,6 +11,7 @@ namespace App TransparentClient::TransparentClient(const RadioSettings& initial_settings) : m_radio(radio::HwInstance::instance()) + , m_isr_cb_pointer(*this, &TransparentClient::m_cbRadioIrqHandler) { apply_settings(initial_settings); @@ -27,4 +28,24 @@ void TransparentClient::apply_settings(const RadioSettings& settings) m_radio->set_max_retries(settings.retries); } +void TransparentClient::process() +{ + if (m_pending_irqs) + m_processInterrupts(); +} + +void TransparentClient::m_cbRadioIrqHandler(radio::HwInstance*) +{ + const radio::Interrupts new_irqs = m_radio->get_pending_irq(); + if (m_pending_irqs) + m_pending_irqs = (*m_pending_irqs) | new_irqs; + else + m_pending_irqs = new_irqs; +} + +void TransparentClient::m_processInterrupts() +{ + m_pending_irqs = std::nullopt; +} + } diff --git a/atmel_start.c b/atmel_start.c index 79f252a..04ec4fb 100644 --- a/atmel_start.c +++ b/atmel_start.c @@ -6,4 +6,6 @@ void atmel_start_init(void) { system_init(); + + SysTick_Config(1000); } diff --git a/main.cpp b/main.cpp index fcafa87..f1bcde1 100644 --- a/main.cpp +++ b/main.cpp @@ -26,13 +26,6 @@ Utility::StaticPointer m_app; while (true); } -volatile bool irq_seen = false; - -void m_irqHandler(radio::HwInstance*) -{ - irq_seen = true; -} - } int main() @@ -49,11 +42,9 @@ int main() SKULLC_LOG_DEBUG("Begin."); const App::RadioSettings settings; - Utility::Function irq_handler{m_irqHandler}; m_app.setup(settings); radio::HwInstance* radio_hw = radio::HwInstance::instance(); - radio_hw->set_irq_handler(&irq_handler); /* Replace with your application code */ while (true) @@ -67,13 +58,6 @@ int main() SKULLC_LOG_INFO("Status: %d", radio_status); - if (irq_seen) - { - irq_seen = false; - const radio::Interrupts irqs = radio_hw->get_pending_irq(); - SKULLC_LOG_INFO("IRQ received. %X", std::uint8_t(irqs)); - } - delay_ms(1000); } }