tnc3-firmware/TNC/ModulatorTask.cpp

117 wiersze
2.8 KiB
C++

// Copyright 2015 Mobilinkd LLC <rob@mobilinkd.com>
// All rights reserved.
#include "ModulatorTask.hpp"
#include "HDLCEncoder.hpp"
#include "Modulator.hpp"
#include "Fsk9600Modulator.hpp"
#include "AFSKModulator.hpp"
#include "KissHardware.hpp"
#include "main.h"
mobilinkd::tnc::SimplexPTT simplexPtt;
mobilinkd::tnc::MultiplexPTT multiplexPtt;
mobilinkd::tnc::Modulator* modulator;
mobilinkd::tnc::hdlc::Encoder* encoder;
// DMA Conversion half complete.
extern "C" void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef*) {
osEvent evt = osMessageGet(dacOutputQueueHandle, 0);
if (evt.status == osEventMessage) {
modulator->fill_first(evt.value.v);
} else {
modulator->empty();
}
}
extern "C" void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef*) {
osEvent evt = osMessageGet(dacOutputQueueHandle, 0);
if (evt.status == osEventMessage) {
modulator->fill_last(evt.value.v);
} else {
modulator->empty();
}
}
extern "C" void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef*) {
modulator->abort();
}
mobilinkd::tnc::Modulator& getModulator()
{
using namespace mobilinkd::tnc;
static AFSKModulator afsk1200modulator(dacOutputQueueHandle, &simplexPtt);
static Fsk9600Modulator fsk9600modulator(dacOutputQueueHandle, &simplexPtt);
switch (kiss::settings().modem_type)
{
case kiss::Hardware::ModemType::FSK9600:
return fsk9600modulator;
case kiss::Hardware::ModemType::AFSK1200:
return afsk1200modulator;
default:
CxxErrorHandler();
}
}
mobilinkd::tnc::hdlc::Encoder& getEncoder() {
static mobilinkd::tnc::hdlc::Encoder instance(hdlcOutputQueueHandle);
return instance;
}
void setPtt(PTT ptt)
{
switch (ptt) {
case PTT::SIMPLEX:
getModulator().set_ptt(&simplexPtt);
break;
case PTT::MULTIPLEX:
getModulator().set_ptt(&multiplexPtt);
break;
}
}
void updatePtt()
{
using namespace mobilinkd::tnc::kiss;
if (settings().options & KISS_OPTION_PTT_SIMPLEX)
getModulator().set_ptt(&simplexPtt);
else
getModulator().set_ptt(&multiplexPtt);
}
void updateModulator()
{
using namespace mobilinkd::tnc::kiss;
modulator = &getModulator();
modulator->init(settings());
updatePtt();
encoder->updateModulator();
}
void startModulatorTask(void const*) {
using namespace mobilinkd::tnc::kiss;
// Wait until hardware is initialized before creating modulator.
osMutexWait(hardwareInitMutexHandle, osWaitForever);
modulator = &(getModulator());
encoder = &(getEncoder());
updatePtt();
getModulator().init(settings());
encoder->tx_delay(settings().txdelay);
encoder->p_persist(settings().ppersist);
encoder->slot_time(settings().slot);
encoder->tx_tail(settings().txtail);
encoder->run();
}