Compare commits

..
Author SHA1 Message Date
Armel FAUVEAU 086858945b Merge pull request #133 from armel/feature_update_v4
Feature update v4
2026-02-05 23:42:07 +01:00
Armel FAUVEAU df99e6dc1f New version 5.1.0 2026-02-05 23:39:37 +01:00
Armel FAUVEAU 5ee5ec8873 Prepare new version 2026-02-05 23:15:20 +01:00
Armel FAUVEAU 5170170bb1 Fix spectrum RenderStill() 2026-02-05 05:11:00 +01:00
Armel FAUVEAU 76c48044c8 Shift BITMAP_VFO_Lock 2026-02-05 00:24:33 +01:00
Armel FAUVEAU ead079dc5b Update donors 2026-02-04 13:36:50 +01:00
Armel FAUVEAU add6fb17ed Fix SETTINGS_ResetTxLock() 2026-02-04 13:22:59 +01:00
Armel FAUVEAU c4079b1c32 Oops add reset display inversion (SET_INV = 0) 2026-02-04 02:12:45 +01:00
Armel FAUVEAU c4fb7de972 Fix FM_EraseChannels() 2026-02-03 04:08:53 +01:00
Armel FAUVEAU 45ead3125f Fix Lines 1 & 2 evil bug 2026-02-03 02:44:31 +01:00
Armel FAUVEAU 2b40d1216e Fix RO evil bug on new install 2026-02-03 01:57:38 +01:00
Armel FAUVEAU e555b48811 Fix TXLock icon 2026-02-02 22:19:38 +01:00
muzkr d70cc8f59a Refine systick config 2026-02-03 00:51:32 +08:00
Armel FAUVEAU cd79144a25 Add Fusion v5.0.2 public beta 2026-02-01 23:06:17 +01:00
Armel FAUVEAU b7151de126 Add new binary 2026-02-01 23:02:57 +01:00
Armel FAUVEAU 4eea0c7910 Update version 2026-02-01 22:59:20 +01:00
Armel FAUVEAU cd7fcdbf54 Fix MR channel persistence when entered with leading zeros (Thanks @Niteshooter for the bug report) 2026-02-01 17:38:32 +01:00
Armel FAUVEAU 3df48febf0 Update donors 2026-01-31 23:26:50 +01:00
Armel FAUVEAU 7f6594ffb2 Experiment alignment 2026-01-31 04:02:55 +01:00
Armel FAUVEAU 3f3dab7833 Fix ENABLE_LTO to false by default 2026-01-30 23:41:35 +01:00
Armel FAUVEAU 7dbabfe60f Merge pull request #120 from mengzhuo/lto
build: enable LTO by default
2026-01-30 18:46:37 +01:00
Armel FAUVEAU c10ed40a4a Merge pull request #119 from mengzhuo/feature_update_v4
Fix build image once
2026-01-30 18:40:33 +01:00
Armel FAUVEAU 0f7b600516 Merge pull request #121 from mengzhuo/array_size
App: clean up duplicate ARRAY_SIZE macros
2026-01-30 18:35:00 +01:00
Meng Zhuo 7189d09d73 App: clean up duplicate ARRAY_SIZE macros 2026-01-30 11:02:00 +08:00
Meng Zhuo 164a72738a build: enable LTO by default
LTO saves ~4K in Flash and ~300 Bytes in RAM

Disable LTO
```
Memory region         Used Size  Region Size  %age Used
             RAM:       12256 B        16 KB     74.80%
           FLASH:       84304 B       118 KB     69.77%
```

