mirror of https://github.com/g4klx/MMDVM.git
Added files via upload
Add new mode for DMR Deviation Calibration.
This commit is contained in:
parent
94454a9b30
commit
203b36cf59
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Copyright (C) 2009-2015 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "Config.h"
|
||||
#include "Globals.h"
|
||||
#include "CalDMR.h"
|
||||
|
||||
|
||||
CCalDMR::CCalDMR() :
|
||||
m_transmit(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CCalDMR::process()
|
||||
{
|
||||
if (m_transmit)
|
||||
{
|
||||
dmrTX.setCal(true);
|
||||
dmrTX.process();
|
||||
}
|
||||
else
|
||||
{
|
||||
dmrTX.setCal(false);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
uint8_t CCalDMR::write(const uint8_t* data, uint8_t length)
|
||||
{
|
||||
if (length != 1U)
|
||||
return 4U;
|
||||
|
||||
m_transmit = data[0U] == 1U;
|
||||
return 0U;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (C) 2009-2015 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#if !defined(CALDMR_H)
|
||||
#define CALDMR_H
|
||||
|
||||
#include "Config.h"
|
||||
#include "DMRDefines.h"
|
||||
|
||||
class CCalDMR {
|
||||
public:
|
||||
CCalDMR();
|
||||
void process();
|
||||
uint8_t write(const uint8_t* data, uint8_t length);
|
||||
|
||||
private:
|
||||
bool m_transmit;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
26
DMRTX.cpp
26
DMRTX.cpp
|
@ -96,6 +96,10 @@ void CDMRTX::process()
|
|||
createData(1U);
|
||||
m_state = DMRTXSTATE_CACH1;
|
||||
break;
|
||||
|
||||
case DMRTXSTATE_CAL:
|
||||
createCal();
|
||||
break;
|
||||
|
||||
default:
|
||||
createCACH(0U, 1U);
|
||||
|
@ -192,6 +196,15 @@ void CDMRTX::setStart(bool start)
|
|||
m_count = 0U;
|
||||
}
|
||||
|
||||
void CDMRTX::setCal(bool start)
|
||||
{
|
||||
m_state = start ? DMRTXSTATE_CAL : DMRTXSTATE_IDLE;
|
||||
|
||||
m_count = 0U;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CDMRTX::writeByte(uint8_t c, uint8_t control)
|
||||
{
|
||||
q15_t inBuffer[DMR_RADIO_SYMBOL_LENGTH * 4U + 1U];
|
||||
|
@ -278,6 +291,17 @@ void CDMRTX::createData(uint8_t slotIndex)
|
|||
m_poPtr = 0U;
|
||||
}
|
||||
|
||||
void CDMRTX::createCal()
|
||||
{
|
||||
for (unsigned int i = 0U; i < DMR_FRAME_LENGTH_BYTES; i++) {
|
||||
m_poBuffer[i] = 0x5F; //+3+3-3-3 pattern for deviation cal.
|
||||
m_markBuffer[i] = MARK_NONE;
|
||||
}
|
||||
|
||||
m_poLen = DMR_FRAME_LENGTH_BYTES;
|
||||
m_poPtr = 0U;
|
||||
}
|
||||
|
||||
void CDMRTX::createCACH(uint8_t txSlotIndex, uint8_t rxSlotIndex)
|
||||
{
|
||||
if (m_cachPtr >= 12U)
|
||||
|
@ -328,4 +352,4 @@ void CDMRTX::setColorCode(uint8_t colorCode)
|
|||
CDMRSlotType slotType;
|
||||
slotType.encode(colorCode, DT_IDLE, m_idle);
|
||||
}
|
||||
|
||||
|
||||
|
|
7
DMRTX.h
7
DMRTX.h
|
@ -29,7 +29,8 @@ enum DMRTXSTATE {
|
|||
DMRTXSTATE_SLOT1,
|
||||
DMRTXSTATE_CACH1,
|
||||
DMRTXSTATE_SLOT2,
|
||||
DMRTXSTATE_CACH2
|
||||
DMRTXSTATE_CACH2,
|
||||
DMRTXSTATE_CAL
|
||||
};
|
||||
|
||||
class CDMRTX {
|
||||
|
@ -41,6 +42,7 @@ public:
|
|||
uint8_t writeShortLC(const uint8_t* data, uint8_t length);
|
||||
|
||||
void setStart(bool start);
|
||||
void setCal(bool start);
|
||||
|
||||
void process();
|
||||
|
||||
|
@ -66,8 +68,9 @@ private:
|
|||
|
||||
void createData(uint8_t slotIndex);
|
||||
void createCACH(uint8_t txSlotIndex, uint8_t rxSlotIndex);
|
||||
void createCal();
|
||||
void writeByte(uint8_t c, uint8_t control);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -39,7 +39,9 @@ enum MMDVM_STATE {
|
|||
STATE_DSTAR = 1,
|
||||
STATE_DMR = 2,
|
||||
STATE_YSF = 3,
|
||||
STATE_DMRCAL = 98,
|
||||
STATE_CALIBRATE = 99
|
||||
|
||||
};
|
||||
|
||||
#include "SerialPort.h"
|
||||
|
@ -52,6 +54,7 @@ enum MMDVM_STATE {
|
|||
#include "YSFTX.h"
|
||||
#include "CalRX.h"
|
||||
#include "CalTX.h"
|
||||
#include "CalDMR.h"
|
||||
#include "Debug.h"
|
||||
#include "IO.h"
|
||||
|
||||
|
@ -87,6 +90,7 @@ extern CYSFTX ysfTX;
|
|||
|
||||
extern CCalRX calRX;
|
||||
extern CCalTX calTX;
|
||||
extern CCalDMR calDMR;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ CYSFTX ysfTX;
|
|||
|
||||
CCalRX calRX;
|
||||
CCalTX calTX;
|
||||
CCalDMR calDMR;
|
||||
|
||||
CSerialPort serial;
|
||||
CIO io;
|
||||
|
@ -70,5 +71,9 @@ void loop()
|
|||
|
||||
if (m_modemState == STATE_CALIBRATE)
|
||||
calTX.process();
|
||||
|
||||
if (m_modemState == STATE_DMRCAL)
|
||||
calDMR.process();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ const uint8_t MMDVM_DEBUG3 = 0xF3U;
|
|||
const uint8_t MMDVM_DEBUG4 = 0xF4U;
|
||||
const uint8_t MMDVM_DEBUG5 = 0xF5U;
|
||||
|
||||
const uint8_t HARDWARE[] = "MMDVM 20160412 48kHz (D-Star/DMR/System Fusion)";
|
||||
const uint8_t HARDWARE[] = "MMDVM 20160413 48kHz (D-Star/DMR/System Fusion)";
|
||||
|
||||
const uint8_t PROTOCOL_VERSION = 1U;
|
||||
|
||||
|
@ -191,7 +191,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length)
|
|||
|
||||
MMDVM_STATE modemState = MMDVM_STATE(data[3U]);
|
||||
|
||||
if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_CALIBRATE)
|
||||
if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_CALIBRATE && modemState != STATE_DMRCAL)
|
||||
return 4U;
|
||||
if (modemState == STATE_DSTAR && !dstarEnable)
|
||||
return 4U;
|
||||
|
@ -252,7 +252,7 @@ uint8_t CSerialPort::setMode(const uint8_t* data, uint8_t length)
|
|||
if (modemState == m_modemState)
|
||||
return 0U;
|
||||
|
||||
if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_CALIBRATE)
|
||||
if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_CALIBRATE && modemState != STATE_DMRCAL)
|
||||
return 4U;
|
||||
if (modemState == STATE_DSTAR && !m_dstarEnable)
|
||||
return 4U;
|
||||
|
@ -293,6 +293,13 @@ void CSerialPort::setMode(MMDVM_STATE modemState)
|
|||
dstarRX.reset();
|
||||
ysfRX.reset();
|
||||
break;
|
||||
case STATE_DMRCAL:
|
||||
DEBUG1("Mode set to DMR Calibrate");
|
||||
dmrIdleRX.reset();
|
||||
dmrRX.reset();
|
||||
dstarRX.reset();
|
||||
ysfRX.reset();
|
||||
break;
|
||||
default:
|
||||
DEBUG1("Mode set to Idle");
|
||||
// STATE_IDLE
|
||||
|
@ -377,6 +384,8 @@ void CSerialPort::process()
|
|||
case MMDVM_CAL_DATA:
|
||||
if (m_modemState == STATE_CALIBRATE)
|
||||
err = calTX.write(m_buffer + 3U, m_len - 3U);
|
||||
if (m_modemState == STATE_DMRCAL)
|
||||
err= calDMR.write(m_buffer +3U,m_len -3U);
|
||||
if (err == 0U) {
|
||||
sendACK();
|
||||
} else {
|
||||
|
@ -846,4 +855,4 @@ void CSerialPort::writeAssert(bool cond, const char* text, const char* file, lon
|
|||
|
||||
write(reply, count, true);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue