From 55f524509a236e277210ee32e6925a7aa8a75fe4 Mon Sep 17 00:00:00 2001 From: sq8vps Date: Thu, 7 Sep 2023 07:49:26 +0200 Subject: [PATCH] setting uart default modes --- CHANGELOG.md | 1 + Inc/drivers/uart.h | 1 + Src/config.c | 11 +++- Src/drivers/uart.c | 6 +- Src/terminal.c | 160 ++++++++++++++++++++++++++++++--------------- doc/manual.md | 4 +- doc/manual_pl.md | 4 +- 7 files changed, 127 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccd15bb..f3867c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## New features * New modems: AFSK Bell 103 (300 Bd, 1600/1800 Hz), GFSK G3RUH (9600 Bd), AFSK V.23 (1200 Bd, 1300/2100 Hz) * FX.25 (AX.25 with Reed-Solomon FEC) support +* Default UART/USB modes can be configured ## Bug fixes * none ## Other diff --git a/Inc/drivers/uart.h b/Inc/drivers/uart.h index d700057..23cba43 100644 --- a/Inc/drivers/uart.h +++ b/Inc/drivers/uart.h @@ -53,6 +53,7 @@ typedef struct uint16_t txBufferHead, txBufferTail; uint8_t txBufferFull : 1; enum UartMode mode; + enum UartMode defaultMode; uint16_t lastRxBufferHead; //for special characters handling uint8_t kissBuffer[AX25_FRAME_MAX_SIZE + 1]; uint16_t kissBufferHead; diff --git a/Src/config.c b/Src/config.c index 1477cca..a6413cb 100644 --- a/Src/config.c +++ b/Src/config.c @@ -97,7 +97,10 @@ along with VP-DigiConfig. If not, see . #define CONFIG_ALLOWNONAPRS 1214 #define CONFIG_FX25 1216 #define CONFIG_MODEM 1218 -#define CONFIG_XXX 1220 //next address (not used) +#define CONFIG_MODE_USB 1220 +#define CONFIG_MODE_UART1 1222 +#define CONFIG_MODE_UART2 1224 +#define CONFIG_XXX 1226 //next address (not used) /** @@ -267,6 +270,9 @@ void ConfigWrite(void) write(CONFIG_ALLOWNONAPRS, Ax25Config.allowNonAprs); write(CONFIG_FX25, Ax25Config.fx25 | (Ax25Config.fx25Tx << 1)); write(CONFIG_MODEM, ModemConfig.modem); + write(CONFIG_MODE_USB, UartUsb.defaultMode); + write(CONFIG_MODE_UART1, Uart1.defaultMode); + write(CONFIG_MODE_UART2, Uart2.defaultMode); write(CONFIG_FLAG, CONFIG_FLAG_WRITTEN); @@ -359,6 +365,9 @@ uint8_t ConfigRead(void) Ax25Config.fx25 = t & 1; Ax25Config.fx25Tx = (t & 2) > 0; ModemConfig.modem = read(CONFIG_MODEM); + UartUsb.defaultMode = read(CONFIG_MODE_USB); + Uart1.defaultMode = read(CONFIG_MODE_UART1); + Uart2.defaultMode = read(CONFIG_MODE_UART2); return 1; } diff --git a/Src/drivers/uart.c b/Src/drivers/uart.c index 4b381f6..0817874 100644 --- a/Src/drivers/uart.c +++ b/Src/drivers/uart.c @@ -25,7 +25,7 @@ along with VP-Digi. If not, see . #include "digipeater.h" #include "kiss.h" -Uart Uart1, Uart2, UartUsb; +Uart Uart1 = {.defaultMode = MODE_KISS}, Uart2 = {.defaultMode = MODE_KISS}, UartUsb= {.defaultMode = MODE_KISS}; static void handleInterrupt(Uart *port) { @@ -147,7 +147,9 @@ void UartInit(Uart *port, USART_TypeDef *uart, uint32_t baud) port->txBufferHead = 0; port->txBufferTail = 0; port->txBufferFull = 0; - port->mode = MODE_KISS; + if(port->defaultMode > MODE_MONITOR) + port->defaultMode = MODE_KISS; + port->mode = port->defaultMode; port->enabled = 0; port->kissBufferHead = 0; port->lastRxBufferHead = 0; diff --git a/Src/terminal.c b/Src/terminal.c index ce130c6..86742cc 100644 --- a/Src/terminal.c +++ b/Src/terminal.c @@ -93,56 +93,78 @@ void TermSendNumberToAll(enum UartMode mode, int32_t n) } -static const char monitorHelp[] = "\r\nCommans available in monitor mode:\r\n" - "help - shows this help page\r\n" - "cal {low|high|alt|stop} - transmits/stops transmitter calibration pattern\r\n" - "\tlow - transmits MARK tone, high - transmits SPACE tone, alt - transmits alternating tones (null bytes)\r\n" - "beacon - immediately transmits selected beacon (number from 0 to 7)\r\n" - "kiss - switches to KISS mode\r\n" - "config - switches to config mode\r\n" - "reboot - reboots the device\r\n" +static const char monitorHelp[] = "\r\nCommands available in monitor mode:\r\n" + "help - show this help page\r\n" + "cal {low|high|alt|stop} - transmit/stop transmitter calibration pattern\r\n" + "\tlow - transmit MARK tone, high - transmit SPACE tone, alt - transmit alternating tones (null bytes)\r\n" + "beacon - immediately transmit selected beacon (number from 0 to 7)\r\n" + "kiss - switch to KISS mode\r\n" + "config - switch to config mode\r\n" + "reboot - reboot the device\r\n" "time - show time since boot\r\n" - "version - shows full firmware version info\r\n\r\n\r\n"; + "version - show full firmware version info\r\n\r\n\r\n"; static const char configHelp[] = "\r\nCommands available in config mode:\r\n" - "print - prints all configuration parameters\r\n" - "list - prints callsign filter list\r\n" - "save - saves configuration and reboots the device\r\n" - "eraseall - erases all configurations and reboots the device\r\n" - "help - shows this help page\r\n" - "reboot - reboots the device\r\n" + "print - print all configuration parameters\r\n" + "list - print callsign filter list\r\n" + "save - save configuration and reboot the device\r\n" + "eraseall - erase all configurations and reboot the device\r\n" + "help - show this help page\r\n" + "reboot - reboot the device\r\n" "time - show time since boot\r\n" - "version - shows full firmware version info\r\n\r\n" - "modem - sets modem type: 1200, 1200_V23, 300 or 9600\r\n" - "call - sets callsign with optional SSID\r\n" - "dest
- sets destination address\r\n" - "txdelay <50-2550> - sets TXDelay time (ms)\r\n" - "txtail <10-2550> - sets TXTail time (ms)\r\n" - "quiet <100-2550> - sets quiet time (ms)\r\n" - "rs1baud/rs2baud <1200-115200> - sets UART1/UART2 baudrate\r\n" - "pwm [on/off] - enables/disables PWM. If PWM is off, R2R will be used instead\r\n" + "version - show full firmware version info\r\n\r\n" + "modem - set modem type: 1200, 1200_V23, 300 or 9600\r\n" + "call - set callsign with optional SSID\r\n" + "dest
- set destination address\r\n" + "txdelay <50-2550> - set TXDelay time (ms)\r\n" + "txtail <10-2550> - set TXTail time (ms)\r\n" + "quiet <100-2550> - set quiet time (ms)\r\n" + "uart <1/2> baud <1200-115200> - set UART baud rate\r\n" + "uart <0/1/2> mode [kiss/monitor/config] - set UART default mode (0 for USB)\r\n" + "pwm [on/off] - enable/disable PWM. If PWM is off, R2R will be used instead\r\n" "flat [on/off] - set to \"on\" if flat audio input is used\r\n" - "beacon <0-7> [on/off] - enables/disables specified beacon\r\n" - "beacon <0-7> [iv/dl] <0-720> - sets interval/delay for the specified beacon (min)\r\n" - "beacon <0-7> path /none - sets path for the specified beacon\r\n" - "beacon <0-7> data - sets information field for the specified beacon\r\n" - "digi [on/off] - enables/disables whole digipeater\r\n" - "digi <0-7> [on/off] - enables/disables specified slot\r\n" - "digi <0-7> alias - sets alias for the specified slot\r\n" - "digi <0-3> [max/rep] <0/1-7> - sets maximum/replacement N for the specified slot\r\n" - "digi <0-7> trac [on/off] - enables/disables packet tracing for the specified slot\r\n" - "digi <0-7> viscous [on/off] - enables/disables viscous-delay digipeating for the specified slot\r\n" - "digi <0-7> direct [on/off] - enables/disables direct-only digipeating for the specified slot\r\n"\ - "digi <0-7> filter [on/off] - enables/disables packet filtering for the specified slot\r\n" - "digi filter [black/white] - sets filtering type to blacklist/whitelist\r\n" - "digi dupe <5-255> - sets anti-dupe buffer time (s)\r\n" - "digi list <0-19> [set /remove] - sets/clears specified callsign slot in filter list\r\n" + "beacon <0-7> [on/off] - enable/disable specified beacon\r\n" + "beacon <0-7> [iv/dl] <0-720> - set interval/delay for the specified beacon (min)\r\n" + "beacon <0-7> path /none - set path for the specified beacon\r\n" + "beacon <0-7> data - set information field for the specified beacon\r\n" + "digi [on/off] - enable/disable whole digipeater\r\n" + "digi <0-7> [on/off] - enable/disable specified slot\r\n" + "digi <0-7> alias - set alias for the specified slot\r\n" + "digi <0-3> [max/rep] <0/1-7> - set maximum/replacement N for the specified slot\r\n" + "digi <0-7> trac [on/off] - enable/disable packet tracing for the specified slot\r\n" + "digi <0-7> viscous [on/off] - enable/disable viscous-delay digipeating for the specified slot\r\n" + "digi <0-7> direct [on/off] - enable/disable direct-only digipeating for the specified slot\r\n"\ + "digi <0-7> filter [on/off] - enable/disable packet filtering for the specified slot\r\n" + "digi filter [black/white] - set filter type to blacklist/whitelist\r\n" + "digi dupe <5-255> - set duplicate protection buffer time (s)\r\n" + "digi list <0-19> [set /remove] - set/clear given callsign slot in filter list\r\n" "monkiss [on/off] - send own and digipeated frames to KISS ports\r\n" "nonaprs [on/off] - enable reception of non-APRS frames\r\n" "fx25 [on/off] - enable FX.25 protocol (AX.25 + FEC)\r\n" "fx25tx [on/off] - enable TX in FX.25 mode\r\n"; +static void sendUartParams(Uart *output, Uart *uart) +{ + if(!uart->isUsb) + { + UartSendNumber(output, uart->baudrate); + UartSendString(output, " baud, ", 0); + } + UartSendString(output, "default mode: ", 0); + switch(uart->defaultMode) + { + case MODE_KISS: + UartSendString(output, "KISS", 0); + break; + case MODE_MONITOR: + UartSendString(output, "monitor", 0); + break; + case MODE_TERM: + UartSendString(output, "configuration", 0); + break; + } +} static void printConfig(Uart *src) { @@ -184,10 +206,12 @@ static void printConfig(Uart *src) UartSendNumber(src, Ax25Config.txTailLength); UartSendString(src, "\r\nQuiet time (ms): ", 0); UartSendNumber(src, Ax25Config.quietTime); - UartSendString(src, "\r\nUART1 baudrate: ", 0); - UartSendNumber(src, Uart1.baudrate); - UartSendString(src, "\r\nUART2 baudrate: ", 0); - UartSendNumber(src, Uart2.baudrate); + UartSendString(src, "\r\nUSB: ", 0); + sendUartParams(src, &UartUsb); + UartSendString(src, "\r\nUART1: ", 0); + sendUartParams(src, &Uart1); + UartSendString(src, "\r\nUART2: ", 0); + sendUartParams(src, &Uart2); UartSendString(src, "\r\nDAC type: ", 0); if(ModemConfig.usePWM) UartSendString(src, "PWM", 0); @@ -652,25 +676,55 @@ void TermParse(Uart *src) Ax25Config.quietTime = (uint16_t)t; } } - else if(!strncmp(cmd, "rs1baud", 7) || !strncmp(cmd, "rs2baud", 7)) + else if(!strncmp(cmd, "uart", 4)) { - int64_t t = StrToInt(&cmd[8], len - 8); - if((t > 115200) || (t < 1200)) + Uart *u = NULL; + if((cmd[5] - '0') == 1) + u = &Uart1; + else if((cmd[5] - '0') == 2) + u = &Uart2; + else if((cmd[5] - '0') == 0) + u = &UartUsb; + else { - UartSendString(src, "Incorrect baudrate!\r\n", 0); + UartSendString(src, "Incorrect UART number!\r\n", 0); + return; } - else + if(!strncmp(&cmd[7], "baud", 4)) { - if(cmd[2] == '1') - Uart1.baudrate = (uint32_t)t; - else if(cmd[2] == '2') - Uart2.baudrate = (uint32_t)t; + int64_t t = StrToInt(&cmd[12], len - 12); + if((t > 115200) || (t < 1200)) + { + UartSendString(src, "Incorrect baud rate!\r\n", 0); + return; + } + u->baudrate = (uint32_t)t; + } + else if(!strncmp(&cmd[7], "mode", 4)) + { + if(!strncmp(&cmd[12], "kiss", 4)) + { + u->defaultMode = MODE_KISS; + } + else if(!strncmp(&cmd[12], "monitor", 7)) + { + u->defaultMode = MODE_MONITOR; + } + else if(!strncmp(&cmd[12], "config", 6)) + { + u->defaultMode = MODE_TERM; + } else { - UartSendString(src, "Incorrect port number!\r\n", 0); + UartSendString(src, "Incorrect UART mode!\r\n", 0); return; } } + else + { + UartSendString(src, "Incorrect option!\r\n", 0); + return; + } } else if(!strncmp(cmd, "beacon", 6)) { diff --git a/doc/manual.md b/doc/manual.md index fc130c9..662c85a 100644 --- a/doc/manual.md +++ b/doc/manual.md @@ -85,8 +85,8 @@ The following commands are available in configuration mode: - `txdelay TIME` – sets the preamble length before transmitting a frame. Value in milliseconds, ranging from 30 to 2550. - `txtail TIME` – sets the tail length after a frame transmission. Value in milliseconds, ranging from 10 to 2550. Set to the minimum value if not needed. - `quiet TIME` – sets the time that must elapse between channel release and transmission start. Value in milliseconds, ranging from 100 to 2550. -- `rs1baud BAUDRATE` – sets the baud rate for UART1 port. Value ranging from 1200 to 115200. -- `rs2baud BAUDRATE` – sets the baud rate for UART2 port. Value ranging from 1200 to 115200. +- `uart NUMBER baud RATE` - sets the baud rate (1200-115200 Bd) for the selected serial port. +- `uart NUMBER mode ` - sets the default operating mode for the selected serial port (0 for USB). - `pwm ` – sets the DAC type. *on* when a PWM filter is installed, *off* when an R2R ladder is installed. Starting from version 2.0.0, it is recommended to use only PWM. - `flat ` – configures the modem for use with a radio with *flat audio* output. *on* when the signal is fed from the *flat audio* connector, *off* when the signal is fed from the headphone jack. This option only affects 1200 Bd modems. - `beacon NUMBER ` – *on* activates, *off* deactivates the beacon with the specified number, ranging from 0 to 7. diff --git a/doc/manual_pl.md b/doc/manual_pl.md index 252ee0e..f41118e 100644 --- a/doc/manual_pl.md +++ b/doc/manual_pl.md @@ -88,8 +88,8 @@ W trybie konfiguracji dostępne są następujące polecenia: - `txdelay CZAS` – ustawia długość preambuły do nadania przed ramką. Wartość w milisekundach z zakresu od 30 do 2550 - `txtail CZAS` – ustawia ogona nadawanego po ramce. Wartość w milisekundach, z zakresu od 10 do 2550. Jeśli nie zachodzi potrzeba, należy ustawić wartość minimalną. - `quiet CZAS` – ustawia czas, który musi upłynąć pomiędzy zwolnieniem się kanału a włączeniem nadawania. Wartość w milisekundach z zakresu od 100 do 2550. -- `rs1baud PREDKOSC` – ustawia prędkość (*baudrate*) portu UART1. Wartość z zakresu od 1200 do 115200. -- `rs2baud PREDKOSC` – ustawia prędkość (*baudrate*) portu UART2. Wartość z zakresu od 1200 do 115200. +- `uart NUMER baud PREDKOSC` - ustawia prędkość (1200-115200 Bd) pracy wybranego portu szeregowego. +- `uart NUMBER mode ` – ustawia typ DAC. *on*, gdy zainstalowany jest filtr PWM, *off* gdy zainstalowana jest drabinka R2R. Od wersji 2.0.0 zalecane jest użycie wyłącznie PWM. - `flat ` – konfiguruje modem do użycia z radiem z wyjściem *flat audio*. *on* gdy sygnał podawany jest ze złącza *flat audio*, *off* gdy sygnał podawany jest ze złącza słuchawkowego. Opcja ma wpływ jedynie na modemy 1200 Bd. - `beacon NUMER ` – *on* włącza, *off* wyłącza beacon o podanym numerze z zakresu od 0 do 7.