Compare commits

...

7 Commits

@ -129,10 +129,63 @@ typedef unsigned long long ulong64_t;
// #define SEND_RSSI_DATA
// Enable for RPi 3B+, USB mode
#if defined(STM32_USB_HOST)
#define LONG_USB_RESET
#if defined(ENABLE_DMR)
#define DESCR_DMR "DMR, "
#else
#define DESCR_DMR ""
#endif
#if defined(ENABLE_P25)
#define DESCR_P25 "P25, "
#else
#define DESCR_P25 ""
#endif
#if defined(ENABLE_NXDN)
#define DESCR_NXDN "NXDN, "
#else
#define DESCR_NXDN ""
#endif
#if defined(SEND_RSSI_DATA)
#define DESCR_RSSI "RSSI, "
#else
#define DESCR_RSSI ""
#endif
#if defined(ZUMSPOT_ADF7021)
#define BOARD_INFO "ZUMspot"
#elif defined(MMDVM_HS_HAT_REV12)
#define BOARD_INFO "MMDVM_HS_Hat"
#elif defined(MMDVM_HS_DUAL_HAT_REV10)
#define BOARD_INFO "MMDVM_HS_Dual_Hat"
#elif defined(NANO_HOTSPOT)
#define BOARD_INFO "Nano_hotSPOT"
#elif defined(NANO_DV_REV11)
#define BOARD_INFO "Nano_DV"
#elif defined(SKYBRIDGE_HS)
#define BOARD_INFO "SkyBridge"
#elif defined(LONESTAR_USB)
#define BOARD_INFO "LS_USB_STICK"
#else
#define BOARD_INFO "MMDVM_HS"
#endif
#if defined(ADF7021_14_7456)
#define DESCR_OSC "TCXO 14.7456, "
#endif
#if defined(ADF7021_12_2880)
#define DESCR_OSC "TCXO 12.2880, "
#endif
#if defined(ENABLE_ADF7021) && defined(ADF7021_N_VER)
#define RF_CHIP "ADF7021N, "
#elif defined(ENABLE_ADF7021)
#define RF_CHIP "ADF7021, "
#endif
#define DESCRIPTION "Digital Voice Modem DSP Hotspot [" BOARD_INFO "] (" RF_CHIP DESCR_DMR DESCR_P25 DESCR_NXDN DESCR_OSC DESCR_RSSI "CW Id)"
const uint8_t BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U };
#define CPU_TYPE_STM32 0x02U
@ -144,4 +197,8 @@ const uint8_t BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x0
#define _WRITE_BIT(p, i, b) p[(i) >> 3] = (b) ? (p[(i) >> 3] | BIT_MASK_TABLE[(i) & 7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i) & 7])
#define _READ_BIT(p, i) ((p[(i) >> 3] & BIT_MASK_TABLE[(i) & 7]) >> (7 - ((i) & 7)))
#if !defined(ENABLE_DMR) && !defined(ENABLE_P25) && !defined(ENABLE_NXDN)
#error "No protocol support compiled in? Must enable at least one: ENABLE_DMR, ENABLE_P25 and/or ENABLE_NXDN."
#endif
#endif // __DEFINES_H__

@ -66,6 +66,7 @@ bool m_dcd = false;
uint8_t m_control;
/** DMR BS */
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmr::DMRIdleRX dmrIdleRX;
dmr::DMRRX dmrRX;
@ -75,19 +76,30 @@ dmr::DMRTX dmrTX;
/** DMR MS-DMO */
dmr::DMRDMORX dmrDMORX;
dmr::DMRDMOTX dmrDMOTX;
#endif
/** P25 */
#if defined(ENABLE_P25)
p25::P25RX p25RX;
p25::P25TX p25TX;
#endif
/** NXDN */
#if defined(ENABLE_NXDN)
nxdn::NXDNRX nxdnRX;
nxdn::NXDNTX nxdnTX;
#endif
/** Calibration */
#if defined(ENABLE_DMR)
dmr::CalDMR calDMR;
#endif
#if defined(ENABLE_P25)
p25::CalP25 calP25;
#endif
#if defined(ENABLE_NXDN)
nxdn::CalNXDN calNXDN;
#endif
CalRSSI calRSSI;
/** CW */
@ -113,6 +125,7 @@ void loop()
io.process();
// The following is for transmitting
#if defined(ENABLE_DMR)
if (m_dmrEnable && m_modemState == STATE_DMR) {
#if defined(DUPLEX)
if (m_duplex)
@ -121,25 +134,36 @@ void loop()
dmrDMOTX.process();
#else
dmrDMOTX.process();
#endif
#endif // defined(DUPLEX)
}
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
if (m_p25Enable && m_modemState == STATE_P25)
p25TX.process();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
if (m_nxdnEnable && m_modemState == STATE_NXDN)
nxdnTX.process();
#endif // defined(ENABLE_NXDN)
#if defined(ENABLE_DMR)
if (m_modemState == STATE_DMR_DMO_CAL_1K || m_modemState == STATE_DMR_CAL_1K ||
m_modemState == STATE_DMR_LF_CAL || m_modemState == STATE_DMR_CAL ||
m_modemState == STATE_INT_CAL)
calDMR.process();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
if (m_modemState == STATE_P25_CAL_1K || m_modemState == STATE_P25_CAL)
calP25.process();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
if (m_modemState == STATE_NXDN_CAL)
calNXDN.process();
#endif // defined(ENABLE_NXDN)
if (m_modemState == STATE_RSSI_CAL)
calRSSI.process();

