102 Commits
v0.4 ... v0.12

Author SHA1 Message Date
Krzysiek Egzmont
f11d0fbcda Code refactoring 2023-10-17 21:47:39 +02:00
Krzysiek Egzmont
96144af9e9 Added function buttons configuration to menu 2023-10-17 20:16:56 +02:00
Krzysiek Egzmont
4dd2445833 Menu items reordered 2023-10-17 13:34:18 +02:00
Krzysiek Egzmont
6172d942be Fix scanning on opposite VFO, ignore scan result on EXIT button, changed status bar while scanning 2023-10-17 02:57:55 +02:00
Krzysiek Egzmont
0c0cbb232c Refactoring 2023-10-17 02:26:20 +02:00
Krzysiek Egzmont
298ff29cf4 Fix restore VFO settings after scan 2023-10-16 22:59:17 +02:00
Krzysiek Egzmont
f70707e17f Fix copy channel to VFO function copying wrong VFO, clean VFO setup 2023-10-16 18:39:20 +02:00
Krzysiek Egzmont
f1fc04591c Fix compiler errors 2023-10-16 17:17:17 +02:00
Krzysiek Egzmont
a26c397417 Remove fall-through pragmas 2023-10-16 16:52:32 +02:00
Krzysiek Egzmont
d3a2a7bee9 Menu id fix 2023-10-16 16:02:39 +02:00
Krzysiek Egzmont
d817ff7e6a Fixed RSSI calibration 2023-10-16 13:01:24 +02:00
Krzysiek Egzmont
ec4bec5b1f Flashlight SOS function 2023-10-16 00:15:04 +02:00
Krzysiek Egzmont
d7c458839c Change menu items names 2023-10-15 22:07:55 +02:00
Krzysiek Egzmont
cff2f25e56 Consolidate "T VFO" and "DUALRX" into one "RXMODE" 2023-10-15 21:52:42 +02:00
Krzysiek Egzmont
63ac84883e add execute rights to compile-with-docker.sh 2023-10-15 21:12:06 +02:00
wrobepio
f8252df281 fixed: "compiled-firmware" folder missing under linux - fixed shell variable $PWD 2023-10-14 20:26:29 +02:00
Krzysiek Egzmont
be00bb99ad FIX #28: After entering item 51(BATVOL) of the menu, the automatic lock screen cannot be unlocked 2023-10-12 20:45:26 +02:00
Krzysiek Egzmont
7e6a78ab6c FIX #26: vfo state (TX DISABLE label) update issue when FM radio disabled in Makefile 2023-10-12 00:44:52 +02:00
Krzysiek Egzmont
06c2ddf543 BUG FIX: power save never activated 2023-10-10 19:36:12 +02:00
Krzysiek Egzmont
47f1e80252 Fix #25: When you stop the scan with the PTT the Walkie stays in permanent TX 2023-10-10 17:32:58 +02:00
Krzysiek Egzmont
64bc29d362 FIX #24: lock/unlock doesn't work when FM radio active 2023-10-10 14:29:51 +02:00
Krzysiek Egzmont
8d17f5922c FIX #21: Battery symbol fix of a fix 2023-10-10 02:39:02 +02:00
Krzysiek Egzmont
063dc61e65 Part of the recent changes form 1o11, including DTMF input box error #19 2023-10-09 21:47:06 +02:00
Krzysiek Egzmont
60ccd3372f FIX #8: This should fix compiler errors 2023-10-09 17:17:45 +02:00
Krzysiek Egzmont
149a0f5bdc Revert do not update battery level when TX 2023-10-09 16:57:52 +02:00
Krzysiek Egzmont
c7da7cf725 Battery symbol fix 2023-10-09 16:30:20 +02:00
Krzysiek Egzmont
4b9147327a Fix random upper/lower for TX, bring back TX on last RX 2023-10-09 16:02:57 +02:00
Krzysiek Egzmont
43f4790f5b BUG FIX #15: shifted numbers in spectrum freq input box 2023-10-06 19:57:08 +02:00
Krzysiek Egzmont
43ccce33da README: new build instructions 2023-10-06 12:15:01 +02:00
Krzysiek Egzmont
b2839de2a5 Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-06 11:28:19 +02:00
OneOfEleven
5397b3ee88 Fixed key number offset bug added yesterday 2023-10-06 07:48:45 +01:00
OneOfEleven
9a0a75446a README.md 2023-10-06 00:19:21 +01:00
OneOfEleven
f25e0230f0 Added power-on compile option 2023-10-06 00:18:47 +01:00
OneOfEleven
16c908f0bf Channel/Frequency scanning updates 2023-10-05 23:58:55 +01:00
OneOfEleven
9c7d6a38e5 Remember scan ALL channels option across power cycles 2023-10-05 22:59:26 +01:00
OneOfEleven
ec5e9dde66 Squelch tuning 2023-10-05 22:44:44 +01:00
OneOfEleven
5c346c8466 Fic typing in keys bug 2023-10-05 17:38:25 +01:00
OneOfEleven
40d09591b3 Fixed silly error I made 2023-10-05 16:28:20 +01:00
OneOfEleven
bd9f337a5b Make all warnings vanish over to bricky's house ! 2023-10-05 15:26:08 +01:00
OneOfEleven
cb05a5881f Try again to calm the type warnings 2023-10-05 14:40:34 +01:00
OneOfEleven
6b44659419 Mzybe clear up some signed/unsigned compile warnings 2023-10-05 14:33:05 +01:00
Krzysiek Egzmont
81f18aa281 build errors fix 2023-10-05 15:10:12 +02:00
Krzysiek Egzmont
410c0e47cb Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-05 15:05:54 +02:00
OneOfEleven
2372949eb9 RX bandwidth and squelch update 2023-10-05 13:42:14 +01:00
OneOfEleven
0cf4e1fe36 Merge pull request #123 from bricky149/clang-build
Add support for clang builds
2023-10-05 12:44:47 +01:00
OneOfEleven
9b2ce88a72 RX fixed bandwidth adjustments + squelch sensitivity adjustments 2023-10-05 12:42:40 +01:00
bricky149
a23f359735 Add support for clang builds 2023-10-05 12:22:09 +01:00
OneOfEleven
b343993a72 Don't use fast scan option - for now 2023-10-05 10:19:50 +01:00
OneOfEleven
4d8db8f0b9 Updated 5/7 function key operation (see README.md) 2023-10-05 10:03:07 +01:00
OneOfEleven
609df5f279 Ignore all long-press/function keys whilst in menu 2023-10-05 09:17:38 +01:00
OneOfEleven
e042b21e65 Rename RX_CHANNEL and TX_CHANNEL to RX_VFO and TX_VFO to be much less confusing 2023-10-05 01:07:04 +01:00
OneOfEleven
d632698428 Clean up copy-chan-to-vfo 2023-10-05 00:26:37 +01:00
OneOfEleven
eba4bf9c80 Fix copy-chan-to-vfo 2023-10-05 00:07:35 +01:00
OneOfEleven
56fc929921 Let copy-chan-to-vfo work when dual-watch enabled 2023-10-05 00:01:13 +01:00
Krzysiek Egzmont
2cff29e6db Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-05 00:11:29 +02:00
Krzysiek Egzmont
ced053ba63 Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-05 00:10:14 +02:00
OneOfEleven
a6324ffcf8 Fix for when channel scan has no scanlisted channels to scan 2023-10-04 23:09:55 +01:00
OneOfEleven
6e7f8b1877 Update README.md with new function key operations list 2023-10-04 22:56:54 +01:00
OneOfEleven
74a9adcdbd Merge pull request #119 from bricky149/gc-sections
Retain space saving benefits when not using LTO
2023-10-04 22:35:54 +01:00
bricky149
4a05e69e19 Retain space saving benefits when not using LTO 2023-10-04 22:24:07 +01:00
OneOfEleven
1cfb59fa38 Scanlist now 1, 2 or all channels 2023-10-04 22:08:13 +01:00
Krzysiek Egzmont
bee4a8c41a Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-04 22:35:03 +02:00
OneOfEleven
fe949d2ae3 Sanity check on DTMF hold time 2023-10-04 21:29:35 +01:00
Krzysiek Egzmont
292181a9a6 struct padding fixed in spectrum 2023-10-04 22:29:26 +02:00
Krzysiek Egzmont
654145bd07 Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-04 22:28:24 +02:00
OneOfEleven
5900d46edb Disable the weak signal auto RX bandwidth reduction - test 2023-10-04 21:18:02 +01:00
OneOfEleven
1dbe874240 Slightly reduced tone amplitude - to reduce deviation level 2023-10-04 20:34:57 +01:00
OneOfEleven
eea1756dc0 Disable padding flag - causing problems with structures that need no padding 2023-10-04 20:14:01 +01:00
OneOfEleven
32fad129cc Modify scanlist top status bar symbol 2023-10-04 20:05:00 +01:00
OneOfEleven
6a8c7d5b37 Modify scanlist symbol on status bar (SL-1 / SL-2) 2023-10-04 19:11:19 +01:00
OneOfEleven
efca16088b Merge branch 'main' of https://github.com/OneOfEleven/uv-k5-firmware-custom 2023-10-04 19:01:09 +01:00
OneOfEleven
814e5edb07 Toggle scankists update 2023-10-04 19:01:00 +01:00
OneOfEleven
abfcf15aca Merge pull request #113 from egzumer/batcal
Update all battery bar level values on battery calibration
2023-10-04 19:00:09 +01:00
OneOfEleven
a113d41c1a Merge branch 'main' of https://github.com/OneOfEleven/uv-k5-firmware-custom 2023-10-04 18:54:41 +01:00
OneOfEleven
b26b1fab95 Scanlist update 2023-10-04 18:54:26 +01:00
OneOfEleven
2242c4097a Merge pull request #114 from bricky149/struct-padding
-Wpadded, reorder struct fields, saves 400 bytes
2023-10-04 18:52:56 +01:00
bricky149
74c37451bf -Wpadding, reorder struct fields, saves 400 bytes 2023-10-04 18:35:51 +01:00
Krzysiek Egzmont
59c4c4dcd3 Merge branch 'batcal' 2023-10-04 18:49:02 +02:00
Krzysiek Egzmont
eec8e22e41 Update all battery bar level values on battery calibration 2023-10-04 18:35:50 +02:00
OneOfEleven
429ac36ffe Backlight TX/RX menu update 2023-10-04 16:37:11 +01:00
OneOfEleven
567b0cfa83 Compander bug fixed, found by two other people :) 2023-10-04 14:55:58 +01:00
OneOfEleven
f4b637b51a Added VOX enable/disable compile option 2023-10-04 11:57:34 +01:00
OneOfEleven
5f2e069437 Rename AF constant 2023-10-04 10:01:07 +01:00
OneOfEleven
9d990f7e67 Fix 1750Hz key bug 2023-10-04 00:45:03 +01:00
OneOfEleven
eaccdab1d4 1750Hz tone side key now a momentary action (press to TX tone, release to stop TX tone) 2023-10-04 00:15:01 +01:00
OneOfEleven
6e2ba5c214 Updated README.md 2023-10-03 23:33:28 +01:00
OneOfEleven
4d808de2ac Added Copy-channel-to-VFO - long press 'M' key (menu key) 2023-10-03 23:33:01 +01:00
OneOfEleven
8fb9825ad8 More efficient AM fix table and code 2023-10-03 20:03:04 +01:00
OneOfEleven
4b17aa6d3f serial comms TX lockout bug fix 2023-10-03 19:19:40 +01:00
Krzysiek Egzmont
6d0aea4587 BUG FIX: #6 serial communication error 2023-10-03 20:16:51 +02:00
Krzysiek Egzmont
ec2d6e4a74 Makefile 2023-10-03 19:29:16 +02:00
Krzysiek Egzmont
b301a8d21e Key 5, long press - toggle scan list, F + short press - spectrum 2023-10-03 19:04:37 +02:00
Krzysiek Egzmont
339e280a27 Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-03 18:45:03 +02:00
OneOfEleven
f8aaf47374 AM RX mode could possible not be being set - maybe fixed 2023-10-03 16:09:25 +01:00
OneOfEleven
84e174544d Added backlight on RX menu option "BLT RX" 2023-10-03 13:18:49 +01:00
OneOfEleven
ac05207ef0 Added compile option ENABLE_BACKLIGHT_ON_RX - will make this a menu option soon 2023-10-03 13:02:43 +01:00
OneOfEleven
9d5d36cc1f Fix compand setting not saved for channel mode 2023-10-03 11:55:46 +01:00
OneOfEleven
c5c86d0ad0 Fix frequency band error from yesterday 2023-10-03 11:48:00 +01:00
OneOfEleven
010ea0308a Renames 'ENABLE_SQUELCH_LOWER'. Added faster channel scan option (but makes squelch/grn-LED/back-light more twitchy) 2023-10-03 11:32:04 +01:00
OneOfEleven
b3ca095af1 Maybe fixed reboot when serial comms start 2023-10-03 10:13:22 +01:00
OneOfEleven
6a3a26c470 Re-enabled by default the AM fix data until it's fully working. 2023-10-03 00:26:46 +01:00
OneOfEleven
2551077cef Menu remains on screen whilst TX'ing 2023-10-03 00:14:36 +01:00
76 changed files with 4249 additions and 3436 deletions

111
Makefile
View File

@@ -3,6 +3,7 @@
# 0 = disable # 0 = disable
# 1 = enable # 1 = enable
# #
ENABLE_CLANG := 0
ENABLE_SWD := 0 ENABLE_SWD := 0
ENABLE_OVERLAY := 0 ENABLE_OVERLAY := 0
ENABLE_LTO := 1 ENABLE_LTO := 1
@@ -11,8 +12,10 @@ ENABLE_AIRCOPY := 0
ENABLE_FMRADIO := 1 ENABLE_FMRADIO := 1
ENABLE_NOAA := 0 ENABLE_NOAA := 0
ENABLE_VOICE := 0 ENABLE_VOICE := 0
ENABLE_ALARM := 1 ENABLE_VOX := 1
ENABLE_TX1750 := 1 ENABLE_ALARM := 0
ENABLE_TX1750 := 0
ENABLE_PWRON_PASSWORD := 0
ENABLE_BIG_FREQ := 1 ENABLE_BIG_FREQ := 1
ENABLE_SMALL_BOLD := 1 ENABLE_SMALL_BOLD := 1
ENABLE_KEEP_MEM_NAME := 1 ENABLE_KEEP_MEM_NAME := 1
@@ -20,19 +23,18 @@ ENABLE_WIDE_RX := 1
ENABLE_TX_WHEN_AM := 0 ENABLE_TX_WHEN_AM := 0
ENABLE_F_CAL_MENU := 0 ENABLE_F_CAL_MENU := 0
ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1
ENABLE_MAIN_KEY_HOLD := 1
ENABLE_BOOT_BEEPS := 0 ENABLE_BOOT_BEEPS := 0
ENABLE_COMPANDER := 1
ENABLE_SHOW_CHARGE_LEVEL := 1 ENABLE_SHOW_CHARGE_LEVEL := 1
ENABLE_REVERSE_BAT_SYMBOL := 1 ENABLE_REVERSE_BAT_SYMBOL := 0
ENABLE_CODE_SCAN_TIMEOUT := 0 ENABLE_CODE_SCAN_TIMEOUT := 0
ENABLE_AM_FIX := 1 ENABLE_AM_FIX := 1
ENABLE_AM_FIX_SHOW_DATA := 0 ENABLE_AM_FIX_SHOW_DATA := 0
ENABLE_SQUELCH_LOWER := 0 ENABLE_SQUELCH_MORE_SENSITIVE := 1
ENABLE_FASTER_CHANNEL_SCAN := 1
ENABLE_RSSI_BAR := 1 ENABLE_RSSI_BAR := 1
ENABLE_AUDIO_BAR := 1 ENABLE_AUDIO_BAR := 1
ENABLE_COPY_CHAN_TO_VFO := 1
ENABLE_SPECTRUM := 1 ENABLE_SPECTRUM := 1
#ENABLE_COPY_CHAN_TO_VFO := 1
#ENABLE_SINGLE_VFO_CHAN := 1 #ENABLE_SINGLE_VFO_CHAN := 1
#ENABLE_BAND_SCOPE := 1 #ENABLE_BAND_SCOPE := 1
@@ -40,7 +42,13 @@ ENABLE_SPECTRUM := 1
TARGET = firmware TARGET = firmware
ifeq ($(ENABLE_CLANG),1)
# GCC's linker, ld, doesn't understand LLVM's generated bytecode
ENABLE_LTO := 0
endif
ifeq ($(ENABLE_LTO),1) ifeq ($(ENABLE_LTO),1)
# can't have LTO and OVERLAY enabled at same time
ENABLE_OVERLAY := 0 ENABLE_OVERLAY := 0
endif endif
@@ -105,7 +113,9 @@ OBJS += app/scanner.o
ifeq ($(ENABLE_UART),1) ifeq ($(ENABLE_UART),1)
OBJS += app/uart.o OBJS += app/uart.o
endif endif
OBJS += am_fix.o ifeq ($(ENABLE_AM_FIX), 1)
OBJS += am_fix.o
endif
OBJS += audio.o OBJS += audio.o
OBJS += bitmaps.o OBJS += bitmaps.o
OBJS += board.o OBJS += board.o
@@ -128,7 +138,9 @@ ifeq ($(ENABLE_FMRADIO),1)
endif endif
OBJS += ui/helper.o OBJS += ui/helper.o
OBJS += ui/inputbox.o OBJS += ui/inputbox.o
OBJS += ui/lock.o ifeq ($(ENABLE_PWRON_PASSWORD),1)
OBJS += ui/lock.o
endif
OBJS += ui/main.o OBJS += ui/main.o
OBJS += ui/menu.o OBJS += ui/menu.o
OBJS += ui/scanner.o OBJS += ui/scanner.o
@@ -138,15 +150,28 @@ OBJS += ui/welcome.o
OBJS += version.o OBJS += version.o
OBJS += main.o OBJS += main.o
ifeq ($(OS),Windows_NT) ifeq ($(OS), Windows_NT)
TOP := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) TOP := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
else else
TOP := $(shell pwd) TOP := $(shell pwd)
endif endif
AS = arm-none-eabi-gcc AS = arm-none-eabi-gcc
CC = arm-none-eabi-gcc
CC =
LD = arm-none-eabi-gcc LD = arm-none-eabi-gcc
ifeq ($(ENABLE_CLANG),0)
CC += arm-none-eabi-gcc
# Use GCC's linker to avoid undefined symbol errors
# LD += arm-none-eabi-gcc
else
# May need to adjust this to match your system
CC += clang --sysroot=/usr/arm-none-eabi --target=arm-none-eabi
# Bloats binaries to 512MB
# LD = ld.lld
endif
OBJCOPY = arm-none-eabi-objcopy OBJCOPY = arm-none-eabi-objcopy
SIZE = arm-none-eabi-size SIZE = arm-none-eabi-size
@@ -162,16 +187,30 @@ ifeq ($(ENABLE_OVERLAY),1)
ASFLAGS += -DENABLE_OVERLAY ASFLAGS += -DENABLE_OVERLAY
endif endif
CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c11 -MMD CFLAGS =
#CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c99 -MMD ifeq ($(ENABLE_CLANG),0)
#CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu99 -MMD CFLAGS += -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c11 -MMD
#CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu11 -MMD #CFLAGS += -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c99 -MMD
#CFLAGS += -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu99 -MMD
#CFLAGS += -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu11 -MMD
else
# Oz needed to make it fit on flash
CFLAGS += -Oz -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c11 -MMD
endif
ifeq ($(ENABLE_LTO),1) ifeq ($(ENABLE_LTO),1)
# CFLAGS += -flto
CFLAGS += -flto=2 CFLAGS += -flto=2
else
# We get most of the space savings if LTO creates problems
CFLAGS += -ffunction-sections -fdata-sections
endif endif
# May cause unhelpful build failures
#CFLAGS += -Wpadded
# catch any and all warnings
CFLAGS += -Wextra
CFLAGS += -DPRINTF_INCLUDE_CONFIG_H CFLAGS += -DPRINTF_INCLUDE_CONFIG_H
CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\" CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\"
@@ -205,12 +244,18 @@ endif
ifeq ($(ENABLE_VOICE),1) ifeq ($(ENABLE_VOICE),1)
CFLAGS += -DENABLE_VOICE CFLAGS += -DENABLE_VOICE
endif endif
ifeq ($(ENABLE_VOX),1)
CFLAGS += -DENABLE_VOX
endif
ifeq ($(ENABLE_ALARM),1) ifeq ($(ENABLE_ALARM),1)
CFLAGS += -DENABLE_ALARM CFLAGS += -DENABLE_ALARM
endif endif
ifeq ($(ENABLE_TX1750),1) ifeq ($(ENABLE_TX1750),1)
CFLAGS += -DENABLE_TX1750 CFLAGS += -DENABLE_TX1750
endif endif
ifeq ($(ENABLE_PWRON_PASSWORD),1)
CFLAGS += -DENABLE_PWRON_PASSWORD
endif
ifeq ($(ENABLE_KEEP_MEM_NAME),1) ifeq ($(ENABLE_KEEP_MEM_NAME),1)
CFLAGS += -DENABLE_KEEP_MEM_NAME CFLAGS += -DENABLE_KEEP_MEM_NAME
endif endif
@@ -226,15 +271,9 @@ endif
ifeq ($(ENABLE_CTCSS_TAIL_PHASE_SHIFT),1) ifeq ($(ENABLE_CTCSS_TAIL_PHASE_SHIFT),1)
CFLAGS += -DENABLE_CTCSS_TAIL_PHASE_SHIFT CFLAGS += -DENABLE_CTCSS_TAIL_PHASE_SHIFT
endif endif
ifeq ($(ENABLE_MAIN_KEY_HOLD),1)
CFLAGS += -DENABLE_MAIN_KEY_HOLD
endif
ifeq ($(ENABLE_BOOT_BEEPS),1) ifeq ($(ENABLE_BOOT_BEEPS),1)
CFLAGS += -DENABLE_BOOT_BEEPS CFLAGS += -DENABLE_BOOT_BEEPS
endif endif
ifeq ($(ENABLE_COMPANDER),1)
CFLAGS += -DENABLE_COMPANDER
endif
ifeq ($(ENABLE_SHOW_CHARGE_LEVEL),1) ifeq ($(ENABLE_SHOW_CHARGE_LEVEL),1)
CFLAGS += -DENABLE_SHOW_CHARGE_LEVEL CFLAGS += -DENABLE_SHOW_CHARGE_LEVEL
endif endif
@@ -253,8 +292,14 @@ endif
ifeq ($(ENABLE_AM_FIX_TEST1),1) ifeq ($(ENABLE_AM_FIX_TEST1),1)
CFLAGS += -DENABLE_AM_FIX_TEST1 CFLAGS += -DENABLE_AM_FIX_TEST1
endif endif
ifeq ($(ENABLE_SQUELCH_LOWER),1) ifeq ($(ENABLE_SQUELCH_MORE_SENSITIVE),1)
CFLAGS += -DENABLE_SQUELCH_LOWER CFLAGS += -DENABLE_SQUELCH_MORE_SENSITIVE
endif
ifeq ($(ENABLE_FASTER_CHANNEL_SCAN),1)
CFLAGS += -DENABLE_FASTER_CHANNEL_SCAN
endif
ifeq ($(ENABLE_BACKLIGHT_ON_RX),1)
CFLAGS += -DENABLE_BACKLIGHT_ON_RX
endif endif
ifeq ($(ENABLE_RSSI_BAR),1) ifeq ($(ENABLE_RSSI_BAR),1)
CFLAGS += -DENABLE_RSSI_BAR CFLAGS += -DENABLE_RSSI_BAR
@@ -272,11 +317,25 @@ ifeq ($(ENABLE_BAND_SCOPE),1)
CFLAGS += -DENABLE_BAND_SCOPE CFLAGS += -DENABLE_BAND_SCOPE
endif endif
LDFLAGS = -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld LDFLAGS =
ifeq ($(ENABLE_CLANG),0)
LDFLAGS += -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld
else
# Fix warning about implied executable stack
LDFLAGS += -z noexecstack -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld
endif
# Use newlib-nano instead of newlib
LDFLAGS += --specs=nano.specs
ifeq ($(ENABLE_LTO),0)
# Throw away unneeded func/data sections like LTO does
LDFLAGS += -Wl,--gc-sections
endif
ifeq ($(DEBUG),1) ifeq ($(DEBUG),1)
ASFLAGS += -g ASFLAGS += -g
CFLAGS += -g CFLAGS += -g
LDFLAGS += -g LDFLAGS += -g
endif endif

125
README.md
View File

@@ -33,56 +33,72 @@ Anyway, have fun.
# Radio performance # Radio performance
Please note that the Quansheng uv-k radios are not professional quality transceivers, their Please note that the Quansheng UV-Kx radios are not professional quality transceivers, their
performance is strictly limited, somewhat below that of a decent transceiver. The RX front performance is strictly limited. The RX front end has no track-tuned band pass filtering
end has no track-tuned band pass filtering at all, and so are wide band/wide open to any at all, and so are wide band/wide open to any and all signals over a large frequency range.
and all signals over a wide frequency range.
Using the radio in high intensity RF environments will nearly always destroy your reception,
the receiver simply doesn't have a great dynamic range, which means distorted AM audio with
strong received signals, there is nothing more anyone can do in firmware/software to stop that
happening once the RX gain adjustment I do (AM fix) reaches the hardwares limit.
Saying that, they are nice toys for the price, fun to play with. Using the radio in high intensity RF environments will most likely make reception anything but
easy (AM mode will suffer far more than FM ever will), the receiver simply doesn't have a
great dynamic range, which results in distorted AM audio with stronger RX'ed signals.
There is nothing more anyone can do in firmware/software to improve that, once the RX gain
adjustment I do (AM fix) reaches the hardwares limit, your AM RX audio will be all but
non-existant (just like Quansheng's firmware).
On the other hand, FM RX audio will/should be fine.
But, they are nice toys for the price, fun to play with.
# User customization # User customization
You can customize the firmware by enabling/disabling various compile options. You can customize the firmware by enabling/disabling various compile options, this allows
us to remove certain firmware features in order to make room in the flash for others.
You'll find the options at the top of "Makefile" ('0' = disable, '1' = enable) .. You'll find the options at the top of "Makefile" ('0' = disable, '1' = enable) ..
``` ```
ENABLE_CLANG := 0 **experimental, builds with clang instead of gcc (LTO will be disabled if you enable this)
ENABLE_SWD := 0 only needed if using CPU's SWD port (debugging/programming) ENABLE_SWD := 0 only needed if using CPU's SWD port (debugging/programming)
ENABLE_OVERLAY := 0 cpu FLASH stuff ENABLE_OVERLAY := 0 cpu FLASH stuff, not needed
ENABLE_LTO := 0 **experimental, reduces size of compiled firmware but might break EEPROM reads - DISABLE overlay if you enable this ENABLE_LTO := 0 **experimental, reduces size of compiled firmware but might break EEPROM reads (OVERLAY will be disabled if you enable this)
ENABLE_UART := 1 without this you can't configure radio via PC ENABLE_UART := 1 without this you can't configure radio via PC !
ENABLE_AIRCOPY := 0 easier to just enter frequency ENABLE_AIRCOPY := 0 easier to just enter frequency with butts
ENABLE_FMRADIO := 1 WBFM VHF band 2 RX ENABLE_FMRADIO := 0 WBFM VHF broadcast band receiver
ENABLE_NOAA := 0 everything NOAA ENABLE_NOAA := 0 everything NOAA (only of any use in the USA)
ENABLE_VOICE := 0 want to hear voices ? ENABLE_VOICE := 0 want to hear voices ?
ENABLE_VOX := 0
ENABLE_ALARM := 0 TX alarms ENABLE_ALARM := 0 TX alarms
ENABLE_1750HZ := 0 side key 1750Hz TX tone ENABLE_1750HZ := 0 side key 1750Hz TX tone (older style repeater access)
ENABLE_BIG_FREQ := 0 big font frequencies ENABLE_PWRON_PASSWORD := 1 power-on password stuff
ENABLE_BIG_FREQ := 0 big font frequencies (like original QS firmware)
ENABLE_SMALL_BOLD := 1 bold channel name/no. (when name + freq channel display mode) ENABLE_SMALL_BOLD := 1 bold channel name/no. (when name + freq channel display mode)
ENABLE_KEEP_MEM_NAME := 1 maintain channel name when (re)saving memory channel ENABLE_KEEP_MEM_NAME := 1 maintain channel name when (re)saving memory channel
ENABLE_WIDE_RX := 1 full 18MHz to 1300MHz RX (though frontend not tuned over full range) ENABLE_WIDE_RX := 1 full 18MHz to 1300MHz RX (though front-end/PA not designed for full range)
ENABLE_TX_WHEN_AM := 0 allow TX (always FM) when RX is set to AM ENABLE_TX_WHEN_AM := 0 allow TX (always FM) when RX is set to AM
ENABLE_F_CAL_MENU := 0 enable/disable the radios hidden frequency calibration menu ENABLE_F_CAL_MENU := 0 enable/disable the radios hidden frequency calibration menu
ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 standard CTCSS tail phase shift rather than QS's own 55Hz tone method ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 standard CTCSS tail phase shift rather than QS's own 55Hz tone method
ENABLE_MAIN_KEY_HOLD := 1 initial F-key press not needed, instead hold down keys 0-9 to access the functions ENABLE_BOOT_BEEPS := 0 gives user audio feedback on volume knob position at boot-up
ENABLE_BOOT_BEEPS := 0 give user audio feedback on volume knob position at boot-up
ENABLE_COMPANDER := 1 compander option (per channel)
ENABLE_SHOW_CHARGE_LEVEL := 0 show the charge level when the radio is on charge ENABLE_SHOW_CHARGE_LEVEL := 0 show the charge level when the radio is on charge
ENABLE_REVERSE_BAT_SYMBOL := 1 mirror the battery symbol on the status bar (+ pole on the right) ENABLE_REVERSE_BAT_SYMBOL := 1 mirror the battery symbol on the status bar (+ pole on the right)
ENABLE_CODE_SCAN_TIMEOUT := 0 enable/disable 32-sec CTCSS/DCS scan timeout (press exit butt to end scan if disabled) ENABLE_CODE_SCAN_TIMEOUT := 0 enable/disable 32-sec CTCSS/DCS scan timeout (press exit butt instead of time-out to end scan)
ENABLE_AM_FIX := 1 dynamically adjust the front end gains when in AM mode to helo prevent AM demodulator saturation - ignore the on-screen RSSI (for now) ENABLE_AM_FIX := 1 dynamically adjust the front end gains when in AM mode to helo prevent AM demodulator saturation, ignore the on-screen RSSI level (for now)
ENABLE_AM_FIX_SHOW_DATA := 1 show debug data for the AM fix ENABLE_AM_FIX_SHOW_DATA := 1 show debug data for the AM fix (still tweaking it)
ENABLE_SQUELCH_LOWER := 1 squelch settings more sensitive - plan to let user adjust it in the menu ENABLE_SQUELCH_MORE_SENSITIVE := 0 make squelch levels a little bit more sensitive - I plan to let user adjust the values themselves
ENABLE_RSSI_BAR := 1 enable a dBm/Sx RSSI bar graph level ENABLE_FASTER_CHANNEL_SCAN := 0 increases the channel scan speed, but the squelch is also made more twitchy
ENABLE_RSSI_BAR := 1 enable a dBm/Sn RSSI bar graph level inplace of the little antenna symbols
ENABLE_AUDIO_BAR := 0 experimental, display an audo bar level when TX'ing ENABLE_AUDIO_BAR := 0 experimental, display an audo bar level when TX'ing
#ENABLE_COPY_CHAN_TO_VFO := 1 not yet implemented - copy the channel into the VFO ENABLE_COPY_CHAN_TO_VFO := 1 copy current channel into the other VFO. Long press Menu key ('M')
#ENABLE_SINGLE_VFO_CHAN := 1 not yet implemented - single VFO on display when possible #ENABLE_SINGLE_VFO_CHAN := 1 not yet implemented - single VFO on display when possible
#ENABLE_BAND_SCOPE := 1 not yet implemented - spectrum/pan-adapter #ENABLE_BAND_SCOPE := 1 not yet implemented - spectrum/pan-adapter
``` ```
# New/modified function keys
* Long-press 'M' .. Copy selected channel into same VFO, then switch VFO to frequency mode
*
* Long-press '7' .. Toggle selected channel scanlist setting .. if VOX is disabled in Makefile
* or
* Long-press '5' .. Toggle selected channel scanlist setting .. if NOAA is disabled in Makefile
*
* Long-press '*' .. Start scanning, then toggles the scanning between scanlists 1, 2 or ALL channels
# Some changes made from the Quansheng firmware # Some changes made from the Quansheng firmware
* Various Quansheng firmware bugs fixed * Various Quansheng firmware bugs fixed
@@ -102,28 +118,38 @@ arm-none-eabi GCC version 10.3.1 is recommended, which is the current version on
Other versions may generate a flash file that is too big. Other versions may generate a flash file that is too big.
You can get an appropriate version from: https://developer.arm.com/downloads/-/gnu-rm You can get an appropriate version from: https://developer.arm.com/downloads/-/gnu-rm
clang may be used but isn't fully supported. Resulting binaries may also be bigger.
You can get it from: https://releases.llvm.org/download.html
# Building # Building
To build the firmware, you need to fetch the submodules and then run make: If you have docker installed you can use `compile-with-docker.bat`, the output files are created in `compiled-firmware` folder. This method gives significantly smaller binaries, I've seen differences up to 1kb, so it can fit more functionalities this way. The challange can be (or not) installing the docker itself.
```
git submodule update --init --recursive --depth=1
make
```
To compile directly in windows without the need of a linux virtual machine:
``` To compile directly in windows:
1. Download and install "gcc-arm-none-eabi-10.3-2021.10-win32.exe" from https://developer.arm.com/downloads/-/gnu-rm
2. Download and install "gnu_make-3.81.exe" from https://gnuwin32.sourceforge.net/packages/make.htm
3. You may (or not) need to manualy add gcc path to you OS environment PATH. 1. Open windows command line and run:
ie add C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin ```
winget install -e -h git.git Python.Python.3.8 GnuWin32.Make
4. You may (or not) need to reboot your PC after installing the above winget install -e -h Arm.GnuArmEmbeddedToolchain -v "10 2021.10"
``` ```
2. Close command line, open a new one and run:
Then you can run 'win_make.bat' from the directory you saved this source code too. ```
You may need to edit the bat file (path to make.exe) depending on where you installed the above two packages too. pip install --user --upgrade pip
pip install crcmod
mkdir c:\projects & cd /D c:/projects
git clone https://github.com/egzumer/uv-k5-firmware-custom.git
```
3. From now on you can build the firmware by going to `c:\projects\uv-k5-firmware-custom` and running `win_make.bat` or by running a command line:
```
cd /D c:\projects\uv-k5-firmware-custom
win_make.bat
```
4. To reset the repository and pull new changes run (!!! it will delete all your changes !!!):
```
cd /D c:\projects\uv-k5-firmware-custom
git reset --hard & git clean -fd & git pull
```
I've left some notes in the win_make.bat file to maybe help with stuff. I've left some notes in the win_make.bat file to maybe help with stuff.
@@ -131,6 +157,7 @@ I've left some notes in the win_make.bat file to maybe help with stuff.
Many thanks to various people on Telegram for putting up with me during this effort and helping: Many thanks to various people on Telegram for putting up with me during this effort and helping:
* [OneOfEleven](https://github.com/OneOfEleven)
* [DualTachyon](https://github.com/DualTachyon) * [DualTachyon](https://github.com/DualTachyon)
* [Mikhail](https://github.com/fagci) * [Mikhail](https://github.com/fagci)
* [Andrej](https://github.com/Tunas1337) * [Andrej](https://github.com/Tunas1337)
@@ -164,13 +191,13 @@ You may obtain a copy of the License at
# Example changes/updates # Example changes/updates
<p float="left"> <p float="left">
<img src="/image1.png" width=300 /> <img src="/images/image1.png" width=300 />
<img src="/image2.png" width=300 /> <img src="/images/image2.png" width=300 />
<img src="/image3.png" width=300 /> <img src="/images/image3.png" width=300 />
</p> </p>
Video showing the AM fix working .. Video showing the AM fix working ..
<video src="/AM_fix.mp4"></video> <video src="/images/AM_fix.mp4"></video>
<video src="https://github.com/OneOfEleven/uv-k5-firmware-custom/assets/51590168/2a3a9cdc-97da-4966-bf0d-1ce6ad09779c"></video> <video src="https://github.com/OneOfEleven/uv-k5-firmware-custom/assets/51590168/2a3a9cdc-97da-4966-bf0d-1ce6ad09779c"></video>

322
am_fix.c
View File

@@ -30,30 +30,13 @@
#include "functions.h" #include "functions.h"
#include "misc.h" #include "misc.h"
// original QS front end register settings
const uint8_t orig_lna_short = 3; // 0dB
const uint8_t orig_lna = 2; // -14dB
const uint8_t orig_mixer = 3; // 0dB
const uint8_t orig_pga = 6; // -3dB
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
typedef struct typedef struct
{ {
#if 1 uint16_t reg_val;
// bitfields take up less flash bytes int8_t gain_dB;
uint8_t lna_short:2; // 0 ~ 3 } __attribute__((packed)) t_gain_table;
uint8_t lna:3; // 0 ~ 7
uint8_t mixer:2; // 0 ~ 3
uint8_t pga:3; // 0 ~ 7
#else
uint8_t lna_short; // 0 ~ 3
uint8_t lna; // 0 ~ 7
uint8_t mixer; // 0 ~ 3
uint8_t pga; // 0 ~ 7
#endif
} t_gain_table;
//} __attribute__((packed)) t_gain_table;
// REG_10 AGC gain table // REG_10 AGC gain table
// //
@@ -103,141 +86,140 @@ const uint8_t orig_pga = 6; // -3dB
// if I don't add the brackets, reading the table returns unexpected/different values !!! // if I don't add the brackets, reading the table returns unexpected/different values !!!
// //
// //
// static const int16_t lna_short_dB[] = { -19, -16, -11, 0}; // was (but wrong) //// static const int16_t lna_short_dB[] = { -19, -16, -11, 0}; // was (but wrong)
static const int16_t lna_short_dB[] = { (-33), (-30), (-24), 0}; // corrected'ish // static const int16_t lna_short_dB[] = { (-33), (-30), (-24), 0}; // corrected'ish
static const int16_t lna_dB[] = { (-24), (-19), (-14), ( -9), (-6), (-4), (-2), 0}; // static const int16_t lna_dB[] = { (-24), (-19), (-14), ( -9), (-6), (-4), (-2), 0};
static const int16_t mixer_dB[] = { ( -8), ( -6), ( -3), 0}; // static const int16_t mixer_dB[] = { ( -8), ( -6), ( -3), 0};
static const int16_t pga_dB[] = { (-33), (-27), (-21), (-15), (-9), (-6), (-3), 0}; // static const int16_t pga_dB[] = { (-33), (-27), (-21), (-15), (-9), (-6), (-3), 0};
// lookup table is hugely easier than writing code to do the same // lookup table is hugely easier than writing code to do the same
// //
static const t_gain_table gain_table[] = static const t_gain_table gain_table[] =
{ {
{.lna_short = 3, .lna = 2, .mixer = 3, .pga = 6}, // 0 0dB -14dB 0dB -3dB .. -17dB original {0x035E, -17}, // 0 .. 3 2 3 6 .. 0dB -14dB 0dB -3dB .. -17dB original
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
// test table that lets me manually set the lna-short register // test table that lets me manually set the lna-short register
// to measure it's actual dB change using an RF signal generator // to measure it's actual dB change using an RF signal generator
{0, 2, 3, 6}, // 1 .. -33dB -14dB 0dB -3dB .. -50dB {0x005E, -50}, // 1 .. 0 2 3 6 .. -33dB -14dB 0dB -3dB .. -50dB
{1, 2, 3, 6}, // 2 .. -30dB -14dB 0dB -3dB .. -47dB {0x015E, -47}, // 2 .. 1 2 3 6 .. -30dB -14dB 0dB -3dB .. -47dB
{2, 2, 3, 6}, // 3 .. -24dB -14dB 0dB -3dB .. -41dB {0x025E, -41}, // 3 .. 2 2 3 6 .. -24dB -14dB 0dB -3dB .. -41dB
{3, 2, 3, 6} // 4 .. 0dB -14dB 0dB -3dB .. -17dB {0x035E, -17} // 4 .. 3 2 3 6 .. 0dB -14dB 0dB -3dB .. -17dB original
}; };
const unsigned int original_index = 1; static const unsigned int original_index = 1;
#else #else
{0, 0, 0, 0}, // 1 .. -33dB -24dB -8dB -33dB .. -98dB {0x0000, -98}, // 1 .. 0 0 0 0 .. -33dB -24dB -8dB -33dB .. -98dB
{0, 0, 1, 0}, // 2 .. -33dB -24dB -6dB -33dB .. -96dB {0x0008, -96}, // 2 .. 0 0 1 0 .. -33dB -24dB -6dB -33dB .. -96dB
{1, 0, 0, 0}, // 3 .. -30dB -24dB -8dB -33dB .. -95dB {0x0100, -95}, // 3 .. 1 0 0 0 .. -30dB -24dB -8dB -33dB .. -95dB
{0, 1, 0, 0}, // 4 .. -33dB -19dB -8dB -33dB .. -93dB {0x0020, -93}, // 4 .. 0 1 0 0 .. -33dB -19dB -8dB -33dB .. -93dB
{0, 0, 0, 1}, // 5 .. -33dB -24dB -8dB -27dB .. -92dB {0x0001, -92}, // 5 .. 0 0 0 1 .. -33dB -24dB -8dB -27dB .. -92dB
{0, 1, 1, 0}, // 6 .. -33dB -19dB -6dB -33dB .. -91dB {0x0028, -91}, // 6 .. 0 1 1 0 .. -33dB -19dB -6dB -33dB .. -91dB
{0, 0, 1, 1}, // 7 .. -33dB -24dB -6dB -27dB .. -90dB {0x0009, -90}, // 7 .. 0 0 1 1 .. -33dB -24dB -6dB -27dB .. -90dB
{1, 0, 0, 1}, // 8 .. -30dB -24dB -8dB -27dB .. -89dB {0x0101, -89}, // 8 .. 1 0 0 1 .. -30dB -24dB -8dB -27dB .. -89dB
{0, 1, 2, 0}, // 9 .. -33dB -19dB -3dB -33dB .. -88dB {0x0030, -88}, // 9 .. 0 1 2 0 .. -33dB -19dB -3dB -33dB .. -88dB
{1, 0, 3, 0}, // 10 .. -30dB -24dB 0dB -33dB .. -87dB {0x0118, -87}, // 10 .. 1 0 3 0 .. -30dB -24dB 0dB -33dB .. -87dB
{0, 0, 0, 2}, // 11 .. -33dB -24dB -8dB -21dB .. -86dB {0x0002, -86}, // 11 .. 0 0 0 2 .. -33dB -24dB -8dB -21dB .. -86dB
{1, 1, 2, 0}, // 12 .. -30dB -19dB -3dB -33dB .. -85dB {0x0130, -85}, // 12 .. 1 1 2 0 .. -30dB -19dB -3dB -33dB .. -85dB
{0, 0, 3, 1}, // 13 .. -33dB -24dB 0dB -27dB .. -84dB {0x0019, -84}, // 13 .. 0 0 3 1 .. -33dB -24dB 0dB -27dB .. -84dB
{0, 3, 0, 0}, // 14 .. -33dB -9dB -8dB -33dB .. -83dB {0x0060, -83}, // 14 .. 0 3 0 0 .. -33dB -9dB -8dB -33dB .. -83dB
{1, 1, 3, 0}, // 15 .. -30dB -19dB 0dB -33dB .. -82dB {0x0138, -82}, // 15 .. 1 1 3 0 .. -30dB -19dB 0dB -33dB .. -82dB
{1, 0, 3, 1}, // 16 .. -30dB -24dB 0dB -27dB .. -81dB {0x0119, -81}, // 16 .. 1 0 3 1 .. -30dB -24dB 0dB -27dB .. -81dB
{0, 2, 3, 0}, // 17 .. -33dB -14dB 0dB -33dB .. -80dB {0x0058, -80}, // 17 .. 0 2 3 0 .. -33dB -14dB 0dB -33dB .. -80dB
{1, 2, 0, 1}, // 18 .. -30dB -14dB -8dB -27dB .. -79dB {0x0141, -79}, // 18 .. 1 2 0 1 .. -30dB -14dB -8dB -27dB .. -79dB
{0, 3, 2, 0}, // 19 .. -33dB -9dB -3dB -33dB .. -78dB {0x0070, -78}, // 19 .. 0 3 2 0 .. -33dB -9dB -3dB -33dB .. -78dB
{1, 4, 0, 0}, // 20 .. -30dB -6dB -8dB -33dB .. -77dB {0x0180, -77}, // 20 .. 1 4 0 0 .. -30dB -6dB -8dB -33dB .. -77dB
{1, 1, 3, 1}, // 21 .. -30dB -19dB 0dB -27dB .. -76dB {0x0139, -76}, // 21 .. 1 1 3 1 .. -30dB -19dB 0dB -27dB .. -76dB
{0, 0, 2, 3}, // 22 .. -33dB -24dB -3dB -15dB .. -75dB {0x0013, -75}, // 22 .. 0 0 2 3 .. -33dB -24dB -3dB -15dB .. -75dB
{1, 3, 0, 1}, // 23 .. -30dB -9dB -8dB -27dB .. -74dB {0x0161, -74}, // 23 .. 1 3 0 1 .. -30dB -9dB -8dB -27dB .. -74dB
{1, 6, 0, 0}, // 24 .. -30dB -2dB -8dB -33dB .. -73dB {0x01C0, -73}, // 24 .. 1 6 0 0 .. -30dB -2dB -8dB -33dB .. -73dB
{0, 7, 1, 0}, // 25 .. -33dB 0dB -6dB -33dB .. -72dB {0x00E8, -72}, // 25 .. 0 7 1 0 .. -33dB 0dB -6dB -33dB .. -72dB
{0, 6, 2, 0}, // 26 .. -33dB -2dB -3dB -33dB .. -71dB {0x00D0, -71}, // 26 .. 0 6 2 0 .. -33dB -2dB -3dB -33dB .. -71dB
{2, 1, 3, 1}, // 27 .. -24dB -19dB 0dB -27dB .. -70dB {0x0239, -70}, // 27 .. 2 1 3 1 .. -24dB -19dB 0dB -27dB .. -70dB
{0, 3, 1, 2}, // 28 .. -33dB -9dB -6dB -21dB .. -69dB {0x006A, -69}, // 28 .. 0 3 1 2 .. -33dB -9dB -6dB -21dB .. -69dB
{0, 0, 0, 6}, // 29 .. -33dB -24dB -8dB -3dB .. -68dB {0x0006, -68}, // 29 .. 0 0 0 6 .. -33dB -24dB -8dB -3dB .. -68dB
{0, 5, 2, 1}, // 30 .. -33dB -4dB -3dB -27dB .. -67dB {0x00B1, -67}, // 30 .. 0 5 2 1 .. -33dB -4dB -3dB -27dB .. -67dB
{0, 0, 1, 6}, // 31 .. -33dB -24dB -6dB -3dB .. -66dB {0x000E, -66}, // 31 .. 0 0 1 6 .. -33dB -24dB -6dB -3dB .. -66dB
{1, 2, 3, 2}, // 32 .. -30dB -14dB 0dB -21dB .. -65dB {0x015A, -65}, // 32 .. 1 2 3 2 .. -30dB -14dB 0dB -21dB .. -65dB
{2, 1, 1, 3}, // 33 .. -24dB -19dB -6dB -15dB .. -64dB {0x022B, -64}, // 33 .. 2 1 1 3 .. -24dB -19dB -6dB -15dB .. -64dB
{1, 7, 3, 0}, // 34 .. -30dB 0dB 0dB -33dB .. -63dB {0x01F8, -63}, // 34 .. 1 7 3 0 .. -30dB 0dB 0dB -33dB .. -63dB
{1, 3, 0, 3}, // 35 .. -30dB -9dB -8dB -15dB .. -62dB {0x0163, -62}, // 35 .. 1 3 0 3 .. -30dB -9dB -8dB -15dB .. -62dB
{0, 1, 2, 5}, // 36 .. -33dB -19dB -3dB -6dB .. -61dB {0x0035, -61}, // 36 .. 0 1 2 5 .. -33dB -19dB -3dB -6dB .. -61dB
{2, 0, 2, 4}, // 37 .. -24dB -24dB -3dB -9dB .. -60dB {0x0214, -60}, // 37 .. 2 0 2 4 .. -24dB -24dB -3dB -9dB .. -60dB
{1, 6, 3, 1}, // 38 .. -30dB -2dB 0dB -27dB .. -59dB {0x01D9, -59}, // 38 .. 1 6 3 1 .. -30dB -2dB 0dB -27dB .. -59dB
{1, 2, 0, 5}, // 39 .. -30dB -14dB -8dB -6dB .. -58dB {0x0145, -58}, // 39 .. 1 2 0 5 .. -30dB -14dB -8dB -6dB .. -58dB
{2, 5, 0, 2}, // 40 .. -24dB -4dB -8dB -21dB .. -57dB {0x02A2, -57}, // 40 .. 2 5 0 2 .. -24dB -4dB -8dB -21dB .. -57dB
{2, 6, 2, 1}, // 41 .. -24dB -2dB -3dB -27dB .. -56dB {0x02D1, -56}, // 41 .. 2 6 2 1 .. -24dB -2dB -3dB -27dB .. -56dB
{0, 5, 2, 3}, // 42 .. -33dB -4dB -3dB -15dB .. -55dB {0x00B3, -55}, // 42 .. 0 5 2 3 .. -33dB -4dB -3dB -15dB .. -55dB
{2, 0, 2, 6}, // 43 .. -24dB -24dB -3dB -3dB .. -54dB {0x0216, -54}, // 43 .. 2 0 2 6 .. -24dB -24dB -3dB -3dB .. -54dB
{0, 3, 0, 6}, // 44 .. -33dB -9dB -8dB -3dB .. -53dB {0x0066, -53}, // 44 .. 0 3 0 6 .. -33dB -9dB -8dB -3dB .. -53dB
{0, 6, 0, 4}, // 45 .. -33dB -2dB -8dB -9dB .. -52dB {0x00C4, -52}, // 45 .. 0 6 0 4 .. -33dB -2dB -8dB -9dB .. -52dB
{0, 3, 1, 6}, // 46 .. -33dB -9dB -6dB -3dB .. -51dB {0x006E, -51}, // 46 .. 0 3 1 6 .. -33dB -9dB -6dB -3dB .. -51dB
{1, 2, 3, 5}, // 47 .. -30dB -14dB 0dB -6dB .. -50dB {0x015D, -50}, // 47 .. 1 2 3 5 .. -30dB -14dB 0dB -6dB .. -50dB
{0, 5, 1, 5}, // 48 .. -33dB -4dB -6dB -6dB .. -49dB {0x00AD, -49}, // 48 .. 0 5 1 5 .. -33dB -4dB -6dB -6dB .. -49dB
{0, 3, 3, 5}, // 49 .. -33dB -9dB 0dB -6dB .. -48dB {0x007D, -48}, // 49 .. 0 3 3 5 .. -33dB -9dB 0dB -6dB .. -48dB
{0, 6, 2, 4}, // 50 .. -33dB -2dB -3dB -9dB .. -47dB {0x00D4, -47}, // 50 .. 0 6 2 4 .. -33dB -2dB -3dB -9dB .. -47dB
{1, 5, 2, 4}, // 51 .. -30dB -4dB -3dB -9dB .. -46dB {0x01B4, -46}, // 51 .. 1 5 2 4 .. -30dB -4dB -3dB -9dB .. -46dB
{3, 0, 1, 3}, // 52 .. 0dB -24dB -6dB -15dB .. -45dB {0x030B, -45}, // 52 .. 3 0 1 3 .. 0dB -24dB -6dB -15dB .. -45dB
{0, 6, 1, 6}, // 53 .. -33dB -2dB -6dB -3dB .. -44dB {0x00CE, -44}, // 53 .. 0 6 1 6 .. -33dB -2dB -6dB -3dB .. -44dB
{1, 5, 2, 5}, // 54 .. -30dB -4dB -3dB -6dB .. -43dB {0x01B5, -43}, // 54 .. 1 5 2 5 .. -30dB -4dB -3dB -6dB .. -43dB
{0, 4, 2, 7}, // 55 .. -33dB -6dB -3dB 0dB .. -42dB {0x0097, -42}, // 55 .. 0 4 2 7 .. -33dB -6dB -3dB 0dB .. -42dB
{2, 2, 2, 7}, // 56 .. -24dB -14dB -3dB 0dB .. -41dB {0x0257, -41}, // 56 .. 2 2 2 7 .. -24dB -14dB -3dB 0dB .. -41dB
{2, 5, 2, 4}, // 57 .. -24dB -4dB -3dB -9dB .. -40dB {0x02B4, -40}, // 57 .. 2 5 2 4 .. -24dB -4dB -3dB -9dB .. -40dB
{2, 3, 3, 5}, // 58 .. -24dB -9dB 0dB -6dB .. -39dB {0x027D, -39}, // 58 .. 2 3 3 5 .. -24dB -9dB 0dB -6dB .. -39dB
{1, 6, 3, 5}, // 59 .. -30dB -2dB 0dB -6dB .. -38dB {0x01DD, -38}, // 59 .. 1 6 3 5 .. -30dB -2dB 0dB -6dB .. -38dB
{2, 5, 1, 6}, // 60 .. -24dB -4dB -6dB -3dB .. -37dB {0x02AE, -37}, // 60 .. 2 5 1 6 .. -24dB -4dB -6dB -3dB .. -37dB
{3, 3, 3, 1}, // 61 .. 0dB -9dB 0dB -27dB .. -36dB {0x0379, -36}, // 61 .. 3 3 3 1 .. 0dB -9dB 0dB -27dB .. -36dB
{3, 2, 3, 2}, // 62 .. 0dB -14dB 0dB -21dB .. -35dB {0x035A, -35}, // 62 .. 3 2 3 2 .. 0dB -14dB 0dB -21dB .. -35dB
{2, 5, 2, 6}, // 63 .. -24dB -4dB -3dB -3dB .. -34dB {0x02B6, -34}, // 63 .. 2 5 2 6 .. -24dB -4dB -3dB -3dB .. -34dB
{3, 0, 1, 6}, // 64 .. 0dB -24dB -6dB -3dB .. -33dB {0x030E, -33}, // 64 .. 3 0 1 6 .. 0dB -24dB -6dB -3dB .. -33dB
{3, 0, 0, 7}, // 65 .. 0dB -24dB -8dB 0dB .. -32dB {0x0307, -32}, // 65 .. 3 0 0 7 .. 0dB -24dB -8dB 0dB .. -32dB
{2, 5, 3, 6}, // 66 .. -24dB -4dB 0dB -3dB .. -31dB {0x02BE, -31}, // 66 .. 2 5 3 6 .. -24dB -4dB 0dB -3dB .. -31dB
{3, 3, 3, 2}, // 67 .. 0dB -9dB 0dB -21dB .. -30dB {0x037A, -30}, // 67 .. 3 3 3 2 .. 0dB -9dB 0dB -21dB .. -30dB
{2, 6, 3, 6}, // 68 .. -24dB -2dB 0dB -3dB .. -29dB {0x02DE, -29}, // 68 .. 2 6 3 6 .. -24dB -2dB 0dB -3dB .. -29dB
{3, 2, 0, 5}, // 69 .. 0dB -14dB -8dB -6dB .. -28dB {0x0345, -28}, // 69 .. 3 2 0 5 .. 0dB -14dB -8dB -6dB .. -28dB
{3, 5, 0, 3}, // 70 .. 0dB -4dB -8dB -15dB .. -27dB {0x03A3, -27}, // 70 .. 3 5 0 3 .. 0dB -4dB -8dB -15dB .. -27dB
{3, 3, 0, 4}, // 71 .. 0dB -9dB -8dB -9dB .. -26dB {0x0364, -26}, // 71 .. 3 3 0 4 .. 0dB -9dB -8dB -9dB .. -26dB
{3, 1, 1, 7}, // 72 .. 0dB -19dB -6dB 0dB .. -25dB {0x032F, -25}, // 72 .. 3 1 1 7 .. 0dB -19dB -6dB 0dB .. -25dB
{3, 4, 2, 3}, // 73 .. 0dB -6dB -3dB -15dB .. -24dB {0x0393, -24}, // 73 .. 3 4 2 3 .. 0dB -6dB -3dB -15dB .. -24dB
{3, 4, 0, 4}, // 74 .. 0dB -6dB -8dB -9dB .. -23dB {0x0384, -23}, // 74 .. 3 4 0 4 .. 0dB -6dB -8dB -9dB .. -23dB
{3, 2, 0, 7}, // 75 .. 0dB -14dB -8dB 0dB .. -22dB {0x0347, -22}, // 75 .. 3 2 0 7 .. 0dB -14dB -8dB 0dB .. -22dB
{3, 7, 1, 3}, // 76 .. 0dB 0dB -6dB -15dB .. -21dB {0x03EB, -21}, // 76 .. 3 7 1 3 .. 0dB 0dB -6dB -15dB .. -21dB
{3, 6, 2, 3}, // 77 .. 0dB -2dB -3dB -15dB .. -20dB {0x03D3, -20}, // 77 .. 3 6 2 3 .. 0dB -2dB -3dB -15dB .. -20dB
{3, 5, 3, 3}, // 78 .. 0dB -4dB 0dB -15dB .. -19dB {0x03BB, -19}, // 78 .. 3 5 3 3 .. 0dB -4dB 0dB -15dB .. -19dB
{3, 3, 3, 4}, // 79 .. 0dB -9dB 0dB -9dB .. -18dB {0x037C, -18}, // 79 .. 3 3 3 4 .. 0dB -9dB 0dB -9dB .. -18dB
{3, 2, 3, 6}, // 80 .. 0dB -14dB 0dB -3dB .. -17dB original {0x035E, -17}, // 80 .. 3 2 3 6 .. 0dB -14dB 0dB -3dB .. -17dB original
{3, 6, 0, 5}, // 81 .. 0dB -2dB -8dB -6dB .. -16dB {0x03C5, -16}, // 81 .. 3 6 0 5 .. 0dB -2dB -8dB -6dB .. -16dB
{3, 7, 1, 4}, // 82 .. 0dB 0dB -6dB -9dB .. -15dB {0x03EC, -15}, // 82 .. 3 7 1 4 .. 0dB 0dB -6dB -9dB .. -15dB
{3, 2, 3, 7}, // 83 .. 0dB -14dB 0dB 0dB .. -14dB {0x035F, -14}, // 83 .. 3 2 3 7 .. 0dB -14dB 0dB 0dB .. -14dB
{3, 6, 0, 6}, // 84 .. 0dB -2dB -8dB -3dB .. -13dB {0x03C6, -13}, // 84 .. 3 6 0 6 .. 0dB -2dB -8dB -3dB .. -13dB
{3, 3, 2, 7}, // 85 .. 0dB -9dB -3dB 0dB .. -12dB {0x0377, -12}, // 85 .. 3 3 2 7 .. 0dB -9dB -3dB 0dB .. -12dB
{3, 7, 0, 6}, // 86 .. 0dB 0dB -8dB -3dB .. -11dB {0x03E6, -11}, // 86 .. 3 7 0 6 .. 0dB 0dB -8dB -3dB .. -11dB
{3, 5, 3, 5}, // 87 .. 0dB -4dB 0dB -6dB .. -10dB {0x03BD, -10}, // 87 .. 3 5 3 5 .. 0dB -4dB 0dB -6dB .. -10dB
{3, 7, 2, 5}, // 88 .. 0dB 0dB -3dB -6dB .. -9dB {0x03F5, -9}, // 88 .. 3 7 2 5 .. 0dB 0dB -3dB -6dB .. -9dB
{3, 6, 3, 5}, // 89 .. 0dB -2dB 0dB -6dB .. -8dB {0x03DD, -8}, // 89 .. 3 6 3 5 .. 0dB -2dB 0dB -6dB .. -8dB
{3, 5, 2, 7}, // 90 .. 0dB -4dB -3dB 0dB .. -7dB {0x03B7, -7}, // 90 .. 3 5 2 7 .. 0dB -4dB -3dB 0dB .. -7dB
{3, 7, 2, 6}, // 91 .. 0dB 0dB -3dB -3dB .. -6dB {0x03F6, -6}, // 91 .. 3 7 2 6 .. 0dB 0dB -3dB -3dB .. -6dB
{3, 6, 2, 7}, // 92 .. 0dB -2dB -3dB 0dB .. -5dB {0x03D7, -5}, // 92 .. 3 6 2 7 .. 0dB -2dB -3dB 0dB .. -5dB
{3, 5, 3, 7}, // 93 .. 0dB -4dB 0dB 0dB .. -4dB {0x03BF, -4}, // 93 .. 3 5 3 7 .. 0dB -4dB 0dB 0dB .. -4dB
{3, 7, 2, 7}, // 94 .. 0dB 0dB -3dB 0dB .. -3dB {0x03F7, -3}, // 94 .. 3 7 2 7 .. 0dB 0dB -3dB 0dB .. -3dB
{3, 6, 3, 7}, // 95 .. 0dB -2dB 0dB 0dB .. -2dB {0x03DF, -2}, // 95 .. 3 6 3 7 .. 0dB -2dB 0dB 0dB .. -2dB
{3, 7, 3, 7} // 96 .. 0dB 0dB 0dB 0dB .. 0dB {0x03FF, 0} // 96 .. 3 7 3 7 .. 0dB 0dB 0dB 0dB .. 0dB
}; };
const unsigned int original_index = 80; static const unsigned int original_index = 80;
#endif #endif
// total RF gain for each table index #ifdef ENABLE_AM_FIX_SHOW_DATA
int8_t gain_dB[ARRAY_SIZE(gain_table)] = {0}; // display update rate
static const unsigned int display_update_rate = 250 / 10; // max 250ms display update rate
// display update rate unsigned int counter = 0;
const unsigned int display_update_rate = 250 / 10; // max 250ms display update rate #endif
unsigned int counter = 0;
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
// user manually sets the table index .. used to calibrate the desired dB gain table // user manually sets the table index .. used to calibrate the desired dB gain table
@@ -280,13 +262,6 @@ const uint8_t orig_pga = 6; // -3dB
#endif #endif
} }
// pre-compute the total gain for each table index .. saves doing it in real time
for (i = 0; i < ARRAY_SIZE(gain_table); i++)
{
const t_gain_table gains = gain_table[i];
gain_dB[i] = lna_short_dB[gains.lna_short] + lna_dB[gains.lna] + mixer_dB[gains.mixer] + pga_dB[gains.pga];
}
#if 0 #if 0
{ // set a maximum gain to use { // set a maximum gain to use
// const int16_t max_gain_dB = gain_dB[original_index]; // const int16_t max_gain_dB = gain_dB[original_index];
@@ -294,7 +269,8 @@ const uint8_t orig_pga = 6; // -3dB
max_index = ARRAY_SIZE(gain_table); max_index = ARRAY_SIZE(gain_table);
while (--max_index > 1) while (--max_index > 1)
if (gain_dB[max_index] <= max_gain_dB) // if (gain_dB[max_index] <= max_gain_dB)
if (gain_table[max_index].gain_dB <= max_gain_dB)
break; break;
} }
#else #else
@@ -306,7 +282,9 @@ const uint8_t orig_pga = 6; // -3dB
void AM_fix_reset(const int vfo) void AM_fix_reset(const int vfo)
{ // reset the AM fixer upper { // reset the AM fixer upper
counter = 0; #ifdef ENABLE_AM_FIX_SHOW_DATA
counter = 0;
#endif
prev_rssi[vfo] = 0; prev_rssi[vfo] = 0;
@@ -340,7 +318,9 @@ const uint8_t orig_pga = 6; // -3dB
case FUNCTION_TRANSMIT: case FUNCTION_TRANSMIT:
case FUNCTION_BAND_SCOPE: case FUNCTION_BAND_SCOPE:
case FUNCTION_POWER_SAVE: case FUNCTION_POWER_SAVE:
counter = display_update_rate; // queue up a display update as soon as we switch to RX mode #ifdef ENABLE_AM_FIX_SHOW_DATA
counter = display_update_rate; // queue up a display update as soon as we switch to RX mode
#endif
return; return;
// only adjust stuff if we're in one of these modes // only adjust stuff if we're in one of these modes
@@ -351,14 +331,16 @@ const uint8_t orig_pga = 6; // -3dB
break; break;
} }
if (counter > 0) #ifdef ENABLE_AM_FIX_SHOW_DATA
{ if (counter > 0)
if (++counter >= display_update_rate) {
{ // trigger a display update if (++counter >= display_update_rate)
counter = 0; { // trigger a display update
gUpdateDisplay = true; counter = 0;
gUpdateDisplay = true;
}
} }
} #endif
{ // sample the current RSSI level { // sample the current RSSI level
// average it with the previous rssi (a bit of noise/spike immunity) // average it with the previous rssi (a bit of noise/spike immunity)
@@ -367,11 +349,14 @@ const uint8_t orig_pga = 6; // -3dB
prev_rssi[vfo] = new_rssi; prev_rssi[vfo] = new_rssi;
} }
{ // save the corrected RSSI level // save the corrected RSSI level
#ifdef ENABLE_AM_FIX_SHOW_DATA
{
const int16_t new_rssi = rssi - rssi_gain_diff[vfo]; const int16_t new_rssi = rssi - rssi_gain_diff[vfo];
if (gCurrentRSSI[vfo] != new_rssi) if (gCurrentRSSI[vfo] != new_rssi)
{ {
gCurrentRSSI[vfo] = new_rssi; gCurrentRSSI[vfo] = new_rssi;
if (counter == 0) if (counter == 0)
{ // trigger a display update { // trigger a display update
counter = 1; counter = 1;
@@ -379,6 +364,9 @@ const uint8_t orig_pga = 6; // -3dB
} }
} }
} }
#else
gCurrentRSSI[vfo] = rssi - rssi_gain_diff[vfo];
#endif
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
// user is manually adjusting a gain register - don't do anything automatically // user is manually adjusting a gain register - don't do anything automatically
@@ -411,10 +399,12 @@ const uint8_t orig_pga = 6; // -3dB
if (diff_dB >= 10) if (diff_dB >= 10)
{ // jump immediately to a new gain setting { // jump immediately to a new gain setting
// this greatly speeds up initial gain reduction (but reduces noise/spike immunity) // this greatly speeds up initial gain reduction (but reduces noise/spike immunity)
const int16_t desired_gain_dB = (int16_t)gain_dB[index] - diff_dB + 8; // get no closer than 8dB (bit of noise/spike immunity)
const int16_t desired_gain_dB = (int16_t)gain_table[index].gain_dB - diff_dB + 8; // get no closer than 8dB (bit of noise/spike immunity)
// scan the table to see what index to jump straight too // scan the table to see what index to jump straight too
while (index > 1) while (index > 1)
if (gain_dB[--index] <= desired_gain_dB) if (gain_table[--index].gain_dB <= desired_gain_dB)
break; break;
//index = (gain_table_index[vfo] + index) / 2; // easy does it //index = (gain_table_index[vfo] + index) / 2; // easy does it
@@ -449,7 +439,7 @@ const uint8_t orig_pga = 6; // -3dB
#if 0 #if 0
if (gain_table_index[vfo] == gain_table_index_prev[vfo]) if (gain_table_index[vfo] == gain_table_index_prev[vfo])
return; // no gain change return; // no gain change - this is to reduce writing to the BK chip on ever call
#endif #endif
#endif #endif
@@ -461,33 +451,35 @@ const uint8_t orig_pga = 6; // -3dB
// remember the new table index // remember the new table index
gain_table_index_prev[vfo] = index; gain_table_index_prev[vfo] = index;
const t_gain_table gains = gain_table[index]; BK4819_WriteRegister(BK4819_REG_13, gain_table[index].reg_val);
BK4819_WriteRegister(BK4819_REG_13, ((uint16_t)gains.lna_short << 8) | ((uint16_t)gains.lna << 5) | ((uint16_t)gains.mixer << 3) | ((uint16_t)gains.pga << 0));
// offset the RSSI reading to the rest of the firmware to cancel out the gain adjustments we make // offset the RSSI reading to the rest of the firmware to cancel out the gain adjustments we make
// RF gain difference from original QS setting // RF gain difference from original QS setting
rssi_gain_diff[vfo] = ((int16_t)gain_dB[index] - gain_dB[original_index]) * 2; rssi_gain_diff[vfo] = ((int16_t)gain_table[index].gain_dB - gain_table[original_index].gain_dB) * 2;
} }
// save the corrected RSSI level // save the corrected RSSI level
gCurrentRSSI[vfo] = rssi - rssi_gain_diff[vfo]; gCurrentRSSI[vfo] = rssi - rssi_gain_diff[vfo];
if (counter == 0) #ifdef ENABLE_AM_FIX_SHOW_DATA
{ if (counter == 0)
counter = 1; {
gUpdateDisplay = true; counter = 1;
} gUpdateDisplay = true;
}
#endif
} }
#ifdef ENABLE_AM_FIX_SHOW_DATA #ifdef ENABLE_AM_FIX_SHOW_DATA
void AM_fix_print_data(const int vfo, char *s) void AM_fix_print_data(const int vfo, char *s)
{ {
if (s != NULL) if (s != NULL && vfo >= 0 && vfo < (int)ARRAY_SIZE(gain_table_index))
{ {
const unsigned int index = gain_table_index[vfo]; const unsigned int index = gain_table_index[vfo];
sprintf(s, "%2u.%u %4ddB %3u", index, ARRAY_SIZE(gain_table) - 1, gain_dB[index], prev_rssi[vfo]); // sprintf(s, "%2u.%u %4ddB %3u", index, ARRAY_SIZE(gain_table) - 1, gain_table[index].gain_dB, prev_rssi[vfo]);
sprintf(s, "%2u %4ddB %3u", index, gain_table[index].gain_dB, prev_rssi[vfo]);
counter = 0; counter = 0;
} }
} }

View File

@@ -20,11 +20,6 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
extern const uint8_t orig_lna_short;
extern const uint8_t orig_lna;
extern const uint8_t orig_mixer;
extern const uint8_t orig_pga;
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
extern int16_t rssi_gain_diff[2]; extern int16_t rssi_gain_diff[2];

View File

@@ -45,6 +45,7 @@ static void ACTION_FlashLight(void)
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
break; break;
case 1: case 1:
case 2:
gFlashLightState++; gFlashLightState++;
break; break;
default: default:
@@ -84,11 +85,11 @@ void ACTION_Monitor(void)
gMonitor = false; gMonitor = false;
if (gScanState != SCAN_OFF) if (gScanStateDir != SCAN_OFF)
{ {
ScanPauseDelayIn_10ms = scan_pause_delay_in_1_10ms; gScanPauseDelayIn_10ms = scan_pause_delay_in_1_10ms;
gScheduleScanListen = false; gScheduleScanListen = false;
gScanPauseMode = true; gScanPauseMode = true;
} }
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
@@ -109,7 +110,7 @@ void ACTION_Monitor(void)
} }
else else
#endif #endif
gRequestDisplayScreen = gScreenToDisplay; gRequestDisplayScreen = gScreenToDisplay;
} }
void ACTION_Scan(bool bRestart) void ACTION_Scan(bool bRestart)
@@ -182,17 +183,36 @@ void ACTION_Scan(bool bRestart)
{ {
GUI_SelectNextDisplay(DISPLAY_MAIN); GUI_SelectNextDisplay(DISPLAY_MAIN);
if (gScanState != SCAN_OFF) if (gScanStateDir != SCAN_OFF)
{ { // already scanning
SCANNER_Stop();
if (gNextMrChannel <= MR_CHANNEL_LAST)
{ // channel mode
#ifdef ENABLE_VOICE // keep scanning but toggle between scan lists
gAnotherVoiceID = VOICE_ID_SCANNING_STOP; gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3;
#endif
// jump to the next channel
SCANNER_NextChannel(false, gScanStateDir);
gScanPauseDelayIn_10ms = 1;
gScheduleScanListen = false;
gUpdateStatus = true;
}
else
{ // stop scanning
SCANNER_Stop();
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif
}
} }
else else
{ { // start scanning
CHANNEL_Next(true, 1);
SCANNER_NextChannel(true, SCAN_FWD);
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN); AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN);
@@ -200,7 +220,7 @@ void ACTION_Scan(bool bRestart)
#endif #endif
// clear the other vfo's rssi level (to hide the antenna symbol) // clear the other vfo's rssi level (to hide the antenna symbol)
gVFO_RSSI_bar_level[gEeprom.RX_CHANNEL == 0] = 0; gVFO_RSSI_bar_level[(gEeprom.RX_VFO + 1) & 1u] = 0;
// let the user see DW is not active // let the user see DW is not active
gDualWatchActive = false; gDualWatchActive = false;
@@ -209,34 +229,47 @@ void ACTION_Scan(bool bRestart)
} }
} }
else else
if (!bRestart) // if (!bRestart)
{ // scanning if (!bRestart && gNextMrChannel <= MR_CHANNEL_LAST)
{ // channel mode, keep scanning but toggle between scan lists
gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3;
// jump to the next channel
SCANNER_NextChannel(false, gScanStateDir);
gScanPauseDelayIn_10ms = 1;
gScheduleScanListen = false;
gUpdateStatus = true;
}
else
{ // stop scanning
gMonitor = false; gMonitor = false;
SCANNER_Stop(); SCANNER_Stop();
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP; gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif #endif
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
} }
} }
void ACTION_Vox(void) #ifdef ENABLE_VOX
{ void ACTION_Vox(void)
gEeprom.VOX_SWITCH = !gEeprom.VOX_SWITCH; {
gRequestSaveSettings = true; gEeprom.VOX_SWITCH = !gEeprom.VOX_SWITCH;
gFlagReconfigureVfos = true; gRequestSaveSettings = true;
#ifdef ENABLE_VOICE gFlagReconfigureVfos = true;
gAnotherVoiceID = VOICE_ID_VOX; #ifdef ENABLE_VOICE
#endif gAnotherVoiceID = VOICE_ID_VOX;
gUpdateStatus = true; #endif
} gUpdateStatus = true;
}
#endif
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
static void ACTION_AlarmOr1750(bool b1750) static void ACTION_AlarmOr1750(const bool b1750)
{ {
gInputBoxIndex = 0; gInputBoxIndex = 0;
@@ -251,7 +284,9 @@ void ACTION_Vox(void)
#endif #endif
gFlagPrepareTX = true; gFlagPrepareTX = true;
gRequestDisplayScreen = DISPLAY_MAIN;
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
} }
#endif #endif
@@ -266,8 +301,11 @@ void ACTION_Vox(void)
FM_TurnOff(); FM_TurnOff();
gInputBoxIndex = 0; gInputBoxIndex = 0;
gVoxResumeCountdown = 80; #ifdef ENABLE_VOX
gVoxResumeCountdown = 80;
#endif
gFlagReconfigureVfos = true; gFlagReconfigureVfos = true;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
return; return;
} }
@@ -279,7 +317,8 @@ void ACTION_Vox(void)
FM_Start(); FM_Start();
gInputBoxIndex = 0; gInputBoxIndex = 0;
gRequestDisplayScreen = DISPLAY_FM; gRequestDisplayScreen = DISPLAY_FM;
} }
} }
@@ -287,18 +326,16 @@ void ACTION_Vox(void)
void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
uint8_t Short = ACTION_OPT_NONE; if (gScreenToDisplay == DISPLAY_MAIN && gDTMF_InputMode) // entering DTMF code
uint8_t Long = ACTION_OPT_NONE;
if (gScreenToDisplay == DISPLAY_MAIN && gDTMF_InputMode)
{ {
if (Key == KEY_SIDE1 && !bKeyHeld && bKeyPressed) if (Key == KEY_SIDE1 && !bKeyHeld && bKeyPressed) // side1 btn pressed
{ {
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (gDTMF_InputIndex > 0)
if (gDTMF_InputBox_Index > 0) // DTMF codes are in the input box
{ {
gDTMF_InputBox[--gDTMF_InputIndex] = '-'; gDTMF_InputBox[--gDTMF_InputBox_Index] = '-'; // delete one code
if (gDTMF_InputIndex > 0) if (gDTMF_InputBox_Index > 0)
{ {
gPttWasReleased = true; gPttWasReleased = true;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
@@ -311,43 +348,47 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
#endif #endif
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
gDTMF_InputMode = false; gDTMF_InputMode = false; // turn off DTMF input box if no codes left
} }
gPttWasReleased = true; gPttWasReleased = true;
return; return;
} }
uint8_t funcShort = ACTION_OPT_NONE;
uint8_t funcLong = ACTION_OPT_NONE;
if (Key == KEY_SIDE1) if (Key == KEY_SIDE1)
{ {
Short = gEeprom.KEY_1_SHORT_PRESS_ACTION; funcShort = gEeprom.KEY_1_SHORT_PRESS_ACTION;
Long = gEeprom.KEY_1_LONG_PRESS_ACTION; funcLong = gEeprom.KEY_1_LONG_PRESS_ACTION;
} }
else else if (Key == KEY_SIDE2)
if (Key == KEY_SIDE2)
{ {
Short = gEeprom.KEY_2_SHORT_PRESS_ACTION; funcShort = gEeprom.KEY_2_SHORT_PRESS_ACTION;
Long = gEeprom.KEY_2_LONG_PRESS_ACTION; funcLong = gEeprom.KEY_2_LONG_PRESS_ACTION;
} }
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed) // button pushed
{ {
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return; return;
} }
if (bKeyHeld || bKeyPressed) // held or released beyond this point
if (bKeyHeld || bKeyPressed) // held
{ {
if (!bKeyHeld) funcShort = funcLong;
return;
Short = Long; if (!bKeyPressed) //ignore release if held
if (!bKeyPressed)
return; return;
} }
switch (Short) // held or released after short press beyond this point
switch (funcShort)
{ {
default: default:
case ACTION_OPT_NONE: case ACTION_OPT_NONE:
@@ -365,7 +406,9 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
ACTION_Scan(true); ACTION_Scan(true);
break; break;
case ACTION_OPT_VOX: case ACTION_OPT_VOX:
ACTION_Vox(); #ifdef ENABLE_VOX
ACTION_Vox();
#endif
break; break;
case ACTION_OPT_ALARM: case ACTION_OPT_ALARM:
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM

View File

@@ -22,8 +22,10 @@
//static void ACTION_FlashLight(void) //static void ACTION_FlashLight(void)
void ACTION_Power(void); void ACTION_Power(void);
void ACTION_Monitor(void); void ACTION_Monitor(void);
void ACTION_Scan(bool bFlag); void ACTION_Scan(bool bRestart);
void ACTION_Vox(void); #ifdef ENABLE_VOX
void ACTION_Vox(void);
#endif
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
//static void ACTION_AlarmOr1750(bool b1750) //static void ACTION_AlarmOr1750(bool b1750)
#endif #endif

1376
app/app.c

File diff suppressed because it is too large Load Diff

View File

@@ -23,8 +23,12 @@
#include "frequencies.h" #include "frequencies.h"
#include "radio.h" #include "radio.h"
extern const uint8_t orig_lna_short;
extern const uint8_t orig_lna;
extern const uint8_t orig_mixer;
extern const uint8_t orig_pga;
void APP_EndTransmission(void); void APP_EndTransmission(void);
void CHANNEL_Next(bool bFlag, int8_t Direction);
void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix); void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix);
uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step); uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step);
void APP_Update(void); void APP_Update(void);

View File

@@ -36,9 +36,9 @@
char gDTMF_String[15]; char gDTMF_String[15];
char gDTMF_InputBox[15]; char gDTMF_InputBox[15];
uint8_t gDTMF_InputIndex = 0; uint8_t gDTMF_InputBox_Index = 0;
bool gDTMF_InputMode = false; bool gDTMF_InputMode = false;
uint8_t gDTMF_PreviousIndex = 0; uint8_t gDTMF_PreviousIndex = 0;
char gDTMF_RX[17]; char gDTMF_RX[17];
uint8_t gDTMF_RX_index = 0; uint8_t gDTMF_RX_index = 0;
@@ -54,8 +54,8 @@ char gDTMF_Caller[4];
char gDTMF_Callee[4]; char gDTMF_Callee[4];
DTMF_State_t gDTMF_State; DTMF_State_t gDTMF_State;
uint8_t gDTMF_DecodeRingCountdown_500ms; uint8_t gDTMF_DecodeRingCountdown_500ms;
uint8_t gDTMFChosenContact; uint8_t gDTMF_chosen_contact;
uint8_t gDTMF_AUTO_RESET_TIME; uint8_t gDTMF_auto_reset_time_500ms;
DTMF_CallState_t gDTMF_CallState; DTMF_CallState_t gDTMF_CallState;
DTMF_ReplyState_t gDTMF_ReplyState; DTMF_ReplyState_t gDTMF_ReplyState;
DTMF_CallMode_t gDTMF_CallMode; DTMF_CallMode_t gDTMF_CallMode;
@@ -133,8 +133,26 @@ bool DTMF_FindContact(const char *pContact, char *pResult)
char DTMF_GetCharacter(const unsigned int code) char DTMF_GetCharacter(const unsigned int code)
{ {
const char list[] = "0123456789ABCD*#"; switch (code)
return (code < ARRAY_SIZE(list)) ? list[code] : 0xFF; {
case KEY_0: return '0';
case KEY_1: return '1';
case KEY_2: return '2';
case KEY_3: return '3';
case KEY_4: return '4';
case KEY_5: return '5';
case KEY_6: return '6';
case KEY_7: return '7';
case KEY_8: return '8';
case KEY_9: return '9';
case KEY_MENU: return 'A';
case KEY_UP: return 'B';
case KEY_DOWN: return 'C';
case KEY_EXIT: return 'D';
case KEY_STAR: return '*';
case KEY_F: return '#';
default: return 0xff;
}
} }
bool DTMF_CompareMessage(const char *pMsg, const char *pTemplate, const unsigned int size, const bool bCheckGroup) bool DTMF_CompareMessage(const char *pMsg, const char *pTemplate, const unsigned int size, const bool bCheckGroup)
@@ -163,16 +181,23 @@ DTMF_CallMode_t DTMF_CheckGroupCall(const char *pMsg, const unsigned int size)
return (i < size) ? DTMF_CALL_MODE_GROUP : DTMF_CALL_MODE_NOT_GROUP; return (i < size) ? DTMF_CALL_MODE_GROUP : DTMF_CALL_MODE_NOT_GROUP;
} }
void DTMF_clear_input_box(void)
{
memset(gDTMF_InputBox, 0, sizeof(gDTMF_InputBox));
gDTMF_InputBox_Index = 0;
gDTMF_InputMode = false;
}
void DTMF_Append(const char code) void DTMF_Append(const char code)
{ {
if (gDTMF_InputIndex == 0) if (gDTMF_InputBox_Index == 0)
{ {
memset(gDTMF_InputBox, '-', sizeof(gDTMF_InputBox)); memset(gDTMF_InputBox, '-', sizeof(gDTMF_InputBox) - 1);
gDTMF_InputBox[sizeof(gDTMF_InputBox) - 1] = 0; gDTMF_InputBox[sizeof(gDTMF_InputBox) - 1] = 0;
} }
if (gDTMF_InputIndex < sizeof(gDTMF_InputBox)) if (gDTMF_InputBox_Index < (sizeof(gDTMF_InputBox) - 1))
gDTMF_InputBox[gDTMF_InputIndex++] = code; gDTMF_InputBox[gDTMF_InputBox_Index++] = code;
} }
void DTMF_HandleRequest(void) void DTMF_HandleRequest(void)
@@ -184,7 +209,7 @@ void DTMF_HandleRequest(void)
if (!gDTMF_RX_pending) if (!gDTMF_RX_pending)
return; // nothing new received return; // nothing new received
if (gScanState != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF) if (gScanStateDir != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF)
{ // we're busy scanning { // we're busy scanning
DTMF_clear_RX(); DTMF_clear_RX();
return; return;
@@ -335,6 +360,7 @@ void DTMF_HandleRequest(void)
{ {
case DTMF_DEC_RESPONSE_BOTH: case DTMF_DEC_RESPONSE_BOTH:
gDTMF_DecodeRingCountdown_500ms = DTMF_decode_ring_countdown_500ms; gDTMF_DecodeRingCountdown_500ms = DTMF_decode_ring_countdown_500ms;
[[fallthrough]];
case DTMF_DEC_RESPONSE_REPLY: case DTMF_DEC_RESPONSE_REPLY:
gDTMF_ReplyState = DTMF_REPLY_AAAAA; gDTMF_ReplyState = DTMF_REPLY_AAAAA;
break; break;
@@ -385,8 +411,9 @@ void DTMF_Reply(void)
default: default:
case DTMF_REPLY_NONE: case DTMF_REPLY_NONE:
if (gDTMF_CallState != DTMF_CALL_STATE_NONE || if (gDTMF_CallState != DTMF_CALL_STATE_NONE ||
gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_OFF || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO ||
gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_OFF ||
gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN) gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN)
{ {
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
@@ -403,13 +430,12 @@ void DTMF_Reply(void)
if (pString == NULL) if (pString == NULL)
return; return;
Delay = gEeprom.DTMF_PRELOAD_TIME; Delay = (gEeprom.DTMF_PRELOAD_TIME < 200) ? 200 : gEeprom.DTMF_PRELOAD_TIME;
if (gEeprom.DTMF_SIDE_TONE) if (gEeprom.DTMF_SIDE_TONE)
{ // the will also hear the transmitted tones { // the user will also hear the transmitted tones
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gEnableSpeaker = true; gEnableSpeaker = true;
Delay = (gEeprom.DTMF_PRELOAD_TIME < 60) ? 60 : gEeprom.DTMF_PRELOAD_TIME;
} }
SYSTEM_DelayMs(Delay); SYSTEM_DelayMs(Delay);

View File

@@ -33,7 +33,8 @@ typedef enum DTMF_State_t DTMF_State_t;
enum DTMF_CallState_t { enum DTMF_CallState_t {
DTMF_CALL_STATE_NONE = 0, DTMF_CALL_STATE_NONE = 0,
DTMF_CALL_STATE_CALL_OUT, DTMF_CALL_STATE_CALL_OUT,
DTMF_CALL_STATE_RECEIVED DTMF_CALL_STATE_RECEIVED,
DTMF_CALL_STATE_RECEIVED_STAY
}; };
enum DTMF_DecodeResponse_t { enum DTMF_DecodeResponse_t {
@@ -60,12 +61,17 @@ enum DTMF_CallMode_t {
DTMF_CALL_MODE_DTMF DTMF_CALL_MODE_DTMF
}; };
enum { // seconds
DTMF_HOLD_MIN = 5,
DTMF_HOLD_MAX = 60
};
typedef enum DTMF_CallMode_t DTMF_CallMode_t; typedef enum DTMF_CallMode_t DTMF_CallMode_t;
extern char gDTMF_String[15]; extern char gDTMF_String[15];
extern char gDTMF_InputBox[15]; extern char gDTMF_InputBox[15];
extern uint8_t gDTMF_InputIndex; extern uint8_t gDTMF_InputBox_Index;
extern bool gDTMF_InputMode; extern bool gDTMF_InputMode;
extern uint8_t gDTMF_PreviousIndex; extern uint8_t gDTMF_PreviousIndex;
@@ -83,8 +89,8 @@ extern char gDTMF_Caller[4];
extern char gDTMF_Callee[4]; extern char gDTMF_Callee[4];
extern DTMF_State_t gDTMF_State; extern DTMF_State_t gDTMF_State;
extern uint8_t gDTMF_DecodeRingCountdown_500ms; extern uint8_t gDTMF_DecodeRingCountdown_500ms;
extern uint8_t gDTMFChosenContact; extern uint8_t gDTMF_chosen_contact;
extern uint8_t gDTMF_AUTO_RESET_TIME; extern uint8_t gDTMF_auto_reset_time_500ms;
extern DTMF_CallState_t gDTMF_CallState; extern DTMF_CallState_t gDTMF_CallState;
extern DTMF_ReplyState_t gDTMF_ReplyState; extern DTMF_ReplyState_t gDTMF_ReplyState;
extern DTMF_CallMode_t gDTMF_CallMode; extern DTMF_CallMode_t gDTMF_CallMode;
@@ -98,6 +104,7 @@ bool DTMF_FindContact(const char *pContact, char *pResult);
char DTMF_GetCharacter(const unsigned int code); char DTMF_GetCharacter(const unsigned int code);
bool DTMF_CompareMessage(const char *pDTMF, const char *pTemplate, const unsigned int size, const bool bFlag); bool DTMF_CompareMessage(const char *pDTMF, const char *pTemplate, const unsigned int size, const bool bFlag);
DTMF_CallMode_t DTMF_CheckGroupCall(const char *pDTMF, const unsigned int size); DTMF_CallMode_t DTMF_CheckGroupCall(const char *pDTMF, const unsigned int size);
void DTMF_clear_input_box(void);
void DTMF_Append(const char vode); void DTMF_Append(const char vode);
void DTMF_HandleRequest(void); void DTMF_HandleRequest(void);
void DTMF_Reply(void); void DTMF_Reply(void);

View File

@@ -45,7 +45,6 @@ bool gFM_AutoScan;
uint8_t gFM_ChannelPosition; uint8_t gFM_ChannelPosition;
bool gFM_FoundFrequency; bool gFM_FoundFrequency;
bool gFM_AutoScan; bool gFM_AutoScan;
uint8_t gFM_ResumeCountdown_500ms;
uint16_t gFM_RestoreCountdown_10ms; uint16_t gFM_RestoreCountdown_10ms;
bool FM_CheckValidChannel(uint8_t Channel) bool FM_CheckValidChannel(uint8_t Channel)

View File

@@ -39,7 +39,6 @@ extern uint8_t gFM_ChannelPosition;
extern uint16_t gFM_FrequencyDeviation; extern uint16_t gFM_FrequencyDeviation;
extern bool gFM_FoundFrequency; extern bool gFM_FoundFrequency;
extern bool gFM_AutoScan; extern bool gFM_AutoScan;
extern uint8_t gFM_ResumeCountdown_500ms;
extern uint16_t gFM_RestoreCountdown_10ms; extern uint16_t gFM_RestoreCountdown_10ms;
bool FM_CheckValidChannel(uint8_t Channel); bool FM_CheckValidChannel(uint8_t Channel);

View File

@@ -37,29 +37,35 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld)
{ {
if (gInputBoxIndex > 0) if (gInputBoxIndex > 0)
{ {
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed) // short pressed
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return; return;
} }
if (bKeyHeld || !bKeyPressed) if (bKeyHeld || !bKeyPressed) // held or released
{ {
if (bKeyHeld || bKeyPressed) if (bKeyHeld || bKeyPressed) // held or pressed (cannot be held and not pressed I guess, so it checks only if HELD?)
{ {
if (!bKeyHeld) if (!bKeyHeld) // won't ever pass
return; return;
if (!bKeyPressed) if (!bKeyPressed) // won't ever pass
return; return;
#ifdef ENABLE_VOICE if (gScreenToDisplay != DISPLAY_MENU &&
gAnotherVoiceID = gEeprom.KEY_LOCK ? VOICE_ID_UNLOCK : VOICE_ID_LOCK; gCurrentFunction != FUNCTION_TRANSMIT)
#endif { // toggle the keyboad lock
gEeprom.KEY_LOCK = !gEeprom.KEY_LOCK; #ifdef ENABLE_VOICE
gRequestSaveSettings = true; gAnotherVoiceID = gEeprom.KEY_LOCK ? VOICE_ID_UNLOCK : VOICE_ID_LOCK;
#endif
gEeprom.KEY_LOCK = !gEeprom.KEY_LOCK;
gRequestSaveSettings = true;
}
} }
else else // released
{ {
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if ((gFmRadioMode || gScreenToDisplay != DISPLAY_MAIN) && gScreenToDisplay != DISPLAY_FM) if ((gFmRadioMode || gScreenToDisplay != DISPLAY_MAIN) && gScreenToDisplay != DISPLAY_FM)
@@ -69,7 +75,10 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld)
return; return;
#endif #endif
gWasFKeyPressed = !gWasFKeyPressed; gWasFKeyPressed = !gWasFKeyPressed; // toggle F function
if (gWasFKeyPressed)
gKeyInputCountdown = key_input_timeout_500ms;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
if (!gWasFKeyPressed) if (!gWasFKeyPressed)
@@ -79,16 +88,16 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld)
gUpdateStatus = true; gUpdateStatus = true;
} }
} }
else else // short pressed
{ {
if (gScreenToDisplay != DISPLAY_FM) if (gScreenToDisplay != DISPLAY_FM)
{ {
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return; return;
} }
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFM_ScanState == FM_SCAN_OFF) if (gFM_ScanState == FM_SCAN_OFF) // not scanning
{ {
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return; return;
@@ -96,6 +105,7 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld)
#endif #endif
gBeepToPlay = BEEP_440HZ_500MS; gBeepToPlay = BEEP_440HZ_500MS;
gPttWasReleased = true; gPttWasReleased = true;
} }
} }
@@ -104,154 +114,153 @@ void GENERIC_Key_PTT(bool bKeyPressed)
{ {
gInputBoxIndex = 0; gInputBoxIndex = 0;
if (!bKeyPressed) if (!bKeyPressed || gSerialConfigCountDown_500ms > 0)
{ { // PTT released
if (gScreenToDisplay == DISPLAY_MAIN) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ { // we are transmitting .. stop
if (gCurrentFunction == FUNCTION_TRANSMIT)
if (gFlagEndTransmission)
{ {
if (gFlagEndTransmission) FUNCTION_Select(FUNCTION_FOREGROUND);
{
FUNCTION_Select(FUNCTION_FOREGROUND);
}
else
{
APP_EndTransmission();
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0)
{
FUNCTION_Select(FUNCTION_FOREGROUND);
}
else
gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10;
}
gFlagEndTransmission = false;
gVOX_NoiseDetected = false;
} }
else
{
APP_EndTransmission();
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0)
FUNCTION_Select(FUNCTION_FOREGROUND);
else
gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10;
}
gFlagEndTransmission = false;
#ifdef ENABLE_VOX
gVOX_NoiseDetected = false;
#endif
RADIO_SetVfoState(VFO_STATE_NORMAL); RADIO_SetVfoState(VFO_STATE_NORMAL);
// beep when you release the PTT if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
//gBeepToPlay = BEEP_880HZ_40MS_OPTIONAL; // 1of11 gRequestDisplayScreen = DISPLAY_MAIN;
gRequestDisplayScreen = DISPLAY_MAIN;
return;
} }
gInputBoxIndex = 0;
return; return;
} }
if (gScanState != SCAN_OFF) // PTT pressed
{
SCANNER_Stop();
gPttDebounceCounter = 0; if (gScanStateDir != SCAN_OFF || // frequency/channel scanning
gPttIsPressed = false; gScreenToDisplay == DISPLAY_SCANNER || // CTCSS/CDCSS scanning
gRequestDisplayScreen = DISPLAY_MAIN; gCssScanMode != CSS_SCAN_MODE_OFF) // " "
return; { // we're scanning .. stop
}
#ifdef ENABLE_FMRADIO if (gScreenToDisplay == DISPLAY_SCANNER)
if (gFM_ScanState == FM_SCAN_OFF) { // CTCSS/CDCSS scanning .. stop
#endif gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX;
{
if (gCssScanMode == CSS_SCAN_MODE_OFF)
{
#ifdef ENABLE_FMRADIO
if (gScreenToDisplay == DISPLAY_MENU || gScreenToDisplay == DISPLAY_FM)
#else
if (gScreenToDisplay == DISPLAY_MENU)
#endif
{
gRequestDisplayScreen = DISPLAY_MAIN;
gInputBoxIndex = 0;
gPttIsPressed = false;
gPttDebounceCounter = 0;
return;
}
if (gScreenToDisplay != DISPLAY_SCANNER)
{
if (gCurrentFunction == FUNCTION_TRANSMIT && gRTTECountdown == 0)
{
gInputBoxIndex = 0;
return;
}
gFlagPrepareTX = true;
if (gDTMF_InputMode)
{
if (gDTMF_InputIndex > 0 || gDTMF_PreviousIndex > 0)
{
if (gDTMF_InputIndex == 0)
gDTMF_InputIndex = gDTMF_PreviousIndex;
gDTMF_InputBox[gDTMF_InputIndex] = 0;
#if 0
// append our DTMF ID to the inputted DTMF code -
// IF the user inputted code is exactly 3 digits long
if (gDTMF_InputIndex == 3)
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
else
#else
// append our DTMF ID to the inputted DTMF code -
// IF the user inputted code is exactly 3 digits long and D-DCD is enabled
if (gDTMF_InputIndex == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0)
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
else
#endif
gDTMF_CallMode = DTMF_CALL_MODE_DTMF;
strcpy(gDTMF_String, gDTMF_InputBox);
gDTMF_PreviousIndex = gDTMF_InputIndex;
gDTMF_ReplyState = DTMF_REPLY_ANI;
gDTMF_State = DTMF_STATE_0;
}
gRequestDisplayScreen = DISPLAY_MAIN;
gDTMF_InputMode = false;
gDTMF_InputIndex = 0;
return;
}
gRequestDisplayScreen = DISPLAY_MAIN;
gFlagPrepareTX = true;
gInputBoxIndex = 0;
return;
}
gRequestDisplayScreen = DISPLAY_MAIN;
gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX;
gUpdateStatus = true;
gFlagStopScan = true; gFlagStopScan = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
gFlagResetVfos = true; gFlagResetVfos = true;
} }
else else
{ if (gScanStateDir != SCAN_OFF)
MENU_StopCssScan(); { // frequency/channel scanning . .stop
gRequestDisplayScreen = DISPLAY_MENU; SCANNER_Stop();
} }
}
#ifdef ENABLE_FMRADIO
else else
{ if (gCssScanMode != CSS_SCAN_MODE_OFF)
FM_PlayAndUpdate(); { // CTCSS/CDCSS scanning .. stop
gRequestDisplayScreen = DISPLAY_FM; MENU_StopCssScan();
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif
} }
#endif
goto cancel_tx;
}
#ifdef ENABLE_FMRADIO
if (gFM_ScanState != FM_SCAN_OFF)
{ // FM radio is scanning .. stop
FM_PlayAndUpdate();
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif
gRequestDisplayScreen = DISPLAY_FM;
goto cancel_tx;
}
#endif
#ifdef ENABLE_FMRADIO
if (gScreenToDisplay == DISPLAY_FM)
goto start_tx; // listening to the FM radio .. start TX'ing
#endif
if (gCurrentFunction == FUNCTION_TRANSMIT && gRTTECountdown == 0)
{ // already transmitting
gInputBoxIndex = 0;
return;
}
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
if (!gDTMF_InputMode && gDTMF_InputBox_Index == 0)
goto start_tx; // wasn't entering a DTMF code .. start TX'ing (maybe)
// was entering a DTMF string
if (gDTMF_InputBox_Index > 0 || gDTMF_PreviousIndex > 0)
{ // going to transmit a DTMF string
if (gDTMF_InputBox_Index == 0 && gDTMF_PreviousIndex > 0)
gDTMF_InputBox_Index = gDTMF_PreviousIndex; // use the previous DTMF string
if (gDTMF_InputBox_Index < sizeof(gDTMF_InputBox))
gDTMF_InputBox[gDTMF_InputBox_Index] = 0; // NULL term the string
#if 0
// append our DTMF ID to the inputted DTMF code -
// IF the user inputted code is exactly 3 digits long
if (gDTMF_InputBox_Index == 3)
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
else
gDTMF_CallMode = DTMF_CALL_MODE_DTMF;
#else
// append our DTMF ID to the inputted DTMF code -
// IF the user inputted code is exactly 3 digits long and D-DCD is enabled
if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0)
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
else
gDTMF_CallMode = DTMF_CALL_MODE_DTMF;
#endif
// remember the DTMF string
gDTMF_PreviousIndex = gDTMF_InputBox_Index;
strcpy(gDTMF_String, gDTMF_InputBox);
gDTMF_ReplyState = DTMF_REPLY_ANI;
gDTMF_State = DTMF_STATE_0;
}
DTMF_clear_input_box();
start_tx:
// request start TX
gFlagPrepareTX = true;
goto done;
#ifdef ENABLE_VOICE cancel_tx:
gAnotherVoiceID = VOICE_ID_SCANNING_STOP; if (gPttIsPressed)
#endif {
gPttWasPressed = true;
}
gPttWasPressed = true; done:
gPttDebounceCounter = 0;
if (gScreenToDisplay != DISPLAY_MENU && gRequestDisplayScreen != DISPLAY_FM) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
gUpdateStatus = true;
gUpdateDisplay = true;
} }

View File

@@ -28,6 +28,7 @@
#include "app/spectrum.h" #include "app/spectrum.h"
#endif #endif
#include "audio.h" #include "audio.h"
#include "board.h"
#include "driver/bk4819.h" #include "driver/bk4819.h"
#include "dtmf.h" #include "dtmf.h"
#include "frequencies.h" #include "frequencies.h"
@@ -36,11 +37,51 @@
#include "settings.h" #include "settings.h"
#include "ui/inputbox.h" #include "ui/inputbox.h"
#include "ui/ui.h" #include "ui/ui.h"
#ifdef ENABLE_SPECTRUM
// #include "app/spectrum.h"
#endif
void toggle_chan_scanlist(void)
{ // toggle the selected channels scanlist setting
if (gScreenToDisplay == DISPLAY_SCANNER || !IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE))
return;
if (gTxVfo->SCANLIST1_PARTICIPATION)
{
if (gTxVfo->SCANLIST2_PARTICIPATION)
gTxVfo->SCANLIST1_PARTICIPATION = 0;
else
gTxVfo->SCANLIST2_PARTICIPATION = 1;
}
else
{
if (gTxVfo->SCANLIST2_PARTICIPATION)
gTxVfo->SCANLIST2_PARTICIPATION = 0;
else
gTxVfo->SCANLIST1_PARTICIPATION = 1;
}
SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true);
gVfoConfigureMode = VFO_CONFIGURE;
gFlagResetVfos = true;
}
static void processFKeyFunction(const KEY_Code_t Key, const bool beep) static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
{ {
uint8_t Band; uint8_t Band;
uint8_t Vfo = gEeprom.TX_CHANNEL; uint8_t Vfo = gEeprom.TX_VFO;
if (gScreenToDisplay == DISPLAY_MENU)
{
// if (beep)
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return;
}
// if (beep)
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
switch (Key) switch (Key)
{ {
@@ -50,7 +91,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
#else #else
// TODO: do something useful with the key // TODO: make use of this function key
#endif #endif
@@ -80,6 +121,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
gRequestSaveVFO = true; gRequestSaveVFO = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
if (beep) if (beep)
@@ -88,22 +130,16 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
break; break;
case KEY_2: case KEY_2:
if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_A) gEeprom.TX_VFO ^= 1;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_CHAN_B;
else if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF)
if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_B) gEeprom.CROSS_BAND_RX_TX = gEeprom.TX_VFO + 1;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_CHAN_A; if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF)
else gEeprom.DUAL_WATCH = gEeprom.TX_VFO + 1;
if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_A)
gEeprom.DUAL_WATCH = DUAL_WATCH_CHAN_B;
else
if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_B)
gEeprom.DUAL_WATCH = DUAL_WATCH_CHAN_A;
else
gEeprom.TX_CHANNEL = (Vfo == 0);
gRequestSaveSettings = 1; gRequestSaveSettings = 1;
gFlagReconfigureVfos = true; gFlagReconfigureVfos = true;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
if (beep) if (beep)
@@ -121,8 +157,8 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
uint8_t Channel; uint8_t Channel;
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ { // swap to frequency mode
gEeprom.ScreenChannel[Vfo] = gEeprom.FreqChannel[gEeprom.TX_CHANNEL]; gEeprom.ScreenChannel[Vfo] = gEeprom.FreqChannel[gEeprom.TX_VFO];
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_FREQUENCY_MODE; gAnotherVoiceID = VOICE_ID_FREQUENCY_MODE;
#endif #endif
@@ -131,9 +167,9 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
break; break;
} }
Channel = RADIO_FindNextChannel(gEeprom.MrChannel[gEeprom.TX_CHANNEL], 1, false, 0); Channel = RADIO_FindNextChannel(gEeprom.MrChannel[gEeprom.TX_VFO], 1, false, 0);
if (Channel != 0xFF) if (Channel != 0xFF)
{ { // swap to channel mode
gEeprom.ScreenChannel[Vfo] = Channel; gEeprom.ScreenChannel[Vfo] = Channel;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE); AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE);
@@ -155,7 +191,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
gWasFKeyPressed = false; gWasFKeyPressed = false;
gFlagStartScan = true; gFlagStartScan = true;
gScanSingleFrequency = false; gScanSingleFrequency = false;
gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; gBackup_CROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
gUpdateStatus = true; gUpdateStatus = true;
@@ -165,46 +201,33 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
break; break;
case KEY_5: case KEY_5:
#ifdef ENABLE_NOAA if(beep) {
#ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ {
gEeprom.ScreenChannel[Vfo] = gEeprom.NoaaChannel[gEeprom.TX_CHANNEL]; gEeprom.ScreenChannel[Vfo] = gEeprom.NoaaChannel[gEeprom.TX_VFO];
} }
else else
{ {
gEeprom.ScreenChannel[Vfo] = gEeprom.FreqChannel[gEeprom.TX_CHANNEL]; gEeprom.ScreenChannel[Vfo] = gEeprom.FreqChannel[gEeprom.TX_VFO];
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_FREQUENCY_MODE; gAnotherVoiceID = VOICE_ID_FREQUENCY_MODE;
#endif #endif
} }
gRequestSaveVFO = true; gRequestSaveVFO = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
#elif defined(ENABLE_SPECTRUM) #elif defined(ENABLE_SPECTRUM)
APP_RunSpectrum(); APP_RunSpectrum();
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
#else #endif
// toggle scanlist-1 and scanlist 2 }
if (gScreenToDisplay != DISPLAY_SCANNER) else {
{ #ifdef ENABLE_VOX
if (gTxVfo->SCANLIST1_PARTICIPATION) toggle_chan_scanlist();
{ #endif
if (gTxVfo->SCANLIST2_PARTICIPATION) }
gTxVfo->SCANLIST1_PARTICIPATION = 0;
else
gTxVfo->SCANLIST2_PARTICIPATION = 1;
}
else
{
if (gTxVfo->SCANLIST2_PARTICIPATION)
gTxVfo->SCANLIST2_PARTICIPATION = 0;
else
gTxVfo->SCANLIST1_PARTICIPATION = 1;
}
SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true);
gVfoConfigureMode = VFO_CONFIGURE;
gFlagResetVfos = true;
}
#endif
break; break;
case KEY_6: case KEY_6:
@@ -212,7 +235,11 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
break; break;
case KEY_7: case KEY_7:
#ifdef ENABLE_VOX
ACTION_Vox(); ACTION_Vox();
#else
toggle_chan_scanlist();
#endif
break; break;
case KEY_8: case KEY_8:
@@ -225,11 +252,11 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
{ {
gEeprom.MrChannel[Vfo] = gEeprom.CHAN_1_CALL; gEeprom.MrChannel[Vfo] = gEeprom.CHAN_1_CALL;
gEeprom.ScreenChannel[Vfo] = gEeprom.CHAN_1_CALL; gEeprom.ScreenChannel[Vfo] = gEeprom.CHAN_1_CALL;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE); AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE);
AUDIO_SetDigitVoice(1, gEeprom.CHAN_1_CALL + 1); AUDIO_SetDigitVoice(1, gEeprom.CHAN_1_CALL + 1);
gAnotherVoiceID = (VOICE_ID_t)0xFE; gAnotherVoiceID = (VOICE_ID_t)0xFE;
#endif #endif
gRequestSaveVFO = true; gRequestSaveVFO = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
break; break;
@@ -254,45 +281,36 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
if (bKeyHeld) if (bKeyHeld)
{ // key held down { // key held down
#ifdef ENABLE_MAIN_KEY_HOLD if (bKeyPressed)
if (bKeyPressed) {
if (gScreenToDisplay == DISPLAY_MAIN)
{ {
if (gScreenToDisplay == DISPLAY_MAIN) if (gInputBoxIndex > 0)
{ { // delete any inputted chars
if (gInputBoxIndex > 0) gInputBoxIndex = 0;
{ // delete any inputted chars gRequestDisplayScreen = DISPLAY_MAIN;
gInputBoxIndex = 0;
gRequestDisplayScreen = DISPLAY_MAIN;
}
gWasFKeyPressed = false;
gUpdateStatus = true;
processFKeyFunction(Key, false);
} }
gWasFKeyPressed = false;
gUpdateStatus = true;
processFKeyFunction(Key, false);
} }
#endif }
return; return;
} }
#ifdef ENABLE_MAIN_KEY_HOLD if (bKeyPressed)
if (bKeyPressed) { // key is pressed
{ // key is pressed gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; // beep when key is pressed
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; // beep when key is pressed return; // don't use the key till it's released
return; // don't use the key till it's released }
}
#else
if (!bKeyPressed)
return;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
#endif
if (!gWasFKeyPressed) if (!gWasFKeyPressed)
{ // F-key wasn't pressed { // F-key wasn't pressed
const uint8_t Vfo = gEeprom.TX_CHANNEL; const uint8_t Vfo = gEeprom.TX_VFO;
gKeyInputCountdown = key_input_timeout_500ms; gKeyInputCountdown = key_input_timeout_500ms;
@@ -302,7 +320,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ // user is entering channel number { // user is entering channel number
uint16_t Channel; uint16_t Channel;
if (gInputBoxIndex != 3) if (gInputBoxIndex != 3)
@@ -340,8 +358,8 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
// if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) // if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
// #endif // #endif
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ // user is entering frequency { // user is entering a frequency
uint32_t Frequency; uint32_t Frequency;
if (gInputBoxIndex < 6) if (gInputBoxIndex < 6)
@@ -373,7 +391,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
Frequency = frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper; Frequency = frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper;
} }
{ {
const FREQUENCY_Band_t band = FREQUENCY_GetBand(Frequency); const FREQUENCY_Band_t band = FREQUENCY_GetBand(Frequency);
@@ -386,35 +404,35 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gTxVfo->Band = band; gTxVfo->Band = band;
gEeprom.ScreenChannel[Vfo] = band + FREQ_CHANNEL_FIRST; gEeprom.ScreenChannel[Vfo] = band + FREQ_CHANNEL_FIRST;
gEeprom.FreqChannel[Vfo] = band + FREQ_CHANNEL_FIRST; gEeprom.FreqChannel[Vfo] = band + FREQ_CHANNEL_FIRST;
SETTINGS_SaveVfoIndices(); SETTINGS_SaveVfoIndices();
RADIO_ConfigureChannel(Vfo, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(Vfo, VFO_CONFIGURE_RELOAD);
} }
// Frequency += 75; // is this meant to be rounding ? // Frequency += 75; // is this meant to be rounding ?
Frequency += gTxVfo->StepFrequency / 2; // no idea, but this is Frequency += gTxVfo->StepFrequency / 2; // no idea, but this is
Frequency = FREQUENCY_FloorToStep(Frequency, gTxVfo->StepFrequency, frequencyBandTable[gTxVfo->Band].lower); Frequency = FREQUENCY_FloorToStep(Frequency, gTxVfo->StepFrequency, frequencyBandTable[gTxVfo->Band].lower);
if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower)
{ // clamp the frequency to the limit { // clamp the frequency to the limit
const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2; const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2;
Frequency = (Frequency < center) ? BX4819_band1.upper - gTxVfo->StepFrequency : BX4819_band2.lower; Frequency = (Frequency < center) ? BX4819_band1.upper - gTxVfo->StepFrequency : BX4819_band2.lower;
} }
gTxVfo->freq_config_RX.Frequency = Frequency; gTxVfo->freq_config_RX.Frequency = Frequency;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
} }
} }
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
else else
if (IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ // user is entering NOAA channel { // user is entering NOAA channel
uint8_t Channel; uint8_t Channel;
if (gInputBoxIndex != 2) if (gInputBoxIndex != 2)
@@ -473,7 +491,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
if (!gFmRadioMode) if (!gFmRadioMode)
#endif #endif
{ {
if (gScanState == SCAN_OFF) if (gScanStateDir == SCAN_OFF)
{ {
if (gInputBoxIndex == 0) if (gInputBoxIndex == 0)
return; return;
@@ -488,6 +506,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
} }
else else
{ {
bScanKeepFrequency = false;
SCANNER_Stop(); SCANNER_Stop();
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -509,10 +528,10 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
if (bKeyHeld && bKeyPressed) if (bKeyHeld && bKeyPressed)
{ // exit key held down { // exit key held down
if (gInputBoxIndex > 0) if (gInputBoxIndex > 0 || gDTMF_InputBox_Index > 0 || gDTMF_InputMode)
{ // cancel key input mode (channel/frequency entry) { // cancel key input mode (channel/frequency entry)
gDTMF_InputMode = false; gDTMF_InputMode = false;
gDTMF_InputIndex = 0; gDTMF_InputBox_Index = 0;
memset(gDTMF_String, 0, sizeof(gDTMF_String)); memset(gDTMF_String, 0, sizeof(gDTMF_String));
gInputBoxIndex = 0; gInputBoxIndex = 0;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
@@ -523,11 +542,18 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
{ {
if (bKeyPressed && !bKeyHeld)
// menu key pressed
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (bKeyHeld) if (bKeyHeld)
{ // menu key held down (long press) { // menu key held down (long press)
if (bKeyPressed) if (bKeyPressed)
{ { // long press MENU key
gWasFKeyPressed = false;
if (gScreenToDisplay == DISPLAY_MAIN) if (gScreenToDisplay == DISPLAY_MAIN)
{ {
if (gInputBoxIndex > 0) if (gInputBoxIndex > 0)
@@ -539,54 +565,51 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
gWasFKeyPressed = false; gWasFKeyPressed = false;
gUpdateStatus = true; gUpdateStatus = true;
// TODO: long press M-key
#ifdef ENABLE_COPY_CHAN_TO_VFO #ifdef ENABLE_COPY_CHAN_TO_VFO
{ // copy channel to VFO
int channel = -1;
int vfo = -1;
//int selected = -1;
if (IS_FREQ_CHANNEL(gRxVfo->CHANNEL_SAVE)) if (gEeprom.VFO_OPEN && gCssScanMode == CSS_SCAN_MODE_OFF)
{ // VFO mode {
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ // other VFO is in channel mode if (gScanStateDir != SCAN_OFF)
channel = gTxVfo->CHANNEL_SAVE; {
vfo = gRxVfo->CHANNEL_SAVE; if (gCurrentFunction != FUNCTION_INCOMING ||
gRxReceptionMode == RX_MODE_NONE ||
gScanPauseDelayIn_10ms == 0)
{ // scan is running (not paused)
return;
}
}
const uint8_t vfo = gEeprom.TX_VFO;
if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo]))
{ // copy channel to VFO, then swap to the VFO
const unsigned int channel = FREQ_CHANNEL_FIRST + gEeprom.VfoInfo[vfo].Band;
gEeprom.ScreenChannel[vfo] = channel;
gEeprom.VfoInfo[vfo].CHANNEL_SAVE = channel;
gEeprom.TX_VFO = vfo;
RADIO_SelectVfos();
RADIO_ApplyOffset(gRxVfo);
RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
RADIO_SetupRegisters(true);
//SETTINGS_SaveChannel(channel, gEeprom.RX_VFO, gRxVfo, 1);
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
gUpdateStatus = true;
gUpdateDisplay = true;
} }
} }
else else
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) {
{ // VFO mode gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
if (IS_MR_CHANNEL(gRxVfo->CHANNEL_SAVE))
{ // other VFO is in channel mode
channel = gRxVfo->CHANNEL_SAVE;
vfo = gTxVfo->CHANNEL_SAVE;
}
} }
if (channel >= 0 && vfo >= 0)
{ // copy the channel into the VFO
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
// TODO: finish this
//gEeprom.RX_CHANNEL = () & 1; // swap to the VFO
// gRequestSaveVFO = true;
// gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
// gRequestDisplayScreen = DISPLAY_MAIN;
}
}
#endif #endif
} }
} }
@@ -598,14 +621,10 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
const bool bFlag = (gInputBoxIndex == 0); const bool bFlag = (gInputBoxIndex == 0);
gInputBoxIndex = 0; gInputBoxIndex = 0;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (bFlag) if (bFlag)
{ {
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_MENU; gAnotherVoiceID = VOICE_ID_MENU;
#endif #endif
@@ -619,6 +638,9 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
{ {
if (gCurrentFunction == FUNCTION_TRANSMIT)
return;
if (gInputBoxIndex) if (gInputBoxIndex)
{ {
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed)
@@ -626,72 +648,72 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
return; return;
} }
if (bKeyHeld || !bKeyPressed) if (bKeyHeld && !gWasFKeyPressed) // long press
{ {
if (bKeyHeld || bKeyPressed) if (!bKeyPressed) // released
{ return;
if (!bKeyHeld)
return;
if (!bKeyPressed) ACTION_Scan(false);// toggle scanning
return;
ACTION_Scan(false); gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return; return;
} }
if (bKeyPressed) // just pressed
{
// gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
gBeepToPlay = BEEP_880HZ_40MS_OPTIONAL;
return;
}
// just released
if (!gWasFKeyPressed) // pressed without the F-key
{
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (gScanState == SCAN_OFF && IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (gScanStateDir == SCAN_OFF && IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
#else #else
if (gScanState == SCAN_OFF) if (gScanStateDir == SCAN_OFF)
#endif #endif
{ { // start entering a DTMF string
gKeyInputCountdown = key_input_timeout_500ms;
memmove(gDTMF_InputBox, gDTMF_String, MIN(sizeof(gDTMF_InputBox), sizeof(gDTMF_String) - 1));
gDTMF_InputBox_Index = 0;
gDTMF_InputMode = true; gDTMF_InputMode = true;
memmove(gDTMF_InputBox, gDTMF_String, sizeof(gDTMF_InputBox));
gDTMF_InputIndex = 0; gKeyInputCountdown = key_input_timeout_500ms;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
return;
} }
} }
else else
{ { // with the F-key
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (!gWasFKeyPressed)
{
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return;
}
gWasFKeyPressed = false; gWasFKeyPressed = false;
gUpdateStatus = true;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
{
gFlagStartScan = true;
gScanSingleFrequency = true;
gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
}
else
{ {
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
} return;
#else }
gFlagStartScan = true;
gScanSingleFrequency = true;
gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
#endif #endif
gPttWasReleased = true; // scan the CTCSS/DCS code
gFlagStartScan = true;
gScanSingleFrequency = true;
gBackup_CROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
} }
gPttWasReleased = true;
gUpdateStatus = true;
} }
static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
{ {
uint8_t Channel = gEeprom.ScreenChannel[gEeprom.TX_CHANNEL]; uint8_t Channel = gEeprom.ScreenChannel[gEeprom.TX_VFO];
if (bKeyHeld || !bKeyPressed) if (bKeyHeld || !bKeyPressed)
{ {
@@ -725,7 +747,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
} }
if (gScanState == SCAN_OFF) if (gScanStateDir == SCAN_OFF)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(Channel)) if (IS_NOT_NOAA_CHANNEL(Channel))
@@ -744,7 +766,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
} }
gTxVfo->freq_config_RX.Frequency = frequency; gTxVfo->freq_config_RX.Frequency = frequency;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
} }
@@ -756,8 +778,8 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
if (Channel == Next) if (Channel == Next)
return; return;
gEeprom.MrChannel[gEeprom.TX_CHANNEL] = Next; gEeprom.MrChannel[gEeprom.TX_VFO] = Next;
gEeprom.ScreenChannel[gEeprom.TX_CHANNEL] = Next; gEeprom.ScreenChannel[gEeprom.TX_VFO] = Next;
if (!bKeyHeld) if (!bKeyHeld)
{ {
@@ -770,9 +792,9 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
else else
{ {
Channel = NOAA_CHANNEL_FIRST + NUMBER_AddWithWraparound(gEeprom.ScreenChannel[gEeprom.TX_CHANNEL] - NOAA_CHANNEL_FIRST, Direction, 0, 9); Channel = NOAA_CHANNEL_FIRST + NUMBER_AddWithWraparound(gEeprom.ScreenChannel[gEeprom.TX_VFO] - NOAA_CHANNEL_FIRST, Direction, 0, 9);
gEeprom.NoaaChannel[gEeprom.TX_CHANNEL] = Channel; gEeprom.NoaaChannel[gEeprom.TX_VFO] = Channel;
gEeprom.ScreenChannel[gEeprom.TX_CHANNEL] = Channel; gEeprom.ScreenChannel[gEeprom.TX_VFO] = Channel;
} }
#endif #endif
@@ -781,7 +803,10 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
return; return;
} }
CHANNEL_Next(false, Direction); // jump to the next channel
SCANNER_NextChannel(false, Direction);
gScanPauseDelayIn_10ms = 1;
gScheduleScanListen = false;
gPttWasReleased = true; gPttWasReleased = true;
} }
@@ -797,29 +822,25 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
#endif #endif
if (gDTMF_InputMode && bKeyPressed) if (gDTMF_InputMode && bKeyPressed && !bKeyHeld)
{ {
if (!bKeyHeld) const char Character = DTMF_GetCharacter(Key);
{ if (Character != 0xFF)
const char Character = DTMF_GetCharacter(Key); { // add key to DTMF string
if (Character != 0xFF) DTMF_Append(Character);
{ // add key to DTMF string gKeyInputCountdown = key_input_timeout_500ms;
DTMF_Append(Character); gRequestDisplayScreen = DISPLAY_MAIN;
gPttWasReleased = true;
gKeyInputCountdown = key_input_timeout_500ms; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
gRequestDisplayScreen = DISPLAY_MAIN; return;
gPttWasReleased = true;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return;
}
} }
} }
// TODO: ??? // TODO: ???
if (Key > KEY_PTT) // if (Key > KEY_PTT)
{ // {
Key = KEY_SIDE2; // Key = KEY_SIDE2; // what's this doing ???
} // }
switch (Key) switch (Key)
{ {

View File

@@ -47,26 +47,33 @@
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif #endif
void writeXtalFreqCal(const int32_t value) #ifdef ENABLE_F_CAL_MENU
{ void writeXtalFreqCal(const int32_t value, const bool update_eeprom)
struct
{ {
int16_t BK4819_XtalFreqLow; BK4819_WriteRegister(BK4819_REG_3B, 22656 + value);
uint16_t EEPROM_1F8A;
uint16_t EEPROM_1F8C;
uint8_t VOLUME_GAIN;
uint8_t DAC_GAIN;
} __attribute__((packed)) Misc;
gEeprom.BK4819_XTAL_FREQ_LOW = value; if (update_eeprom)
BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW); {
struct
{
int16_t BK4819_XtalFreqLow;
uint16_t EEPROM_1F8A;
uint16_t EEPROM_1F8C;
uint8_t VOLUME_GAIN;
uint8_t DAC_GAIN;
} __attribute__((packed)) misc;
// radio 1 .. 04 00 46 00 50 00 2C 0E gEeprom.BK4819_XTAL_FREQ_LOW = value;
// radio 2 .. 05 00 46 00 50 00 2C 0E
EEPROM_ReadBuffer(0x1F88, &Misc, 8); // radio 1 .. 04 00 46 00 50 00 2C 0E
Misc.BK4819_XtalFreqLow = gEeprom.BK4819_XTAL_FREQ_LOW; // radio 2 .. 05 00 46 00 50 00 2C 0E
EEPROM_WriteBuffer(0x1F88, &Misc); //
} EEPROM_ReadBuffer(0x1F88, &misc, 8);
misc.BK4819_XtalFreqLow = value;
EEPROM_WriteBuffer(0x1F88, &misc);
}
}
#endif
void MENU_StartCssScan(int8_t Direction) void MENU_StartCssScan(int8_t Direction)
{ {
@@ -79,8 +86,8 @@ void MENU_StartCssScan(int8_t Direction)
MENU_SelectNextCode(); MENU_SelectNextCode();
ScanPauseDelayIn_10ms = scan_pause_delay_in_2_10ms; gScanPauseDelayIn_10ms = scan_pause_delay_in_2_10ms;
gScheduleScanListen = false; gScheduleScanListen = false;
} }
void MENU_StopCssScan(void) void MENU_StopCssScan(void)
@@ -91,9 +98,9 @@ void MENU_StopCssScan(void)
RADIO_SetupRegisters(true); RADIO_SetupRegisters(true);
} }
int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
{ {
switch (Cursor) switch (menu_id)
{ {
case MENU_SQL: case MENU_SQL:
*pMin = 0; *pMin = 0;
@@ -132,12 +139,7 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
case MENU_TDR: case MENU_TDR:
*pMin = 0; *pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_CHAN) - 1; *pMax = ARRAY_SIZE(gSubMenu_RXMode) - 1;
break;
case MENU_XB:
*pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_XB) - 1;
break; break;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -192,12 +194,11 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
*pMax = ARRAY_SIZE(gSubMenu_RESET) - 1; *pMax = ARRAY_SIZE(gSubMenu_RESET) - 1;
break; break;
#ifdef ENABLE_COMPANDER case MENU_COMPAND:
case MENU_COMPAND: case MENU_ABR_ON_TX_RX:
*pMin = 0; *pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_Compand) - 1; *pMax = ARRAY_SIZE(gSubMenu_RX_TX) - 1;
break; break;
#endif
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
case MENU_AM_FIX_TEST1: case MENU_AM_FIX_TEST1:
@@ -245,7 +246,9 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
*pMax = ARRAY_SIZE(gSubMenu_TOT) - 1; *pMax = ARRAY_SIZE(gSubMenu_TOT) - 1;
break; break;
case MENU_VOX: #ifdef ENABLE_VOX
case MENU_VOX:
#endif
case MENU_RP_STE: case MENU_RP_STE:
*pMin = 0; *pMin = 0;
*pMax = 10; *pMax = 10;
@@ -276,7 +279,7 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
break; break;
case MENU_S_LIST: case MENU_S_LIST:
*pMin = 1; *pMin = 0;
*pMax = 2; *pMax = 2;
break; break;
@@ -290,11 +293,6 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
*pMax = ARRAY_SIZE(gSubMenu_PTT_ID) - 1; *pMax = ARRAY_SIZE(gSubMenu_PTT_ID) - 1;
break; break;
case MENU_VOL:
*pMin = 0;
*pMax = 2300;
break;
case MENU_BAT_TXT: case MENU_BAT_TXT:
*pMin = 0; *pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_BAT_TXT) - 1; *pMax = ARRAY_SIZE(gSubMenu_BAT_TXT) - 1;
@@ -327,6 +325,14 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
*pMax = 2200; // 2300 *pMax = 2200; // 2300
break; break;
case MENU_F1SHRT:
case MENU_F1LONG:
case MENU_F2SHRT:
case MENU_F2LONG:
*pMin = 0;
*pMax = gSubMenu_SIDEFUNCTIONS_size-1;
break;
default: default:
return -1; return -1;
} }
@@ -341,14 +347,14 @@ void MENU_AcceptSetting(void)
uint8_t Code; uint8_t Code;
FREQ_Config_t *pConfig = &gTxVfo->freq_config_RX; FREQ_Config_t *pConfig = &gTxVfo->freq_config_RX;
if (!MENU_GetLimits(gMenuCursor, &Min, &Max)) if (!MENU_GetLimits(GetCurrentMenuId(), &Min, &Max))
{ {
if (gSubMenuSelection < Min) gSubMenuSelection = Min; if (gSubMenuSelection < Min) gSubMenuSelection = Min;
else else
if (gSubMenuSelection > Max) gSubMenuSelection = Max; if (gSubMenuSelection > Max) gSubMenuSelection = Max;
} }
switch (gMenuCursor) switch (GetCurrentMenuId())
{ {
default: default:
return; return;
@@ -406,9 +412,7 @@ void MENU_AcceptSetting(void)
case MENU_T_CTCS: case MENU_T_CTCS:
pConfig = &gTxVfo->freq_config_TX; pConfig = &gTxVfo->freq_config_TX;
[[fallthrough]];
// Fallthrough
case MENU_R_CTCS: case MENU_R_CTCS:
if (gSubMenuSelection == 0) if (gSubMenuSelection == 0)
{ {
@@ -418,14 +422,20 @@ void MENU_AcceptSetting(void)
return; return;
} }
Code = 0; Code = 0;
pConfig->Code = Code;
pConfig->CodeType = CODE_TYPE_OFF; pConfig->CodeType = CODE_TYPE_OFF;
BK4819_ExitSubAu();
} }
else else
{ {
pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE; pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE;
Code = gSubMenuSelection - 1; Code = gSubMenuSelection - 1;
pConfig->Code = Code;
BK4819_SetCTCSSFrequency(CTCSS_Options[Code]);
} }
pConfig->Code = Code;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
@@ -446,6 +456,12 @@ void MENU_AcceptSetting(void)
case MENU_SCR: case MENU_SCR:
gTxVfo->SCRAMBLING_TYPE = gSubMenuSelection; gTxVfo->SCRAMBLING_TYPE = gSubMenuSelection;
#if 0
if (gSubMenuSelection > 0 && gSetting_ScrambleEnable)
BK4819_EnableScramble(gSubMenuSelection - 1);
else
BK4819_DisableScramble();
#endif
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
@@ -459,7 +475,7 @@ void MENU_AcceptSetting(void)
#if 0 #if 0
gEeprom.MrChannel[0] = gSubMenuSelection; gEeprom.MrChannel[0] = gSubMenuSelection;
#else #else
gEeprom.MrChannel[gEeprom.TX_CHANNEL] = gSubMenuSelection; gEeprom.MrChannel[gEeprom.TX_VFO] = gSubMenuSelection;
#endif #endif
gRequestSaveChannel = 2; gRequestSaveChannel = 2;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
@@ -479,7 +495,7 @@ void MENU_AcceptSetting(void)
// save the channel name // save the channel name
memset(gTxVfo->Name, 0, sizeof(gTxVfo->Name)); memset(gTxVfo->Name, 0, sizeof(gTxVfo->Name));
memmove(gTxVfo->Name, edit, 10); memmove(gTxVfo->Name, edit, 10);
SETTINGS_SaveChannel(gSubMenuSelection, gEeprom.TX_CHANNEL, gTxVfo, 3); SETTINGS_SaveChannel(gSubMenuSelection, gEeprom.TX_VFO, gTxVfo, 3);
gFlagReconfigureVfos = true; gFlagReconfigureVfos = true;
return; return;
@@ -487,36 +503,31 @@ void MENU_AcceptSetting(void)
gEeprom.BATTERY_SAVE = gSubMenuSelection; gEeprom.BATTERY_SAVE = gSubMenuSelection;
break; break;
case MENU_VOX: #ifdef ENABLE_VOX
gEeprom.VOX_SWITCH = gSubMenuSelection != 0; case MENU_VOX:
if (gEeprom.VOX_SWITCH) gEeprom.VOX_SWITCH = gSubMenuSelection != 0;
gEeprom.VOX_LEVEL = gSubMenuSelection - 1; if (gEeprom.VOX_SWITCH)
BOARD_EEPROM_LoadMoreSettings(); gEeprom.VOX_LEVEL = gSubMenuSelection - 1;
gFlagReconfigureVfos = true; BOARD_EEPROM_LoadCalibration();
gUpdateStatus = true; gFlagReconfigureVfos = true;
break; gUpdateStatus = true;
break;
#endif
case MENU_ABR: case MENU_ABR:
gEeprom.BACKLIGHT = gSubMenuSelection; gEeprom.BACKLIGHT = gSubMenuSelection;
break; break;
case MENU_TDR: case MENU_ABR_ON_TX_RX:
gEeprom.DUAL_WATCH = gSubMenuSelection; gSetting_backlight_on_tx_rx = gSubMenuSelection;
gFlagReconfigureVfos = true;
gUpdateStatus = true;
break; break;
case MENU_XB: case MENU_TDR:
#ifdef ENABLE_NOAA gEeprom.DUAL_WATCH = (gEeprom.TX_VFO + 1) * (gSubMenuSelection & 1);
if (IS_NOAA_CHANNEL(gEeprom.ScreenChannel[0])) gEeprom.CROSS_BAND_RX_TX = (gEeprom.TX_VFO + 1) * ((gSubMenuSelection & 2) > 0);
return;
if (IS_NOAA_CHANNEL(gEeprom.ScreenChannel[1]))
return;
#endif
gEeprom.CROSS_BAND_RX_TX = gSubMenuSelection; gFlagReconfigureVfos = true;
gFlagReconfigureVfos = true; gUpdateStatus = true;
gUpdateStatus = true;
break; break;
case MENU_BEEP: case MENU_BEEP:
@@ -571,7 +582,7 @@ void MENU_AcceptSetting(void)
case MENU_MIC: case MENU_MIC:
gEeprom.MIC_SENSITIVITY = gSubMenuSelection; gEeprom.MIC_SENSITIVITY = gSubMenuSelection;
BOARD_EEPROM_LoadMoreSettings(); BOARD_EEPROM_LoadCalibration();
gFlagReconfigureVfos = true; gFlagReconfigureVfos = true;
break; break;
@@ -581,19 +592,20 @@ void MENU_AcceptSetting(void)
break; break;
#endif #endif
#ifdef ENABLE_COMPANDER case MENU_COMPAND:
case MENU_COMPAND: gTxVfo->Compander = gSubMenuSelection;
gTxVfo->Compander = gSubMenuSelection; SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true);
gRequestSaveChannel = 1; gVfoConfigureMode = VFO_CONFIGURE;
return; gFlagResetVfos = true;
#endif // gRequestSaveChannel = 1;
return;
case MENU_1_CALL: case MENU_1_CALL:
gEeprom.CHAN_1_CALL = gSubMenuSelection; gEeprom.CHAN_1_CALL = gSubMenuSelection;
break; break;
case MENU_S_LIST: case MENU_S_LIST:
gEeprom.SCAN_LIST_DEFAULT = gSubMenuSelection - 1; gEeprom.SCAN_LIST_DEFAULT = gSubMenuSelection;
break; break;
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
@@ -611,7 +623,7 @@ void MENU_AcceptSetting(void)
break; break;
case MENU_D_HOLD: case MENU_D_HOLD:
gEeprom.DTMF_AUTO_RESET_TIME = gSubMenuSelection; gEeprom.DTMF_auto_reset_time = gSubMenuSelection;
break; break;
case MENU_D_PRE: case MENU_D_PRE:
@@ -623,12 +635,6 @@ void MENU_AcceptSetting(void)
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
case MENU_VOL:
if(gF_LOCK) {
EEPROM_WriteBuffer(0x1F40, gBatteryCalibration);
}
break;
case MENU_BAT_TXT: case MENU_BAT_TXT:
gSetting_battery_text = gSubMenuSelection; gSetting_battery_text = gSubMenuSelection;
break; break;
@@ -650,12 +656,12 @@ void MENU_AcceptSetting(void)
break; break;
case MENU_D_LIST: case MENU_D_LIST:
gDTMFChosenContact = gSubMenuSelection - 1; gDTMF_chosen_contact = gSubMenuSelection - 1;
if (gIsDtmfContactValid) if (gIsDtmfContactValid)
{ {
GUI_SelectNextDisplay(DISPLAY_MAIN); GUI_SelectNextDisplay(DISPLAY_MAIN);
gDTMF_InputMode = true; gDTMF_InputMode = true;
gDTMF_InputIndex = 3; gDTMF_InputBox_Index = 3;
memmove(gDTMF_InputBox, gDTMF_ID, 4); memmove(gDTMF_InputBox, gDTMF_ID, 4);
gRequestDisplayScreen = DISPLAY_INVALID; gRequestDisplayScreen = DISPLAY_INVALID;
} }
@@ -740,14 +746,36 @@ void MENU_AcceptSetting(void)
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
case MENU_F_CALI: case MENU_F_CALI:
writeXtalFreqCal(gSubMenuSelection); writeXtalFreqCal(gSubMenuSelection, true);
return; return;
#endif #endif
case MENU_BATCAL: case MENU_BATCAL:
gBatteryCalibration[3] = gSubMenuSelection; {
EEPROM_WriteBuffer(0x1F40, gBatteryCalibration); gBatteryCalibration[0] = (520ul * gSubMenuSelection) / 760; // 5.20V empty, blinking above this value, reduced functionality below
gBatteryCalibration[1] = (700ul * gSubMenuSelection) / 760; // 7.00V, ~5%, 1 bars above this value
gBatteryCalibration[2] = (745ul * gSubMenuSelection) / 760; // 7.45V, ~17%, 2 bars above this value
gBatteryCalibration[3] = gSubMenuSelection; // 7.6V, ~29%, 3 bars above this value
gBatteryCalibration[4] = (788ul * gSubMenuSelection) / 760; // 7.88V, ~65%, 4 bars above this value
gBatteryCalibration[5] = 2300;
SETTINGS_SaveBatteryCalibration(gBatteryCalibration);
return;
}
case MENU_F1SHRT:
case MENU_F1LONG:
case MENU_F2SHRT:
case MENU_F2LONG:
{
uint8_t * fun[]= {
&gEeprom.KEY_1_SHORT_PRESS_ACTION,
&gEeprom.KEY_1_LONG_PRESS_ACTION,
&gEeprom.KEY_2_SHORT_PRESS_ACTION,
&gEeprom.KEY_2_LONG_PRESS_ACTION};
*fun[GetCurrentMenuId()-MENU_F1SHRT] = gSubMenu_SIDEFUNCTIONS[gSubMenuSelection].id;
}
break; break;
} }
gRequestSaveSettings = true; gRequestSaveSettings = true;
@@ -757,18 +785,17 @@ void MENU_SelectNextCode(void)
{ {
int32_t UpperLimit; int32_t UpperLimit;
if (gMenuCursor == MENU_R_DCS) if (GetCurrentMenuId() == MENU_R_DCS)
UpperLimit = 208; UpperLimit = 208;
//UpperLimit = ARRAY_SIZE(DCS_Options); //UpperLimit = ARRAY_SIZE(DCS_Options);
else else if (GetCurrentMenuId() == MENU_R_CTCS)
if (gMenuCursor == MENU_R_CTCS)
UpperLimit = ARRAY_SIZE(CTCSS_Options) - 1; UpperLimit = ARRAY_SIZE(CTCSS_Options) - 1;
else else
return; return;
gSubMenuSelection = NUMBER_AddWithWraparound(gSubMenuSelection, gMenuScrollDirection, 1, UpperLimit); gSubMenuSelection = NUMBER_AddWithWraparound(gSubMenuSelection, gMenuScrollDirection, 1, UpperLimit);
if (gMenuCursor == MENU_R_DCS) if (GetCurrentMenuId() == MENU_R_DCS)
{ {
if (gSubMenuSelection > 104) if (gSubMenuSelection > 104)
{ {
@@ -790,7 +817,7 @@ void MENU_SelectNextCode(void)
RADIO_SetupRegisters(true); RADIO_SetupRegisters(true);
ScanPauseDelayIn_10ms = (gSelectedCodeType == CODE_TYPE_CONTINUOUS_TONE) ? scan_pause_delay_in_3_10ms : scan_pause_delay_in_4_10ms; gScanPauseDelayIn_10ms = (gSelectedCodeType == CODE_TYPE_CONTINUOUS_TONE) ? scan_pause_delay_in_3_10ms : scan_pause_delay_in_4_10ms;
gUpdateDisplay = true; gUpdateDisplay = true;
} }
@@ -800,7 +827,7 @@ static void MENU_ClampSelection(int8_t Direction)
int32_t Min; int32_t Min;
int32_t Max; int32_t Max;
if (!MENU_GetLimits(gMenuCursor, &Min, &Max)) if (!MENU_GetLimits(GetCurrentMenuId(), &Min, &Max))
{ {
int32_t Selection = gSubMenuSelection; int32_t Selection = gSubMenuSelection;
if (Selection < Min) Selection = Min; if (Selection < Min) Selection = Min;
@@ -812,7 +839,7 @@ static void MENU_ClampSelection(int8_t Direction)
void MENU_ShowCurrentSetting(void) void MENU_ShowCurrentSetting(void)
{ {
switch (gMenuCursor) switch (GetCurrentMenuId())
{ {
case MENU_SQL: case MENU_SQL:
gSubMenuSelection = gEeprom.SQUELCH_LEVEL; gSubMenuSelection = gEeprom.SQUELCH_LEVEL;
@@ -892,21 +919,23 @@ void MENU_ShowCurrentSetting(void)
#if 0 #if 0
gSubMenuSelection = gEeprom.MrChannel[0]; gSubMenuSelection = gEeprom.MrChannel[0];
#else #else
gSubMenuSelection = gEeprom.MrChannel[gEeprom.TX_CHANNEL]; gSubMenuSelection = gEeprom.MrChannel[gEeprom.TX_VFO];
#endif #endif
break; break;
case MENU_MEM_NAME: case MENU_MEM_NAME:
gSubMenuSelection = gEeprom.MrChannel[gEeprom.TX_CHANNEL]; gSubMenuSelection = gEeprom.MrChannel[gEeprom.TX_VFO];
break; break;
case MENU_SAVE: case MENU_SAVE:
gSubMenuSelection = gEeprom.BATTERY_SAVE; gSubMenuSelection = gEeprom.BATTERY_SAVE;
break; break;
case MENU_VOX: #ifdef ENABLE_VOX
gSubMenuSelection = gEeprom.VOX_SWITCH ? gEeprom.VOX_LEVEL + 1 : 0; case MENU_VOX:
break; gSubMenuSelection = gEeprom.VOX_SWITCH ? gEeprom.VOX_LEVEL + 1 : 0;
break;
#endif
case MENU_ABR: case MENU_ABR:
gSubMenuSelection = gEeprom.BACKLIGHT; gSubMenuSelection = gEeprom.BACKLIGHT;
@@ -915,12 +944,12 @@ void MENU_ShowCurrentSetting(void)
GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON while in backlight menu GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON while in backlight menu
break; break;
case MENU_TDR: case MENU_ABR_ON_TX_RX:
gSubMenuSelection = gEeprom.DUAL_WATCH; gSubMenuSelection = gSetting_backlight_on_tx_rx;
break; break;
case MENU_XB: case MENU_TDR:
gSubMenuSelection = gEeprom.CROSS_BAND_RX_TX; gSubMenuSelection = (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) * 2;
break; break;
case MENU_BEEP: case MENU_BEEP:
@@ -975,18 +1004,16 @@ void MENU_ShowCurrentSetting(void)
break; break;
#endif #endif
#ifdef ENABLE_COMPANDER case MENU_COMPAND:
case MENU_COMPAND: gSubMenuSelection = gTxVfo->Compander;
gSubMenuSelection = gTxVfo->Compander; return;
return;
#endif
case MENU_1_CALL: case MENU_1_CALL:
gSubMenuSelection = gEeprom.CHAN_1_CALL; gSubMenuSelection = gEeprom.CHAN_1_CALL;
break; break;
case MENU_S_LIST: case MENU_S_LIST:
gSubMenuSelection = gEeprom.SCAN_LIST_DEFAULT + 1; gSubMenuSelection = gEeprom.SCAN_LIST_DEFAULT;
break; break;
case MENU_SLIST1: case MENU_SLIST1:
@@ -1012,7 +1039,7 @@ void MENU_ShowCurrentSetting(void)
break; break;
case MENU_D_HOLD: case MENU_D_HOLD:
gSubMenuSelection = gEeprom.DTMF_AUTO_RESET_TIME; gSubMenuSelection = gEeprom.DTMF_auto_reset_time;
break; break;
case MENU_D_PRE: case MENU_D_PRE:
@@ -1023,10 +1050,6 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gTxVfo->DTMF_PTT_ID_TX_MODE; gSubMenuSelection = gTxVfo->DTMF_PTT_ID_TX_MODE;
break; break;
case MENU_VOL:
gSubMenuSelection = gBatteryCalibration[3];
return;
case MENU_BAT_TXT: case MENU_BAT_TXT:
gSubMenuSelection = gSetting_battery_text; gSubMenuSelection = gSetting_battery_text;
return; return;
@@ -1036,7 +1059,7 @@ void MENU_ShowCurrentSetting(void)
break; break;
case MENU_D_LIST: case MENU_D_LIST:
gSubMenuSelection = gDTMFChosenContact + 1; gSubMenuSelection = gDTMF_chosen_contact + 1;
break; break;
case MENU_D_LIVE_DEC: case MENU_D_LIVE_DEC:
@@ -1077,7 +1100,7 @@ void MENU_ShowCurrentSetting(void)
#if 0 #if 0
gSubMenuSelection = RADIO_FindNextChannel(gEeprom.MrChannel[0], 1, false, 1); gSubMenuSelection = RADIO_FindNextChannel(gEeprom.MrChannel[0], 1, false, 1);
#else #else
gSubMenuSelection = RADIO_FindNextChannel(gEeprom.MrChannel[gEeprom.TX_CHANNEL], 1, false, 1); gSubMenuSelection = RADIO_FindNextChannel(gEeprom.MrChannel[gEeprom.TX_VFO], 1, false, 1);
#endif #endif
break; break;
@@ -1119,6 +1142,28 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gBatteryCalibration[3]; gSubMenuSelection = gBatteryCalibration[3];
break; break;
case MENU_F1SHRT:
case MENU_F1LONG:
case MENU_F2SHRT:
case MENU_F2LONG:
{
uint8_t * fun[]= {
&gEeprom.KEY_1_SHORT_PRESS_ACTION,
&gEeprom.KEY_1_LONG_PRESS_ACTION,
&gEeprom.KEY_2_SHORT_PRESS_ACTION,
&gEeprom.KEY_2_LONG_PRESS_ACTION};
uint8_t id = *fun[GetCurrentMenuId()-MENU_F1SHRT];
for(int i = 0; i < gSubMenu_SIDEFUNCTIONS_size; i++) {
if(gSubMenu_SIDEFUNCTIONS[i].id==id) {
gSubMenuSelection = i;
break;
}
}
break;
}
default: default:
return; return;
} }
@@ -1136,12 +1181,12 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (gMenuCursor == MENU_MEM_NAME && edit_index >= 0) if (GetCurrentMenuId() == MENU_MEM_NAME && edit_index >= 0)
{ // currently editing the channel name { // currently editing the channel name
if (edit_index < 10) if (edit_index < 10)
{ {
if (Key >= KEY_0 && Key <= KEY_9) if (Key <= KEY_9)
{ {
edit[edit_index] = '0' + Key - KEY_0; edit[edit_index] = '0' + Key - KEY_0;
@@ -1183,7 +1228,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gInputBox[0] = gInputBox[1]; gInputBox[0] = gInputBox[1];
gInputBoxIndex = 1; gInputBoxIndex = 1;
[[fallthrough]];
case 1: case 1:
Value = gInputBox[0]; Value = gInputBox[0];
if (Value > 0 && Value <= gMenuListCount) if (Value > 0 && Value <= gMenuListCount)
@@ -1201,7 +1246,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
return; return;
} }
if (gMenuCursor == MENU_OFFSET) if (GetCurrentMenuId() == MENU_OFFSET)
{ {
uint32_t Frequency; uint32_t Frequency;
@@ -1223,8 +1268,11 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gInputBoxIndex = 0; gInputBoxIndex = 0;
return; return;
} }
if (gMenuCursor == MENU_MEM_CH || gMenuCursor == MENU_DEL_CH || gMenuCursor == MENU_1_CALL || gMenuCursor == MENU_MEM_NAME) if (GetCurrentMenuId() == MENU_MEM_CH ||
GetCurrentMenuId() == MENU_DEL_CH ||
GetCurrentMenuId() == MENU_1_CALL ||
GetCurrentMenuId() == MENU_MEM_NAME)
{ // enter 3-digit channel number { // enter 3-digit channel number
if (gInputBoxIndex < 3) if (gInputBoxIndex < 3)
@@ -1240,7 +1288,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
Value = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; Value = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1;
if (IS_MR_CHANNEL(Value)) if (Value <= MR_CHANNEL_LAST)
{ {
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
@@ -1253,7 +1301,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
return; return;
} }
if (MENU_GetLimits(gMenuCursor, &Min, &Max)) if (MENU_GetLimits(GetCurrentMenuId(), &Min, &Max))
{ {
gInputBoxIndex = 0; gInputBoxIndex = 0;
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
@@ -1298,7 +1346,7 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
{ {
if (gIsInSubMenu) if (gIsInSubMenu)
{ {
if (gInputBoxIndex == 0 || gMenuCursor != MENU_OFFSET) if (gInputBoxIndex == 0 || GetCurrentMenuId() != MENU_OFFSET)
{ {
gAskForConfirmation = 0; gAskForConfirmation = 0;
gIsInSubMenu = false; gIsInSubMenu = false;
@@ -1355,12 +1403,12 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
if (!gIsInSubMenu) if (!gIsInSubMenu)
{ {
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
if (gMenuCursor != MENU_SCR) if (GetCurrentMenuId() != MENU_SCR)
gAnotherVoiceID = MenuList[gMenuCursor].voice_id; gAnotherVoiceID = MenuList[gMenuCursor].voice_id;
#endif #endif
#if 1 #if 1
if (gMenuCursor == MENU_DEL_CH || gMenuCursor == MENU_MEM_NAME) if (GetCurrentMenuId() == MENU_DEL_CH || GetCurrentMenuId() == MENU_MEM_NAME)
if (!RADIO_CheckValidChannel(gSubMenuSelection, false, 0)) if (!RADIO_CheckValidChannel(gSubMenuSelection, false, 0))
return; // invalid channel return; // invalid channel
#endif #endif
@@ -1368,7 +1416,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
gAskForConfirmation = 0; gAskForConfirmation = 0;
gIsInSubMenu = true; gIsInSubMenu = true;
// if (gMenuCursor != MENU_D_LIST) // if (GetCurrentMenuId() != MENU_D_LIST)
{ {
gInputBoxIndex = 0; gInputBoxIndex = 0;
edit_index = -1; edit_index = -1;
@@ -1377,7 +1425,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
return; return;
} }
if (gMenuCursor == MENU_MEM_NAME) if (GetCurrentMenuId() == MENU_MEM_NAME)
{ {
if (edit_index < 0) if (edit_index < 0)
{ // enter channel name edit mode { // enter channel name edit mode
@@ -1424,10 +1472,10 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
if (gIsInSubMenu) if (gIsInSubMenu)
{ {
if (gMenuCursor == MENU_RESET || if (GetCurrentMenuId() == MENU_RESET ||
gMenuCursor == MENU_MEM_CH || GetCurrentMenuId() == MENU_MEM_CH ||
gMenuCursor == MENU_DEL_CH || GetCurrentMenuId() == MENU_DEL_CH ||
gMenuCursor == MENU_MEM_NAME) GetCurrentMenuId() == MENU_MEM_NAME)
{ {
switch (gAskForConfirmation) switch (gAskForConfirmation)
{ {
@@ -1440,7 +1488,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
UI_DisplayMenu(); UI_DisplayMenu();
if (gMenuCursor == MENU_RESET) if (GetCurrentMenuId() == MENU_RESET)
{ {
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_CONFIRM); AUDIO_SetVoiceID(0, VOICE_ID_CONFIRM);
@@ -1475,7 +1523,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
} }
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
if (gMenuCursor == MENU_SCR) if (GetCurrentMenuId() == MENU_SCR)
gAnotherVoiceID = (gSubMenuSelection == 0) ? VOICE_ID_SCRAMBLER_OFF : VOICE_ID_SCRAMBLER_ON; gAnotherVoiceID = (gSubMenuSelection == 0) ? VOICE_ID_SCRAMBLER_OFF : VOICE_ID_SCRAMBLER_ON;
else else
gAnotherVoiceID = VOICE_ID_CONFIRM; gAnotherVoiceID = VOICE_ID_CONFIRM;
@@ -1491,7 +1539,7 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld)
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (gMenuCursor == MENU_MEM_NAME && edit_index >= 0) if (GetCurrentMenuId() == MENU_MEM_NAME && edit_index >= 0)
{ // currently editing the channel name { // currently editing the channel name
if (edit_index < 10) if (edit_index < 10)
@@ -1518,7 +1566,7 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld)
if (gRxVfo->AM_mode == 0) if (gRxVfo->AM_mode == 0)
#endif #endif
{ {
if (gMenuCursor == MENU_R_CTCS || gMenuCursor == MENU_R_DCS) if (GetCurrentMenuId() == MENU_R_CTCS || GetCurrentMenuId() == MENU_R_DCS)
{ // scan CTCSS or DCS to find the tone/code of the incoming signal { // scan CTCSS or DCS to find the tone/code of the incoming signal
if (gCssScanMode == CSS_SCAN_MODE_OFF) if (gCssScanMode == CSS_SCAN_MODE_OFF)
@@ -1553,7 +1601,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
uint8_t Channel; uint8_t Channel;
bool bCheckScanList; bool bCheckScanList;
if (gMenuCursor == MENU_MEM_NAME && gIsInSubMenu && edit_index >= 0) if (GetCurrentMenuId() == MENU_MEM_NAME && gIsInSubMenu && edit_index >= 0)
{ // change the character { // change the character
if (bKeyPressed && edit_index < 10 && Direction != 0) if (bKeyPressed && edit_index < 10 && Direction != 0)
{ {
@@ -1605,7 +1653,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
if (gMenuCursor != MENU_ABR && gEeprom.BACKLIGHT == 0) if (GetCurrentMenuId() != MENU_ABR && gEeprom.BACKLIGHT == 0)
{ {
gBacklightCountdown = 0; gBacklightCountdown = 0;
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
@@ -1614,7 +1662,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
return; return;
} }
if (gMenuCursor == MENU_OFFSET) if (GetCurrentMenuId() == MENU_OFFSET)
{ {
int32_t Offset = (Direction * gTxVfo->StepFrequency) + gSubMenuSelection; int32_t Offset = (Direction * gTxVfo->StepFrequency) + gSubMenuSelection;
if (Offset < 99999990) if (Offset < 99999990)
@@ -1632,7 +1680,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
VFO = 0; VFO = 0;
switch (gMenuCursor) switch (GetCurrentMenuId())
{ {
case MENU_DEL_CH: case MENU_DEL_CH:
case MENU_1_CALL: case MENU_1_CALL:
@@ -1642,6 +1690,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
case MENU_SLIST2: case MENU_SLIST2:
VFO = 1; VFO = 1;
[[fallthrough]];
case MENU_SLIST1: case MENU_SLIST1:
bCheckScanList = true; bCheckScanList = true;
break; break;
@@ -1691,7 +1740,7 @@ void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
MENU_Key_STAR(bKeyPressed, bKeyHeld); MENU_Key_STAR(bKeyPressed, bKeyHeld);
break; break;
case KEY_F: case KEY_F:
if (gMenuCursor == MENU_MEM_NAME && edit_index >= 0) if (GetCurrentMenuId() == MENU_MEM_NAME && edit_index >= 0)
{ // currently editing the channel name { // currently editing the channel name
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed)
{ {
@@ -1723,11 +1772,11 @@ void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
if (gScreenToDisplay == DISPLAY_MENU) if (gScreenToDisplay == DISPLAY_MENU)
{ {
if (gMenuCursor == MENU_VOL || if (GetCurrentMenuId() == MENU_VOL ||
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
gMenuCursor == MENU_F_CALI || GetCurrentMenuId() == MENU_F_CALI ||
#endif #endif
gMenuCursor == MENU_BATCAL) GetCurrentMenuId() == MENU_BATCAL)
{ {
gMenuCountdown = menu_timeout_long_500ms; gMenuCountdown = menu_timeout_long_500ms;
} }

View File

@@ -19,7 +19,11 @@
#include "driver/keyboard.h" #include "driver/keyboard.h"
int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax); #ifdef ENABLE_F_CAL_MENU
void writeXtalFreqCal(const int32_t value, const bool update_eeprom);
#endif
int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax);
void MENU_AcceptSetting(void); void MENU_AcceptSetting(void);
void MENU_SelectNextCode(void); void MENU_SelectNextCode(void);
void MENU_ShowCurrentSetting(void); void MENU_ShowCurrentSetting(void);

View File

@@ -14,6 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
#include "app/app.h"
#include "app/dtmf.h" #include "app/dtmf.h"
#include "app/generic.h" #include "app/generic.h"
#include "app/scanner.h" #include "app/scanner.h"
@@ -37,12 +38,14 @@ uint32_t gScanFrequency;
bool gScanPauseMode; bool gScanPauseMode;
SCAN_CssState_t gScanCssState; SCAN_CssState_t gScanCssState;
volatile bool gScheduleScanListen = true; volatile bool gScheduleScanListen = true;
volatile uint16_t ScanPauseDelayIn_10ms; volatile uint16_t gScanPauseDelayIn_10ms;
uint8_t gScanProgressIndicator; uint8_t gScanProgressIndicator;
uint8_t gScanHitCount; uint8_t gScanHitCount;
bool gScanUseCssResult; bool gScanUseCssResult;
int8_t gScanState; int8_t gScanStateDir;
bool bScanKeepFrequency; bool bScanKeepFrequency;
uint8_t gRestoreMrChannel;
uint8_t gRestoreCROSS_BAND_RX_TX;
static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
@@ -53,7 +56,9 @@ static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
uint16_t Channel; uint16_t Channel;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
INPUTBOX_Append(Key); INPUTBOX_Append(Key);
gRequestDisplayScreen = DISPLAY_SCANNER; gRequestDisplayScreen = DISPLAY_SCANNER;
if (gInputBoxIndex < 3) if (gInputBoxIndex < 3)
@@ -65,9 +70,9 @@ static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
gInputBoxIndex = 0; gInputBoxIndex = 0;
Channel = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1;
if (IS_MR_CHANNEL(Channel)) Channel = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1;
if (Channel <= MR_CHANNEL_LAST)
{ {
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
@@ -92,7 +97,8 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
{ {
case 0: case 0:
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX;
gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX;
gUpdateStatus = true; gUpdateStatus = true;
gFlagStopScan = true; gFlagStopScan = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
@@ -192,7 +198,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
} }
} }
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST)
{ {
gScannerEditState = 1; gScannerEditState = 1;
gScanChannel = gTxVfo->CHANNEL_SAVE; gScanChannel = gTxVfo->CHANNEL_SAVE;
@@ -246,19 +252,19 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
gTxVfo->freq_config_TX.Code = gScanCssResultCode; gTxVfo->freq_config_TX.Code = gScanCssResultCode;
} }
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST)
{ {
Channel = gScanChannel; Channel = gScanChannel;
gEeprom.MrChannel[gEeprom.TX_CHANNEL] = Channel; gEeprom.MrChannel[gEeprom.TX_VFO] = Channel;
} }
else else
{ {
Channel = gTxVfo->Band + FREQ_CHANNEL_FIRST; Channel = gTxVfo->Band + FREQ_CHANNEL_FIRST;
gEeprom.FreqChannel[gEeprom.TX_CHANNEL] = Channel; gEeprom.FreqChannel[gEeprom.TX_VFO] = Channel;
} }
gTxVfo->CHANNEL_SAVE = Channel; gTxVfo->CHANNEL_SAVE = Channel;
gEeprom.ScreenChannel[gEeprom.TX_CHANNEL] = Channel; gEeprom.ScreenChannel[gEeprom.TX_VFO] = Channel;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_CONFIRM; gAnotherVoiceID = VOICE_ID_CONFIRM;
#endif #endif
@@ -359,10 +365,10 @@ void SCANNER_Start(void)
RADIO_SelectVfos(); RADIO_SelectVfos();
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE))
gRxVfo->CHANNEL_SAVE = FREQ_CHANNEL_FIRST + BAND6_400MHz; gRxVfo->CHANNEL_SAVE = FREQ_CHANNEL_FIRST + BAND6_400MHz;
#endif #endif
BackupStep = gRxVfo->STEP_SETTING; BackupStep = gRxVfo->STEP_SETTING;
BackupFrequency = gRxVfo->StepFrequency; BackupFrequency = gRxVfo->StepFrequency;
@@ -374,9 +380,9 @@ void SCANNER_Start(void)
RADIO_SetupRegisters(true); RADIO_SetupRegisters(true);
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
gIsNoaaMode = false; gIsNoaaMode = false;
#endif #endif
if (gScanSingleFrequency) if (gScanSingleFrequency)
{ {
@@ -411,7 +417,9 @@ void SCANNER_Start(void)
g_CDCSS_Lost = false; g_CDCSS_Lost = false;
gCDCSSCodeType = 0; gCDCSSCodeType = 0;
g_CTCSS_Lost = false; g_CTCSS_Lost = false;
g_VOX_Lost = false; #ifdef ENABLE_VOX
g_VOX_Lost = false;
#endif
g_SquelchLost = false; g_SquelchLost = false;
gScannerEditState = 0; gScannerEditState = 0;
gScanProgressIndicator = 0; gScanProgressIndicator = 0;
@@ -419,18 +427,21 @@ void SCANNER_Start(void)
void SCANNER_Stop(void) void SCANNER_Stop(void)
{ {
const uint8_t Previous = gRestoreMrChannel; if(gRestoreCROSS_BAND_RX_TX != CROSS_BAND_OFF) {
gEeprom.CROSS_BAND_RX_TX = gRestoreCROSS_BAND_RX_TX;
gScanState = SCAN_OFF; gRestoreCROSS_BAND_RX_TX = CROSS_BAND_OFF;
}
gScanStateDir = SCAN_OFF;
if (!bScanKeepFrequency) if (!bScanKeepFrequency)
{ {
if (IS_MR_CHANNEL(gNextMrChannel)) if (gNextMrChannel <= MR_CHANNEL_LAST)
{ {
gEeprom.MrChannel[gEeprom.RX_CHANNEL] = gRestoreMrChannel; gEeprom.MrChannel[gEeprom.RX_VFO] = gRestoreMrChannel;
gEeprom.ScreenChannel[gEeprom.RX_CHANNEL] = Previous; gEeprom.ScreenChannel[gEeprom.RX_VFO] = gRestoreMrChannel;
RADIO_ConfigureChannel(gEeprom.RX_CHANNEL, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(gEeprom.RX_VFO, VFO_CONFIGURE_RELOAD);
} }
else else
{ {
@@ -443,11 +454,11 @@ void SCANNER_Stop(void)
return; return;
} }
if (!IS_MR_CHANNEL(gRxVfo->CHANNEL_SAVE)) if (gRxVfo->CHANNEL_SAVE > MR_CHANNEL_LAST)
{ {
RADIO_ApplyOffset(gRxVfo); RADIO_ApplyOffset(gRxVfo);
RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
SETTINGS_SaveChannel(gRxVfo->CHANNEL_SAVE, gEeprom.RX_CHANNEL, gRxVfo, 1); SETTINGS_SaveChannel(gRxVfo->CHANNEL_SAVE, gEeprom.RX_VFO, gRxVfo, 1);
return; return;
} }
@@ -455,3 +466,175 @@ void SCANNER_Stop(void)
gUpdateStatus = true; gUpdateStatus = true;
} }
static void SCANNER_NextFreqChannel(void)
{
gRxVfo->freq_config_RX.Frequency = APP_SetFrequencyByStep(gRxVfo, gScanStateDir);
RADIO_ApplyOffset(gRxVfo);
RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
RADIO_SetupRegisters(true);
#ifdef ENABLE_FASTER_CHANNEL_SCAN
gScanPauseDelayIn_10ms = 9; // 90ms
#else
gScanPauseDelayIn_10ms = scan_pause_delay_in_6_10ms;
#endif
bScanKeepFrequency = false;
gUpdateDisplay = true;
}
static void SCANNER_NextMemChannel(void)
{
static unsigned int prev_mr_chan = 0;
const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true;
const int chan1 = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCANLIST_PRIORITY_CH1[gEeprom.SCAN_LIST_DEFAULT] : -1;
const int chan2 = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCANLIST_PRIORITY_CH2[gEeprom.SCAN_LIST_DEFAULT] : -1;
const unsigned int prev_chan = gNextMrChannel;
unsigned int chan = 0;
if (enabled)
{
switch (gCurrentScanList)
{
case SCAN_NEXT_CHAN_SCANLIST1:
prev_mr_chan = gNextMrChannel;
if (chan1 >= 0)
{
if (RADIO_CheckValidChannel(chan1, false, 0))
{
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1;
gNextMrChannel = chan1;
break;
}
}
[[fallthrough]];
case SCAN_NEXT_CHAN_SCANLIST2:
if (chan2 >= 0)
{
if (RADIO_CheckValidChannel(chan2, false, 0))
{
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST2;
gNextMrChannel = chan2;
break;
}
}
[[fallthrough]];
// this bit doesn't yet work if the other VFO is a frequency
case SCAN_NEXT_CHAN_DUAL_WATCH:
// dual watch is enabled - include the other VFO in the scan
// if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF)
// {
// chan = (gEeprom.RX_VFO + 1) & 1u;
// chan = gEeprom.ScreenChannel[chan];
// if (chan <= MR_CHANNEL_LAST)
// {
// gCurrentScanList = SCAN_NEXT_CHAN_DUAL_WATCH;
// gNextMrChannel = chan;
// break;
// }
// }
default:
case SCAN_NEXT_CHAN_MR:
gCurrentScanList = SCAN_NEXT_CHAN_MR;
gNextMrChannel = prev_mr_chan;
chan = 0xff;
break;
}
}
if (!enabled || chan == 0xff)
{
chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 2) ? true : false, gEeprom.SCAN_LIST_DEFAULT);
if (chan == 0xFF)
{ // no valid channel found
chan = MR_CHANNEL_FIRST;
// return;
}
gNextMrChannel = chan;
}
if (gNextMrChannel != prev_chan)
{
gEeprom.MrChannel[ gEeprom.RX_VFO] = gNextMrChannel;
gEeprom.ScreenChannel[gEeprom.RX_VFO] = gNextMrChannel;
RADIO_ConfigureChannel(gEeprom.RX_VFO, VFO_CONFIGURE_RELOAD);
RADIO_SetupRegisters(true);
gUpdateDisplay = true;
}
#ifdef ENABLE_FASTER_CHANNEL_SCAN
gScanPauseDelayIn_10ms = 9; // 90ms .. <= ~60ms it misses signals (squelch response and/or PLL lock time) ?
#else
gScanPauseDelayIn_10ms = scan_pause_delay_in_3_10ms;
#endif
bScanKeepFrequency = false;
if (enabled)
if (++gCurrentScanList >= SCAN_NEXT_NUM)
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1; // back round we go
}
void SCANNER_NextChannel(const bool storeBackupSettings, const int8_t scan_direction)
{
if (storeBackupSettings) {
gRestoreCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
}
RADIO_SelectVfos();
gNextMrChannel = gRxVfo->CHANNEL_SAVE;
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1;
gScanStateDir = scan_direction;
if (gNextMrChannel <= MR_CHANNEL_LAST)
{ // channel mode
if (storeBackupSettings)
gRestoreMrChannel = gNextMrChannel;
SCANNER_NextMemChannel();
}
else
{ // frequency mode
if (storeBackupSettings)
gRestoreFrequency = gRxVfo->freq_config_RX.Frequency;
SCANNER_NextFreqChannel();
}
gScanPauseDelayIn_10ms = scan_pause_delay_in_2_10ms;
gScheduleScanListen = false;
gRxReceptionMode = RX_MODE_NONE;
gScanPauseMode = false;
bScanKeepFrequency = false;
}
void SCANNER_ContinueScanning()
{
if (IS_FREQ_CHANNEL(gNextMrChannel))
{
if (gCurrentFunction == FUNCTION_INCOMING)
APP_StartListening(gMonitor ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true);
else
SCANNER_NextFreqChannel(); // switch to next frequency
}
else
{
if (gCurrentCodeType == CODE_TYPE_OFF && gCurrentFunction == FUNCTION_INCOMING)
APP_StartListening(gMonitor ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true);
else
SCANNER_NextMemChannel(); // switch to next channel
}
gScanPauseMode = false;
gRxReceptionMode = RX_MODE_NONE;
gScheduleScanListen = false;
}

View File

@@ -32,7 +32,9 @@ typedef enum SCAN_CssState_t SCAN_CssState_t;
enum enum
{ {
SCAN_OFF = 0, SCAN_REV = -1,
SCAN_OFF = 0,
SCAN_FWD = +1
}; };
extern DCS_CodeType_t gScanCssResultType; extern DCS_CodeType_t gScanCssResultType;
@@ -46,16 +48,18 @@ extern uint32_t gScanFrequency;
extern bool gScanPauseMode; extern bool gScanPauseMode;
extern SCAN_CssState_t gScanCssState; extern SCAN_CssState_t gScanCssState;
extern volatile bool gScheduleScanListen; extern volatile bool gScheduleScanListen;
extern volatile uint16_t ScanPauseDelayIn_10ms; extern volatile uint16_t gScanPauseDelayIn_10ms;
extern uint8_t gScanProgressIndicator; extern uint8_t gScanProgressIndicator;
extern uint8_t gScanHitCount; extern uint8_t gScanHitCount;
extern bool gScanUseCssResult; extern bool gScanUseCssResult;
extern int8_t gScanState; extern int8_t gScanStateDir;
extern bool bScanKeepFrequency; extern bool bScanKeepFrequency;
void SCANNER_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); void SCANNER_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);
void SCANNER_Start(void); void SCANNER_Start(void);
void SCANNER_Stop(void); void SCANNER_Stop(void);
void SCANNER_NextChannel(const bool storeBackupSettings, const int8_t scan_direction);
void SCANNER_ContinueScanning();
#endif #endif

View File

@@ -62,17 +62,17 @@ const char *modulationTypeOptions[] = {" FM", " AM", "USB"};
const uint8_t modulationTypeTuneSteps[] = {100, 50, 10}; const uint8_t modulationTypeTuneSteps[] = {100, 50, 10};
const uint8_t modTypeReg47Values[] = {1, 7, 5}; const uint8_t modTypeReg47Values[] = {1, 7, 5};
SpectrumSettings settings = {STEPS_64, SpectrumSettings settings = {stepsCount: STEPS_64,
S_STEP_25_0kHz, scanStepIndex: S_STEP_25_0kHz,
80000, frequencyChangeStep: 80000,
3200, scanDelay: 3200,
150, rssiTriggerLevel: 150,
true, backlightState: true,
BK4819_FILTER_BW_WIDE, bw: BK4819_FILTER_BW_WIDE,
BK4819_FILTER_BW_WIDE, listenBw: BK4819_FILTER_BW_WIDE,
false, modulationType: false,
-130, dbMin: -130,
-50}; dbMax: -50};
uint32_t fMeasure = 0; uint32_t fMeasure = 0;
uint32_t currentFreq, tempFreq; uint32_t currentFreq, tempFreq;
@@ -561,7 +561,7 @@ static void UpdateFreqInput(KEY_Code_t key) {
for (int i = 0; i < 10; ++i) { for (int i = 0; i < 10; ++i) {
if (i < freqInputIndex) { if (i < freqInputIndex) {
digitKey = freqInputArr[i]; digitKey = freqInputArr[i];
freqInputString[i] = digitKey <= KEY_9 ? '0' + digitKey : '.'; freqInputString[i] = digitKey <= KEY_9 ? '0' + digitKey-KEY_0 : '.';
} else { } else {
freqInputString[i] = '-'; freqInputString[i] = '-';
} }
@@ -569,14 +569,14 @@ static void UpdateFreqInput(KEY_Code_t key) {
uint32_t base = 100000; // 1MHz in BK units uint32_t base = 100000; // 1MHz in BK units
for (int i = dotIndex - 1; i >= 0; --i) { for (int i = dotIndex - 1; i >= 0; --i) {
tempFreq += freqInputArr[i] * base; tempFreq += (freqInputArr[i]-KEY_0) * base;
base *= 10; base *= 10;
} }
base = 10000; // 0.1MHz in BK units base = 10000; // 0.1MHz in BK units
if (dotIndex < freqInputIndex) { if (dotIndex < freqInputIndex) {
for (int i = dotIndex + 1; i < freqInputIndex; ++i) { for (int i = dotIndex + 1; i < freqInputIndex; ++i) {
tempFreq += freqInputArr[i] * base; tempFreq += (freqInputArr[i]-KEY_0) * base;
base /= 10; base /= 10;
} }
} }
@@ -1166,7 +1166,7 @@ static void Tick() {
void APP_RunSpectrum() { void APP_RunSpectrum() {
// TX here coz it always? set to active VFO // TX here coz it always? set to active VFO
currentFreq = initialFreq = currentFreq = initialFreq =
gEeprom.VfoInfo[gEeprom.TX_CHANNEL].pRX->Frequency; gEeprom.VfoInfo[gEeprom.TX_VFO].pRX->Frequency;
BackupRegisters(); BackupRegisters();

View File

@@ -122,18 +122,17 @@ typedef enum ScanStep {
} ScanStep; } ScanStep;
typedef struct SpectrumSettings { typedef struct SpectrumSettings {
uint32_t frequencyChangeStep;
StepsCount stepsCount; StepsCount stepsCount;
ScanStep scanStepIndex; ScanStep scanStepIndex;
uint32_t frequencyChangeStep;
uint16_t scanDelay; uint16_t scanDelay;
uint16_t rssiTriggerLevel; uint16_t rssiTriggerLevel;
bool backlightState;
BK4819_FilterBandwidth_t bw; BK4819_FilterBandwidth_t bw;
BK4819_FilterBandwidth_t listenBw; BK4819_FilterBandwidth_t listenBw;
ModulationType modulationType;
int dbMin; int dbMin;
int dbMax; int dbMax;
ModulationType modulationType;
bool backlightState;
} SpectrumSettings; } SpectrumSettings;
typedef struct KeyboardState { typedef struct KeyboardState {
@@ -161,8 +160,8 @@ typedef struct RegisterSpec {
typedef struct PeakInfo { typedef struct PeakInfo {
uint16_t t; uint16_t t;
uint16_t rssi; uint16_t rssi;
uint8_t i;
uint32_t f; uint32_t f;
uint8_t i;
} PeakInfo; } PeakInfo;
void APP_RunSpectrum(void); void APP_RunSpectrum(void);

View File

@@ -48,7 +48,7 @@ typedef struct {
} Header_t; } Header_t;
typedef struct { typedef struct {
uint8_t Padding[2]; uint8_t Padding[2];
uint16_t ID; uint16_t ID;
} Footer_t; } Footer_t;
@@ -60,10 +60,10 @@ typedef struct {
typedef struct { typedef struct {
Header_t Header; Header_t Header;
struct { struct {
char Version[16]; char Version[16];
bool bHasCustomAesKey; bool bHasCustomAesKey;
bool bIsInLockScreen; bool bIsInLockScreen;
uint8_t Padding[2]; uint8_t Padding[2];
uint32_t Challenge[4]; uint32_t Challenge[4];
} Data; } Data;
} REPLY_0514_t; } REPLY_0514_t;
@@ -71,8 +71,8 @@ typedef struct {
typedef struct { typedef struct {
Header_t Header; Header_t Header;
uint16_t Offset; uint16_t Offset;
uint8_t Size; uint8_t Size;
uint8_t Padding; uint8_t Padding;
uint32_t Timestamp; uint32_t Timestamp;
} CMD_051B_t; } CMD_051B_t;
@@ -80,19 +80,19 @@ typedef struct {
Header_t Header; Header_t Header;
struct { struct {
uint16_t Offset; uint16_t Offset;
uint8_t Size; uint8_t Size;
uint8_t Padding; uint8_t Padding;
uint8_t Data[128]; uint8_t Data[128];
} Data; } Data;
} REPLY_051B_t; } REPLY_051B_t;
typedef struct { typedef struct {
Header_t Header; Header_t Header;
uint16_t Offset; uint16_t Offset;
uint8_t Size; uint8_t Size;
bool bAllowPassword; bool bAllowPassword;
uint32_t Timestamp; uint32_t Timestamp;
uint8_t Data[0]; uint8_t Data[0];
} CMD_051D_t; } CMD_051D_t;
typedef struct { typedef struct {
@@ -106,8 +106,8 @@ typedef struct {
Header_t Header; Header_t Header;
struct { struct {
uint16_t RSSI; uint16_t RSSI;
uint8_t ExNoiseIndicator; uint8_t ExNoiseIndicator;
uint8_t GlitchIndicator; uint8_t GlitchIndicator;
} Data; } Data;
} REPLY_0527_t; } REPLY_0527_t;
@@ -137,7 +137,10 @@ typedef struct {
uint32_t Timestamp; uint32_t Timestamp;
} CMD_052F_t; } CMD_052F_t;
static const uint8_t Obfuscation[16] = { 0x16, 0x6C, 0x14, 0xE6, 0x2E, 0x91, 0x0D, 0x40, 0x21, 0x35, 0xD5, 0x40, 0x13, 0x03, 0xE9, 0x80 }; static const uint8_t Obfuscation[16] =
{
0x16, 0x6C, 0x14, 0xE6, 0x2E, 0x91, 0x0D, 0x40, 0x21, 0x35, 0xD5, 0x40, 0x13, 0x03, 0xE9, 0x80
};
static union static union
{ {
@@ -157,12 +160,11 @@ static void SendReply(void *pReply, uint16_t Size)
{ {
Header_t Header; Header_t Header;
Footer_t Footer; Footer_t Footer;
uint8_t *pBytes;
uint16_t i;
if (bIsEncrypted) if (bIsEncrypted)
{ {
pBytes = (uint8_t *)pReply; uint8_t *pBytes = (uint8_t *)pReply;
unsigned int i;
for (i = 0; i < Size; i++) for (i = 0; i < Size; i++)
pBytes[i] ^= Obfuscation[i % 16]; pBytes[i] ^= Obfuscation[i % 16];
} }
@@ -171,6 +173,7 @@ static void SendReply(void *pReply, uint16_t Size)
Header.Size = Size; Header.Size = Size;
UART_Send(&Header, sizeof(Header)); UART_Send(&Header, sizeof(Header));
UART_Send(pReply, Size); UART_Send(pReply, Size);
if (bIsEncrypted) if (bIsEncrypted)
{ {
Footer.Padding[0] = Obfuscation[(Size + 0) % 16] ^ 0xFF; Footer.Padding[0] = Obfuscation[(Size + 0) % 16] ^ 0xFF;
@@ -205,14 +208,16 @@ static void SendVersion(void)
static bool IsBadChallenge(const uint32_t *pKey, const uint32_t *pIn, const uint32_t *pResponse) static bool IsBadChallenge(const uint32_t *pKey, const uint32_t *pIn, const uint32_t *pResponse)
{ {
uint8_t i; unsigned int i;
uint32_t IV[4]; uint32_t IV[4];
IV[0] = 0; IV[0] = 0;
IV[1] = 0; IV[1] = 0;
IV[2] = 0; IV[2] = 0;
IV[3] = 0; IV[3] = 0;
AES_Encrypt(pKey, IV, pIn, IV, true); AES_Encrypt(pKey, IV, pIn, IV, true);
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
if (IV[i] != pResponse[i]) if (IV[i] != pResponse[i])
return true; return true;
@@ -230,8 +235,7 @@ static void CMD_0514(const uint8_t *pBuffer)
gFmRadioCountdown_500ms = fm_radio_countdown_500ms; gFmRadioCountdown_500ms = fm_radio_countdown_500ms;
#endif #endif
gSerialConfigCountDown_500ms = 6; // 3 sec gSerialConfigCountDown_500ms = 12; // 6 sec
gSerialConfigCountDown_done = false;
// turn the LCD backlight off // turn the LCD backlight off
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT);
@@ -248,18 +252,17 @@ static void CMD_051B(const uint8_t *pBuffer)
if (pCmd->Timestamp != Timestamp) if (pCmd->Timestamp != Timestamp)
return; return;
gSerialConfigCountDown_500ms = 6; // 3 sec gSerialConfigCountDown_500ms = 12; // 6 sec
gSerialConfigCountDown_done = false;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
gFmRadioCountdown_500ms = fm_radio_countdown_500ms; gFmRadioCountdown_500ms = fm_radio_countdown_500ms;
#endif #endif
memset(&Reply, 0, sizeof(Reply)); memset(&Reply, 0, sizeof(Reply));
Reply.Header.ID = 0x051C; Reply.Header.ID = 0x051C;
Reply.Header.Size = pCmd->Size + 4; Reply.Header.Size = pCmd->Size + 4;
Reply.Data.Offset = pCmd->Offset; Reply.Data.Offset = pCmd->Offset;
Reply.Data.Size = pCmd->Size; Reply.Data.Size = pCmd->Size;
if (bHasCustomAesKey) if (bHasCustomAesKey)
bLocked = gIsLocked; bLocked = gIsLocked;
@@ -280,9 +283,8 @@ static void CMD_051D(const uint8_t *pBuffer)
if (pCmd->Timestamp != Timestamp) if (pCmd->Timestamp != Timestamp)
return; return;
gSerialConfigCountDown_500ms = 6; // 3 sec gSerialConfigCountDown_500ms = 12; // 6 sec
gSerialConfigCountDown_done = false;
bReloadEeprom = false; bReloadEeprom = false;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -297,7 +299,7 @@ static void CMD_051D(const uint8_t *pBuffer)
if (!bIsLocked) if (!bIsLocked)
{ {
uint16_t i; unsigned int i;
for (i = 0; i < (pCmd->Size / 8); i++) for (i = 0; i < (pCmd->Size / 8); i++)
{ {
const uint16_t Offset = pCmd->Offset + (i * 8U); const uint16_t Offset = pCmd->Offset + (i * 8U);
@@ -334,23 +336,25 @@ static void CMD_0529(void)
{ {
REPLY_0529_t Reply; REPLY_0529_t Reply;
Reply.Header.ID = 0x52A; Reply.Header.ID = 0x52A;
Reply.Header.Size = sizeof(Reply.Data); Reply.Header.Size = sizeof(Reply.Data);
// Original doesn't actually send current! // Original doesn't actually send current!
BOARD_ADC_GetBatteryInfo(&Reply.Data.Voltage, &Reply.Data.Current); BOARD_ADC_GetBatteryInfo(&Reply.Data.Voltage, &Reply.Data.Current);
SendReply(&Reply, sizeof(Reply)); SendReply(&Reply, sizeof(Reply));
} }
static void CMD_052D(const uint8_t *pBuffer) static void CMD_052D(const uint8_t *pBuffer)
{ {
const CMD_052D_t *pCmd = (const CMD_052D_t *)pBuffer; const CMD_052D_t *pCmd = (const CMD_052D_t *)pBuffer;
REPLY_052D_t Reply; REPLY_052D_t Reply;
bool bIsLocked; bool bIsLocked;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
gFmRadioCountdown_500ms = fm_radio_countdown_500ms; gFmRadioCountdown_500ms = fm_radio_countdown_500ms;
#endif #endif
Reply.Header.ID = 0x052E; Reply.Header.ID = 0x052E;
Reply.Header.Size = sizeof(Reply.Data); Reply.Header.Size = sizeof(Reply.Data);
bIsLocked = bHasCustomAesKey; bIsLocked = bHasCustomAesKey;
@@ -388,7 +392,7 @@ static void CMD_052F(const uint8_t *pBuffer)
gEeprom.DUAL_WATCH = DUAL_WATCH_OFF; gEeprom.DUAL_WATCH = DUAL_WATCH_OFF;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
gEeprom.RX_CHANNEL = 0; gEeprom.RX_VFO = 0;
gEeprom.DTMF_SIDE_TONE = false; gEeprom.DTMF_SIDE_TONE = false;
gEeprom.VfoInfo[0].FrequencyReverse = false; gEeprom.VfoInfo[0].FrequencyReverse = false;
gEeprom.VfoInfo[0].pRX = &gEeprom.VfoInfo[0].freq_config_RX; gEeprom.VfoInfo[0].pRX = &gEeprom.VfoInfo[0].freq_config_RX;
@@ -404,8 +408,7 @@ static void CMD_052F(const uint8_t *pBuffer)
if (gCurrentFunction == FUNCTION_POWER_SAVE) if (gCurrentFunction == FUNCTION_POWER_SAVE)
FUNCTION_Select(FUNCTION_FOREGROUND); FUNCTION_Select(FUNCTION_FOREGROUND);
gSerialConfigCountDown_500ms = 6; // 3 sec gSerialConfigCountDown_500ms = 12; // 6 sec
gSerialConfigCountDown_done = false;
Timestamp = pCmd->Timestamp; Timestamp = pCmd->Timestamp;
@@ -417,15 +420,13 @@ static void CMD_052F(const uint8_t *pBuffer)
bool UART_IsCommandAvailable(void) bool UART_IsCommandAvailable(void)
{ {
uint16_t DmaLength;
uint16_t CommandLength;
uint16_t Index; uint16_t Index;
uint16_t TailIndex; uint16_t TailIndex;
uint16_t Size; uint16_t Size;
uint16_t CRC; uint16_t CRC;
uint16_t i; uint16_t CommandLength;
uint16_t DmaLength = DMA_CH0->ST & 0xFFFU;
DmaLength = DMA_CH0->ST & 0xFFFU;
while (1) while (1)
{ {
if (gUART_WriteIndex == DmaLength) if (gUART_WriteIndex == DmaLength)
@@ -454,7 +455,7 @@ bool UART_IsCommandAvailable(void)
Index = DMA_INDEX(gUART_WriteIndex, 2); Index = DMA_INDEX(gUART_WriteIndex, 2);
Size = (UART_DMA_Buffer[DMA_INDEX(Index, 1)] << 8) | UART_DMA_Buffer[Index]; Size = (UART_DMA_Buffer[DMA_INDEX(Index, 1)] << 8) | UART_DMA_Buffer[Index];
if ((Size + 8) > sizeof(UART_DMA_Buffer)) if ((Size + 8u) > sizeof(UART_DMA_Buffer))
{ {
gUART_WriteIndex = DmaLength; gUART_WriteIndex = DmaLength;
return false; return false;
@@ -499,9 +500,12 @@ bool UART_IsCommandAvailable(void)
bIsEncrypted = true; bIsEncrypted = true;
if (bIsEncrypted) if (bIsEncrypted)
for (i = 0; i < Size + 2; i++) {
unsigned int i;
for (i = 0; i < (Size + 2u); i++)
UART_Command.Buffer[i] ^= Obfuscation[i % 16]; UART_Command.Buffer[i] ^= Obfuscation[i % 16];
}
CRC = UART_Command.Buffer[Size] | (UART_Command.Buffer[Size + 1] << 8); CRC = UART_Command.Buffer[Size] | (UART_Command.Buffer[Size + 1] << 8);
return (CRC_Calculate(UART_Command.Buffer, Size) != CRC) ? false : true; return (CRC_Calculate(UART_Command.Buffer, Size) != CRC) ? false : true;

51
audio.c
View File

@@ -149,14 +149,14 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
SYSTEM_DelayMs(60); SYSTEM_DelayMs(60);
BK4819_EnterTxMute(); BK4819_EnterTxMute();
SYSTEM_DelayMs(20); SYSTEM_DelayMs(20);
[[fallthrough]];
case BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL: case BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL:
case BEEP_500HZ_60MS_DOUBLE_BEEP: case BEEP_500HZ_60MS_DOUBLE_BEEP:
BK4819_ExitTxMute(); BK4819_ExitTxMute();
SYSTEM_DelayMs(60); SYSTEM_DelayMs(60);
BK4819_EnterTxMute(); BK4819_EnterTxMute();
SYSTEM_DelayMs(20); SYSTEM_DelayMs(20);
[[fallthrough]];
case BEEP_1KHZ_60MS_OPTIONAL: case BEEP_1KHZ_60MS_OPTIONAL:
BK4819_ExitTxMute(); BK4819_ExitTxMute();
Duration = 60; Duration = 60;
@@ -187,7 +187,9 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gVoxResumeCountdown = 80; #ifdef ENABLE_VOX
gVoxResumeCountdown = 80;
#endif
SYSTEM_DelayMs(5); SYSTEM_DelayMs(5);
BK4819_TurnsOffTones_TurnsOnRX(); BK4819_TurnsOffTones_TurnsOnRX();
@@ -258,7 +260,9 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
VoiceID += VOICE_ID_ENG_BASE; VoiceID += VOICE_ID_ENG_BASE;
} }
if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) if (gCurrentFunction == FUNCTION_RECEIVE ||
gCurrentFunction == FUNCTION_MONITOR ||
gCurrentFunction == FUNCTION_INCOMING) // 1of11
BK4819_SetAF(BK4819_AF_MUTE); BK4819_SetAF(BK4819_AF_MUTE);
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -267,7 +271,11 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
#endif #endif
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gVoxResumeCountdown = 2000;
#ifdef ENABLE_VOX
gVoxResumeCountdown = 2000;
#endif
SYSTEM_DelayMs(5); SYSTEM_DelayMs(5);
AUDIO_PlayVoice(VoiceID); AUDIO_PlayVoice(VoiceID);
@@ -278,13 +286,10 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
{ {
SYSTEM_DelayMs(Delay * 10); SYSTEM_DelayMs(Delay * 10);
if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) if (gCurrentFunction == FUNCTION_RECEIVE ||
{ gCurrentFunction == FUNCTION_MONITOR ||
if (gRxVfo->AM_mode) gCurrentFunction == FUNCTION_INCOMING) // 1of11
BK4819_SetAF(BK4819_AF_AM); BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM);
else
BK4819_SetAF(BK4819_AF_OPEN);
}
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFmRadioMode) if (gFmRadioMode)
@@ -296,7 +301,11 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
gVoiceWriteIndex = 0; gVoiceWriteIndex = 0;
gVoiceReadIndex = 0; gVoiceReadIndex = 0;
gVoxResumeCountdown = 80;
#ifdef ENABLE_VOX
gVoxResumeCountdown = 80;
#endif
return; return;
} }
@@ -409,14 +418,19 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
gCountdownToPlayNextVoice_10ms = Delay; gCountdownToPlayNextVoice_10ms = Delay;
gFlagPlayQueuedVoice = false; gFlagPlayQueuedVoice = false;
gVoxResumeCountdown = 2000;
#ifdef ENABLE_VOX
gVoxResumeCountdown = 2000;
#endif
return; return;
} }
} }
if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) if (gCurrentFunction == FUNCTION_RECEIVE ||
BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_OPEN); gCurrentFunction == FUNCTION_MONITOR ||
gCurrentFunction == FUNCTION_INCOMING) // 1of11
BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM);
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFmRadioMode) if (gFmRadioMode)
@@ -426,7 +440,10 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
if (!gEnableSpeaker) if (!gEnableSpeaker)
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gVoxResumeCountdown = 80; #ifdef ENABLE_VOX
gVoxResumeCountdown = 80;
#endif
gVoiceWriteIndex = 0; gVoiceWriteIndex = 0;
gVoiceReadIndex = 0; gVoiceReadIndex = 0;
} }

160
bitmaps.c
View File

@@ -4,7 +4,7 @@
// all these images are on their right sides // all these images are on their right sides
// turn your monitor 90-deg anti-clockwise to see the images // turn your monitor 90-deg anti-clockwise to see the images
const uint8_t BITMAP_PowerSave[8] = const uint8_t BITMAP_POWERSAVE[8] =
{ {
#if 0 #if 0
// "S" // "S"
@@ -29,6 +29,30 @@ const uint8_t BITMAP_PowerSave[8] =
#endif #endif
}; };
const uint8_t BITMAP_TX[8] =
{ // "TX"
0b00000000,
0b00000001,
0b00000001,
0b01111111,
0b00000001,
0b00000001,
0b00000000,
0b00000000
};
const uint8_t BITMAP_RX[8] =
{ // "RX"
0b00000000,
0b01111111,
0b00001001,
0b00011001,
0b01100110,
0b00000000,
0b00000000,
0b00000000
};
const uint8_t BITMAP_BatteryLevel[2] = const uint8_t BITMAP_BatteryLevel[2] =
{ {
0b01011101, 0b01011101,
@@ -114,27 +138,29 @@ const uint8_t BITMAP_F_Key[6] =
0b01000001 0b01000001
}; };
const uint8_t BITMAP_VOX[18] = #ifdef ENABLE_VOX
{ // "VOX" const uint8_t BITMAP_VOX[18] =
0b00000000, { // "VOX"
0b00011111, 0b00000000,
0b00100000, 0b00011111,
0b01000000, 0b00100000,
0b00100000, 0b01000000,
0b00011111, 0b00100000,
0b00000000, 0b00011111,
0b00111110, 0b00000000,
0b01000001, 0b00111110,
0b01000001, 0b01000001,
0b01000001, 0b01000001,
0b00111110, 0b01000001,
0b00000000, 0b00111110,
0b01100011, 0b00000000,
0b00010100, 0b01100011,
0b00001000, 0b00010100,
0b00010100, 0b00001000,
0b01100011 0b00010100,
}; 0b01100011
};
#endif
#if 0 #if 0
const uint8_t BITMAP_WX[12] = const uint8_t BITMAP_WX[12] =
@@ -171,26 +197,27 @@ const uint8_t BITMAP_VOX[18] =
}; };
#endif #endif
const uint8_t BITMAP_TDR1[12] = const uint8_t BITMAP_TDR1[15] =
{ // "DW" { // "DWR"
0b00000000,
0b01111111, 0b01111111,
0b01000001, 0b01000001,
0b01000001, 0b01000001,
0b01000001,
0b00111110, 0b00111110,
0b00000000, 0b00000000,
0b01111111, 0b01111111,
0b00100000, 0b00100000,
0b00011000, 0b00011000,
0b00100000, 0b00100000,
0b01111111 0b01111111,
0b00000000,
0b01111111,
0b00011001,
0b00101001,
0b01000110
}; };
const uint8_t BITMAP_TDR2[12] = const uint8_t BITMAP_TDR2[9] =
{ // "><" .. DW on hold { // "><" .. DW on hold
0b00000000,
0b00000000,
0b00100010, 0b00100010,
0b00110110, 0b00110110,
0b00011100, 0b00011100,
@@ -200,7 +227,6 @@ const uint8_t BITMAP_TDR2[12] =
0b00011100, 0b00011100,
0b00110110, 0b00110110,
0b00100010, 0b00100010,
0b00000000
}; };
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -218,27 +244,8 @@ const uint8_t BITMAP_TDR2[12] =
}; };
#endif #endif
#ifdef ENABLE_FMRADIO
const uint8_t BITMAP_FM[12] =
{ // "FM"
0b00000000,
0b01111111,
0b00001001,
0b00001001,
0b00001001,
0b00000001,
0b00000000,
0b01111111,
0b00000010,
0b00001100,
0b00000010,
0b01111111
};
#endif
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
const uint8_t BITMAP_NOAA[12] = const uint8_t BITMAP_NOAA[11] =
{ // "NS" { // "NS"
0b00000000, 0b00000000,
0b01111111, 0b01111111,
@@ -246,33 +253,14 @@ const uint8_t BITMAP_TDR2[12] =
0b00001000, 0b00001000,
0b00010000, 0b00010000,
0b01111111, 0b01111111,
0b00000000, 0b00000000,
0b01000110, 0b01000110,
0b01001001, 0b01001001,
0b01001001, 0b01001001,
0b01001001,
0b00110001 0b00110001
}; };
#endif #endif
const uint8_t BITMAP_SC[12] =
{ // "SC"
0b00000000,
0b01000110,
0b01001001,
0b01001001,
0b01001001,
0b00110001,
0b00000000,
0b00111110,
0b01000001,
0b01000001,
0b01000001,
0b00100010
};
const uint8_t BITMAP_Antenna[5] = const uint8_t BITMAP_Antenna[5] =
{ {
0b00000011, 0b00000011,
@@ -359,17 +347,7 @@ const uint8_t BITMAP_VFO_NotDefault[8] =
0b00010100, 0b00010100,
0b00001000 0b00001000
}; };
/*
const uint8_t BITMAP_ScanList[6] =
{ // diamond symbol
0b00001000,
0b00011100,
0b00111110,
0b00111110,
0b00011100,
0b00001000
};
*/
const uint8_t BITMAP_ScanList1[6] = const uint8_t BITMAP_ScanList1[6] =
{ // 'I' symbol { // 'I' symbol
0b00000000, 0b00000000,
@@ -390,14 +368,12 @@ const uint8_t BITMAP_ScanList2[6] =
0b01000010 0b01000010
}; };
#ifdef ENABLE_COMPANDER const uint8_t BITMAP_compand[6] =
const uint8_t BITMAP_compand[6] = {
{ 0b00000000,
0b00000000, 0b00111100,
0b00111100, 0b01000010,
0b01000010, 0b01000010,
0b01000010, 0b01000010,
0b01000010, 0b00100100
0b00100100 };
};
#endif

View File

@@ -4,7 +4,9 @@
#include <stdint.h> #include <stdint.h>
extern const uint8_t BITMAP_PowerSave[8]; extern const uint8_t BITMAP_POWERSAVE[8];
extern const uint8_t BITMAP_TX[8];
extern const uint8_t BITMAP_RX[8];
extern const uint8_t BITMAP_BatteryLevel[2]; extern const uint8_t BITMAP_BatteryLevel[2];
extern const uint8_t BITMAP_BatteryLevel1[17]; extern const uint8_t BITMAP_BatteryLevel1[17];
@@ -19,31 +21,23 @@ extern const uint8_t BITMAP_KeyLock[6];
extern const uint8_t BITMAP_F_Key[6]; extern const uint8_t BITMAP_F_Key[6];
extern const uint8_t BITMAP_VOX[18]; #ifdef ENABLE_VOX
extern const uint8_t BITMAP_VOX[18];
#if 0
extern const uint8_t BITMAP_WX[12];
#else
extern const uint8_t BITMAP_XB[12];
#endif #endif
extern const uint8_t BITMAP_TDR1[12]; extern const uint8_t BITMAP_XB[12];
extern const uint8_t BITMAP_TDR2[12];
extern const uint8_t BITMAP_TDR1[15];
extern const uint8_t BITMAP_TDR2[9];
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
extern const uint8_t BITMAP_VoicePrompt[9]; extern const uint8_t BITMAP_VoicePrompt[9];
#endif #endif
#ifdef ENABLE_FMRADIO
extern const uint8_t BITMAP_FM[12];
#endif
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
extern const uint8_t BITMAP_NOAA[12]; extern const uint8_t BITMAP_NOAA[11];
#endif #endif
extern const uint8_t BITMAP_SC[12];
extern const uint8_t BITMAP_Antenna[5]; extern const uint8_t BITMAP_Antenna[5];
extern const uint8_t BITMAP_AntennaLevel1[3]; extern const uint8_t BITMAP_AntennaLevel1[3];
extern const uint8_t BITMAP_AntennaLevel2[3]; extern const uint8_t BITMAP_AntennaLevel2[3];
@@ -57,13 +51,10 @@ extern const uint8_t BITMAP_MARKER[8];
extern const uint8_t BITMAP_VFO_Default[8]; extern const uint8_t BITMAP_VFO_Default[8];
extern const uint8_t BITMAP_VFO_NotDefault[8]; extern const uint8_t BITMAP_VFO_NotDefault[8];
//extern const uint8_t BITMAP_ScanList[6];
extern const uint8_t BITMAP_ScanList1[6]; extern const uint8_t BITMAP_ScanList1[6];
extern const uint8_t BITMAP_ScanList2[6]; extern const uint8_t BITMAP_ScanList2[6];
#ifdef ENABLE_COMPANDER extern const uint8_t BITMAP_compand[6];
extern const uint8_t BITMAP_compand[6];
#endif
#endif #endif

36
board.c
View File

@@ -509,7 +509,7 @@ void BOARD_Init(void)
BOARD_PORTCON_Init(); BOARD_PORTCON_Init();
BOARD_GPIO_Init(); BOARD_GPIO_Init();
BOARD_ADC_Init(); BOARD_ADC_Init();
ST7565_Init(); ST7565_Init(true);
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
BK1080_Init(0, false); BK1080_Init(0, false);
#endif #endif
@@ -532,8 +532,10 @@ void BOARD_EEPROM_Init(void)
gEeprom.NOAA_AUTO_SCAN = (Data[3] < 2) ? Data[3] : false; gEeprom.NOAA_AUTO_SCAN = (Data[3] < 2) ? Data[3] : false;
#endif #endif
gEeprom.KEY_LOCK = (Data[4] < 2) ? Data[4] : false; gEeprom.KEY_LOCK = (Data[4] < 2) ? Data[4] : false;
gEeprom.VOX_SWITCH = (Data[5] < 2) ? Data[5] : false; #ifdef ENABLE_VOX
gEeprom.VOX_LEVEL = (Data[6] < 10) ? Data[6] : 1; gEeprom.VOX_SWITCH = (Data[5] < 2) ? Data[5] : false;
gEeprom.VOX_LEVEL = (Data[6] < 10) ? Data[6] : 1;
#endif
gEeprom.MIC_SENSITIVITY = (Data[7] < 5) ? Data[7] : 4; gEeprom.MIC_SENSITIVITY = (Data[7] < 5) ? Data[7] : 4;
// 0E78..0E7F // 0E78..0E7F
@@ -614,7 +616,7 @@ void BOARD_EEPROM_Init(void)
#endif #endif
gEeprom.ROGER = (Data[1] < 3) ? Data[1] : ROGER_MODE_OFF; gEeprom.ROGER = (Data[1] < 3) ? Data[1] : ROGER_MODE_OFF;
gEeprom.REPEATER_TAIL_TONE_ELIMINATION = (Data[2] < 11) ? Data[2] : 0; gEeprom.REPEATER_TAIL_TONE_ELIMINATION = (Data[2] < 11) ? Data[2] : 0;
gEeprom.TX_CHANNEL = (Data[3] < 2) ? Data[3] : 0; gEeprom.TX_VFO = (Data[3] < 2) ? Data[3] : 0;
// 0ED0..0ED7 // 0ED0..0ED7
EEPROM_ReadBuffer(0x0ED0, Data, 8); EEPROM_ReadBuffer(0x0ED0, Data, 8);
@@ -622,7 +624,7 @@ void BOARD_EEPROM_Init(void)
gEeprom.DTMF_SEPARATE_CODE = DTMF_ValidateCodes((char *)(Data + 1), 1) ? Data[1] : '*'; gEeprom.DTMF_SEPARATE_CODE = DTMF_ValidateCodes((char *)(Data + 1), 1) ? Data[1] : '*';
gEeprom.DTMF_GROUP_CALL_CODE = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#'; gEeprom.DTMF_GROUP_CALL_CODE = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#';
gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : 0; gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : 0;
gEeprom.DTMF_AUTO_RESET_TIME = (Data[4] < 61) ? Data[4] : 5; gEeprom.DTMF_auto_reset_time = (Data[4] < 61) ? Data[4] : (Data[4] >= 5) ? Data[4] : 10;
gEeprom.DTMF_PRELOAD_TIME = (Data[5] < 101) ? Data[5] * 10 : 300; gEeprom.DTMF_PRELOAD_TIME = (Data[5] < 101) ? Data[5] * 10 : 300;
gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 100; gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 100;
gEeprom.DTMF_HASH_CODE_PERSIST_TIME = (Data[7] < 101) ? Data[7] * 10 : 100; gEeprom.DTMF_HASH_CODE_PERSIST_TIME = (Data[7] < 101) ? Data[7] * 10 : 100;
@@ -685,7 +687,8 @@ void BOARD_EEPROM_Init(void)
// 0F18..0F1F // 0F18..0F1F
EEPROM_ReadBuffer(0x0F18, Data, 8); EEPROM_ReadBuffer(0x0F18, Data, 8);
gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 2) ? Data[0] : false; // gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 2) ? Data[0] : false;
gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 3) ? Data[0] : false; // we now have 'all' channel scan option
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
const unsigned int j = 1 + (i * 3); const unsigned int j = 1 + (i * 3);
@@ -705,13 +708,14 @@ void BOARD_EEPROM_Init(void)
gSetting_ScrambleEnable = (Data[6] < 2) ? Data[6] : true; gSetting_ScrambleEnable = (Data[6] < 2) ? Data[6] : true;
gSetting_TX_EN = (Data[7] & (1u << 0)) ? true : false; gSetting_TX_EN = (Data[7] & (1u << 0)) ? true : false;
gSetting_live_DTMF_decoder = (Data[7] & (1u << 1)) ? true : false; gSetting_live_DTMF_decoder = (Data[7] & (1u << 1)) ? true : false;
gSetting_battery_text = (((Data[7] >> 2) & 3u) <= 2) ? (Data[7] >> 2) & 3: 2; gSetting_battery_text = (((Data[7] >> 2) & 3u) <= 2) ? (Data[7] >> 2) & 3 : 2;
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
gSetting_mic_bar = (Data[7] & (1u << 4)) ? true : false; gSetting_mic_bar = (Data[7] & (1u << 4)) ? true : false;
#endif #endif
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
gSetting_AM_fix = (Data[7] & (1u << 5)) ? true : false; gSetting_AM_fix = (Data[7] & (1u << 5)) ? true : false;
#endif #endif
gSetting_backlight_on_tx_rx = (Data[7] >> 6) & 3u;
if (!gEeprom.VFO_OPEN) if (!gEeprom.VFO_OPEN)
{ {
@@ -735,14 +739,14 @@ void BOARD_EEPROM_Init(void)
} }
} }
void BOARD_EEPROM_LoadMoreSettings(void) void BOARD_EEPROM_LoadCalibration(void)
{ {
// uint8_t Mic; // uint8_t Mic;
EEPROM_ReadBuffer(0x1EC0, gEEPROM_1EC0_0, 8); EEPROM_ReadBuffer(0x1EC0, gEEPROM_RSSI_CALIB[3], 8);
memmove(gEEPROM_1EC0_1, gEEPROM_1EC0_0, 8); memcpy(gEEPROM_RSSI_CALIB[4], gEEPROM_RSSI_CALIB[3], 8);
memmove(gEEPROM_1EC0_2, gEEPROM_1EC0_0, 8); memcpy(gEEPROM_RSSI_CALIB[5], gEEPROM_RSSI_CALIB[3], 8);
memmove(gEEPROM_1EC0_3, gEEPROM_1EC0_0, 8); memcpy(gEEPROM_RSSI_CALIB[6], gEEPROM_RSSI_CALIB[3], 8);
// 8 * 16-bit values // 8 * 16-bit values
EEPROM_ReadBuffer(0x1EC0, gEEPROM_RSSI_CALIB[0], 8); EEPROM_ReadBuffer(0x1EC0, gEEPROM_RSSI_CALIB[0], 8);
@@ -756,9 +760,11 @@ void BOARD_EEPROM_LoadMoreSettings(void)
} }
gBatteryCalibration[5] = 2300; gBatteryCalibration[5] = 2300;
EEPROM_ReadBuffer(0x1F50 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX1_THRESHOLD, 2); #ifdef ENABLE_VOX
EEPROM_ReadBuffer(0x1F68 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX0_THRESHOLD, 2); EEPROM_ReadBuffer(0x1F50 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX1_THRESHOLD, 2);
EEPROM_ReadBuffer(0x1F68 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX0_THRESHOLD, 2);
#endif
//EEPROM_ReadBuffer(0x1F80 + gEeprom.MIC_SENSITIVITY, &Mic, 1); //EEPROM_ReadBuffer(0x1F80 + gEeprom.MIC_SENSITIVITY, &Mic, 1);
//gEeprom.MIC_SENSITIVITY_TUNING = (Mic < 32) ? Mic : 15; //gEeprom.MIC_SENSITIVITY_TUNING = (Mic < 32) ? Mic : 15;
gEeprom.MIC_SENSITIVITY_TUNING = gMicGain_dB2[gEeprom.MIC_SENSITIVITY]; gEeprom.MIC_SENSITIVITY_TUNING = gMicGain_dB2[gEeprom.MIC_SENSITIVITY];

View File

@@ -27,7 +27,7 @@ void BOARD_ADC_Init(void);
void BOARD_ADC_GetBatteryInfo(uint16_t *pVoltage, uint16_t *pCurrent); void BOARD_ADC_GetBatteryInfo(uint16_t *pVoltage, uint16_t *pCurrent);
void BOARD_Init(void); void BOARD_Init(void);
void BOARD_EEPROM_Init(void); void BOARD_EEPROM_Init(void);
void BOARD_EEPROM_LoadMoreSettings(void); void BOARD_EEPROM_LoadCalibration(void);
uint32_t BOARD_fetchChannelFrequency(const int channel); uint32_t BOARD_fetchChannelFrequency(const int channel);
void BOARD_fetchChannelName(char *s, const int channel); void BOARD_fetchChannelName(char *s, const int channel);
void BOARD_FactoryReset(bool bIsAll); void BOARD_FactoryReset(bool bIsAll);

2
compile-with-docker.sh Normal file → Executable file
View File

@@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
docker build -t uvk5 . docker build -t uvk5 .
docker run -v $(PWD)/compiled-firmware:/app/compiled-firmware uvk5 /bin/bash -c "cd /app && make && cp firmware* compiled-firmware/" docker run -v ${PWD}/compiled-firmware:/app/compiled-firmware uvk5 /bin/bash -c "cd /app && make && cp firmware* compiled-firmware/"

View File

@@ -134,9 +134,9 @@ void ADC_Configure(ADC_Config_t *pAdc)
; ;
if (SARADC_IE == 0) { if (SARADC_IE == 0) {
NVIC_DisableIRQ(DP32_SARADC_IRQn); NVIC_DisableIRQ((IRQn_Type)DP32_SARADC_IRQn);
} else { } else {
NVIC_EnableIRQ(DP32_SARADC_IRQn); NVIC_EnableIRQ((IRQn_Type)DP32_SARADC_IRQn);
} }
} }

View File

@@ -42,8 +42,10 @@ enum ADC_CH_MASK {
typedef enum ADC_CH_MASK ADC_CH_MASK; typedef enum ADC_CH_MASK ADC_CH_MASK;
typedef struct { typedef struct {
uint8_t CLK_SEL; uint16_t EXTTRIG_SEL;
uint16_t IE_CHx_EOC;
ADC_CH_MASK CH_SEL; ADC_CH_MASK CH_SEL;
uint8_t CLK_SEL;
uint8_t AVG; uint8_t AVG;
uint8_t CONT; uint8_t CONT;
uint8_t MEM_MODE; uint8_t MEM_MODE;
@@ -51,13 +53,12 @@ typedef struct {
uint8_t SMPL_SETUP; uint8_t SMPL_SETUP;
uint8_t SMPL_WIN; uint8_t SMPL_WIN;
uint8_t ADC_TRIG; uint8_t ADC_TRIG;
uint16_t EXTTRIG_SEL;
bool CALIB_OFFSET_VALID;
bool CALIB_KD_VALID;
uint8_t DMA_EN; uint8_t DMA_EN;
uint16_t IE_CHx_EOC;
uint8_t IE_FIFO_HFULL; uint8_t IE_FIFO_HFULL;
uint8_t IE_FIFO_FULL; uint8_t IE_FIFO_FULL;
bool CALIB_OFFSET_VALID;
bool CALIB_KD_VALID;
uint8_t _pad[1];
} ADC_Config_t; } ADC_Config_t;
uint8_t ADC_GetChannelNumber(ADC_CH_MASK Mask); uint8_t ADC_GetChannelNumber(ADC_CH_MASK Mask);

View File

@@ -24,6 +24,8 @@ static void AES_Setup_ENC_CBC(bool IsDecrypt, const void *pKey, const void *pIv)
const uint32_t *pK = (const uint32_t *)pKey; const uint32_t *pK = (const uint32_t *)pKey;
const uint32_t *pI = (const uint32_t *)pIv; const uint32_t *pI = (const uint32_t *)pIv;
(void)IsDecrypt; // unused
AES_CR = (AES_CR & ~AES_CR_EN_MASK) | AES_CR_EN_BITS_DISABLE; AES_CR = (AES_CR & ~AES_CR_EN_MASK) | AES_CR_EN_BITS_DISABLE;
AES_CR = AES_CR_CHMOD_BITS_CBC; AES_CR = AES_CR_CHMOD_BITS_CBC;
AES_KEYR3 = pK[0]; AES_KEYR3 = pK[0];

File diff suppressed because it is too large Load Diff

View File

@@ -24,22 +24,22 @@
enum BK4819_AF_Type_t enum BK4819_AF_Type_t
{ {
BK4819_AF_MUTE = 0u, BK4819_AF_MUTE = 0u, //
BK4819_AF_OPEN = 1u, BK4819_AF_FM = 1u, // FM
BK4819_AF_ALAM = 2u, BK4819_AF_ALAM = 2u, //
BK4819_AF_BEEP = 3u, BK4819_AF_BEEP = 3u, //
BK4819_AF_UNKNOWN1 = 4u, BK4819_AF_BASEBAND1 = 4u, // SSB
BK4819_AF_UNKNOWN2 = 5u, BK4819_AF_BASEBAND2 = 5u, // SSB
BK4819_AF_CTCO = 6u, BK4819_AF_CTCO = 6u, // strange LF audio .. maybe the CTCSS LF line ?
BK4819_AF_AM = 7u, BK4819_AF_AM = 7u, // AM
BK4819_AF_FSKO = 8u, BK4819_AF_FSKO = 8u, // nothing
BK4819_AF_UNKNOWN3 = 9u, BK4819_AF_UNKNOWN3 = 9u, // distorted
BK4819_AF_UNKNOWN4 = 10u, BK4819_AF_UNKNOWN4 = 10u, // nothing at all
BK4819_AF_UNKNOWN5 = 11u, BK4819_AF_UNKNOWN5 = 11u, // distorted
BK4819_AF_UNKNOWN6 = 12u, BK4819_AF_UNKNOWN6 = 12u, // distorted
BK4819_AF_UNKNOWN7 = 13u, BK4819_AF_UNKNOWN7 = 13u, // interesting
BK4819_AF_UNKNOWN8 = 14u, BK4819_AF_UNKNOWN8 = 14u, // interesting
BK4819_AF_UNKNOWN9 = 15u BK4819_AF_UNKNOWN9 = 15u // not a lot
}; };
typedef enum BK4819_AF_Type_t BK4819_AF_Type_t; typedef enum BK4819_AF_Type_t BK4819_AF_Type_t;
@@ -102,6 +102,7 @@ void BK4819_DisableVox(void);
void BK4819_DisableDTMF(void); void BK4819_DisableDTMF(void);
void BK4819_EnableDTMF(void); void BK4819_EnableDTMF(void);
void BK4819_PlayTone(uint16_t Frequency, bool bTuningGainSwitch); void BK4819_PlayTone(uint16_t Frequency, bool bTuningGainSwitch);
void BK4819_PlaySingleTone(const unsigned int tone_Hz, const unsigned int delay, const unsigned int level, const bool play_speaker);
void BK4819_EnterTxMute(void); void BK4819_EnterTxMute(void);
void BK4819_ExitTxMute(void); void BK4819_ExitTxMute(void);
void BK4819_Sleep(void); void BK4819_Sleep(void);

View File

@@ -58,10 +58,10 @@ enum GPIOC_PINS {
GPIOC_PIN_PTT = 5 GPIOC_PIN_PTT = 5
}; };
void GPIO_ClearBit(volatile uint32_t *pReg, uint8_t Bit); void GPIO_ClearBit(volatile uint32_t *pReg, uint8_t Bit);
uint8_t GPIO_CheckBit(volatile uint32_t *pReg, uint8_t Bit); uint8_t GPIO_CheckBit(volatile uint32_t *pReg, uint8_t Bit);
void GPIO_FlipBit(volatile uint32_t *pReg, uint8_t Bit); void GPIO_FlipBit( volatile uint32_t *pReg, uint8_t Bit);
void GPIO_SetBit(volatile uint32_t *pReg, uint8_t Bit); void GPIO_SetBit( volatile uint32_t *pReg, uint8_t Bit);
#endif #endif

View File

@@ -22,76 +22,74 @@
#include "driver/i2c.h" #include "driver/i2c.h"
#include "misc.h" #include "misc.h"
KEY_Code_t gKeyReading0 = KEY_INVALID; KEY_Code_t gKeyReading0 = KEY_INVALID;
KEY_Code_t gKeyReading1 = KEY_INVALID; KEY_Code_t gKeyReading1 = KEY_INVALID;
uint16_t gDebounceCounter; uint16_t gDebounceCounter = 0;
bool gWasFKeyPressed; bool gWasFKeyPressed = false;
static const struct { static const struct {
// Using a 16 bit pre-calculated shift and invert is cheaper
// than using 8 bit and doing shift and invert in code.
uint16_t set_to_zero_mask;
//We are very fortunate. // Using a 16 bit pre-calculated shift and invert is cheaper
//The key and pin defines fit together in a single u8, // than using 8 bit and doing shift and invert in code.
//making this very efficient uint16_t set_to_zero_mask;
struct {
uint8_t key : 5; //Key 23 is highest // We are very fortunate.
uint8_t pin : 3; //Pin 6 is highest // The key and pin defines fit together in a single u8, making this very efficient
} pins[4]; struct {
} keyboard[5] = { KEY_Code_t key : 5;
/* Zero row */ uint8_t pin : 3; // Pin 6 is highest
{ } pins[4];
//Set to zero to handle special case of nothing pulled down.
.set_to_zero_mask = ~(0), } keyboard[] = {
.pins = {
{ .key = KEY_SIDE1, .pin = GPIOA_PIN_KEYBOARD_0}, { // Zero row
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1}, // Set to zero to handle special case of nothing pulled down
/* Duplicate to fill the array with valid values */ .set_to_zero_mask = 0xffff,
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1}, .pins = {
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1}, { .key = KEY_SIDE1, .pin = GPIOA_PIN_KEYBOARD_0},
} { .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1},
},
/* First row */ // Duplicate to fill the array with valid values
{ { .key = KEY_INVALID, .pin = GPIOA_PIN_KEYBOARD_1},
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_4), { .key = KEY_INVALID, .pin = GPIOA_PIN_KEYBOARD_1}
.pins = { }
{ .key = KEY_MENU, .pin = GPIOA_PIN_KEYBOARD_0}, },
{ .key = KEY_1, .pin = GPIOA_PIN_KEYBOARD_1}, { // First row
{ .key = KEY_4, .pin = GPIOA_PIN_KEYBOARD_2}, .set_to_zero_mask = ~(1u << GPIOA_PIN_KEYBOARD_4) & 0xffff,
{ .key = KEY_7, .pin = GPIOA_PIN_KEYBOARD_3}, .pins = {
} { .key = KEY_MENU, .pin = GPIOA_PIN_KEYBOARD_0},
}, { .key = KEY_1, .pin = GPIOA_PIN_KEYBOARD_1},
/* Second row */ { .key = KEY_4, .pin = GPIOA_PIN_KEYBOARD_2},
{ { .key = KEY_7, .pin = GPIOA_PIN_KEYBOARD_3}
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_5), }
.pins = { },
{ .key = KEY_UP, .pin = GPIOA_PIN_KEYBOARD_0}, { // Second row
{ .key = KEY_2 , .pin = GPIOA_PIN_KEYBOARD_1}, .set_to_zero_mask = ~(1u << GPIOA_PIN_KEYBOARD_5) & 0xffff,
{ .key = KEY_5 , .pin = GPIOA_PIN_KEYBOARD_2}, .pins = {
{ .key = KEY_8 , .pin = GPIOA_PIN_KEYBOARD_3}, { .key = KEY_UP, .pin = GPIOA_PIN_KEYBOARD_0},
} { .key = KEY_2 , .pin = GPIOA_PIN_KEYBOARD_1},
}, { .key = KEY_5 , .pin = GPIOA_PIN_KEYBOARD_2},
/* Third row */ { .key = KEY_8 , .pin = GPIOA_PIN_KEYBOARD_3}
{ }
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_6), },
.pins = { { // Third row
{ .key = KEY_DOWN, .pin = GPIOA_PIN_KEYBOARD_0}, .set_to_zero_mask = ~(1u << GPIOA_PIN_KEYBOARD_6) & 0xffff,
{ .key = KEY_3 , .pin = GPIOA_PIN_KEYBOARD_1}, .pins = {
{ .key = KEY_6 , .pin = GPIOA_PIN_KEYBOARD_2}, { .key = KEY_DOWN, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_9 , .pin = GPIOA_PIN_KEYBOARD_3}, { .key = KEY_3 , .pin = GPIOA_PIN_KEYBOARD_1},
} { .key = KEY_6 , .pin = GPIOA_PIN_KEYBOARD_2},
}, { .key = KEY_9 , .pin = GPIOA_PIN_KEYBOARD_3}
/* Fourth row */ }
{ },
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_7), { // Fourth row
.pins = { .set_to_zero_mask = ~(1u << GPIOA_PIN_KEYBOARD_7) & 0xffff,
{ .key = KEY_EXIT, .pin = GPIOA_PIN_KEYBOARD_0}, .pins = {
{ .key = KEY_STAR, .pin = GPIOA_PIN_KEYBOARD_1}, { .key = KEY_EXIT, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_0 , .pin = GPIOA_PIN_KEYBOARD_2}, { .key = KEY_STAR, .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_F , .pin = GPIOA_PIN_KEYBOARD_3}, { .key = KEY_0 , .pin = GPIOA_PIN_KEYBOARD_2},
} { .key = KEY_F , .pin = GPIOA_PIN_KEYBOARD_3}
}, }
}
}; };
KEY_Code_t KEYBOARD_Poll(void) KEY_Code_t KEYBOARD_Poll(void)
@@ -100,43 +98,62 @@ KEY_Code_t KEYBOARD_Poll(void)
// if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) // if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT))
// return KEY_PTT; // return KEY_PTT;
// ***************** // *****************
for(int j = 0; j < ARRAY_SIZE(keyboard); j++) {
//Set all high
GPIOA->DATA |= 1 << GPIOA_PIN_KEYBOARD_4 |
1 << GPIOA_PIN_KEYBOARD_5 |
1 << GPIOA_PIN_KEYBOARD_6 |
1 << GPIOA_PIN_KEYBOARD_7 ;
//Clear the pin we are selecting
GPIOA->DATA &= keyboard[j].set_to_zero_mask;
//Wait for the pins to stabilize. 1 works for me. for (unsigned int j = 0; j < ARRAY_SIZE(keyboard); j++)
SYSTICK_DelayUs(2); {
uint16_t reg;
unsigned int i;
unsigned int k;
// Read all 4 GPIO pins at once // Set all high
uint16_t reg = GPIOA->DATA; GPIOA->DATA |= 1u << GPIOA_PIN_KEYBOARD_4 |
for(int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++) 1u << GPIOA_PIN_KEYBOARD_5 |
{ 1u << GPIOA_PIN_KEYBOARD_6 |
uint16_t mask = 1 << keyboard[j].pins[i].pin; 1u << GPIOA_PIN_KEYBOARD_7;
if(! (reg & mask)) {
Key = keyboard[j].pins[i].key;
break;
}
}
if (Key != KEY_INVALID) // Clear the pin we are selecting
break; GPIOA->DATA &= keyboard[j].set_to_zero_mask;
}
//Create I2C stop condition. Since we might have toggled I2C pins. // Read all 4 GPIO pins at once .. with de-noise, max of 8 sample loops
//This leaves GPIOA_PIN_KEYBOARD_4 and GPIOA_PIN_KEYBOARD_5 high for (i = 0, k = 0, reg = 0; i < 3 && k < 8; i++, k++)
I2C_Stop(); {
uint16_t reg2;
SYSTICK_DelayUs(1);
reg2 = GPIOA->DATA;
if (reg != reg2)
{ // noise
reg = reg2;
i = 0;
}
}
if (i < 3)
break; // noise is too bad
for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++)
{
const uint16_t mask = 1u << keyboard[j].pins[i].pin;
if (!(reg & mask))
{
Key = keyboard[j].pins[i].key;
break;
}
}
if (Key != KEY_INVALID)
break;
}
// Create I2C stop condition since we might have toggled I2C pins
// This leaves GPIOA_PIN_KEYBOARD_4 and GPIOA_PIN_KEYBOARD_5 high
I2C_Stop();
// Reset VOICE pins // Reset VOICE pins
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6); GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_7); GPIO_SetBit( &GPIOA->DATA, GPIOA_PIN_KEYBOARD_7);
return Key; return Key;
} }

View File

@@ -21,30 +21,29 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
enum KEY_Code_t { enum KEY_Code_e {
KEY_0 = 0, KEY_0 = 0, // 0
KEY_1 = 1, KEY_1, // 1
KEY_2 = 2, KEY_2, // 2
KEY_3 = 3, KEY_3, // 3
KEY_4 = 4, KEY_4, // 4
KEY_5 = 5, KEY_5, // 5
KEY_6 = 6, KEY_6, // 6
KEY_7 = 7, KEY_7, // 7
KEY_8 = 8, KEY_8, // 8
KEY_9 = 9, KEY_9, // 9
KEY_MENU = 10, KEY_MENU, // A
KEY_UP = 11, KEY_UP, // B
KEY_DOWN = 12, KEY_DOWN, // C
KEY_EXIT = 13, KEY_EXIT, // D
KEY_STAR = 14, KEY_STAR, // *
KEY_F = 15, KEY_F, // #
KEY_PTT = 21, KEY_PTT, //
KEY_SIDE2 = 22, KEY_SIDE2, //
KEY_SIDE1 = 23, KEY_SIDE1, //
KEY_INVALID = 255 KEY_INVALID //
}; };
typedef enum KEY_Code_e KEY_Code_t;
typedef enum KEY_Code_t KEY_Code_t;
extern KEY_Code_t gKeyReading0; extern KEY_Code_t gKeyReading0;
extern KEY_Code_t gKeyReading1; extern KEY_Code_t gKeyReading1;

View File

@@ -93,9 +93,9 @@ void SPI_Configure(volatile SPI_Port_t *pPort, SPI_Config_t *pConfig)
if (pPort->IE) { if (pPort->IE) {
if (pPort == SPI0) { if (pPort == SPI0) {
NVIC_EnableIRQ(DP32_SPI0_IRQn); NVIC_EnableIRQ((IRQn_Type)DP32_SPI0_IRQn);
} else if (pPort == SPI1) { } else if (pPort == SPI1) {
NVIC_EnableIRQ(DP32_SPI1_IRQn); NVIC_EnableIRQ((IRQn_Type)DP32_SPI1_IRQn);
} }
} }
} }

View File

@@ -82,10 +82,10 @@ void ST7565_BlitFullScreen(void)
} }
#if 0 #if 0
// whats the delay for I wonder ? .. it slows down scanning :( // whats the delay for I wonder, it holds things up :(
SYSTEM_DelayMs(20); SYSTEM_DelayMs(20);
#else #else
SYSTEM_DelayMs(1); // SYSTEM_DelayMs(1);
#endif #endif
SPI_ToggleMasterMode(&SPI0->CR, true); SPI_ToggleMasterMode(&SPI0->CR, true);
@@ -119,7 +119,11 @@ void ST7565_FillScreen(uint8_t Value)
{ {
unsigned int i; unsigned int i;
// reset some of the displays settings to try and overcome the radios hardware problem - RF corrupting the display
ST7565_Init(false);
SPI_ToggleMasterMode(&SPI0->CR, false); SPI_ToggleMasterMode(&SPI0->CR, false);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
unsigned int j; unsigned int j;
@@ -132,21 +136,27 @@ void ST7565_FillScreen(uint8_t Value)
} }
SPI_WaitForUndocumentedTxFifoStatusBit(); SPI_WaitForUndocumentedTxFifoStatusBit();
} }
SPI_ToggleMasterMode(&SPI0->CR, true); SPI_ToggleMasterMode(&SPI0->CR, true);
} }
void ST7565_Init(void) void ST7565_Init(const bool full)
{ {
SPI0_Init(); if (full)
{
ST7565_Configure_GPIO_B11(); SPI0_Init();
SPI_ToggleMasterMode(&SPI0->CR, false); ST7565_HardwareReset();
ST7565_WriteByte(0xE2); // internal reset SPI_ToggleMasterMode(&SPI0->CR, false);
SYSTEM_DelayMs(120); ST7565_WriteByte(0xE2); // internal reset
SYSTEM_DelayMs(120);
}
else
SPI_ToggleMasterMode(&SPI0->CR, false);
ST7565_WriteByte(0xA2); // bias 9 ST7565_WriteByte(0xA2); // bias 9
ST7565_WriteByte(0xC0); // com normal ST7565_WriteByte(0xC0); // com normal
ST7565_WriteByte(0xA1); // reverse ? ST7565_WriteByte(0xA1); // reverse ?
@@ -157,33 +167,39 @@ void ST7565_Init(void)
ST7565_WriteByte(0xA4); // all points normal ST7565_WriteByte(0xA4); // all points normal
ST7565_WriteByte(0x24); // ST7565_WriteByte(0x24); //
ST7565_WriteByte(0x81); // volume first ? ST7565_WriteByte(0x81); // volume first ?
ST7565_WriteByte(0x1f); // contrast ? ST7565_WriteByte(0x1f); // contrast ?
ST7565_WriteByte(0x2B); // power control ?
SYSTEM_DelayMs(1);
ST7565_WriteByte(0x2E); // power control ?
SYSTEM_DelayMs(1);
ST7565_WriteByte(0x2F); //
ST7565_WriteByte(0x2F); //
ST7565_WriteByte(0x2F); //
ST7565_WriteByte(0x2F); //
SYSTEM_DelayMs(40);
if (full)
{
ST7565_WriteByte(0x2B); // power control ?
SYSTEM_DelayMs(1);
ST7565_WriteByte(0x2E); // power control ?
SYSTEM_DelayMs(1);
ST7565_WriteByte(0x2F); //
ST7565_WriteByte(0x2F); //
ST7565_WriteByte(0x2F); //
ST7565_WriteByte(0x2F); //
SYSTEM_DelayMs(40);
}
ST7565_WriteByte(0x40); // start line ? ST7565_WriteByte(0x40); // start line ?
ST7565_WriteByte(0xAF); // display on ? ST7565_WriteByte(0xAF); // display on ?
SPI_WaitForUndocumentedTxFifoStatusBit(); SPI_WaitForUndocumentedTxFifoStatusBit();
SPI_ToggleMasterMode(&SPI0->CR, true); SPI_ToggleMasterMode(&SPI0->CR, true);
ST7565_FillScreen(0x00); if (full)
ST7565_FillScreen(0x00);
} }
void ST7565_Configure_GPIO_B11(void) void ST7565_HardwareReset(void)
{ {
GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_RES); GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_RES);
SYSTEM_DelayMs(1); SYSTEM_DelayMs(1);

View File

@@ -30,8 +30,8 @@ void ST7565_DrawLine(const unsigned int Column, const unsigned int Line, const u
void ST7565_BlitFullScreen(void); void ST7565_BlitFullScreen(void);
void ST7565_BlitStatusLine(void); void ST7565_BlitStatusLine(void);
void ST7565_FillScreen(uint8_t Value); void ST7565_FillScreen(uint8_t Value);
void ST7565_Init(void); void ST7565_Init(const bool full);
void ST7565_Configure_GPIO_B11(void); void ST7565_HardwareReset(void);
void ST7565_SelectColumnAndLine(uint8_t Column, uint8_t Line); void ST7565_SelectColumnAndLine(uint8_t Column, uint8_t Line);
void ST7565_WriteByte(uint8_t Value); void ST7565_WriteByte(uint8_t Value);

View File

@@ -29,26 +29,17 @@ void SYSTICK_Init(void)
void SYSTICK_DelayUs(uint32_t Delay) void SYSTICK_DelayUs(uint32_t Delay)
{ {
uint32_t i; const uint32_t ticks = Delay * gTickMultiplier;
uint32_t Start; uint32_t i = 0;
uint32_t Previous; uint32_t Start = SysTick->LOAD;
uint32_t Current; uint32_t Previous = SysTick->VAL;
uint32_t Delta;
i = 0;
Start = SysTick->LOAD;
Previous = SysTick->VAL;
do { do {
do { uint32_t Current;
Current = SysTick->VAL; uint32_t Delta;
} while (Current == Previous); while ((Current = SysTick->VAL) == Previous) {}
if (Current < Previous) { Delta = (Current < Previous) ? -Current : Start - Current;
Delta = -Current; i += Delta + Previous;
} else {
Delta = Start - Current;
}
i += Delta + Previous;
Previous = Current; Previous = Current;
} while (i < Delay * gTickMultiplier); } while (i < ticks);
} }

Binary file not shown.

View File

@@ -17,7 +17,7 @@ SECTIONS
.text : .text :
{ {
. = ALIGN(4); . = ALIGN(4);
*(.text.isr) /* .text sections of code */ KEEP(*(.text.isr)) /* .text sections of code */
*(.text) /* .text sections of code */ *(.text) /* .text sections of code */
*(.text*) /* .text* sections of code */ *(.text*) /* .text* sections of code */
*(.rodata) /* .rodata sections */ *(.rodata) /* .rodata sections */

Binary file not shown.

464
font.c
View File

@@ -19,6 +19,7 @@
//const uint8_t gFontBig[95][16] = //const uint8_t gFontBig[95][16] =
const uint8_t gFontBig[95][15] = const uint8_t gFontBig[95][15] =
{ {
#if 0
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // ' ' {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // ' '
{0x00, 0x00, 0x70, 0xF8, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00}, // , 0x00}, // '!' {0x00, 0x00, 0x70, 0xF8, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00}, // , 0x00}, // '!'
{0x00, 0x1E, 0x3E, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '"' {0x00, 0x1E, 0x3E, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '"'
@@ -114,7 +115,104 @@ const uint8_t gFontBig[95][15] =
{0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00}, // , 0x00}, // '|' {0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00}, // , 0x00}, // '|'
{0x00, 0x08, 0x08, 0x78, 0xF0, 0x80, 0x80, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x0F, 0x00, 0x00}, // , 0x00}, // '}' {0x00, 0x08, 0x08, 0x78, 0xF0, 0x80, 0x80, 0x00, 0x00, 0x10, 0x10, 0x1F, 0x0F, 0x00, 0x00}, // , 0x00}, // '}'
{0x10, 0x18, 0x08, 0x18, 0x10, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // , 0x00} // '->' {0x10, 0x18, 0x08, 0x18, 0x10, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // , 0x00} // '->'
}; #else
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00},
{0x00, 0x0F, 0x1F, 0x00, 0x00, 0x1F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x20, 0xF8, 0xF8, 0x20, 0xF8, 0xF8, 0x20, 0x00, 0x02, 0x0F, 0x0F, 0x02, 0x0F, 0x0F, 0x02},
{0x70, 0xF8, 0x88, 0x8E, 0x8E, 0x98, 0x10, 0x00, 0x04, 0x0C, 0x08, 0x38, 0x38, 0x0F, 0x07},
{0x30, 0x30, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x00, 0x0C, 0x06, 0x03, 0x01, 0x00, 0x0C, 0x0C},
{0x80, 0xD8, 0x7C, 0xE4, 0xBC, 0xD8, 0x40, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x07, 0x0F, 0x08},
{0x00, 0x10, 0x1F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0xF0, 0xF8, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0C, 0x08, 0x00},
{0x00, 0x00, 0x04, 0x0C, 0xF8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x07, 0x03, 0x00},
{0x00, 0x80, 0xA0, 0xE0, 0xC0, 0xE0, 0xA0, 0x80, 0x00, 0x00, 0x02, 0x03, 0x01, 0x03, 0x02},
{0x00, 0x80, 0x80, 0xE0, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x1E, 0x0E, 0x00, 0x00},
{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x00, 0x0C, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00},
{0xF8, 0xFC, 0x84, 0xC4, 0x64, 0xFC, 0xF8, 0x00, 0x07, 0x0F, 0x09, 0x08, 0x08, 0x0F, 0x07},
{0x00, 0x10, 0x18, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x0F, 0x0F, 0x08, 0x08},
{0x18, 0x1C, 0x04, 0x84, 0xC4, 0x7C, 0x38, 0x00, 0x0C, 0x0E, 0x0B, 0x09, 0x08, 0x08, 0x08},
{0x18, 0x1C, 0x44, 0x44, 0x44, 0xFC, 0xB8, 0x00, 0x06, 0x0E, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0x80, 0xC0, 0x60, 0x30, 0x18, 0xFC, 0xFC, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x0F},
{0x7C, 0x7C, 0x44, 0x44, 0x44, 0xC4, 0x84, 0x00, 0x04, 0x0C, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0xF0, 0xF8, 0x4C, 0x44, 0x44, 0xC4, 0x80, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0x04, 0x04, 0x04, 0x84, 0xE4, 0x7C, 0x1C, 0x00, 0x00, 0x00, 0x0E, 0x0F, 0x01, 0x00, 0x00},
{0xB8, 0xFC, 0x44, 0x44, 0x44, 0xFC, 0xB8, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0x78, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0xF8, 0x00, 0x00, 0x08, 0x08, 0x08, 0x0C, 0x07, 0x03},
{0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0E, 0x06, 0x00, 0x00},
{0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x08, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x0C, 0x08},
{0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02},
{0x00, 0x08, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x00},
{0x38, 0x3C, 0x04, 0x84, 0xC4, 0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00},
{0xF0, 0xF8, 0x08, 0xC8, 0xC8, 0xF8, 0xF0, 0x00, 0x07, 0x0F, 0x08, 0x0B, 0x0B, 0x0B, 0x01},
{0xF8, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0xF8, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F},
{0xFC, 0xFC, 0x44, 0x44, 0x44, 0xFC, 0xB8, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0xF8, 0xFC, 0x04, 0x04, 0x04, 0x1C, 0x18, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0E, 0x06},
{0xFC, 0xFC, 0x04, 0x04, 0x0C, 0xF8, 0xF0, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x0C, 0x07, 0x03},
{0xFC, 0xFC, 0x44, 0x44, 0x44, 0x04, 0x04, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08},
{0xFC, 0xFC, 0x44, 0x44, 0x44, 0x04, 0x04, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0xF8, 0xFC, 0x04, 0x84, 0x84, 0x9C, 0x98, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0xFC, 0xFC, 0x40, 0x40, 0x40, 0xFC, 0xFC, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F},
{0x00, 0x00, 0x04, 0xFC, 0xFC, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00},
{0x00, 0x00, 0x00, 0x04, 0xFC, 0xFC, 0x04, 0x00, 0x06, 0x0E, 0x08, 0x08, 0x0F, 0x07, 0x00},
{0xFC, 0xFC, 0xE0, 0x30, 0x18, 0x0C, 0x04, 0x00, 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08},
{0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08},
{0xFC, 0xFC, 0x18, 0x70, 0x18, 0xFC, 0xFC, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F},
{0xFC, 0xFC, 0x60, 0xC0, 0x80, 0xFC, 0xFC, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0F},
{0xF8, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0xF8, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0xFC, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0xF8, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0xF8, 0x00, 0x07, 0x0F, 0x08, 0x0C, 0x0C, 0x1F, 0x17},
{0xFC, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08},
{0x38, 0x7C, 0x44, 0x44, 0x44, 0xCC, 0x88, 0x00, 0x06, 0x0E, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0x00, 0x04, 0x04, 0xFC, 0xFC, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00},
{0xFC, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0x7C, 0xFC, 0x80, 0x00, 0x80, 0xFC, 0x7C, 0x00, 0x00, 0x03, 0x0F, 0x0C, 0x0F, 0x03, 0x00},
{0xFC, 0xFC, 0x00, 0x80, 0x00, 0xFC, 0xFC, 0x00, 0x0F, 0x0F, 0x06, 0x03, 0x06, 0x0F, 0x0F},
{0x0C, 0x3C, 0xF0, 0xC0, 0xF0, 0x3C, 0x0C, 0x00, 0x0C, 0x0F, 0x03, 0x00, 0x03, 0x0F, 0x0C},
{0x00, 0x3C, 0x7C, 0xC0, 0xC0, 0x7C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00},
{0x04, 0x04, 0x84, 0xC4, 0x64, 0x3C, 0x1C, 0x00, 0x0E, 0x0F, 0x09, 0x08, 0x08, 0x08, 0x08},
{0x00, 0x00, 0xFC, 0xFC, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x00},
{0x38, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0E},
{0x00, 0x00, 0x04, 0x04, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x0F, 0x0F, 0x00},
{0x08, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20},
{0x00, 0x00, 0x03, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, 0xC0, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F},
{0xFC, 0xFC, 0x20, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0x60, 0x40, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0C, 0x04},
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xFC, 0xFC, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F},
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x07, 0x0F, 0x09, 0x09, 0x09, 0x09, 0x01},
{0x20, 0x20, 0xF8, 0xFC, 0x24, 0x24, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00},
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xE0, 0x00, 0x07, 0x4F, 0x48, 0x48, 0x48, 0x7F, 0x3F},
{0xFC, 0xFC, 0x20, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F},
{0x00, 0x00, 0x20, 0xEC, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x20, 0xEC, 0xEC, 0x00, 0x00, 0x30, 0x70, 0x40, 0x40, 0x7F, 0x3F},
{0xFC, 0xFC, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x00, 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08},
{0x00, 0x00, 0x04, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00},
{0xE0, 0xE0, 0x20, 0xE0, 0x20, 0xE0, 0xC0, 0x00, 0x0F, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x0F},
{0xE0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F},
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0xE0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x7F, 0x7F, 0x08, 0x08, 0x08, 0x0F, 0x07},
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xE0, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x7F, 0x7F},
{0xE0, 0xE0, 0x60, 0x20, 0x20, 0x20, 0x20, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x08, 0x09, 0x09, 0x09, 0x09, 0x0F, 0x06},
{0x20, 0x20, 0xFC, 0xFC, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08},
{0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F},
{0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x03, 0x0F, 0x0C, 0x0F, 0x03, 0x00},
{0xE0, 0xE0, 0x00, 0x80, 0x00, 0xE0, 0xE0, 0x00, 0x07, 0x0F, 0x08, 0x0F, 0x08, 0x0F, 0x07},
{0x60, 0xE0, 0x80, 0x00, 0x80, 0xE0, 0x60, 0x00, 0x0C, 0x0E, 0x03, 0x01, 0x03, 0x0E, 0x0C},
{0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x07, 0x4F, 0x48, 0x48, 0x48, 0x7F, 0x3F},
{0x20, 0x20, 0x20, 0xA0, 0xE0, 0x60, 0x20, 0x00, 0x0C, 0x0E, 0x0B, 0x09, 0x08, 0x08, 0x08},
{0x00, 0x00, 0x40, 0xF8, 0xBC, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x08, 0x08},
{0x00, 0x00, 0x00, 0xBC, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00},
{0x00, 0x04, 0x04, 0xBC, 0xF8, 0x40, 0x00, 0x00, 0x00, 0x08, 0x08, 0x0F, 0x07, 0x00, 0x00},
{0x08, 0x0C, 0x04, 0x0C, 0x08, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
#endif
};
#if 0 #if 0
// original font // original font
@@ -132,7 +230,7 @@ const uint8_t gFontBig[95][15] =
{0x00, 0xF0, 0xF8, 0xB8, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0xB8, 0xF0, 0xE0, 0x00, 0x11, 0x33, 0x77, 0x67, 0x66, 0x66, 0x66, 0x76, 0x33, 0x3F, 0x1F, 0x07}, {0x00, 0xF0, 0xF8, 0xB8, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0xB8, 0xF0, 0xE0, 0x00, 0x11, 0x33, 0x77, 0x67, 0x66, 0x66, 0x66, 0x76, 0x33, 0x3F, 0x1F, 0x07},
{0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00} {0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00}
}; };
#else #elif 0
// VCR font // VCR font
const uint8_t gFontBigDigits[11][26] = const uint8_t gFontBigDigits[11][26] =
{ {
@@ -148,6 +246,22 @@ const uint8_t gFontBig[95][15] =
{0x00, 0x00, 0x78, 0xFC, 0xC6, 0x86, 0x86, 0x86, 0x86, 0x86, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x18, 0x38, 0x71, 0x61, 0x61, 0x61, 0x61, 0x71, 0x3F, 0x1F, 0x00}, {0x00, 0x00, 0x78, 0xFC, 0xC6, 0x86, 0x86, 0x86, 0x86, 0x86, 0xFC, 0xF8, 0x00, 0x00, 0x00, 0x18, 0x38, 0x71, 0x61, 0x61, 0x61, 0x61, 0x71, 0x3F, 0x1F, 0x00},
{0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00} {0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}
}; };
#else
// Terminus font
const uint8_t gFontBigDigits[11][26] =
{
{0x00, 0x00, 0xFC, 0xFE, 0xFE, 0x06, 0x86, 0xC6, 0xE6, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x7F, 0x67, 0x63, 0x61, 0x60, 0x7F, 0x7F, 0x3F, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x18, 0x1C, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x7F, 0x7F, 0x7F, 0x60, 0x60, 0x00, 0x00},
{0x00, 0x00, 0x1C, 0x1E, 0x1E, 0x06, 0x06, 0x06, 0x86, 0xFE, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x60, 0x70, 0x78, 0x7C, 0x6E, 0x67, 0x63, 0x61, 0x60, 0x60, 0x00},
{0x00, 0x00, 0x0C, 0x0E, 0x0E, 0x86, 0x86, 0x86, 0x86, 0xFE, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x30, 0x70, 0x70, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x7F, 0x3E, 0x00},
{0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x7F, 0x7F, 0x7F, 0x00},
{0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x30, 0x70, 0x70, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x3F, 0x00},
{0x00, 0x00, 0xF8, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x80, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x3F, 0x00},
{0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x06, 0x06, 0x86, 0xE6, 0xFE, 0x7E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7F, 0x7F, 0x03, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x7C, 0xFE, 0xFE, 0x86, 0x86, 0x86, 0x86, 0xFE, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x7F, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x7F, 0x3F, 0x00},
{0x00, 0x00, 0xFC, 0xFE, 0xFE, 0x06, 0x06, 0x06, 0x06, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x7F, 0x3F, 0x1F, 0x00},
{0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}
};
#endif #endif
/* /*
const uint8_t gFontSmallDigits[11][7] = const uint8_t gFontSmallDigits[11][7] =
@@ -165,174 +279,6 @@ const uint8_t gFontSmallDigits[11][7] =
{0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00} // '-' {0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00} // '-'
}; };
*/ */
#ifdef ENABLE_SPECTRUM
const uint8_t gFont3x5[160][3] = {
{0x00, 0x00, 0x00}, // 32 - space
{0x00, 0x17, 0x00}, // 33 - exclam
{0x03, 0x00, 0x03}, // 34 - quotedbl
{0x1f, 0x0a, 0x1f}, // 35 - numbersign
{0x0a, 0x1f, 0x05}, // 36 - dollar
{0x09, 0x04, 0x12}, // 37 - percent
{0x0f, 0x17, 0x1c}, // 38 - ampersand
{0x00, 0x03, 0x00}, // 39 - quotesingle
{0x00, 0x0e, 0x11}, // 40 - parenleft
{0x11, 0x0e, 0x00}, // 41 - parenright
{0x05, 0x02, 0x05}, // 42 - asterisk
{0x04, 0x0e, 0x04}, // 43 - plus
{0x10, 0x08, 0x00}, // 44 - comma
{0x04, 0x04, 0x04}, // 45 - hyphen
{0x00, 0x10, 0x00}, // 46 - period
{0x18, 0x04, 0x03}, // 47 - slash
{0x1e, 0x11, 0x0f}, // 48 - zero
{0x02, 0x1f, 0x00}, // 49 - one
{0x19, 0x15, 0x12}, // 50 - two
{0x11, 0x15, 0x0a}, // 51 - three
{0x07, 0x04, 0x1f}, // 52 - four
{0x17, 0x15, 0x09}, // 53 - five
{0x1e, 0x15, 0x1d}, // 54 - six
{0x19, 0x05, 0x03}, // 55 - seven
{0x1f, 0x15, 0x1f}, // 56 - eight
{0x17, 0x15, 0x0f}, // 57 - nine
{0x00, 0x0a, 0x00}, // 58 - colon
{0x10, 0x0a, 0x00}, // 59 - semicolon
{0x04, 0x0a, 0x11}, // 60 - less
{0x0a, 0x0a, 0x0a}, // 61 - equal
{0x11, 0x0a, 0x04}, // 62 - greater
{0x01, 0x15, 0x03}, // 63 - question
{0x0e, 0x15, 0x16}, // 64 - at
{0x1e, 0x05, 0x1e}, // 65 - A
{0x1f, 0x15, 0x0a}, // 66 - B
{0x0e, 0x11, 0x11}, // 67 - C
{0x1f, 0x11, 0x0e}, // 68 - D
{0x1f, 0x15, 0x15}, // 69 - E
{0x1f, 0x05, 0x05}, // 70 - F
{0x0e, 0x15, 0x1d}, // 71 - G
{0x1f, 0x04, 0x1f}, // 72 - H
{0x11, 0x1f, 0x11}, // 73 - I
{0x08, 0x10, 0x0f}, // 74 - J
{0x1f, 0x04, 0x1b}, // 75 - K
{0x1f, 0x10, 0x10}, // 76 - L
{0x1f, 0x06, 0x1f}, // 77 - M
{0x1f, 0x0e, 0x1f}, // 78 - N
{0x0e, 0x11, 0x0e}, // 79 - O
{0x1f, 0x05, 0x02}, // 80 - P
{0x0e, 0x19, 0x1e}, // 81 - Q
{0x1f, 0x0d, 0x16}, // 82 - R
{0x12, 0x15, 0x09}, // 83 - S
{0x01, 0x1f, 0x01}, // 84 - T
{0x0f, 0x10, 0x1f}, // 85 - U
{0x07, 0x18, 0x07}, // 86 - V
{0x1f, 0x0c, 0x1f}, // 87 - W
{0x1b, 0x04, 0x1b}, // 88 - X
{0x03, 0x1c, 0x03}, // 89 - Y
{0x19, 0x15, 0x13}, // 90 - Z
{0x1f, 0x11, 0x11}, // 91 - bracketleft
{0x02, 0x04, 0x08}, // 92 - backslash
{0x11, 0x11, 0x1f}, // 93 - bracketright
{0x02, 0x01, 0x02}, // 94 - asciicircum
{0x10, 0x10, 0x10}, // 95 - underscore
{0x01, 0x02, 0x00}, // 96 - grave
{0x1a, 0x16, 0x1c}, // 97 - a
{0x1f, 0x12, 0x0c}, // 98 - b
{0x0c, 0x12, 0x12}, // 99 - c
{0x0c, 0x12, 0x1f}, // 100 - d
{0x0c, 0x1a, 0x16}, // 101 - e
{0x04, 0x1e, 0x05}, // 102 - f
{0x0c, 0x2a, 0x1e}, // 103 - g
{0x1f, 0x02, 0x1c}, // 104 - h
{0x00, 0x1d, 0x00}, // 105 - i
{0x10, 0x20, 0x1d}, // 106 - j
{0x1f, 0x0c, 0x12}, // 107 - k
{0x11, 0x1f, 0x10}, // 108 - l
{0x1e, 0x0e, 0x1e}, // 109 - m
{0x1e, 0x02, 0x1c}, // 110 - n
{0x0c, 0x12, 0x0c}, // 111 - o
{0x3e, 0x12, 0x0c}, // 112 - p
{0x0c, 0x12, 0x3e}, // 113 - q
{0x1c, 0x02, 0x02}, // 114 - r
{0x14, 0x1e, 0x0a}, // 115 - s
{0x02, 0x1f, 0x12}, // 116 - t
{0x0e, 0x10, 0x1e}, // 117 - u
{0x0e, 0x18, 0x0e}, // 118 - v
{0x1e, 0x1c, 0x1e}, // 119 - w
{0x12, 0x0c, 0x12}, // 120 - x
{0x06, 0x28, 0x1e}, // 121 - y
{0x1a, 0x1e, 0x16}, // 122 - z
{0x04, 0x1b, 0x11}, // 123 - braceleft
{0x00, 0x1b, 0x00}, // 124 - bar
{0x11, 0x1b, 0x04}, // 125 - braceright
{0x02, 0x03, 0x01}, // 126 - asciitilde
{0x00, 0x00, 0x00}, // 127 - empty
{0x00, 0x00, 0x00}, // 128 - empty
{0x00, 0x00, 0x00}, // 129 - empty
{0x00, 0x00, 0x00}, // 130 - empty
{0x00, 0x00, 0x00}, // 131 - empty
{0x00, 0x00, 0x00}, // 132 - empty
{0x00, 0x00, 0x00}, // 133 - empty
{0x00, 0x00, 0x00}, // 134 - empty
{0x00, 0x00, 0x00}, // 135 - empty
{0x00, 0x00, 0x00}, // 136 - empty
{0x00, 0x00, 0x00}, // 137 - empty
{0x00, 0x00, 0x00}, // 138 - empty
{0x00, 0x00, 0x00}, // 139 - empty
{0x00, 0x00, 0x00}, // 140 - empty
{0x00, 0x00, 0x00}, // 141 - empty
{0x00, 0x00, 0x00}, // 142 - empty
{0x00, 0x00, 0x00}, // 143 - empty
{0x00, 0x00, 0x00}, // 144 - empty
{0x00, 0x00, 0x00}, // 145 - empty
{0x00, 0x00, 0x00}, // 146 - empty
{0x00, 0x00, 0x00}, // 147 - empty
{0x00, 0x00, 0x00}, // 148 - empty
{0x00, 0x00, 0x00}, // 149 - empty
{0x00, 0x00, 0x00}, // 150 - empty
{0x00, 0x00, 0x00}, // 151 - empty
{0x00, 0x00, 0x00}, // 152 - empty
{0x00, 0x00, 0x00}, // 153 - empty
{0x00, 0x00, 0x00}, // 154 - empty
{0x00, 0x00, 0x00}, // 155 - empty
{0x00, 0x00, 0x00}, // 156 - empty
{0x00, 0x00, 0x00}, // 157 - empty
{0x00, 0x00, 0x00}, // 158 - empty
{0x00, 0x00, 0x00}, // 159 - empty
{0x00, 0x00, 0x00}, // 160 - empty
{0x00, 0x1d, 0x00}, // 161 - exclamdown
{0x0e, 0x1b, 0x0a}, // 162 - cent
{0x14, 0x1f, 0x15}, // 163 - sterling
{0x15, 0x0e, 0x15}, // 164 - currency
{0x0b, 0x1c, 0x0b}, // 165 - yen
{0x00, 0x1b, 0x00}, // 166 - brokenbar
{0x14, 0x1b, 0x05}, // 167 - section
{0x01, 0x00, 0x01}, // 168 - dieresis
{0x02, 0x05, 0x05}, // 169 - copyright
{0x16, 0x15, 0x17}, // 170 - ordfeminine
{0x02, 0x05, 0x00}, // 171 - guillemotleft
{0x02, 0x02, 0x06}, // 172 - logicalnot
{0x04, 0x04, 0x00}, // 173 - softhyphen
{0x07, 0x03, 0x04}, // 174 - registered
{0x01, 0x01, 0x01}, // 175 - macron
{0x02, 0x05, 0x02}, // 176 - degree
{0x12, 0x17, 0x12}, // 177 - plusminus
{0x01, 0x07, 0x04}, // 178 - twosuperior
{0x05, 0x07, 0x07}, // 179 - threesuperior
{0x00, 0x02, 0x01}, // 180 - acute
{0x1f, 0x08, 0x07}, // 181 - mu
{0x02, 0x1d, 0x1f}, // 182 - paragraph
{0x0e, 0x0e, 0x0e}, // 183 - periodcentered
{0x10, 0x14, 0x08}, // 184 - cedilla
{0x00, 0x07, 0x00}, // 185 - onesuperior
{0x12, 0x15, 0x12}, // 186 - ordmasculine
{0x00, 0x05, 0x02}, // 187 - guillemotright
{0x03, 0x08, 0x18}, // 188 - onequarter
{0x0b, 0x18, 0x10}, // 189 - onehalf
{0x03, 0x0b, 0x18}, // 190 - threequarters
{0x18, 0x15, 0x10}, // 191 - questiondown
};
#endif
const uint8_t gFontSmall[95][6] = const uint8_t gFontSmall[95][6] =
{ {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ' ' {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ' '
@@ -502,10 +448,10 @@ const uint8_t gFontSmall[95][6] =
{0x00, 0x03, 0x07, 0x06, 0x00, 0x00}, {0x00, 0x03, 0x07, 0x06, 0x00, 0x00},
{0x20, 0x76, 0x56, 0x56, 0x7E, 0x3C}, {0x20, 0x76, 0x56, 0x56, 0x7E, 0x3C},
{0x7F, 0x7F, 0x6C, 0x6C, 0x7C, 0x38}, {0x7F, 0x7F, 0x6C, 0x6C, 0x7C, 0x38},
{0x3C, 0x7E, 0x66, 0x66, 0x66, 0x24}, {0x38, 0x7C, 0x6C, 0x6C, 0x6C, 0x00},
{0x38, 0x7C, 0x6C, 0x6C, 0x7F, 0x7F}, {0x38, 0x7C, 0x6C, 0x6C, 0x7F, 0x7F},
{0x3C, 0x7E, 0x56, 0x56, 0x5E, 0x0C}, {0x3C, 0x7E, 0x56, 0x56, 0x5E, 0x0C},
{0x7C, 0x7E, 0x36, 0x36, 0x06, 0x00}, {0x7E, 0x7F, 0x1B, 0x1B, 0x02, 0x00},
{0x0C, 0x5E, 0x56, 0x56, 0x7E, 0x3C}, {0x0C, 0x5E, 0x56, 0x56, 0x7E, 0x3C},
{0x7F, 0x7F, 0x0C, 0x0C, 0x7C, 0x78}, {0x7F, 0x7F, 0x0C, 0x0C, 0x7C, 0x78},
{0x00, 0x00, 0x7A, 0x7A, 0x00, 0x00}, {0x00, 0x00, 0x7A, 0x7A, 0x00, 0x00},
@@ -516,7 +462,7 @@ const uint8_t gFontSmall[95][6] =
{0x7C, 0x7C, 0x0C, 0x0C, 0x7C, 0x78}, {0x7C, 0x7C, 0x0C, 0x0C, 0x7C, 0x78},
{0x3C, 0x7E, 0x66, 0x66, 0x7E, 0x3C}, {0x3C, 0x7E, 0x66, 0x66, 0x7E, 0x3C},
{0x7E, 0x7E, 0x36, 0x36, 0x3E, 0x1C}, {0x7E, 0x7E, 0x36, 0x36, 0x3E, 0x1C},
{0x1C, 0x3E, 0x36, 0x3E, 0x7E, 0x40}, {0x1C, 0x3E, 0x36, 0x7E, 0x7E, 0x60},
{0x7C, 0x7C, 0x0C, 0x0C, 0x18, 0x00}, {0x7C, 0x7C, 0x0C, 0x0C, 0x18, 0x00},
{0x4C, 0x5E, 0x56, 0x56, 0x76, 0x20}, {0x4C, 0x5E, 0x56, 0x56, 0x76, 0x20},
{0x3F, 0x7F, 0x6C, 0x6C, 0x60, 0x00}, {0x3F, 0x7F, 0x6C, 0x6C, 0x60, 0x00},
@@ -524,11 +470,177 @@ const uint8_t gFontSmall[95][6] =
{0x0C, 0x3C, 0x70, 0x70, 0x3C, 0x0C}, {0x0C, 0x3C, 0x70, 0x70, 0x3C, 0x0C},
{0x3C, 0x7C, 0x30, 0x30, 0x7C, 0x3C}, {0x3C, 0x7C, 0x30, 0x30, 0x7C, 0x3C},
{0x44, 0x6C, 0x38, 0x38, 0x6C, 0x44}, {0x44, 0x6C, 0x38, 0x38, 0x6C, 0x44},
{0x06, 0x6E, 0x6C, 0x6C, 0x7E, 0x3E}, {0x06, 0x6E, 0x68, 0x68, 0x7E, 0x3E},
{0x66, 0x76, 0x7E, 0x6E, 0x66, 0x00}, {0x66, 0x76, 0x7E, 0x6E, 0x66, 0x00},
{0x08, 0x3E, 0x77, 0x41, 0x00, 0x00}, {0x08, 0x3E, 0x77, 0x41, 0x00, 0x00},
{0x00, 0x00, 0x7F, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x7F, 0x00, 0x00, 0x00},
{0x00, 0x41, 0x77, 0x3E, 0x08, 0x00}, {0x00, 0x41, 0x77, 0x3E, 0x08, 0x00},
{0x0C, 0x06, 0x0C, 0x18, 0x0C, 0x00}, {0x0C, 0x06, 0x0C, 0x18, 0x0C, 0x00}
}; };
#endif #endif
#ifdef ENABLE_SPECTRUM
const uint8_t gFont3x5[160][3] =
{
{0x00, 0x00, 0x00}, // 32 - space
{0x00, 0x17, 0x00}, // 33 - exclam
{0x03, 0x00, 0x03}, // 34 - quotedbl
{0x1f, 0x0a, 0x1f}, // 35 - numbersign
{0x0a, 0x1f, 0x05}, // 36 - dollar
{0x09, 0x04, 0x12}, // 37 - percent
{0x0f, 0x17, 0x1c}, // 38 - ampersand
{0x00, 0x03, 0x00}, // 39 - quotesingle
{0x00, 0x0e, 0x11}, // 40 - parenleft
{0x11, 0x0e, 0x00}, // 41 - parenright
{0x05, 0x02, 0x05}, // 42 - asterisk
{0x04, 0x0e, 0x04}, // 43 - plus
{0x10, 0x08, 0x00}, // 44 - comma
{0x04, 0x04, 0x04}, // 45 - hyphen
{0x00, 0x10, 0x00}, // 46 - period
{0x18, 0x04, 0x03}, // 47 - slash
{0x1e, 0x11, 0x0f}, // 48 - zero
{0x02, 0x1f, 0x00}, // 49 - one
{0x19, 0x15, 0x12}, // 50 - two
{0x11, 0x15, 0x0a}, // 51 - three
{0x07, 0x04, 0x1f}, // 52 - four
{0x17, 0x15, 0x09}, // 53 - five
{0x1e, 0x15, 0x1d}, // 54 - six
{0x19, 0x05, 0x03}, // 55 - seven
{0x1f, 0x15, 0x1f}, // 56 - eight
{0x17, 0x15, 0x0f}, // 57 - nine
{0x00, 0x0a, 0x00}, // 58 - colon
{0x10, 0x0a, 0x00}, // 59 - semicolon
{0x04, 0x0a, 0x11}, // 60 - less
{0x0a, 0x0a, 0x0a}, // 61 - equal
{0x11, 0x0a, 0x04}, // 62 - greater
{0x01, 0x15, 0x03}, // 63 - question
{0x0e, 0x15, 0x16}, // 64 - at
{0x1e, 0x05, 0x1e}, // 65 - A
{0x1f, 0x15, 0x0a}, // 66 - B
{0x0e, 0x11, 0x11}, // 67 - C
{0x1f, 0x11, 0x0e}, // 68 - D
{0x1f, 0x15, 0x15}, // 69 - E
{0x1f, 0x05, 0x05}, // 70 - F
{0x0e, 0x15, 0x1d}, // 71 - G
{0x1f, 0x04, 0x1f}, // 72 - H
{0x11, 0x1f, 0x11}, // 73 - I
{0x08, 0x10, 0x0f}, // 74 - J
{0x1f, 0x04, 0x1b}, // 75 - K
{0x1f, 0x10, 0x10}, // 76 - L
{0x1f, 0x06, 0x1f}, // 77 - M
{0x1f, 0x0e, 0x1f}, // 78 - N
{0x0e, 0x11, 0x0e}, // 79 - O
{0x1f, 0x05, 0x02}, // 80 - P
{0x0e, 0x19, 0x1e}, // 81 - Q
{0x1f, 0x0d, 0x16}, // 82 - R
{0x12, 0x15, 0x09}, // 83 - S
{0x01, 0x1f, 0x01}, // 84 - T
{0x0f, 0x10, 0x1f}, // 85 - U
{0x07, 0x18, 0x07}, // 86 - V
{0x1f, 0x0c, 0x1f}, // 87 - W
{0x1b, 0x04, 0x1b}, // 88 - X
{0x03, 0x1c, 0x03}, // 89 - Y
{0x19, 0x15, 0x13}, // 90 - Z
{0x1f, 0x11, 0x11}, // 91 - bracketleft
{0x02, 0x04, 0x08}, // 92 - backslash
{0x11, 0x11, 0x1f}, // 93 - bracketright
{0x02, 0x01, 0x02}, // 94 - asciicircum
{0x10, 0x10, 0x10}, // 95 - underscore
{0x01, 0x02, 0x00}, // 96 - grave
{0x1a, 0x16, 0x1c}, // 97 - a
{0x1f, 0x12, 0x0c}, // 98 - b
{0x0c, 0x12, 0x12}, // 99 - c
{0x0c, 0x12, 0x1f}, // 100 - d
{0x0c, 0x1a, 0x16}, // 101 - e
{0x04, 0x1e, 0x05}, // 102 - f
{0x0c, 0x2a, 0x1e}, // 103 - g
{0x1f, 0x02, 0x1c}, // 104 - h
{0x00, 0x1d, 0x00}, // 105 - i
{0x10, 0x20, 0x1d}, // 106 - j
{0x1f, 0x0c, 0x12}, // 107 - k
{0x11, 0x1f, 0x10}, // 108 - l
{0x1e, 0x0e, 0x1e}, // 109 - m
{0x1e, 0x02, 0x1c}, // 110 - n
{0x0c, 0x12, 0x0c}, // 111 - o
{0x3e, 0x12, 0x0c}, // 112 - p
{0x0c, 0x12, 0x3e}, // 113 - q
{0x1c, 0x02, 0x02}, // 114 - r
{0x14, 0x1e, 0x0a}, // 115 - s
{0x02, 0x1f, 0x12}, // 116 - t
{0x0e, 0x10, 0x1e}, // 117 - u
{0x0e, 0x18, 0x0e}, // 118 - v
{0x1e, 0x1c, 0x1e}, // 119 - w
{0x12, 0x0c, 0x12}, // 120 - x
{0x06, 0x28, 0x1e}, // 121 - y
{0x1a, 0x1e, 0x16}, // 122 - z
{0x04, 0x1b, 0x11}, // 123 - braceleft
{0x00, 0x1b, 0x00}, // 124 - bar
{0x11, 0x1b, 0x04}, // 125 - braceright
{0x02, 0x03, 0x01}, // 126 - asciitilde
{0x00, 0x00, 0x00}, // 127 - empty
{0x00, 0x00, 0x00}, // 128 - empty
{0x00, 0x00, 0x00}, // 129 - empty
{0x00, 0x00, 0x00}, // 130 - empty
{0x00, 0x00, 0x00}, // 131 - empty
{0x00, 0x00, 0x00}, // 132 - empty
{0x00, 0x00, 0x00}, // 133 - empty
{0x00, 0x00, 0x00}, // 134 - empty
{0x00, 0x00, 0x00}, // 135 - empty
{0x00, 0x00, 0x00}, // 136 - empty
{0x00, 0x00, 0x00}, // 137 - empty
{0x00, 0x00, 0x00}, // 138 - empty
{0x00, 0x00, 0x00}, // 139 - empty
{0x00, 0x00, 0x00}, // 140 - empty
{0x00, 0x00, 0x00}, // 141 - empty
{0x00, 0x00, 0x00}, // 142 - empty
{0x00, 0x00, 0x00}, // 143 - empty
{0x00, 0x00, 0x00}, // 144 - empty
{0x00, 0x00, 0x00}, // 145 - empty
{0x00, 0x00, 0x00}, // 146 - empty
{0x00, 0x00, 0x00}, // 147 - empty
{0x00, 0x00, 0x00}, // 148 - empty
{0x00, 0x00, 0x00}, // 149 - empty
{0x00, 0x00, 0x00}, // 150 - empty
{0x00, 0x00, 0x00}, // 151 - empty
{0x00, 0x00, 0x00}, // 152 - empty
{0x00, 0x00, 0x00}, // 153 - empty
{0x00, 0x00, 0x00}, // 154 - empty
{0x00, 0x00, 0x00}, // 155 - empty
{0x00, 0x00, 0x00}, // 156 - empty
{0x00, 0x00, 0x00}, // 157 - empty
{0x00, 0x00, 0x00}, // 158 - empty
{0x00, 0x00, 0x00}, // 159 - empty
{0x00, 0x00, 0x00}, // 160 - empty
{0x00, 0x1d, 0x00}, // 161 - exclamdown
{0x0e, 0x1b, 0x0a}, // 162 - cent
{0x14, 0x1f, 0x15}, // 163 - sterling
{0x15, 0x0e, 0x15}, // 164 - currency
{0x0b, 0x1c, 0x0b}, // 165 - yen
{0x00, 0x1b, 0x00}, // 166 - brokenbar
{0x14, 0x1b, 0x05}, // 167 - section
{0x01, 0x00, 0x01}, // 168 - dieresis
{0x02, 0x05, 0x05}, // 169 - copyright
{0x16, 0x15, 0x17}, // 170 - ordfeminine
{0x02, 0x05, 0x00}, // 171 - guillemotleft
{0x02, 0x02, 0x06}, // 172 - logicalnot
{0x04, 0x04, 0x00}, // 173 - softhyphen
{0x07, 0x03, 0x04}, // 174 - registered
{0x01, 0x01, 0x01}, // 175 - macron
{0x02, 0x05, 0x02}, // 176 - degree
{0x12, 0x17, 0x12}, // 177 - plusminus
{0x01, 0x07, 0x04}, // 178 - twosuperior
{0x05, 0x07, 0x07}, // 179 - threesuperior
{0x00, 0x02, 0x01}, // 180 - acute
{0x1f, 0x08, 0x07}, // 181 - mu
{0x02, 0x1d, 0x1f}, // 182 - paragraph
{0x0e, 0x0e, 0x0e}, // 183 - periodcentered
{0x10, 0x14, 0x08}, // 184 - cedilla
{0x00, 0x07, 0x00}, // 185 - onesuperior
{0x12, 0x15, 0x12}, // 186 - ordmasculine
{0x00, 0x05, 0x02}, // 187 - guillemotright
{0x03, 0x08, 0x18}, // 188 - onequarter
{0x0b, 0x18, 0x10}, // 189 - onehalf
{0x03, 0x0b, 0x18}, // 190 - threequarters
{0x18, 0x15, 0x10}, // 191 - questiondown
};
#endif

View File

@@ -22,6 +22,7 @@
#endif #endif
#include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/gpio.h"
#include "dcs.h" #include "dcs.h"
#include "driver/backlight.h"
#if defined(ENABLE_FMRADIO) #if defined(ENABLE_FMRADIO)
#include "driver/bk1080.h" #include "driver/bk1080.h"
#endif #endif
@@ -55,12 +56,15 @@ void FUNCTION_Init(void)
#endif #endif
DTMF_clear_RX(); DTMF_clear_RX();
g_CxCSS_TAIL_Found = false; g_CxCSS_TAIL_Found = false;
g_CDCSS_Lost = false; g_CDCSS_Lost = false;
g_CTCSS_Lost = false; g_CTCSS_Lost = false;
g_VOX_Lost = false; #ifdef ENABLE_VOX
g_VOX_Lost = false;
#endif
g_SquelchLost = false; g_SquelchLost = false;
gFlagTailNoteEliminationComplete = false; gFlagTailNoteEliminationComplete = false;
@@ -74,6 +78,8 @@ void FUNCTION_Init(void)
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
gNOAACountdown_10ms = 0; gNOAACountdown_10ms = 0;
#endif #endif
gUpdateStatus = true;
} }
void FUNCTION_Select(FUNCTION_Type_t Function) void FUNCTION_Select(FUNCTION_Type_t Function)
@@ -110,37 +116,44 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
gFM_RestoreCountdown_10ms = fm_restore_countdown_10ms; gFM_RestoreCountdown_10ms = fm_restore_countdown_10ms;
#endif #endif
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT ||
gDTMF_AUTO_RESET_TIME = 1 + (gEeprom.DTMF_AUTO_RESET_TIME * 2); gDTMF_CallState == DTMF_CALL_STATE_RECEIVED ||
gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY)
{
gDTMF_auto_reset_time_500ms = gEeprom.DTMF_auto_reset_time * 2;
}
gUpdateStatus = true;
return; return;
case FUNCTION_MONITOR: case FUNCTION_MONITOR:
gMonitor = true; gMonitor = true;
break; break;
case FUNCTION_INCOMING: case FUNCTION_INCOMING:
case FUNCTION_RECEIVE: case FUNCTION_RECEIVE:
break; break;
case FUNCTION_POWER_SAVE: case FUNCTION_POWER_SAVE:
gPowerSave_10ms = gEeprom.BATTERY_SAVE * 10; gPowerSave_10ms = gEeprom.BATTERY_SAVE * 10;
gPowerSaveCountdownExpired = false; gPowerSaveCountdownExpired = false;
gRxIdleMode = true; gRxIdleMode = true;
gMonitor = false; gMonitor = false;
BK4819_DisableVox(); BK4819_DisableVox();
BK4819_Sleep(); BK4819_Sleep();
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, false); BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, false);
gUpdateStatus = true; gUpdateStatus = true;
GUI_SelectNextDisplay(DISPLAY_MAIN); if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
GUI_SelectNextDisplay(DISPLAY_MAIN);
return; return;
case FUNCTION_TRANSMIT: case FUNCTION_TRANSMIT:
// if DTMF is enabled when TX'ing, it changes the TX audio filtering !! .. 1of11 // if DTMF is enabled when TX'ing, it changes the TX audio filtering !! .. 1of11
@@ -153,7 +166,7 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
gDTMF_RX_live_timeout = 0; gDTMF_RX_live_timeout = 0;
gDTMF_RX_live_timeout = 0; gDTMF_RX_live_timeout = 0;
memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live)); memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live));
#if defined(ENABLE_FMRADIO) #if defined(ENABLE_FMRADIO)
if (gFmRadioMode) if (gFmRadioMode)
BK1080_Init(0, false); BK1080_Init(0, false);
@@ -183,16 +196,21 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
break; break;
} }
#endif #endif
gUpdateStatus = true;
GUI_DisplayScreen(); GUI_DisplayScreen();
RADIO_SetTxParameters(); RADIO_SetTxParameters();
// turn the RED LED on // turn the RED LED on
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, true); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, true);
DTMF_Reply(); DTMF_Reply();
if (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO)
BK4819_PlaySingleTone(2525, 250, 0, gEeprom.DTMF_SIDE_TONE);
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState != ALARM_STATE_OFF) if (gAlarmState != ALARM_STATE_OFF)
{ {
@@ -219,6 +237,9 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
else else
BK4819_DisableScramble(); BK4819_DisableScramble();
if (gSetting_backlight_on_tx_rx == 1 || gSetting_backlight_on_tx_rx == 3)
BACKLIGHT_TurnOn();
break; break;
case FUNCTION_BAND_SCOPE: case FUNCTION_BAND_SCOPE:

View File

@@ -106,7 +106,7 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
gBatteryVoltageAverage = (Voltage * 760) / gBatteryCalibration[3]; gBatteryVoltageAverage = (Voltage * 760) / gBatteryCalibration[3];
if ((gScreenToDisplay == DISPLAY_MENU) && gMenuCursor == MENU_VOL) if ((gScreenToDisplay == DISPLAY_MENU) && GetCurrentMenuId() == MENU_VOL)
gUpdateDisplay = true; gUpdateDisplay = true;
if (gBatteryCurrent < 501) if (gBatteryCurrent < 501)

View File

@@ -75,7 +75,9 @@ void BOOT_ProcessMode(BOOT_Mode_t Mode)
{ {
gEeprom.DUAL_WATCH = DUAL_WATCH_OFF; gEeprom.DUAL_WATCH = DUAL_WATCH_OFF;
gEeprom.BATTERY_SAVE = 0; gEeprom.BATTERY_SAVE = 0;
gEeprom.VOX_SWITCH = false; #ifdef ENABLE_VOX
gEeprom.VOX_SWITCH = false;
#endif
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
gEeprom.AUTO_KEYPAD_LOCK = false; gEeprom.AUTO_KEYPAD_LOCK = false;
gEeprom.KEY_1_SHORT_PRESS_ACTION = ACTION_OPT_NONE; gEeprom.KEY_1_SHORT_PRESS_ACTION = ACTION_OPT_NONE;

View File

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.2 MiB

14
init.c
View File

@@ -30,21 +30,17 @@ void DATA_Init(void);
void BSS_Init(void) void BSS_Init(void)
{ {
uint32_t *pBss; uint32_t *pBss;
for (pBss = __bss_start__; pBss < __bss_end__; pBss++)
for (pBss = __bss_start__; pBss < __bss_end__; pBss++) {
*pBss = 0; *pBss = 0;
}
} }
void DATA_Init(void) void DATA_Init(void)
{ {
volatile uint32_t *pDataRam = (volatile uint32_t *)sram_data_start; volatile uint32_t *pDataRam = (volatile uint32_t *)sram_data_start;
volatile uint32_t *pDataFlash = (volatile uint32_t *)flash_data_start; volatile uint32_t *pDataFlash = (volatile uint32_t *)flash_data_start;
uint32_t Size = (uint32_t)sram_data_end - (uint32_t)sram_data_start; uint32_t Size = (uint32_t)sram_data_end - (uint32_t)sram_data_start;
uint32_t i; unsigned int i;
for (i = 0; i < Size / 4; i++) { for (i = 0; i < (Size / 4); i++)
*pDataRam++ = *pDataFlash++; *pDataRam++ = *pDataFlash++;
}
} }

46
main.c
View File

@@ -84,7 +84,7 @@ void Main(void)
BOARD_EEPROM_Init(); BOARD_EEPROM_Init();
BOARD_EEPROM_LoadMoreSettings(); BOARD_EEPROM_LoadCalibration();
RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD);
RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD);
@@ -103,26 +103,21 @@ void Main(void)
#endif #endif
BootMode = BOOT_GetMode(); BootMode = BOOT_GetMode();
// count the number of menu items
gMenuListCount = 0;
while (MenuList[gMenuListCount].name[0] != '\0')
gMenuListCount++;
if (BootMode == BOOT_MODE_F_LOCK) if (BootMode == BOOT_MODE_F_LOCK)
{ {
gF_LOCK = true; // flag to say include the hidden menu items gF_LOCK = true; // flag to say include the hidden menu items
} }
else
{ // hide the hidden menu items
gMenuListCount -= 9; // count the number of menu items
gMenuListCount = 0;
while (MenuList[gMenuListCount].name[0] != '\0') {
if(!gF_LOCK && MenuList[gMenuListCount].menu_id == FIRST_HIDDEN_MENU_ITEM)
break;
#ifndef ENABLE_F_CAL_MENU gMenuListCount++;
gMenuListCount++;
#endif
} }
// wait for user to release all butts before moving on // wait for user to release all butts before moving on
if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) || if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) ||
KEYBOARD_Poll() != KEY_INVALID || KEYBOARD_Poll() != KEY_INVALID ||
@@ -167,19 +162,21 @@ void Main(void)
boot_counter_10ms = 0; boot_counter_10ms = 0;
break; break;
} }
#ifdef ENABLE_BOOT_BEEPS #ifdef ENABLE_BOOT_BEEPS
if ((boot_counter_10ms % 25) == 0) if ((boot_counter_10ms % 25) == 0)
AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL); AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL);
#endif #endif
} }
} }
#ifdef ENABLE_PWRON_PASSWORD
if (gEeprom.POWER_ON_PASSWORD < 1000000) if (gEeprom.POWER_ON_PASSWORD < 1000000)
{ {
bIsInLockScreen = true; bIsInLockScreen = true;
UI_DisplayLock(); UI_DisplayLock();
bIsInLockScreen = false; bIsInLockScreen = false;
} }
#endif
BOOT_ProcessMode(BootMode); BOOT_ProcessMode(BootMode);
@@ -187,29 +184,28 @@ void Main(void)
gUpdateStatus = true; gUpdateStatus = true;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
{ {
uint8_t Channel; uint8_t Channel;
AUDIO_SetVoiceID(0, VOICE_ID_WELCOME); AUDIO_SetVoiceID(0, VOICE_ID_WELCOME);
Channel = gEeprom.ScreenChannel[gEeprom.TX_CHANNEL]; Channel = gEeprom.ScreenChannel[gEeprom.TX_VFO];
if (IS_MR_CHANNEL(Channel)) if (IS_MR_CHANNEL(Channel))
{ {
AUDIO_SetVoiceID(1, VOICE_ID_CHANNEL_MODE); AUDIO_SetVoiceID(1, VOICE_ID_CHANNEL_MODE);
AUDIO_SetDigitVoice(2, Channel + 1); AUDIO_SetDigitVoice(2, Channel + 1);
} }
else else if (IS_FREQ_CHANNEL(Channel))
if (IS_FREQ_CHANNEL(Channel))
AUDIO_SetVoiceID(1, VOICE_ID_FREQUENCY_MODE); AUDIO_SetVoiceID(1, VOICE_ID_FREQUENCY_MODE);
AUDIO_PlaySingleVoice(0); AUDIO_PlaySingleVoice(0);
} }
#endif #endif
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
RADIO_ConfigureNOAA(); RADIO_ConfigureNOAA();
#endif #endif
// ****************** // ******************
} }

44
misc.c
View File

@@ -17,13 +17,15 @@
#include <string.h> #include <string.h>
#include "misc.h" #include "misc.h"
#include "settings.h"
const uint8_t fm_resume_countdown_500ms = 2500 / 500; // 2.5 seconds
const uint8_t fm_radio_countdown_500ms = 2000 / 500; // 2 seconds const uint8_t fm_radio_countdown_500ms = 2000 / 500; // 2 seconds
const uint16_t fm_play_countdown_scan_10ms = 100 / 10; // 100ms const uint16_t fm_play_countdown_scan_10ms = 100 / 10; // 100ms
const uint16_t fm_play_countdown_noscan_10ms = 1200 / 10; // 1.2 seconds const uint16_t fm_play_countdown_noscan_10ms = 1200 / 10; // 1.2 seconds
const uint16_t fm_restore_countdown_10ms = 5000 / 10; // 5 seconds const uint16_t fm_restore_countdown_10ms = 5000 / 10; // 5 seconds
const uint8_t vfo_state_resume_countdown_500ms = 2500 / 500; // 2.5 seconds
const uint8_t menu_timeout_500ms = 20000 / 500; // 20 seconds const uint8_t menu_timeout_500ms = 20000 / 500; // 20 seconds
const uint16_t menu_timeout_long_500ms = 120000 / 500; // 2 minutes const uint16_t menu_timeout_long_500ms = 120000 / 500; // 2 minutes
@@ -45,7 +47,9 @@ const uint16_t dual_watch_count_after_rx_10ms = 1000 / 10; // 1 sec afte
const uint16_t dual_watch_count_after_1_10ms = 5000 / 10; // 5 sec const uint16_t dual_watch_count_after_1_10ms = 5000 / 10; // 5 sec
const uint16_t dual_watch_count_after_2_10ms = 3600 / 10; // 3.6 sec const uint16_t dual_watch_count_after_2_10ms = 3600 / 10; // 3.6 sec
const uint16_t dual_watch_count_noaa_10ms = 70 / 10; // 70ms const uint16_t dual_watch_count_noaa_10ms = 70 / 10; // 70ms
const uint16_t dual_watch_count_after_vox_10ms = 200 / 10; // 200ms #ifdef ENABLE_VOX
const uint16_t dual_watch_count_after_vox_10ms = 200 / 10; // 200ms
#endif
const uint16_t dual_watch_count_toggle_10ms = 100 / 10; // 100ms between VFO toggles const uint16_t dual_watch_count_toggle_10ms = 100 / 10; // 100ms between VFO toggles
const uint16_t scan_pause_delay_in_1_10ms = 5000 / 10; // 5 seconds const uint16_t scan_pause_delay_in_1_10ms = 5000 / 10; // 5 seconds
@@ -61,7 +65,9 @@ const uint16_t battery_save_count_10ms = 10000 / 10; // 10 seconds
const uint16_t power_save1_10ms = 100 / 10; // 100ms const uint16_t power_save1_10ms = 100 / 10; // 100ms
const uint16_t power_save2_10ms = 200 / 10; // 200ms const uint16_t power_save2_10ms = 200 / 10; // 200ms
const uint16_t vox_stop_count_down_10ms = 1000 / 10; // 1 second #ifdef ENABLE_VOX
const uint16_t vox_stop_count_down_10ms = 1000 / 10; // 1 second
#endif
const uint16_t NOAA_countdown_10ms = 5000 / 10; // 5 seconds const uint16_t NOAA_countdown_10ms = 5000 / 10; // 5 seconds
const uint16_t NOAA_countdown_2_10ms = 500 / 10; // 500ms const uint16_t NOAA_countdown_2_10ms = 500 / 10; // 500ms
@@ -83,6 +89,8 @@ bool gSetting_TX_EN;
uint8_t gSetting_F_LOCK; uint8_t gSetting_F_LOCK;
bool gSetting_ScrambleEnable; bool gSetting_ScrambleEnable;
uint8_t gSetting_backlight_on_tx_rx;
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
bool gSetting_AM_fix; bool gSetting_AM_fix;
#endif #endif
@@ -102,12 +110,7 @@ bool bHasCustomAesKey;
uint32_t gChallenge[4]; uint32_t gChallenge[4];
uint8_t gTryCount; uint8_t gTryCount;
uint8_t gEEPROM_1EC0_0[8]; uint16_t gEEPROM_RSSI_CALIB[7][4];
uint8_t gEEPROM_1EC0_1[8];
uint8_t gEEPROM_1EC0_2[8];
uint8_t gEEPROM_1EC0_3[8];
uint16_t gEEPROM_RSSI_CALIB[2][4];
uint16_t gEEPROM_1F8A; uint16_t gEEPROM_1F8A;
uint16_t gEEPROM_1F8C; uint16_t gEEPROM_1F8C;
@@ -126,7 +129,6 @@ volatile bool gDualWatchCountdownExpired = true;
bool gDualWatchActive = false; bool gDualWatchActive = false;
volatile uint8_t gSerialConfigCountDown_500ms; volatile uint8_t gSerialConfigCountDown_500ms;
volatile bool gSerialConfigCountDown_done;
volatile bool gNextTimeslice_500ms; volatile bool gNextTimeslice_500ms;
@@ -135,6 +137,8 @@ volatile bool gTxTimeoutReached;
volatile uint16_t gTailNoteEliminationCountdown_10ms; volatile uint16_t gTailNoteEliminationCountdown_10ms;
volatile uint8_t gVFOStateResumeCountdown_500ms;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
volatile uint16_t gNOAA_Countdown_10ms; volatile uint16_t gNOAA_Countdown_10ms;
#endif #endif
@@ -187,19 +191,20 @@ bool g_CDCSS_Lost;
uint8_t gCDCSSCodeType; uint8_t gCDCSSCodeType;
bool g_CTCSS_Lost; bool g_CTCSS_Lost;
bool g_CxCSS_TAIL_Found; bool g_CxCSS_TAIL_Found;
bool g_VOX_Lost; #ifdef ENABLE_VOX
bool g_VOX_Lost;
bool gVOX_NoiseDetected;
uint16_t gVoxResumeCountdown;
uint16_t gVoxPauseCountdown;
#endif
bool g_SquelchLost; bool g_SquelchLost;
uint8_t gFlashLightState; uint8_t gFlashLightState;
bool gVOX_NoiseDetected;
uint16_t gVoxResumeCountdown;
uint16_t gVoxPauseCountdown;
volatile uint16_t gFlashLightBlinkCounter; volatile uint16_t gFlashLightBlinkCounter;
bool gFlagEndTransmission; bool gFlagEndTransmission;
uint16_t gLowBatteryCountdown; uint16_t gLowBatteryCountdown;
uint8_t gNextMrChannel; uint8_t gNextMrChannel;
ReceptionMode_t gRxReceptionMode; ReceptionMode_t gRxReceptionMode;
uint8_t gRestoreMrChannel;
enum scan_next_chan_t gCurrentScanList; enum scan_next_chan_t gCurrentScanList;
uint32_t gRestoreFrequency; uint32_t gRestoreFrequency;
@@ -212,13 +217,12 @@ bool gKeyBeingHeld;
bool gPttIsPressed; bool gPttIsPressed;
uint8_t gPttDebounceCounter; uint8_t gPttDebounceCounter;
uint8_t gMenuListCount; uint8_t gMenuListCount;
uint8_t gBackupCROSS_BAND_RX_TX; uint8_t gBackup_CROSS_BAND_RX_TX;
uint8_t gScanDelay_10ms; uint8_t gScanDelay_10ms;
#ifdef ENABLE_AIRCOPY #ifdef ENABLE_AIRCOPY
uint8_t gAircopySendCountdown; uint8_t gAircopySendCountdown;
#endif #endif
uint8_t gFSKWriteIndex; uint8_t gFSKWriteIndex;
uint8_t gNeverUsed;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
bool gIsNoaaMode; bool gIsNoaaMode;
@@ -234,7 +238,9 @@ uint8_t gShowChPrefix;
volatile bool gNextTimeslice; volatile bool gNextTimeslice;
volatile uint8_t gFoundCDCSSCountdown_10ms; volatile uint8_t gFoundCDCSSCountdown_10ms;
volatile uint8_t gFoundCTCSSCountdown_10ms; volatile uint8_t gFoundCTCSSCountdown_10ms;
volatile uint16_t gVoxStopCountdown_10ms; #ifdef ENABLE_VOX
volatile uint16_t gVoxStopCountdown_10ms;
#endif
volatile bool gNextTimeslice40ms; volatile bool gNextTimeslice40ms;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
volatile uint16_t gNOAACountdown_10ms = 0; volatile uint16_t gNOAACountdown_10ms = 0;
@@ -251,8 +257,6 @@ int16_t gCurrentRSSI[2] = {0, 0}; // now one per VFO
uint8_t gIsLocked = 0xFF; uint8_t gIsLocked = 0xFF;
// --------
void NUMBER_Get(char *pDigits, uint32_t *pInteger) void NUMBER_Get(char *pDigits, uint32_t *pInteger)
{ {
unsigned int i; unsigned int i;

69
misc.h
View File

@@ -24,31 +24,36 @@
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif #endif
#define IS_MR_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= MR_CHANNEL_LAST) #ifndef MAX
#define IS_FREQ_CHANNEL(x) ((x) >= FREQ_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) #define MAX(a, b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a : _b; })
#define IS_VALID_CHANNEL(x) ((x) < LAST_CHANNEL)
#ifdef ENABLE_NOAA
#define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST)
#define IS_NOT_NOAA_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST)
#endif #endif
#ifndef MIN
#define MIN(a, b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; })
#endif
#define IS_MR_CHANNEL(x) ((x) <= MR_CHANNEL_LAST)
#define IS_FREQ_CHANNEL(x) ((x) >= FREQ_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST)
#define IS_VALID_CHANNEL(x) ((x) < LAST_CHANNEL)
#define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST)
#define IS_NOT_NOAA_CHANNEL(x) ((x) <= FREQ_CHANNEL_LAST)
enum { enum {
MR_CHANNEL_FIRST = 0, MR_CHANNEL_FIRST = 0,
MR_CHANNEL_LAST = 199u, MR_CHANNEL_LAST = 199u,
FREQ_CHANNEL_FIRST = 200u, FREQ_CHANNEL_FIRST = 200u,
FREQ_CHANNEL_LAST = 206u, FREQ_CHANNEL_LAST = 206u,
#ifdef ENABLE_NOAA NOAA_CHANNEL_FIRST = 207u,
NOAA_CHANNEL_FIRST = 207u, NOAA_CHANNEL_LAST = 216u,
NOAA_CHANNEL_LAST = 216u,
#endif
LAST_CHANNEL LAST_CHANNEL
}; };
enum { enum {
FLASHLIGHT_OFF = 0, FLASHLIGHT_OFF = 0,
FLASHLIGHT_ON, FLASHLIGHT_ON,
FLASHLIGHT_BLINK FLASHLIGHT_BLINK,
FLASHLIGHT_SOS
}; };
enum { enum {
@@ -89,12 +94,13 @@ enum scan_next_chan_t {
}; };
typedef enum scan_next_chan_t scan_next_chan_t; typedef enum scan_next_chan_t scan_next_chan_t;
extern const uint8_t fm_resume_countdown_500ms;
extern const uint8_t fm_radio_countdown_500ms; extern const uint8_t fm_radio_countdown_500ms;
extern const uint16_t fm_play_countdown_scan_10ms; extern const uint16_t fm_play_countdown_scan_10ms;
extern const uint16_t fm_play_countdown_noscan_10ms; extern const uint16_t fm_play_countdown_noscan_10ms;
extern const uint16_t fm_restore_countdown_10ms; extern const uint16_t fm_restore_countdown_10ms;
extern const uint8_t vfo_state_resume_countdown_500ms;
extern const uint8_t menu_timeout_500ms; extern const uint8_t menu_timeout_500ms;
extern const uint16_t menu_timeout_long_500ms; extern const uint16_t menu_timeout_long_500ms;
@@ -116,7 +122,9 @@ extern const uint16_t battery_save_count_10ms;
extern const uint16_t power_save1_10ms; extern const uint16_t power_save1_10ms;
extern const uint16_t power_save2_10ms; extern const uint16_t power_save2_10ms;
extern const uint16_t vox_stop_count_down_10ms; #ifdef ENABLE_VOX
extern const uint16_t vox_stop_count_down_10ms;
#endif
extern const uint16_t NOAA_countdown_10ms; extern const uint16_t NOAA_countdown_10ms;
extern const uint16_t NOAA_countdown_2_10ms; extern const uint16_t NOAA_countdown_2_10ms;
@@ -128,7 +136,9 @@ extern const uint16_t dual_watch_count_after_1_10ms;
extern const uint16_t dual_watch_count_after_2_10ms; extern const uint16_t dual_watch_count_after_2_10ms;
extern const uint16_t dual_watch_count_toggle_10ms; extern const uint16_t dual_watch_count_toggle_10ms;
extern const uint16_t dual_watch_count_noaa_10ms; extern const uint16_t dual_watch_count_noaa_10ms;
extern const uint16_t dual_watch_count_after_vox_10ms; #ifdef ENABLE_VOX
extern const uint16_t dual_watch_count_after_vox_10ms;
#endif
extern const uint16_t scan_pause_delay_in_1_10ms; extern const uint16_t scan_pause_delay_in_1_10ms;
extern const uint16_t scan_pause_delay_in_2_10ms; extern const uint16_t scan_pause_delay_in_2_10ms;
@@ -152,6 +162,8 @@ extern bool gSetting_TX_EN;
extern uint8_t gSetting_F_LOCK; extern uint8_t gSetting_F_LOCK;
extern bool gSetting_ScrambleEnable; extern bool gSetting_ScrambleEnable;
extern uint8_t gSetting_backlight_on_tx_rx;
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
extern bool gSetting_AM_fix; extern bool gSetting_AM_fix;
#endif #endif
@@ -172,12 +184,7 @@ extern bool bHasCustomAesKey;
extern uint32_t gChallenge[4]; extern uint32_t gChallenge[4];
extern uint8_t gTryCount; extern uint8_t gTryCount;
extern uint8_t gEEPROM_1EC0_0[8]; extern uint16_t gEEPROM_RSSI_CALIB[7][4];
extern uint8_t gEEPROM_1EC0_1[8];
extern uint8_t gEEPROM_1EC0_2[8];
extern uint8_t gEEPROM_1EC0_3[8];
extern uint16_t gEEPROM_RSSI_CALIB[2][4];
extern uint16_t gEEPROM_1F8A; extern uint16_t gEEPROM_1F8A;
extern uint16_t gEEPROM_1F8C; extern uint16_t gEEPROM_1F8C;
@@ -196,7 +203,6 @@ extern volatile bool gDualWatchCountdownExpired;
extern bool gDualWatchActive; extern bool gDualWatchActive;
extern volatile uint8_t gSerialConfigCountDown_500ms; extern volatile uint8_t gSerialConfigCountDown_500ms;
extern volatile bool gSerialConfigCountDown_done;
extern volatile bool gNextTimeslice_500ms; extern volatile bool gNextTimeslice_500ms;
@@ -257,19 +263,20 @@ extern bool g_CDCSS_Lost;
extern uint8_t gCDCSSCodeType; extern uint8_t gCDCSSCodeType;
extern bool g_CTCSS_Lost; extern bool g_CTCSS_Lost;
extern bool g_CxCSS_TAIL_Found; extern bool g_CxCSS_TAIL_Found;
extern bool g_VOX_Lost; #ifdef ENABLE_VOX
extern bool g_VOX_Lost;
extern bool gVOX_NoiseDetected;
extern uint16_t gVoxResumeCountdown;
extern uint16_t gVoxPauseCountdown;
#endif
extern bool g_SquelchLost; extern bool g_SquelchLost;
extern uint8_t gFlashLightState; extern uint8_t gFlashLightState;
extern bool gVOX_NoiseDetected;
extern uint16_t gVoxResumeCountdown;
extern uint16_t gVoxPauseCountdown;
extern volatile uint16_t gFlashLightBlinkCounter; extern volatile uint16_t gFlashLightBlinkCounter;
extern bool gFlagEndTransmission; extern bool gFlagEndTransmission;
extern uint16_t gLowBatteryCountdown; extern uint16_t gLowBatteryCountdown;
extern uint8_t gNextMrChannel; extern uint8_t gNextMrChannel;
extern ReceptionMode_t gRxReceptionMode; extern ReceptionMode_t gRxReceptionMode;
extern uint8_t gRestoreMrChannel;
extern scan_next_chan_t gCurrentScanList; extern scan_next_chan_t gCurrentScanList;
extern uint32_t gRestoreFrequency; extern uint32_t gRestoreFrequency;
@@ -280,13 +287,12 @@ extern bool gKeyBeingHeld;
extern bool gPttIsPressed; extern bool gPttIsPressed;
extern uint8_t gPttDebounceCounter; extern uint8_t gPttDebounceCounter;
extern uint8_t gMenuListCount; extern uint8_t gMenuListCount;
extern uint8_t gBackupCROSS_BAND_RX_TX; extern uint8_t gBackup_CROSS_BAND_RX_TX;
extern uint8_t gScanDelay_10ms; extern uint8_t gScanDelay_10ms;
#ifdef ENABLE_AIRCOPY #ifdef ENABLE_AIRCOPY
extern uint8_t gAircopySendCountdown; extern uint8_t gAircopySendCountdown;
#endif #endif
extern uint8_t gFSKWriteIndex; extern uint8_t gFSKWriteIndex;
extern uint8_t gNeverUsed;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
extern bool gIsNoaaMode; extern bool gIsNoaaMode;
extern uint8_t gNoaaChannel; extern uint8_t gNoaaChannel;
@@ -300,13 +306,16 @@ extern bool gF_LOCK;
extern uint8_t gShowChPrefix; extern uint8_t gShowChPrefix;
extern volatile uint8_t gFoundCDCSSCountdown_10ms; extern volatile uint8_t gFoundCDCSSCountdown_10ms;
extern volatile uint8_t gFoundCTCSSCountdown_10ms; extern volatile uint8_t gFoundCTCSSCountdown_10ms;
extern volatile uint16_t gVoxStopCountdown_10ms; #ifdef ENABLE_VOX
extern volatile uint16_t gVoxStopCountdown_10ms;
#endif
extern volatile bool gNextTimeslice40ms; extern volatile bool gNextTimeslice40ms;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
extern volatile uint16_t gNOAACountdown_10ms; extern volatile uint16_t gNOAACountdown_10ms;
extern volatile bool gScheduleNOAA; extern volatile bool gScheduleNOAA;
#endif #endif
extern volatile bool gFlagTailNoteEliminationComplete; extern volatile bool gFlagTailNoteEliminationComplete;
extern volatile uint8_t gVFOStateResumeCountdown_500ms;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
extern volatile bool gScheduleFM; extern volatile bool gScheduleFM;
#endif #endif

283
radio.c
View File

@@ -51,7 +51,7 @@ bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO)
uint8_t PriorityCh1; uint8_t PriorityCh1;
uint8_t PriorityCh2; uint8_t PriorityCh2;
if (!IS_MR_CHANNEL(Channel)) if (Channel > MR_CHANNEL_LAST)
return false; return false;
Attributes = gMR_ChannelAttributes[Channel]; Attributes = gMR_ChannelAttributes[Channel];
@@ -130,9 +130,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t
pInfo->freq_config_TX.Frequency = Frequency; pInfo->freq_config_TX.Frequency = Frequency;
pInfo->pRX = &pInfo->freq_config_RX; pInfo->pRX = &pInfo->freq_config_RX;
pInfo->pTX = &pInfo->freq_config_TX; pInfo->pTX = &pInfo->freq_config_TX;
#ifdef ENABLE_COMPANDER pInfo->Compander = 0; // off
pInfo->Compander = 0; // off
#endif
if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz)) if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz))
pInfo->AM_mode = 1; pInfo->AM_mode = 1;
@@ -163,22 +161,22 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
if (IS_VALID_CHANNEL(Channel)) if (IS_VALID_CHANNEL(Channel))
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (Channel >= NOAA_CHANNEL_FIRST) if (Channel >= NOAA_CHANNEL_FIRST)
{ {
RADIO_InitInfo(pRadio, gEeprom.ScreenChannel[VFO], NoaaFrequencyTable[Channel - NOAA_CHANNEL_FIRST]); RADIO_InitInfo(pRadio, gEeprom.ScreenChannel[VFO], NoaaFrequencyTable[Channel - NOAA_CHANNEL_FIRST]);
if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF)
return;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
gUpdateStatus = true;
return; return;
}
#endif
if (IS_MR_CHANNEL(Channel)) gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
gUpdateStatus = true;
return;
}
#endif
if (Channel <= MR_CHANNEL_LAST)
{ {
Channel = RADIO_FindNextChannel(Channel, RADIO_CHANNEL_UP, false, VFO); Channel = RADIO_FindNextChannel(Channel, RADIO_CHANNEL_UP, false, VFO);
if (Channel == 0xFF) if (Channel == 0xFF)
@@ -202,7 +200,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
uint8_t Index; uint8_t Index;
if (IS_MR_CHANNEL(Channel)) if (Channel <= MR_CHANNEL_LAST)
{ {
Channel = gEeprom.FreqChannel[VFO]; Channel = gEeprom.FreqChannel[VFO];
gEeprom.ScreenChannel[VFO] = gEeprom.FreqChannel[VFO]; gEeprom.ScreenChannel[VFO] = gEeprom.FreqChannel[VFO];
@@ -218,10 +216,9 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
if (Band > BAND7_470MHz) if (Band > BAND7_470MHz)
{ {
Band = BAND6_400MHz; Band = BAND6_400MHz;
// Band = FREQUENCY_GetBand(gEeprom.ScreenChannel[VFO]); // 1of11 bug fix, or have I broke it ?
} }
if (IS_MR_CHANNEL(Channel)) if (Channel <= MR_CHANNEL_LAST)
{ {
gEeprom.VfoInfo[VFO].Band = Band; gEeprom.VfoInfo[VFO].Band = Band;
gEeprom.VfoInfo[VFO].SCANLIST1_PARTICIPATION = !!(Attributes & MR_CH_SCANLIST1); gEeprom.VfoInfo[VFO].SCANLIST1_PARTICIPATION = !!(Attributes & MR_CH_SCANLIST1);
@@ -238,7 +235,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
gEeprom.VfoInfo[VFO].SCANLIST2_PARTICIPATION = bParticipation2; gEeprom.VfoInfo[VFO].SCANLIST2_PARTICIPATION = bParticipation2;
gEeprom.VfoInfo[VFO].CHANNEL_SAVE = Channel; gEeprom.VfoInfo[VFO].CHANNEL_SAVE = Channel;
if (IS_MR_CHANNEL(Channel)) if (Channel <= MR_CHANNEL_LAST)
Base = Channel * 16; Base = Channel * 16;
else else
Base = 0x0C80 + ((Channel - FREQ_CHANNEL_FIRST) * 32) + (VFO * 16); Base = 0x0C80 + ((Channel - FREQ_CHANNEL_FIRST) * 32) + (VFO * 16);
@@ -335,16 +332,16 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
if (Data[5] == 0xFF) if (Data[5] == 0xFF)
{ {
gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = false; gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = false;
gEeprom.VfoInfo[VFO].DTMF_PTT_ID_TX_MODE = 0; gEeprom.VfoInfo[VFO].DTMF_PTT_ID_TX_MODE = PTT_ID_OFF;
} }
else else
{ {
gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = !!((Data[5] >> 0) & 1u); gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = ((Data[5] >> 0) & 1u) ? true : false;
gEeprom.VfoInfo[VFO].DTMF_PTT_ID_TX_MODE = ((Data[5] >> 1) & 3u); gEeprom.VfoInfo[VFO].DTMF_PTT_ID_TX_MODE = ((Data[5] >> 1) & 7u);
} }
// *************** // ***************
struct struct
{ {
uint32_t Frequency; uint32_t Frequency;
@@ -372,8 +369,8 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
if (Frequency < frequencyBandTable[Band].lower) if (Frequency < frequencyBandTable[Band].lower)
Frequency = frequencyBandTable[Band].lower; Frequency = frequencyBandTable[Band].lower;
else else
if (Frequency > frequencyBandTable[Band + 1].upper) if (Frequency > frequencyBandTable[Band].upper)
Frequency = frequencyBandTable[Band + 1].upper; Frequency = frequencyBandTable[Band].upper;
else else
if (Channel >= FREQ_CHANNEL_FIRST) if (Channel >= FREQ_CHANNEL_FIRST)
Frequency = FREQUENCY_FloorToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency, frequencyBandTable[Band].lower); Frequency = FREQUENCY_FloorToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency, frequencyBandTable[Band].lower);
@@ -383,13 +380,13 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
if (Frequency >= 10800000 && Frequency < 13600000) if (Frequency >= 10800000 && Frequency < 13600000)
gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = TX_OFFSET_FREQUENCY_DIRECTION_OFF; gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = TX_OFFSET_FREQUENCY_DIRECTION_OFF;
else else
if (!IS_MR_CHANNEL(Channel)) if (Channel > MR_CHANNEL_LAST)
gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY = FREQUENCY_FloorToStep(gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY, gEeprom.VfoInfo[VFO].StepFrequency, 0); gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY = FREQUENCY_FloorToStep(gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY, gEeprom.VfoInfo[VFO].StepFrequency, 0);
RADIO_ApplyOffset(pRadio); RADIO_ApplyOffset(pRadio);
memset(gEeprom.VfoInfo[VFO].Name, 0, sizeof(gEeprom.VfoInfo[VFO].Name)); memset(gEeprom.VfoInfo[VFO].Name, 0, sizeof(gEeprom.VfoInfo[VFO].Name));
if (IS_MR_CHANNEL(Channel)) if (Channel < MR_CHANNEL_LAST)
{ // 16 bytes allocated to the channel name but only 10 used, the rest are 0's { // 16 bytes allocated to the channel name but only 10 used, the rest are 0's
EEPROM_ReadBuffer(0x0F50 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 0, 8); EEPROM_ReadBuffer(0x0F50 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 0, 8);
EEPROM_ReadBuffer(0x0F58 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 8, 2); EEPROM_ReadBuffer(0x0F58 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 8, 2);
@@ -421,9 +418,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
gEeprom.VfoInfo[VFO].freq_config_TX.CodeType = CODE_TYPE_OFF; gEeprom.VfoInfo[VFO].freq_config_TX.CodeType = CODE_TYPE_OFF;
} }
#ifdef ENABLE_COMPANDER gEeprom.VfoInfo[VFO].Compander = (Attributes & MR_CH_COMPAND) >> 4;
gEeprom.VfoInfo[VFO].Compander = (Attributes & MR_CH_COMPAND) >> 4;
#endif
RADIO_ConfigureSquelchAndOutputPower(pRadio); RADIO_ConfigureSquelchAndOutputPower(pRadio);
} }
@@ -431,22 +426,27 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo) void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
{ {
uint8_t Txp[3]; uint8_t Txp[3];
FREQUENCY_Band_t Band = FREQUENCY_GetBand(pInfo->pRX->Frequency); FREQUENCY_Band_t Band;
uint16_t Base = (Band < BAND4_174MHz) ? 0x1E60 : 0x1E00;
// *******************************
// squelch
Band = FREQUENCY_GetBand(pInfo->pRX->Frequency);
uint16_t Base = (Band < BAND4_174MHz) ? 0x1E60 : 0x1E00;
if (gEeprom.SQUELCH_LEVEL == 0) if (gEeprom.SQUELCH_LEVEL == 0)
{ // squelch == 0 (off) { // squelch == 0 (off)
pInfo->SquelchOpenRSSIThresh = 0; pInfo->SquelchOpenRSSIThresh = 0; // 0 ~ 255
pInfo->SquelchOpenNoiseThresh = 127; pInfo->SquelchOpenNoiseThresh = 127; // 127 ~ 0
pInfo->SquelchCloseGlitchThresh = 255; pInfo->SquelchCloseGlitchThresh = 255; // 255 ~ 0
pInfo->SquelchCloseRSSIThresh = 0; pInfo->SquelchCloseRSSIThresh = 0; // 0 ~ 255
pInfo->SquelchCloseNoiseThresh = 127; pInfo->SquelchCloseNoiseThresh = 127; // 127 ~ 0
pInfo->SquelchOpenGlitchThresh = 255; pInfo->SquelchOpenGlitchThresh = 255; // 255 ~ 0
} }
else else
{ // squelch >= 1 { // squelch >= 1
Base += gEeprom.SQUELCH_LEVEL; // my squelch-1 Base += gEeprom.SQUELCH_LEVEL; // my eeprom squelch-1
// VHF UHF // VHF UHF
EEPROM_ReadBuffer(Base + 0x00, &pInfo->SquelchOpenRSSIThresh, 1); // 50 10 EEPROM_ReadBuffer(Base + 0x00, &pInfo->SquelchOpenRSSIThresh, 1); // 50 10
EEPROM_ReadBuffer(Base + 0x10, &pInfo->SquelchCloseRSSIThresh, 1); // 40 5 EEPROM_ReadBuffer(Base + 0x10, &pInfo->SquelchCloseRSSIThresh, 1); // 40 5
@@ -457,26 +457,61 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
EEPROM_ReadBuffer(Base + 0x40, &pInfo->SquelchCloseGlitchThresh, 1); // 90 90 EEPROM_ReadBuffer(Base + 0x40, &pInfo->SquelchCloseGlitchThresh, 1); // 90 90
EEPROM_ReadBuffer(Base + 0x50, &pInfo->SquelchOpenGlitchThresh, 1); // 100 100 EEPROM_ReadBuffer(Base + 0x50, &pInfo->SquelchOpenGlitchThresh, 1); // 100 100
#if ENABLE_SQUELCH_LOWER uint16_t rssi_open = pInfo->SquelchOpenRSSIThresh;
// make squelch more sensitive uint16_t rssi_close = pInfo->SquelchCloseRSSIThresh;
uint16_t noise_open = pInfo->SquelchOpenNoiseThresh;
uint16_t noise_close = pInfo->SquelchCloseNoiseThresh;
uint16_t glitch_open = pInfo->SquelchOpenGlitchThresh;
uint16_t glitch_close = pInfo->SquelchCloseGlitchThresh;
pInfo->SquelchOpenRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 8) / 9; #if ENABLE_SQUELCH_MORE_SENSITIVE
pInfo->SquelchCloseRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 7) / 8; // make squelch a little more sensitive
//
// getting the best setting here is still experimental, bare with me
//
// note that 'noise' and 'glitch' values are inverted compared to 'rssi' values
pInfo->SquelchOpenNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 8) / 7; #if 0
pInfo->SquelchCloseNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 9) / 8; rssi_open = (rssi_open * 8) / 9;
noise_open = (noise_open * 9) / 8;
glitch_open = (glitch_open * 9) / 8;
#else
// even more sensitive .. use when RX bandwidths are fixed (no weak signal auto adjust)
rssi_open = (rssi_open * 1) / 2;
noise_open = (noise_open * 2) / 1;
glitch_open = (glitch_open * 2) / 1;
#endif
pInfo->SquelchOpenGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 8) / 7; #else
pInfo->SquelchCloseGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 9) / 8; // more sensitive .. use when RX bandwidths are fixed (no weak signal auto adjust)
rssi_open = (rssi_open * 3) / 4;
noise_open = (noise_open * 4) / 3;
glitch_open = (glitch_open * 4) / 3;
#endif #endif
if (pInfo->SquelchOpenNoiseThresh > 127) rssi_close = (rssi_open * 9) / 10;
pInfo->SquelchOpenNoiseThresh = 127; noise_close = (noise_open * 10) / 9;
glitch_close = (glitch_open * 10) / 9;
if (pInfo->SquelchCloseNoiseThresh > 127) // ensure the 'close' threshold is lower than the 'open' threshold
pInfo->SquelchCloseNoiseThresh = 127; if (rssi_close == rssi_open && rssi_close >= 2)
rssi_close -= 2;
if (noise_close == noise_open && noise_close <= 125)
noise_close += 2;
if (glitch_close == glitch_open && glitch_close <= 253)
glitch_close += 2;
pInfo->SquelchOpenRSSIThresh = (rssi_open > 255) ? 255 : rssi_open;
pInfo->SquelchCloseRSSIThresh = (rssi_close > 255) ? 255 : rssi_close;
pInfo->SquelchOpenNoiseThresh = (noise_open > 127) ? 127 : noise_open;
pInfo->SquelchCloseNoiseThresh = (noise_close > 127) ? 127 : noise_close;
pInfo->SquelchOpenGlitchThresh = (glitch_open > 255) ? 255 : glitch_open;
pInfo->SquelchCloseGlitchThresh = (glitch_close > 255) ? 255 : glitch_close;
} }
// *******************************
// output power
Band = FREQUENCY_GetBand(pInfo->pTX->Frequency); Band = FREQUENCY_GetBand(pInfo->pTX->Frequency);
EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->OUTPUT_POWER * 3), Txp, 3); EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->OUTPUT_POWER * 3), Txp, 3);
@@ -489,6 +524,8 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
(frequencyBandTable[Band].lower + frequencyBandTable[Band].upper) / 2, (frequencyBandTable[Band].lower + frequencyBandTable[Band].upper) / 2,
frequencyBandTable[Band].upper, frequencyBandTable[Band].upper,
pInfo->pTX->Frequency); pInfo->pTX->Frequency);
// *******************************
} }
void RADIO_ApplyOffset(VFO_Info_t *pInfo) void RADIO_ApplyOffset(VFO_Info_t *pInfo)
@@ -518,37 +555,22 @@ void RADIO_ApplyOffset(VFO_Info_t *pInfo)
static void RADIO_SelectCurrentVfo(void) static void RADIO_SelectCurrentVfo(void)
{ {
gCurrentVfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gRxVfo : &gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; gCurrentVfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gRxVfo : &gEeprom.VfoInfo[gEeprom.TX_VFO];
} }
void RADIO_SelectVfos(void) void RADIO_SelectVfos(void)
{ {
if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_B) gEeprom.RX_VFO = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.TX_VFO : !gEeprom.TX_VFO;
gEeprom.TX_CHANNEL = 1;
else
if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_A)
gEeprom.TX_CHANNEL = 0;
else
if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_B)
gEeprom.TX_CHANNEL = 1;
else
if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_A)
gEeprom.TX_CHANNEL = 0;
if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) gTxVfo = &gEeprom.VfoInfo[gEeprom.TX_VFO];
gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL; gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_VFO];
else
gEeprom.RX_CHANNEL = (gEeprom.TX_CHANNEL == 0) ? 1 : 0;
gTxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL];
gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_CHANNEL];
RADIO_SelectCurrentVfo(); RADIO_SelectCurrentVfo();
} }
void RADIO_SetupRegisters(bool bSwitchToFunction0) void RADIO_SetupRegisters(bool bSwitchToFunction0)
{ {
BK4819_FilterBandwidth_t Bandwidth; BK4819_FilterBandwidth_t Bandwidth = gRxVfo->CHANNEL_BANDWIDTH;
uint16_t InterruptMask; uint16_t InterruptMask;
uint32_t Frequency; uint32_t Frequency;
@@ -558,16 +580,16 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_GREEN, false); BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_GREEN, false);
Bandwidth = gRxVfo->CHANNEL_BANDWIDTH;
switch (Bandwidth) switch (Bandwidth)
{ {
default: default:
Bandwidth = BK4819_FILTER_BW_WIDE; Bandwidth = BK4819_FILTER_BW_WIDE;
[[fallthrough]];
case BK4819_FILTER_BW_WIDE: case BK4819_FILTER_BW_WIDE:
case BK4819_FILTER_BW_NARROW: case BK4819_FILTER_BW_NARROW:
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
BK4819_SetFilterBandwidth(Bandwidth, gRxVfo->AM_mode && gSetting_AM_fix); // BK4819_SetFilterBandwidth(Bandwidth, gRxVfo->AM_mode && gSetting_AM_fix);
// BK4819_SetFilterBandwidth(Bandwidth, false); BK4819_SetFilterBandwidth(Bandwidth, true);
#else #else
BK4819_SetFilterBandwidth(Bandwidth, false); BK4819_SetFilterBandwidth(Bandwidth, false);
#endif #endif
@@ -611,6 +633,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
BK4819_PickRXFilterPathBasedOnFrequency(Frequency); BK4819_PickRXFilterPathBasedOnFrequency(Frequency);
// what does this in do ?
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, true); BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, true);
// AF RX Gain and DAC // AF RX Gain and DAC
@@ -623,7 +646,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
#endif #endif
{ {
if (gRxVfo->AM_mode == 0) if (gRxVfo->AM_mode == 0)
{ { // FM
uint8_t CodeType = gSelectedCodeType; uint8_t CodeType = gSelectedCodeType;
uint8_t Code = gSelectedCode; uint8_t Code = gSelectedCode;
if (gCssScanMode == CSS_SCAN_MODE_OFF) if (gCssScanMode == CSS_SCAN_MODE_OFF)
@@ -695,30 +718,30 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
} }
#endif #endif
#ifdef ENABLE_NOAA #ifdef ENABLE_VOX
#ifdef ENABLE_FMRADIO #ifdef ENABLE_NOAA
if (gEeprom.VOX_SWITCH && !gFmRadioMode && IS_NOT_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0) #ifdef ENABLE_FMRADIO
if (gEeprom.VOX_SWITCH && !gFmRadioMode && IS_NOT_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0)
#else
if (gEeprom.VOX_SWITCH && IS_NOT_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0)
#endif
#else #else
if (gEeprom.VOX_SWITCH && IS_NOT_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0) #ifdef ENABLE_FMRADIO
#endif if (gEeprom.VOX_SWITCH && !gFmRadioMode && gCurrentVfo->AM_mode == 0)
#else #else
#ifdef ENABLE_FMRADIO if (gEeprom.VOX_SWITCH && gCurrentVfo->AM_mode == 0)
if (gEeprom.VOX_SWITCH && !gFmRadioMode && gCurrentVfo->AM_mode == 0) #endif
#else
if (gEeprom.VOX_SWITCH && gCurrentVfo->AM_mode == 0)
#endif #endif
{
BK4819_EnableVox(gEeprom.VOX1_THRESHOLD, gEeprom.VOX0_THRESHOLD);
InterruptMask |= BK4819_REG_3F_VOX_FOUND | BK4819_REG_3F_VOX_LOST;
}
else
#endif #endif
{
BK4819_EnableVox(gEeprom.VOX1_THRESHOLD, gEeprom.VOX0_THRESHOLD);
InterruptMask |= BK4819_REG_3F_VOX_FOUND | BK4819_REG_3F_VOX_LOST;
}
else
BK4819_DisableVox(); BK4819_DisableVox();
#ifdef ENABLE_COMPANDER // RX expander
// RX expander BK4819_SetCompander((gRxVfo->AM_mode == 0 && gRxVfo->Compander >= 2) ? gRxVfo->Compander : 0);
BK4819_SetCompander((gRxVfo->AM_mode == 0 && gRxVfo->Compander >= 2) ? gRxVfo->Compander : 0);
#endif
#if 0 #if 0
if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED) if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED)
@@ -733,6 +756,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
#else #else
if (gCurrentFunction != FUNCTION_TRANSMIT) if (gCurrentFunction != FUNCTION_TRANSMIT)
{ {
BK4819_DisableDTMF();
BK4819_EnableDTMF(); BK4819_EnableDTMF();
InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND; InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND;
} }
@@ -810,11 +834,12 @@ void RADIO_SetTxParameters(void)
{ {
default: default:
Bandwidth = BK4819_FILTER_BW_WIDE; Bandwidth = BK4819_FILTER_BW_WIDE;
[[fallthrough]];
case BK4819_FILTER_BW_WIDE: case BK4819_FILTER_BW_WIDE:
case BK4819_FILTER_BW_NARROW: case BK4819_FILTER_BW_NARROW:
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
BK4819_SetFilterBandwidth(Bandwidth, gCurrentVfo->AM_mode && gSetting_AM_fix); // BK4819_SetFilterBandwidth(Bandwidth, gCurrentVfo->AM_mode && gSetting_AM_fix);
// BK4819_SetFilterBandwidth(Bandwidth, false); BK4819_SetFilterBandwidth(Bandwidth, true);
#else #else
BK4819_SetFilterBandwidth(Bandwidth, false); BK4819_SetFilterBandwidth(Bandwidth, false);
#endif #endif
@@ -823,10 +848,8 @@ void RADIO_SetTxParameters(void)
BK4819_SetFrequency(gCurrentVfo->pTX->Frequency); BK4819_SetFrequency(gCurrentVfo->pTX->Frequency);
#ifdef ENABLE_COMPANDER // TX compressor
// TX compressor BK4819_SetCompander((gRxVfo->AM_mode == 0 && (gRxVfo->Compander == 1 || gRxVfo->Compander >= 3)) ? gRxVfo->Compander : 0);
BK4819_SetCompander((gRxVfo->AM_mode == 0 && (gRxVfo->Compander == 1 || gRxVfo->Compander >= 3)) ? gRxVfo->Compander : 0);
#endif
BK4819_PrepareTransmit(); BK4819_PrepareTransmit();
@@ -866,10 +889,7 @@ void RADIO_SetVfoState(VfoState_t State)
{ {
VfoState[0] = VFO_STATE_NORMAL; VfoState[0] = VFO_STATE_NORMAL;
VfoState[1] = VFO_STATE_NORMAL; VfoState[1] = VFO_STATE_NORMAL;
gVFOStateResumeCountdown_500ms = 0;
#ifdef ENABLE_FMRADIO
gFM_ResumeCountdown_500ms = 0;
#endif
} }
else else
{ {
@@ -879,15 +899,12 @@ void RADIO_SetVfoState(VfoState_t State)
VfoState[1] = VFO_STATE_TX_DISABLE; VfoState[1] = VFO_STATE_TX_DISABLE;
} }
else else
{ { // 1of11
unsigned int chan = (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) ? (gEeprom.RX_CHANNEL + 1) & 1 : gEeprom.RX_CHANNEL; // 1of11 const unsigned int vfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO;
chan = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.TX_CHANNEL : chan; VfoState[vfo] = State;
VfoState[chan] = State;
} }
#ifdef ENABLE_FMRADIO gVFOStateResumeCountdown_500ms = vfo_state_resume_countdown_500ms;
gFM_ResumeCountdown_500ms = fm_resume_countdown_500ms;
#endif
} }
gUpdateDisplay = true; gUpdateDisplay = true;
@@ -904,11 +921,12 @@ void RADIO_PrepareTX(void)
gScheduleDualWatch = false; gScheduleDualWatch = false;
if (!gRxVfoIsActive) if (!gRxVfoIsActive)
{ // use the TX vfo { // use the current RX vfo
gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL; gEeprom.RX_VFO = gEeprom.TX_VFO;
gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_VFO];
gRxVfoIsActive = true; gRxVfoIsActive = true;
} }
gCurrentVfo = gRxVfo;
// let the user see that DW is not active // let the user see that DW is not active
gDualWatchActive = false; gDualWatchActive = false;
@@ -936,12 +954,11 @@ void RADIO_PrepareTX(void)
} }
else else
#endif #endif
if (!gSetting_TX_EN) if (!gSetting_TX_EN || gSerialConfigCountDown_500ms > 0)
{ // TX is disabled { // TX is disabled or config upload/download in progress
State = VFO_STATE_TX_DISABLE; State = VFO_STATE_TX_DISABLE;
} }
else else
//if (TX_freq_check(gCurrentVfo->pTX->Frequency) == 0 || gCurrentVfo->CHANNEL_SAVE <= FREQ_CHANNEL_LAST)
if (TX_freq_check(gCurrentVfo->pTX->Frequency) == 0) if (TX_freq_check(gCurrentVfo->pTX->Frequency) == 0)
{ // TX frequency is allowed { // TX frequency is allowed
if (gCurrentVfo->BUSY_CHANNEL_LOCK && gCurrentFunction == FUNCTION_RECEIVE) if (gCurrentVfo->BUSY_CHANNEL_LOCK && gCurrentFunction == FUNCTION_RECEIVE)
@@ -960,16 +977,19 @@ void RADIO_PrepareTX(void)
if (State != VFO_STATE_NORMAL) if (State != VFO_STATE_NORMAL)
{ // TX not allowed { // TX not allowed
RADIO_SetVfoState(State); RADIO_SetVfoState(State);
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
gAlarmState = ALARM_STATE_OFF; gAlarmState = ALARM_STATE_OFF;
#endif #endif
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL); AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL);
return; return;
} }
// TX is allowed // TX is allowed
if (gDTMF_ReplyState == DTMF_REPLY_ANI) if (gDTMF_ReplyState == DTMF_REPLY_ANI)
{ {
if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF) if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF)
@@ -1047,8 +1067,12 @@ void RADIO_SendEndOfTransmission(void)
if (gEeprom.ROGER == ROGER_MODE_MDC) if (gEeprom.ROGER == ROGER_MODE_MDC)
BK4819_PlayRogerMDC(); BK4819_PlayRogerMDC();
if (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO)
BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE);
if (gDTMF_CallState == DTMF_CALL_STATE_NONE && if (gDTMF_CallState == DTMF_CALL_STATE_NONE &&
(gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH)) (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN ||
gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH))
{ // end-of-tx { // end-of-tx
if (gEeprom.DTMF_SIDE_TONE) if (gEeprom.DTMF_SIDE_TONE)
{ {
@@ -1060,15 +1084,14 @@ void RADIO_SendEndOfTransmission(void)
BK4819_EnterDTMF_TX(gEeprom.DTMF_SIDE_TONE); BK4819_EnterDTMF_TX(gEeprom.DTMF_SIDE_TONE);
BK4819_PlayDTMFString( BK4819_PlayDTMFString(
gEeprom.DTMF_DOWN_CODE, gEeprom.DTMF_DOWN_CODE,
0, 0,
gEeprom.DTMF_FIRST_CODE_PERSIST_TIME, gEeprom.DTMF_FIRST_CODE_PERSIST_TIME,
gEeprom.DTMF_HASH_CODE_PERSIST_TIME, gEeprom.DTMF_HASH_CODE_PERSIST_TIME,
gEeprom.DTMF_CODE_PERSIST_TIME, gEeprom.DTMF_CODE_PERSIST_TIME,
gEeprom.DTMF_CODE_INTERVAL_TIME); gEeprom.DTMF_CODE_INTERVAL_TIME);
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gEnableSpeaker = false; gEnableSpeaker = false;
} }

11
radio.h
View File

@@ -25,9 +25,7 @@
enum { enum {
MR_CH_BAND_MASK = 0x0F << 0, MR_CH_BAND_MASK = 0x0F << 0,
#ifdef ENABLE_COMPANDER MR_CH_COMPAND = 3u << 4, // new
MR_CH_COMPAND = 3u << 4, // new
#endif
MR_CH_SCANLIST2 = 1u << 6, MR_CH_SCANLIST2 = 1u << 6,
MR_CH_SCANLIST1 = 1u << 7 MR_CH_SCANLIST1 = 1u << 7
}; };
@@ -46,7 +44,8 @@ enum PTT_ID_t {
PTT_ID_OFF = 0, // OFF PTT_ID_OFF = 0, // OFF
PTT_ID_TX_UP, // BEGIN OF TX PTT_ID_TX_UP, // BEGIN OF TX
PTT_ID_TX_DOWN, // END OF TX PTT_ID_TX_DOWN, // END OF TX
PTT_ID_BOTH // BOTH PTT_ID_BOTH, // BOTH
PTT_ID_APOLLO // Apolo quindar tones
}; };
typedef enum PTT_ID_t PTT_ID_t; typedef enum PTT_ID_t PTT_ID_t;
@@ -111,9 +110,7 @@ typedef struct VFO_Info_t
uint8_t AM_mode; uint8_t AM_mode;
#ifdef ENABLE_COMPANDER uint8_t Compander;
uint8_t Compander;
#endif
char Name[16]; char Name[16];
} VFO_Info_t; } VFO_Info_t;

View File

@@ -57,7 +57,7 @@ void SystickHandler(void)
gNextTimeslice_500ms = true; gNextTimeslice_500ms = true;
DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached); DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached);
DECREMENT_AND_TRIGGER(gSerialConfigCountDown_500ms, gSerialConfigCountDown_done); DECREMENT(gSerialConfigCountDown_500ms);
} }
if ((gGlobalSysTickCounter & 3) == 0) if ((gGlobalSysTickCounter & 3) == 0)
@@ -77,20 +77,20 @@ void SystickHandler(void)
if (gCurrentFunction == FUNCTION_POWER_SAVE) if (gCurrentFunction == FUNCTION_POWER_SAVE)
DECREMENT_AND_TRIGGER(gPowerSave_10ms, gPowerSaveCountdownExpired); DECREMENT_AND_TRIGGER(gPowerSave_10ms, gPowerSaveCountdownExpired);
if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) if (gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF)
if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT && gCurrentFunction != FUNCTION_RECEIVE) if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT && gCurrentFunction != FUNCTION_RECEIVE)
DECREMENT_AND_TRIGGER(gDualWatchCountdown_10ms, gScheduleDualWatch); DECREMENT_AND_TRIGGER(gDualWatchCountdown_10ms, gScheduleDualWatch);
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH == DUAL_WATCH_OFF) if (gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH == DUAL_WATCH_OFF)
if (gIsNoaaMode && gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT) if (gIsNoaaMode && gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT)
if (gCurrentFunction != FUNCTION_RECEIVE) if (gCurrentFunction != FUNCTION_RECEIVE)
DECREMENT_AND_TRIGGER(gNOAA_Countdown_10ms, gScheduleNOAA); DECREMENT_AND_TRIGGER(gNOAA_Countdown_10ms, gScheduleNOAA);
#endif #endif
if (gScanState != SCAN_OFF || gCssScanMode == CSS_SCAN_MODE_SCANNING) if (gScanStateDir != SCAN_OFF || gCssScanMode == CSS_SCAN_MODE_SCANNING)
if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT) if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT)
DECREMENT_AND_TRIGGER(ScanPauseDelayIn_10ms, gScheduleScanListen); DECREMENT_AND_TRIGGER(gScanPauseDelayIn_10ms, gScheduleScanListen);
DECREMENT_AND_TRIGGER(gTailNoteEliminationCountdown_10ms, gFlagTailNoteEliminationComplete); DECREMENT_AND_TRIGGER(gTailNoteEliminationCountdown_10ms, gFlagTailNoteEliminationComplete);
@@ -104,7 +104,9 @@ void SystickHandler(void)
DECREMENT_AND_TRIGGER(gFmPlayCountdown_10ms, gScheduleFM); DECREMENT_AND_TRIGGER(gFmPlayCountdown_10ms, gScheduleFM);
#endif #endif
DECREMENT(gVoxStopCountdown_10ms); #ifdef ENABLE_VOX
DECREMENT(gVoxStopCountdown_10ms);
#endif
DECREMENT(boot_counter_10ms); DECREMENT(boot_counter_10ms);
} }

View File

@@ -86,8 +86,13 @@ void SETTINGS_SaveSettings(void)
State[3] = false; State[3] = false;
#endif #endif
State[4] = gEeprom.KEY_LOCK; State[4] = gEeprom.KEY_LOCK;
State[5] = gEeprom.VOX_SWITCH; #ifdef ENABLE_VOX
State[6] = gEeprom.VOX_LEVEL; State[5] = gEeprom.VOX_SWITCH;
State[6] = gEeprom.VOX_LEVEL;
#else
State[5] = false;
State[6] = 0;
#endif
State[7] = gEeprom.MIC_SENSITIVITY; State[7] = gEeprom.MIC_SENSITIVITY;
EEPROM_WriteBuffer(0x0E70, State); EEPROM_WriteBuffer(0x0E70, State);
@@ -112,8 +117,10 @@ void SETTINGS_SaveSettings(void)
EEPROM_WriteBuffer(0x0E90, State); EEPROM_WriteBuffer(0x0E90, State);
memset(Password, 0xFF, sizeof(Password)); memset(Password, 0xFF, sizeof(Password));
Password[0] = gEeprom.POWER_ON_PASSWORD; #ifdef ENABLE_PWRON_PASSWORD
EEPROM_WriteBuffer(0x0E98, State); Password[0] = gEeprom.POWER_ON_PASSWORD;
#endif
EEPROM_WriteBuffer(0x0E98, Password);
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
memset(State, 0xFF, sizeof(State)); memset(State, 0xFF, sizeof(State));
@@ -128,14 +135,14 @@ void SETTINGS_SaveSettings(void)
#endif #endif
State[1] = gEeprom.ROGER; State[1] = gEeprom.ROGER;
State[2] = gEeprom.REPEATER_TAIL_TONE_ELIMINATION; State[2] = gEeprom.REPEATER_TAIL_TONE_ELIMINATION;
State[3] = gEeprom.TX_CHANNEL; State[3] = gEeprom.TX_VFO;
EEPROM_WriteBuffer(0x0EA8, State); EEPROM_WriteBuffer(0x0EA8, State);
State[0] = gEeprom.DTMF_SIDE_TONE; State[0] = gEeprom.DTMF_SIDE_TONE;
State[1] = gEeprom.DTMF_SEPARATE_CODE; State[1] = gEeprom.DTMF_SEPARATE_CODE;
State[2] = gEeprom.DTMF_GROUP_CALL_CODE; State[2] = gEeprom.DTMF_GROUP_CALL_CODE;
State[3] = gEeprom.DTMF_DECODE_RESPONSE; State[3] = gEeprom.DTMF_DECODE_RESPONSE;
State[4] = gEeprom.DTMF_AUTO_RESET_TIME; State[4] = gEeprom.DTMF_auto_reset_time;
State[5] = gEeprom.DTMF_PRELOAD_TIME / 10U; State[5] = gEeprom.DTMF_PRELOAD_TIME / 10U;
State[6] = gEeprom.DTMF_FIRST_CODE_PERSIST_TIME / 10U; State[6] = gEeprom.DTMF_FIRST_CODE_PERSIST_TIME / 10U;
State[7] = gEeprom.DTMF_HASH_CODE_PERSIST_TIME / 10U; State[7] = gEeprom.DTMF_HASH_CODE_PERSIST_TIME / 10U;
@@ -174,13 +181,11 @@ void SETTINGS_SaveSettings(void)
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
if (!gSetting_AM_fix) State[7] &= ~(1u << 5); if (!gSetting_AM_fix) State[7] &= ~(1u << 5);
#endif #endif
State[7] = (State[7] & ~(3u << 6)) | ((gSetting_backlight_on_tx_rx & 3u) << 6);
EEPROM_WriteBuffer(0x0F40, State); EEPROM_WriteBuffer(0x0F40, State);
} }
void SETTINGS_LoadChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO)
{
}
void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode) void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
@@ -190,13 +195,13 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
const uint16_t OffsetMR = Channel * 16; const uint16_t OffsetMR = Channel * 16;
uint16_t OffsetVFO = OffsetMR; uint16_t OffsetVFO = OffsetMR;
if (!IS_MR_CHANNEL(Channel)) if (Channel > MR_CHANNEL_LAST)
{ // it's a VFO, not a channel { // it's a VFO, not a channel
OffsetVFO = (VFO == 0) ? 0x0C80 : 0x0C90; OffsetVFO = (VFO == 0) ? 0x0C80 : 0x0C90;
OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32; OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32;
} }
if (Mode >= 2 || !IS_MR_CHANNEL(Channel)) if (Mode >= 2 || Channel > MR_CHANNEL_LAST)
{ // copy VFO to a channel { // copy VFO to a channel
uint8_t State[8]; uint8_t State[8];
@@ -214,15 +219,16 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
| (pVFO->OUTPUT_POWER << 2) | (pVFO->OUTPUT_POWER << 2)
| (pVFO->CHANNEL_BANDWIDTH << 1) | (pVFO->CHANNEL_BANDWIDTH << 1)
| (pVFO->FrequencyReverse << 0); | (pVFO->FrequencyReverse << 0);
State[5] = (pVFO->DTMF_PTT_ID_TX_MODE << 1) | (pVFO->DTMF_DECODING_ENABLE << 0); State[5] = ((pVFO->DTMF_PTT_ID_TX_MODE & 7u) << 1) | ((pVFO->DTMF_DECODING_ENABLE & 1u) << 0);
State[6] = pVFO->STEP_SETTING; State[6] = pVFO->STEP_SETTING;
State[7] = pVFO->SCRAMBLING_TYPE; State[7] = pVFO->SCRAMBLING_TYPE;
EEPROM_WriteBuffer(OffsetVFO + 8, State); EEPROM_WriteBuffer(OffsetVFO + 8, State);
SETTINGS_UpdateChannel(Channel, pVFO, true); SETTINGS_UpdateChannel(Channel, pVFO, true);
if (IS_MR_CHANNEL(Channel)) if (Channel <= MR_CHANNEL_LAST)
{ { // it's a memory channel
#ifndef ENABLE_KEEP_MEM_NAME #ifndef ENABLE_KEEP_MEM_NAME
// clear/reset the channel name // clear/reset the channel name
//memset(&State, 0xFF, sizeof(State)); //memset(&State, 0xFF, sizeof(State));
@@ -245,6 +251,16 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
} }
} }
void SETTINGS_SaveBatteryCalibration(const uint16_t * batteryCalibration)
{
uint16_t buf[4];
EEPROM_WriteBuffer(0x1F40, batteryCalibration);
EEPROM_ReadBuffer( 0x1F48, buf, sizeof(buf));
buf[0] = batteryCalibration[4];
buf[1] = batteryCalibration[5];
EEPROM_WriteBuffer(0x1F48, buf);
}
void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep) void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
@@ -253,20 +269,15 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep)
{ {
uint8_t State[8]; uint8_t State[8];
uint8_t Attributes = 0xFF; // default attributes uint8_t Attributes = 0xFF; // default attributes
#ifdef ENABLE_COMPANDER
Attributes &= ~MR_CH_COMPAND; // default to '0' = compander disabled
#endif
uint16_t Offset = 0x0D60 + (Channel & ~7u); uint16_t Offset = 0x0D60 + (Channel & ~7u);
Attributes &= (uint8_t)(~MR_CH_COMPAND); // default to '0' = compander disabled
EEPROM_ReadBuffer(Offset, State, sizeof(State)); EEPROM_ReadBuffer(Offset, State, sizeof(State));
if (keep) if (keep)
{ {
#ifdef ENABLE_COMPANDER Attributes = (pVFO->SCANLIST1_PARTICIPATION << 7) | (pVFO->SCANLIST2_PARTICIPATION << 6) | (pVFO->Compander << 4) | (pVFO->Band << 0);
Attributes = (pVFO->SCANLIST1_PARTICIPATION << 7) | (pVFO->SCANLIST2_PARTICIPATION << 6) | (pVFO->Compander << 4) | (pVFO->Band << 0);
#else
Attributes = (pVFO->SCANLIST1_PARTICIPATION << 7) | (pVFO->SCANLIST2_PARTICIPATION << 6) | (pVFO->Band << 0);
#endif
if (State[Channel & 7u] == Attributes) if (State[Channel & 7u] == Attributes)
return; // no change in the attributes return; // no change in the attributes
} }
@@ -278,8 +289,9 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep)
gMR_ChannelAttributes[Channel] = Attributes; gMR_ChannelAttributes[Channel] = Attributes;
// #ifndef ENABLE_KEEP_MEM_NAME // #ifndef ENABLE_KEEP_MEM_NAME
if (IS_MR_CHANNEL(Channel)) if (Channel <= MR_CHANNEL_LAST)
{ { // it's a memory channel
const uint16_t OffsetMR = Channel * 16; const uint16_t OffsetMR = Channel * 16;
if (!keep) if (!keep)
{ // clear/reset the channel name { // clear/reset the channel name

View File

@@ -121,13 +121,21 @@ typedef struct {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
uint8_t NoaaChannel[2]; uint8_t NoaaChannel[2];
#endif #endif
uint8_t RX_CHANNEL; uint8_t RX_VFO;
uint8_t TX_CHANNEL; uint8_t TX_VFO;
uint8_t field7_0xa; uint8_t field7_0xa;
uint8_t field8_0xb; uint8_t field8_0xb;
uint32_t POWER_ON_PASSWORD; #ifdef ENABLE_FMRADIO
uint16_t FM_SelectedFrequency;
uint8_t FM_SelectedChannel;
bool FM_IsMrMode;
uint16_t FM_FrequencyPlaying;
uint16_t FM_LowerLimit;
uint16_t FM_UpperLimit;
#endif
uint8_t SQUELCH_LEVEL; uint8_t SQUELCH_LEVEL;
uint8_t TX_TIMEOUT_TIMER; uint8_t TX_TIMEOUT_TIMER;
bool KEY_LOCK; bool KEY_LOCK;
@@ -152,25 +160,10 @@ typedef struct {
uint8_t field29_0x26; uint8_t field29_0x26;
uint8_t field30_0x27; uint8_t field30_0x27;
uint16_t VOX1_THRESHOLD;
uint16_t VOX0_THRESHOLD;
#ifdef ENABLE_FMRADIO
uint16_t FM_SelectedFrequency;
uint8_t FM_SelectedChannel;
bool FM_IsMrMode;
uint16_t FM_FrequencyPlaying;
#endif
uint8_t field37_0x32; uint8_t field37_0x32;
uint8_t field38_0x33; uint8_t field38_0x33;
#ifdef ENABLE_FMRADIO
uint16_t FM_LowerLimit;
uint16_t FM_UpperLimit;
#endif
bool AUTO_KEYPAD_LOCK; bool AUTO_KEYPAD_LOCK;
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
ALARM_Mode_t ALARM_MODE; ALARM_Mode_t ALARM_MODE;
@@ -201,7 +194,7 @@ typedef struct {
char DTMF_SEPARATE_CODE; char DTMF_SEPARATE_CODE;
char DTMF_GROUP_CALL_CODE; char DTMF_GROUP_CALL_CODE;
uint8_t DTMF_DECODE_RESPONSE; uint8_t DTMF_DECODE_RESPONSE;
uint8_t DTMF_AUTO_RESET_TIME; uint8_t DTMF_auto_reset_time;
uint16_t DTMF_PRELOAD_TIME; uint16_t DTMF_PRELOAD_TIME;
uint16_t DTMF_FIRST_CODE_PERSIST_TIME; uint16_t DTMF_FIRST_CODE_PERSIST_TIME;
uint16_t DTMF_HASH_CODE_PERSIST_TIME; uint16_t DTMF_HASH_CODE_PERSIST_TIME;
@@ -216,12 +209,18 @@ typedef struct {
uint8_t VOLUME_GAIN; uint8_t VOLUME_GAIN;
uint8_t DAC_GAIN; uint8_t DAC_GAIN;
VFO_Info_t VfoInfo[2];
uint32_t POWER_ON_PASSWORD;
uint16_t VOX1_THRESHOLD;
uint16_t VOX0_THRESHOLD;
uint8_t field77_0x95; uint8_t field77_0x95;
uint8_t field78_0x96; uint8_t field78_0x96;
uint8_t field79_0x97; uint8_t field79_0x97;
VFO_Info_t VfoInfo[2]; uint8_t _pad[1];
} EEPROM_Config_t; } EEPROM_Config_t;
extern EEPROM_Config_t gEeprom; extern EEPROM_Config_t gEeprom;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -230,6 +229,7 @@ extern EEPROM_Config_t gEeprom;
void SETTINGS_SaveVfoIndices(void); void SETTINGS_SaveVfoIndices(void);
void SETTINGS_SaveSettings(void); void SETTINGS_SaveSettings(void);
void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode); void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode);
void SETTINGS_SaveBatteryCalibration(const uint16_t * batteryCalibration);
void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep); void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep);
#endif #endif

View File

@@ -22,66 +22,35 @@
#include "functions.h" #include "functions.h"
#include "ui/battery.h" #include "ui/battery.h"
void UI_DisplayBattery(const uint8_t level, const uint8_t blink) void UI_DrawBattery(uint8_t* bitmap, uint8_t level, uint8_t blink)
{ {
// if (gCurrentFunction != FUNCTION_TRANSMIT) if (level < 2 && blink == 1) {
memset(bitmap, 0, sizeof(BITMAP_BatteryLevel1));
}
else
{ {
uint8_t bitmap[sizeof(BITMAP_BatteryLevel1)]; memmove(bitmap, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
if (level > 1)
#if 1
if (level >= 2)
{ {
memmove(bitmap, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1)); unsigned int i;
#ifndef ENABLE_REVERSE_BAT_SYMBOL uint8_t bars = level - 1;
uint8_t *pb = bitmap + sizeof(BITMAP_BatteryLevel1); if (bars > 4)
if (level >= 2) bars = 4;
memmove(pb - 4, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); for (i = 0; i < bars; i++)
if (level >= 5) {
memmove(pb - 7, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); #ifndef ENABLE_REVERSE_BAT_SYMBOL
if (level >= 7) memcpy(bitmap + sizeof(BITMAP_BatteryLevel1) - 4 - (i * 3), BITMAP_BatteryLevel, 2);
memmove(pb - 10, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); #else
if (level >= 9) memcpy(bitmap + 3 + (i * 3) + 0, BITMAP_BatteryLevel, 2);
memmove(pb - 13, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); #endif
#else }
if (level >= 2)
memmove(bitmap + 3, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (level >= 5)
memmove(bitmap + 6, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (level >= 7)
memmove(bitmap + 9, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (level >= 9)
memmove(bitmap + 12, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
#endif
} }
else
if (blink == 1)
memmove(bitmap, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
else
memset(bitmap, 0, sizeof(bitmap));
#else
if (level > 0)
{
const uint8_t lev = (level <= 11) ? level : 11;
memmove(bitmap, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
#ifdef ENABLE_REVERSE_BAT_SYMBOL
for (uint8_t i = 0; i < lev; i++)
bitmap[3 + i] = (i & 1u) ? 0b01011101 : 0b01011101;
#else
for (uint8_t i = 0; i < lev; i++)
bitmap[sizeof(bitmap) - 3 - i] = (i & 1u) ? 0b01011101 : 0b01011101;
#endif
}
else
memset(bitmap, 0, sizeof(bitmap));
#endif
// col lne, siz, bm
ST7565_DrawLine(LCD_WIDTH - sizeof(bitmap), 0, sizeof(bitmap), bitmap);
} }
} }
void UI_DisplayBattery(uint8_t level, uint8_t blink)
{
uint8_t bitmap[sizeof(BITMAP_BatteryLevel1)];
UI_DrawBattery(bitmap, level, blink);
ST7565_DrawLine(LCD_WIDTH - sizeof(bitmap), 0, sizeof(bitmap), bitmap);
}

View File

@@ -18,8 +18,8 @@
#define UI_BATTERY_H #define UI_BATTERY_H
#include <stdint.h> #include <stdint.h>
void UI_DrawBattery(uint8_t* bitmap, uint8_t level, uint8_t blink);
void UI_DisplayBattery(const uint8_t Level, const uint8_t blink); void UI_DisplayBattery(uint8_t Level, uint8_t blink);
#endif #endif

View File

@@ -21,7 +21,7 @@
char gInputBox[8]; char gInputBox[8];
uint8_t gInputBoxIndex; uint8_t gInputBoxIndex;
void INPUTBOX_Append(char Digit) void INPUTBOX_Append(const KEY_Code_t Digit)
{ {
if (gInputBoxIndex >= sizeof(gInputBox)) if (gInputBoxIndex >= sizeof(gInputBox))
return; return;
@@ -29,6 +29,7 @@ void INPUTBOX_Append(char Digit)
if (gInputBoxIndex == 0) if (gInputBoxIndex == 0)
memset(gInputBox, 10, sizeof(gInputBox)); memset(gInputBox, 10, sizeof(gInputBox));
gInputBox[gInputBoxIndex++] = Digit; if (Digit != KEY_INVALID)
gInputBox[gInputBoxIndex++] = (char)(Digit - KEY_0);
} }

View File

@@ -19,10 +19,12 @@
#include <stdint.h> #include <stdint.h>
#include "driver/keyboard.h"
extern char gInputBox[8]; extern char gInputBox[8];
extern uint8_t gInputBoxIndex; extern uint8_t gInputBoxIndex;
void INPUTBOX_Append(char Digit); void INPUTBOX_Append(const KEY_Code_t Digit);
#endif #endif

View File

@@ -14,6 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
#ifdef ENABLE_PWRON_PASSWORD
#include <string.h> #include <string.h>
#include "ARMCM0.h" #include "ARMCM0.h"
@@ -156,3 +158,5 @@ void UI_DisplayLock(void)
} }
} }
} }
#endif

View File

@@ -17,7 +17,9 @@
#ifndef UI_LOCK_H #ifndef UI_LOCK_H
#define UI_LOCK_H #define UI_LOCK_H
void UI_DisplayLock(void); #ifdef ENABLE_PWRON_PASSWORD
void UI_DisplayLock(void);
#endif
#endif #endif

325
ui/main.c
View File

@@ -36,21 +36,26 @@
#include "ui/main.h" #include "ui/main.h"
#include "ui/ui.h" #include "ui/ui.h"
enum center_line_t {
CENTER_LINE_NONE = 0,
CENTER_LINE_IN_USE,
CENTER_LINE_AUDIO_BAR,
CENTER_LINE_RSSI,
CENTER_LINE_AM_FIX_DATA,
CENTER_LINE_DTMF_DEC,
CENTER_LINE_CHARGE_DATA
};
typedef enum center_line_t center_line_t;
center_line_t center_line = CENTER_LINE_NONE; center_line_t center_line = CENTER_LINE_NONE;
// *************************************************************************** // ***************************************************************************
void UI_drawBars(uint8_t *p, const unsigned int level)
{
switch (level)
{
default:
case 7: memmove(p + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); [[fallthrough]];
case 6: memmove(p + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); [[fallthrough]];
case 5: memmove(p + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); [[fallthrough]];
case 4: memmove(p + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); [[fallthrough]];
case 3: memmove(p + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); [[fallthrough]];
case 2: memmove(p + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); [[fallthrough]];
case 1: memmove(p + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna)); break;
case 0: memset( p + 0, 0, sizeof(BITMAP_Antenna)); break;
}
}
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
unsigned int sqrt16(unsigned int value) unsigned int sqrt16(unsigned int value)
@@ -80,46 +85,30 @@ center_line_t center_line = CENTER_LINE_NONE;
const unsigned int bar_width = LCD_WIDTH - 2 - bar_x; const unsigned int bar_width = LCD_WIDTH - 2 - bar_x;
unsigned int i; unsigned int i;
#if 1 if (gCurrentFunction != FUNCTION_TRANSMIT ||
// TX audio level gScreenToDisplay != DISPLAY_MAIN ||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
if (gCurrentFunction != FUNCTION_TRANSMIT) {
return; return; // screen is in use
}
const unsigned int voice_amp = BK4819_GetVoiceAmplitudeOut(); // 15:0
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
// const unsigned int max = 65535; if (gAlarmState != ALARM_STATE_OFF)
// const unsigned int level = ((voice_amp * bar_width) + (max / 2)) / max; // with rounding return;
// const unsigned int len = (level <= bar_width) ? level : bar_width; #endif
const unsigned int voice_amp = BK4819_GetVoiceAmplitudeOut(); // 15:0
// make non-linear to make more sensitive at low values
const unsigned int level = voice_amp * 8; // make non-linear to make more sensitive at low values
const unsigned int sqrt_level = sqrt16((level < 65535) ? level : 65535); const unsigned int level = voice_amp * 8;
const unsigned int len = (sqrt_level <= bar_width) ? sqrt_level : bar_width; const unsigned int sqrt_level = sqrt16((level < 65535) ? level : 65535);
const unsigned int len = (sqrt_level <= bar_width) ? sqrt_level : bar_width;
#else
// TX/RX AF input level (dB)
const uint8_t af_tx_rx = BK4819_GetAfTxRx(); // 6:0
const unsigned int max = 63;
const unsigned int level = (((uint16_t)af_tx_rx * bar_width) + (max / 2)) / max; // with rounding
const unsigned int len = (level <= bar_width) ? level : bar_width;
#endif
uint8_t *p_line = gFrameBuffer[line]; uint8_t *p_line = gFrameBuffer[line];
memset(p_line, 0, LCD_WIDTH); memset(p_line, 0, LCD_WIDTH);
#if 1 for (i = 0; i < bar_width; i++)
// solid bar p_line[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e;
for (i = 0; i < bar_width; i++)
p_line[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e;
#else
// knuled bar
for (i = 0; i < bar_width; i += 2)
p_line[bar_x + i] = (i <= len) ? 0x7f : 0x41;
#endif
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();
@@ -157,7 +146,10 @@ center_line_t center_line = CENTER_LINE_NONE;
if (gEeprom.KEY_LOCK && gKeypadLocked > 0) if (gEeprom.KEY_LOCK && gKeypadLocked > 0)
return; // display is in use return; // display is in use
if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN)
if (gCurrentFunction == FUNCTION_TRANSMIT ||
gScreenToDisplay != DISPLAY_MAIN ||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
return; // display is in use return; // display is in use
if (now) if (now)
@@ -195,6 +187,8 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
{ {
#ifdef ENABLE_RSSI_BAR #ifdef ENABLE_RSSI_BAR
(void)vfo; // unused
// optional larger RSSI dBm, S-point and bar level // optional larger RSSI dBm, S-point and bar level
if (center_line != CENTER_LINE_RSSI) if (center_line != CENTER_LINE_RSSI)
@@ -215,24 +209,13 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
const uint8_t Line = (vfo == 0) ? 3 : 7; const uint8_t Line = (vfo == 0) ? 3 : 7;
uint8_t *p_line = gFrameBuffer[Line - 1]; uint8_t *p_line = gFrameBuffer[Line - 1];
// TODO: sort out all 8 values from the eeprom
#if 0 const unsigned int band = gRxVfo->Band;
// dBm -105 -100 -95 -90 -70 -65 -60 -55 const int16_t level0 = gEEPROM_RSSI_CALIB[band][0];
// RSSI 110 120 130 140 180 190 200 210 const int16_t level1 = gEEPROM_RSSI_CALIB[band][1];
// 0000C0 6E 00 78 00 82 00 8C 00 B4 00 BE 00 C8 00 D2 00 const int16_t level2 = gEEPROM_RSSI_CALIB[band][2];
// const int16_t level3 = gEEPROM_RSSI_CALIB[band][3];
const unsigned int band = 1;
const int16_t level0 = gEEPROM_RSSI_CALIB[band][0];
const int16_t level1 = gEEPROM_RSSI_CALIB[band][1];
const int16_t level2 = gEEPROM_RSSI_CALIB[band][2];
const int16_t level3 = gEEPROM_RSSI_CALIB[band][3];
#else
const int16_t level0 = (-115 + 160) * 2; // dB
const int16_t level1 = ( -89 + 160) * 2; // dB
const int16_t level2 = ( -64 + 160) * 2; // dB
const int16_t level3 = ( -39 + 160) * 2; // dB
#endif
const int16_t level01 = (level0 + level1) / 2; const int16_t level01 = (level0 + level1) / 2;
const int16_t level12 = (level1 + level2) / 2; const int16_t level12 = (level1 + level2) / 2;
const int16_t level23 = (level2 + level3) / 2; const int16_t level23 = (level2 + level3) / 2;
@@ -272,25 +255,12 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
memset(p_line, 0, 23); memset(p_line, 0, 23);
if (rssi_level > 0) // untested !!!
{
//if (rssi_level >= 1) if (rssi_level == 0)
memmove(p_line, BITMAP_Antenna, 5);
if (rssi_level >= 2)
memmove(p_line + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1));
if (rssi_level >= 3)
memmove(p_line + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2));
if (rssi_level >= 4)
memmove(p_line + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3));
if (rssi_level >= 5)
memmove(p_line + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4));
if (rssi_level >= 6)
memmove(p_line + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5));
if (rssi_level >= 7)
memmove(p_line + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6));
}
else
p_line = NULL; p_line = NULL;
else
UI_drawBars(p_line, rssi_level);
ST7565_DrawLine(0, Line, 23, p_line); ST7565_DrawLine(0, Line, 23, p_line);
#endif #endif
@@ -324,30 +294,23 @@ void UI_DisplayMain(void)
return; return;
} }
unsigned int activeTxVFO = (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) ? gEeprom.RX_VFO : gEeprom.TX_VFO;
for (vfo_num = 0; vfo_num < 2; vfo_num++) for (vfo_num = 0; vfo_num < 2; vfo_num++)
{ {
const unsigned int line = (vfo_num == 0) ? line0 : line1; const unsigned int line = (vfo_num == 0) ? line0 : line1;
uint8_t channel = gEeprom.TX_CHANNEL; const bool isTxVFO = (vfo_num == gEeprom.TX_VFO);
// uint8_t tx_channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
const bool same_vfo = (channel == vfo_num) ? true : false;
uint8_t *p_line0 = gFrameBuffer[line + 0]; uint8_t *p_line0 = gFrameBuffer[line + 0];
uint8_t *p_line1 = gFrameBuffer[line + 1]; uint8_t *p_line1 = gFrameBuffer[line + 1];
uint32_t duff_beer = 0; unsigned int mode = 0;
uint8_t state;
if (single_vfo) if (single_vfo)
{ // we're in single VFO mode - screen is dedicated to just one VFO { // we're in single VFO mode - screen is dedicated to just one VFO
if (!isTxVFO)
if (!same_vfo)
continue; // skip the unused vfo continue; // skip the unused vfo
} }
if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) if (activeTxVFO != vfo_num)
channel = gEeprom.RX_CHANNEL; // we're currently monitoring the other VFO
if (channel != vfo_num)
{ {
if (gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx || gDTMF_InputMode) if (gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx || gDTMF_InputMode)
{ // show DTMF stuff { // show DTMF stuff
@@ -360,7 +323,7 @@ void UI_DisplayMain(void)
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT)
strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT"); strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT");
else else
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY)
sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller); sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller);
else else
if (gDTMF_IsTx) if (gDTMF_IsTx)
@@ -369,10 +332,8 @@ void UI_DisplayMain(void)
else else
{ {
sprintf(String, ">%s", gDTMF_InputBox); sprintf(String, ">%s", gDTMF_InputBox);
center_line = CENTER_LINE_IN_USE;
} }
UI_PrintString(String, 2, 0, vfo_num * 3, 8); UI_PrintString(String, 2, 0, 0 + (vfo_num * 3), 8);
memset(String, 0, sizeof(String)); memset(String, 0, sizeof(String));
if (!gDTMF_InputMode) if (!gDTMF_InputMode)
@@ -381,16 +342,12 @@ void UI_DisplayMain(void)
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT)
sprintf(String, ">%s", (DTMF_FindContact(gDTMF_String, Contact)) ? Contact : gDTMF_String); sprintf(String, ">%s", (DTMF_FindContact(gDTMF_String, Contact)) ? Contact : gDTMF_String);
else else
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY)
sprintf(String, ">%s", (DTMF_FindContact(gDTMF_Callee, Contact)) ? Contact : gDTMF_Callee); sprintf(String, ">%s", (DTMF_FindContact(gDTMF_Callee, Contact)) ? Contact : gDTMF_Callee);
else else
if (gDTMF_IsTx) if (gDTMF_IsTx)
sprintf(String, ">%s", gDTMF_String); sprintf(String, ">%s", gDTMF_String);
} }
else
{
center_line = CENTER_LINE_IN_USE;
}
UI_PrintString(String, 2, 0, 2 + (vfo_num * 3), 8); UI_PrintString(String, 2, 0, 2 + (vfo_num * 3), 8);
center_line = CENTER_LINE_IN_USE; center_line = CENTER_LINE_IN_USE;
@@ -398,19 +355,14 @@ void UI_DisplayMain(void)
} }
// highlight the selected/used VFO with a marker // highlight the selected/used VFO with a marker
if (!single_vfo && same_vfo) if (!single_vfo && isTxVFO)
memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default));
else
if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF)
memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault));
} }
else else if (!single_vfo)
if (!single_vfo)
{ // highlight the selected/used VFO with a marker { // highlight the selected/used VFO with a marker
if (same_vfo) if (isTxVFO)
memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default));
else else
//if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF)
memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault));
} }
@@ -419,29 +371,42 @@ void UI_DisplayMain(void)
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_ALARM) if (gAlarmState == ALARM_STATE_ALARM)
duff_beer = 2; mode = 2;
else else
#endif #endif
{ {
channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; activeTxVFO = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO;
if (channel == vfo_num) if (activeTxVFO == vfo_num)
{ // show the TX symbol { // show the TX symbol
duff_beer = 1; mode = 1;
UI_PrintStringSmall("TX", 14, 0, line); #ifdef ENABLE_SMALL_BOLD
UI_PrintStringSmallBold("TX", 14, 0, line);
#else
UI_PrintStringSmall("TX", 14, 0, line);
#endif
} }
} }
} }
else else
{ // receiving .. show the RX symbol { // receiving .. show the RX symbol
duff_beer = 2; mode = 2;
if ((gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) && gEeprom.RX_CHANNEL == vfo_num) if ((gCurrentFunction == FUNCTION_RECEIVE ||
UI_PrintStringSmall("RX", 14, 0, line); gCurrentFunction == FUNCTION_MONITOR ||
gCurrentFunction == FUNCTION_INCOMING) &&
gEeprom.RX_VFO == vfo_num)
{
#ifdef ENABLE_SMALL_BOLD
UI_PrintStringSmallBold("RX", 14, 0, line);
#else
UI_PrintStringSmall("RX", 14, 0, line);
#endif
}
} }
if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) if (gEeprom.ScreenChannel[vfo_num] <= MR_CHANNEL_LAST)
{ // channel mode { // channel mode
const unsigned int x = 2; const unsigned int x = 2;
const bool inputting = (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != vfo_num) ? false : true; const bool inputting = (gInputBoxIndex == 0 || gEeprom.TX_VFO != vfo_num) ? false : true;
if (!inputting) if (!inputting)
NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); // show the memory channel number NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); // show the memory channel number
else else
@@ -461,7 +426,7 @@ void UI_DisplayMain(void)
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
else else
{ {
if (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != vfo_num) if (gInputBoxIndex == 0 || gEeprom.TX_VFO != vfo_num)
{ // channel number { // channel number
sprintf(String, "N%u", 1 + gEeprom.ScreenChannel[vfo_num] - NOAA_CHANNEL_FIRST); sprintf(String, "N%u", 1 + gEeprom.ScreenChannel[vfo_num] - NOAA_CHANNEL_FIRST);
} }
@@ -475,12 +440,12 @@ void UI_DisplayMain(void)
// ************ // ************
state = VfoState[vfo_num]; unsigned int state = VfoState[vfo_num];
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_ALARM) if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_ALARM)
{ {
channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; uint8_t channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO;
if (channel == vfo_num) if (channel == vfo_num)
state = VFO_STATE_ALARM; state = VFO_STATE_ALARM;
} }
@@ -489,11 +454,11 @@ void UI_DisplayMain(void)
if (state != VFO_STATE_NORMAL) if (state != VFO_STATE_NORMAL)
{ {
const char *state_list[] = {"", "BUSY", "BAT LOW", "TX DISABLE", "TIMEOUT", "ALARM", "VOLT HIGH"}; const char *state_list[] = {"", "BUSY", "BAT LOW", "TX DISABLE", "TIMEOUT", "ALARM", "VOLT HIGH"};
if (state >= 0 && state < ARRAY_SIZE(state_list)) if (state < ARRAY_SIZE(state_list))
UI_PrintString(state_list[state], 31, 0, line, 8); UI_PrintString(state_list[state], 31, 0, line, 8);
} }
else else
if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_CHANNEL == vfo_num) if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_VFO == vfo_num)
{ // user entering a frequency { // user entering a frequency
UI_DisplayFrequency(gInputBox, 32, line, true, false); UI_DisplayFrequency(gInputBox, 32, line, true, false);
@@ -504,13 +469,13 @@ void UI_DisplayMain(void)
uint32_t frequency = gEeprom.VfoInfo[vfo_num].pRX->Frequency; uint32_t frequency = gEeprom.VfoInfo[vfo_num].pRX->Frequency;
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ // transmitting { // transmitting
channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; activeTxVFO = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO;
if (channel == vfo_num) if (activeTxVFO == vfo_num)
frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency; frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency;
} }
if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) if (gEeprom.ScreenChannel[vfo_num] <= MR_CHANNEL_LAST)
{ // channel mode { // it's a channel
// show the channel symbols // show the channel symbols
const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]];
@@ -519,12 +484,15 @@ void UI_DisplayMain(void)
if (attributes & MR_CH_SCANLIST2) if (attributes & MR_CH_SCANLIST2)
memmove(p_line0 + 120, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); memmove(p_line0 + 120, BITMAP_ScanList2, sizeof(BITMAP_ScanList2));
#ifndef ENABLE_BIG_FREQ #ifndef ENABLE_BIG_FREQ
#ifdef ENABLE_COMPANDER if ((attributes & MR_CH_COMPAND) > 0)
if ((attributes & MR_CH_COMPAND) > 0) memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand));
memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); #else
#endif
// TODO: // find somewhere else to put the symbol
#endif #endif
switch (gEeprom.CHANNEL_DISPLAY_MODE) switch (gEeprom.CHANNEL_DISPLAY_MODE)
{ {
case MDF_FREQUENCY: // show the channel frequency case MDF_FREQUENCY: // show the channel frequency
@@ -589,16 +557,14 @@ void UI_DisplayMain(void)
UI_PrintString(String, 32, 0, line, 8); UI_PrintString(String, 32, 0, line, 8);
#endif #endif
#ifdef ENABLE_COMPANDER // show the channel symbols
// show the channel symbols const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]];
const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; if ((attributes & MR_CH_COMPAND) > 0)
if ((attributes & MR_CH_COMPAND) > 0) #ifdef ENABLE_BIG_FREQ
#ifdef ENABLE_BIG_FREQ memmove(p_line0 + 120, BITMAP_compand, sizeof(BITMAP_compand));
memmove(p_line0 + 120, BITMAP_compand, sizeof(BITMAP_compand)); #else
#else memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand));
memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); #endif
#endif
#endif
} }
} }
@@ -607,7 +573,7 @@ void UI_DisplayMain(void)
{ // show the TX/RX level { // show the TX/RX level
uint8_t Level = 0; uint8_t Level = 0;
if (duff_beer == 1) if (mode == 1)
{ // TX power level { // TX power level
switch (gRxVfo->OUTPUT_POWER) switch (gRxVfo->OUTPUT_POWER)
{ {
@@ -617,7 +583,7 @@ void UI_DisplayMain(void)
} }
} }
else else
if (duff_beer == 2) if (mode == 2)
{ // RX signal level { // RX signal level
#ifndef ENABLE_RSSI_BAR #ifndef ENABLE_RSSI_BAR
// bar graph // bar graph
@@ -626,23 +592,7 @@ void UI_DisplayMain(void)
#endif #endif
} }
if (Level >= 1) UI_drawBars(p_line1 + LCD_WIDTH, Level);
{
uint8_t *p_line = p_line1 + LCD_WIDTH;
memmove(p_line + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna));
if (Level >= 2)
memmove(p_line + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1));
if (Level >= 3)
memmove(p_line + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2));
if (Level >= 4)
memmove(p_line + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3));
if (Level >= 5)
memmove(p_line + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4));
if (Level >= 6)
memmove(p_line + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5));
if (Level >= 7)
memmove(p_line + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6));
}
} }
// ************ // ************
@@ -654,10 +604,10 @@ void UI_DisplayMain(void)
} }
else else
{ // or show the CTCSS/DCS symbol { // or show the CTCSS/DCS symbol
const FREQ_Config_t *pConfig = (duff_beer == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX; const FREQ_Config_t *pConfig = (mode == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX;
const unsigned int code_type = pConfig->CodeType; const unsigned int code_type = pConfig->CodeType;
const char *code_list[] = {"", "CT", "DCS", "DCR"}; const char *code_list[] = {"", "CT", "DCS", "DCR"};
if (code_type >= 0 && code_type < ARRAY_SIZE(code_list)) if (code_type < ARRAY_SIZE(code_list))
strcpy(String, code_list[code_type]); strcpy(String, code_list[code_type]);
} }
UI_PrintStringSmall(String, LCD_WIDTH + 24, 0, line + 1); UI_PrintStringSmall(String, LCD_WIDTH + 24, 0, line + 1);
@@ -666,7 +616,7 @@ void UI_DisplayMain(void)
{ // show the TX power { // show the TX power
const char pwr_list[] = "LMH"; const char pwr_list[] = "LMH";
const unsigned int i = gEeprom.VfoInfo[vfo_num].OUTPUT_POWER; const unsigned int i = gEeprom.VfoInfo[vfo_num].OUTPUT_POWER;
String[0] = (i >= 0 && i < ARRAY_SIZE(pwr_list)) ? pwr_list[i] : '\0'; String[0] = (i < ARRAY_SIZE(pwr_list)) ? pwr_list[i] : '\0';
String[1] = '\0'; String[1] = '\0';
UI_PrintStringSmall(String, LCD_WIDTH + 46, 0, line + 1); UI_PrintStringSmall(String, LCD_WIDTH + 46, 0, line + 1);
} }
@@ -713,18 +663,22 @@ void UI_DisplayMain(void)
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
if (gSetting_mic_bar && gCurrentFunction == FUNCTION_TRANSMIT) if (gSetting_mic_bar && gCurrentFunction == FUNCTION_TRANSMIT)
{ {
UI_DisplayAudioBar();
center_line = CENTER_LINE_AUDIO_BAR; center_line = CENTER_LINE_AUDIO_BAR;
UI_DisplayAudioBar();
} }
else else
#endif #endif
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) #if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA)
if (rx && gEeprom.VfoInfo[gEeprom.RX_CHANNEL].AM_mode && gSetting_AM_fix) if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix)
{ {
AM_fix_print_data(gEeprom.RX_CHANNEL, String); if (gScreenToDisplay != DISPLAY_MAIN ||
UI_PrintStringSmall(String, 2, 0, 3); gDTMF_CallState != DTMF_CALL_STATE_NONE)
return;
center_line = CENTER_LINE_AM_FIX_DATA; center_line = CENTER_LINE_AM_FIX_DATA;
AM_fix_print_data(gEeprom.RX_VFO, String);
UI_PrintStringSmall(String, 2, 0, 3);
} }
else else
#endif #endif
@@ -732,8 +686,8 @@ void UI_DisplayMain(void)
#ifdef ENABLE_RSSI_BAR #ifdef ENABLE_RSSI_BAR
if (rx) if (rx)
{ {
UI_DisplayRSSIBar(gCurrentRSSI[gEeprom.RX_CHANNEL], false);
center_line = CENTER_LINE_RSSI; center_line = CENTER_LINE_RSSI;
UI_DisplayRSSIBar(gCurrentRSSI[gEeprom.RX_VFO], false);
} }
else else
#endif #endif
@@ -745,20 +699,32 @@ void UI_DisplayMain(void)
{ // show live DTMF decode { // show live DTMF decode
const unsigned int len = strlen(gDTMF_RX_live); const unsigned int len = strlen(gDTMF_RX_live);
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
if (gScreenToDisplay != DISPLAY_MAIN ||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
return;
center_line = CENTER_LINE_DTMF_DEC;
strcpy(String, "DTMF "); strcpy(String, "DTMF ");
strcat(String, gDTMF_RX_live + idx); strcat(String, gDTMF_RX_live + idx);
UI_PrintStringSmall(String, 2, 0, 3); UI_PrintStringSmall(String, 2, 0, 3);
center_line = CENTER_LINE_DTMF_DEC;
} }
#else #else
if (gSetting_live_DTMF_decoder && gDTMF_RX_index > 0) if (gSetting_live_DTMF_decoder && gDTMF_RX_index > 0)
{ // show live DTMF decode { // show live DTMF decode
const unsigned int len = gDTMF_RX_index; const unsigned int len = gDTMF_RX_index;
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
if (gScreenToDisplay != DISPLAY_MAIN ||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
return;
center_line = CENTER_LINE_DTMF_DEC;
strcpy(String, "DTMF "); strcpy(String, "DTMF ");
strcat(String, gDTMF_RX + idx); strcat(String, gDTMF_RX + idx);
UI_PrintStringSmall(String, 2, 0, 3); UI_PrintStringSmall(String, 2, 0, 3);
center_line = CENTER_LINE_DTMF_DEC;
} }
#endif #endif
@@ -766,11 +732,16 @@ void UI_DisplayMain(void)
else else
if (gChargingWithTypeC) if (gChargingWithTypeC)
{ // charging .. show the battery state { // charging .. show the battery state
if (gScreenToDisplay != DISPLAY_MAIN ||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
return;
center_line = CENTER_LINE_CHARGE_DATA;
sprintf(String, "Charge %u.%02uV %u%%", sprintf(String, "Charge %u.%02uV %u%%",
gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100,
BATTERY_VoltsToPercent(gBatteryVoltageAverage)); BATTERY_VoltsToPercent(gBatteryVoltageAverage));
UI_PrintStringSmall(String, 2, 0, 3); UI_PrintStringSmall(String, 2, 0, 3);
center_line = CENTER_LINE_CHARGE_DATA;
} }
#endif #endif
} }

View File

@@ -17,6 +17,19 @@
#ifndef UI_MAIN_H #ifndef UI_MAIN_H
#define UI_MAIN_H #define UI_MAIN_H
enum center_line_t {
CENTER_LINE_NONE = 0,
CENTER_LINE_IN_USE,
CENTER_LINE_AUDIO_BAR,
CENTER_LINE_RSSI,
CENTER_LINE_AM_FIX_DATA,
CENTER_LINE_DTMF_DEC,
CENTER_LINE_CHARGE_DATA
};
typedef enum center_line_t center_line_t;
extern center_line_t center_line;
void UI_DisplayAudioBar(void); void UI_DisplayAudioBar(void);
void UI_UpdateRSSI(const int16_t rssi, const int vfo); void UI_UpdateRSSI(const int16_t rssi, const int vfo);
void UI_DisplayMain(void); void UI_DisplayMain(void);

371
ui/menu.c
View File

@@ -18,6 +18,7 @@
#include <stdlib.h> // abs() #include <stdlib.h> // abs()
#include "app/dtmf.h" #include "app/dtmf.h"
#include "app/menu.h"
#include "bitmaps.h" #include "bitmaps.h"
#include "board.h" #include "board.h"
#include "dcs.h" #include "dcs.h"
@@ -35,105 +36,108 @@
#include "ui/menu.h" #include "ui/menu.h"
#include "ui/ui.h" #include "ui/ui.h"
// NOTE. this menu list is half way through a change, what might seem
// pointless at this time is for there for a reason.
//
const t_menu_item MenuList[] = const t_menu_item MenuList[] =
{ {
// text, voice ID, menu ID // text, voice ID, menu ID
{"Step", VOICE_ID_FREQUENCY_STEP, MENU_STEP },
{"TxPwr", VOICE_ID_POWER, MENU_TXP }, // was "TXP"
{"RxDCS", VOICE_ID_DCS, MENU_R_DCS }, // was "R_DCS"
{"RxCTCS", VOICE_ID_CTCSS, MENU_R_CTCS }, // was "R_CTCS"
{"TxDCS", VOICE_ID_DCS, MENU_T_DCS }, // was "T_DCS"
{"TxCTCS", VOICE_ID_CTCSS, MENU_T_CTCS }, // was "T_CTCS"
{"TxODir", VOICE_ID_TX_OFFSET_FREQUENCY_DIRECTION, MENU_SFT_D }, // was "SFT_D"
{"TxOffs", VOICE_ID_TX_OFFSET_FREQUENCY, MENU_OFFSET }, // was "OFFSET"
{"W/N", VOICE_ID_CHANNEL_BANDWIDTH, MENU_W_N },
{"Scramb", VOICE_ID_SCRAMBLER_ON, MENU_SCR }, // was "SCR"
{"BusyCL", VOICE_ID_BUSY_LOCKOUT, MENU_BCL }, // was "BCL"
{"Compnd", VOICE_ID_INVALID, MENU_COMPAND },
{"Demodu", VOICE_ID_INVALID, MENU_AM }, // was "AM"
{"ScAdd1", VOICE_ID_INVALID, MENU_S_ADD1 },
{"ScAdd2", VOICE_ID_INVALID, MENU_S_ADD2 },
{"ChSave", VOICE_ID_MEMORY_CHANNEL, MENU_MEM_CH }, // was "MEM-CH"
{"ChDele", VOICE_ID_DELETE_CHANNEL, MENU_DEL_CH }, // was "DEL-CH"
{"ChName", VOICE_ID_INVALID, MENU_MEM_NAME },
{"SQL", VOICE_ID_SQUELCH, MENU_SQL }, {"SList", VOICE_ID_INVALID, MENU_S_LIST },
{"STEP", VOICE_ID_FREQUENCY_STEP, MENU_STEP }, {"SList1", VOICE_ID_INVALID, MENU_SLIST1 },
{"T PWR", VOICE_ID_POWER, MENU_TXP }, // was "TXP" {"SList2", VOICE_ID_INVALID, MENU_SLIST2 },
{"R DCS", VOICE_ID_DCS, MENU_R_DCS }, // was "R_DCS" {"ScnRev", VOICE_ID_INVALID, MENU_SC_REV },
{"R CTCS", VOICE_ID_CTCSS, MENU_R_CTCS }, // was "R_CTCS" #ifdef ENABLE_NOAA
{"T DCS", VOICE_ID_DCS, MENU_T_DCS }, // was "T_DCS" {"NOAA-S", VOICE_ID_INVALID, MENU_NOAA_S },
{"T CTCS", VOICE_ID_CTCSS, MENU_T_CTCS }, // was "T_CTCS"
{"T DIR", VOICE_ID_TX_OFFSET_FREQUENCY_DIRECTION, MENU_SFT_D }, // was "SFT_D"
{"T OFFS", VOICE_ID_TX_OFFSET_FREQUENCY, MENU_OFFSET }, // was "OFFSET"
{"T VFO", VOICE_ID_INVALID, MENU_XB }, // was "WX"
{"T TOUT", VOICE_ID_TRANSMIT_OVER_TIME, MENU_TOT }, // was "TOT"
{"W/N", VOICE_ID_CHANNEL_BANDWIDTH, MENU_W_N },
{"SCRAM", VOICE_ID_SCRAMBLER_ON, MENU_SCR }, // was "SCR"
{"BUSYCL", VOICE_ID_BUSY_LOCKOUT, MENU_BCL }, // was "BCL"
{"CH SAV", VOICE_ID_MEMORY_CHANNEL, MENU_MEM_CH }, // was "MEM-CH"
{"CH DEL", VOICE_ID_DELETE_CHANNEL, MENU_DEL_CH }, // was "DEL-CH"
{"CH NAM", VOICE_ID_INVALID, MENU_MEM_NAME },
{"CH DIS", VOICE_ID_INVALID, MENU_MDF }, // was "MDF"
{"BATSAV", VOICE_ID_SAVE_MODE, MENU_SAVE }, // was "SAVE"
{"VOX", VOICE_ID_VOX, MENU_VOX },
{"BACKLT", VOICE_ID_INVALID, MENU_ABR }, // was "ABR"
{"DUALRX", VOICE_ID_DUAL_STANDBY, MENU_TDR }, // was "TDR"
{"BEEP", VOICE_ID_BEEP_PROMPT, MENU_BEEP },
#ifdef ENABLE_VOICE
{"VOICE", VOICE_ID_VOICE_PROMPT, MENU_VOICE },
#endif #endif
{"SC REV", VOICE_ID_INVALID, MENU_SC_REV },
{"KEYLOC", VOICE_ID_INVALID, MENU_AUTOLK }, // was "AUTOLk" {"F1Shrt", VOICE_ID_INVALID, MENU_F1SHRT },
{"S ADD1", VOICE_ID_INVALID, MENU_S_ADD1 }, {"F1Long", VOICE_ID_INVALID, MENU_F1LONG },
{"S ADD2", VOICE_ID_INVALID, MENU_S_ADD2 }, {"F2Shrt", VOICE_ID_INVALID, MENU_F2SHRT },
{"STE", VOICE_ID_INVALID, MENU_STE }, {"F2Long", VOICE_ID_INVALID, MENU_F2LONG },
{"RP STE", VOICE_ID_INVALID, MENU_RP_STE },
{"MIC", VOICE_ID_INVALID, MENU_MIC }, {"KeyLck", VOICE_ID_INVALID, MENU_AUTOLK }, // was "AUTOLk"
{"TxTOut", VOICE_ID_TRANSMIT_OVER_TIME, MENU_TOT }, // was "TOT"
{"BatSav", VOICE_ID_SAVE_MODE, MENU_SAVE }, // was "SAVE"
{"Mic", VOICE_ID_INVALID, MENU_MIC },
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
{"MICBAR", VOICE_ID_INVALID, MENU_MIC_BAR }, {"MicBar", VOICE_ID_INVALID, MENU_MIC_BAR },
#endif
{"ChDisp", VOICE_ID_INVALID, MENU_MDF }, // was "MDF"
{"POnMsg", VOICE_ID_INVALID, MENU_PONMSG },
{"BatTxt", VOICE_ID_INVALID, MENU_BAT_TXT },
{"BackLt", VOICE_ID_INVALID, MENU_ABR }, // was "ABR"
{"BltTRX", VOICE_ID_INVALID, MENU_ABR_ON_TX_RX },
{"Beep", VOICE_ID_BEEP_PROMPT, MENU_BEEP },
#ifdef ENABLE_VOICE
{"Voice", VOICE_ID_VOICE_PROMPT, MENU_VOICE },
#endif #endif
#ifdef ENABLE_COMPANDER {"Roger", VOICE_ID_INVALID, MENU_ROGER },
{"COMPND", VOICE_ID_INVALID, MENU_COMPAND }, {"STE", VOICE_ID_INVALID, MENU_STE },
#endif {"RP STE", VOICE_ID_INVALID, MENU_RP_STE },
{"1 CALL", VOICE_ID_INVALID, MENU_1_CALL }, {"1 Call", VOICE_ID_INVALID, MENU_1_CALL },
{"SLIST", VOICE_ID_INVALID, MENU_S_LIST },
{"SLIST1", VOICE_ID_INVALID, MENU_SLIST1 },
{"SLIST2", VOICE_ID_INVALID, MENU_SLIST2 },
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
{"AL-MOD", VOICE_ID_INVALID, MENU_AL_MOD }, {"AlarmT", VOICE_ID_INVALID, MENU_AL_MOD },
#endif #endif
{"ANI ID", VOICE_ID_ANI_CODE, MENU_ANI_ID }, {"ANI ID", VOICE_ID_ANI_CODE, MENU_ANI_ID },
{"UPCODE", VOICE_ID_INVALID, MENU_UPCODE }, {"UPCode", VOICE_ID_INVALID, MENU_UPCODE },
{"DWCODE", VOICE_ID_INVALID, MENU_DWCODE }, {"DWCode", VOICE_ID_INVALID, MENU_DWCODE },
{"PTT ID", VOICE_ID_INVALID, MENU_PTT_ID }, {"PTT ID", VOICE_ID_INVALID, MENU_PTT_ID },
{"D ST", VOICE_ID_INVALID, MENU_D_ST }, {"D ST", VOICE_ID_INVALID, MENU_D_ST },
{"D RSP", VOICE_ID_INVALID, MENU_D_RSP }, {"D Resp", VOICE_ID_INVALID, MENU_D_RSP },
{"D HOLD", VOICE_ID_INVALID, MENU_D_HOLD }, {"D Hold", VOICE_ID_INVALID, MENU_D_HOLD },
{"D PRE", VOICE_ID_INVALID, MENU_D_PRE }, {"D Prel", VOICE_ID_INVALID, MENU_D_PRE },
{"D DCD", VOICE_ID_INVALID, MENU_D_DCD }, {"D Decd", VOICE_ID_INVALID, MENU_D_DCD },
{"D LIST", VOICE_ID_INVALID, MENU_D_LIST }, {"D List", VOICE_ID_INVALID, MENU_D_LIST },
{"D LIVE", VOICE_ID_INVALID, MENU_D_LIVE_DEC }, // live DTMF decoder {"D Live", VOICE_ID_INVALID, MENU_D_LIVE_DEC }, // live DTMF decoder
{"PONMSG", VOICE_ID_INVALID, MENU_PONMSG },
{"ROGER", VOICE_ID_INVALID, MENU_ROGER },
{"BATVOL", VOICE_ID_INVALID, MENU_VOL }, // was "VOL"
{"BATTXT", VOICE_ID_INVALID, MENU_BAT_TXT },
{"MODE", VOICE_ID_INVALID, MENU_AM }, // was "AM"
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
{"AM FIX", VOICE_ID_INVALID, MENU_AM_FIX }, {"AM Fix", VOICE_ID_INVALID, MENU_AM_FIX },
#endif #endif
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
{"AM FT1", VOICE_ID_INVALID, MENU_AM_FIX_TEST1}, {"AM FT1", VOICE_ID_INVALID, MENU_AM_FIX_TEST1 },
#endif #endif
#ifdef ENABLE_NOAA #ifdef ENABLE_VOX
{"NOAA-S", VOICE_ID_INVALID, MENU_NOAA_S }, {"VOX", VOICE_ID_VOX, MENU_VOX },
#endif #endif
{"RESET", VOICE_ID_INITIALISATION, MENU_RESET }, // might be better to move this to the hidden menu items ? {"BatVol", VOICE_ID_INVALID, MENU_VOL }, // was "VOL"
{"RxMode", VOICE_ID_DUAL_STANDBY, MENU_TDR },
{"Sql", VOICE_ID_SQUELCH, MENU_SQL },
// hidden menu items from here on // hidden menu items from here on
// enabled if pressing both the PTT and upper side button at power-on // enabled if pressing both the PTT and upper side button at power-on
{"F Lock", VOICE_ID_INVALID, MENU_F_LOCK },
{"F LOCK", VOICE_ID_INVALID, MENU_F_LOCK }, {"Tx 200", VOICE_ID_INVALID, MENU_200TX }, // was "200TX"
{"TX 200", VOICE_ID_INVALID, MENU_200TX }, // was "200TX" {"Tx 350", VOICE_ID_INVALID, MENU_350TX }, // was "350TX"
{"TX 350", VOICE_ID_INVALID, MENU_350TX }, // was "350TX" {"Tx 500", VOICE_ID_INVALID, MENU_500TX }, // was "500TX"
{"TX 500", VOICE_ID_INVALID, MENU_500TX }, // was "500TX" {"350 En", VOICE_ID_INVALID, MENU_350EN }, // was "350EN"
{"350 EN", VOICE_ID_INVALID, MENU_350EN }, // was "350EN" {"ScraEn", VOICE_ID_INVALID, MENU_SCREN }, // was "SCREN"
{"SCR EN", VOICE_ID_INVALID, MENU_SCREN }, // was "SCREN" {"TxEnab", VOICE_ID_INVALID, MENU_TX_EN }, // enable TX
{"TX EN", VOICE_ID_INVALID, MENU_TX_EN }, // enable TX
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
{"F CALI", VOICE_ID_INVALID, MENU_F_CALI }, // reference xtal calibration {"FrCali", VOICE_ID_INVALID, MENU_F_CALI }, // reference xtal calibration
#endif #endif
{"BATCAL", VOICE_ID_INVALID, MENU_BATCAL }, // battery voltage calibration {"BatCal", VOICE_ID_INVALID, MENU_BATCAL }, // battery voltage calibration
{"Reset", VOICE_ID_INITIALISATION, MENU_RESET }, // might be better to move this to the hidden menu items ?
{"", VOICE_ID_INVALID, 0xff } // end of list - DO NOT delete or move this this {"", VOICE_ID_INVALID, 0xff } // end of list - DO NOT delete or move this this
}; };
const uint8_t FIRST_HIDDEN_MENU_ITEM = MENU_F_LOCK;
const char gSubMenu_TXP[3][5] = const char gSubMenu_TXP[3][5] =
{ {
"LOW", "LOW",
@@ -184,18 +188,12 @@ const char gSubMenu_TOT[11][7] =
"15 min" "15 min"
}; };
const char gSubMenu_CHAN[3][10] = const char* gSubMenu_RXMode[4] =
{ {
"OFF", "MAIN\nONLY", // TX and RX on main only
"UPPER\nVFO", "DUAL RX\nRESPOND", // Watch both and respond
"LOWER\nVFO" "CROSS\nBAND", // TX on main, RX on secondary
}; "MAIN TX\nDUAL RX" // always TX on main, but RX on both
const char gSubMenu_XB[3][10] =
{
"MAIN\nVFO",
"UPPER\nVFO",
"LOWER\nVFO"
}; };
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -207,14 +205,14 @@ const char gSubMenu_XB[3][10] =
}; };
#endif #endif
const char gSubMenu_SC_REV[3][13] = const char gSubMenu_SC_REV[3][8] =
{ {
"TIME", "TIME",
"CARRIER", "CARRIER",
"SEARCH" "SEARCH"
}; };
const char gSubMenu_MDF[4][15] = const char* gSubMenu_MDF[4] =
{ {
"FREQ", "FREQ",
"CHANNEL\nNUMBER", "CHANNEL\nNUMBER",
@@ -238,12 +236,13 @@ const char gSubMenu_D_RSP[4][11] =
"BOTH" "BOTH"
}; };
const char gSubMenu_PTT_ID[4][7] = const char* gSubMenu_PTT_ID[5] =
{ {
"OFF", "OFF",
"KEY UP", "KEY\nUP",
"KEY DN", "KEY\nDOWN",
"BOTH" "KEY\nUP+DOWN",
"APOLLO\nQUINDAR"
}; };
const char gSubMenu_PONMSG[4][8] = const char gSubMenu_PONMSG[4][8] =
@@ -254,7 +253,7 @@ const char gSubMenu_PONMSG[4][8] =
"NONE" "NONE"
}; };
const char gSubMenu_ROGER[3][9] = const char* gSubMenu_ROGER[3] =
{ {
"OFF", "OFF",
"ROGER", "ROGER",
@@ -289,15 +288,13 @@ const char gSubMenu_BACKLIGHT[8][7] =
"ON" "ON"
}; };
#ifdef ENABLE_COMPANDER const char gSubMenu_RX_TX[4][6] =
const char gSubMenu_Compand[4][6] = {
{ "OFF",
"OFF", "TX",
"TX", "RX",
"RX", "TX/RX"
"TX/RX" };
};
#endif
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
const char gSubMenu_AM_fix_test1[4][8] = const char gSubMenu_AM_fix_test1[4][8] =
@@ -331,8 +328,38 @@ const char gSubMenu_SCRAMBLER[11][7] =
"3500Hz" "3500Hz"
}; };
const t_sidefunction SIDEFUNCTIONS[] =
{
{"NONE", ACTION_OPT_NONE},
{"FLASH\nLIGHT", ACTION_OPT_FLASHLIGHT},
{"POWER", ACTION_OPT_POWER},
{"MONITOR", ACTION_OPT_MONITOR},
{"SCAN", ACTION_OPT_SCAN},
#ifdef ENABLE_VOX
{"VOX", ACTION_OPT_VOX},
#endif
#ifdef ENABLE_ALARM
{"ALARM", ACTION_OPT_ALARM},
#endif
#ifdef ENABLE_FMRADIO
{"FM RADIO", ACTION_OPT_FM},
#endif
#ifdef ENABLE_TX1750
{"1750HZ", ACTION_OPT_1750},
#endif
};
const t_sidefunction* gSubMenu_SIDEFUNCTIONS = SIDEFUNCTIONS;
const uint8_t gSubMenu_SIDEFUNCTIONS_size = ARRAY_SIZE(SIDEFUNCTIONS);
bool gIsInSubMenu; bool gIsInSubMenu;
uint8_t gMenuCursor; uint8_t gMenuCursor;
int GetCurrentMenuId() {
if(gMenuCursor < ARRAY_SIZE(MenuList))
return MenuList[gMenuCursor].menu_id;
else
return MenuList[ARRAY_SIZE(MenuList)-1].menu_id;
}
int8_t gMenuScrollDirection; int8_t gMenuScrollDirection;
int32_t gSubMenuSelection; int32_t gSubMenuSelection;
@@ -355,7 +382,7 @@ void UI_DisplayMenu(void)
#if 0 #if 0
// original menu layout // original menu layout
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
if (gMenuCursor > 0 || i > 0) if (gMenuCursor > 0 || i > 0)
if ((gMenuListCount - 1) != gMenuCursor || i != 2) if ((gMenuListCount - 1) != gMenuCursor || i != 2)
@@ -436,7 +463,7 @@ void UI_DisplayMenu(void)
bool already_printed = false; bool already_printed = false;
switch (gMenuCursor) switch (GetCurrentMenuId())
{ {
case MENU_SQL: case MENU_SQL:
sprintf(String, "%d", gSubMenuSelection); sprintf(String, "%d", gSubMenuSelection);
@@ -476,11 +503,41 @@ void UI_DisplayMenu(void)
case MENU_R_CTCS: case MENU_R_CTCS:
case MENU_T_CTCS: case MENU_T_CTCS:
if (gSubMenuSelection == 0) {
strcpy(String, "OFF"); #if 1
else unsigned int Code;
sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10, CTCSS_Options[gSubMenuSelection - 1] % 10); FREQ_Config_t *pConfig = (GetCurrentMenuId() == MENU_R_CTCS) ? &gTxVfo->freq_config_RX : &gTxVfo->freq_config_TX;
if (gSubMenuSelection == 0)
{
strcpy(String, "OFF");
if (pConfig->CodeType != CODE_TYPE_CONTINUOUS_TONE)
break;
Code = 0;
pConfig->CodeType = CODE_TYPE_OFF;
pConfig->Code = Code;
BK4819_ExitSubAu();
}
else
{
sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10, CTCSS_Options[gSubMenuSelection - 1] % 10);
pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE;
Code = gSubMenuSelection - 1;
pConfig->Code = Code;
BK4819_SetCTCSSFrequency(CTCSS_Options[Code]);
}
#else
if (gSubMenuSelection == 0)
strcpy(String, "OFF");
else
sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10, CTCSS_Options[gSubMenuSelection - 1] % 10);
#endif
break; break;
}
case MENU_SFT_D: case MENU_SFT_D:
strcpy(String, gSubMenu_SFT_D[gSubMenuSelection]); strcpy(String, gSubMenu_SFT_D[gSubMenuSelection]);
@@ -518,14 +575,22 @@ void UI_DisplayMenu(void)
case MENU_SCR: case MENU_SCR:
strcpy(String, gSubMenu_SCRAMBLER[gSubMenuSelection]); strcpy(String, gSubMenu_SCRAMBLER[gSubMenuSelection]);
#if 1
if (gSubMenuSelection > 0 && gSetting_ScrambleEnable)
BK4819_EnableScramble(gSubMenuSelection - 1);
else
BK4819_DisableScramble();
#endif
break; break;
case MENU_VOX: #ifdef ENABLE_VOX
if (gSubMenuSelection == 0) case MENU_VOX:
strcpy(String, "OFF"); if (gSubMenuSelection == 0)
else strcpy(String, "OFF");
sprintf(String, "%d", gSubMenuSelection); else
break; sprintf(String, "%d", gSubMenuSelection);
break;
#endif
case MENU_ABR: case MENU_ABR:
strcpy(String, gSubMenu_BACKLIGHT[gSubMenuSelection]); strcpy(String, gSubMenu_BACKLIGHT[gSubMenuSelection]);
@@ -538,6 +603,7 @@ void UI_DisplayMenu(void)
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
case MENU_AM_FIX_TEST1: case MENU_AM_FIX_TEST1:
strcpy(String, gSubMenu_AM_fix_test1[gSubMenuSelection]); strcpy(String, gSubMenu_AM_fix_test1[gSubMenuSelection]);
// gSetting_AM_fix = gSubMenuSelection;
break; break;
#endif #endif
@@ -545,11 +611,10 @@ void UI_DisplayMenu(void)
strcpy(String, (gSubMenuSelection == 0) ? "OFF" : "AUTO"); strcpy(String, (gSubMenuSelection == 0) ? "OFF" : "AUTO");
break; break;
#ifdef ENABLE_COMPANDER case MENU_COMPAND:
case MENU_COMPAND: case MENU_ABR_ON_TX_RX:
strcpy(String, gSubMenu_Compand[gSubMenuSelection]); strcpy(String, gSubMenu_RX_TX[gSubMenuSelection]);
break; break;
#endif
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
case MENU_AM_FIX: case MENU_AM_FIX:
@@ -638,11 +703,7 @@ void UI_DisplayMenu(void)
break; break;
case MENU_TDR: case MENU_TDR:
strcpy(String, gSubMenu_CHAN[gSubMenuSelection]); strcpy(String, gSubMenu_RXMode[gSubMenuSelection]);
break;
case MENU_XB:
strcpy(String, gSubMenu_XB[gSubMenuSelection]);
break; break;
case MENU_TOT: case MENU_TOT:
@@ -671,7 +732,10 @@ void UI_DisplayMenu(void)
break; break;
case MENU_S_LIST: case MENU_S_LIST:
sprintf(String, "LIST%u", gSubMenuSelection); if (gSubMenuSelection < 2)
sprintf(String, "LIST%u", 1 + gSubMenuSelection);
else
strcpy(String, "ALL");
break; break;
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
@@ -747,10 +811,9 @@ void UI_DisplayMenu(void)
{ {
const uint32_t value = 22656 + gSubMenuSelection; const uint32_t value = 22656 + gSubMenuSelection;
const uint32_t xtal_Hz = (0x4f0000u + value) * 5; const uint32_t xtal_Hz = (0x4f0000u + value) * 5;
//gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; // already set when the user was adjusting the value writeXtalFreqCal(gSubMenuSelection, false);
BK4819_WriteRegister(BK4819_REG_3B, value);
sprintf(String, "%d\n%u.%06u\nMHz", sprintf(String, "%d\n%u.%06u\nMHz",
gSubMenuSelection, gSubMenuSelection,
xtal_Hz / 1000000, xtal_Hz % 1000000); xtal_Hz / 1000000, xtal_Hz % 1000000);
@@ -764,6 +827,14 @@ void UI_DisplayMenu(void)
sprintf(String, "%u.%02uV\n%u", vol / 100, vol % 100, gSubMenuSelection); sprintf(String, "%u.%02uV\n%u", vol / 100, vol % 100, gSubMenuSelection);
break; break;
} }
case MENU_F1SHRT:
case MENU_F1LONG:
case MENU_F2SHRT:
case MENU_F2LONG:
strcpy(String, gSubMenu_SIDEFUNCTIONS[gSubMenuSelection].name);
break;
} }
if (!already_printed) if (!already_printed)
@@ -820,9 +891,9 @@ void UI_DisplayMenu(void)
} }
} }
if (gMenuCursor == MENU_SLIST1 || gMenuCursor == MENU_SLIST2) if (GetCurrentMenuId() == MENU_SLIST1 || GetCurrentMenuId() == MENU_SLIST2)
{ {
i = (gMenuCursor == MENU_SLIST1) ? 0 : 1; i = (GetCurrentMenuId() == MENU_SLIST1) ? 0 : 1;
// if (gSubMenuSelection == 0xFF) // if (gSubMenuSelection == 0xFF)
if (gSubMenuSelection < 0) if (gSubMenuSelection < 0)
@@ -867,9 +938,9 @@ void UI_DisplayMenu(void)
} }
} }
if (gMenuCursor == MENU_MEM_CH || if (GetCurrentMenuId() == MENU_MEM_CH ||
gMenuCursor == MENU_DEL_CH || GetCurrentMenuId() == MENU_DEL_CH ||
gMenuCursor == MENU_1_CALL) GetCurrentMenuId() == MENU_1_CALL)
{ // display the channel name { // display the channel name
char s[11]; char s[11];
BOARD_fetchChannelName(s, gSubMenuSelection); BOARD_fetchChannelName(s, gSubMenuSelection);
@@ -878,18 +949,18 @@ void UI_DisplayMenu(void)
UI_PrintString(s, menu_item_x1, menu_item_x2, 2, 8); UI_PrintString(s, menu_item_x1, menu_item_x2, 2, 8);
} }
if ((gMenuCursor == MENU_R_CTCS || gMenuCursor == MENU_R_DCS) && gCssScanMode != CSS_SCAN_MODE_OFF) if ((GetCurrentMenuId() == MENU_R_CTCS || GetCurrentMenuId() == MENU_R_DCS) && gCssScanMode != CSS_SCAN_MODE_OFF)
UI_PrintString("SCAN", menu_item_x1, menu_item_x2, 4, 8); UI_PrintString("SCAN", menu_item_x1, menu_item_x2, 4, 8);
if (gMenuCursor == MENU_UPCODE) if (GetCurrentMenuId() == MENU_UPCODE)
if (strlen(gEeprom.DTMF_UP_CODE) > 8) if (strlen(gEeprom.DTMF_UP_CODE) > 8)
UI_PrintString(gEeprom.DTMF_UP_CODE + 8, menu_item_x1, menu_item_x2, 4, 8); UI_PrintString(gEeprom.DTMF_UP_CODE + 8, menu_item_x1, menu_item_x2, 4, 8);
if (gMenuCursor == MENU_DWCODE) if (GetCurrentMenuId() == MENU_DWCODE)
if (strlen(gEeprom.DTMF_DOWN_CODE) > 8) if (strlen(gEeprom.DTMF_DOWN_CODE) > 8)
UI_PrintString(gEeprom.DTMF_DOWN_CODE + 8, menu_item_x1, menu_item_x2, 4, 8); UI_PrintString(gEeprom.DTMF_DOWN_CODE + 8, menu_item_x1, menu_item_x2, 4, 8);
if (gMenuCursor == MENU_D_LIST && gIsDtmfContactValid) if (GetCurrentMenuId() == MENU_D_LIST && gIsDtmfContactValid)
{ {
Contact[11] = 0; Contact[11] = 0;
memmove(&gDTMF_ID, Contact + 8, 4); memmove(&gDTMF_ID, Contact + 8, 4);
@@ -897,22 +968,22 @@ void UI_DisplayMenu(void)
UI_PrintString(String, menu_item_x1, menu_item_x2, 4, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 4, 8);
} }
if (gMenuCursor == MENU_R_CTCS || if (GetCurrentMenuId() == MENU_R_CTCS ||
gMenuCursor == MENU_T_CTCS || GetCurrentMenuId() == MENU_T_CTCS ||
gMenuCursor == MENU_R_DCS || GetCurrentMenuId() == MENU_R_DCS ||
gMenuCursor == MENU_T_DCS || GetCurrentMenuId() == MENU_T_DCS ||
gMenuCursor == MENU_D_LIST) GetCurrentMenuId() == MENU_D_LIST)
{ {
unsigned int Offset; unsigned int Offset;
NUMBER_ToDigits(gSubMenuSelection, String); NUMBER_ToDigits(gSubMenuSelection, String);
Offset = (gMenuCursor == MENU_D_LIST) ? 2 : 3; Offset = (GetCurrentMenuId() == MENU_D_LIST) ? 2 : 3;
UI_DisplaySmallDigits(Offset, String + (8 - Offset), 105, 0, false); UI_DisplaySmallDigits(Offset, String + (8 - Offset), 105, 0, false);
} }
if ((gMenuCursor == MENU_RESET || if ((GetCurrentMenuId() == MENU_RESET ||
gMenuCursor == MENU_MEM_CH || GetCurrentMenuId() == MENU_MEM_CH ||
gMenuCursor == MENU_MEM_NAME || GetCurrentMenuId() == MENU_MEM_NAME ||
gMenuCursor == MENU_DEL_CH) && gAskForConfirmation) GetCurrentMenuId() == MENU_DEL_CH) && gAskForConfirmation)
{ // display confirmation { // display confirmation
strcpy(String, (gAskForConfirmation == 1) ? "SURE?" : "WAIT!"); strcpy(String, (gAskForConfirmation == 1) ? "SURE?" : "WAIT!");
UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8);

View File

@@ -39,7 +39,6 @@ enum
MENU_T_CTCS, MENU_T_CTCS,
MENU_SFT_D, MENU_SFT_D,
MENU_OFFSET, MENU_OFFSET,
MENU_XB,
MENU_TOT, MENU_TOT,
MENU_W_N, MENU_W_N,
MENU_SCR, MENU_SCR,
@@ -49,8 +48,11 @@ enum
MENU_MEM_NAME, MENU_MEM_NAME,
MENU_MDF, MENU_MDF,
MENU_SAVE, MENU_SAVE,
#ifdef ENABLE_VOX
MENU_VOX, MENU_VOX,
#endif
MENU_ABR, MENU_ABR,
MENU_ABR_ON_TX_RX,
MENU_TDR, MENU_TDR,
MENU_BEEP, MENU_BEEP,
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -66,9 +68,7 @@ enum
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
MENU_MIC_BAR, MENU_MIC_BAR,
#endif #endif
#ifdef ENABLE_COMPANDER
MENU_COMPAND, MENU_COMPAND,
#endif
MENU_1_CALL, MENU_1_CALL,
MENU_S_LIST, MENU_S_LIST,
MENU_SLIST1, MENU_SLIST1,
@@ -102,9 +102,6 @@ enum
MENU_NOAA_S, MENU_NOAA_S,
#endif #endif
MENU_RESET, MENU_RESET,
// items after here are normally hidden
MENU_F_LOCK, MENU_F_LOCK,
MENU_200TX, MENU_200TX,
MENU_350TX, MENU_350TX,
@@ -116,9 +113,14 @@ enum
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
MENU_F_CALI, // reference xtal calibration MENU_F_CALI, // reference xtal calibration
#endif #endif
MENU_BATCAL // battery voltage calibration MENU_BATCAL, // battery voltage calibration
MENU_F1SHRT,
MENU_F1LONG,
MENU_F2SHRT,
MENU_F2LONG
}; };
extern const uint8_t FIRST_HIDDEN_MENU_ITEM;
extern const t_menu_item MenuList[]; extern const t_menu_item MenuList[];
extern const char gSubMenu_TXP[3][5]; extern const char gSubMenu_TXP[3][5];
@@ -127,36 +129,39 @@ extern const char gSubMenu_W_N[2][7];
extern const char gSubMenu_OFF_ON[2][4]; extern const char gSubMenu_OFF_ON[2][4];
extern const char gSubMenu_SAVE[5][4]; extern const char gSubMenu_SAVE[5][4];
extern const char gSubMenu_TOT[11][7]; extern const char gSubMenu_TOT[11][7];
extern const char gSubMenu_CHAN[3][10]; extern const char* gSubMenu_RXMode[4];
extern const char gSubMenu_XB[3][10];
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
extern const char gSubMenu_VOICE[3][4]; extern const char gSubMenu_VOICE[3][4];
#endif #endif
extern const char gSubMenu_SC_REV[3][13]; extern const char gSubMenu_SC_REV[3][8];
extern const char gSubMenu_MDF[4][15]; extern const char* gSubMenu_MDF[4];
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
extern const char gSubMenu_AL_MOD[2][5]; extern const char gSubMenu_AL_MOD[2][5];
#endif #endif
extern const char gSubMenu_D_RSP[4][11]; extern const char gSubMenu_D_RSP[4][11];
extern const char gSubMenu_PTT_ID[4][7]; extern const char* gSubMenu_PTT_ID[5];
extern const char gSubMenu_PONMSG[4][8]; extern const char gSubMenu_PONMSG[4][8];
extern const char gSubMenu_ROGER[3][9]; extern const char* gSubMenu_ROGER[3];
extern const char gSubMenu_RESET[2][4]; extern const char gSubMenu_RESET[2][4];
extern const char gSubMenu_F_LOCK[6][4]; extern const char gSubMenu_F_LOCK[6][4];
extern const char gSubMenu_BACKLIGHT[8][7]; extern const char gSubMenu_BACKLIGHT[8][7];
#ifdef ENABLE_COMPANDER extern const char gSubMenu_RX_TX[4][6];
extern const char gSubMenu_Compand[4][6];
#endif
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
extern const char gSubMenu_AM_fix_test1[4][8]; extern const char gSubMenu_AM_fix_test1[4][8];
#endif #endif
extern const char gSubMenu_BAT_TXT[3][8]; extern const char gSubMenu_BAT_TXT[3][8];
extern const char gSubMenu_SCRAMBLER[11][7]; extern const char gSubMenu_SCRAMBLER[11][7];
typedef struct {char* name; uint8_t id;} t_sidefunction;
extern const uint8_t gSubMenu_SIDEFUNCTIONS_size;
extern const t_sidefunction* gSubMenu_SIDEFUNCTIONS;
extern bool gIsInSubMenu; extern bool gIsInSubMenu;
extern uint8_t gMenuCursor; extern uint8_t gMenuCursor;
int GetCurrentMenuId();
extern int8_t gMenuScrollDirection; extern int8_t gMenuScrollDirection;
extern int32_t gSubMenuSelection; extern int32_t gSubMenuSelection;

View File

@@ -28,6 +28,7 @@
#include "helper/battery.h" #include "helper/battery.h"
#include "misc.h" #include "misc.h"
#include "settings.h" #include "settings.h"
#include "ui/battery.h"
#include "ui/helper.h" #include "ui/helper.h"
#include "ui/ui.h" #include "ui/ui.h"
#include "ui/status.h" #include "ui/status.h"
@@ -45,12 +46,26 @@ void UI_DisplayStatus(const bool test_display)
// ************** // **************
// POWER-SAVE indicator // POWER-SAVE indicator
if (gCurrentFunction == FUNCTION_TRANSMIT)
{
memmove(line + x, BITMAP_TX, sizeof(BITMAP_TX));
x1 = x + sizeof(BITMAP_TX);
}
else
if (gCurrentFunction == FUNCTION_RECEIVE ||
gCurrentFunction == FUNCTION_MONITOR ||
gCurrentFunction == FUNCTION_INCOMING)
{
memmove(line + x, BITMAP_RX, sizeof(BITMAP_RX));
x1 = x + sizeof(BITMAP_RX);
}
else
if (gCurrentFunction == FUNCTION_POWER_SAVE || test_display) if (gCurrentFunction == FUNCTION_POWER_SAVE || test_display)
{ {
memmove(line + x, BITMAP_PowerSave, sizeof(BITMAP_PowerSave)); memmove(line + x, BITMAP_POWERSAVE, sizeof(BITMAP_POWERSAVE));
x1 = x + sizeof(BITMAP_PowerSave); x1 = x + sizeof(BITMAP_POWERSAVE);
} }
x += sizeof(BITMAP_PowerSave); x += sizeof(BITMAP_POWERSAVE);
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
// NOASS SCAN indicator // NOASS SCAN indicator
@@ -70,22 +85,27 @@ void UI_DisplayStatus(const bool test_display)
x1 = x + 10; x1 = x + 10;
} }
else else
#ifdef ENABLE_FMRADIO
// FM indicator
if (gFmRadioMode || test_display)
{
memmove(line + x, BITMAP_FM, sizeof(BITMAP_FM));
x1 = x + sizeof(BITMAP_FM);
}
else
#endif
// SCAN indicator // SCAN indicator
if (gScanState != SCAN_OFF || gScreenToDisplay == DISPLAY_SCANNER || test_display) if (gScanStateDir != SCAN_OFF || gScreenToDisplay == DISPLAY_SCANNER || test_display)
{ {
memmove(line + x, BITMAP_SC, sizeof(BITMAP_SC)); if (gNextMrChannel <= MR_CHANNEL_LAST && gScreenToDisplay != DISPLAY_SCANNER)
x1 = x + sizeof(BITMAP_SC); { // channel mode
if (gEeprom.SCAN_LIST_DEFAULT == 0)
UI_PrintStringSmallBuffer("1", line + x);
else
if (gEeprom.SCAN_LIST_DEFAULT == 1)
UI_PrintStringSmallBuffer("2", line + x);
else
if (gEeprom.SCAN_LIST_DEFAULT == 2)
UI_PrintStringSmallBuffer("*", line + x);
}
else
{ // frequency mode
UI_PrintStringSmallBuffer("S", line + x);
}
x1 = x + 7;
} }
x += sizeof(BITMAP_SC); x += 7; // font character width
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
// VOICE indicator // VOICE indicator
@@ -94,36 +114,38 @@ void UI_DisplayStatus(const bool test_display)
memmove(line + x, BITMAP_VoicePrompt, sizeof(BITMAP_VoicePrompt)); memmove(line + x, BITMAP_VoicePrompt, sizeof(BITMAP_VoicePrompt));
x1 = x + sizeof(BITMAP_VoicePrompt); x1 = x + sizeof(BITMAP_VoicePrompt);
} }
x += sizeof(BITMAP_VoicePrompt); x += sizeof(BITMAP_VoicePrompt) + 1;
#else #else
// hmmm, what to put in it's place // hmmm, what to put in it's place
#endif #endif
// DUAL-WATCH indicator x++;
if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF || test_display) if(gScreenToDisplay != DISPLAY_SCANNER) {
{ uint8_t dw = (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) * 2;
if (gDualWatchActive || test_display) if(dw == 1 || dw == 3 || test_display) { // DWR - dual watch + respond
memmove(line + x, BITMAP_TDR1, sizeof(BITMAP_TDR1)); if(gDualWatchActive || test_display)
else memmove(line + x, BITMAP_TDR1, sizeof(BITMAP_TDR1) - (dw==1?0:5));
memmove(line + x, BITMAP_TDR2, sizeof(BITMAP_TDR2)); else
memmove(line + x + 3, BITMAP_TDR2, sizeof(BITMAP_TDR2));
}
else if(dw == 2) { // XB - crossband
memmove(line + x, BITMAP_XB, sizeof(BITMAP_XB));
}
} }
x += sizeof(BITMAP_TDR1); x += sizeof(BITMAP_TDR1) + 2;
// CROSS-VFO indicator
if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF || test_display)
{
memmove(line + x, BITMAP_XB, sizeof(BITMAP_XB));
x1 = x + sizeof(BITMAP_XB);
}
x += sizeof(BITMAP_XB);
// VOX indicator #ifdef ENABLE_VOX
if (gEeprom.VOX_SWITCH || test_display) // VOX indicator
{ if (gEeprom.VOX_SWITCH || test_display)
memmove(line + x, BITMAP_VOX, sizeof(BITMAP_VOX)); {
x1 = x + sizeof(BITMAP_VOX); memmove(line + x, BITMAP_VOX, sizeof(BITMAP_VOX));
} x1 = x + sizeof(BITMAP_VOX);
x += sizeof(BITMAP_VOX); }
x += sizeof(BITMAP_VOX) + 2;
#endif
x = MAX(x, 61u);
x1 = x;
// KEY-LOCK indicator // KEY-LOCK indicator
if (gEeprom.KEY_LOCK || test_display) if (gEeprom.KEY_LOCK || test_display)
@@ -187,36 +209,8 @@ void UI_DisplayStatus(const bool test_display)
x += sizeof(BITMAP_USB_C); x += sizeof(BITMAP_USB_C);
// BATTERY LEVEL indicator // BATTERY LEVEL indicator
if (gBatteryDisplayLevel >= 2 && !gLowBattery) UI_DrawBattery(line + x, gBatteryDisplayLevel, gLowBatteryBlink);
{
line += x;
memmove(line, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
#ifndef ENABLE_REVERSE_BAT_SYMBOL
line += sizeof(BITMAP_BatteryLevel1);
if (gBatteryDisplayLevel >= 2)
memmove(line - 4, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 3)
memmove(line - 7, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 4)
memmove(line - 10, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 5)
memmove(line - 13, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
#else
if (gBatteryDisplayLevel >= 2)
memmove(line + 3, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 3)
memmove(line + 6, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 4)
memmove(line + 9, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 5)
memmove(line + 12, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
#endif
}
else
if (gLowBatteryBlink == 1)
memmove(line + x, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
// ************** // **************
ST7565_BlitStatusLine(); ST7565_BlitStatusLine();

45
ui/ui.c
View File

@@ -77,33 +77,28 @@ void GUI_DisplayScreen(void)
void GUI_SelectNextDisplay(GUI_DisplayType_t Display) void GUI_SelectNextDisplay(GUI_DisplayType_t Display)
{ {
if (Display != DISPLAY_INVALID) if (Display == DISPLAY_INVALID)
return;
if (gScreenToDisplay != Display)
{ {
if (gScreenToDisplay != Display) DTMF_clear_input_box();
{
gInputBoxIndex = 0;
gIsInSubMenu = false;
gCssScanMode = CSS_SCAN_MODE_OFF;
gScanState = SCAN_OFF;
#ifdef ENABLE_FMRADIO
gFM_ScanState = FM_SCAN_OFF;
#endif
gAskForConfirmation = 0;
gDTMF_InputMode = false;
gDTMF_InputIndex = 0;
gAskToSave = false;
gAskToDelete = false;
if (gWasFKeyPressed) gInputBoxIndex = 0;
{ gIsInSubMenu = false;
gWasFKeyPressed = false; gCssScanMode = CSS_SCAN_MODE_OFF;
gUpdateStatus = true; gScanStateDir = SCAN_OFF;
} #ifdef ENABLE_FMRADIO
gFM_ScanState = FM_SCAN_OFF;
#endif
gAskForConfirmation = 0;
gAskToSave = false;
gAskToDelete = false;
gWasFKeyPressed = false;
gUpdateStatus = true; gUpdateStatus = true;
}
gUpdateDisplay = true;
gScreenToDisplay = Display;
} }
gScreenToDisplay = Display;
gUpdateDisplay = true;
} }

View File

@@ -93,15 +93,29 @@ void create_gain_table(const char *filename)
mixer_dB[orig_mixer] + mixer_dB[orig_mixer] +
pga_dB[orig_pga]; pga_dB[orig_pga];
const uint8_t lna_short_min = 0; // 0 #if 1
const uint8_t lna_min = 0; // 0 // full table
const uint8_t mixer_min = 0; // 0 const uint8_t lna_short_min = 0; // 0
const uint8_t pga_min = 0; // 0 const uint8_t lna_min = 0; // 0
const uint8_t mixer_min = 0; // 0
const uint8_t pga_min = 0; // 0
const uint8_t lna_short_max = 3; // 3 const uint8_t lna_short_max = 3; // 3
const uint8_t lna_max = 7; // 5 const uint8_t lna_max = 7; // 5
const uint8_t mixer_max = 3; // 3 const uint8_t mixer_max = 3; // 3
const uint8_t pga_max = 7; // 7 const uint8_t pga_max = 7; // 7
#else
// just one register changes
const uint8_t lna_short_min = 0;
const uint8_t lna_min = 2;
const uint8_t mixer_min = 3;
const uint8_t pga_min = 6;
const uint8_t lna_short_max = 3;
const uint8_t lna_max = 2;
const uint8_t mixer_max = 3;
const uint8_t pga_max = 6;
#endif
uint8_t lna_short = lna_short_min; uint8_t lna_short = lna_short_min;
uint8_t lna = lna_min; uint8_t lna = lna_min;
@@ -244,37 +258,90 @@ void create_gain_table(const char *filename)
return; return;
fprintf(file, "\n"); fprintf(file, "\n");
fprintf(file, "\tconst t_am_fix_gain_table am_fix_gain_table[] =\n"); fprintf(file, "\tstatic const t_am_fix_gain_table am_fix_gain_table[] =\n");
fprintf(file, "\t{\n"); fprintf(file, "\t{\n");
fprintf(file, "\t\t{.lna_short = 3, .lna = 2, .mixer = 3, .pga = 6}, // 0 0dB -14dB 0dB -3dB .. -17dB original\n\n");
for (unsigned int i = 0; i < gain_table.size(); i++) #if 0
fprintf(file, "\t\t{.lna_short = 3, .lna = 2, .mixer = 3, .pga = 6}, // 0 0dB -14dB 0dB -3dB .. -17dB original\n\n");
for (unsigned int i = 0; i < gain_table.size(); i++)
{
char s[1024];
const t_gain_table entry = gain_table[i];
sprintf(s, "\t\t{%u, %u, %u, %u}, // %3u .. %3ddB %3ddB %2ddB %3ddB .. %3ddB",
entry.lna_short,
entry.lna,
entry.mixer,
entry.pga,
1 + i,
entry.lna_short_dB,
entry.lna_dB,
entry.mixer_dB,
entry.pga_dB,
entry.sum_dB);
if (i == original_index)
strcat(s, " original");
fprintf(file, "%s\n", s);
}
#else
{ {
char s[1024]; //BK4819_WriteRegister(BK4819_REG_13, ((uint16_t)gains.lna_short << 8) | ((uint16_t)gains.lna << 5) | ((uint16_t)gains.mixer << 3) | ((uint16_t)gains.pga << 0));
const t_gain_table entry = gain_table[i]; uint16_t reg_val;
int16_t sum_dB;
sprintf(s, "\t\t{%u, %u, %u, %u}, // %3u .. %3ddB %3ddB %2ddB %3ddB .. %3ddB", reg_val = ((uint16_t)orig_lna_short << 8) | ((uint16_t)orig_lna << 5) | ((uint16_t)orig_mixer << 3) | ((uint16_t)orig_pga << 0);
entry.lna_short, sum_dB = lna_short_dB[orig_lna_short] + lna_dB[orig_lna] + mixer_dB[orig_mixer] + pga_dB[orig_pga];
entry.lna, fprintf(file, "\t\t{0x%04X, %-3d}, // 0 .. %u %u %u %u .. 0dB -14dB 0dB -3dB .. -17dB original\n\n",
entry.mixer, reg_val,
entry.pga, sum_dB,
1 + i, orig_lna_short,
entry.lna_short_dB, orig_lna,
entry.lna_dB, orig_mixer,
entry.mixer_dB, orig_pga);
entry.pga_dB,
entry.sum_dB);
if (i == original_index) for (unsigned int i = 0; i < gain_table.size(); i++)
strcat(s, " original"); {
char s[1024];
fprintf(file, "%s\n", s); const t_gain_table entry = gain_table[i];
reg_val = ((uint16_t)entry.lna_short << 8) | ((uint16_t)entry.lna << 5) | ((uint16_t)entry.mixer << 3) | ((uint16_t)entry.pga << 0);
sum_dB = lna_short_dB[entry.lna_short] + lna_dB[entry.lna] + mixer_dB[entry.mixer] + pga_dB[entry.pga];
sprintf(s, "\t\t{0x%04X, %-3d}, // %3u .. %u %u %u %u .. %3ddB %3ddB %2ddB %3ddB .. %3ddB",
reg_val,
sum_dB,
1 + i,
entry.lna_short,
entry.lna,
entry.mixer,
entry.pga,
entry.lna_short_dB,
entry.lna_dB,
entry.mixer_dB,
entry.pga_dB,
entry.sum_dB);
if (i == original_index)
strcat(s, " original");
fprintf(file, "%s\n", s);
}
} }
#endif
fprintf(file, "\t};\n\n"); fprintf(file, "\t};\n\n");
fprintf(file, "\tconst unsigned int original_index = %u;\n", 1 + original_index); fprintf(file, "\tstatic const unsigned int original_index = %u;\n", 1 + original_index);
fclose(file); fclose(file);
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -4,7 +4,7 @@
#ifdef GIT_HASH #ifdef GIT_HASH
#define VER GIT_HASH #define VER GIT_HASH
#else #else
#define VER "231002" #define VER "231004"
#endif #endif
#ifndef ONE_OF_ELEVEN_VER #ifndef ONE_OF_ELEVEN_VER