mirror of https://github.com/g4klx/MMDVM.git
Fix modem crash while writing to serial, Split IO write and serial write to 2 separate loops.
This commit is contained in:
parent
994226e4b1
commit
62f239ccc9
35
FM.cpp
35
FM.cpp
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
const uint16_t FM_TX_BLOCK_SIZE = 400U;
|
const uint16_t FM_TX_BLOCK_SIZE = 400U;
|
||||||
const uint16_t FM_SERIAL_BLOCK_SIZE = 42U;//this is actually the number of sample pairs to send over serial. One sample pair is 3bytes.
|
const uint16_t FM_SERIAL_BLOCK_SIZE = 42U;//this is actually the number of sample pairs to send over serial. One sample pair is 3bytes.
|
||||||
//three times this vqlue shall never exceed 126 !
|
//three times this value shall never exceed 126 !
|
||||||
|
|
||||||
CFM::CFM() :
|
CFM::CFM() :
|
||||||
m_callsign(),
|
m_callsign(),
|
||||||
|
@ -153,42 +153,45 @@ void CFM::samples(bool cos, q15_t* samples, uint8_t length)
|
||||||
void CFM::process()
|
void CFM::process()
|
||||||
{
|
{
|
||||||
uint16_t space = io.getSpace() - 2U;
|
uint16_t space = io.getSpace() - 2U;
|
||||||
uint16_t txLength = m_outputRFRB.getData();
|
uint16_t length = m_outputRFRB.getData();
|
||||||
if (space > 2 && txLength >= FM_TX_BLOCK_SIZE ) {
|
if (space > 2 && length >= FM_TX_BLOCK_SIZE ) {
|
||||||
|
|
||||||
if(txLength > FM_TX_BLOCK_SIZE)
|
if(length > FM_TX_BLOCK_SIZE)
|
||||||
txLength = FM_TX_BLOCK_SIZE;
|
length = FM_TX_BLOCK_SIZE;
|
||||||
if(space > FM_TX_BLOCK_SIZE)
|
if(space > FM_TX_BLOCK_SIZE)
|
||||||
space = FM_TX_BLOCK_SIZE;
|
space = FM_TX_BLOCK_SIZE;
|
||||||
if(txLength > space)
|
if(length > space)
|
||||||
txLength = space;
|
length = space;
|
||||||
|
|
||||||
q15_t samples[FM_TX_BLOCK_SIZE];
|
q15_t samples[FM_TX_BLOCK_SIZE];
|
||||||
|
|
||||||
for (uint16_t i = 0U; i < txLength; i++) {
|
for (uint16_t i = 0U; i < length; i++) {
|
||||||
q15_t sample = 0;
|
q15_t sample = 0;
|
||||||
m_outputRFRB.get(sample);
|
m_outputRFRB.get(sample);
|
||||||
samples[i] = sample;
|
samples[i] = sample;
|
||||||
|
}
|
||||||
|
|
||||||
|
io.write(STATE_FM, samples, length);
|
||||||
|
}
|
||||||
|
|
||||||
if(m_extEnabled) {
|
if(m_extEnabled) {
|
||||||
uint16_t downSamplerLength = m_downsampler.getData();
|
length = m_downsampler.getData();
|
||||||
|
|
||||||
|
if(length >= FM_SERIAL_BLOCK_SIZE) {
|
||||||
|
if(length > FM_SERIAL_BLOCK_SIZE)
|
||||||
|
length = FM_SERIAL_BLOCK_SIZE;
|
||||||
|
|
||||||
if(downSamplerLength >= FM_SERIAL_BLOCK_SIZE) {
|
|
||||||
TSamplePairPack serialSamples[FM_SERIAL_BLOCK_SIZE];
|
TSamplePairPack serialSamples[FM_SERIAL_BLOCK_SIZE];
|
||||||
|
|
||||||
for(uint16_t j = 0U; j < downSamplerLength; j++) {
|
for(uint16_t j = 0U; j < length; j++) {
|
||||||
m_downsampler.getPackedData(serialSamples[j]);
|
m_downsampler.getPackedData(serialSamples[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
serial.writeFMData((uint8_t*)serialSamples, downSamplerLength * sizeof(TSamplePairPack));
|
serial.writeFMData((uint8_t*)serialSamples, length * sizeof(TSamplePairPack));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
io.write(STATE_FM, samples, txLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CFM::reset()
|
void CFM::reset()
|
||||||
{
|
{
|
||||||
m_state = FS_LISTENING;
|
m_state = FS_LISTENING;
|
||||||
|
|
Loading…
Reference in New Issue