74 lines
1.7 KiB
C++
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;
|
|
}
|