@ -110,28 +110,40 @@ extern SerialPort serial;
extern IO io;
/** DMR BS */
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
extern dmr::DMRIdleRX dmrIdleRX;
extern dmr::DMRRX dmrRX;
#endif
#endif // defined(DUPLEX)
extern dmr::DMRTX dmrTX;
/** DMR MS-DMO */
extern dmr::DMRDMORX dmrDMORX;
extern dmr::DMRDMOTX dmrDMOTX;
#endif // defined(ENABLE_DMR)
/** P25 BS */
#if defined(ENABLE_P25)
extern p25::P25RX p25RX;
extern p25::P25TX p25TX;
#endif // defined(ENABLE_P25)
/** NXDN BS */
#if defined(ENABLE_NXDN)
extern nxdn::NXDNRX nxdnRX;
extern nxdn::NXDNTX nxdnTX;
#endif // defined(ENABLE_NXDN)
/** Calibration */
#if defined(ENABLE_DMR)
extern dmr::CalDMR calDMR;
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
extern p25::CalP25 calP25;
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
extern nxdn::CalNXDN calNXDN;
#endif // defined(ENABLE_NXDN)
extern CalRSSI calRSSI;
/** CW */

@ -145,6 +145,7 @@ void IO::process()
m_rxBuffer.get(bit, control);
if (m_modemState == STATE_DMR) {
#if defined(ENABLE_DMR)
/** Digital Mobile Radio */
#if defined(DUPLEX)
if (m_duplex) {
@ -157,15 +158,20 @@ void IO::process()
dmrDMORX.databit(bit);
#else
dmrDMORX.databit(bit);
#endif
#endif // defined(DUPLEX)
#endif // defined(ENABLE_DMR)
}
else if (m_modemState == STATE_P25) {
#if defined(ENABLE_P25)
/** Project 25 */
p25RX.databit(bit);
#endif // defined(ENABLE_P25)
}
else if (m_modemState == STATE_NXDN) {
#if defined(ENABLE_NXDN)
/** Next Generation Digital Narrowband */
nxdnRX.databit(bit);
#endif // defined(ENABLE_NXDN)
}
}
}

@ -42,17 +42,9 @@
// ---------------------------------------------------------------------------
#if defined(DUPLEX)
#if defined(STM32_USB_HOST)
#define CAL_DLY_LOOP 98950U
#else
#define CAL_DLY_LOOP 96100U
#endif
#else
#if defined(STM32_USB_HOST)
#define CAL_DLY_LOOP 110850U
#else
#define CAL_DLY_LOOP 104600U
#endif
#endif
enum ADF_GAIN_MODE {

@ -162,11 +162,7 @@
#define PIN_DEB GPIO_Pin_9
#define PORT_DEB GPIOB
#if defined(STM32_USB_HOST)
#define PIN_NXDN_LED GPIO_Pin_1
#else
#define PIN_NXDN_LED GPIO_Pin_7
#endif
#define PORT_NXDN_LED GPIOA
#define PIN_DMR_LED GPIO_Pin_13
@ -566,8 +562,7 @@ void IO::initInt()
#endif
#if defined(STM32_USB_HOST)
// Pin PA11,PA12 = LOW, USB Reset
// Pin PA11,PA12 = LOW, USB Reset
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
@ -575,8 +570,6 @@ void IO::initInt()
GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_12, Bit_RESET);
#endif
#if defined(LONG_USB_RESET)
// 10 ms delay
delayUS(10000U);
@ -585,12 +578,6 @@ void IO::initInt()
for (delay = 0; delay < 512; delay++);
#endif
#if !defined(STM32_USB_HOST)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
#endif
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