Enable LTO
```
[82/82] Linking C executable f4hwn.fusion.elf
Memory region         Used Size  Region Size  %age Used
             RAM:       11904 B        16 KB     72.66%
           FLASH:       80820 B       118 KB     66.89%
```
2026-01-30 10:26:52 +08:00
Meng Zhuo 9ab8040e4b Fix build image once
Also fix build on Windows message:
```
docker: Error response from daemon: the working directory 'C:/Program Files/Git/src' is invalid, it needs to be an absolute path
```
2026-01-30 09:40:36 +08:00
Armel FAUVEAU d3b985c5ad Fix compilation error if ENABLE_FEAT_F4HWN_AUDIO is false 2026-01-30 02:15:44 +01:00
Armel FAUVEAU 6ba761db1a Fix Dockerfile 2026-01-30 02:06:10 +01:00
Armel FAUVEAU f4826ed46c Merge pull request #107 from mengzhuo/fsk-tx
Fix FSK TX finished mask definition
2026-01-28 03:38:24 +01:00
Armel FAUVEAU 4c41ff7929 Fix scan list + ALL 2026-01-27 23:12:19 +01:00
Armel FAUVEAU 91e2f61099 Revert fix Scan doesn't detect channels with DCS 2026-01-27 19:22:51 +01:00
Armel FAUVEAU 011009b294 Improve SETTINGS_FactoryReset 2026-01-27 19:01:44 +01:00
Meng Zhuo 1865651a5a Fix FSK TX finished mask definition 2026-01-27 16:17:44 +08:00
Armel FAUVEAU 889de45b18 Add Fusion v5.0.1 public beta 2026-01-25 04:38:34 +01:00
30 changed files with 154 additions and 80 deletions

No files matched your search

