From 203b36cf59a4d6e62f902eb2365ee2e9973acec2 Mon Sep 17 00:00:00 2001 From: g4eml Date: Wed, 13 Apr 2016 16:16:31 +0100 Subject: [PATCH] Added files via upload Add new mode for DMR Deviation Calibration. --- CalDMR.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ CalDMR.h | 36 +++++++++++++++++++++++++++++++++ DMRTX.cpp | 26 +++++++++++++++++++++++- DMRTX.h | 7 +++++-- Globals.h | 6 +++++- MMDVM.ino | 7 ++++++- SerialPort.cpp | 17 ++++++++++++---- 7 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 CalDMR.cpp create mode 100644 CalDMR.h diff --git a/CalDMR.cpp b/CalDMR.cpp new file mode 100644 index 0000000..471eb7b --- /dev/null +++ b/CalDMR.cpp @@ -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; +} + + diff --git a/CalDMR.h b/CalDMR.h new file mode 100644 index 0000000..1195f9c --- /dev/null +++ b/CalDMR.h @@ -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 diff --git a/DMRTX.cpp b/DMRTX.cpp index d82ce86..4d8f201 100644 --- a/DMRTX.cpp +++ b/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); } - + diff --git a/DMRTX.h b/DMRTX.h index d375258..6ecc8cd 100644 --- a/DMRTX.h +++ b/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 - + diff --git a/Globals.h b/Globals.h index 80a7efe..5cbd13b 100644 --- a/Globals.h +++ b/Globals.h @@ -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 - + diff --git a/MMDVM.ino b/MMDVM.ino index d9c2041..b9e31bd 100644 --- a/MMDVM.ino +++ b/MMDVM.ino @@ -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(); + } - + diff --git a/SerialPort.cpp b/SerialPort.cpp index 2ab04d9..1e9f8b3 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -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); } - +