@ -114,74 +114,35 @@ CXXFLAGS=-Os -g -fno-exceptions -ffunction-sections -fdata-sections -fno-builtin
LDFLAGS=-Os -g --specs=nano.specs --specs=nosys.specs
# Build Rules
.PHONY: all release_f1 release_f4 hs bl pi-f4 f446 clean
.PHONY: all release_f1bl bl f446 clean
all: hs
#error "Either PI_HAT_7021_REV_02, ZUMSPOT_ADF7021, LONESTAR_USB, MMDVM_HS_HAT_REV12, MMDVM_HS_DUAL_HAT_REV10, NANO_HOTSPOT, NANO_DV_REV11, or SKYBRIDGE_HS
zumspot-adf7021: CFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USART1_HOST
zumspot-adf7021: CXXFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USART1_HOST
zumspot-adf7021: hs
zumspot-adf7021: CFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USB_HOST
zumspot-adf7021: CXXFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USB_HOST
zumspot-adf7021: bl
zumspot-adf7021-duplex: CFLAGS+=-DDUPLEX
zumspot-adf7021-duplex: CXXFLAGS+=-DDUPLEX
zumspot-adf7021-duplex: zumspot-adf7021
zumspot-adf7021-usb: CFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USB_HOST
zumspot-adf7021-usb: CXXFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USB_HOST
zumspot-adf7021-usb: bl
zumspot-adf7021-usb-duplex: CFLAGS+=-DDUPLEX
zumspot-adf7021-usb-duplex: CXXFLAGS+=-DDUPLEX
zumspot-adf7021-usb-duplex: zumspot-adf7021-usb
pihat-7021-r2: CFLAGS+=-DPI_HAT_7021_REV_02 -DSTM32_USART1_HOST
pihat-7021-r2: CXXFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USART1_HOST
pihat-7021-r2: hs
pihat-7021-r2-duplex: CFLAGS+=-DDUPLEX
pihat-7021-r2-duplex: CXXFLAGS+=-DDUPLEX
pihat-7021-r2-duplex: pihat-7021-r2
lonestar-usb: CFLAGS+=-DLONESTAR_USB -DSTM32_USB_HOST
lonestar-usb: CXXFLAGS+=-DLONESTAR_USB -DSTM32_USB_HOST
lonestar-usb: bl
mmdvm-hs-hat: CFLAGS+=-DMMDVM_HS_HAT_REV12 -DSTM32_USART1_HOST
mmdvm-hs-hat: CXXFLAGS+=-DMMDVM_HS_HAT_REV12 -DSTM32_USART1_HOST
mmdvm-hs-hat: hs
mmdvm-hs-hat-debug: CFLAGS+=-DMMDVM_HS_HAT_REV12 -DSTM32_USART1_HOST
mmdvm-hs-hat-debug: CXXFLAGS+=-DMMDVM_HS_HAT_REV12 -DSTM32_USART1_HOST
mmdvm-hs-hat-debug: hs-debug
mmdvm-hs-hat: CFLAGS+=-DMMDVM_HS_HAT_REV12 -DSTM32_USB_HOST
mmdvm-hs-hat: CXXFLAGS+=-DMMDVM_HS_HAT_REV12 -DSTM32_USB_HOST
mmdvm-hs-hat: bl
mmdvm-hs-hat-dual: CFLAGS+=-DDUPLEX
mmdvm-hs-hat-dual: CXXFLAGS+=-DDUPLEX
mmdvm-hs-hat-dual: mmdvm-hs-hat
mmdvm-hs-hat-dual-debug: CFLAGS+=-DDUPLEX
mmdvm-hs-hat-dual-debug: CXXFLAGS+=-DDUPLEX
mmdvm-hs-hat-dual-debug: mmdvm-hs-hat-debug
mmdvm-hs-hat-usb: CFLAGS+=-DMMDVM_HS_HAT_REV12 -DSTM32_USB_HOST
mmdvm-hs-hat-usb: CXXFLAGS+=-DMMDVM_HS_HAT_REV12 -DSTM32_USB_HOST
mmdvm-hs-hat-usb: bl
mmdvm-hs-hat-usb-dual: CFLAGS+=-DDUPLEX
mmdvm-hs-hat-usb-dual: CXXFLAGS+=-DDUPLEX
mmdvm-hs-hat-usb-dual: mmdvm-hs-hat-usb
hs: CFLAGS+=$(CFLAGS_F1) $(DEFS_F1_HS)
hs: CXXFLAGS+=$(CXXFLAGS_F1) $(DEFS_F1_HS)
hs: LDFLAGS+=$(LDFLAGS_F1_N)
hs: release_f1
hs-debug: CFLAGS+=$(CFLAGS_F1) $(DEFS_F1_HS)
hs-debug: CXXFLAGS+=$(CXXFLAGS_F1) $(DEFS_F1_HS)
hs-debug: LDFLAGS+=$(LDFLAGS_F1_D)
hs-debug: release_f1
bl: CFLAGS+=$(CFLAGS_F1) $(DEFS_F1_HS_BL)
bl: CXXFLAGS+=$(CXXFLAGS_F1) $(DEFS_F1_HS_BL)
bl: LDFLAGS+=$(LDFLAGS_F1_BL)
bl: release_f1bl
release_f1: $(BINDIR)
release_f1: $(OBJDIR_F1)
release_f1: $(BINDIR)/$(BINBIN_F1)
release_f1bl: $(BINDIR)
release_f1bl: $(OBJDIR_F1)
release_f1bl: $(BINDIR)/$(BINBIN_F1BL)
@ -209,12 +170,6 @@ $(BINDIR)/$(BINELF_F1BL): $(OBJ_F1BL)
$(CXX) $(OBJ_F1BL) $(LDFLAGS) -o $@
$(SIZE) $(BINDIR)/$(BINELF_F1BL)
$(BINDIR)/$(BINBIN_F1): $(BINDIR)/$(BINELF_F1)
$(CP) -O binary $< $@
$(BINDIR)/$(BINELF_F1): $(OBJ_F1)
$(CXX) $(OBJ_F1) $(LDFLAGS) -o $@
$(SIZE) $(BINDIR)/$(BINELF_F1)
$(BINDIR)/$(BINBIN_F4): $(BINDIR)/$(BINELF_F4)
$(CP) -O binary $< $@
$(BINDIR)/$(BINELF_F4): $(OBJ_F4)

