mirror of
https://github.com/armel/uv-k1-k5v3-firmware-custom.git
synced 2026-10-02 03:15:37 +00:00
Optimize FM and overlay shortcuts
This commit is contained in:
1 parent
99057f9dd2
commit
62906636ed
8 files changed
+76
-38
No files matched your search
+3
-3
@@ -502,7 +502,7 @@ void ACTION_FoxHunt(void)
|
|||||||
APP_RunFoxHunt();
|
APP_RunFoxHunt();
|
||||||
GUI_SelectNextDisplay(DISPLAY_MAIN);
|
GUI_SelectNextDisplay(DISPLAY_MAIN);
|
||||||
#else
|
#else
|
||||||
if (APP_LaunchOverlayByName("FoxHunt") != APP_OK)
|
if (APP_LaunchOverlayShortcut(APP_SHORTCUT_FOXHUNT) != APP_OK)
|
||||||
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -515,7 +515,7 @@ void ACTION_Beacon(void)
|
|||||||
APP_RunBeacon();
|
APP_RunBeacon();
|
||||||
GUI_SelectNextDisplay(DISPLAY_MAIN);
|
GUI_SelectNextDisplay(DISPLAY_MAIN);
|
||||||
#else
|
#else
|
||||||
if (APP_LaunchOverlayByName("Beacon") != APP_OK)
|
if (APP_LaunchOverlayShortcut(APP_SHORTCUT_BEACON) != APP_OK)
|
||||||
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -526,7 +526,7 @@ void ACTION_Beacon(void)
|
|||||||
void ACTION_FM(void)
|
void ACTION_FM(void)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_FEAT_F4HWN_OVERLAY_APPS
|
#ifdef ENABLE_FEAT_F4HWN_OVERLAY_APPS
|
||||||
if (APP_LaunchOverlayByName("Broadcast FM") != APP_OK)
|
if (APP_LaunchOverlayShortcut(APP_SHORTCUT_FM) != APP_OK)
|
||||||
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
||||||
return;
|
return;
|
||||||
#else
|
#else
|
||||||
|
|||||||
+31
-1
@@ -52,8 +52,9 @@ const uint8_t BUTTON_EVENT_HELD = BUTTON_STATE_PRESSED | BUTTON_STATE_HELD;
|
|||||||
const uint8_t BUTTON_EVENT_SHORT = 0;
|
const uint8_t BUTTON_EVENT_SHORT = 0;
|
||||||
const uint8_t BUTTON_EVENT_LONG = BUTTON_STATE_HELD;
|
const uint8_t BUTTON_EVENT_LONG = BUTTON_STATE_HELD;
|
||||||
|
|
||||||
|
#ifndef ENABLE_FEAT_F4HWN_OVERLAY_APPS
|
||||||
static void Key_FUNC(KEY_Code_t Key, uint8_t state);
|
static void Key_FUNC(KEY_Code_t Key, uint8_t state);
|
||||||
|
#endif
|
||||||
|
|
||||||
bool FM_CheckValidChannel(uint8_t Channel)
|
bool FM_CheckValidChannel(uint8_t Channel)
|
||||||
{
|
{
|
||||||
@@ -94,6 +95,7 @@ int FM_ConfigureChannelState(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ENABLE_FEAT_F4HWN_OVERLAY_APPS
|
||||||
void FM_SetFrequency(void)
|
void FM_SetFrequency(void)
|
||||||
{
|
{
|
||||||
BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/);
|
BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/);
|
||||||
@@ -196,6 +198,7 @@ void FM_PlayAndUpdate(void)
|
|||||||
BACKLIGHT_TurnOn();
|
BACKLIGHT_TurnOn();
|
||||||
FM_AudioPathOn();
|
FM_AudioPathOn();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit)
|
int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit)
|
||||||
{
|
{
|
||||||
@@ -240,6 +243,7 @@ int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ENABLE_FEAT_F4HWN_OVERLAY_APPS
|
||||||
static void Key_DIGITS(KEY_Code_t Key, uint8_t state)
|
static void Key_DIGITS(KEY_Code_t Key, uint8_t state)
|
||||||
{
|
{
|
||||||
enum { STATE_FREQ_MODE, STATE_MR_MODE, STATE_SAVE };
|
enum { STATE_FREQ_MODE, STATE_MR_MODE, STATE_SAVE };
|
||||||
@@ -662,5 +666,31 @@ void FM_Start(void)
|
|||||||
SETTINGS_WriteCurrentState();
|
SETTINGS_WriteCurrentState();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* Broadcast FM is sovereign in Overlay builds: its app owns tuning, scanning,
|
||||||
|
* audio and persistence through app_api. Keep only the shared channel/state
|
||||||
|
* loader and FM_CheckFrequencyLock above; these tiny compatibility entry points
|
||||||
|
* satisfy generic firmware paths which cannot become active because Overlay
|
||||||
|
* builds never set gFmRadioMode or gFM_ScanState.
|
||||||
|
*/
|
||||||
|
void FM_TurnOff(void) {}
|
||||||
|
void FM_EraseChannels(void) {}
|
||||||
|
void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag)
|
||||||
|
{
|
||||||
|
(void)Frequency;
|
||||||
|
(void)Step;
|
||||||
|
(void)bFlag;
|
||||||
|
}
|
||||||
|
void FM_PlayAndUpdate(void) {}
|
||||||
|
void FM_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||||
|
{
|
||||||
|
(void)Key;
|
||||||
|
(void)bKeyPressed;
|
||||||
|
(void)bKeyHeld;
|
||||||
|
}
|
||||||
|
void FM_Play(void) {}
|
||||||
|
void FM_Start(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+17
-25
@@ -671,11 +671,11 @@ static bool app_shortcuts_cached;
|
|||||||
static uint8_t app_shortcut_mask;
|
static uint8_t app_shortcut_mask;
|
||||||
static uint8_t app_shortcut_slots[3];
|
static uint8_t app_shortcut_slots[3];
|
||||||
|
|
||||||
static int8_t app_shortcut_index(const char *name)
|
static int8_t app_shortcut_index(uint8_t shortcut)
|
||||||
{
|
{
|
||||||
if (strncmp(name, "Broadcast FM", APP_NAME_LEN) == 0) return 0;
|
if (shortcut == APP_SHORTCUT_FM) return 0;
|
||||||
if (strncmp(name, "FoxHunt", APP_NAME_LEN) == 0) return 1;
|
if (shortcut == APP_SHORTCUT_FOXHUNT) return 1;
|
||||||
if (strncmp(name, "Beacon", APP_NAME_LEN) == 0) return 2;
|
if (shortcut == APP_SHORTCUT_BEACON) return 2;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -692,11 +692,12 @@ static void app_cache_shortcuts(void)
|
|||||||
if (APP_ValidateSlot(slot, &h) != APP_OK || h.link_vma != overlay_vma)
|
if (APP_ValidateSlot(slot, &h) != APP_OK || h.link_vma != overlay_vma)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const int8_t index = app_shortcut_index(h.name);
|
const uint8_t shortcut = (uint8_t)((h.flags & APP_FLAG_SHORTCUT_MASK) >>
|
||||||
|
APP_FLAG_SHORTCUT_SHIFT);
|
||||||
|
const int8_t index = app_shortcut_index(shortcut);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
const uint8_t bit = (uint8_t)(1u << index);
|
if (!(app_shortcut_mask & shortcut)) {
|
||||||
if (!(app_shortcut_mask & bit)) {
|
app_shortcut_mask |= shortcut;
|
||||||
app_shortcut_mask |= bit;
|
|
||||||
app_shortcut_slots[index] = slot;
|
app_shortcut_slots[index] = slot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -711,25 +712,16 @@ uint8_t APP_OverlayShortcutMask(void)
|
|||||||
return app_shortcut_mask;
|
return app_shortcut_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t APP_LaunchOverlayByName(const char *name)
|
uint8_t APP_LaunchOverlayShortcut(uint8_t shortcut)
|
||||||
{
|
{
|
||||||
const int8_t index = app_shortcut_index(name);
|
const int8_t index = app_shortcut_index(shortcut);
|
||||||
if (index >= 0) {
|
if (index < 0)
|
||||||
app_cache_shortcuts();
|
return APP_ERR_MAGIC;
|
||||||
return (app_shortcut_mask & (1u << index))
|
|
||||||
? APP_LaunchOverlay(app_shortcut_slots[index])
|
|
||||||
: APP_ERR_MAGIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
app_header_t h;
|
app_cache_shortcuts();
|
||||||
|
return (app_shortcut_mask & shortcut)
|
||||||
for (uint8_t slot = 0; slot < APP_SLOT_COUNT; slot++) {
|
? APP_LaunchOverlay(app_shortcut_slots[index])
|
||||||
if (APP_ValidateSlot(slot, &h) == APP_OK &&
|
: APP_ERR_MAGIC;
|
||||||
strncmp(h.name, name, APP_NAME_LEN) == 0)
|
|
||||||
return APP_LaunchOverlay(slot);
|
|
||||||
}
|
|
||||||
|
|
||||||
return APP_ERR_MAGIC;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t APP_SlotInfo(uint8_t slot, app_header_t *out_header)
|
uint8_t APP_SlotInfo(uint8_t slot, app_header_t *out_header)
|
||||||
|
|||||||
@@ -68,12 +68,14 @@
|
|||||||
#define APP_HDR_VERSION 1u
|
#define APP_HDR_VERSION 1u
|
||||||
#define APP_FLAG_COMMITTED 0x0001u
|
#define APP_FLAG_COMMITTED 0x0001u
|
||||||
#define APP_FLAG_SCREEN_SAVER 0x0002u
|
#define APP_FLAG_SCREEN_SAVER 0x0002u
|
||||||
|
#define APP_FLAG_SHORTCUT_SHIFT 8u
|
||||||
|
#define APP_FLAG_SHORTCUT_MASK 0x0700u
|
||||||
#define APP_NAME_LEN 16
|
#define APP_NAME_LEN 16
|
||||||
#define APP_VERSION_LEN 16
|
#define APP_VERSION_LEN 16
|
||||||
|
|
||||||
#define APP_SHORTCUT_FM (1u << 0)
|
#define APP_SHORTCUT_FM 0x01u
|
||||||
#define APP_SHORTCUT_FOXHUNT (1u << 1)
|
#define APP_SHORTCUT_FOXHUNT 0x02u
|
||||||
#define APP_SHORTCUT_BEACON (1u << 2)
|
#define APP_SHORTCUT_BEACON 0x04u
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) {
|
typedef struct __attribute__((packed)) {
|
||||||
uint32_t magic; /* APP_MAGIC */
|
uint32_t magic; /* APP_MAGIC */
|
||||||
@@ -108,8 +110,8 @@ uint8_t APP_ValidateSlot(uint8_t slot, app_header_t *out_header);
|
|||||||
* Returns when the app exits; the internal flash is never touched. */
|
* Returns when the app exits; the internal flash is never touched. */
|
||||||
uint8_t APP_LaunchOverlay(uint8_t slot);
|
uint8_t APP_LaunchOverlay(uint8_t slot);
|
||||||
|
|
||||||
/* Find the first valid app with this exact header name and launch it. */
|
/* Launch the first installed app advertising this shortcut bit. */
|
||||||
uint8_t APP_LaunchOverlayByName(const char *name);
|
uint8_t APP_LaunchOverlayShortcut(uint8_t shortcut);
|
||||||
|
|
||||||
/* Cached availability of apps exposed as resident quick actions. */
|
/* Cached availability of apps exposed as resident quick actions. */
|
||||||
uint8_t APP_OverlayShortcutMask(void);
|
uint8_t APP_OverlayShortcutMask(void);
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ trap 'printf "\r ❌ %-13s build failed \n" "$APP_NAME"' ERR
|
|||||||
step 1 compile ; "$CC" $CFLAGS $LDFLAGS "${APP}_app.c" -lgcc -o "${APP}.elf"
|
step 1 compile ; "$CC" $CFLAGS $LDFLAGS "${APP}_app.c" -lgcc -o "${APP}.elf"
|
||||||
step 2 objcopy ; "$OBJCOPY" -O binary "${APP}.elf" "${APP}.bin"
|
step 2 objcopy ; "$OBJCOPY" -O binary "${APP}.elf" "${APP}.bin"
|
||||||
step 3 pack ; python3 ../pack_app.py "${APP}.bin" "${OUT}.app" \
|
step 3 pack ; python3 ../pack_app.py "${APP}.bin" "${OUT}.app" \
|
||||||
--name "$APP_NAME" --ver "$APP_VER" --vma "${APP_VMA}" >/dev/null
|
--name "$APP_NAME" --ver "$APP_VER" --vma "${APP_VMA}" \
|
||||||
|
--shortcut beacon >/dev/null
|
||||||
trap - ERR
|
trap - ERR
|
||||||
|
|
||||||
BYTES=$(wc -c < "${APP}.bin")
|
BYTES=$(wc -c < "${APP}.bin")
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ trap 'printf "\r ❌ %-13s build failed \n" "$APP_NAME"' ERR
|
|||||||
step 1 compile ; "$CC" $CFLAGS $LDFLAGS "${APP}_app.c" -lgcc -o "${APP}.elf"
|
step 1 compile ; "$CC" $CFLAGS $LDFLAGS "${APP}_app.c" -lgcc -o "${APP}.elf"
|
||||||
step 2 objcopy ; "$OBJCOPY" -O binary "${APP}.elf" "${APP}.bin"
|
step 2 objcopy ; "$OBJCOPY" -O binary "${APP}.elf" "${APP}.bin"
|
||||||
step 3 pack ; python3 ../pack_app.py "${APP}.bin" "${OUT}.app" \
|
step 3 pack ; python3 ../pack_app.py "${APP}.bin" "${OUT}.app" \
|
||||||
--name "$APP_NAME" --ver "$APP_VER" --vma "${APP_VMA}" --screensaver >/dev/null
|
--name "$APP_NAME" --ver "$APP_VER" --vma "${APP_VMA}" \
|
||||||
|
--shortcut fm --screensaver >/dev/null
|
||||||
trap - ERR
|
trap - ERR
|
||||||
|
|
||||||
BYTES=$(wc -c < "${APP}.bin")
|
BYTES=$(wc -c < "${APP}.bin")
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ trap 'printf "\r ❌ %-13s build failed \n" "$APP_NAME"' ERR
|
|||||||
step 1 compile ; "$CC" $CFLAGS $LDFLAGS "${APP}_app.c" -lgcc -o "${APP}.elf"
|
step 1 compile ; "$CC" $CFLAGS $LDFLAGS "${APP}_app.c" -lgcc -o "${APP}.elf"
|
||||||
step 2 objcopy ; "$OBJCOPY" -O binary "${APP}.elf" "${APP}.bin"
|
step 2 objcopy ; "$OBJCOPY" -O binary "${APP}.elf" "${APP}.bin"
|
||||||
step 3 pack ; python3 ../pack_app.py "${APP}.bin" "${OUT}.app" \
|
step 3 pack ; python3 ../pack_app.py "${APP}.bin" "${OUT}.app" \
|
||||||
--name "$APP_NAME" --ver "$APP_VER" --vma "${APP_VMA}" >/dev/null
|
--name "$APP_NAME" --ver "$APP_VER" --vma "${APP_VMA}" \
|
||||||
|
--shortcut foxhunt >/dev/null
|
||||||
trap - ERR
|
trap - ERR
|
||||||
|
|
||||||
BYTES=$(wc -c < "${APP}.bin")
|
BYTES=$(wc -c < "${APP}.bin")
|
||||||
|
|||||||
+12
-1
@@ -32,6 +32,13 @@ ABI_VERSION = cdefine("app_api.h", "APP_ABI_VERSION")
|
|||||||
OVERLAY_MAX = cdefine("app_overlay.h", "APP_OVERLAY_MAX") # 4 KiB overlay budget
|
OVERLAY_MAX = cdefine("app_overlay.h", "APP_OVERLAY_MAX") # 4 KiB overlay budget
|
||||||
FLAG_COMMITTED = cdefine("app_overlay.h", "APP_FLAG_COMMITTED")
|
FLAG_COMMITTED = cdefine("app_overlay.h", "APP_FLAG_COMMITTED")
|
||||||
FLAG_SCREEN_SAVER = cdefine("app_overlay.h", "APP_FLAG_SCREEN_SAVER")
|
FLAG_SCREEN_SAVER = cdefine("app_overlay.h", "APP_FLAG_SCREEN_SAVER")
|
||||||
|
FLAG_SHORTCUT_SHIFT = cdefine("app_overlay.h", "APP_FLAG_SHORTCUT_SHIFT")
|
||||||
|
SHORTCUTS = {
|
||||||
|
"none": 0,
|
||||||
|
"fm": cdefine("app_overlay.h", "APP_SHORTCUT_FM"),
|
||||||
|
"foxhunt": cdefine("app_overlay.h", "APP_SHORTCUT_FOXHUNT"),
|
||||||
|
"beacon": cdefine("app_overlay.h", "APP_SHORTCUT_BEACON"),
|
||||||
|
}
|
||||||
|
|
||||||
def field(s: str, n: int) -> bytes:
|
def field(s: str, n: int) -> bytes:
|
||||||
b = s.encode("ascii", "strict")[: n - 1]
|
b = s.encode("ascii", "strict")[: n - 1]
|
||||||
@@ -48,6 +55,8 @@ def main():
|
|||||||
help="RAM VMA the app was linked at (must match the firmware overlay)")
|
help="RAM VMA the app was linked at (must match the firmware overlay)")
|
||||||
ap.add_argument("--screensaver", action="store_true",
|
ap.add_argument("--screensaver", action="store_true",
|
||||||
help="allow the resident BLTime screen saver while this app is idle")
|
help="allow the resident BLTime screen saver while this app is idle")
|
||||||
|
ap.add_argument("--shortcut", choices=SHORTCUTS, default="none",
|
||||||
|
help="resident quick action advertised by this app")
|
||||||
a = ap.parse_args()
|
a = ap.parse_args()
|
||||||
|
|
||||||
code = open(a.infile, "rb").read()
|
code = open(a.infile, "rb").read()
|
||||||
@@ -57,7 +66,9 @@ def main():
|
|||||||
sys.exit(f"code {len(code)} B exceeds overlay budget {OVERLAY_MAX} B")
|
sys.exit(f"code {len(code)} B exceeds overlay budget {OVERLAY_MAX} B")
|
||||||
|
|
||||||
crc = zlib.crc32(code) & 0xFFFFFFFF
|
crc = zlib.crc32(code) & 0xFFFFFFFF
|
||||||
flags = FLAG_COMMITTED | (FLAG_SCREEN_SAVER if a.screensaver else 0)
|
flags = (FLAG_COMMITTED |
|
||||||
|
(FLAG_SCREEN_SAVER if a.screensaver else 0) |
|
||||||
|
(SHORTCUTS[a.shortcut] << FLAG_SHORTCUT_SHIFT))
|
||||||
header = struct.pack(
|
header = struct.pack(
|
||||||
"<4sHHIIHH16s16sI8s",
|
"<4sHHIIHH16s16sI8s",
|
||||||
MAGIC, HDR_VERSION, ABI_VERSION,
|
MAGIC, HDR_VERSION, ABI_VERSION,
|
||||||
|
|||||||
Reference in new issue
Block a user