kopia lustrzana https://github.com/mobilinkd/tnc3-firmware
86 wiersze
2.1 KiB
C++
86 wiersze
2.1 KiB
C++
// Copyright 2015 Mobilinkd LLC <rob@mobilinkd.com>
|
|
// All rights reserved.
|
|
|
|
#include "ModulatorTask.hpp"
|
|
#include "KissHardware.hpp"
|
|
|
|
mobilinkd::tnc::SimplexPTT simplexPtt;
|
|
mobilinkd::tnc::MultiplexPTT multiplexPtt;
|
|
|
|
mobilinkd::tnc::AFSKModulator* 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::AFSKModulator& getModulator() {
|
|
static mobilinkd::tnc::AFSKModulator instance(dacOutputQueueHandle, &simplexPtt);
|
|
return instance;
|
|
}
|
|
|
|
mobilinkd::tnc::hdlc::Encoder& getEncoder() {
|
|
static mobilinkd::tnc::hdlc::Encoder instance(hdlcOutputQueueHandle, &getModulator());
|
|
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)
|
|
modulator->set_ptt(&simplexPtt);
|
|
else
|
|
modulator->set_ptt(&multiplexPtt);
|
|
}
|
|
|
|
void startModulatorTask(void const*) {
|
|
|
|
using namespace mobilinkd::tnc::kiss;
|
|
|
|
modulator = &(getModulator());
|
|
encoder = &(getEncoder());
|
|
|
|
updatePtt();
|
|
|
|
modulator->set_twist(settings().tx_twist);
|
|
|
|
encoder->tx_delay(settings().txdelay);
|
|
encoder->p_persist(settings().ppersist);
|
|
encoder->slot_time(settings().slot);
|
|
encoder->tx_tail(settings().txtail);
|
|
|
|
encoder->run();
|
|
}
|