@ -17,36 +17,13 @@ Please see the various Makefile's included in the project for more information.
To build the firmware, use the ```make``` command, followed by -f and the correct makefile, followed by the type of board you are using.
> **_NOTE:_** The only two known tested targets are ```mmdvm-hs-hat-dual``` and ```mmdvm-hs-hat-dual-usb```.
An example of this would be ```make -f Makefile.STM32FX mmdvm-hs-hat-dual``` for a full duplex modem hotspot, attached to GPIO.
## Firmware installation
The device can be used on top on a RPi attached via the GPIO port or standalone and connected via USB. Both variants require different handling of compiling and uploading the firmware, examples on flashing devices are mostly not included here because the methods to flash vary from device to device.
The USB connection requires firmware with bootloader support whereas the GPIO version does not. For USB connection a bootloader has to be installed initally. This requires STlink connection. After that is done the firmware upgrade can be done via the USB connection. The STlink connection can be used as fallback if wrongly configured firmware was installed for example.
### Install the firmware via GPIO on Raspberry Pi
> **_NOTE:_** Your mileage may vary with these instructions, the hotspot boards are loosely designed around a common factor but not all are created equally.
First you will need to disable the serial console and disable bluetooth. Edit ```/boot/cmdline.txt``` and remove the line ```console=serial0, 115200```.
Next, you will need to disable bluetooth on the board. Edit ```/boot/config.txt``` and add a line containing ```dtoverlay=disable-bt```. Reboot.
> Most sets of instructions reccomend to download stm32flash from online, however we have found the prepackaged version to work fine.
The device can be used connected via USB.
Once the hotspot is back on, navigate to the build folder where you compiled the firmware. Put a jumper across the J1 points on the board, and the RED heartbeat LED should stop flashing. Run the below command to flash.
```stm32flash -v -w dvm-firmware-hs_f1.bin -i 20,-21,21,-20 -R /dev/ttyAMA0```
You should see the below output if the board flashed successfully.
```
Wrote and verified address 0x0800be40 (100.00%) Done.
Resetting device...
Reset done.
```
The USB connection requires firmware with bootloader. For USB connection a bootloader has to be installed initally. This requires STlink connection. After that is done the firmware upgrade can be done via the USB connection. The STlink connection can be used as fallback if wrongly configured firmware was installed for example.
### Install the firmware with bootloader support for USB connection

@ -38,61 +38,6 @@
// Constants
// ---------------------------------------------------------------------------
#if defined(ENABLE_DMR)
#define DESCR_DMR "DMR, "
#else
#define DESCR_DMR ""
#endif
#if defined(ENABLE_P25)
#define DESCR_P25 "P25, "
#else
#define DESCR_P25 ""
#endif
#if defined(ENABLE_NXDN)
#define DESCR_NXDN "NXDN, "
#else
#define DESCR_NXDN ""
#endif
#if defined(SEND_RSSI_DATA)
#define DESCR_RSSI "RSSI, "
#else
#define DESCR_RSSI ""
#endif
#if defined(ZUMSPOT_ADF7021)
#define BOARD_INFO "ZUMspot"
#elif defined(MMDVM_HS_HAT_REV12)
#define BOARD_INFO "MMDVM_HS_Hat"
#elif defined(MMDVM_HS_DUAL_HAT_REV10)
#define BOARD_INFO "MMDVM_HS_Dual_Hat"
#elif defined(NANO_HOTSPOT)
#define BOARD_INFO "Nano_hotSPOT"
#elif defined(NANO_DV_REV11)
#define BOARD_INFO "Nano_DV"
#elif defined(SKYBRIDGE_HS)
#define BOARD_INFO "SkyBridge"
#elif defined(LONESTAR_USB)
#define BOARD_INFO "LS_USB_STICK"
#else
#define BOARD_INFO "MMDVM_HS"
#endif
#if defined(ADF7021_14_7456)
#define DESCR_OSC "TCXO 14.7456, "
#endif
#if defined(ADF7021_12_2880)
#define DESCR_OSC "TCXO 12.2880, "
#endif
#if defined(ENABLE_ADF7021) && defined(ADF7021_N_VER)
#define RF_CHIP "ADF7021N, "
#elif defined(ENABLE_ADF7021)
#define RF_CHIP "ADF7021, "
#endif
#define DESCRIPTION "Digital Voice Modem DSP Hotspot [" BOARD_INFO "] (" RF_CHIP DESCR_DMR DESCR_P25 DESCR_NXDN DESCR_OSC DESCR_RSSI "CW Id)"
#define concat(a, b, c) a " (build " b " " c ")"
const char HARDWARE[] = concat(DESCRIPTION, __TIME__, __DATE__);
@ -198,13 +143,20 @@ void SerialPort::process()
break;
case CMD_CAL_DATA:
err = RSN_NAK;
#if defined(ENABLE_DMR)
if (m_modemState == STATE_DMR_DMO_CAL_1K || m_modemState == STATE_DMR_CAL_1K ||
m_modemState == STATE_DMR_LF_CAL || m_modemState == STATE_DMR_CAL)
err = calDMR.write(m_buffer + 3U, m_len - 3U);
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
if (m_modemState == STATE_P25_CAL_1K || m_modemState == STATE_P25_CAL)
err = calP25.write(m_buffer + 3U, m_len - 3U);
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
if (m_modemState == STATE_NXDN_CAL)
err = calNXDN.write(m_buffer + 3U, m_len - 3U);
#endif // defined(ENABLE_NXDN)
if (err == RSN_OK)
{
sendACK();
@ -249,6 +201,7 @@ void SerialPort::process()
/** Digital Mobile Radio */
case CMD_DMR_DATA1:
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
if (m_dmrEnable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) {
@ -266,10 +219,15 @@ void SerialPort::process()
}
#else
sendNAK(RSN_INVALID_REQUEST);
#endif
#endif // defined(DUPLEX)
#else
DEBUG2("SerialPort: process() received invalid DMR data", err);
sendNAK(err);
#endif // defined(ENABLE_DMR)
break;
case CMD_DMR_DATA2:
#if defined(ENABLE_DMR)
if (m_dmrEnable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) {
#if defined(DUPLEX)
@ -279,9 +237,12 @@ void SerialPort::process()
err = dmrDMOTX.writeData(m_buffer + 3U, m_len - 3U);
#else
err = dmrDMOTX.writeData(m_buffer + 3U, m_len - 3U);
#endif
#endif // defined(DUPLEX)
}
}
#else
err = RSN_NAK;
#endif // defined(ENABLE_DMR)
if (err == RSN_OK) {
if (m_modemState == STATE_IDLE)
setMode(STATE_DMR);
@ -293,6 +254,7 @@ void SerialPort::process()
break;
case CMD_DMR_START:
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
if (m_dmrEnable) {
err = RSN_INVALID_DMR_START;
@ -315,10 +277,14 @@ void SerialPort::process()
}
#else
sendNAK(RSN_INVALID_REQUEST);
#endif
#endif // defined(DUPLEX)
#else
sendNAK(RSN_INVALID_REQUEST);
#endif // defined(ENABLE_DMR)
break;
case CMD_DMR_SHORTLC:
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
if (m_dmrEnable)
err = dmrTX.writeShortLC(m_buffer + 3U, m_len - 3U);
@ -328,10 +294,14 @@ void SerialPort::process()
}
#else
sendNAK(RSN_INVALID_REQUEST);
#endif
#endif // defined(DUPLEX)
#else
sendNAK(RSN_INVALID_REQUEST);
#endif // defined(ENABLE_DMR)
break;
case CMD_DMR_ABORT:
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
if (m_dmrEnable)
err = dmrTX.writeAbort(m_buffer + 3U, m_len - 3U);
@ -341,10 +311,14 @@ void SerialPort::process()
}
#else
sendNAK(RSN_INVALID_REQUEST);
#endif
#endif // defined(DUPLEX)
#else
sendNAK(RSN_INVALID_REQUEST);
#endif // defined(ENABLE_DMR)
break;
case CMD_DMR_CACH_AT_CTRL:
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
if (m_dmrEnable) {
err = RSN_INVALID_REQUEST;
@ -359,11 +333,15 @@ void SerialPort::process()
}
#else
sendNAK(RSN_INVALID_REQUEST);
#endif
#endif // defined(DUPLEX)
#else
sendNAK(RSN_INVALID_REQUEST);
#endif // defined(ENABLE_DMR)
break;
/** Project 25 */
case CMD_P25_DATA:
#if defined(ENABLE_P25)
if (m_p25Enable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_P25)
err = p25TX.writeData(m_buffer + 3U, m_len - 3U);
@ -376,17 +354,25 @@ void SerialPort::process()
DEBUG2("SerialPort: process(): Received invalid P25 data", err);
sendNAK(err);
}
#else
sendNAK(RSN_INVALID_REQUEST);
#endif // defined(ENABLE_P25)
break;
case CMD_P25_CLEAR:
#if defined(ENABLE_P25)
if (m_p25Enable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_P25)
p25TX.clear();
}
#else
sendNAK(RSN_INVALID_REQUEST);
#endif // defined(ENABLE_P25)
break;
/** Next Generation Digital Narrowband */
case CMD_NXDN_DATA:
#if defined(ENABLE_NXDN)
if (m_nxdnEnable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_NXDN)
err = nxdnTX.writeData(m_buffer + 3U, m_len - 3U);
@ -399,6 +385,9 @@ void SerialPort::process()
DEBUG2("SerialPort: process(): Received invalid NXDN data", err);
sendNAK(err);
}
#else
sendNAK(RSN_INVALID_REQUEST);
#endif // defined(ENABLE_NXDN)
break;
default:
@ -922,6 +911,7 @@ void SerialPort::getStatus()
reply[6U] = 0U;
#if defined(ENABLE_DMR)
if (m_dmrEnable) {
#if defined(DUPLEX)
if (m_duplex) {
@ -934,23 +924,35 @@ void SerialPort::getStatus()
#else
reply[7U] = 10U;
reply[8U] = dmrDMOTX.getSpace();
#endif
#endif // defined(DUPLEX)
} else {
reply[7U] = 0U;
reply[8U] = 0U;
}
#else
reply[7U] = 0U;
reply[8U] = 0U;
#endif // defined(ENABLE_DMR)
reply[9U] = 0U;
#if defined(ENABLE_P25)
if (m_p25Enable)
reply[10U] = p25TX.getSpace();
else
reply[10U] = 0U;
#else
reply[10U] = 0U;
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
if (m_nxdnEnable)
reply[11U] = nxdnTX.getSpace();
else
reply[11U] = 0U;
#else
reply[11U] = 0U;
#endif // defined(ENABLE_NXDN)
writeInt(1U, reply, 12);
}
@ -1089,20 +1091,28 @@ uint8_t SerialPort::setConfig(const uint8_t* data, uint8_t length)
io.setDeviations(dmrTXLevel, p25TXLevel, nxdnTXLevel);
#if defined(ENABLE_P25)
p25TX.setPreambleCount(fdmaPreamble);
#endif // defined(ENABLE_P25)
#if defined(ENABLE_DMR)
dmrDMOTX.setPreambleCount(fdmaPreamble);
#endif // defined(ENABLE_DMR)
//nxdnTX.setPreambleCount(fdmaPreamble);
#if defined(ENABLE_P25)
p25RX.setNAC(nac);
#endif // defined(ENABLE_P25)
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrTX.setColorCode(colorCode);
dmrRX.setColorCode(colorCode);
dmrRX.setRxDelay(dmrRxDelay);
dmrIdleRX.setColorCode(colorCode);
#endif
#endif // defined(DUPLEX)
dmrDMORX.setColorCode(colorCode);
#endif // defined(ENABLE_DMR)
if (m_modemState != STATE_IDLE && isCalState(m_modemState)) {
io.updateCal(calRelativeState(m_modemState));
@ -1149,116 +1159,176 @@ void SerialPort::setMode(DVM_STATE modemState)
switch (modemState) {
case STATE_DMR:
DEBUG1("SerialPort: setMode(): mode set to DMR");
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_P25:
DEBUG1("SerialPort: setMode(): mode set to P25");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_NXDN:
DEBUG1("SerialPort: setMode(): mode set to NXDN");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
cwIdTX.reset();
break;
case STATE_DMR_CAL:
DEBUG1("SerialPort: setMode(): mode set to DMR Calibrate");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_P25_CAL:
DEBUG1("SerialPort: setMode(): mode set to P25 Calibrate");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_NXDN_CAL:
DEBUG1("SerialPort: setMode(): mode set to NXDN Calibrate");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_RSSI_CAL:
DEBUG1("SerialPort: setMode(): mode set to RSSI Calibrate");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_DMR_LF_CAL:
DEBUG1("SerialPort: setMode(): mode set to DMR 80Hz Calibrate");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_DMR_CAL_1K:
DEBUG1("SerialPort: setMode(): mode set to DMR BS 1031Hz Calibrate");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_DMR_DMO_CAL_1K:
DEBUG1("SerialPort: setMode(): mode set to DMR MS 1031Hz Calibrate");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
case STATE_P25_CAL_1K:
DEBUG1("SerialPort: setMode(): mode set to P25 1011Hz Calibrate");
#if defined(ENABLE_DMR)
#if defined(DUPLEX)
dmrIdleRX.reset();
dmrRX.reset();
#endif
#endif // defined(DUPLEX)
dmrDMORX.reset();
#endif // defined(ENABLE_DMR)
#if defined(ENABLE_P25)
p25RX.reset();
#endif // defined(ENABLE_P25)
#if defined(ENABLE_NXDN)
nxdnRX.reset();
#endif // defined(ENABLE_NXDN)
cwIdTX.reset();
break;
default:

@ -35,14 +35,7 @@
#if defined(STM32F10X_MD)
#include <stm32f10x_flash.h>
#if defined(STM32_USB_HOST)
#include <usb_serial.h>
#endif
#if defined(STM32_USART1_HOST) && defined(STM32_USB_HOST)
#error "You have to select STM32_USART1_HOST or STM32_USB_HOST, but not both"
#endif
// ---------------------------------------------------------------------------
// Constants
@ -279,11 +272,7 @@ void SerialPort::beginInt(uint8_t n, int speed)
{
switch (n) {
case 1U:
#if defined(STM32_USART1_HOST)
InitUSART1(speed);
#elif defined(STM32_USB_HOST)
usbserial.begin();
#endif
break;
case 3U:
InitUSART2(speed);
@ -302,11 +291,7 @@ int SerialPort::availableInt(uint8_t n)
{
switch (n) {
case 1U:
#if defined(STM32_USART1_HOST)
return m_USART1.available();
#elif defined(STM32_USB_HOST)
return usbserial.available();
#endif
case 3U:
m_USART2.available();
default:
@ -323,12 +308,8 @@ int SerialPort::availableForWriteInt(uint8_t n)
{
switch (n) {
case 1U:
#if defined(STM32_USART1_HOST)
return m_USART1.availableForWrite();
#elif defined(STM32_USB_HOST)
//return usbserial.availableForWrite();
return 1U; // we don't have this -- so fake it
#endif
case 3U:
return m_USART2.availableForWrite();
default:
@ -345,11 +326,7 @@ uint8_t SerialPort::readInt(uint8_t n)
{
switch (n) {
case 1U:
#if defined(STM32_USART1_HOST)
return m_USART1.read();
#elif defined(STM32_USB_HOST)
return usbserial.read();
#endif
case 3U:
return m_USART2.read();
default:
@ -369,15 +346,9 @@ void SerialPort::writeInt(uint8_t n, const uint8_t* data, uint16_t length, bool
{
switch (n) {
case 1U:
#if defined(STM32_USART1_HOST)
m_USART1.write(data, length);
if (flush)
m_USART1.flush();
#elif defined(STM32_USB_HOST)
usbserial.write(data, length);
if (flush)
usbserial.flush();
#endif
break;
case 3U:
m_USART2.write(data, length);

@ -34,6 +34,8 @@
using namespace dmr;
#if defined(ENABLE_DMR)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -289,3 +291,5 @@ uint8_t CalDMR::write(const uint8_t* data, uint8_t length)
return RSN_OK;
}
#endif // defined(ENABLE_DMR)

@ -35,6 +35,8 @@
#include "Defines.h"
#include "dmr/DMRDefines.h"
#if defined(ENABLE_DMR)
namespace dmr
{
// ---------------------------------------------------------------------------
@ -87,4 +89,6 @@ namespace dmr
};
} // namespace dmr
#endif // defined(ENABLE_DMR)
#endif // __CAL_DMR_H__

@ -36,6 +36,8 @@
using namespace dmr;
#if defined(ENABLE_DMR)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -380,3 +382,4 @@ void DMRDMORX::writeRSSIData(uint8_t* frame)
#endif
}
#endif // defined(ENABLE_DMR)

@ -35,6 +35,8 @@
#include "Defines.h"
#include "dmr/DMRDefines.h"
#if defined(ENABLE_DMR)
namespace dmr
{
// ---------------------------------------------------------------------------
@ -100,4 +102,6 @@ namespace dmr
};
} // namespace dmr
#endif // defined(ENABLE_DMR)
#endif // __DMR_DMO_RX_H__

@ -35,6 +35,8 @@
using namespace dmr;
#if defined(ENABLE_DMR)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -175,3 +177,5 @@ void DMRDMOTX::writeByte(uint8_t c)
io.write(&bit, 1);
}
}
#endif // defined(ENABLE_DMR)

@ -37,6 +37,8 @@
#include "dmr/DMRDefines.h"
#include "SerialBuffer.h"
#if defined(ENABLE_DMR)
namespace dmr
{
// ---------------------------------------------------------------------------
@ -82,4 +84,6 @@ namespace dmr
};
} // namespace dmr
#endif // defined(ENABLE_DMR)
#endif // __DMR_DMO_TX_H__

@ -35,7 +35,7 @@
using namespace dmr;
#if defined(DUPLEX)
#if defined(ENABLE_DMR) && defined(DUPLEX)
// ---------------------------------------------------------------------------
// Constants
@ -185,4 +185,4 @@ void DMRIdleRX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer)
}
}
#endif // DUPLEX
#endif // defined(ENABLE_DMR) && defined(DUPLEX)

@ -34,7 +34,7 @@
#include "Defines.h"
#include "dmr/DMRDefines.h"
#if defined(DUPLEX)
#if defined(ENABLE_DMR) && defined(DUPLEX)
namespace dmr
{
@ -77,6 +77,6 @@ namespace dmr
};
} // namespace dmr
#endif // DUPLEX
#endif // defined(ENABLE_DMR) && defined(DUPLEX)
#endif // __DMR_IDLE_RX_H__

@ -34,7 +34,7 @@
using namespace dmr;
#if defined(DUPLEX)
#if defined(ENABLE_DMR) && defined(DUPLEX)
// ---------------------------------------------------------------------------
// Public Class Members
@ -106,4 +106,4 @@ void DMRRX::setRxDelay(uint8_t delay)
m_slot2RX.setRxDelay(delay);
}
#endif // DUPLEX
#endif // defined(ENABLE_DMR) && defined(DUPLEX)

@ -35,7 +35,7 @@
#include "Defines.h"
#include "dmr/DMRSlotRX.h"
#if defined(DUPLEX)
#if defined(ENABLE_DMR) && defined(DUPLEX)
namespace dmr
{
@ -66,6 +66,6 @@ namespace dmr
};
} // namespace dmr
#endif // DUPLEX
#endif // defined(ENABLE_DMR) && defined(DUPLEX)
#endif // __DMR_RX_H__

@ -36,7 +36,7 @@
using namespace dmr;
#if defined(DUPLEX)
#if defined(ENABLE_DMR) && defined(DUPLEX)
// ---------------------------------------------------------------------------
// Constants
@ -417,4 +417,4 @@ void DMRSlotRX::writeRSSIData(uint8_t* frame)
#endif
}
#endif // DUPLEX
#endif // defined(ENABLE_DMR) && defined(DUPLEX)

@ -35,7 +35,7 @@
#include "Defines.h"
#include "dmr/DMRDefines.h"
#if defined(DUPLEX)
#if defined(ENABLE_DMR) && defined(DUPLEX)
namespace dmr
{
@ -110,6 +110,6 @@ namespace dmr
};
} // namespace dmr
#endif // DUPLEX
#endif // defined(ENABLE_DMR) && defined(DUPLEX)
#endif // __DMR_SLOT_RX_H__

@ -32,6 +32,8 @@
using namespace dmr;
#if defined(ENABLE_DMR)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -334,3 +336,5 @@ uint32_t DMRSlotType::getSyndrome1987(uint32_t pattern) const
return pattern;
}
#endif // defined(ENABLE_DMR)

@ -32,6 +32,8 @@
#include "Defines.h"
#if defined(ENABLE_DMR)
namespace dmr
{
// ---------------------------------------------------------------------------
@ -57,4 +59,6 @@ namespace dmr
};
} // namespace dmr
#endif // defined(ENABLE_DMR)
#endif // __DMR_SLOT_TYPE_H__

