mirror of https://github.com/g4klx/MMDVM.git
commit
1ed3a4c9d5
4
Config.h
4
Config.h
|
@ -37,8 +37,8 @@
|
||||||
|
|
||||||
// Use a higher baudrate for host communication. Required for FM network !
|
// Use a higher baudrate for host communication. Required for FM network !
|
||||||
#define SERIAL_SPEED 115200 //suitable for most older boards (Arduino, Due STM32F1_POG etc). External FM will NOT work with this !
|
#define SERIAL_SPEED 115200 //suitable for most older boards (Arduino, Due STM32F1_POG etc). External FM will NOT work with this !
|
||||||
// #define SERIAL_SPEED 230400 //Only works on newer board M4, M7, Teensy. External FM will works with this
|
// #define SERIAL_SPEED 230400 // Only works on newer board M4, M7, Teensy. External FM might work with this
|
||||||
// #define SERIAL_SPEED 460800 // Experimantal
|
// #define SERIAL_SPEED 460800 // Only works on newer board M4, M7, Teensy. External FM should work with this
|
||||||
|
|
||||||
// Allow the use of the COS line to lockout the modem
|
// Allow the use of the COS line to lockout the modem
|
||||||
// #define USE_COS_AS_LOCKOUT
|
// #define USE_COS_AS_LOCKOUT
|
||||||
|
|
5
FM.cpp
5
FM.cpp
|
@ -56,7 +56,7 @@ m_extEnabled(false),
|
||||||
m_rxLevel(1),
|
m_rxLevel(1),
|
||||||
m_inputRFRB(2401U), // 100ms of audio + 1 sample
|
m_inputRFRB(2401U), // 100ms of audio + 1 sample
|
||||||
m_outputRFRB(2400U), // 100ms of audio
|
m_outputRFRB(2400U), // 100ms of audio
|
||||||
m_inputExtRB(2400U) // 100ms of Audio
|
m_inputExtRB()
|
||||||
{
|
{
|
||||||
m_statusTimer.setTimeout(1U, 0U);
|
m_statusTimer.setTimeout(1U, 0U);
|
||||||
|
|
||||||
|
@ -727,8 +727,9 @@ uint8_t CFM::getSpace() const
|
||||||
|
|
||||||
uint8_t CFM::writeData(const uint8_t* data, uint8_t length)
|
uint8_t CFM::writeData(const uint8_t* data, uint8_t length)
|
||||||
{
|
{
|
||||||
|
//todo check if length is a multiple of 3
|
||||||
m_inputExtRB.addData(data, length);
|
m_inputExtRB.addData(data, length);
|
||||||
return 0U;//maybe return an error if overflowing ?
|
return 0U;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CFM::insertDelay(uint16_t ms)
|
void CFM::insertDelay(uint16_t ms)
|
||||||
|
|
|
@ -21,69 +21,76 @@
|
||||||
|
|
||||||
const uint32_t FM_UPSAMPLE_MASK = 0x00000FFFU;
|
const uint32_t FM_UPSAMPLE_MASK = 0x00000FFFU;
|
||||||
|
|
||||||
CFMUpSampler::CFMUpSampler(uint16_t length) :
|
CFMUpSampler::CFMUpSampler() :
|
||||||
m_upSampleIndex(0),
|
m_upSampleIndex(0),
|
||||||
m_pack({0U, 0U, 0U}),
|
m_pack(0U),
|
||||||
m_samples(length)
|
m_packPointer(NULL),
|
||||||
|
m_samples(3600U), //300ms of 12 bit 8kHz audio
|
||||||
|
m_running(false)
|
||||||
{
|
{
|
||||||
|
m_packPointer = (uint8_t*)&m_pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CFMUpSampler::reset()
|
void CFMUpSampler::reset()
|
||||||
{
|
{
|
||||||
m_upSampleIndex = 0U;
|
m_upSampleIndex = 0U;
|
||||||
m_pack = {0U, 0U, 0U};
|
m_pack = 0U;
|
||||||
m_samples.reset();
|
m_samples.reset();
|
||||||
|
m_running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CFMUpSampler::addData(const uint8_t* data, uint16_t length)
|
void CFMUpSampler::addData(const uint8_t* data, uint16_t length)
|
||||||
{
|
{
|
||||||
for(uint16_t i = 0U; i < length; i++) {
|
TSamplePairPack* packPointer = (TSamplePairPack*)data;
|
||||||
switch (m_upSampleIndex)
|
TSamplePairPack* packPointerEnd = packPointer + (length / 3U);
|
||||||
{
|
while(packPointer != packPointerEnd) {
|
||||||
case 0U:
|
m_samples.put(*packPointer);
|
||||||
m_pack.byte0 = data[i];
|
packPointer++;
|
||||||
break;
|
|
||||||
case 1U:
|
|
||||||
m_pack.byte1 = data[i];
|
|
||||||
break;
|
|
||||||
case 2U: {
|
|
||||||
m_pack.byte2 = data[i];
|
|
||||||
|
|
||||||
uint32_t pack = 0U;
|
|
||||||
uint8_t* packPtr = (uint8_t*)&pack;
|
|
||||||
|
|
||||||
packPtr[0U] = m_pack.byte0;
|
|
||||||
packPtr[1U] = m_pack.byte1;
|
|
||||||
packPtr[2U] = m_pack.byte2;
|
|
||||||
|
|
||||||
q15_t sample2 = q15_t(uint16_t(pack & FM_UPSAMPLE_MASK) - 2048);
|
|
||||||
q15_t sample1 = q15_t(uint16_t(pack >> 12) - 2048);
|
|
||||||
|
|
||||||
m_samples.put(sample1);
|
|
||||||
m_samples.put(0);
|
|
||||||
m_samples.put(0);
|
|
||||||
m_samples.put(sample2);
|
|
||||||
m_samples.put(0);
|
|
||||||
m_samples.put(0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//shoudl never happen
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_upSampleIndex ++;
|
|
||||||
if (m_upSampleIndex > 2U)
|
|
||||||
m_upSampleIndex = 0U;
|
|
||||||
}
|
}
|
||||||
|
if(!m_running)
|
||||||
|
m_running = m_samples.getData() > 300U;//75ms of audio
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CFMUpSampler::getSample(q15_t& sample)
|
bool CFMUpSampler::getSample(q15_t& sample)
|
||||||
{
|
{
|
||||||
return m_samples.get(sample);
|
if(!m_running)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (m_upSampleIndex)
|
||||||
|
{
|
||||||
|
case 0: {
|
||||||
|
TSamplePairPack pairPack;
|
||||||
|
if(!m_samples.get(pairPack)) {
|
||||||
|
m_running = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pack = 0U;
|
||||||
|
m_packPointer = (uint8_t*)&m_pack;
|
||||||
|
|
||||||
|
m_packPointer[0U] = pairPack.byte0;
|
||||||
|
m_packPointer[1U] = pairPack.byte1;
|
||||||
|
m_packPointer[2U] = pairPack.byte2;
|
||||||
|
|
||||||
|
sample = q15_t(m_pack >> 12) - 2048;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
sample = q15_t(m_pack & FM_UPSAMPLE_MASK) - 2048;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sample = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_upSampleIndex++;
|
||||||
|
if(m_upSampleIndex >= 6U)
|
||||||
|
m_upSampleIndex = 0U;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t CFMUpSampler::getSpace() const
|
uint16_t CFMUpSampler::getSpace() const
|
||||||
{
|
{
|
||||||
return m_samples.getSpace();
|
return m_samples.getSpace();
|
||||||
}
|
}
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
class CFMUpSampler {
|
class CFMUpSampler {
|
||||||
public:
|
public:
|
||||||
CFMUpSampler(uint16_t length);
|
CFMUpSampler();
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
@ -39,8 +39,10 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t m_upSampleIndex;
|
uint8_t m_upSampleIndex;
|
||||||
TSamplePairPack m_pack;
|
uint32_t m_pack;
|
||||||
CRingBuffer<q15_t> m_samples;
|
uint8_t * m_packPointer;
|
||||||
|
CRingBuffer<TSamplePairPack> m_samples;
|
||||||
|
bool m_running;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue