diff --git a/.gitmodules b/.gitmodules index 78686ee..6e7071e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "STM32F7XX_Lib"] path = STM32F7XX_Lib url = https://github.com/juribeparada/STM32F7XX_Lib.git +[submodule "STM32F10X_Lib"] + path = STM32F10X_Lib + url = https://github.com/shawnchain/STM32F10X_Lib.git diff --git a/CalPOCSAG.cpp b/CalPOCSAG.cpp new file mode 100644 index 0000000..bf88a51 --- /dev/null +++ b/CalPOCSAG.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2019 by Florian Wolters DF2ET + * + * 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 "CalPOCSAG.h" + + +CCalPOCSAG::CCalPOCSAG() : +m_state(POCSAGCAL_IDLE) +{ +} + +void CCalPOCSAG::process() +{ + if (m_state == POCSAGCAL_IDLE) + return; + + uint16_t space = io.getSpace(); + if (space <= 165U) + return; + + pocsagTX.writeByte(0xAAU); +} + +uint8_t CCalPOCSAG::write(const uint8_t* data, uint8_t length) +{ + if (length != 1U) + return 4U; + + m_state = data[0U] == 1U ? POCSAGCAL_TX : POCSAGCAL_IDLE; + + return 0U; +} diff --git a/CalPOCSAG.h b/CalPOCSAG.h new file mode 100644 index 0000000..291e360 --- /dev/null +++ b/CalPOCSAG.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2019 by Florian Wolters DF2ET + * + * 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(CALPOCSAG_H) +#define CALPOCSAG_H + +#include "Config.h" + +enum POCSAGCAL { + POCSAGCAL_IDLE, + POCSAGCAL_TX +}; + +class CCalPOCSAG { +public: + CCalPOCSAG(); + + void process(); + + uint8_t write(const uint8_t* data, uint8_t length); + +private: + POCSAGCAL m_state; +}; + +#endif diff --git a/Config.h b/Config.h index c738e21..9d62604 100644 --- a/Config.h +++ b/Config.h @@ -44,11 +44,13 @@ // For the original Arduino Due pin layout // #define ARDUINO_DUE_PAPA +#if defined(STM32F1) +// For the SQ6POG board +#define STM32F1_POG +#else // For the ZUM V1.0 and V1.0.1 boards pin layout #define ARDUINO_DUE_ZUM_V10 - -// For the SQ6POG board -// #define STM32F1_POG +#endif // For the SP8NTH board // #define ARDUINO_DUE_NTH diff --git a/Globals.h b/Globals.h index c082d60..149cb25 100644 --- a/Globals.h +++ b/Globals.h @@ -60,7 +60,9 @@ enum MMDVM_STATE { STATE_RSSICAL = 96, STATE_CWID = 97, STATE_DMRCAL = 98, - STATE_DSTARCAL = 99 + STATE_DSTARCAL = 99, + STATE_INTCAL = 100, + STATE_POCSAGCAL = 101 }; #include "SerialPort.h" @@ -83,6 +85,7 @@ enum MMDVM_STATE { #include "CalDMR.h" #include "CalP25.h" #include "CalNXDN.h" +#include "CalPOCSAG.h" #include "CalRSSI.h" #include "CWIdTX.h" #include "Debug.h" @@ -146,6 +149,7 @@ extern CCalDStarTX calDStarTX; extern CCalDMR calDMR; extern CCalP25 calP25; extern CCalNXDN calNXDN; +extern CCalPOCSAG calPOCSAG; extern CCalRSSI calRSSI; extern CCWIdTX cwIdTX; diff --git a/MMDVM.cpp b/MMDVM.cpp index 6fd894c..306cdcd 100644 --- a/MMDVM.cpp +++ b/MMDVM.cpp @@ -64,6 +64,7 @@ CCalDStarTX calDStarTX; CCalDMR calDMR; CCalP25 calP25; CCalNXDN calNXDN; +CCalPOCSAG calPOCSAG; CCalRSSI calRSSI; CCWIdTX cwIdTX; @@ -117,6 +118,9 @@ void loop() if (m_modemState == STATE_NXDNCAL1K) calNXDN.process(); + if (m_modemState == STATE_POCSAGCAL) + calPOCSAG.process(); + if (m_modemState == STATE_IDLE) cwIdTX.process(); } diff --git a/MMDVM.ino b/MMDVM.ino index ff392e1..dcb1fcf 100644 --- a/MMDVM.ino +++ b/MMDVM.ino @@ -61,6 +61,7 @@ CCalDStarTX calDStarTX; CCalDMR calDMR; CCalP25 calP25; CCalNXDN calNXDN; +CCalPOCSAG calPOCSAG; CCalRSSI calRSSI; CCWIdTX cwIdTX; @@ -114,6 +115,9 @@ void loop() if (m_modemState == STATE_NXDNCAL1K) calNXDN.process(); + if (m_modemState == STATE_POCSAGCAL) + calPOCSAG.process(); + if (m_modemState == STATE_IDLE) cwIdTX.process(); } diff --git a/Makefile b/Makefile index 0051cbf..a7e92d2 100644 --- a/Makefile +++ b/Makefile @@ -239,7 +239,7 @@ $(OBJDIR_F7): $(BINDIR)/$(BINHEX_F4): $(BINDIR)/$(BINELF_F4) $(CP) -O ihex $< $@ @echo "Objcopy from ELF to IHEX complete!\n" - + $(BINDIR)/$(BINBIN_F4): $(BINDIR)/$(BINELF_F4) $(CP) -O binary $< $@ @echo "Objcopy from ELF to BINARY complete!\n" @@ -252,7 +252,7 @@ $(BINDIR)/$(BINELF_F4): $(OBJ_F4) $(BINDIR)/$(BINHEX_F7): $(BINDIR)/$(BINELF_F7) $(CP) -O ihex $< $@ @echo "Objcopy from ELF to IHEX complete!\n" - + $(BINDIR)/$(BINBIN_F7): $(BINDIR)/$(BINELF_F7) $(CP) -O binary $< $@ @echo "Objcopy from ELF to BINARY complete!\n" @@ -342,13 +342,10 @@ deploy-dvm: deploy-pi deploy-pi-f7: ifneq ($(wildcard /usr/local/bin/stm32flash),) -/usr/local/bin/stm32flash -i 20,-21,21:-20,21 /dev/ttyAMA0 - -/usr/local/bin/stm32ld /dev/ttyAMA0 57600 bin/$(BINBIN_F7) /usr/local/bin/stm32flash -v -w bin/$(BINBIN_F7) -g 0x0 -R -c /dev/ttyAMA0 -endif -ifneq ($(wildcard /usr/bin/stm32flash),) +else ifneq ($(wildcard /usr/bin/stm32flash),) -/usr/bin/stm32flash -i 20,-21,21:-20,21 /dev/ttyAMA0 - -/usr/bin/stm32ld /dev/ttyAMA0 57600 bin/$(BINBIN_F7) /usr/bin/stm32flash -v -w bin/$(BINBIN_F7) -g 0x0 -R -c /dev/ttyAMA0 endif diff --git a/Makefile.CMSIS b/Makefile.CMSIS index 3573d6f..2bce2ab 100644 --- a/Makefile.CMSIS +++ b/Makefile.CMSIS @@ -25,7 +25,7 @@ STARTUP:=$(SYSDIR)/startup_stm32f105xc.S STARTUP_DEFS= # Include directory for CMSIS -CMSISDIR:=/opt/STM32Cube_FW_F1_V1.4.0/Drivers/CMSIS +CMSISDIR:=STM32F10X_Lib/CMSIS # Libraries LIBDIR:= @@ -65,7 +65,7 @@ COMMON_FLAGS =-mthumb -mlittle-endian -mcpu=$(MCPU) COMMON_FLAGS+= -Wall COMMON_FLAGS+= -I. -I$(CMSISDIR)/Include -I$(CMSISDIR)/Device/ST/STM32F1xx/Include -I$(SYSDIR) COMMON_FLAGS+= $(addprefix -I,$(INCDIR)) -COMMON_FLAGS+= -D$(MCU) -DMADEBYMAKEFILE +COMMON_FLAGS+= -D$(MCU) -DMADEBYMAKEFILE -DSTM32F1 COMMON_FLAGS+= -Os -flto -ffunction-sections -fdata-sections COMMON_FLAGS+= -g # Assembler flags diff --git a/POCSAGTX.h b/POCSAGTX.h index 8cd75f7..d640862 100644 --- a/POCSAGTX.h +++ b/POCSAGTX.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2018 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2019 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 @@ -29,6 +29,8 @@ public: uint8_t writeData(const uint8_t* data, uint8_t length); + void writeByte(uint8_t c); + void process(); void setTXDelay(uint8_t delay); @@ -45,8 +47,6 @@ private: uint16_t m_poLen; uint16_t m_poPtr; uint16_t m_txDelay; - - void writeByte(uint8_t c); }; #endif diff --git a/STM32F10X_Lib b/STM32F10X_Lib new file mode 160000 index 0000000..417e0c2 --- /dev/null +++ b/STM32F10X_Lib @@ -0,0 +1 @@ +Subproject commit 417e0c2f4a4571ff836d2705d7551bd07ebbf777 diff --git a/SerialPort.cpp b/SerialPort.cpp index f12e6bb..11d57e5 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013,2015,2016,2017,2018 by Jonathan Naylor G4KLX + * Copyright (C) 2013,2015-2019 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * * This program is free software; you can redistribute it and/or modify @@ -92,12 +92,12 @@ const uint8_t MMDVM_DEBUG5 = 0xF5U; #endif #if defined(STM32F4_RPT_HAT_TGO) -#define HW_TYPE "MMDVM_RPT_HAT_TGO" +#define HW_TYPE "MMDVM RPT_HAT_TGO" #else -#define HW_TYPE "MMDVM" +#define HW_TYPE "MMDVM" #endif -#define DESCRIPTION "20180723 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG)" +#define DESCRIPTION "20190130 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG)" #if defined(GITVERSION) #define concat(h, a, b, c) h " " a " " b " GitID #" c "" @@ -280,7 +280,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_P25 && modemState != STATE_NXDN && modemState != STATE_POCSAG && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_RSSICAL && modemState != STATE_LFCAL && modemState != STATE_DMRCAL1K && modemState != STATE_P25CAL1K && modemState != STATE_DMRDMO1K && modemState != STATE_NXDNCAL1K) + if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_POCSAG && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_RSSICAL && modemState != STATE_LFCAL && modemState != STATE_DMRCAL1K && modemState != STATE_P25CAL1K && modemState != STATE_DMRDMO1K && modemState != STATE_NXDNCAL1K && modemState != STATE_POCSAGCAL) return 4U; if (modemState == STATE_DSTAR && !dstarEnable) return 4U; @@ -360,7 +360,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_P25 && modemState != STATE_NXDN && modemState != STATE_POCSAG && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_RSSICAL && modemState != STATE_LFCAL && modemState != STATE_DMRCAL1K && modemState != STATE_P25CAL1K && modemState != STATE_DMRDMO1K && modemState != STATE_NXDNCAL1K) + if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_POCSAG && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_RSSICAL && modemState != STATE_LFCAL && modemState != STATE_DMRCAL1K && modemState != STATE_P25CAL1K && modemState != STATE_DMRDMO1K && modemState != STATE_NXDNCAL1K && modemState != STATE_POCSAGCAL) return 4U; if (modemState == STATE_DSTAR && !m_dstarEnable) return 4U; @@ -385,157 +385,74 @@ void CSerialPort::setMode(MMDVM_STATE modemState) switch (modemState) { case STATE_DMR: DEBUG1("Mode set to DMR"); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_DSTAR: DEBUG1("Mode set to D-Star"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_YSF: DEBUG1("Mode set to System Fusion"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_P25: DEBUG1("Mode set to P25"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_NXDN: DEBUG1("Mode set to NXDN"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - cwIdTX.reset(); break; case STATE_POCSAG: DEBUG1("Mode set to POCSAG"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_DSTARCAL: DEBUG1("Mode set to D-Star Calibrate"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_DMRCAL: DEBUG1("Mode set to DMR Calibrate"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_RSSICAL: DEBUG1("Mode set to RSSI Calibrate"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_LFCAL: DEBUG1("Mode set to 80 Hz Calibrate"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_DMRCAL1K: DEBUG1("Mode set to DMR BS 1031 Hz Calibrate"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_P25CAL1K: DEBUG1("Mode set to P25 1011 Hz Calibrate"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_DMRDMO1K: DEBUG1("Mode set to DMR MS 1031 Hz Calibrate"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; case STATE_NXDNCAL1K: DEBUG1("Mode set to NXDN 1031 Hz Calibrate"); - dmrIdleRX.reset(); - dmrDMORX.reset(); - dmrRX.reset(); - dstarRX.reset(); - ysfRX.reset(); - p25RX.reset(); - nxdnRX.reset(); - cwIdTX.reset(); break; - default: + case STATE_POCSAGCAL: + DEBUG1("Mode set to POCSAG Calibrate"); + break; + default: // STATE_IDLE DEBUG1("Mode set to Idle"); - // STATE_IDLE break; } + if (modemState != STATE_DSTAR) + dstarRX.reset(); + + if (modemState != STATE_DMR) { + dmrIdleRX.reset(); + dmrDMORX.reset(); + dmrRX.reset(); + } + + if (modemState != STATE_YSF) + ysfRX.reset(); + + if (modemState != STATE_P25) + p25RX.reset(); + + if (modemState != STATE_NXDN) + nxdnRX.reset(); + + cwIdTX.reset(); + m_modemState = modemState; io.setMode(); @@ -617,6 +534,8 @@ void CSerialPort::process() err = calP25.write(m_buffer + 3U, m_len - 3U); if (m_modemState == STATE_NXDNCAL1K) err = calNXDN.write(m_buffer + 3U, m_len - 3U); + if (m_modemState == STATE_POCSAGCAL) + err = calPOCSAG.write(m_buffer + 3U, m_len - 3U); if (err == 0U) { sendACK(); } else {