@ -35,6 +35,8 @@
using namespace dmr;
#if defined(ENABLE_DMR)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -523,3 +525,5 @@ void DMRTX::writeByte(uint8_t c, uint8_t control)
io.write(&bit, 1, &controlToWrite);
}
}
#endif // defined(ENABLE_DMR)

@ -37,6 +37,8 @@
#include "dmr/DMRDefines.h"
#include "SerialBuffer.h"
#if defined(ENABLE_DMR)
namespace dmr
{
// ---------------------------------------------------------------------------
@ -135,4 +137,6 @@ namespace dmr
};
} // namespace dmr
#endif // defined(ENABLE_DMR)
#endif // __DMR_TX_H__

@ -33,6 +33,8 @@
using namespace nxdn;
#if defined(ENABLE_NXDN)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -138,3 +140,5 @@ uint8_t CalNXDN::write(const uint8_t* data, uint16_t length)
return RSN_OK;
}
#endif // defined(ENABLE_NXDN)

@ -35,6 +35,8 @@
#include "Defines.h"
#include "nxdn/NXDNDefines.h"
#if defined(ENABLE_NXDN)
namespace nxdn
{
// ---------------------------------------------------------------------------
@ -70,4 +72,6 @@ namespace nxdn
};
} // namespace nxdn
#endif // defined(ENABLE_NXDN)
#endif // __CAL_NXDN_H__

