From b54e5ef8a5b4b15c441375253c7eadc56e6f579c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Ryb=C3=A1rsky?= Date: Tue, 4 Nov 2025 19:49:24 +0100 Subject: [PATCH] Test --- app/fskmodem.c | 81 +++++++++++++++++++++++++++++++------------------- app/fskmodem.h | 2 +- app/main.c | 2 ++ app/messages.c | 5 ++-- app/messages.h | 2 +- 5 files changed, 57 insertions(+), 35 deletions(-) diff --git a/app/fskmodem.c b/app/fskmodem.c index 5dcf647..dad58cc 100644 --- a/app/fskmodem.c +++ b/app/fskmodem.c @@ -30,7 +30,7 @@ typedef enum { RXState rxState = Ready; - uint8_t SMSResponseCounterTarget = 6; +uint8_t SMSResponseCounterTarget = 6; void FSKModem_TimeSlice500ms(void) { if (SMSResponseCounter && FUNCTION_IsRx() && SMSResponseCounter++ > SMSResponseCounterTarget) { @@ -65,54 +65,73 @@ void FSKModem_TimeSlice500ms(void) { void MSG_ConfigureFSK(bool rx) { BK4819_WriteRegister(BK4819_REG_70, TONE2_ENABLE_BIT | (96U << 0)); + // Compute tone frequency control word (for 26 MHz XTAL) +#define BK4819_FREQ_WORD(freq_hz) ((uint16_t)((freq_hz) * 10.32444f)) + + // Tone word macro for 26MHz XTAL (app note: freq * 10.32444) +#undef BK4819_FREQ_WORD +#define BK4819_FREQ_WORD(freq_hz) ((uint16_t)((freq_hz) * 10.32444f)) + switch (gEeprom.FSKMode) { case MOD_AFSK_2400: - TONE2_FREQ = 24779U; // Estimated + TONE2_FREQ = BK4819_FREQ_WORD(2400.0f); break; case MOD_AFSK_1200: - TONE2_FREQ = 12389U; + TONE2_FREQ = BK4819_FREQ_WORD(1200.0f); break; case MOD_FSK_700: - TONE2_FREQ = 7227U; + TONE2_FREQ = BK4819_FREQ_WORD(700.0f); break; case MOD_FSK_450: - TONE2_FREQ = 4646U; + TONE2_FREQ = BK4819_FREQ_WORD(450.0f); break; case MOD_FSK_1200_2400: - TONE2_FREQ = 12389U; // Default to 1200Hz, dynamic switching may be required + TONE2_FREQ = BK4819_FREQ_WORD(1200.0f); break; case MOD_NOAA_SAME: - TONE2_FREQ = 2083U; // NOAA SAME uses 2083.3 Hz for mark and 1562.5 Hz for space + TONE2_FREQ = BK4819_FREQ_WORD(2083.3f); + break; + default: + TONE2_FREQ = BK4819_FREQ_WORD(1200.0f); break; } - BK4819_WriteRegister(BK4819_REG_72, TONE2_FREQ); -// uint16_t fskConfig = FSK_ENABLE_BIT | FSK_RX_BW_1_2K | FSK_RX_GAIN_DEFAULT | FSK_PREAMBLE_TYPE_AA; -// if (gEeprom.FSKMode == MOD_AFSK_1200) { -// fskConfig = FSK_ENABLE_BIT | FSK_TX_MODE_FSK_1_2K_2_4K | FSK_RX_MODE_FSK_1_2K_2_4K_NOAA; -// } - + // Base config (enable + preamble type AA) uint16_t fskConfig = FSK_ENABLE_BIT | FSK_PREAMBLE_TYPE_AA; + // Compose the correct fields into REG_58: + // - TX mode bits are at <15:13> (use your FSK_TX_MODE_* macros which are <<13) + // - RX mode bits are at <12:10> (use your FSK_RX_MODE_* macros which are <<10) + // - RX BW bits are at <3:1> (use your FSK_RX_BW_* macros which are <<1) switch (gEeprom.FSKMode) { + case MOD_AFSK_1200: + fskConfig |= FSK_TX_MODE_FFSK_1200_1800 /*<<13 in macro*/ + | FSK_RX_MODE_FFSK_1200_1800 /*<<10 in macro*/ + | FSK_RX_BW_FFSK_1200_1800; /*<<1 in macro*/ + break; + + case MOD_AFSK_2400: + fskConfig |= FSK_TX_MODE_FFSK_1200_2400 + | FSK_RX_MODE_FFSK_1200_2400 + | FSK_RX_BW_2_4K_FFSK_1200_2400; + break; + + case MOD_NOAA_SAME: + fskConfig |= FSK_TX_MODE_NOAA_SAME + | FSK_RX_MODE_FSK_1_2K_2_4K_NOAA + | FSK_RX_BW_NOAA_SAME; + break; + case MOD_FSK_700: case MOD_FSK_450: case MOD_FSK_1200_2400: - fskConfig |= FSK_TX_MODE_FSK_1_2K_2_4K | FSK_RX_MODE_FSK_1_2K_2_4K_NOAA | FSK_RX_BW_1_2K; - break; - case MOD_AFSK_1200: - fskConfig |= FSK_TX_MODE_FFSK_1200_1800 | FSK_RX_MODE_FFSK_1200_1800 | FSK_RX_BW_FFSK_1200_1800; - break; - case MOD_AFSK_2400: - fskConfig |= FSK_TX_MODE_FFSK_1200_2400 | FSK_RX_MODE_FFSK_1200_2400 | FSK_RX_BW_2_4K_FFSK_1200_2400; - break; - case MOD_NOAA_SAME: - fskConfig |= FSK_TX_MODE_NOAA_SAME | FSK_RX_MODE_FSK_1_2K_2_4K_NOAA | FSK_RX_BW_NOAA_SAME; - break; default: - // Unsupported mode; keep previous setting + // binary FSK 1.2k/2.4k - use default FSK TX/RX modes and 1.2k BW + fskConfig |= FSK_TX_MODE_FSK_1_2K_2_4K + | FSK_RX_MODE_FSK_1_2K_2_4K_NOAA + | FSK_RX_BW_1_2K; break; } @@ -127,19 +146,19 @@ void MSG_ConfigureFSK(bool rx) { BK4819_WriteRegister(BK4819_REG_5E, (64U << 3) | (1U << 0)); } + // Data length (REG_5D<15:8>) size_t size = sizeof(dataPacket); - if (rx) { - size = (((size + 1) / 2) * 2) + 2; - } + if (rx) size = (((size + 1) / 2) * 2) + 2; BK4819_WriteRegister(BK4819_REG_5D, (size << 8)); BK4819_FskClearFifo(); + // REG_59: clear flags, preamble len, sync len etc. uint16_t fskParams = FSK_SYNC_LEN_BIT | ((rx ? 0U : 15U) << 4); - if (gCurrentVfo->SCRAMBLING_TYPE > 0) { - fskParams |= FSK_SCRAMBLE_ENABLE; - } + if (gCurrentVfo->SCRAMBLING_TYPE > 0) fskParams |= FSK_SCRAMBLE_ENABLE; BK4819_WriteRegister(BK4819_REG_59, fskParams); + + // Clear interrupt flags BK4819_WriteRegister(BK4819_REG_02, 0); } diff --git a/app/fskmodem.h b/app/fskmodem.h index 8f6e9ef..a690a2d 100644 --- a/app/fskmodem.h +++ b/app/fskmodem.h @@ -80,7 +80,7 @@ #define DataPacketDataSize (21) -#define SEQParameterEEPROM 0x1BD0 +#define SEQParameterEEPROM 0x1D00 typedef struct { uint32_t dest; //4bytes diff --git a/app/main.c b/app/main.c index f2c9a5f..58ddb4b 100644 --- a/app/main.c +++ b/app/main.c @@ -47,6 +47,7 @@ #include "settings.h" #include "ui/inputbox.h" #include "ui/ui.h" +#include "messages.h" #include static void toggle_chan_scanlist(void) { // toggle the selected channels scanlist setting @@ -677,6 +678,7 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) { } if (gWasFKeyPressed && bKeyPressed) { + MESSAGES_GET(); gRequestDisplayScreen = DISPLAY_MESSAGES; return; } diff --git a/app/messages.c b/app/messages.c index d5dfdfe..efd6c93 100644 --- a/app/messages.c +++ b/app/messages.c @@ -36,7 +36,8 @@ void MESSAGES_SAVE() { if (msgIndex >= MESSAGES_COUNT) { msgIndex = 0; } - Data[1]++; + msgIndex++; + Data[1] = msgIndex; EEPROM_WriteBuffer(SEQParameterEEPROM, Data); EEPROM_WriteBuffer(MESSAGES_START + (msgIndex * sizeof(StoredPacket)) + 0, (uint8_t *) &inBoundPacket + 4); // metadata @@ -121,7 +122,7 @@ void MESSAGES_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { if (bKeyPressed) { memset(dataPacket.data, 0, DataPacketDataSize); prepareDataPacket(); - //dataPacket.flags = 0x80 | (gCurrentVfo->OUTPUT_POWER & 0x07); + dataPacket.flags = 0x80 | (gCurrentVfo->OUTPUT_POWER & 0x07); if (dataPacket.src == 665 || dataPacket.src == 664) { uint8_t out[5]; diff --git a/app/messages.h b/app/messages.h index 0f45f58..6f56158 100644 --- a/app/messages.h +++ b/app/messages.h @@ -8,7 +8,7 @@ #include "../driver/keyboard.h" #include "../driver/eeprom.h" -#define MESSAGES_START (0x1D00) +#define MESSAGES_START (0x1D08) #define MESSAGES_COUNT (6) typedef struct {