LibreVNA/Software/VNA_embedded/Application/Trigger.cpp
2022-08-07 03:01:22 +02:00

74 lines
1.7 KiB
C++

#include "Trigger.hpp"
#include "Drivers/Exti.hpp"
#include "main.h"
#include "HW_HAL.hpp"
#include "Communication/Protocol.hpp"
#include "Hardware.hpp"
static Trigger::Mode mode;
static Trigger::CallbackISR callback = nullptr;
void Trigger::Init(CallbackISR cb) {
mode = Mode::Off;
callback = cb;
Exti::SetCallback(FPGA_TRIGGER_OUT_GPIO_Port, FPGA_TRIGGER_OUT_Pin, Exti::EdgeType::Both, Exti::Pull::Down, [](void*){
STM::DispatchToInterrupt(callback);
}, nullptr);
}
extern "C" {
void vApplicationIdleHook() {
if(mode == Trigger::Mode::ExtRef) {
STM::DispatchToInterrupt([](){
Trigger::SetInput(HW::Ref::available());
});
}
}
}
void Trigger::SetMode(Mode m) {
if(mode == m) {
// already in the correct mdoe
return;
}
if(mode == Mode::ExtRef) {
// reset reference to default settings
HWHAL::Si5351.Disable(HWHAL::SiChannel::ReferenceOut);
}
mode = m;
if(mode == Mode::ExtRef) {
// Disable the external reference
Protocol::ReferenceSettings s;
s.AutomaticSwitch = 0;
s.ExtRefOuputFreq = 0;
s.UseExternalRef = 0;
HW::Ref::set(s);
HW::Ref::update();
HWHAL::Si5351.SetCLK(HWHAL::SiChannel::ReferenceOut, 10000000, Si5351C::PLL::A);
if(GetOutput()) {
HWHAL::Si5351.Enable(HWHAL::SiChannel::ReferenceOut);
} else {
HWHAL::Si5351.Disable(HWHAL::SiChannel::ReferenceOut);
}
}
}
Trigger::Mode Trigger::GetMode() {
return mode;
}
void Trigger::SetInput(bool high) {
if(high) {
FPGA_TRIGGER_IN_GPIO_Port->BSRR = FPGA_TRIGGER_IN_Pin;
} else {
FPGA_TRIGGER_IN_GPIO_Port->BSRR = FPGA_TRIGGER_IN_Pin << 16;
}
}
bool Trigger::GetOutput() {
return FPGA_TRIGGER_OUT_GPIO_Port->IDR & FPGA_TRIGGER_OUT_Pin;
}
bool Trigger::GetInput() {
return FPGA_TRIGGER_IN_GPIO_Port->IDR & FPGA_TRIGGER_IN_Pin;
}