@ -34,6 +34,8 @@
using namespace nxdn;
#if defined(ENABLE_NXDN)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -196,3 +198,5 @@ bool NXDNRX::correlateSync(bool first)
return false;
}
#endif // defined(ENABLE_NXDN)

@ -34,6 +34,7 @@
#include "Defines.h"
#include "nxdn/NXDNDefines.h"
#if defined(ENABLE_NXDN)
namespace nxdn
{
// ---------------------------------------------------------------------------
@ -81,5 +82,6 @@ namespace nxdn
bool correlateSync(bool first = false);
};
} // namespace nxdn
#endif // defined(ENABLE_NXDN)
#endif // __NXDN_RX_H__

@ -35,6 +35,8 @@
using namespace nxdn;
#if defined(ENABLE_NXDN)
// ---------------------------------------------------------------------------
// Public Class Members
// ---------------------------------------------------------------------------
@ -241,3 +243,5 @@ void NXDNTX::writeSilence()
io.write(&bit, 1);
}
}
#endif // defined(ENABLE_NXDN)

@ -35,6 +35,8 @@
#include "Defines.h"
#include "SerialBuffer.h"
#if defined(ENABLE_NXDN)
namespace nxdn
{
// ---------------------------------------------------------------------------
@ -100,4 +102,6 @@ namespace nxdn
};
} // namespace nxdn
#endif // defined(ENABLE_NXDN)
#endif // __NXDN_TX_H__

@ -32,6 +32,8 @@
using namespace p25;
#if defined(ENABLE_P25)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -143,3 +145,5 @@ uint8_t CalP25::write(const uint8_t* data, uint8_t length)
return RSN_OK;
}
#endif // defined(ENABLE_P25)

@ -33,6 +33,8 @@
#include "Defines.h"
#include "p25/P25Defines.h"
#if defined(ENABLE_P25)
namespace p25
{
// ---------------------------------------------------------------------------
@ -67,4 +69,6 @@ namespace p25
};
} // namespace p25
#endif // defined(ENABLE_P25)
#endif // __CAL_P25_H__

@ -35,6 +35,8 @@
using namespace p25;
#if defined(ENABLE_P25)
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
@ -461,3 +463,5 @@ bool P25RX::decodeNid()
return false;
}
#endif // defined(ENABLE_P25)

@ -35,6 +35,8 @@
#include "Defines.h"
#include "p25/P25Defines.h"
#if defined(ENABLE_P25)
namespace p25
{
// ---------------------------------------------------------------------------
@ -98,4 +100,6 @@ namespace p25
};
} // namespace p25
#endif // defined(ENABLE_P25)
#endif // __P25_RX_H__

@ -35,6 +35,8 @@
using namespace p25;
#if defined(ENABLE_P25)
// ---------------------------------------------------------------------------
// Public Class Members
// ---------------------------------------------------------------------------
@ -270,3 +272,5 @@ void P25TX::writeSilence()
io.write(&bit, 1);
}
}
#endif // defined(ENABLE_P25)

@ -35,6 +35,8 @@
#include "Defines.h"
#include "SerialBuffer.h"
#if defined(ENABLE_P25)
namespace p25
{
// ---------------------------------------------------------------------------
@ -103,4 +105,6 @@ namespace p25
};
} // namespace p25
#endif // defined(ENABLE_P25)
#endif // __P25_TX_H__

Loading…
Cancel
Save

Powered by TurnKey Linux.