+1 -1
View File
@@ -88,7 +88,7 @@ DECLARE_AIRCOPY_BANK(1)
// For settings only
static const AIRCOPY_Segment_t AIRCOPY_Segments_Settings[] = {
{ 0xA000, 0xA160, AIRCOPY_WRITE_BYTES },
{ 0xA000, 0xA170, AIRCOPY_WRITE_BYTES },
};
static const AIRCOPY_TransferMap_t AIRCOPY_Map_Settings = {
+1 -1
View File
@@ -208,7 +208,7 @@ static void HandleIncoming(void)
gFoundCTCSS = false;
}
if (g_CDCSS_Lost && gCDCSSCodeType == CDCSS_NEGATIVE_CODE
if (g_CDCSS_Lost && gCDCSSCodeType == CDCSS_POSITIVE_CODE
&& (gCurrentCodeType == CODE_TYPE_DIGITAL || gCurrentCodeType == CODE_TYPE_REVERSE_DIGITAL))
{
gFoundCDCSS = false;
+6 -5
View File
@@ -32,10 +32,6 @@
#include "ui/inputbox.h"
#include "ui/ui.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
uint16_t gFM_Channels[FM_CHANNELS_MAX];
bool gFmRadioMode;
uint8_t gFmRadioCountdown_500ms;
@@ -124,7 +120,12 @@ void FM_TurnOff(void)
void FM_EraseChannels(void)
{
PY25Q16_SectorErase(0x003000);
//PY25Q16_SectorErase(0x003000);
uint8_t clearBuf[128];
memset(clearBuf, 0xFF, sizeof(clearBuf));
PY25Q16_WriteBuffer(0x00A028, clearBuf, sizeof(clearBuf), false);
memset(gFM_Channels, 0xFF, sizeof(gFM_Channels));
}
+1
View File
@@ -404,6 +404,7 @@ void channelMoveSwitch(void) {
}
channelMove(Channel - 1);
SETTINGS_SaveVfoIndices();
}
}
-3
View File
@@ -42,9 +42,6 @@
#include "ui/menu.h"
#include "ui/ui.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
uint8_t gUnlockAllTxConfCnt;
+17 -19
View File
@@ -103,8 +103,8 @@ RegisterSpec registerSpecs[] = {
{},
{"LNAs", BK4819_REG_13, 8, 0b11, 1},
{"LNA", BK4819_REG_13, 5, 0b111, 1},
{"VGA", BK4819_REG_13, 0, 0b111, 1},
{"BPF", BK4819_REG_3D, 0, 0xFFFF, 0x2aaa},
{"PGA", BK4819_REG_13, 0, 0b111, 1},
//{"BPF", BK4819_REG_3D, 0, 0xFFFF, 0x2aaa},
// {"MIX", 0x13, 3, 0b11, 1}, // TODO: hidden
};
@@ -112,7 +112,7 @@ RegisterSpec registerSpecs[] = {
const int8_t LNAsOptions[] = {-19, -16, -11, 0};
const int8_t LNAOptions[] = {-24, -19, -14, -9, -6, -4, -2, 0};
const int8_t VGAOptions[] = {-33, -27, -21, -15, -9, -6, -3, 0};
const char *BPFOptions[] = {"8.46", "7.25", "6.35", "5.64", "5.08", "4.62", "4.23"};
//const char *BPFOptions[] = {"8.46", "7.25", "6.35", "5.64", "5.08", "4.62", "4.23"};
#endif
uint16_t statuslineUpdateTimer = 0;
@@ -1185,6 +1185,8 @@ static void DrawArrow(uint8_t x)
static void OnKeyDown(uint8_t key)
{
bool nav = (gEeprom.SET_NAV != 0);
switch (key)
{
case KEY_3:
@@ -1209,10 +1211,7 @@ static void OnKeyDown(uint8_t key)
#ifdef ENABLE_SCAN_RANGES
if (!gScanRangeStart) {
#endif
if(gEeprom.SET_NAV == 0)
UpdateCurrentFreq(false);
else
UpdateCurrentFreq(true);
UpdateCurrentFreq(nav);
#ifdef ENABLE_SCAN_RANGES
}
#endif
@@ -1221,10 +1220,7 @@ static void OnKeyDown(uint8_t key)
#ifdef ENABLE_SCAN_RANGES
if (!gScanRangeStart) {
#endif
if(gEeprom.SET_NAV == 0)
UpdateCurrentFreq(true);
else
UpdateCurrentFreq(false);
UpdateCurrentFreq(!nav);
#ifdef ENABLE_SCAN_RANGES
}
#endif
@@ -1334,6 +1330,8 @@ static void OnKeyDownFreqInput(uint8_t key)
void OnKeyDownStill(KEY_Code_t key)
{
bool nav = (gEeprom.SET_NAV != 0);
switch (key)
{
case KEY_3:
@@ -1344,19 +1342,17 @@ void OnKeyDownStill(KEY_Code_t key)
break;
case KEY_UP:
if (menuState) {
bool nav = (gEeprom.SET_NAV != 0);
SetRegMenuValue(menuState, nav);
UpdateCurrentFreqStill(nav);
break;
}
UpdateCurrentFreqStill(nav);
break;
case KEY_DOWN:
if (menuState) {
bool nav = (gEeprom.SET_NAV != 0);
SetRegMenuValue(menuState, !nav);
UpdateCurrentFreqStill(!nav);
break;
}
UpdateCurrentFreqStill(!nav);
break;
case KEY_STAR:
UpdateRssiTriggerLevel(true);
@@ -1475,9 +1471,9 @@ static void RenderStill()
uint8_t offset = PAD_LEFT;
uint8_t row = 4;
for (int i = 0, idx = 1; idx <= 4; ++i, ++idx)
for (int i = 0, idx = 1; idx <= 3; ++i, ++idx)
{
if (idx == 5)
if (idx == 4)
{
row += 2;
i = 0;
@@ -1508,10 +1504,12 @@ static void RenderStill()
{
sprintf(String, "%ddB", VGAOptions[GetRegMenuValue(idx)]);
}
/*
else if(idx == 4)
{
sprintf(String, "%skHz", BPFOptions[(GetRegMenuValue(idx) / 0x2aaa)]);
}
*/
#else
sprintf(String, "%u", GetRegMenuValue(idx));
#endif
+7 -7
View File
@@ -168,13 +168,13 @@ const uint8_t BITMAP_Antenna[5] =
const uint8_t BITMAP_VFO_Lock[7] =
{
0b01111100,
0b01000110,
0b01000101,
0b01000101,
0b01000101,
0b01000110,
0b01111100,
0b00111100,
0b00100110,
0b00100101,
0b00100101,
0b00100101,
0b00100110,
0b00111100,
};
const uint8_t BITMAP_VFO_Default[7] =
+1 -4
View File
@@ -15,10 +15,7 @@
*/
#include "dcs.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
#include "misc.h"
// CTCSS Hz * 10
const uint16_t CTCSS_Options[50] = {
-4
View File
@@ -20,10 +20,6 @@
#include "driver/system.h"
#include "misc.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#endif
static const uint16_t BK1080_RegisterTable[] =
{
0x0008, 0x1080, 0x0201, 0x0000, 0x40C0, 0x0A1F, 0x002E, 0x02FF,
+1 -1
View File
@@ -163,7 +163,7 @@ typedef enum BK4819_GPIO_PIN_t BK4819_GPIO_PIN_t;
#define BK4819_REG_02_SHIFT_SQUELCH_LOST 2
#define BK4819_REG_02_SHIFT_FSK_RX_SYNC 1
#define BK4819_REG_02_MASK_FSK_TX_FINISHED (1U << BK4819_REG_02_SHIFT_FSK_TX)
#define BK4819_REG_02_MASK_FSK_TX_FINISHED (1U << BK4819_REG_02_SHIFT_FSK_TX_FINISHED)
#define BK4819_REG_02_MASK_FSK_FIFO_ALMOST_EMPTY (1U << BK4819_REG_02_SHIFT_FSK_FIFO_ALMOST_EMPTY)
#define BK4819_REG_02_MASK_FSK_RX_FINISHED (1U << BK4819_REG_02_SHIFT_FSK_RX_FINISHED)
#define BK4819_REG_02_MASK_FSK_FIFO_ALMOST_FULL (1U << BK4819_REG_02_SHIFT_FSK_FIFO_ALMOST_FULL)
+1 -4
View File
@@ -19,6 +19,7 @@
#include <stdio.h>
#include "settings.h"
#include "misc.h"
#include "audio.h"
@@ -28,10 +29,6 @@
#include "driver/systick.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
#define PIN_CSN GPIO_MAKE_PIN(GPIOF, LL_GPIO_PIN_9)
#define PIN_SCL GPIO_MAKE_PIN(GPIOB, LL_GPIO_PIN_8)
#define PIN_SDA GPIO_MAKE_PIN(GPIOB, LL_GPIO_PIN_9)
+1 -5
View File
@@ -19,6 +19,7 @@
#include <stdio.h>
#include "settings.h"
#include "misc.h"
#include "audio.h"
@@ -27,11 +28,6 @@
#include "driver/system.h"
#include "driver/systick.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
#define PIN_CSN GPIO_MAKE_PIN(GPIOF, LL_GPIO_PIN_9)
#define PIN_SCL GPIO_MAKE_PIN(GPIOB, LL_GPIO_PIN_8)
#define PIN_SDA GPIO_MAKE_PIN(GPIOB, LL_GPIO_PIN_9)
+2 -1
View File
@@ -52,7 +52,7 @@ static const AddrMapping_t ADDR_MAPPINGS[] = {
_MK_MAPPING(0x009000, 0x009000, 0x0090D6), // 14 VFO * 16 Bytes (ex 0x001000)
_MK_MAPPING(0x00A000, 0x00A000, 0x00A160), // Settings * 16 Bytes (ex 0x004000) 0x00A000 -> 0x00A010
_MK_MAPPING(0x00A000, 0x00A000, 0x00A170), // Settings * 16 Bytes (ex 0x004000) 0x00A000 -> 0x00A010
// Settings * 16 Bytes (ex 0x005000) 0x00A010 -> 0x00A020
// Settings FM * 8 Bytes (0x006000) 0x00A020 -> 0x00A028
// MR FM * 128 Bytes (0x003000) 0x00A028 -> 0x00A0A8
@@ -62,6 +62,7 @@ static const AddrMapping_t ADDR_MAPPINGS[] = {
// Settings AES * 16 Bytes (0x00A000) 0x00A140 -> 0x00A150
// Settings * 8 Bytes (0x00B000) 0x00A150 -> 0x00A158
// Settings F4HWN * 8 Bytes (0x00C000) 0x00A158 -> 0x00A160
// Settings Version * 16 Bytes 0x00A160 -> 0x00A170
_MK_MAPPING(0x010000, 0x00B000, 0x00B200), // Calibration 512 Bytes!!!
};
+1 -1
View File
@@ -40,7 +40,7 @@
static uint32_t SectorCacheAddr = 0x1000000;
static uint8_t SectorCache[SECTOR_SIZE];
static uint8_t BlackHole[1];
static uint8_t BlackHole[4] __attribute__((aligned(4)));
static volatile bool TC_Flag;
static inline void CS_Assert()
+3 -2
View File
@@ -20,8 +20,9 @@
static uint32_t gTickMultiplier;
void SYSTICK_Init(void)
{
SysTick_Config(480000);
gTickMultiplier = 48;
SysTick_Config(SystemCoreClock / 100); // 10 ms (1/100 sec) systick interrupt
gTickMultiplier = SystemCoreClock / 1000000;
NVIC_SetPriority(SysTick_IRQn, 0);
}
void SYSTICK_DelayUs(uint32_t Delay)
+1 -1
View File
@@ -138,7 +138,7 @@ bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanL
return false;
if (att->band > BAND7_470MHz)
return false;
if (!checkScanList || (scanList > MR_CHANNELS_LIST && att->scanlist != 0))
if (!checkScanList || (scanList > MR_CHANNELS_LIST && att->scanlist != 0) || (scanList > 0 && att->scanlist == MR_CHANNELS_LIST + 1))
return true;
if ((scanList == 0) || (scanList != att->scanlist)) {
return false;
+85 -5
View File
@@ -33,6 +33,73 @@ EEPROM_Config_t gEeprom = { 0 };
void SETTINGS_InitEEPROM(void)
{
uint8_t Data[16] = {0};
//
// Version check
// Read stored version from EEPROM and compare with VERSION_STRING_2
//
{
char storedVersion[16] = {0};
PY25Q16_ReadBuffer(0x00A160, storedVersion, sizeof(storedVersion));
// Compare with current version
if (strncmp(storedVersion, VERSION_STRING_2, sizeof(storedVersion)) != 0)
{
// Different version: new install or firmware update
// 1. Write new version to EEPROM
char newVersion[16] = {0};
strncpy(newVersion, VERSION_STRING_2, sizeof(newVersion));
PY25Q16_WriteBuffer(0x00A160, newVersion, sizeof(newVersion), false);
// 2. Reset sensitive parameters (MENU_LOCK, etc.)
uint8_t configByte[8] = {0};
PY25Q16_ReadBuffer(0x00A000, configByte, sizeof(configByte));
configByte[4] &= (uint8_t)~0x01; // KEY_LOCK = 0
configByte[4] &= (uint8_t)~0x02; // MENU_LOCK = 0
configByte[4] &= (uint8_t)~0x3C; // SET_KEY = 0
configByte[4] &= (uint8_t)~0x40; // SET_NAV = 0
PY25Q16_WriteBuffer(0x00A000, configByte, sizeof(configByte), false);
// 3. Reset display inversion (SET_INV = 0)
uint8_t displayByte[8] = {0};
PY25Q16_ReadBuffer(0x00A158, displayByte, sizeof(displayByte));
displayByte[5] &= (uint8_t)~0x10; // Clear bit 4 (SET_INV)
PY25Q16_WriteBuffer(0x00A158, displayByte, sizeof(displayByte), false);
// 4. Reset logo lines (clear to null for strlen() == 0)
char logoLines[32];
PY25Q16_ReadBuffer(0x00A0C8, logoLines, sizeof(logoLines));
bool needsWrite = false;
for (int line = 0; line < 2; line++) {
int offset = line * 16;
for (int i = 0; i < 16; i++) {
char c = logoLines[offset + i];
if (c == 0) {
break;
}
if (c < 0x20 || c > 0x7E) {
memset(logoLines + offset, 0, 16);
needsWrite = true;
break;
}
}
}
if (needsWrite) {
PY25Q16_WriteBuffer(0x00A0C8, logoLines, sizeof(logoLines), false);
}
}
}
// 0E70..0E77
PY25Q16_ReadBuffer(0x00A000, Data, 8);
#ifdef ENABLE_FEAT_F4HWN_AUDIO
@@ -558,6 +625,13 @@ void SETTINGS_FactoryReset(bool bIsAll)
Data8[4] &= (uint8_t)~0x01;
Data8[4] &= (uint8_t)~0x02;
// SET_KEY to 0
Data8[4] &= (uint8_t)~0x3C; // Clear bits 2-5 (SET_KEY)
// SET_NAV to false
Data8[4] &= (uint8_t)~0x40; // Clear bit 6 (SET_NAV) for UV-K1 by default
#ifdef ENABLE_FEAT_F4HWN_RESET_VFO
Data8[7] = (1 & 0x01);
#endif
@@ -580,9 +654,12 @@ void SETTINGS_FactoryReset(bool bIsAll)
gEeprom.FreqChannel[0] = FREQ_CHANNEL_FIRST + BAND3_137MHz;
gEeprom.FreqChannel[1] = FREQ_CHANNEL_FIRST + BAND6_400MHz;
SETTINGS_SaveVfoIndices();
SETTINGS_SaveChannel(FREQ_CHANNEL_FIRST + BAND3_137MHz, 0, &gEeprom.VfoInfo[0], 2);
SETTINGS_SaveChannel(FREQ_CHANNEL_FIRST + BAND6_400MHz, 1, &gEeprom.VfoInfo[1], 2);
gVfoStateChanged = true;
gScheduleVfoSave = true;
SETTINGS_SaveVfoIndicesFlush();
#endif
}
@@ -1176,12 +1253,12 @@ void SETTINGS_ResetTxLock(void)
// This is an expensive operation: full scan of all MR channels
#define CHANNEL_SIZE 16
#define TXLOCK_BYTE_OFFSET 4
#define TXLOCK_BYTE_OFFSET 12
#define TXLOCK_BIT 6
#define SETTINGS_ResetTxLock_BATCH 16
#define SETTINGS_ResetTxLock_BATCH 32
const uint32_t TotalBytes = MR_CHANNELS_MAX * CHANNEL_SIZE; // 512 * 16 = 8192
const uint32_t BatchSize = TotalBytes / SETTINGS_ResetTxLock_BATCH; // 8192 / 16 = 512
const uint32_t TotalBytes = MR_CHANNELS_MAX * CHANNEL_SIZE; // 1024 * 16 = 16 384
const uint32_t BatchSize = TotalBytes / SETTINGS_ResetTxLock_BATCH; // 16 384 / 32 = 512
const uint32_t BatchChCnt = BatchSize / CHANNEL_SIZE; // 32 channels per batch
uint8_t Buf[BatchSize];
@@ -1201,6 +1278,9 @@ void SETTINGS_ResetTxLock(void)
PY25Q16_WriteBuffer(Offset, Buf, BatchSize, false);
}
RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD);
RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD);
#undef SETTINGS_ResetTxLock_BATCH
#undef CHANNEL_SIZE
#undef TXLOCK_BYTE_OFFSET
+1 -3
View File
@@ -118,9 +118,7 @@ enum ACTION_OPT_t {
ACTION_OPT_WN,
ACTION_OPT_BACKLIGHT,
ACTION_OPT_MUTE,
#ifdef ENABLE_FEAT_F4HWN_AUDIO
ACTION_OPT_RXA,
#endif
ACTION_OPT_RXA,
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
ACTION_OPT_POWER_HIGH,
ACTION_OPT_REMOVE_OFFSET,
-3
View File
@@ -23,9 +23,6 @@
#include "ui/inputbox.h"
#include "misc.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))
#endif
void UI_GenerateChannelString(char *pString, const uint16_t Channel)
{
+8 -4
View File
@@ -741,12 +741,12 @@ void UI_DisplayMain(void)
uint32_t frequency = gEeprom.VfoInfo[vfo_num].pRX->Frequency;
if(TX_freq_check(frequency) != 0 && gEeprom.VfoInfo[vfo_num].TX_LOCK == true)
if(TX_freq_check(frequency) != 0 && gEeprom.VfoInfo[vfo_num].TX_LOCK == true && !FUNCTION_IsRx())
{
if(isMainOnly())
memcpy(p_line0 + 14, BITMAP_VFO_Lock, sizeof(BITMAP_VFO_Lock));
memcpy(p_line0 + 25, BITMAP_VFO_Lock, sizeof(BITMAP_VFO_Lock));
else
memcpy(p_line0 + 24, BITMAP_VFO_Lock, sizeof(BITMAP_VFO_Lock));
memcpy(p_line0 + 25, BITMAP_VFO_Lock, sizeof(BITMAP_VFO_Lock));
}
if (gCurrentFunction == FUNCTION_TRANSMIT)
@@ -790,7 +790,11 @@ void UI_DisplayMain(void)
if(gRxVfo->Modulation == MODULATION_AM)
GUI_DisplaySmallest("AIR", 10, RxLine == 0 ? 1 : 33, false, true);
else {
strcpy(String, gSubMenu_SET_AUD[gSetting_set_audio]);
#ifdef ENABLE_FEAT_F4HWN_AUDIO
strcpy(String, gSubMenu_SET_AUD[gSetting_set_audio]);
#else
strcpy(String, "RX");
#endif
GUI_DisplaySmallest(String, 10, RxLine == 0 ? 1 : 33, false, true);
}
+4
View File
@@ -70,6 +70,10 @@ target_link_libraries(${EXE_NAME} Core App)
target_compile_definitions(${EXE_NAME} PRIVATE $<$<CONFIG:Debug>:DEBUG>)
target_link_libraries(${EXE_NAME} ${TOOLCHAIN_LINK_LIBRARIES})
if(ENABLE_LTO)
target_compile_options(${EXE_NAME} PRIVATE -flto=auto)
endif()
# Generate map file
target_link_options(${EXE_NAME} PRIVATE "-Wl,-Map=${EXE_NAME}.map")
+2 -1
View File
@@ -9,6 +9,7 @@
"toolchainFile": "${sourceDir}/cmake/gcc-arm-none-eabi.cmake",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"ENABLE_LTO": false,
"ENABLE_FMRADIO": false,
"ENABLE_UART": true,
"ENABLE_USB": true,
@@ -68,7 +69,7 @@
"ENABLE_UART_RW_BK_REGS": false,
"ENABLE_SWD": false,
"VERSION_STRING_1": "v0.22",
"VERSION_STRING_2": "v5.0.1"
"VERSION_STRING_2": "v5.1.0"
}
},
{
+2 -1
View File
@@ -3,7 +3,8 @@ FROM mcr.microsoft.com/devcontainers/python:3.10-bookworm
# ---------------------------------------------
# Base build tools
# ---------------------------------------------
RUN apt-get update && apt-get install -y --no-install-recommends \
RUN rm -f /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y --no-install-recommends \
build-essential cmake ninja-build python3 curl xz-utils ca-certificates \
&& rm -rf /var/lib/apt/lists/*
+2 -1
View File
@@ -3,7 +3,8 @@ FROM mcr.microsoft.com/devcontainers/python:3.10-bookworm
# ---------------------------------------------
# Base build tools
# ---------------------------------------------
RUN apt-get update && apt-get install -y --no-install-recommends \
RUN rm -f /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y --no-install-recommends \
build-essential cmake ninja-build python3 curl xz-utils ca-certificates \
&& rm -rf /var/lib/apt/lists/*
+1 -1
View File
@@ -42,7 +42,7 @@ Anyway, have fun.
# Donations
Special thanks to Jean-Cyrille F6IWW (3 times), Fabrice 14RC123, David F4BPP, Olivier 14RC206, Frédéric F4ESO, Stéphane F5LGW (2 times), Jorge Ornelas (4 times), Laurent F4AXK, Christophe Morel, Clayton W0LED, Pierre Antoine F6FWB, Jean-Claude 14FRS3306, Thierry F4GVO, Eric F1NOU, PricelessToolkit, Ady M6NYJ, Tom McGovern (4 times), Joseph Roth, Pierre-Yves Colin, Frank DJ7FG, Marcel Testaz, Brian Frobisher, Yannick F4JFO, Paolo Bussola, Dirk DL8DF, Levente Szőke (2 times), Bernard-Michel Herrera, Jérôme Saintespes, Paul Davies, RS (3 times), Johan F4WAT, Robert Wörle, Rafael Sundorf, Paul Harker, Peter Fintl, Pascal F4ICR (2 times), Mike DL2MF (3 times), Eric KI1C (2 times), Phil G0ELM, Jérôme Lambert, Eliot Vedel, Alfonso EA7KDF, Jean-François F1EVM, Robert DC1RDB (2 times), Ian KE2CHJ, Daryl VK3AWA, Roberto Brunelli, Robert Boardman, Stephen Oliver, Nicolas F4INE, William Bruno, Daniel OK2VLK, Tayler Chew, Peter DL7RFP, Philippe Kopp, Rune LA6YMA, Jeremy Luna and Steef Wagenaar for their [donations](https://www.paypal.com/paypalme/F4HWN). That’s so kind of them. Thanks so much 🙏🏻
Special thanks to Jean-Cyrille F6IWW (3 times), Fabrice 14RC123, David F4BPP, Olivier 14RC206, Frédéric F4ESO, Stéphane F5LGW (2 times), Jorge Ornelas (4 times), Laurent F4AXK, Christophe Morel, Clayton W0LED, Pierre Antoine F6FWB, Jean-Claude 14FRS3306, Thierry F4GVO, Eric F1NOU, PricelessToolkit, Ady M6NYJ, Tom McGovern (4 times), Joseph Roth, Pierre-Yves Colin, Frank DJ7FG, Marcel Testaz, Brian Frobisher, Yannick F4JFO, Paolo Bussola, Dirk DL8DF, Levente Szőke (2 times), Bernard-Michel Herrera, Jérôme Saintespes, Paul Davies, RS (3 times), Johan F4WAT, Robert Wörle, Rafael Sundorf, Paul Harker, Peter Fintl, Pascal F4ICR (2 times), Mike DL2MF (3 times), Eric KI1C (2 times), Phil G0ELM, Jérôme Lambert, Eliot Vedel, Alfonso EA7KDF, Jean-François F1EVM, Robert DC1RDB (2 times), Ian KE2CHJ, Daryl VK3AWA, Roberto Brunelli, Robert Boardman, Stephen Oliver, Nicolas F4INE, William Bruno, Daniel OK2VLK, Tayler Chew, Peter DL7RFP, Philippe Kopp, Rune LA6YMA, Jeremy Luna, Steef Wagenaar, Zhuo BG7SGA and Jamie M0JLB for their [donations](https://www.paypal.com/paypalme/F4HWN). That’s so kind of them. Thanks so much 🙏🏻
## Table of Contents
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+5 -2
View File
@@ -31,13 +31,16 @@ fi
# ---------------------------------------------
# Build the Docker image (only needed once)
# ---------------------------------------------
docker build -t "$IMAGE" .
if [[ "$(docker images -q $IMAGE)" == "" ]]; then
echo "Building Docker image..."
docker build -t "$IMAGE" .
fi
# ---------------------------------------------
# Clean existing CMake cache to ensure toolchain reload
# ---------------------------------------------
rm -rf build
export MSYS_NO_PATHCONV=1
# ---------------------------------------------
# Function to build one preset
# ---------------------------------------------