46 Commits
v0.2 ... v0.5

Author SHA1 Message Date
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
Krzysiek Egzmont
2397e3950b Makefile 2023-10-02 23:29:19 +02:00
Krzysiek Egzmont
d11e7863dc Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-02 23:15:34 +02:00
Krzysiek Egzmont
35c7530036 Change default build setting of am fix debugging to 0 2023-10-02 23:06:05 +02:00
OneOfEleven
87d1cf7c86 Increased menu BATCAL, F-CALI and BATVOL timeouts to 2 mins + disable TX when serial config upload/download in progress 2023-10-02 22:04:41 +01:00
OneOfEleven
bf2564b9f5 F-CAL hidden meni compile option added + BATCAL menu range adjust range increased 2023-10-02 20:52:18 +01:00
OneOfEleven
c59e0ea06c Fix DTM TX-UP only 2023-10-02 19:23:37 +01:00
OneOfEleven
9ac3525683 Simplified the frequency band table(s) 2023-10-02 14:13:27 +01:00
OneOfEleven
3ac330ddee Testing disabling the BK chips auto bandwidth switching weak signal option 2023-10-02 12:20:54 +01:00
OneOfEleven
af342cf904 Restored battery bar thresholds back to the stored calibration values. 2023-10-02 10:40:27 +01:00
OneOfEleven
ec33203403 Update RADIO_InitInfo() so that things match up rather than fixed numerical constants 2023-10-02 10:05:15 +01:00
OneOfEleven
3c7f496f3e Tidy ups, speedier channel scanning, RSSI meter updating fix 2023-10-02 09:31:35 +01:00
Krzysiek Egzmont
174c06dfbf build options 2023-10-02 03:52:59 +02:00
Krzysiek Egzmont
d86ccaafcd README updated 2023-10-02 03:31:02 +02:00
Krzysiek Egzmont
d826ecb0ae Merge remote-tracking branch 'remotes/OneOfEleven/main' 2023-10-02 03:21:18 +02:00
OneOfEleven
e0aa1a83be Fix ENABLE_KEEP_MEM_NAME stuff 2023-10-02 02:02:34 +01:00
Krzysiek Egzmont
e64bf6bbd6 Merge branch '1o11main' 2023-10-02 03:01:28 +02:00
OneOfEleven
aafc93c2ee Forgot to remove unrequired batcal code 2023-10-02 01:44:33 +01:00
OneOfEleven
58eced120e On-screen charge level bug fixed 2023-10-02 01:28:56 +01:00
OneOfEleven
bbf8a7061e Fixed CTCSS int overflow bug 2023-10-02 01:19:14 +01:00
OneOfEleven
aea80cb046 Updated menu battery cal from egzumer 2023-10-02 01:09:35 +01:00
OneOfEleven
4333fdeb3a Added menu battery calibration from egzumer (hidden menu option) 2023-10-02 00:38:59 +01:00
OneOfEleven
a9aa37e043 Pulled in egzumer's battery percentage ! 2023-10-01 22:14:45 +01:00
OneOfEleven
1fc1a102ea Merge pull request #85 from wutje/smaller_keyboard_handling
Keyboard: Save 240 bytes of flash.
2023-10-01 21:55:07 +01:00
OneOfEleven
86d2dade7a Menu update + PTT-ID fix 2023-10-01 21:50:05 +01:00
Wouter van Gulik
6f7bb75b52 Keyboard: Save 240 bytes of flash.
Move definition to a table.
Set and read the pins all at once.
Drop extra delays.
Use existing I2C_Stop to generate proper stop condition.
2023-10-01 22:34:03 +02:00
Krzysiek Egzmont
82b8f6755f docker build script 2023-10-01 22:09:52 +02:00
OneOfEleven
8caff25b7c Possible DW AM TX fix 2023-10-01 19:56:04 +01:00
OneOfEleven
c644b30b2f 1750 compile option + maybe DW AM TX fix 2023-10-01 19:17:51 +01:00
OneOfEleven
de174d072c Removed unneeded function call param (band) 2023-10-01 17:19:38 +01:00
OneOfEleven
c3c344daec Menu play + reduce AM AGC hysteresis very slightly. 2023-10-01 15:07:34 +01:00
OneOfEleven
fc1bc8791c Menu update, F-LOCK CE update, main screen fix 2023-10-01 14:34:51 +01:00
OneOfEleven
fa4ae2caa6 Fix what I did last 2023-10-01 12:44:22 +01:00
OneOfEleven
b45043aab2 Rename compile option ENABLE_NO_SCAN_TIMEOUT to ENABLE_CODE_SCAN_TIMEOUT 2023-10-01 10:27:10 +01:00
OneOfEleven
ba3decad78 Show "TX DISABLE" on the correct VFO/screen line 2023-10-01 10:15:24 +01:00
OneOfEleven
7df7461d31 Fix dual-watch so that TX only uses the main channel (black triangle) 2023-10-01 09:14:19 +01:00
51 changed files with 1579 additions and 1222 deletions

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@
firmware firmware
/firmware.packed.bin /firmware.packed.bin
/firmware.bin /firmware.bin
/compiled-firmware

12
Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
FROM archlinux:latest
RUN pacman -Syyu base-devel --noconfirm
RUN pacman -Syyu arm-none-eabi-gcc --noconfirm
RUN pacman -Syyu arm-none-eabi-newlib --noconfirm
RUN pacman -Syyu git --noconfirm
RUN pacman -Syyu python-pip --noconfirm
RUN pacman -Syyu python-crcmod --noconfirm
WORKDIR /app
COPY . .
RUN git submodule update --init --recursive
#RUN make && cp firmware* compiled-firmware/

View File

@@ -4,37 +4,48 @@
# 1 = enable # 1 = enable
# #
ENABLE_SWD := 0 ENABLE_SWD := 0
ENABLE_OVERLAY := 1 ENABLE_OVERLAY := 0
ENABLE_LTO := 1
ENABLE_UART := 1 ENABLE_UART := 1
ENABLE_AIRCOPY := 0 ENABLE_AIRCOPY := 0
ENABLE_FMRADIO := 0 ENABLE_FMRADIO := 1
ENABLE_NOAA := 0 ENABLE_NOAA := 0
ENABLE_VOICE := 0 ENABLE_VOICE := 0
ENABLE_ALARM := 0 ENABLE_ALARM := 1
ENABLE_TX1750 := 1
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
ENABLE_WIDE_RX := 1 ENABLE_WIDE_RX := 1
ENABLE_TX_WHEN_AM := 0 ENABLE_TX_WHEN_AM := 0
ENABLE_F_CAL_MENU := 0
ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1
ENABLE_MAIN_KEY_HOLD := 1 ENABLE_MAIN_KEY_HOLD := 1
ENABLE_BOOT_BEEPS := 0 ENABLE_BOOT_BEEPS := 0
ENABLE_COMPANDER := 1 ENABLE_COMPANDER := 0
ENABLE_SHOW_CHARGE_LEVEL := 1 ENABLE_SHOW_CHARGE_LEVEL := 1
ENABLE_REVERSE_BAT_SYMBOL := 1 ENABLE_REVERSE_BAT_SYMBOL := 1
ENABLE_NO_SCAN_TIMEOUT := 1 ENABLE_CODE_SCAN_TIMEOUT := 0
ENABLE_AM_FIX := 1 ENABLE_AM_FIX := 1
ENABLE_AM_FIX_SHOW_DATA := 1 ENABLE_AM_FIX_SHOW_DATA := 0
ENABLE_SQUELCH_LOWER := 1 ENABLE_SQUELCH_LOWER := 0
ENABLE_FASTER_CHANNEL_SCAN := 1
ENABLE_RSSI_BAR := 1 ENABLE_RSSI_BAR := 1
ENABLE_AUDIO_BAR := 1 ENABLE_AUDIO_BAR := 1
ENABLE_SPECTRUM := 1 ENABLE_SPECTRUM := 1
#ENABLE_COPY_CHAN_TO_VFO := 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
#############################################################
TARGET = firmware TARGET = firmware
ifeq ($(ENABLE_LTO), 1)
# can't have LTO and OVERLAY enabled at same time
ENABLE_OVERLAY := 0
endif
BSP_DEFINITIONS := $(wildcard hardware/*/*.def) BSP_DEFINITIONS := $(wildcard hardware/*/*.def)
BSP_HEADERS := $(patsubst hardware/%,bsp/%,$(BSP_DEFINITIONS)) BSP_HEADERS := $(patsubst hardware/%,bsp/%,$(BSP_DEFINITIONS))
BSP_HEADERS := $(patsubst %.def,%.h,$(BSP_HEADERS)) BSP_HEADERS := $(patsubst %.def,%.h,$(BSP_HEADERS))
@@ -96,7 +107,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
@@ -129,7 +142,7 @@ 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)
@@ -158,6 +171,11 @@ CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delet
#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=gnu99 -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=gnu11 -MMD
ifeq ($(ENABLE_LTO), 1)
# CFLAGS += -flto
CFLAGS += -flto=2
endif
CFLAGS += -DPRINTF_INCLUDE_CONFIG_H CFLAGS += -DPRINTF_INCLUDE_CONFIG_H
CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\" CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\"
@@ -167,15 +185,15 @@ endif
ifeq ($(ENABLE_SWD),1) ifeq ($(ENABLE_SWD),1)
CFLAGS += -DENABLE_SWD CFLAGS += -DENABLE_SWD
endif endif
ifeq ($(ENABLE_OVERLAY),1)
CFLAGS += -DENABLE_OVERLAY
endif
ifeq ($(ENABLE_AIRCOPY),1) ifeq ($(ENABLE_AIRCOPY),1)
CFLAGS += -DENABLE_AIRCOPY CFLAGS += -DENABLE_AIRCOPY
endif endif
ifeq ($(ENABLE_FMRADIO),1) ifeq ($(ENABLE_FMRADIO),1)
CFLAGS += -DENABLE_FMRADIO CFLAGS += -DENABLE_FMRADIO
endif endif
ifeq ($(ENABLE_OVERLAY),1)
CFLAGS += -DENABLE_OVERLAY
endif
ifeq ($(ENABLE_UART),1) ifeq ($(ENABLE_UART),1)
CFLAGS += -DENABLE_UART CFLAGS += -DENABLE_UART
endif endif
@@ -194,8 +212,11 @@ endif
ifeq ($(ENABLE_ALARM),1) ifeq ($(ENABLE_ALARM),1)
CFLAGS += -DENABLE_ALARM CFLAGS += -DENABLE_ALARM
endif endif
ifeq ($(ENABLE_TX1750),1)
CFLAGS += -DENABLE_TX1750
endif
ifeq ($(ENABLE_KEEP_MEM_NAME),1) ifeq ($(ENABLE_KEEP_MEM_NAME),1)
CFLAGS += -DKEEP_MEM_NAME CFLAGS += -DENABLE_KEEP_MEM_NAME
endif endif
ifeq ($(ENABLE_WIDE_RX),1) ifeq ($(ENABLE_WIDE_RX),1)
CFLAGS += -DENABLE_WIDE_RX CFLAGS += -DENABLE_WIDE_RX
@@ -203,6 +224,9 @@ endif
ifeq ($(ENABLE_TX_WHEN_AM),1) ifeq ($(ENABLE_TX_WHEN_AM),1)
CFLAGS += -DENABLE_TX_WHEN_AM CFLAGS += -DENABLE_TX_WHEN_AM
endif endif
ifeq ($(ENABLE_F_CAL_MENU),1)
CFLAGS += -DENABLE_F_CAL_MENU
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
@@ -221,8 +245,8 @@ endif
ifeq ($(ENABLE_REVERSE_BAT_SYMBOL),1) ifeq ($(ENABLE_REVERSE_BAT_SYMBOL),1)
CFLAGS += -DENABLE_REVERSE_BAT_SYMBOL CFLAGS += -DENABLE_REVERSE_BAT_SYMBOL
endif endif
ifeq ($(ENABLE_NO_SCAN_TIMEOUT),1) ifeq ($(ENABLE_CODE_SCAN_TIMEOUT),1)
CFLAGS += -DENABLE_NO_SCAN_TIMEOUT CFLAGS += -DENABLE_CODE_SCAN_TIMEOUT
endif endif
ifeq ($(ENABLE_AM_FIX),1) ifeq ($(ENABLE_AM_FIX),1)
CFLAGS += -DENABLE_AM_FIX CFLAGS += -DENABLE_AM_FIX
@@ -233,8 +257,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

View File

@@ -3,7 +3,6 @@
- fagci spectrum analyzer (**F+5** to turn on) - fagci spectrum analyzer (**F+5** to turn on)
- better battery percentage calculation (based on real measurement, battery calibration recommended) - better battery percentage calculation (based on real measurement, battery calibration recommended)
- battery calibration option available available in the menu (instructions below) - battery calibration option available available in the menu (instructions below)
- there is no FM radio nor Aircopy, not enough memory space
<img src="images/main.jpg" width=300 /><img src="images/spectrum.jpg" width=300 /><img src="images/audiobar.jpg" width=300 /><img src="images/rssibar.jpg" width=300 /> <img src="images/main.jpg" width=300 /><img src="images/spectrum.jpg" width=300 /><img src="images/audiobar.jpg" width=300 /><img src="images/rssibar.jpg" width=300 />
@@ -13,12 +12,10 @@
To enter the calibration: To enter the calibration:
1. turn the radio on holding PTT and the first side button 1. turn the radio on while holding PTT and the first side button
2. imediately go to BATVOL option and adjust the voltage with UP/DOWN buttons 2. go to BATCAL option and adjust the voltage with UP/DOWN buttons
3. confirm the setting, calibration will be saved to EEPROM 3. confirm the setting, calibration will be saved to EEPROM
The calibration option becomes unavailable if you leave the menu screen and you have to repeat from step 1.
# Open reimplementation of the Quan Sheng UV-K5 v2.1.27 firmware # Open reimplementation of the Quan Sheng UV-K5 v2.1.27 firmware
@@ -39,9 +36,11 @@ Anyway, have fun.
Please note that the Quansheng uv-k radios are not professional quality transceivers, their Please note that the Quansheng uv-k 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, somewhat below that of a decent transceiver. The RX front
end has no track-tuned band pass filtering at all, and so are wide band/wide open to any end has no track-tuned band pass filtering at all, and so are wide band/wide open to any
and all signals over a wide frequency range. Using the radio in high intensity RF environments and all signals over a wide frequency range.
will nearly always destroy your reception, the receiver simply doesn't have a great dynamic Using the radio in high intensity RF environments will nearly always destroy your reception,
range, though are quite sensitive (weak signal wise). 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. Saying that, they are nice toys for the price, fun to play with.
@@ -52,31 +51,35 @@ You'll find the options at the top of "Makefile" ('0' = disable, '1' = enable) .
``` ```
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 := 1 cpu FLASH stuff ENABLE_OVERLAY := 0 cpu FLASH stuff, not needed
ENABLE_UART := 1 without this you can't configure radio via PC ENABLE_LTO := 0 **experimental, reduces size of compiled firmware but might break EEPROM reads (overlay will be disabled if you enable this)
ENABLE_AIRCOPY := 0 easier to just enter frequency ENABLE_UART := 1 without this you can't configure radio via PC !
ENABLE_FMRADIO := 1 WBFM VHF band 2 RX ENABLE_AIRCOPY := 0 easier to just enter frequency with butts
ENABLE_NOAA := 0 everything NOAA ENABLE_FMRADIO := 1 WBFM VHF broadcast band receiver
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_ALARM := 0 TX alarms ENABLE_ALARM := 0 TX alarms
ENABLE_BIG_FREQ := 0 big font frequencies ENABLE_1750HZ := 0 side key 1750Hz TX tone (older style repeater access)
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_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_MAIN_KEY_HOLD := 1 initial F-key press not needed, instead just hold down keys 0-9 to access the secondary butt functions
ENABLE_BOOT_BEEPS := 0 give user audio feedback on volume knob position at boot-up ENABLE_BOOT_BEEPS := 0 gives user audio feedback on volume knob position at boot-up
ENABLE_COMPANDER := 1 compander option (per channel) ENABLE_COMPANDER := 0 this is broken, don't bother with it for now .. 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_NO_SCAN_TIMEOUT := 1 remove the 32 sec timeout from the CTCSS/DCS scan (press exit butt to end scan) 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 := 1 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 not yet implemented - copy the current channel into the VFO
#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
``` ```

View File

@@ -30,12 +30,6 @@
#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
@@ -438,7 +432,7 @@ const uint8_t orig_pga = 6; // -3dB
} }
} }
if (diff_dB >= -4) // 4dB hysterisis (help reduce gain hunting) if (diff_dB >= -6) // 6dB hysterisis (help reduce gain hunting)
hold_counter[vfo] = 30; // 300ms hold hold_counter[vfo] = 30; // 300ms hold
if (hold_counter[vfo] == 0) if (hold_counter[vfo] == 0)
@@ -447,8 +441,10 @@ const uint8_t orig_pga = 6; // -3dB
gain_table_index[vfo] = (index <= max_index) ? index : max_index; // limit the gain index gain_table_index[vfo] = (index <= max_index) ? index : max_index; // limit the gain index
} }
if (gain_table_index[vfo] == gain_table_index_prev[vfo]) #if 0
return; // no gain change if (gain_table_index[vfo] == gain_table_index_prev[vfo])
return; // no gain change - this is to reduce writing to the BK chip on ever call
#endif
#endif #endif

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

@@ -109,7 +109,7 @@ void ACTION_Monitor(void)
} }
else else
#endif #endif
gRequestDisplayScreen = gScreenToDisplay; gRequestDisplayScreen = gScreenToDisplay;
} }
void ACTION_Scan(bool bRestart) void ACTION_Scan(bool bRestart)
@@ -235,17 +235,29 @@ void ACTION_Vox(void)
gUpdateStatus = true; gUpdateStatus = true;
} }
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
static void ACTION_AlarmOr1750(bool b1750) static void ACTION_AlarmOr1750(bool b1750)
{ {
gInputBoxIndex = 0; gInputBoxIndex = 0;
gAlarmState = b1750 ? ALARM_STATE_TX1750 : ALARM_STATE_TXALARM;
gAlarmRunningCounter = 0; #if defined(ENABLE_ALARM) && defined(ENABLE_TX1750)
gFlagPrepareTX = true; gAlarmState = b1750 ? ALARM_STATE_TX1750 : ALARM_STATE_TXALARM;
gRequestDisplayScreen = DISPLAY_MAIN; gAlarmRunningCounter = 0;
#elif defined(ENABLE_ALARM)
gAlarmState = ALARM_STATE_TXALARM;
gAlarmRunningCounter = 0;
#else
gAlarmState = ALARM_STATE_TX1750;
#endif
gFlagPrepareTX = true;
// if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
} }
#endif #endif
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
void ACTION_FM(void) void ACTION_FM(void)
{ {
@@ -258,6 +270,7 @@ void ACTION_Vox(void)
gInputBoxIndex = 0; gInputBoxIndex = 0;
gVoxResumeCountdown = 80; gVoxResumeCountdown = 80;
gFlagReconfigureVfos = true; gFlagReconfigureVfos = true;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
return; return;
} }
@@ -269,7 +282,8 @@ void ACTION_Vox(void)
FM_Start(); FM_Start();
gInputBoxIndex = 0; gInputBoxIndex = 0;
gRequestDisplayScreen = DISPLAY_FM; gRequestDisplayScreen = DISPLAY_FM;
} }
} }
@@ -368,7 +382,7 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
break; break;
#endif #endif
case ACTION_OPT_1750: case ACTION_OPT_1750:
#ifdef ENABLE_ALARM #ifdef ENABLE_TX1750
ACTION_AlarmOr1750(true); ACTION_AlarmOr1750(true);
#endif #endif
break; break;

View File

@@ -134,9 +134,9 @@ static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
NUMBER_Get(gInputBox, &Frequency); NUMBER_Get(gInputBox, &Frequency);
for (i = 0; i < 7; i++) for (i = 0; i < ARRAY_SIZE(frequencyBandTable); i++)
{ {
if (Frequency >= LowerLimitFrequencyBandTable[i] && Frequency <= UpperLimitFrequencyBandTable[i]) if (Frequency >= frequencyBandTable[i].lower && Frequency < frequencyBandTable[i].upper)
{ {
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;

459
app/app.c
View File

@@ -62,6 +62,12 @@
#include "ui/status.h" #include "ui/status.h"
#include "ui/ui.h" #include "ui/ui.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
static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);
static void updateRSSI(const int vfo) static void updateRSSI(const int vfo)
@@ -95,7 +101,7 @@ static void APP_CheckForIncoming(void)
if (gCssScanMode != CSS_SCAN_MODE_OFF && gRxReceptionMode == RX_MODE_NONE) if (gCssScanMode != CSS_SCAN_MODE_OFF && gRxReceptionMode == RX_MODE_NONE)
{ // CTCSS/DTS scanning { // CTCSS/DTS scanning
ScanPauseDelayIn_10ms = 100; // 1 second ScanPauseDelayIn_10ms = scan_pause_delay_in_5_10ms;
gScheduleScanListen = false; gScheduleScanListen = false;
gRxReceptionMode = RX_MODE_DETECTED; gRxReceptionMode = RX_MODE_DETECTED;
} }
@@ -157,10 +163,11 @@ static void APP_CheckForIncoming(void)
updateRSSI(gEeprom.RX_CHANNEL); updateRSSI(gEeprom.RX_CHANNEL);
gUpdateRSSI = true; gUpdateRSSI = true;
} }
return; return;
} }
ScanPauseDelayIn_10ms = 20; // 200ms ScanPauseDelayIn_10ms = scan_pause_delay_in_3_10ms;
gScheduleScanListen = false; gScheduleScanListen = false;
} }
@@ -223,7 +230,7 @@ static void APP_HandleIncoming(void)
if (gRxVfo->DTMF_DECODING_ENABLE || gSetting_KILLED) if (gRxVfo->DTMF_DECODING_ENABLE || gSetting_KILLED)
{ // DTMF DCD is enabled { // DTMF DCD is enabled
// DTMF_HandleRequest(); DTMF_HandleRequest();
if (gDTMF_CallState == DTMF_CALL_STATE_NONE) if (gDTMF_CallState == DTMF_CALL_STATE_NONE)
{ {
@@ -401,7 +408,7 @@ Skip:
break; break;
case SCAN_RESUME_CO: case SCAN_RESUME_CO:
ScanPauseDelayIn_10ms = 360; ScanPauseDelayIn_10ms = scan_pause_delay_in_7_10ms;
gScheduleScanListen = false; gScheduleScanListen = false;
break; break;
@@ -461,6 +468,9 @@ static void APP_HandleFunction(void)
void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
{ {
const unsigned int chan = gEeprom.RX_CHANNEL;
// const unsigned int chan = gRxVfo->CHANNEL_SAVE;
if (gSetting_KILLED) if (gSetting_KILLED)
return; return;
@@ -469,19 +479,15 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
BK1080_Init(0, false); BK1080_Init(0, false);
#endif #endif
#ifdef ENABLE_AM_FIX
if (gEeprom.VfoInfo[gEeprom.RX_CHANNEL].AM_mode && reset_am_fix)
AM_fix_reset(gEeprom.RX_CHANNEL); // TODO: only reset it when moving channel/frequency
#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[(chan + 1) & 1u] = 0;
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gEnableSpeaker = true; gEnableSpeaker = true;
BACKLIGHT_TurnOn(); if (gSetting_backlight_on_rx)
BACKLIGHT_TurnOn();
if (gScanState != SCAN_OFF) if (gScanState != SCAN_OFF)
{ {
@@ -490,7 +496,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
case SCAN_RESUME_TO: case SCAN_RESUME_TO:
if (!gScanPauseMode) if (!gScanPauseMode)
{ {
ScanPauseDelayIn_10ms = 500; ScanPauseDelayIn_10ms = scan_pause_delay_in_1_10ms;
gScheduleScanListen = false; gScheduleScanListen = false;
gScanPauseMode = true; gScanPauseMode = true;
} }
@@ -509,19 +515,21 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gIsNoaaMode) if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gIsNoaaMode)
{ {
gRxVfo->CHANNEL_SAVE = gNoaaChannel + NOAA_CHANNEL_FIRST; gRxVfo->CHANNEL_SAVE = gNoaaChannel + NOAA_CHANNEL_FIRST;
gRxVfo->pRX->Frequency = NoaaFrequencyTable[gNoaaChannel]; gRxVfo->pRX->Frequency = NoaaFrequencyTable[gNoaaChannel];
gRxVfo->pTX->Frequency = NoaaFrequencyTable[gNoaaChannel]; gRxVfo->pTX->Frequency = NoaaFrequencyTable[gNoaaChannel];
gEeprom.ScreenChannel[gEeprom.RX_CHANNEL] = gRxVfo->CHANNEL_SAVE; gEeprom.ScreenChannel[chan] = gRxVfo->CHANNEL_SAVE;
gNOAA_Countdown_10ms = 500; // 5 sec gNOAA_Countdown_10ms = 500; // 5 sec
gScheduleNOAA = false; gScheduleNOAA = false;
} }
#endif #endif
if (gCssScanMode != CSS_SCAN_MODE_OFF) if (gCssScanMode != CSS_SCAN_MODE_OFF)
gCssScanMode = CSS_SCAN_MODE_FOUND; gCssScanMode = CSS_SCAN_MODE_FOUND;
if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) if (gScanState == SCAN_OFF &&
gCssScanMode == CSS_SCAN_MODE_OFF &&
gEeprom.DUAL_WATCH != DUAL_WATCH_OFF)
{ // not scanning, dual watch is enabled { // not scanning, dual watch is enabled
gDualWatchCountdown_10ms = dual_watch_count_after_2_10ms; gDualWatchCountdown_10ms = dual_watch_count_after_2_10ms;
@@ -534,53 +542,31 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
gUpdateStatus = true; gUpdateStatus = true;
} }
// ****************************************** { // RF RX front end gain
// original setting // original setting
uint8_t lna_short = orig_lna_short; uint16_t lna_short = orig_lna_short;
uint8_t lna = orig_lna; uint16_t lna = orig_lna;
uint8_t mixer = orig_mixer; uint16_t mixer = orig_mixer;
uint8_t pga = orig_pga; uint16_t pga = orig_pga;
if (gRxVfo->AM_mode) #ifdef ENABLE_AM_FIX
{ // AM if (gRxVfo->AM_mode && gSetting_AM_fix)
/* { // AM RX mode
#ifndef ENABLE_AM_FIX if (reset_am_fix)
const uint32_t rx_frequency = gRxVfo->pRX->Frequency; AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency
AM_fix_10ms(chan);
// the RX gain abrutly reduces above this frequency
// I guess this is (one of) the freq the hardware switches the front ends over ?
if (rx_frequency <= 22640000)
{ // decrease front end gain - AM demodulator saturates at a slightly higher signal level
lna_short = 3; // 3 original
lna = 2; // 2 original
mixer = 3; // 3 original
pga = 3; // 6 original, 3 reduced
} }
else else
{ // increase the front end to compensate the reduced gain, but more gain decreases dynamic range :( { // FM RX mode
lna_short = 3; // 3 original BK4819_WriteRegister(BK4819_REG_13, (lna_short << 8) | (lna << 5) | (mixer << 3) | (pga << 0));
lna = 4; // 2 original, 4 increased
mixer = 3; // 3 original
pga = 7; // 6 original, 7 increased
} }
#else
BK4819_WriteRegister(BK4819_REG_13, (lna_short << 8) | (lna << 5) | (mixer << 3) | (pga << 0));
#endif #endif
*/
// what do these 4 other gain settings do ???
//BK4819_WriteRegister(BK4819_REG_12, 0x037B); // 000000 11 011 11 011
//BK4819_WriteRegister(BK4819_REG_11, 0x027B); // 000000 10 011 11 011
//BK4819_WriteRegister(BK4819_REG_10, 0x007A); // 000000 00 011 11 010
//BK4819_WriteRegister(BK4819_REG_14, 0x0019); // 000000 00 000 11 001
gNeverUsed = 0;
} }
// apply the front end gain settings // AF gain - original QS values
BK4819_WriteRegister(BK4819_REG_13, ((uint16_t)lna_short << 8) | ((uint16_t)lna << 5) | ((uint16_t)mixer << 3) | ((uint16_t)pga << 0));
// ******************************************
// AF gain - original
BK4819_WriteRegister(BK4819_REG_48, BK4819_WriteRegister(BK4819_REG_48,
(11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference (11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference
( 0u << 10) | // AF Rx Gain-1 ( 0u << 10) | // AF Rx Gain-1
@@ -588,7 +574,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
(gEeprom.DAC_GAIN << 0)); // AF DAC Gain (after Gain-1 and Gain-2) (gEeprom.DAC_GAIN << 0)); // AF DAC Gain (after Gain-1 and Gain-2)
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
if (gVoiceWriteIndex == 0) // if (gVoiceWriteIndex == 0)
#endif #endif
BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_OPEN); BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_OPEN);
@@ -600,11 +586,13 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
if (Function == FUNCTION_MONITOR) if (Function == FUNCTION_MONITOR)
#endif #endif
{ // squelch is disabled { // squelch is disabled
GUI_SelectNextDisplay(DISPLAY_MAIN); if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
return; GUI_SelectNextDisplay(DISPLAY_MAIN);
} }
else
gUpdateDisplay = true;
gUpdateDisplay = true; gUpdateStatus = true;
} }
uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step) uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step)
@@ -613,7 +601,7 @@ uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step)
if (pInfo->StepFrequency == 833) if (pInfo->StepFrequency == 833)
{ {
const uint32_t Lower = LowerLimitFrequencyBandTable[pInfo->Band]; const uint32_t Lower = frequencyBandTable[pInfo->Band].lower;
const uint32_t Delta = Frequency - Lower; const uint32_t Delta = Frequency - Lower;
uint32_t Base = (Delta / 2500) * 2500; uint32_t Base = (Delta / 2500) * 2500;
const uint32_t Index = ((Delta - Base) % 2500) / 833; const uint32_t Index = ((Delta - Base) % 2500) / 833;
@@ -624,11 +612,11 @@ uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step)
Frequency = Lower + Base + (Index * 833); Frequency = Lower + Base + (Index * 833);
} }
if (Frequency > UpperLimitFrequencyBandTable[pInfo->Band]) if (Frequency >= frequencyBandTable[pInfo->Band].upper)
Frequency = LowerLimitFrequencyBandTable[pInfo->Band]; Frequency = frequencyBandTable[pInfo->Band].lower;
else else
if (Frequency < LowerLimitFrequencyBandTable[pInfo->Band]) if (Frequency < frequencyBandTable[pInfo->Band].lower)
Frequency = FREQUENCY_FloorToStep(UpperLimitFrequencyBandTable[pInfo->Band], pInfo->StepFrequency, LowerLimitFrequencyBandTable[pInfo->Band]); Frequency = FREQUENCY_FloorToStep(frequencyBandTable[pInfo->Band].upper, pInfo->StepFrequency, frequencyBandTable[pInfo->Band].lower);
return Frequency; return Frequency;
} }
@@ -641,58 +629,79 @@ static void FREQ_NextChannel(void)
RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
RADIO_SetupRegisters(true); RADIO_SetupRegisters(true);
gUpdateDisplay = true; // ScanPauseDelayIn_10ms = scan_pause_delay_in_6_10ms;
ScanPauseDelayIn_10ms = 10; ScanPauseDelayIn_10ms = 10; // 100ms
bScanKeepFrequency = false;
bScanKeepFrequency = false;
gUpdateDisplay = true;
} }
static void MR_NextChannel(void) static void MR_NextChannel(void)
{ {
const uint8_t Ch1 = gEeprom.SCANLIST_PRIORITY_CH1[gEeprom.SCAN_LIST_DEFAULT]; static unsigned int prev_mr_chan = 0;
const uint8_t Ch2 = gEeprom.SCANLIST_PRIORITY_CH2[gEeprom.SCAN_LIST_DEFAULT]; const bool enabled = gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT];
const bool bEnabled = gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT]; const unsigned int chan1 = gEeprom.SCANLIST_PRIORITY_CH1[gEeprom.SCAN_LIST_DEFAULT];
uint8_t PreviousCh = gNextMrChannel; const unsigned int chan2 = gEeprom.SCANLIST_PRIORITY_CH2[gEeprom.SCAN_LIST_DEFAULT];
uint8_t Ch; const unsigned int prev_chan = gNextMrChannel;
unsigned int chan = 0;
if (bEnabled) if (enabled)
{ {
if (gCurrentScanList == 0) switch (gCurrentScanList)
{ {
gPreviousMrChannel = gNextMrChannel; case SCAN_NEXT_CHAN_SCANLIST1:
if (RADIO_CheckValidChannel(Ch1, false, 0)) prev_mr_chan = gNextMrChannel;
gNextMrChannel = Ch1; if (RADIO_CheckValidChannel(chan1, false, 0))
else {
gCurrentScanList = 1; //gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1;
} gNextMrChannel = chan1;
break;
}
if (gCurrentScanList == 1) case SCAN_NEXT_CHAN_SCANLIST2:
{ if (RADIO_CheckValidChannel(chan2, false, 0))
if (RADIO_CheckValidChannel(Ch2, false, 0)) {
gNextMrChannel = Ch2; gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST2;
else gNextMrChannel = chan2;
gCurrentScanList = 2; break;
} }
if (gCurrentScanList == 2) // this bit doesn't work at all - yet :(
{ case SCAN_NEXT_CHAN_DUAL_WATCH:
gNextMrChannel = gPreviousMrChannel; // if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF)
Ch = RADIO_FindNextChannel(gNextMrChannel + gScanState, gScanState, true, gEeprom.SCAN_LIST_DEFAULT); {
if (Ch == 0xFF) // chan = (gEeprom.RX_CHANNEL + 1) & 1u;
return; // chan = gEeprom.MrChannel[chan];
// chan = gEeprom.ScreenChannel[chan];
// chan = gEeprom.VfoInfo[chan].CHANNEL_SAVE;
// chan = 14;
// if (RADIO_CheckValidChannel(chan, false, 0))
// {
// gCurrentScanList = SCAN_NEXT_CHAN_DUAL_WATCH;
// gNextMrChannel = chan;
// break;
// }
}
gNextMrChannel = Ch; default:
case SCAN_NEXT_CHAN_MR:
gCurrentScanList = SCAN_NEXT_CHAN_MR;
gNextMrChannel = prev_mr_chan;
chan = 0xffffffff;
break;
} }
} }
else
if (!enabled || chan == 0xffffffff)
{ {
Ch = RADIO_FindNextChannel(gNextMrChannel + gScanState, gScanState, true, gEeprom.SCAN_LIST_DEFAULT); chan = RADIO_FindNextChannel(gNextMrChannel + gScanState, gScanState, true, gEeprom.SCAN_LIST_DEFAULT);
if (Ch == 0xFF) if (chan == 0xFF)
return; return;
gNextMrChannel = Ch; gNextMrChannel = chan;
} }
if (PreviousCh != gNextMrChannel) if (prev_chan != gNextMrChannel)
{ {
gEeprom.MrChannel[gEeprom.RX_CHANNEL] = gNextMrChannel; gEeprom.MrChannel[gEeprom.RX_CHANNEL] = gNextMrChannel;
gEeprom.ScreenChannel[gEeprom.RX_CHANNEL] = gNextMrChannel; gEeprom.ScreenChannel[gEeprom.RX_CHANNEL] = gNextMrChannel;
@@ -703,12 +712,17 @@ static void MR_NextChannel(void)
gUpdateDisplay = true; gUpdateDisplay = true;
} }
ScanPauseDelayIn_10ms = scan_pause_delay_in_3_10ms; #ifdef ENABLE_FASTER_CHANNEL_SCAN
bScanKeepFrequency = false; ScanPauseDelayIn_10ms = 8; // 80ms .. <= ~60ms it misses signals (squelch response and/or PLL lock time) ?
#else
ScanPauseDelayIn_10ms = scan_pause_delay_in_3_10ms;
#endif
if (bEnabled) bScanKeepFrequency = false;
if (++gCurrentScanList > 2)
gCurrentScanList = 0; if (enabled)
if (++gCurrentScanList >= SCAN_NEXT_NUM)
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1; // back round we go
} }
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
@@ -990,7 +1004,7 @@ static void APP_HandleVox(void)
if (gCurrentFunction == FUNCTION_POWER_SAVE) if (gCurrentFunction == FUNCTION_POWER_SAVE)
FUNCTION_Select(FUNCTION_FOREGROUND); FUNCTION_Select(FUNCTION_FOREGROUND);
if (gCurrentFunction != FUNCTION_TRANSMIT) if (gCurrentFunction != FUNCTION_TRANSMIT && gSerialConfigCountDown_500ms == 0)
{ {
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
RADIO_PrepareTX(); RADIO_PrepareTX();
@@ -1009,8 +1023,8 @@ void APP_Update(void)
} }
#endif #endif
if (gCurrentFunction == FUNCTION_TRANSMIT && gTxTimeoutReached) if ((gCurrentFunction == FUNCTION_TRANSMIT && gTxTimeoutReached) || gSerialConfigCountDown_500ms > 0)
{ // transmitter timed out { // transmitter timed out or must de-key
gTxTimeoutReached = false; gTxTimeoutReached = false;
gFlagEndTransmission = true; gFlagEndTransmission = true;
@@ -1258,47 +1272,21 @@ void APP_CheckKeys(void)
if (gPttIsPressed) if (gPttIsPressed)
{ {
if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) || gSerialConfigCountDown_500ms > 0)
{ // PTT released { // PTT released or serial comms config in progress
#if 0 if (++gPttDebounceCounter >= 3 || gSerialConfigCountDown_500ms > 0) // 30ms
// denoise the PTT { // stop transmitting
unsigned int i = 6; // test the PTT button for 6ms APP_ProcessKey(KEY_PTT, false, false);
unsigned int count = 0; gPttIsPressed = false;
while (i-- > 0) if (gKeyReading1 != KEY_INVALID)
{ gPttWasReleased = true;
SYSTEM_DelayMs(1); }
if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT))
{ // PTT pressed
if (count > 0)
count--;
continue;
}
if (++count < 3)
continue;
// stop transmitting
APP_ProcessKey(KEY_PTT, false, false);
gPttIsPressed = false;
if (gKeyReading1 != KEY_INVALID)
gPttWasReleased = true;
break;
}
#else
if (++gPttDebounceCounter >= 3) // 30ms
{ // stop transmitting
APP_ProcessKey(KEY_PTT, false, false);
gPttIsPressed = false;
if (gKeyReading1 != KEY_INVALID)
gPttWasReleased = true;
}
#endif
} }
else else
gPttDebounceCounter = 0; gPttDebounceCounter = 0;
} }
else else
if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) && gSerialConfigCountDown_500ms == 0)
{ // PTT pressed { // PTT pressed
if (++gPttDebounceCounter >= 3) // 30ms if (++gPttDebounceCounter >= 3) // 30ms
{ // start transmitting { // start transmitting
@@ -1450,7 +1438,6 @@ void APP_TimeSlice10ms(void)
// Skipping authentic device checks // Skipping authentic device checks
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
// if (gFmRadioCountdown_500ms > 0)
if (gFmRadioMode && gFmRadioCountdown_500ms > 0) // 1of11 if (gFmRadioMode && gFmRadioCountdown_500ms > 0) // 1of11
return; return;
#endif #endif
@@ -1490,22 +1477,27 @@ void APP_TimeSlice10ms(void)
if (gAlarmState == ALARM_STATE_TXALARM) if (gAlarmState == ALARM_STATE_TXALARM)
{ {
gAlarmState = ALARM_STATE_ALARM; gAlarmState = ALARM_STATE_ALARM;
RADIO_EnableCxCSS(); RADIO_EnableCxCSS();
BK4819_SetupPowerAmplifier(0, 0); BK4819_SetupPowerAmplifier(0, 0);
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1, false); BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1, false);
BK4819_Enable_AfDac_DiscMode_TxDsp(); BK4819_Enable_AfDac_DiscMode_TxDsp();
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, false); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, false);
GUI_DisplayScreen(); GUI_DisplayScreen();
} }
else else
{ {
gAlarmState = ALARM_STATE_TXALARM; gAlarmState = ALARM_STATE_TXALARM;
GUI_DisplayScreen(); GUI_DisplayScreen();
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, true); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, true);
RADIO_SetTxParameters(); RADIO_SetTxParameters();
BK4819_TransmitTone(true, 500); BK4819_TransmitTone(true, 500);
SYSTEM_DelayMs(2); SYSTEM_DelayMs(2);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gEnableSpeaker = true; gEnableSpeaker = true;
gAlarmToneCounter = 0; gAlarmToneCounter = 0;
} }
@@ -1561,6 +1553,9 @@ void APP_TimeSlice10ms(void)
switch (gScanCssState) switch (gScanCssState)
{ {
case SCAN_CSS_STATE_OFF: case SCAN_CSS_STATE_OFF:
// must be RF frequency scanning if we're here ?
if (!BK4819_GetFrequencyScanResult(&Result)) if (!BK4819_GetFrequencyScanResult(&Result))
break; break;
@@ -1589,12 +1584,14 @@ void APP_TimeSlice10ms(void)
gScanUseCssResult = false; gScanUseCssResult = false;
gScanProgressIndicator = 0; gScanProgressIndicator = 0;
gScanCssState = SCAN_CSS_STATE_SCANNING; gScanCssState = SCAN_CSS_STATE_SCANNING;
GUI_SelectNextDisplay(DISPLAY_SCANNER); GUI_SelectNextDisplay(DISPLAY_SCANNER);
gUpdateStatus = true; gUpdateStatus = true;
} }
//gScanDelay_10ms = scan_delay_10ms; gScanDelay_10ms = scan_delay_10ms;
gScanDelay_10ms = 20 / 10; // 20ms //gScanDelay_10ms = 1; // 10ms
break; break;
case SCAN_CSS_STATE_SCANNING: case SCAN_CSS_STATE_SCANNING:
@@ -1680,7 +1677,9 @@ void cancelUserInputModes(void)
gDTMF_InputMode = false; gDTMF_InputMode = false;
gDTMF_InputIndex = 0; gDTMF_InputIndex = 0;
gInputBoxIndex = 0; gInputBoxIndex = 0;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
} }
} }
@@ -1714,6 +1713,11 @@ void APP_TimeSlice500ms(void)
if (--gDTMF_RX_timeout == 0) if (--gDTMF_RX_timeout == 0)
DTMF_clear_RX(); DTMF_clear_RX();
if (gSerialConfigCountDown_500ms > 0)
{
// gReducedService = true; // a serial config upload/download is in progress
}
// Skipped authentic device check // Skipped authentic device check
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -1745,23 +1749,27 @@ void APP_TimeSlice500ms(void)
// Skipped authentic device check // Skipped authentic device check
if ((gBatteryCheckCounter & 1) == 0)
{
BOARD_ADC_GetBatteryInfo(&gBatteryVoltages[gBatteryVoltageIndex++], &gBatteryCurrent);
if (gBatteryVoltageIndex > 3)
gBatteryVoltageIndex = 0;
BATTERY_GetReadings(true);
}
// regular display updates (once every 2 sec) - if need be
if ((gBatteryCheckCounter & 3) == 0)
{
if (gChargingWithTypeC || gSetting_battery_text > 0)
gUpdateStatus = true;
#ifdef ENABLE_SHOW_CHARGE_LEVEL
if (gChargingWithTypeC)
gUpdateDisplay = true;
#endif
}
if (gCurrentFunction != FUNCTION_TRANSMIT) if (gCurrentFunction != FUNCTION_TRANSMIT)
{ {
if ((gBatteryCheckCounter & 1) == 0)
{
BOARD_ADC_GetBatteryInfo(&gBatteryVoltages[gBatteryVoltageIndex++], &gBatteryCurrent);
if (gBatteryVoltageIndex > 3)
gBatteryVoltageIndex = 0;
BATTERY_GetReadings(true);
}
// regular statusbar updates (once every 2 sec) if need be
if ((gBatteryCheckCounter & 3) == 0)
if (gChargingWithTypeC || gSetting_battery_text > 0)
gUpdateStatus = true;
if (gCurrentFunction != FUNCTION_POWER_SAVE) if (gCurrentFunction != FUNCTION_POWER_SAVE)
updateRSSI(gEeprom.RX_CHANNEL); updateRSSI(gEeprom.RX_CHANNEL);
@@ -1783,6 +1791,8 @@ void APP_TimeSlice500ms(void)
if (gScanState == SCAN_OFF && (gScreenToDisplay != DISPLAY_SCANNER || gScanCssState >= SCAN_CSS_STATE_FOUND)) if (gScanState == SCAN_OFF && (gScreenToDisplay != DISPLAY_SCANNER || gScanCssState >= SCAN_CSS_STATE_FOUND))
#endif #endif
{ {
bool exit_menu = false;
if (gEeprom.AUTO_KEYPAD_LOCK && gKeyLockCountdown > 0 && !gDTMF_InputMode) if (gEeprom.AUTO_KEYPAD_LOCK && gKeyLockCountdown > 0 && !gDTMF_InputMode)
{ {
if (--gKeyLockCountdown == 0) if (--gKeyLockCountdown == 0)
@@ -1791,52 +1801,55 @@ void APP_TimeSlice500ms(void)
gUpdateStatus = true; // lock symbol needs showing gUpdateStatus = true; // lock symbol needs showing
} }
if (gVoltageMenuCountdown > 0) if (gMenuCountdown > 0)
if (--gMenuCountdown == 0)
exit_menu = true; // exit menu mode
if (exit_menu)
{ {
if (--gVoltageMenuCountdown == 0) gMenuCountdown = 0;
if (gEeprom.BACKLIGHT == 0 && gScreenToDisplay == DISPLAY_MENU)
{ {
if (gEeprom.BACKLIGHT == 0 && gScreenToDisplay == DISPLAY_MENU) gBacklightCountdown = 0;
{ GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
gBacklightCountdown = 0;
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
}
if (gInputBoxIndex > 0 || gDTMF_InputMode || gScreenToDisplay == DISPLAY_MENU)
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL);
if (gScreenToDisplay == DISPLAY_SCANNER)
{
BK4819_StopScan();
RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD);
RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD);
RADIO_SetupRegisters(true);
}
gWasFKeyPressed = false;
gUpdateStatus = true;
gInputBoxIndex = 0;
gDTMF_InputMode = false;
gDTMF_InputIndex = 0;
gAskToSave = false;
gAskToDelete = false;
#ifdef ENABLE_FMRADIO
if (gFmRadioMode &&
gCurrentFunction != FUNCTION_RECEIVE &&
gCurrentFunction != FUNCTION_MONITOR &&
gCurrentFunction != FUNCTION_TRANSMIT)
{
GUI_SelectNextDisplay(DISPLAY_FM);
}
else
#endif
#ifdef ENABLE_NO_SCAN_TIMEOUT
if (gScreenToDisplay != DISPLAY_SCANNER)
#endif
GUI_SelectNextDisplay(DISPLAY_MAIN);
} }
if (gInputBoxIndex > 0 || gDTMF_InputMode || gScreenToDisplay == DISPLAY_MENU)
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL);
if (gScreenToDisplay == DISPLAY_SCANNER)
{
BK4819_StopScan();
RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD);
RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD);
RADIO_SetupRegisters(true);
}
gWasFKeyPressed = false;
gUpdateStatus = true;
gInputBoxIndex = 0;
gDTMF_InputMode = false;
gDTMF_InputIndex = 0;
gAskToSave = false;
gAskToDelete = false;
#ifdef ENABLE_FMRADIO
if (gFmRadioMode &&
gCurrentFunction != FUNCTION_RECEIVE &&
gCurrentFunction != FUNCTION_MONITOR &&
gCurrentFunction != FUNCTION_TRANSMIT)
{
GUI_SelectNextDisplay(DISPLAY_FM);
}
else
#endif
#ifndef ENABLE_CODE_SCAN_TIMEOUT
if (gScreenToDisplay != DISPLAY_SCANNER)
#endif
GUI_SelectNextDisplay(DISPLAY_MAIN);
} }
} }
} }
@@ -1918,7 +1931,7 @@ void APP_TimeSlice500ms(void)
{ {
gScanProgressIndicator++; gScanProgressIndicator++;
#ifndef ENABLE_NO_SCAN_TIMEOUT #ifdef ENABLE_CODE_SCAN_TIMEOUT
if (gScanProgressIndicator > 32) if (gScanProgressIndicator > 32)
{ {
if (gScanCssState == SCAN_CSS_STATE_SCANNING && !gScanSingleFrequency) if (gScanCssState == SCAN_CSS_STATE_SCANNING && !gScanSingleFrequency)
@@ -1968,7 +1981,7 @@ void APP_TimeSlice500ms(void)
} }
} }
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
static void ALARM_Off(void) static void ALARM_Off(void)
{ {
gAlarmState = ALARM_STATE_OFF; gAlarmState = ALARM_STATE_OFF;
@@ -1987,7 +2000,8 @@ void APP_TimeSlice500ms(void)
RADIO_SetupRegisters(true); RADIO_SetupRegisters(true);
gRequestDisplayScreen = DISPLAY_MAIN; // if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
} }
#endif #endif
@@ -1996,7 +2010,7 @@ void CHANNEL_Next(bool bFlag, int8_t Direction)
RADIO_SelectVfos(); RADIO_SelectVfos();
gNextMrChannel = gRxVfo->CHANNEL_SAVE; gNextMrChannel = gRxVfo->CHANNEL_SAVE;
gCurrentScanList = 0; gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1;
gScanState = Direction; gScanState = Direction;
if (IS_MR_CHANNEL(gNextMrChannel)) if (IS_MR_CHANNEL(gNextMrChannel))
@@ -2077,15 +2091,17 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_CHANNEL, gTxVfo, gFlagSaveChannel); SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_CHANNEL, gTxVfo, gFlagSaveChannel);
gFlagSaveChannel = false; gFlagSaveChannel = false;
RADIO_ConfigureChannel(gEeprom.TX_CHANNEL, VFO_CONFIGURE); RADIO_ConfigureChannel(gEeprom.TX_CHANNEL, VFO_CONFIGURE);
RADIO_SetupRegisters(true); RADIO_SetupRegisters(true);
GUI_SelectNextDisplay(DISPLAY_MAIN); GUI_SelectNextDisplay(DISPLAY_MAIN);
} }
} }
else else
{ {
if (Key != KEY_PTT) if (gScreenToDisplay == DISPLAY_MENU) // 1of11
gVoltageMenuCountdown = menu_timeout_500ms; gMenuCountdown = menu_timeout_500ms;
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
@@ -2181,15 +2197,12 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gUpdateStatus = true; gUpdateStatus = true;
} }
if (gF_LOCK && (Key == KEY_PTT || Key == KEY_SIDE2 || Key == KEY_SIDE1))
return;
if (!bFlag) if (!bFlag)
{ {
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ // transmitting { // transmitting
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF) if (gAlarmState == ALARM_STATE_OFF)
#endif #endif
{ {
@@ -2245,7 +2258,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
} }
} }
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
else else
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed)
{ {
@@ -2273,9 +2286,11 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
case DISPLAY_MAIN: case DISPLAY_MAIN:
MAIN_ProcessKeys(Key, bKeyPressed, bKeyHeld); MAIN_ProcessKeys(Key, bKeyPressed, bKeyHeld);
#ifdef ENABLE_MAIN_KEY_HOLD #ifdef ENABLE_MAIN_KEY_HOLD
bKeyHeld = false; // allow the channel setting to be saved bKeyHeld = false; // allow the channel setting to be saved
#endif #endif
break; break;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -2331,6 +2346,8 @@ Skip:
if (gFlagAcceptSetting) if (gFlagAcceptSetting)
{ {
gMenuCountdown = menu_timeout_500ms;
MENU_AcceptSetting(); MENU_AcceptSetting();
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
@@ -2379,6 +2396,7 @@ Skip:
if (!bKeyHeld) if (!bKeyHeld)
{ {
SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_CHANNEL, gTxVfo, gRequestSaveChannel); SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_CHANNEL, gTxVfo, gRequestSaveChannel);
if (gScreenToDisplay != DISPLAY_SCANNER) if (gScreenToDisplay != DISPLAY_SCANNER)
if (gVfoConfigureMode == VFO_CONFIGURE_NONE) // 'if' is so as we don't wipe out previously setting this variable elsewhere if (gVfoConfigureMode == VFO_CONFIGURE_NONE) // 'if' is so as we don't wipe out previously setting this variable elsewhere
gVfoConfigureMode = VFO_CONFIGURE; gVfoConfigureMode = VFO_CONFIGURE;
@@ -2386,6 +2404,7 @@ Skip:
else else
{ {
gFlagSaveChannel = gRequestSaveChannel; gFlagSaveChannel = gRequestSaveChannel;
if (gRequestDisplayScreen == DISPLAY_INVALID) if (gRequestDisplayScreen == DISPLAY_INVALID)
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
} }
@@ -2437,8 +2456,10 @@ Skip:
if (gFlagRefreshSetting) if (gFlagRefreshSetting)
{ {
MENU_ShowCurrentSetting();
gFlagRefreshSetting = false; gFlagRefreshSetting = false;
gMenuCountdown = menu_timeout_500ms;
MENU_ShowCurrentSetting();
} }
if (gFlagStartScan) if (gFlagStartScan)

View File

@@ -20,8 +20,14 @@
#include <stdbool.h> #include <stdbool.h>
#include "functions.h" #include "functions.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 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);

View File

@@ -362,9 +362,6 @@ void DTMF_Reply(void)
switch (gDTMF_ReplyState) switch (gDTMF_ReplyState)
{ {
case DTMF_REPLY_NONE:
return;
case DTMF_REPLY_ANI: case DTMF_REPLY_ANI:
if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF) if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF)
{ {
@@ -387,11 +384,16 @@ void DTMF_Reply(void)
break; break;
default: default:
if (gDTMF_CallState != DTMF_CALL_STATE_NONE || (gCurrentVfo->DTMF_PTT_ID_TX_MODE != PTT_ID_BOT && gCurrentVfo->DTMF_PTT_ID_TX_MODE != PTT_ID_BOTH)) case DTMF_REPLY_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_TX_DOWN)
{ {
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
return; return;
} }
// send TX-UP DTMF
pString = gEeprom.DTMF_UP_CODE; pString = gEeprom.DTMF_UP_CODE;
break; break;
} }

View File

@@ -104,9 +104,9 @@ void GENERIC_Key_PTT(bool bKeyPressed)
{ {
gInputBoxIndex = 0; gInputBoxIndex = 0;
if (!bKeyPressed) if (!bKeyPressed || gSerialConfigCountDown_500ms > 0)
{ {
if (gScreenToDisplay == DISPLAY_MAIN) //if (gScreenToDisplay == DISPLAY_MAIN)
{ {
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ {
@@ -132,10 +132,9 @@ void GENERIC_Key_PTT(bool bKeyPressed)
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; return;
} }
@@ -149,7 +148,10 @@ void GENERIC_Key_PTT(bool bKeyPressed)
gPttDebounceCounter = 0; gPttDebounceCounter = 0;
gPttIsPressed = false; gPttIsPressed = false;
gRequestDisplayScreen = DISPLAY_MAIN;
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
return; return;
} }
@@ -160,17 +162,15 @@ void GENERIC_Key_PTT(bool bKeyPressed)
if (gCssScanMode == CSS_SCAN_MODE_OFF) if (gCssScanMode == CSS_SCAN_MODE_OFF)
{ {
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gScreenToDisplay == DISPLAY_MENU || gScreenToDisplay == DISPLAY_FM) if (gScreenToDisplay == DISPLAY_FM)
#else {
if (gScreenToDisplay == DISPLAY_MENU) gRequestDisplayScreen = DISPLAY_MAIN;
gInputBoxIndex = 0;
gPttIsPressed = false;
gPttDebounceCounter = 0;
return;
}
#endif #endif
{
gRequestDisplayScreen = DISPLAY_MAIN;
gInputBoxIndex = 0;
gPttIsPressed = false;
gPttDebounceCounter = 0;
return;
}
if (gScreenToDisplay != DISPLAY_SCANNER) if (gScreenToDisplay != DISPLAY_SCANNER)
{ {
@@ -213,21 +213,26 @@ void GENERIC_Key_PTT(bool bKeyPressed)
gDTMF_State = DTMF_STATE_0; gDTMF_State = DTMF_STATE_0;
} }
gRequestDisplayScreen = DISPLAY_MAIN; if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
gDTMF_InputMode = false; gDTMF_InputMode = false;
gDTMF_InputIndex = 0; gDTMF_InputIndex = 0;
return; return;
} }
gRequestDisplayScreen = DISPLAY_MAIN; if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
gFlagPrepareTX = true; gFlagPrepareTX = true;
gInputBoxIndex = 0; gInputBoxIndex = 0;
return; return;
} }
gRequestDisplayScreen = DISPLAY_MAIN; if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX; gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX;
gUpdateStatus = true; gUpdateStatus = true;
gFlagStopScan = true; gFlagStopScan = true;
@@ -237,7 +242,9 @@ void GENERIC_Key_PTT(bool bKeyPressed)
else else
{ {
MENU_StopCssScan(); MENU_StopCssScan();
gRequestDisplayScreen = DISPLAY_MENU;
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MENU;
} }
} }
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -254,4 +261,3 @@ void GENERIC_Key_PTT(bool bKeyPressed)
gPttWasPressed = true; gPttWasPressed = true;
} }

View File

@@ -80,6 +80,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)
@@ -104,6 +105,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
gRequestSaveSettings = 1; gRequestSaveSettings = 1;
gFlagReconfigureVfos = true; gFlagReconfigureVfos = true;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
if (beep) if (beep)
@@ -165,6 +167,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
break; break;
case KEY_5: case KEY_5:
if(beep) {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ {
@@ -182,7 +185,9 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
#elif defined(ENABLE_SPECTRUM) #elif defined(ENABLE_SPECTRUM)
APP_RunSpectrum(); APP_RunSpectrum();
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
#else #endif
}
else {
// toggle scanlist-1 and scanlist 2 // toggle scanlist-1 and scanlist 2
if (gScreenToDisplay != DISPLAY_SCANNER) if (gScreenToDisplay != DISPLAY_SCANNER)
{ {
@@ -204,7 +209,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
gVfoConfigureMode = VFO_CONFIGURE; gVfoConfigureMode = VFO_CONFIGURE;
gFlagResetVfos = true; gFlagResetVfos = true;
} }
#endif }
break; break;
case KEY_6: case KEY_6:
@@ -358,20 +363,20 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
NUMBER_Get(gInputBox, &Frequency); NUMBER_Get(gInputBox, &Frequency);
// clamp the frequency entered to some valid value // clamp the frequency entered to some valid value
if (Frequency < LowerLimitFrequencyBandTable[0]) if (Frequency < frequencyBandTable[0].lower)
{ {
Frequency = LowerLimitFrequencyBandTable[0]; Frequency = frequencyBandTable[0].lower;
} }
else else
if (Frequency >= bx_stop1_Hz && Frequency < bx_start2_Hz) if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower)
{ {
const uint32_t center = (bx_stop1_Hz + bx_start2_Hz) / 2; const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2;
Frequency = (Frequency < center) ? bx_stop1_Hz : bx_start2_Hz; Frequency = (Frequency < center) ? BX4819_band1.upper : BX4819_band2.lower;
} }
else else
if (Frequency > UpperLimitFrequencyBandTable[6]) if (Frequency > frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper)
{ {
Frequency = UpperLimitFrequencyBandTable[6]; Frequency = frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper;
} }
{ {
@@ -395,12 +400,12 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
// 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, LowerLimitFrequencyBandTable[gTxVfo->Band]); Frequency = FREQUENCY_FloorToStep(Frequency, gTxVfo->StepFrequency, frequencyBandTable[gTxVfo->Band].lower);
if (Frequency >= bx_stop1_Hz && Frequency < bx_start2_Hz) 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 = (bx_stop1_Hz + bx_start2_Hz) / 2; const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2;
Frequency = (Frequency < center) ? bx_stop1_Hz - gTxVfo->StepFrequency : bx_start2_Hz; Frequency = (Frequency < center) ? BX4819_band1.upper - gTxVfo->StepFrequency : BX4819_band2.lower;
} }
gTxVfo->freq_config_RX.Frequency = Frequency; gTxVfo->freq_config_RX.Frequency = Frequency;
@@ -602,8 +607,10 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
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
@@ -648,6 +655,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
gDTMF_InputMode = true; gDTMF_InputMode = true;
memmove(gDTMF_InputBox, gDTMF_String, sizeof(gDTMF_InputBox)); memmove(gDTMF_InputBox, gDTMF_String, sizeof(gDTMF_InputBox));
gDTMF_InputIndex = 0; gDTMF_InputIndex = 0;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
return; return;
} }
@@ -735,7 +743,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
{ // step/down in frequency { // step/down in frequency
const uint32_t frequency = APP_SetFrequencyByStep(gTxVfo, Direction); const uint32_t frequency = APP_SetFrequencyByStep(gTxVfo, Direction);
if (RX_FREQUENCY_Check(frequency) < 0) if (RX_freq_check(frequency) < 0)
{ // frequency not allowed { // frequency not allowed
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return; return;
@@ -805,7 +813,9 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
DTMF_Append(Character); DTMF_Append(Character);
gKeyInputCountdown = key_input_timeout_500ms; gKeyInputCountdown = key_input_timeout_500ms;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
gPttWasReleased = true; gPttWasReleased = true;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return; return;

View File

@@ -47,6 +47,27 @@
#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)
{
struct
{
int16_t BK4819_XtalFreqLow;
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;
BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW);
// radio 1 .. 04 00 46 00 50 00 2C 0E
// radio 2 .. 05 00 46 00 50 00 2C 0E
EEPROM_ReadBuffer(0x1F88, &Misc, 8);
Misc.BK4819_XtalFreqLow = gEeprom.BK4819_XTAL_FREQ_LOW;
EEPROM_WriteBuffer(0x1F88, &Misc);
}
void MENU_StartCssScan(int8_t Direction) void MENU_StartCssScan(int8_t Direction)
{ {
gCssScanMode = CSS_SCAN_MODE_SCANNING; gCssScanMode = CSS_SCAN_MODE_SCANNING;
@@ -191,6 +212,7 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
case MENU_MIC_BAR: case MENU_MIC_BAR:
#endif #endif
case MENU_ABR_ON_RX:
case MENU_BCL: case MENU_BCL:
case MENU_BEEP: case MENU_BEEP:
case MENU_AUTOLK: case MENU_AUTOLK:
@@ -294,9 +316,16 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
*pMax = 16; *pMax = 16;
break; break;
case MENU_F_CALI: #ifdef ENABLE_F_CAL_MENU
*pMin = -50; case MENU_F_CALI:
*pMax = +50; *pMin = -50;
*pMax = +50;
break;
#endif
case MENU_BATCAL:
*pMin = 1600; // 0
*pMax = 2200; // 2300
break; break;
default: default:
@@ -378,9 +407,6 @@ void MENU_AcceptSetting(void)
case MENU_T_CTCS: case MENU_T_CTCS:
pConfig = &gTxVfo->freq_config_TX; pConfig = &gTxVfo->freq_config_TX;
// Fallthrough
case MENU_R_CTCS: case MENU_R_CTCS:
if (gSubMenuSelection == 0) if (gSubMenuSelection == 0)
{ {
@@ -390,14 +416,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;
@@ -418,6 +450,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;
@@ -472,6 +510,10 @@ void MENU_AcceptSetting(void)
gEeprom.BACKLIGHT = gSubMenuSelection; gEeprom.BACKLIGHT = gSubMenuSelection;
break; break;
case MENU_ABR_ON_RX:
gSetting_backlight_on_rx = gSubMenuSelection;
break;
case MENU_TDR: case MENU_TDR:
gEeprom.DUAL_WATCH = gSubMenuSelection; gEeprom.DUAL_WATCH = gSubMenuSelection;
gFlagReconfigureVfos = true; gFlagReconfigureVfos = true;
@@ -556,7 +598,10 @@ void MENU_AcceptSetting(void)
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
case MENU_COMPAND: case MENU_COMPAND:
gTxVfo->Compander = gSubMenuSelection; gTxVfo->Compander = gSubMenuSelection;
gRequestSaveChannel = 1; SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true);
gVfoConfigureMode = VFO_CONFIGURE;
gFlagResetVfos = true;
// gRequestSaveChannel = 1;
return; return;
#endif #endif
@@ -710,26 +755,16 @@ void MENU_AcceptSetting(void)
gSetting_TX_EN = gSubMenuSelection; gSetting_TX_EN = gSubMenuSelection;
break; break;
case MENU_F_CALI: #ifdef ENABLE_F_CAL_MENU
gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; case MENU_F_CALI:
BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW); writeXtalFreqCal(gSubMenuSelection);
{ return;
struct #endif
{
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 case MENU_BATCAL:
// radio 2 .. 05 00 46 00 50 00 2C 0E gBatteryCalibration[3] = gSubMenuSelection;
EEPROM_ReadBuffer(0x1F88, &Misc, 8); EEPROM_WriteBuffer(0x1F40, gBatteryCalibration);
Misc.BK4819_XtalFreqLow = gEeprom.BK4819_XTAL_FREQ_LOW; break;
EEPROM_WriteBuffer(0x1F88, &Misc);
}
return;
} }
gRequestSaveSettings = true; gRequestSaveSettings = true;
@@ -897,6 +932,10 @@ 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_ABR_ON_RX:
gSubMenuSelection = gSetting_backlight_on_rx;
break;
case MENU_TDR: case MENU_TDR:
gSubMenuSelection = gEeprom.DUAL_WATCH; gSubMenuSelection = gEeprom.DUAL_WATCH;
break; break;
@@ -1091,9 +1130,18 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gSetting_TX_EN; gSubMenuSelection = gSetting_TX_EN;
break; break;
case MENU_F_CALI: #ifdef ENABLE_F_CAL_MENU
gSubMenuSelection = gEeprom.BK4819_XTAL_FREQ_LOW; case MENU_F_CALI:
gSubMenuSelection = gEeprom.BK4819_XTAL_FREQ_LOW;
break;
#endif
case MENU_BATCAL:
gSubMenuSelection = gBatteryCalibration[3];
break; break;
default:
return;
} }
} }
@@ -1285,6 +1333,8 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
else else
gInputBox[--gInputBoxIndex] = 10; gInputBox[--gInputBoxIndex] = 10;
// ***********************
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
return; return;
} }
@@ -1570,8 +1620,10 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
if (!gIsInSubMenu) if (!gIsInSubMenu)
{ {
gMenuCursor = NUMBER_AddWithWraparound(gMenuCursor, -Direction, 0, gMenuListCount - 1); gMenuCursor = NUMBER_AddWithWraparound(gMenuCursor, -Direction, 0, gMenuListCount - 1);
gFlagRefreshSetting = true;
gFlagRefreshSetting = true;
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
if (gMenuCursor != MENU_ABR && gEeprom.BACKLIGHT == 0) if (gMenuCursor != MENU_ABR && gEeprom.BACKLIGHT == 0)
@@ -1690,6 +1742,19 @@ void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
break; break;
} }
if (gScreenToDisplay == DISPLAY_MENU && gMenuCursor == MENU_VOL) if (gScreenToDisplay == DISPLAY_MENU)
gVoltageMenuCountdown = menu_timeout_500ms; {
if (gMenuCursor == MENU_VOL ||
#ifdef ENABLE_F_CAL_MENU
gMenuCursor == MENU_F_CALI ||
#endif
gMenuCursor == MENU_BATCAL)
{
gMenuCountdown = menu_timeout_long_500ms;
}
else
{
gMenuCountdown = menu_timeout_500ms;
}
}
} }

View File

@@ -92,6 +92,7 @@ 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 = gBackupCROSS_BAND_RX_TX;
gUpdateStatus = true; gUpdateStatus = true;
gFlagStopScan = true; gFlagStopScan = true;
@@ -224,7 +225,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
case 2: case 2:
if (!gScanSingleFrequency) if (!gScanSingleFrequency)
{ {
RADIO_InitInfo(gTxVfo, gTxVfo->CHANNEL_SAVE, FREQUENCY_GetBand(gScanFrequency), gScanFrequency); RADIO_InitInfo(gTxVfo, gTxVfo->CHANNEL_SAVE, gScanFrequency);
if (gScanUseCssResult) if (gScanUseCssResult)
{ {
@@ -367,7 +368,7 @@ void SCANNER_Start(void)
BackupStep = gRxVfo->STEP_SETTING; BackupStep = gRxVfo->STEP_SETTING;
BackupFrequency = gRxVfo->StepFrequency; BackupFrequency = gRxVfo->StepFrequency;
RADIO_InitInfo(gRxVfo, gRxVfo->CHANNEL_SAVE, gRxVfo->Band, gRxVfo->pRX->Frequency); RADIO_InitInfo(gRxVfo, gRxVfo->CHANNEL_SAVE, gRxVfo->pRX->Frequency);
gRxVfo->STEP_SETTING = BackupStep; gRxVfo->STEP_SETTING = BackupStep;
gRxVfo->StepFrequency = BackupFrequency; gRxVfo->StepFrequency = BackupFrequency;

View File

@@ -225,10 +225,16 @@ static void CMD_0514(const uint8_t *pBuffer)
const CMD_0514_t *pCmd = (const CMD_0514_t *)pBuffer; const CMD_0514_t *pCmd = (const CMD_0514_t *)pBuffer;
Timestamp = pCmd->Timestamp; Timestamp = pCmd->Timestamp;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
gFmRadioCountdown_500ms = fm_radio_countdown_500ms; gFmRadioCountdown_500ms = fm_radio_countdown_500ms;
#endif #endif
gSerialConfigCountDown_500ms = 12; // 6 sec
// turn the LCD backlight off
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT);
SendVersion(); SendVersion();
} }
@@ -241,9 +247,12 @@ static void CMD_051B(const uint8_t *pBuffer)
if (pCmd->Timestamp != Timestamp) if (pCmd->Timestamp != Timestamp)
return; return;
gSerialConfigCountDown_500ms = 12; // 6 sec
#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;
@@ -269,11 +278,14 @@ static void CMD_051D(const uint8_t *pBuffer)
if (pCmd->Timestamp != Timestamp) if (pCmd->Timestamp != Timestamp)
return; return;
gSerialConfigCountDown_500ms = 12; // 6 sec
bReloadEeprom = false; bReloadEeprom = false;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
gFmRadioCountdown_500ms = fm_radio_countdown_500ms; gFmRadioCountdown_500ms = fm_radio_countdown_500ms;
#endif #endif
Reply.Header.ID = 0x051E; Reply.Header.ID = 0x051E;
Reply.Header.Size = sizeof(Reply.Data); Reply.Header.Size = sizeof(Reply.Data);
Reply.Data.Offset = pCmd->Offset; Reply.Data.Offset = pCmd->Offset;
@@ -389,8 +401,11 @@ 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 = 12; // 6 sec
Timestamp = pCmd->Timestamp; Timestamp = pCmd->Timestamp;
// turn the LCD backlight off
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT);
SendVersion(); SendVersion();

View File

@@ -279,12 +279,7 @@ 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)
{ BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_OPEN);
if (gRxVfo->AM_mode)
BK4819_SetAF(BK4819_AF_AM);
else
BK4819_SetAF(BK4819_AF_OPEN);
}
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFmRadioMode) if (gFmRadioMode)

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,
@@ -324,7 +348,7 @@ const uint8_t BITMAP_AntennaLevel6[3] =
0b00000000 0b00000000
}; };
const uint8_t BITMAP_CurrentIndicator[8] = const uint8_t BITMAP_MARKER[8] =
{ {
0b11111111, 0b11111111,
0b11111111, 0b11111111,

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];
@@ -52,7 +54,7 @@ extern const uint8_t BITMAP_AntennaLevel4[3];
extern const uint8_t BITMAP_AntennaLevel5[3]; extern const uint8_t BITMAP_AntennaLevel5[3];
extern const uint8_t BITMAP_AntennaLevel6[3]; extern const uint8_t BITMAP_AntennaLevel6[3];
extern const uint8_t BITMAP_CurrentIndicator[8]; 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];

View File

@@ -712,6 +712,7 @@ void BOARD_EEPROM_Init(void)
#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_rx = (Data[7] & (1u << 6)) ? true : false;
if (!gEeprom.VFO_OPEN) if (!gEeprom.VFO_OPEN)
{ {
@@ -861,7 +862,7 @@ void BOARD_FactoryReset(bool bIsAll)
if (bIsAll) if (bIsAll)
{ {
RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, BAND6_400MHz, 43350000); RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, 43350000);
// set the first few memory channels // set the first few memory channels
for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++) for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++)

4
compile-with-docker.bat Normal file
View File

@@ -0,0 +1,4 @@
@echo off
docker build -t uvk5 .
docker run -v %CD%\compiled-firmware:/app/compiled-firmware uvk5 /bin/bash -c "cd /app && make clean && make && cp firmware* compiled-firmware/"
pause

3
compile-with-docker.sh Normal file
View File

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

2
dcs.c
View File

@@ -91,7 +91,7 @@ uint8_t DCS_GetCdcssCode(uint32_t Code)
return 0xFF; return 0xFF;
} }
uint8_t DCS_GetCtcssCode(uint16_t Code) uint8_t DCS_GetCtcssCode(int Code)
{ {
unsigned int i; unsigned int i;
uint8_t Result = 0xFF; uint8_t Result = 0xFF;

2
dcs.h
View File

@@ -39,7 +39,7 @@ extern const uint16_t DCS_Options[104];
uint32_t DCS_GetGolayCodeWord(DCS_CodeType_t CodeType, uint8_t Option); uint32_t DCS_GetGolayCodeWord(DCS_CodeType_t CodeType, uint8_t Option);
uint8_t DCS_GetCdcssCode(uint32_t Code); uint8_t DCS_GetCdcssCode(uint32_t Code);
uint8_t DCS_GetCtcssCode(uint16_t Code); uint8_t DCS_GetCtcssCode(int Code);
#endif #endif

View File

@@ -465,7 +465,7 @@ void BK4819_SetCTCSSFrequency(uint32_t FreqControlWord)
// freq(Hz) * 20.64888 for XTAL 13M/26M or // freq(Hz) * 20.64888 for XTAL 13M/26M or
// freq(Hz) * 20.97152 for XTAL 12.8M/19.2M/25.6M/38.4M // freq(Hz) * 20.97152 for XTAL 12.8M/19.2M/25.6M/38.4M
// //
BK4819_WriteRegister(BK4819_REG_07, BK4819_REG_07_MODE_CTC1 | (((FreqControlWord * 2064888u) + 500000u) / 1000000u)); // with rounding BK4819_WriteRegister(BK4819_REG_07, BK4819_REG_07_MODE_CTC1 | (((FreqControlWord * 206488u) + 50000u) / 100000u)); // with rounding
} }
// freq_10Hz is CTCSS Hz * 10 // freq_10Hz is CTCSS Hz * 10
@@ -716,15 +716,15 @@ void BK4819_SetupSquelch(
// 0 ~ 255 // 0 ~ 255
// //
BK4819_WriteRegister(BK4819_REG_4E, // 01 101 11 1 00000000 BK4819_WriteRegister(BK4819_REG_4E, // 01 101 11 1 00000000
#if 0 #ifndef ENABLE_FASTER_CHANNEL_SCAN
// original
(1u << 14) // 1 ??? (1u << 14) // 1 ???
| (5u << 11) // 5 squelch = 1 delay .. 0 ~ 7 | (5u << 11) // 5 squelch = 1 delay .. 0 ~ 7
| (3u << 9) // 3 squelch = 0 delay .. 0 ~ 3 | (3u << 9) // 3 squelch = 0 delay .. 0 ~ 3
| SquelchOpenGlitchThresh); // 0 ~ 255 | SquelchOpenGlitchThresh); // 0 ~ 255
#else #else
// faster (but twitchier)
(1u << 14) // 1 ??? (1u << 14) // 1 ???
| (2u << 11) // squelch = 1 delay .. 0 ~ 7
| (1u << 9) // squelch = 0 delay .. 0 ~ 3
| SquelchOpenGlitchThresh); // 0 ~ 255 | SquelchOpenGlitchThresh); // 0 ~ 255
#endif #endif
@@ -831,14 +831,16 @@ void BK4819_SetCompander(const unsigned int mode)
// mode 2 .. RX // mode 2 .. RX
// mode 3 .. TX and RX // mode 3 .. TX and RX
const uint16_t r31 = BK4819_ReadRegister(BK4819_REG_31);
if (mode == 0) if (mode == 0)
{ // disable { // disable
BK4819_WriteRegister(BK4819_REG_31, BK4819_ReadRegister(BK4819_REG_31) & ~(1u < 3)); BK4819_WriteRegister(BK4819_REG_31, r31 & ~(1u < 3));
return; return;
} }
// enable // enable
BK4819_WriteRegister(BK4819_REG_31, BK4819_ReadRegister(BK4819_REG_31) | (1u < 3)); BK4819_WriteRegister(BK4819_REG_31, r31 | (1u < 3));
// set the compressor ratio // set the compressor ratio
// //
@@ -848,8 +850,17 @@ void BK4819_SetCompander(const unsigned int mode)
// 10 = 2:1 // 10 = 2:1
// 11 = 4:1 // 11 = 4:1
// //
const uint16_t compress_ratio = (mode == 1 || mode >= 3) ? 3 : 0; // 4:1 // REG_29 <13:7> 86 Compress (AF Tx) 0 dB point (dB)
BK4819_WriteRegister(BK4819_REG_29, (BK4819_ReadRegister(BK4819_REG_29) & ~(3u < 14)) | (compress_ratio < 14)); //
// REG_29 <6:0> 64 Compress (AF Tx) noise point (dB)
//
// const uint16_t compress_ratio = (mode == 1 || mode >= 3) ? 2 : 0; // 2:1
// const uint16_t compress_0dB = 86;
// const uint16_t compress_noise_dB = 64;
// BK4819_WriteRegister(BK4819_REG_29, // (BK4819_ReadRegister(BK4819_REG_29) & ~(3u < 14)) | (compress_ratio < 14));
// (compress_ratio < 14)
// | (compress_0dB < 7)
// | (compress_noise_dB < 0));
// set the expander ratio // set the expander ratio
// //
@@ -859,8 +870,17 @@ void BK4819_SetCompander(const unsigned int mode)
// 10 = 1:3 // 10 = 1:3
// 11 = 1:4 // 11 = 1:4
// //
const uint16_t expand_ratio = (mode >= 2) ? 3 : 0; // 1:4 // REG_28 <13:7> 86 Expander (AF Rx) 0 dB point (dB)
BK4819_WriteRegister(BK4819_REG_28, (BK4819_ReadRegister(BK4819_REG_28) & ~(3u < 14)) | (expand_ratio < 14)); //
// REG_28 <6:0> 56 Expander (AF Rx) noise point (dB)
//
// const uint16_t expand_ratio = (mode >= 2) ? 1 : 0; // 1:2
// const uint16_t expand_0dB = 86;
// const uint16_t expand_noise_dB = 56;
// BK4819_WriteRegister(BK4819_REG_28, // (BK4819_ReadRegister(BK4819_REG_28) & ~(3u < 14)) | (expand_ratio < 14));
// (expand_ratio < 14)
// | (expand_0dB < 7)
// | (expand_noise_dB < 0));
} }
void BK4819_DisableVox(void) void BK4819_DisableVox(void)
@@ -1487,10 +1507,15 @@ void BK4819_PlayRogerMDC(void)
unsigned int i; unsigned int i;
BK4819_SetAF(BK4819_AF_MUTE); BK4819_SetAF(BK4819_AF_MUTE);
BK4819_WriteRegister(BK4819_REG_58, 0x37C3); // FSK Enable, RX Bandwidth FFSK1200/1800, 0xAA or 0x55 Preamble, 11 RX Gain,
// 101 RX Mode, FFSK1200/1800 TX BK4819_WriteRegister(BK4819_REG_58, 0x37C3); // FSK Enable,
BK4819_WriteRegister(BK4819_REG_72, 0x3065); // Set Tone2 to 1200Hz // RX Bandwidth FFSK 1200/1800
BK4819_WriteRegister(BK4819_REG_70, 0x00E0); // Enable Tone2 and Set Tone2 Gain // 0xAA or 0x55 Preamble
// 11 RX Gain,
// 101 RX Mode
// TX FFSK 1200/1800
BK4819_WriteRegister(BK4819_REG_72, 0x3065); // Set Tone-2 to 1200Hz
BK4819_WriteRegister(BK4819_REG_70, 0x00E0); // Enable Tone-2 and Set Tone2 Gain
BK4819_WriteRegister(BK4819_REG_5D, 0x0D00); // Set FSK data length to 13 bytes BK4819_WriteRegister(BK4819_REG_5D, 0x0D00); // Set FSK data length to 13 bytes
BK4819_WriteRegister(BK4819_REG_59, 0x8068); // 4 byte sync length, 6 byte preamble, clear TX FIFO BK4819_WriteRegister(BK4819_REG_59, 0x8068); // 4 byte sync length, 6 byte preamble, clear TX FIFO
BK4819_WriteRegister(BK4819_REG_59, 0x0068); // Same, but clear TX FIFO is now unset (clearing done) BK4819_WriteRegister(BK4819_REG_59, 0x0068); // Same, but clear TX FIFO is now unset (clearing done)
@@ -1509,7 +1534,7 @@ void BK4819_PlayRogerMDC(void)
SYSTEM_DelayMs(180); SYSTEM_DelayMs(180);
// Stop FSK TX, reset Tone2, disable FSK // Stop FSK TX, reset Tone-2, disable FSK
BK4819_WriteRegister(BK4819_REG_59, 0x0068); BK4819_WriteRegister(BK4819_REG_59, 0x0068);
BK4819_WriteRegister(BK4819_REG_70, 0x0000); BK4819_WriteRegister(BK4819_REG_70, 0x0000);
BK4819_WriteRegister(BK4819_REG_58, 0x0000); BK4819_WriteRegister(BK4819_REG_58, 0x0000);

View File

@@ -19,180 +19,122 @@
#include "driver/gpio.h" #include "driver/gpio.h"
#include "driver/keyboard.h" #include "driver/keyboard.h"
#include "driver/systick.h" #include "driver/systick.h"
#include "driver/i2c.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;
bool gWasFKeyPressed; bool gWasFKeyPressed;
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.
//The key and pin defines fit together in a single u8,
//making this very efficient
struct {
uint8_t key : 5; //Key 23 is highest
uint8_t pin : 3; //Pin 6 is highest
} pins[4];
} keyboard[5] = {
/* Zero row */
{
//Set to zero to handle special case of nothing pulled down.
.set_to_zero_mask = ~(0),
.pins = {
{ .key = KEY_SIDE1, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1},
/* Duplicate to fill the array with valid values */
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1},
}
},
/* First row */
{
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_4),
.pins = {
{ .key = KEY_MENU, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_1, .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_4, .pin = GPIOA_PIN_KEYBOARD_2},
{ .key = KEY_7, .pin = GPIOA_PIN_KEYBOARD_3},
}
},
/* Second row */
{
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_5),
.pins = {
{ .key = KEY_UP, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_2 , .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_5 , .pin = GPIOA_PIN_KEYBOARD_2},
{ .key = KEY_8 , .pin = GPIOA_PIN_KEYBOARD_3},
}
},
/* Third row */
{
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_6),
.pins = {
{ .key = KEY_DOWN, .pin = GPIOA_PIN_KEYBOARD_0},
{ .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),
.pins = {
{ .key = KEY_EXIT, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_STAR, .pin = GPIOA_PIN_KEYBOARD_1},
{ .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)
{ {
KEY_Code_t Key = KEY_INVALID; KEY_Code_t Key = KEY_INVALID;
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4); // if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT))
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_5); // return KEY_PTT;
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_7);
SYSTICK_DelayUs(1);
// ***************** // *****************
// Keys connected to gnd 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;
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) //Wait for the pins to stabilize. 1 works for me.
{ SYSTICK_DelayUs(2);
Key = KEY_SIDE1;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) // Read all 4 GPIO pins at once
{ uint16_t reg = GPIOA->DATA;
Key = KEY_SIDE2; for(int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++)
goto Bye; {
} uint16_t mask = 1 << keyboard[j].pins[i].pin;
if(! (reg & mask)) {
Key = keyboard[j].pins[i].key;
break;
}
}
// Original doesn't do PTT if (Key != KEY_INVALID)
break;
}
// ***************** //Create I2C stop condition. Since we might have toggled I2C pins.
// First row //This leaves GPIOA_PIN_KEYBOARD_4 and GPIOA_PIN_KEYBOARD_5 high
I2C_Stop();
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4); // Reset VOICE pins
SYSTICK_DelayUs(1);
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0))
{
Key = KEY_MENU;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1))
{
Key = KEY_1;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2))
{
Key = KEY_4;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3))
{
Key = KEY_7;
goto Bye;
}
// *****************
// Second row
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_5);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4);
SYSTICK_DelayUs(1);
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0))
{
Key = KEY_UP;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1))
{
Key = KEY_2;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2))
{
Key = KEY_5;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3))
{
Key = KEY_8;
goto Bye;
}
// *****************
// Third row
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_5);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4);
SYSTICK_DelayUs(1);
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
SYSTICK_DelayUs(1);
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0))
{
Key = KEY_DOWN;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1))
{
Key = KEY_3;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2))
{
Key = KEY_6;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3))
{
Key = KEY_9;
goto Bye;
}
// *****************
// Fourth row
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_7);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
SYSTICK_DelayUs(1);
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0))
{
Key = KEY_EXIT;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1))
{
Key = KEY_STAR;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2))
{
Key = KEY_0;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3))
{
Key = KEY_F;
goto Bye;
}
// *****************
Bye:
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_5);
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);

BIN
firmware.bin Normal file

Binary file not shown.

BIN
firmware.packed.bin Normal file

Binary file not shown.

View File

@@ -19,52 +19,29 @@
#include "settings.h" #include "settings.h"
// the BK4819 has 2 bands it covers, 18MHz ~ 630MHz and 760MHz ~ 1300MHz // the BK4819 has 2 bands it covers, 18MHz ~ 630MHz and 760MHz ~ 1300MHz
const freq_band_table_t BX4819_band1 = { 1800000, 63000000};
const freq_band_table_t BX4819_band2 = {84000000, 130000000};
const uint32_t bx_start1_Hz = 1800000; // 18MHz const freq_band_table_t frequencyBandTable[7] =
const uint32_t bx_stop1_Hz = 63000000; // 630MHz
//const uint32_t bx_start2_Hz = 76000000; // 760MHz // my one radio the BK chip managed to lock down to this frequency
const uint32_t bx_start2_Hz = 84000000; // 840MHz // but best to go with datasheet specification really
const uint32_t bx_stop2_Hz = 130000000; // 1300MHz
const uint32_t LowerLimitFrequencyBandTable[7] =
{ {
#ifndef ENABLE_WIDE_RX #ifndef ENABLE_WIDE_RX
5000000, // QS original
{ 5000000, 7600000},
{10800000, 13600000},
{13600000, 17400000},
{17400000, 35000000},
{35000000, 40000000},
{40000000, 47000000},
{47000000, 60000000}
#else #else
1800000, // extended range
#endif { 1800000, 10800000},
10800000, {10800000, 13600000},
13600000, {13600000, 17400000},
17400000, {17400000, 35000000},
35000000, {35000000, 40000000},
40000000, {40000000, 47000000},
47000000 {47000000, 130000000}
};
const uint32_t MiddleFrequencyBandTable[7] =
{
6500000,
12200000,
15000000,
26000000,
37000000,
43500000,
55000000
};
const uint32_t UpperLimitFrequencyBandTable[7] =
{
7600000,
13599990,
17399990,
34999990,
39999990,
46999990,
#ifndef ENABLE_WIDE_RX
60000000
#else
130000000
#endif #endif
}; };
@@ -84,37 +61,24 @@ const uint32_t UpperLimitFrequencyBandTable[7] =
}; };
#endif #endif
#if 0 #ifndef ENABLE_12_5KHZ_STEP
const uint16_t StepFrequencyTable[7] = // QS steps (*10 Hz)
{ const uint16_t StepFrequencyTable[7] = {250, 500, 625, 1000, 1250, 2500, 833};
250,
500,
625,
1000,
1250,
2500,
833
};
#else #else
const uint16_t StepFrequencyTable[7] = // includes 1.25kHz step
{ const uint16_t StepFrequencyTable[7] = {125, 250, 625, 1000, 1250, 2500, 833};
125,
250,
625,
1000,
1250,
2500,
833
};
#endif #endif
FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency) FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency)
{ {
int band; int band;
for (band = BAND7_470MHz; band >= BAND1_50MHz; band--) for (band = ARRAY_SIZE(frequencyBandTable) - 1; band >= 0; band--)
if (Frequency >= LowerLimitFrequencyBandTable[band]) if (Frequency >= frequencyBandTable[band].lower)
return band; // if (Frequency < frequencyBandTable[band].upper)
return (FREQUENCY_Band_t)band;
return BAND1_50MHz; return BAND1_50MHz;
// return BAND_NONE;
} }
uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency) uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency)
@@ -156,26 +120,16 @@ uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower)
return Lower + (Step * Index); return Lower + (Step * Index);
} }
/*
int TX_FREQUENCY_Check(VFO_Info_t *pInfo) int TX_freq_check(const uint32_t Frequency)
{ // return '0' if TX frequency is allowed { // return '0' if TX frequency is allowed
// otherwise return '-1' // otherwise return '-1'
const uint32_t Frequency = pInfo->pTX->Frequency; if (Frequency < frequencyBandTable[0].lower || Frequency > frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper)
return -1; // not allowed outside this range
#ifdef ENABLE_NOAA if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower)
if (pInfo->CHANNEL_SAVE > FREQ_CHANNEL_LAST) return -1; // BX chip does not work in this range
return -1;
#endif
*/
int TX_FREQUENCY_Check(const uint32_t Frequency)
{ // return '0' if TX frequency is allowed
// otherwise return '-1'
if (Frequency < LowerLimitFrequencyBandTable[0] || Frequency > UpperLimitFrequencyBandTable[6])
return -1;
if (Frequency >= bx_stop1_Hz && Frequency < bx_start2_Hz)
return -1;
switch (gSetting_F_LOCK) switch (gSetting_F_LOCK)
{ {
@@ -205,6 +159,8 @@ int TX_FREQUENCY_Check(const uint32_t Frequency)
case F_LOCK_CE: case F_LOCK_CE:
if (Frequency >= 14400000 && Frequency < 14600000) if (Frequency >= 14400000 && Frequency < 14600000)
return 0; return 0;
if (Frequency >= 43000000 && Frequency < 44000000)
return 0;
break; break;
case F_LOCK_GB: case F_LOCK_GB:
@@ -233,13 +189,14 @@ int TX_FREQUENCY_Check(const uint32_t Frequency)
return -1; return -1;
} }
int RX_FREQUENCY_Check(const uint32_t Frequency) int RX_freq_check(const uint32_t Frequency)
{ // return '0' if RX frequency is allowed { // return '0' if RX frequency is allowed
// otherwise return '-1' // otherwise return '-1'
if (Frequency < LowerLimitFrequencyBandTable[0] || Frequency > UpperLimitFrequencyBandTable[6]) if (Frequency < frequencyBandTable[0].lower || Frequency > frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper)
return -1; return -1;
if (Frequency >= bx_stop1_Hz && Frequency < bx_start2_Hz)
if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower)
return -1; return -1;
return 0; // OK frequency return 0; // OK frequency

View File

@@ -19,17 +19,20 @@
#include <stdint.h> #include <stdint.h>
#include "radio.h" #define ENABLE_12_5KHZ_STEP
extern const uint32_t bx_start1_Hz; typedef struct {
extern const uint32_t bx_stop1_Hz; const uint32_t lower;
const uint32_t upper;
} freq_band_table_t;
extern const uint32_t bx_start2_Hz; extern const freq_band_table_t BX4819_band1;
extern const uint32_t bx_stop2_Hz; extern const freq_band_table_t BX4819_band2;
enum FREQUENCY_Band_t extern const freq_band_table_t frequencyBandTable[7];
{
BAND1_NONE = -1, enum FREQUENCY_Band_t {
BAND_NONE = -1,
BAND1_50MHz = 0, BAND1_50MHz = 0,
BAND2_108MHz, BAND2_108MHz,
BAND3_136MHz, BAND3_136MHz,
@@ -38,26 +41,44 @@ enum FREQUENCY_Band_t
BAND6_400MHz, BAND6_400MHz,
BAND7_470MHz BAND7_470MHz
}; };
typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; typedef enum FREQUENCY_Band_t FREQUENCY_Band_t;
extern const uint32_t LowerLimitFrequencyBandTable[7]; #ifndef ENABLE_12_5KHZ_STEP
extern const uint32_t MiddleFrequencyBandTable[7]; // QS steps
extern const uint32_t UpperLimitFrequencyBandTable[7]; enum STEP_Setting_t {
STEP_2_5kHz = 0,
STEP_5_0kHz,
STEP_6_25kHz,
STEP_10_0kHz,
STEP_12_5kHz,
STEP_25_0kHz,
STEP_8_33kHz
};
#else
// includes 1.25kHz step
enum STEP_Setting_t {
STEP_1_25kHz = 0,
STEP_2_5kHz,
STEP_6_25kHz,
STEP_10_0kHz,
STEP_12_5kHz,
STEP_25_0kHz,
STEP_8_33kHz
};
#endif
typedef enum STEP_Setting_t STEP_Setting_t;
extern const uint16_t StepFrequencyTable[7];
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
extern const uint32_t NoaaFrequencyTable[10]; extern const uint32_t NoaaFrequencyTable[10];
#endif #endif
extern const uint16_t StepFrequencyTable[7];
FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency); FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency);
uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency); uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency);
uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower); uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower);
//int TX_FREQUENCY_Check(VFO_Info_t *pInfo); int TX_freq_check(const uint32_t Frequency);
int TX_FREQUENCY_Check(const uint32_t Frequency); int RX_freq_check(const uint32_t Frequency);
int RX_FREQUENCY_Check(const uint32_t Frequency);
#endif #endif

View File

@@ -28,6 +28,7 @@
#include "driver/bk4819.h" #include "driver/bk4819.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "driver/system.h" #include "driver/system.h"
#include "frequencies.h"
#include "functions.h" #include "functions.h"
#include "helper/battery.h" #include "helper/battery.h"
#include "misc.h" #include "misc.h"
@@ -73,6 +74,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)
@@ -112,6 +115,7 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED)
gDTMF_AUTO_RESET_TIME = 1 + (gEeprom.DTMF_AUTO_RESET_TIME * 2); gDTMF_AUTO_RESET_TIME = 1 + (gEeprom.DTMF_AUTO_RESET_TIME * 2);
gUpdateStatus = true;
return; return;
case FUNCTION_MONITOR: case FUNCTION_MONITOR:
@@ -137,7 +141,9 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
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:
@@ -183,6 +189,8 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
} }
#endif #endif
gUpdateStatus = true;
GUI_DisplayScreen(); GUI_DisplayScreen();
RADIO_SetTxParameters(); RADIO_SetTxParameters();
@@ -192,14 +200,23 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
DTMF_Reply(); DTMF_Reply();
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState != ALARM_STATE_OFF) if (gAlarmState != ALARM_STATE_OFF)
{ {
BK4819_TransmitTone(true, (gAlarmState == ALARM_STATE_TX1750) ? 1750 : 500); #ifdef ENABLE_TX1750
if (gAlarmState == ALARM_STATE_TX1750)
BK4819_TransmitTone(true, 1750);
#endif
#ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_TXALARM)
BK4819_TransmitTone(true, 500);
#endif
SYSTEM_DelayMs(2); SYSTEM_DelayMs(2);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gAlarmToneCounter = 0; #ifdef ENABLE_ALARM
gEnableSpeaker = true; gAlarmToneCounter = 0;
#endif
gEnableSpeaker = true;
break; break;
} }
#endif #endif

View File

@@ -66,58 +66,42 @@ Volts Percent Volts Percent Volts Percent Volts Percent
7.96478 75 7.72911 48 7.51285 21 7.96478 75 7.72911 48 7.51285 21
7.95983 74 7.72097 47 7.49832 20 7.95983 74 7.72097 47 7.49832 20
*/ */
uint8_t BATTERY_VoltsToPercent(uint16_t voltage_10mV) unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV)
{ {
if(voltage_10mV>814) if (voltage_10mV > 814)
return 100; return 100;
else if(voltage_10mV>756) if (voltage_10mV > 756)
return 132*voltage_10mV/100-974; return ((132ul * voltage_10mV) / 100) - 974u;
else if(voltage_10mV>729) if (voltage_10mV > 729)
return 63*voltage_10mV/100-452; return ((63ul * voltage_10mV) / 100) - 452u;
else if(voltage_10mV>600) if (voltage_10mV > 600)
return 52*voltage_10mV/1000-31; return ((52ul * voltage_10mV) / 1000) - 31u;
else return 0;
return 0;
} }
void BATTERY_GetReadings(bool bDisplayBatteryLevel) void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
{ {
const uint8_t PreviousBatteryLevel = gBatteryDisplayLevel; const uint8_t PreviousBatteryLevel = gBatteryDisplayLevel;
const uint16_t Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + gBatteryVoltages[3]) / 4; const uint16_t Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + gBatteryVoltages[3]) / 4;
gBatteryDisplayLevel = 0; gBatteryDisplayLevel = 0;
if (Voltage >= gBatteryCalibration[5]) if (gBatteryCalibration[5] < Voltage)
gBatteryDisplayLevel = 11;
else
if (Voltage >= ((gBatteryCalibration[4] + gBatteryCalibration[5]) / 2))
gBatteryDisplayLevel = 10;
else
if (Voltage >= gBatteryCalibration[4])
gBatteryDisplayLevel = 9;
else
if (Voltage >= ((gBatteryCalibration[3] + gBatteryCalibration[4]) / 2))
gBatteryDisplayLevel = 8;
else
if (Voltage >= gBatteryCalibration[3])
gBatteryDisplayLevel = 7;
else
if (Voltage >= ((gBatteryCalibration[2] + gBatteryCalibration[3]) / 2))
gBatteryDisplayLevel = 6; gBatteryDisplayLevel = 6;
else else
if (Voltage >= gBatteryCalibration[2]) if (gBatteryCalibration[4] < Voltage)
gBatteryDisplayLevel = 5; gBatteryDisplayLevel = 5;
else else
if (Voltage >= ((gBatteryCalibration[1] + gBatteryCalibration[2]) / 2)) if (gBatteryCalibration[3] < Voltage)
gBatteryDisplayLevel = 4; gBatteryDisplayLevel = 4;
else else
if (Voltage >= gBatteryCalibration[1]) if (gBatteryCalibration[2] < Voltage)
gBatteryDisplayLevel = 3; gBatteryDisplayLevel = 3;
else else
if (Voltage >= ((gBatteryCalibration[0] + gBatteryCalibration[1]) / 2)) if (gBatteryCalibration[1] < Voltage)
gBatteryDisplayLevel = 2; gBatteryDisplayLevel = 2;
else else
if (Voltage >= gBatteryCalibration[0]) if (gBatteryCalibration[0] < Voltage)
gBatteryDisplayLevel = 1; gBatteryDisplayLevel = 1;
gBatteryVoltageAverage = (Voltage * 760) / gBatteryCalibration[3]; gBatteryVoltageAverage = (Voltage * 760) / gBatteryCalibration[3];

View File

@@ -33,8 +33,8 @@ extern uint16_t gBatteryCheckCounter;
extern volatile uint16_t gPowerSave_10ms; extern volatile uint16_t gPowerSave_10ms;
uint8_t BATTERY_VoltsToPercent(uint16_t voltage_10mV); unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV);
void BATTERY_GetReadings(bool bDisplayBatteryLevel); void BATTERY_GetReadings(const bool bDisplayBatteryLevel);
#endif #endif

View File

@@ -39,15 +39,16 @@ BOOT_Mode_t BOOT_GetMode(void)
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT))
return BOOT_MODE_NORMAL; return BOOT_MODE_NORMAL; // PTT not pressed
Keys[i] = KEYBOARD_Poll(); Keys[i] = KEYBOARD_Poll();
SYSTEM_DelayMs(20); SYSTEM_DelayMs(20);
} }
if (Keys[0] == Keys[1]) if (Keys[0] == Keys[1])
{ {
gKeyReading0 = Keys[0]; gKeyReading0 = Keys[0];
gKeyReading1 = Keys[0]; gKeyReading1 = Keys[0];
gDebounceCounter = 2; gDebounceCounter = 2;
if (Keys[0] == KEY_SIDE1) if (Keys[0] == KEY_SIDE1)
@@ -66,16 +67,7 @@ void BOOT_ProcessMode(BOOT_Mode_t Mode)
{ {
if (Mode == BOOT_MODE_F_LOCK) if (Mode == BOOT_MODE_F_LOCK)
{ {
// enable all the menu items
gMenuListCount = 0;
// while (MenuList[gMenuListCount].name != NULL)
while (MenuList[gMenuListCount].name[0] != '\0')
gMenuListCount++;
gMenuCursor = MENU_350TX;
gSubMenuSelection = gSetting_350TX;
GUI_SelectNextDisplay(DISPLAY_MENU); GUI_SelectNextDisplay(DISPLAY_MENU);
gF_LOCK = true;
} }
#ifdef ENABLE_AIRCOPY #ifdef ENABLE_AIRCOPY
else else
@@ -86,15 +78,15 @@ void BOOT_ProcessMode(BOOT_Mode_t Mode)
gEeprom.VOX_SWITCH = false; gEeprom.VOX_SWITCH = false;
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 = 0; gEeprom.KEY_1_SHORT_PRESS_ACTION = ACTION_OPT_NONE;
gEeprom.KEY_1_LONG_PRESS_ACTION = 0; gEeprom.KEY_1_LONG_PRESS_ACTION = ACTION_OPT_NONE;
gEeprom.KEY_2_SHORT_PRESS_ACTION = 0; gEeprom.KEY_2_SHORT_PRESS_ACTION = ACTION_OPT_NONE;
gEeprom.KEY_2_LONG_PRESS_ACTION = 0; gEeprom.KEY_2_LONG_PRESS_ACTION = ACTION_OPT_NONE;
RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_LAST - 1, 5, 41002500); RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_LAST - 1, 41002500);
gRxVfo->CHANNEL_BANDWIDTH = BANDWIDTH_NARROW; gRxVfo->CHANNEL_BANDWIDTH = BANDWIDTH_WIDE;
gRxVfo->OUTPUT_POWER = 0; gRxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
@@ -105,6 +97,7 @@ void BOOT_ProcessMode(BOOT_Mode_t Mode)
BK4819_ResetFSK(); BK4819_ResetFSK();
gAircopyState = AIRCOPY_READY; gAircopyState = AIRCOPY_READY;
GUI_SelectNextDisplay(DISPLAY_AIRCOPY); GUI_SelectNextDisplay(DISPLAY_AIRCOPY);
} }
#endif #endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 28 KiB

47
main.c
View File

@@ -50,6 +50,7 @@ void _putchar(char c)
void Main(void) void Main(void)
{ {
unsigned int i; unsigned int i;
BOOT_Mode_t BootMode;
// Enable clock gating of blocks we need // Enable clock gating of blocks we need
SYSCON_DEV_CLK_GATE = 0 SYSCON_DEV_CLK_GATE = 0
@@ -101,13 +102,46 @@ void Main(void)
AM_fix_init(); AM_fix_init();
#endif #endif
// count the number of menu list items BootMode = BOOT_GetMode();
// count the number of menu items
gMenuListCount = 0; gMenuListCount = 0;
while (MenuList[gMenuListCount].name[0] != '\0') while (MenuList[gMenuListCount].name[0] != '\0')
gMenuListCount++; gMenuListCount++;
gMenuListCount -= 8; // disable the last 'n' items
if (!gChargingWithTypeC && !gBatteryDisplayLevel) if (BootMode == BOOT_MODE_F_LOCK)
{
gF_LOCK = true; // flag to say include the hidden menu items
}
else
{ // hide the hidden menu items
gMenuListCount -= 9;
#ifndef ENABLE_F_CAL_MENU
gMenuListCount++;
#endif
}
// wait for user to release all butts before moving on
if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) ||
KEYBOARD_Poll() != KEY_INVALID ||
BootMode != BOOT_MODE_NORMAL)
{ // keys are pressed
UI_DisplayReleaseKeys();
BACKLIGHT_TurnOn();
i = 0;
while (i < 50) // 500ms
{
i = (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) && KEYBOARD_Poll() == KEY_INVALID) ? i + 1 : 0;
SYSTEM_DelayMs(10);
}
gKeyReading0 = KEY_INVALID;
gKeyReading1 = KEY_INVALID;
gDebounceCounter = 0;
}
if (!gChargingWithTypeC && gBatteryDisplayLevel == 0)
{ {
FUNCTION_Select(FUNCTION_POWER_SAVE); FUNCTION_Select(FUNCTION_POWER_SAVE);
@@ -120,9 +154,8 @@ void Main(void)
} }
else else
{ {
BOOT_Mode_t BootMode;
UI_DisplayWelcome(); UI_DisplayWelcome();
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
if (gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_NONE) if (gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_NONE)
@@ -141,8 +174,6 @@ void Main(void)
} }
} }
BootMode = BOOT_GetMode();
if (gEeprom.POWER_ON_PASSWORD < 1000000) if (gEeprom.POWER_ON_PASSWORD < 1000000)
{ {
bIsInLockScreen = true; bIsInLockScreen = true;
@@ -179,6 +210,8 @@ void Main(void)
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
RADIO_ConfigureNOAA(); RADIO_ConfigureNOAA();
#endif #endif
// ******************
} }
while (1) while (1)

35
misc.c
View File

@@ -24,7 +24,8 @@ 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 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 uint8_t DTMF_RX_live_timeout_500ms = 6000 / 500; // 6 seconds live decoder on screen const uint8_t DTMF_RX_live_timeout_500ms = 6000 / 500; // 6 seconds live decoder on screen
const uint8_t DTMF_RX_timeout_500ms = 10000 / 500; // 10 seconds till we wipe the DTMF receiver const uint8_t DTMF_RX_timeout_500ms = 10000 / 500; // 10 seconds till we wipe the DTMF receiver
@@ -51,6 +52,9 @@ const uint16_t scan_pause_delay_in_1_10ms = 5000 / 10; // 5 seconds
const uint16_t scan_pause_delay_in_2_10ms = 500 / 10; // 500ms const uint16_t scan_pause_delay_in_2_10ms = 500 / 10; // 500ms
const uint16_t scan_pause_delay_in_3_10ms = 200 / 10; // 200ms const uint16_t scan_pause_delay_in_3_10ms = 200 / 10; // 200ms
const uint16_t scan_pause_delay_in_4_10ms = 300 / 10; // 300ms const uint16_t scan_pause_delay_in_4_10ms = 300 / 10; // 300ms
const uint16_t scan_pause_delay_in_5_10ms = 1000 / 10; // 1 sec
const uint16_t scan_pause_delay_in_6_10ms = 100 / 10; // 100ms
const uint16_t scan_pause_delay_in_7_10ms = 3600 / 10; // 3.6 seconds
const uint16_t battery_save_count_10ms = 10000 / 10; // 10 seconds const uint16_t battery_save_count_10ms = 10000 / 10; // 10 seconds
@@ -63,6 +67,9 @@ 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
const uint16_t NOAA_countdown_3_10ms = 200 / 10; // 200ms const uint16_t NOAA_countdown_3_10ms = 200 / 10; // 200ms
//const uint16_t gMax_bat_v = 840; // 8.4V
//const uint16_t gMin_bat_v = 660; // 6.6V
const uint32_t gDefaultAesKey[4] = {0x4AA5CC60, 0x0312CC5F, 0xFFD2DABB, 0x6BBA7F92}; const uint32_t gDefaultAesKey[4] = {0x4AA5CC60, 0x0312CC5F, 0xFFD2DABB, 0x6BBA7F92};
const uint8_t gMicGain_dB2[5] = {3, 8, 16, 24, 31}; const uint8_t gMicGain_dB2[5] = {3, 8, 16, 24, 31};
@@ -76,6 +83,8 @@ bool gSetting_TX_EN;
uint8_t gSetting_F_LOCK; uint8_t gSetting_F_LOCK;
bool gSetting_ScrambleEnable; bool gSetting_ScrambleEnable;
bool gSetting_backlight_on_rx;
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
bool gSetting_AM_fix; bool gSetting_AM_fix;
#endif #endif
@@ -118,6 +127,8 @@ volatile uint16_t gDualWatchCountdown_10ms;
volatile bool gDualWatchCountdownExpired = true; volatile bool gDualWatchCountdownExpired = true;
bool gDualWatchActive = false; bool gDualWatchActive = false;
volatile uint8_t gSerialConfigCountDown_500ms;
volatile bool gNextTimeslice_500ms; volatile bool gNextTimeslice_500ms;
volatile uint16_t gTxTimerCountdown_500ms; volatile uint16_t gTxTimerCountdown_500ms;
@@ -146,10 +157,10 @@ uint8_t gReducedService;
uint8_t gBatteryVoltageIndex; uint8_t gBatteryVoltageIndex;
CssScanMode_t gCssScanMode; CssScanMode_t gCssScanMode;
bool gUpdateRSSI; bool gUpdateRSSI;
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
AlarmState_t gAlarmState; AlarmState_t gAlarmState;
#endif #endif
uint8_t gVoltageMenuCountdown; uint16_t gMenuCountdown;
bool gPttWasReleased; bool gPttWasReleased;
bool gPttWasPressed; bool gPttWasPressed;
uint8_t gKeypadLocked; uint8_t gKeypadLocked;
@@ -163,8 +174,10 @@ bool gRequestSaveSettings;
bool gRequestSaveFM; bool gRequestSaveFM;
#endif #endif
bool gFlagPrepareTX; bool gFlagPrepareTX;
bool gFlagAcceptSetting; bool gFlagAcceptSetting;
bool gFlagRefreshSetting; bool gFlagRefreshSetting;
bool gFlagSaveVfo; bool gFlagSaveVfo;
bool gFlagSaveSettings; bool gFlagSaveSettings;
bool gFlagSaveChannel; bool gFlagSaveChannel;
@@ -186,11 +199,12 @@ bool gFlagEndTransmission;
uint16_t gLowBatteryCountdown; uint16_t gLowBatteryCountdown;
uint8_t gNextMrChannel; uint8_t gNextMrChannel;
ReceptionMode_t gRxReceptionMode; ReceptionMode_t gRxReceptionMode;
uint8_t gRestoreMrChannel;
uint8_t gCurrentScanList; uint8_t gRestoreMrChannel;
uint8_t gPreviousMrChannel; enum scan_next_chan_t gCurrentScanList;
uint32_t gRestoreFrequency; uint32_t gRestoreFrequency;
uint8_t gRxVfoIsActive;
bool gRxVfoIsActive;
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
uint8_t gAlarmToneCounter; uint8_t gAlarmToneCounter;
uint16_t gAlarmRunningCounter; uint16_t gAlarmRunningCounter;
@@ -205,7 +219,6 @@ uint8_t gScanDelay_10ms;
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;
@@ -213,7 +226,9 @@ uint8_t gNeverUsed;
#endif #endif
bool gUpdateDisplay; bool gUpdateDisplay;
bool gF_LOCK;
bool gF_LOCK = false;
uint8_t gShowChPrefix; uint8_t gShowChPrefix;
volatile bool gNextTimeslice; volatile bool gNextTimeslice;

41
misc.h
View File

@@ -63,7 +63,6 @@ enum AlarmState_t {
ALARM_STATE_ALARM, ALARM_STATE_ALARM,
ALARM_STATE_TX1750 ALARM_STATE_TX1750
}; };
typedef enum AlarmState_t AlarmState_t; typedef enum AlarmState_t AlarmState_t;
enum ReceptionMode_t { enum ReceptionMode_t {
@@ -71,7 +70,6 @@ enum ReceptionMode_t {
RX_MODE_DETECTED, // signal detected RX_MODE_DETECTED, // signal detected
RX_MODE_LISTENING // RX_MODE_LISTENING //
}; };
typedef enum ReceptionMode_t ReceptionMode_t; typedef enum ReceptionMode_t ReceptionMode_t;
enum CssScanMode_t enum CssScanMode_t
@@ -80,9 +78,17 @@ enum CssScanMode_t
CSS_SCAN_MODE_SCANNING, CSS_SCAN_MODE_SCANNING,
CSS_SCAN_MODE_FOUND, CSS_SCAN_MODE_FOUND,
}; };
typedef enum CssScanMode_t CssScanMode_t; typedef enum CssScanMode_t CssScanMode_t;
enum scan_next_chan_t {
SCAN_NEXT_CHAN_SCANLIST1 = 0,
SCAN_NEXT_CHAN_SCANLIST2,
SCAN_NEXT_CHAN_DUAL_WATCH,
SCAN_NEXT_CHAN_MR,
SCAN_NEXT_NUM
};
typedef enum scan_next_chan_t scan_next_chan_t;
extern const uint8_t fm_resume_countdown_500ms; 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;
@@ -90,6 +96,7 @@ 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 menu_timeout_500ms; extern const uint8_t menu_timeout_500ms;
extern const uint16_t menu_timeout_long_500ms;
extern const uint8_t DTMF_RX_live_timeout_500ms; extern const uint8_t DTMF_RX_live_timeout_500ms;
extern const uint8_t DTMF_RX_timeout_500ms; extern const uint8_t DTMF_RX_timeout_500ms;
@@ -127,6 +134,12 @@ 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;
extern const uint16_t scan_pause_delay_in_3_10ms; extern const uint16_t scan_pause_delay_in_3_10ms;
extern const uint16_t scan_pause_delay_in_4_10ms; extern const uint16_t scan_pause_delay_in_4_10ms;
extern const uint16_t scan_pause_delay_in_5_10ms;
extern const uint16_t scan_pause_delay_in_6_10ms;
extern const uint16_t scan_pause_delay_in_7_10ms;
//extern const uint16_t gMax_bat_v;
//extern const uint16_t gMin_bat_v;
extern const uint8_t gMicGain_dB2[5]; extern const uint8_t gMicGain_dB2[5];
@@ -139,6 +152,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 bool gSetting_backlight_on_rx;
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
extern bool gSetting_AM_fix; extern bool gSetting_AM_fix;
#endif #endif
@@ -182,6 +197,8 @@ extern volatile uint16_t gDualWatchCountdown_10ms;
extern volatile bool gDualWatchCountdownExpired; extern volatile bool gDualWatchCountdownExpired;
extern bool gDualWatchActive; extern bool gDualWatchActive;
extern volatile uint8_t gSerialConfigCountDown_500ms;
extern volatile bool gNextTimeslice_500ms; extern volatile bool gNextTimeslice_500ms;
extern volatile uint16_t gTxTimerCountdown_500ms; extern volatile uint16_t gTxTimerCountdown_500ms;
@@ -213,7 +230,7 @@ extern uint8_t gBatteryVoltageIndex;
extern CssScanMode_t gCssScanMode; extern CssScanMode_t gCssScanMode;
extern bool gUpdateRSSI; extern bool gUpdateRSSI;
extern AlarmState_t gAlarmState; extern AlarmState_t gAlarmState;
extern uint8_t gVoltageMenuCountdown; extern uint16_t gMenuCountdown;
extern bool gPttWasReleased; extern bool gPttWasReleased;
extern bool gPttWasPressed; extern bool gPttWasPressed;
extern bool gFlagReconfigureVfos; extern bool gFlagReconfigureVfos;
@@ -227,8 +244,10 @@ extern bool gRequestSaveSettings;
#endif #endif
extern uint8_t gKeypadLocked; extern uint8_t gKeypadLocked;
extern bool gFlagPrepareTX; extern bool gFlagPrepareTX;
extern bool gFlagAcceptSetting;
extern bool gFlagRefreshSetting; extern bool gFlagAcceptSetting; // accept menu setting
extern bool gFlagRefreshSetting; // refresh menu display
extern bool gFlagSaveVfo; extern bool gFlagSaveVfo;
extern bool gFlagSaveSettings; extern bool gFlagSaveSettings;
extern bool gFlagSaveChannel; extern bool gFlagSaveChannel;
@@ -250,11 +269,12 @@ 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 uint8_t gRestoreMrChannel;
extern uint8_t gCurrentScanList; extern scan_next_chan_t gCurrentScanList;
extern uint8_t gPreviousMrChannel;
extern uint32_t gRestoreFrequency; extern uint32_t gRestoreFrequency;
extern uint8_t gRxVfoIsActive;
extern bool gRxVfoIsActive;
extern uint8_t gAlarmToneCounter; extern uint8_t gAlarmToneCounter;
extern uint16_t gAlarmRunningCounter; extern uint16_t gAlarmRunningCounter;
extern bool gKeyBeingHeld; extern bool gKeyBeingHeld;
@@ -267,17 +287,16 @@ extern uint8_t gScanDelay_10ms;
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;
#endif #endif
extern volatile bool gNextTimeslice; extern volatile bool gNextTimeslice;
extern bool gUpdateDisplay; extern bool gUpdateDisplay;
extern bool gF_LOCK;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
extern uint8_t gFM_ChannelPosition; extern uint8_t gFM_ChannelPosition;
#endif #endif
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;

154
radio.c
View File

@@ -114,25 +114,24 @@ uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScan
return 0xFF; return 0xFF;
} }
void RADIO_InitInfo(VFO_Info_t *pInfo, uint8_t ChannelSave, uint8_t Band, uint32_t Frequency) void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t Frequency)
{ {
memset(pInfo, 0, sizeof(*pInfo)); memset(pInfo, 0, sizeof(*pInfo));
pInfo->Band = Band; pInfo->Band = FREQUENCY_GetBand(Frequency);
pInfo->SCANLIST1_PARTICIPATION = true; pInfo->SCANLIST1_PARTICIPATION = true;
pInfo->SCANLIST2_PARTICIPATION = true; pInfo->SCANLIST2_PARTICIPATION = true;
pInfo->STEP_SETTING = STEP_12_5kHz; pInfo->STEP_SETTING = STEP_12_5kHz;
pInfo->StepFrequency = 2500; pInfo->StepFrequency = StepFrequencyTable[pInfo->STEP_SETTING];
pInfo->CHANNEL_SAVE = ChannelSave; pInfo->CHANNEL_SAVE = ChannelSave;
pInfo->FrequencyReverse = false; pInfo->FrequencyReverse = false;
pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW; pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
pInfo->freq_config_RX.Frequency = Frequency; pInfo->freq_config_RX.Frequency = Frequency;
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;
pInfo->TX_OFFSET_FREQUENCY = 1000000;
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
pInfo->Compander = 0; // off pInfo->Compander = 0; // off
#endif #endif
if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz)) if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz))
@@ -167,7 +166,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (Channel >= NOAA_CHANNEL_FIRST) if (Channel >= NOAA_CHANNEL_FIRST)
{ {
RADIO_InitInfo(pRadio, gEeprom.ScreenChannel[VFO], 2, 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; return;
@@ -211,7 +210,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
Index = Channel - FREQ_CHANNEL_FIRST; Index = Channel - FREQ_CHANNEL_FIRST;
RADIO_InitInfo(pRadio, Channel, Index, LowerLimitFrequencyBandTable[Index]); RADIO_InitInfo(pRadio, Channel, frequencyBandTable[Index].lower);
return; return;
} }
@@ -219,7 +218,6 @@ 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 (IS_MR_CHANNEL(Channel))
@@ -370,14 +368,14 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
Band = FREQUENCY_GetBand(Frequency); Band = FREQUENCY_GetBand(Frequency);
#endif #endif
if (Frequency < LowerLimitFrequencyBandTable[Band]) if (Frequency < frequencyBandTable[Band].lower)
Frequency = LowerLimitFrequencyBandTable[Band]; Frequency = frequencyBandTable[Band].lower;
else else
if (Frequency > UpperLimitFrequencyBandTable[Band]) if (Frequency > frequencyBandTable[Band].upper)
Frequency = UpperLimitFrequencyBandTable[Band]; Frequency = frequencyBandTable[Band].upper;
else else
if (Channel >= FREQ_CHANNEL_FIRST) if (Channel >= FREQ_CHANNEL_FIRST)
Frequency = FREQUENCY_FloorToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency, LowerLimitFrequencyBandTable[Band]); Frequency = FREQUENCY_FloorToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency, frequencyBandTable[Band].lower);
pRadio->freq_config_RX.Frequency = Frequency; pRadio->freq_config_RX.Frequency = Frequency;
@@ -458,17 +456,21 @@ 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 #if ENABLE_SQUELCH_MORE_SENSITIVE
// make squelch more sensitive // make squelch a little more sensitive
//
// getting the best setting here is still experimental, bare with me
//
// note that 'noise' and 'glitch' value are inverted compared to 'rssi' values
pInfo->SquelchOpenRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 8) / 9; pInfo->SquelchOpenRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 10) / 11;
pInfo->SquelchCloseRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 7) / 8; pInfo->SquelchCloseRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 10) / 11;
pInfo->SquelchOpenNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 8) / 7; pInfo->SquelchOpenNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 11) / 10;
pInfo->SquelchCloseNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 9) / 8; pInfo->SquelchCloseNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 11) / 10;
pInfo->SquelchOpenGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 8) / 7; pInfo->SquelchOpenGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 11) / 10;
pInfo->SquelchCloseGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 9) / 8; pInfo->SquelchCloseGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 11) / 10;
#endif #endif
if (pInfo->SquelchOpenNoiseThresh > 127) if (pInfo->SquelchOpenNoiseThresh > 127)
@@ -486,9 +488,9 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
Txp[0], Txp[0],
Txp[1], Txp[1],
Txp[2], Txp[2],
LowerLimitFrequencyBandTable[Band], frequencyBandTable[Band].lower,
MiddleFrequencyBandTable[Band], (frequencyBandTable[Band].lower + frequencyBandTable[Band].upper) / 2,
UpperLimitFrequencyBandTable[Band], frequencyBandTable[Band].upper,
pInfo->pTX->Frequency); pInfo->pTX->Frequency);
} }
@@ -508,20 +510,11 @@ void RADIO_ApplyOffset(VFO_Info_t *pInfo)
break; break;
} }
#if 0 if (Frequency < frequencyBandTable[0].lower)
// limit to 50MHz to 600MHz Frequency = frequencyBandTable[0].lower;
if (Frequency < 5000000) else
Frequency = 5000000; if (Frequency > frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper)
else Frequency = frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper;
if (Frequency > 60000000)
Frequency = 60000000;
#else
if (Frequency < LowerLimitFrequencyBandTable[0])
Frequency = LowerLimitFrequencyBandTable[0];
else
if (Frequency > UpperLimitFrequencyBandTable[ARRAY_SIZE(UpperLimitFrequencyBandTable) - 1])
Frequency = UpperLimitFrequencyBandTable[ARRAY_SIZE(UpperLimitFrequencyBandTable) - 1];
#endif
pInfo->freq_config_TX.Frequency = Frequency; pInfo->freq_config_TX.Frequency = Frequency;
} }
@@ -558,7 +551,7 @@ void RADIO_SelectVfos(void)
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;
@@ -568,7 +561,6 @@ 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:
@@ -576,8 +568,8 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
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, false);
#else #else
BK4819_SetFilterBandwidth(Bandwidth, false); BK4819_SetFilterBandwidth(Bandwidth, false);
#endif #endif
@@ -621,6 +613,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
@@ -633,7 +626,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)
@@ -808,7 +801,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
void RADIO_SetTxParameters(void) void RADIO_SetTxParameters(void)
{ {
BK4819_FilterBandwidth_t Bandwidth; BK4819_FilterBandwidth_t Bandwidth = gCurrentVfo->CHANNEL_BANDWIDTH;
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
@@ -816,7 +809,6 @@ void RADIO_SetTxParameters(void)
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, false); BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, false);
Bandwidth = gCurrentVfo->CHANNEL_BANDWIDTH;
switch (Bandwidth) switch (Bandwidth)
{ {
default: default:
@@ -824,8 +816,8 @@ void RADIO_SetTxParameters(void)
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, false);
#else #else
BK4819_SetFilterBandwidth(Bandwidth, false); BK4819_SetFilterBandwidth(Bandwidth, false);
#endif #endif
@@ -866,9 +858,7 @@ void RADIO_SetTxParameters(void)
case CODE_TYPE_DIGITAL: case CODE_TYPE_DIGITAL:
case CODE_TYPE_REVERSE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL:
BK4819_SetCDCSSCodeWord( BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(gCurrentVfo->pTX->CodeType, gCurrentVfo->pTX->Code));
DCS_GetGolayCodeWord(gCurrentVfo->pTX->CodeType, gCurrentVfo->pTX->Code)
);
break; break;
} }
} }
@@ -893,8 +883,9 @@ void RADIO_SetVfoState(VfoState_t State)
} }
else else
{ {
const uint8_t Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; unsigned int chan = (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) ? (gEeprom.RX_CHANNEL + 1) & 1 : gEeprom.RX_CHANNEL; // 1of11
VfoState[Channel] = State; chan = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.TX_CHANNEL : chan;
VfoState[chan] = State;
} }
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -916,7 +907,7 @@ void RADIO_PrepareTX(void)
gScheduleDualWatch = false; gScheduleDualWatch = false;
if (!gRxVfoIsActive) if (!gRxVfoIsActive)
{ { // use the TX vfo
gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL; gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL;
gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL];
gRxVfoIsActive = true; gRxVfoIsActive = true;
@@ -929,10 +920,16 @@ void RADIO_PrepareTX(void)
RADIO_SelectCurrentVfo(); RADIO_SelectCurrentVfo();
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) && defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF || if (gAlarmState == ALARM_STATE_OFF ||
gAlarmState == ALARM_STATE_TX1750 || gAlarmState == ALARM_STATE_TX1750 ||
(gAlarmState == ALARM_STATE_ALARM && gEeprom.ALARM_MODE == ALARM_MODE_TONE)) (gAlarmState == ALARM_STATE_ALARM && gEeprom.ALARM_MODE == ALARM_MODE_TONE))
#elif defined(ENABLE_ALARM)
if (gAlarmState == ALARM_STATE_OFF ||
(gAlarmState == ALARM_STATE_ALARM && gEeprom.ALARM_MODE == ALARM_MODE_TONE))
#elif defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF ||
gAlarmState == ALARM_STATE_TX1750)
#endif #endif
{ {
#ifndef ENABLE_TX_WHEN_AM #ifndef ENABLE_TX_WHEN_AM
@@ -942,13 +939,13 @@ 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_FREQUENCY_Check(gCurrentVfo->pTX->Frequency) == 0 || gCurrentVfo->CHANNEL_SAVE <= FREQ_CHANNEL_LAST) //if (TX_freq_check(gCurrentVfo->pTX->Frequency) == 0 || gCurrentVfo->CHANNEL_SAVE <= FREQ_CHANNEL_LAST)
if (TX_FREQUENCY_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)
State = VFO_STATE_BUSY; // busy RX'ing a station State = VFO_STATE_BUSY; // busy RX'ing a station
@@ -956,8 +953,7 @@ void RADIO_PrepareTX(void)
if (gBatteryDisplayLevel == 0) if (gBatteryDisplayLevel == 0)
State = VFO_STATE_BAT_LOW; // charge your battery ! State = VFO_STATE_BAT_LOW; // charge your battery !
else else
//if (gBatteryDisplayLevel >= 6) if (gBatteryDisplayLevel >= 6)
if (gBatteryDisplayLevel >= 11) // I've increased the battery level bar resolution
State = VFO_STATE_VOLTAGE_HIGH; // over voltage .. this is being a pain State = VFO_STATE_VOLTAGE_HIGH; // over voltage .. this is being a pain
} }
else else
@@ -967,7 +963,7 @@ 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);
#ifdef ENABLE_ALARM #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;
@@ -995,15 +991,18 @@ void RADIO_PrepareTX(void)
FUNCTION_Select(FUNCTION_TRANSMIT); FUNCTION_Select(FUNCTION_TRANSMIT);
gTxTimerCountdown_500ms = 0; // no timeout gTxTimerCountdown_500ms = 0; // no timeout
#ifdef ENABLE_ALARM
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF) if (gAlarmState == ALARM_STATE_OFF)
#endif #endif
{ {
if (gEeprom.TX_TIMEOUT_TIMER == 1) if (gEeprom.TX_TIMEOUT_TIMER == 0)
gTxTimerCountdown_500ms = 60; // 30 sec gTxTimerCountdown_500ms = 60; // 30 sec
else else
if (gEeprom.TX_TIMEOUT_TIMER >= 2) if (gEeprom.TX_TIMEOUT_TIMER < (ARRAY_SIZE(gSubMenu_TOT) - 1))
gTxTimerCountdown_500ms = (gEeprom.TX_TIMEOUT_TIMER - 1) * 120; // minutes gTxTimerCountdown_500ms = 120 * gEeprom.TX_TIMEOUT_TIMER; // minutes
else
gTxTimerCountdown_500ms = 120 * 15; // 15 minutes
} }
gTxTimeoutReached = false; gTxTimeoutReached = false;
@@ -1051,8 +1050,9 @@ void RADIO_SendEndOfTransmission(void)
if (gEeprom.ROGER == ROGER_MODE_MDC) if (gEeprom.ROGER == ROGER_MODE_MDC)
BK4819_PlayRogerMDC(); BK4819_PlayRogerMDC();
if (gDTMF_CallState == DTMF_CALL_STATE_NONE && (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_EOT || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH)) 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))
{ // end-of-tx
if (gEeprom.DTMF_SIDE_TONE) if (gEeprom.DTMF_SIDE_TONE)
{ {
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);

39
radio.h
View File

@@ -21,6 +21,7 @@
#include <stdint.h> #include <stdint.h>
#include "dcs.h" #include "dcs.h"
#include "frequencies.h"
enum { enum {
MR_CH_BAND_MASK = 0x0F << 0, MR_CH_BAND_MASK = 0x0F << 0,
@@ -42,40 +43,13 @@ enum {
}; };
enum PTT_ID_t { enum PTT_ID_t {
PTT_ID_OFF = 0, PTT_ID_OFF = 0, // OFF
PTT_ID_BOT, PTT_ID_TX_UP, // BEGIN OF TX
PTT_ID_EOT, PTT_ID_TX_DOWN, // END OF TX
PTT_ID_BOTH PTT_ID_BOTH // BOTH
}; };
typedef enum PTT_ID_t PTT_ID_t; typedef enum PTT_ID_t PTT_ID_t;
#if 0
enum STEP_Setting_t
{
STEP_2_5kHz,
STEP_5_0kHz,
STEP_6_25kHz,
STEP_10_0kHz,
STEP_12_5kHz,
STEP_25_0kHz,
STEP_8_33kHz
};
#else
enum STEP_Setting_t
{
STEP_1_25kHz,
STEP_2_5kHz,
STEP_6_25kHz,
STEP_10_0kHz,
STEP_12_5kHz,
STEP_25_0kHz,
STEP_8_33kHz
};
#endif
typedef enum STEP_Setting_t STEP_Setting_t;
enum VfoState_t enum VfoState_t
{ {
VFO_STATE_NORMAL = 0, VFO_STATE_NORMAL = 0,
@@ -86,7 +60,6 @@ enum VfoState_t
VFO_STATE_ALARM, VFO_STATE_ALARM,
VFO_STATE_VOLTAGE_HIGH VFO_STATE_VOLTAGE_HIGH
}; };
typedef enum VfoState_t VfoState_t; typedef enum VfoState_t VfoState_t;
typedef struct typedef struct
@@ -159,7 +132,7 @@ extern VfoState_t VfoState[2];
bool RADIO_CheckValidChannel(uint16_t ChNum, bool bCheckScanList, uint8_t RadioNum); bool RADIO_CheckValidChannel(uint16_t ChNum, bool bCheckScanList, uint8_t RadioNum);
uint8_t RADIO_FindNextChannel(uint8_t ChNum, int8_t Direction, bool bCheckScanList, uint8_t RadioNum); uint8_t RADIO_FindNextChannel(uint8_t ChNum, int8_t Direction, bool bCheckScanList, uint8_t RadioNum);
void RADIO_InitInfo(VFO_Info_t *pInfo, uint8_t ChannelSave, uint8_t ChIndex, uint32_t Frequency); void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t Frequency);
void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure); 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);
void RADIO_ApplyOffset(VFO_Info_t *pInfo); void RADIO_ApplyOffset(VFO_Info_t *pInfo);

View File

@@ -57,6 +57,7 @@ void SystickHandler(void)
gNextTimeslice_500ms = true; gNextTimeslice_500ms = true;
DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached); DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached);
DECREMENT(gSerialConfigCountDown_500ms);
} }
if ((gGlobalSysTickCounter & 3) == 0) if ((gGlobalSysTickCounter & 3) == 0)

View File

@@ -121,7 +121,7 @@ void SETTINGS_SaveSettings(void)
EEPROM_WriteBuffer(0x0EA0, State); EEPROM_WriteBuffer(0x0EA0, State);
#endif #endif
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
State[0] = gEeprom.ALARM_MODE; State[0] = gEeprom.ALARM_MODE;
#else #else
State[0] = false; State[0] = false;
@@ -174,6 +174,8 @@ 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
if (!gSetting_backlight_on_rx) State[7] &= ~(1u << 6);
EEPROM_WriteBuffer(0x0F40, State); EEPROM_WriteBuffer(0x0F40, State);
} }
@@ -223,7 +225,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
if (IS_MR_CHANNEL(Channel)) if (IS_MR_CHANNEL(Channel))
{ {
#ifndef 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));
memset(&State, 0x00, sizeof(State)); // follow the QS way memset(&State, 0x00, sizeof(State)); // follow the QS way
@@ -277,7 +279,7 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep)
gMR_ChannelAttributes[Channel] = Attributes; gMR_ChannelAttributes[Channel] = Attributes;
// #ifndef KEEP_MEM_NAME // #ifndef ENABLE_KEEP_MEM_NAME
if (IS_MR_CHANNEL(Channel)) if (IS_MR_CHANNEL(Channel))
{ {
const uint16_t OffsetMR = Channel * 16; const uint16_t OffsetMR = Channel * 16;

View File

@@ -20,6 +20,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "frequencies.h"
#include "radio.h" #include "radio.h"
enum POWER_OnDisplayMode_t { enum POWER_OnDisplayMode_t {
@@ -28,7 +29,6 @@ enum POWER_OnDisplayMode_t {
POWER_ON_DISPLAY_MODE_VOLTAGE, POWER_ON_DISPLAY_MODE_VOLTAGE,
POWER_ON_DISPLAY_MODE_NONE POWER_ON_DISPLAY_MODE_NONE
}; };
typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t; typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t;
enum { enum {
@@ -90,7 +90,6 @@ enum {
VOICE_PROMPT_CHINESE, VOICE_PROMPT_CHINESE,
VOICE_PROMPT_ENGLISH VOICE_PROMPT_ENGLISH
}; };
typedef enum VOICE_Prompt_t VOICE_Prompt_t; typedef enum VOICE_Prompt_t VOICE_Prompt_t;
#endif #endif
@@ -98,7 +97,6 @@ enum ALARM_Mode_t {
ALARM_MODE_SITE = 0, ALARM_MODE_SITE = 0,
ALARM_MODE_TONE ALARM_MODE_TONE
}; };
typedef enum ALARM_Mode_t ALARM_Mode_t; typedef enum ALARM_Mode_t ALARM_Mode_t;
enum ROGER_Mode_t { enum ROGER_Mode_t {
@@ -106,7 +104,6 @@ enum ROGER_Mode_t {
ROGER_MODE_ROGER, ROGER_MODE_ROGER,
ROGER_MODE_MDC ROGER_MODE_MDC
}; };
typedef enum ROGER_Mode_t ROGER_Mode_t; typedef enum ROGER_Mode_t ROGER_Mode_t;
enum CHANNEL_DisplayMode_t { enum CHANNEL_DisplayMode_t {
@@ -115,7 +112,6 @@ enum CHANNEL_DisplayMode_t {
MDF_NAME, MDF_NAME,
MDF_NAME_FREQ MDF_NAME_FREQ
}; };
typedef enum CHANNEL_DisplayMode_t CHANNEL_DisplayMode_t; typedef enum CHANNEL_DisplayMode_t CHANNEL_DisplayMode_t;
typedef struct { typedef struct {
@@ -176,7 +172,7 @@ typedef struct {
#endif #endif
bool AUTO_KEYPAD_LOCK; bool AUTO_KEYPAD_LOCK;
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
ALARM_Mode_t ALARM_MODE; ALARM_Mode_t ALARM_MODE;
#endif #endif
POWER_OnDisplayMode_t POWER_ON_DISPLAY_MODE; POWER_OnDisplayMode_t POWER_ON_DISPLAY_MODE;
@@ -226,7 +222,6 @@ typedef struct {
VFO_Info_t VfoInfo[2]; VFO_Info_t VfoInfo[2];
} EEPROM_Config_t; } EEPROM_Config_t;
extern EEPROM_Config_t gEeprom; extern EEPROM_Config_t gEeprom;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO

294
ui/main.c
View File

@@ -36,7 +36,18 @@
#include "ui/main.h" #include "ui/main.h"
#include "ui/ui.h" #include "ui/ui.h"
bool center_line_is_free = true; 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;
// *************************************************************************** // ***************************************************************************
@@ -69,6 +80,9 @@ bool center_line_is_free = true;
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 (gScreenToDisplay != DISPLAY_MAIN)
return;
#if 1 #if 1
// TX audio level // TX audio level
@@ -96,18 +110,18 @@ bool center_line_is_free = true;
#endif #endif
uint8_t *pLine = gFrameBuffer[line]; uint8_t *p_line = gFrameBuffer[line];
memset(pLine, 0, LCD_WIDTH); memset(p_line, 0, LCD_WIDTH);
#if 1 #if 1
// solid bar // solid bar
for (i = 0; i < bar_width; i++) for (i = 0; i < bar_width; i++)
pLine[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e; p_line[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e;
#else #else
// knuled bar // knuled bar
for (i = 0; i < bar_width; i += 2) for (i = 0; i < bar_width; i += 2)
pLine[bar_x + i] = (i <= len) ? 0x7f : 0x41; p_line[bar_x + i] = (i <= len) ? 0x7f : 0x41;
#endif #endif
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
@@ -124,6 +138,7 @@ bool center_line_is_free = true;
const int16_t s9_dBm = s0_dBm + (6 * 9); // S9 .. 6dB/S-Point const int16_t s9_dBm = s0_dBm + (6 * 9); // S9 .. 6dB/S-Point
const int16_t bar_max_dBm = s9_dBm + 30; // S9+30dB const int16_t bar_max_dBm = s9_dBm + 30; // S9+30dB
// const int16_t bar_min_dBm = s0_dBm + (6 * 0); // S0
const int16_t bar_min_dBm = s0_dBm + (6 * 4); // S4 const int16_t bar_min_dBm = s0_dBm + (6 * 4); // S4
// ************ // ************
@@ -138,7 +153,7 @@ bool center_line_is_free = true;
const unsigned int len = ((clamped_dBm - bar_min_dBm) * bar_width) / bar_range_dB; const unsigned int len = ((clamped_dBm - bar_min_dBm) * bar_width) / bar_range_dB;
const unsigned int line = 3; const unsigned int line = 3;
uint8_t *pLine = gFrameBuffer[line]; uint8_t *p_line = gFrameBuffer[line];
char s[16]; char s[16];
unsigned int i; unsigned int i;
@@ -149,29 +164,29 @@ bool center_line_is_free = true;
return; // display is in use return; // display is in use
if (now) if (now)
memset(pLine, 0, LCD_WIDTH); memset(p_line, 0, LCD_WIDTH);
if (rssi_dBm >= (s9_dBm + 6)) if (rssi_dBm >= (s9_dBm + 6))
{ // S9+XXdB, 1dB increment { // S9+XXdB, 1dB increment
const char *fmt[] = {"%-4d +%u ", "%-4d +%u "}; const char *fmt[] = {"%3d 9+%u ", "%3d 9+%2u "};
const unsigned int dB = rssi_dBm - s9_dBm; const unsigned int s9_dB = ((rssi_dBm - s9_dBm) <= 99) ? rssi_dBm - s9_dBm : 99;
sprintf(s, (dB < 10) ? fmt[0] : fmt[1], rssi_dBm, dB); sprintf(s, (s9_dB < 10) ? fmt[0] : fmt[1], rssi_dBm, s9_dB);
} }
else else
{ // S0 ~ S9, 6dB per S-point { // S0 ~ S9, 6dB per S-point
const unsigned int s_level = (rssi_dBm >= s0_dBm) ? (rssi_dBm - s0_dBm) / 6 : 0; const unsigned int s_level = (rssi_dBm >= s0_dBm) ? (rssi_dBm - s0_dBm) / 6 : 0;
sprintf(s, "%-4d S%u ", rssi_dBm, s_level); sprintf(s, "%4d S%u ", rssi_dBm, s_level);
} }
UI_PrintStringSmall(s, 2, 0, line); UI_PrintStringSmall(s, 2, 0, line);
#if 1 #if 1
// solid bar // solid bar
for (i = 0; i < bar_width; i++) for (i = 0; i < bar_width; i++)
pLine[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e; p_line[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e;
#else #else
// knuled bar // knuled bar
for (i = 0; i < bar_width; i += 2) for (i = 0; i < bar_width; i += 2)
pLine[bar_x + i] = (i <= len) ? 0x7f : 0x41; p_line[bar_x + i] = (i <= len) ? 0x7f : 0x41;
#endif #endif
if (now) if (now)
@@ -183,27 +198,25 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
{ {
#ifdef ENABLE_RSSI_BAR #ifdef ENABLE_RSSI_BAR
if (!center_line_is_free) // optional larger RSSI dBm, S-point and bar level
if (center_line != CENTER_LINE_RSSI)
return; return;
const bool rx = (gCurrentFunction == FUNCTION_RECEIVE || if (gCurrentFunction == FUNCTION_RECEIVE ||
gCurrentFunction == FUNCTION_MONITOR || gCurrentFunction == FUNCTION_MONITOR ||
gCurrentFunction == FUNCTION_INCOMING); gCurrentFunction == FUNCTION_INCOMING)
{
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) UI_DisplayRSSIBar(rssi, true);
if (gEeprom.VfoInfo[gEeprom.RX_CHANNEL].AM_mode && gSetting_AM_fix) }
{ // AM test data is currently being shown
}
else
#endif
if (rx)
UI_DisplayRSSIBar(rssi, true);
#else #else
// original little RS bars
// const int16_t dBm = (rssi / 2) - 160; // const int16_t dBm = (rssi / 2) - 160;
const uint8_t Line = (vfo == 0) ? 3 : 7; const uint8_t Line = (vfo == 0) ? 3 : 7;
uint8_t *pLine = gFrameBuffer[Line - 1]; uint8_t *p_line = gFrameBuffer[Line - 1];
// TODO: sort out all 8 values from the eeprom // TODO: sort out all 8 values from the eeprom
@@ -258,31 +271,31 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN) if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN)
return; // display is in use return; // display is in use
pLine = gFrameBuffer[Line - 1]; p_line = gFrameBuffer[Line - 1];
memset(pLine, 0, 23); memset(p_line, 0, 23);
if (rssi_level > 0) if (rssi_level > 0)
{ {
//if (rssi_level >= 1) //if (rssi_level >= 1)
memmove(pLine, BITMAP_Antenna, 5); memmove(p_line, BITMAP_Antenna, 5);
if (rssi_level >= 2) if (rssi_level >= 2)
memmove(pLine + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); memmove(p_line + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1));
if (rssi_level >= 3) if (rssi_level >= 3)
memmove(pLine + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); memmove(p_line + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2));
if (rssi_level >= 4) if (rssi_level >= 4)
memmove(pLine + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); memmove(p_line + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3));
if (rssi_level >= 5) if (rssi_level >= 5)
memmove(pLine + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); memmove(p_line + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4));
if (rssi_level >= 6) if (rssi_level >= 6)
memmove(pLine + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); memmove(p_line + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5));
if (rssi_level >= 7) if (rssi_level >= 7)
memmove(pLine + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); memmove(p_line + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6));
} }
else else
pLine = NULL; p_line = NULL;
ST7565_DrawLine(0, Line, 23, pLine); ST7565_DrawLine(0, Line, 23, p_line);
#endif #endif
} }
@@ -290,10 +303,12 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
void UI_DisplayMain(void) void UI_DisplayMain(void)
{ {
char String[16]; const unsigned int line0 = 0; // text screen line
unsigned int vfo_num; const unsigned int line1 = 4;
char String[16];
unsigned int vfo_num;
center_line_is_free = true; center_line = CENTER_LINE_NONE;
// #ifdef SINGLE_VFO_CHAN // #ifdef SINGLE_VFO_CHAN
// const bool single_vfo = (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? true : false; // const bool single_vfo = (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? true : false;
@@ -301,6 +316,7 @@ void UI_DisplayMain(void)
const bool single_vfo = false; const bool single_vfo = false;
// #endif // #endif
// clear the screen
memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
if (gEeprom.KEY_LOCK && gKeypadLocked > 0) if (gEeprom.KEY_LOCK && gKeypadLocked > 0)
@@ -313,25 +329,28 @@ void UI_DisplayMain(void)
for (vfo_num = 0; vfo_num < 2; vfo_num++) for (vfo_num = 0; vfo_num < 2; vfo_num++)
{ {
uint8_t Channel = gEeprom.TX_CHANNEL; const unsigned int line = (vfo_num == 0) ? line0 : line1;
bool bIsSameVfo = !!(Channel == vfo_num); uint8_t channel = gEeprom.TX_CHANNEL;
uint8_t Line = (vfo_num == 0) ? 0 : 4; // uint8_t tx_channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
uint8_t *pLine0 = gFrameBuffer[Line + 0]; const bool same_vfo = (channel == vfo_num) ? true : false;
uint8_t *pLine1 = gFrameBuffer[Line + 1]; uint8_t *p_line0 = gFrameBuffer[line + 0];
uint8_t *p_line1 = gFrameBuffer[line + 1];
uint8_t 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 (!bIsSameVfo) if (!same_vfo)
continue; // skip the unused vfo continue; // skip the unused vfo
} }
if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive)
Channel = gEeprom.RX_CHANNEL; // we're currently monitoring the other VFO channel = gEeprom.RX_CHANNEL; // we're currently monitoring the other VFO
if (Channel != vfo_num) 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
@@ -354,7 +373,7 @@ void UI_DisplayMain(void)
{ {
sprintf(String, ">%s", gDTMF_InputBox); sprintf(String, ">%s", gDTMF_InputBox);
center_line_is_free = false; center_line = CENTER_LINE_IN_USE;
} }
UI_PrintString(String, 2, 0, vfo_num * 3, 8); UI_PrintString(String, 2, 0, vfo_num * 3, 8);
@@ -373,55 +392,66 @@ void UI_DisplayMain(void)
} }
else else
{ {
center_line_is_free = false; 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_is_free = false; center_line = CENTER_LINE_IN_USE;
continue; continue;
} }
// highlight the selected/used VFO with a marker // highlight the selected/used VFO with a marker
if (!single_vfo && bIsSameVfo) if (!single_vfo && same_vfo)
memmove(pLine0 + 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) if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF)
memmove(pLine0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); 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 (bIsSameVfo) if (same_vfo)
memmove(pLine0 + 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) //if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF)
memmove(pLine0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault));
} }
uint32_t duff_beer = 0;
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ // transmitting { // transmitting
#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; channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
if (Channel == vfo_num) if (channel == 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_CHANNEL == 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 (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num]))
@@ -431,9 +461,9 @@ void UI_DisplayMain(void)
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
memmove(String + 5, gInputBox, 3); // show the input text memmove(String + 5, gInputBox, 3); // show the input text
UI_PrintStringSmall("M", x, 0, Line + 1); UI_PrintStringSmall("M", x, 0, line + 1);
UI_DisplaySmallDigits(3, String + 5, x + 7, Line + 1, inputting); UI_DisplaySmallDigits(3, String + 5, x + 7, line + 1, inputting);
} }
else else
if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num])) if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]))
@@ -442,7 +472,7 @@ void UI_DisplayMain(void)
const unsigned int x = 2; // was 14 const unsigned int x = 2; // was 14
// sprintf(String, "FB%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST); // sprintf(String, "FB%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST);
sprintf(String, "VFO%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST); sprintf(String, "VFO%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST);
UI_PrintStringSmall(String, x, 0, Line + 1); UI_PrintStringSmall(String, x, 0, line + 1);
} }
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
else else
@@ -455,50 +485,43 @@ void UI_DisplayMain(void)
{ // user entering channel number { // user entering channel number
sprintf(String, "N%u%u", '0' + gInputBox[0], '0' + gInputBox[1]); sprintf(String, "N%u%u", '0' + gInputBox[0], '0' + gInputBox[1]);
} }
UI_PrintStringSmall(String, 7, 0, Line + 1); UI_PrintStringSmall(String, 7, 0, line + 1);
} }
#endif #endif
// ************ // ************
uint8_t State = VfoState[vfo_num]; 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; channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
if (Channel == vfo_num) if (channel == vfo_num)
State = VFO_STATE_ALARM; state = VFO_STATE_ALARM;
} }
#endif #endif
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 >= 0 && state < ARRAY_SIZE(state_list))
{ UI_PrintString(state_list[state], 31, 0, line, 8);
UI_PrintString(state_list[State], 31, 0, Line, 8);
}
//else
//{
// sprintf(String, "State %u ?", State);
// UI_PrintString(String, 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_CHANNEL == vfo_num)
{ // user entering a frequency { // user entering a frequency
UI_DisplayFrequency(gInputBox, 32, Line, true, false); UI_DisplayFrequency(gInputBox, 32, line, true, false);
center_line_is_free = false; // center_line = CENTER_LINE_IN_USE;
} }
else else
{ {
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; channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
if (Channel == vfo_num) if (channel == vfo_num)
frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency; frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency;
} }
@@ -508,13 +531,13 @@ void UI_DisplayMain(void)
// 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_SCANLIST1) if (attributes & MR_CH_SCANLIST1)
memmove(pLine0 + 113, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); memmove(p_line0 + 113, BITMAP_ScanList1, sizeof(BITMAP_ScanList1));
if (attributes & MR_CH_SCANLIST2) if (attributes & MR_CH_SCANLIST2)
memmove(pLine0 + 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 #ifdef ENABLE_COMPANDER
if ((attributes & MR_CH_COMPAND) > 0) if ((attributes & MR_CH_COMPAND) > 0)
memmove(pLine0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand));
#endif #endif
#endif #endif
@@ -524,19 +547,19 @@ void UI_DisplayMain(void)
#ifdef ENABLE_BIG_FREQ #ifdef ENABLE_BIG_FREQ
NUMBER_ToDigits(frequency, String); NUMBER_ToDigits(frequency, String);
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 32, Line, false, false); UI_DisplayFrequency(String, 32, line, false, false);
// show the remaining 2 small frequency digits // show the remaining 2 small frequency digits
UI_DisplaySmallDigits(2, String + 6, 113, Line + 1, true); UI_DisplaySmallDigits(2, String + 6, 113, line + 1, true);
#else #else
// show the frequency in the main font // show the frequency in the main font
sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000);
UI_PrintString(String, 32, 0, Line, 8); UI_PrintString(String, 32, 0, line, 8);
#endif #endif
break; break;
case MDF_CHANNEL: // show the channel number case MDF_CHANNEL: // show the channel number
sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1); sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1);
UI_PrintString(String, 32, 0, Line, 8); UI_PrintString(String, 32, 0, line, 8);
break; break;
case MDF_NAME: // show the channel name case MDF_NAME: // show the channel name
@@ -550,19 +573,19 @@ void UI_DisplayMain(void)
if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME) if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME)
{ {
UI_PrintString(String, 32, 0, Line, 8); UI_PrintString(String, 32, 0, line, 8);
} }
else else
{ {
#ifdef ENABLE_SMALL_BOLD #ifdef ENABLE_SMALL_BOLD
UI_PrintStringSmallBold(String, 32 + 4, 0, Line); UI_PrintStringSmallBold(String, 32 + 4, 0, line);
#else #else
UI_PrintStringSmall(String, 32 + 4, 0, Line); UI_PrintStringSmall(String, 32 + 4, 0, line);
#endif #endif
// show the channel frequency below the channel number/name // show the channel frequency below the channel number/name
sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000);
UI_PrintStringSmall(String, 32 + 4, 0, Line + 1); UI_PrintStringSmall(String, 32 + 4, 0, line + 1);
} }
break; break;
@@ -573,13 +596,13 @@ void UI_DisplayMain(void)
#ifdef ENABLE_BIG_FREQ #ifdef ENABLE_BIG_FREQ
NUMBER_ToDigits(frequency, String); // 8 digits NUMBER_ToDigits(frequency, String); // 8 digits
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 32, Line, false, false); UI_DisplayFrequency(String, 32, line, false, false);
// show the remaining 2 small frequency digits // show the remaining 2 small frequency digits
UI_DisplaySmallDigits(2, String + 6, 113, Line + 1, true); UI_DisplaySmallDigits(2, String + 6, 113, line + 1, true);
#else #else
// show the frequency in the main font // show the frequency in the main font
sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000);
UI_PrintString(String, 32, 0, Line, 8); UI_PrintString(String, 32, 0, line, 8);
#endif #endif
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
@@ -587,9 +610,9 @@ void UI_DisplayMain(void)
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(pLine0 + 120, BITMAP_compand, sizeof(BITMAP_compand)); memmove(p_line0 + 120, BITMAP_compand, sizeof(BITMAP_compand));
#else #else
memmove(pLine0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand));
#endif #endif
#endif #endif
} }
@@ -600,7 +623,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)
{ {
@@ -610,7 +633,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
@@ -621,20 +644,20 @@ void UI_DisplayMain(void)
if (Level >= 1) if (Level >= 1)
{ {
uint8_t *pLine = pLine1 + LCD_WIDTH; uint8_t *p_line = p_line1 + LCD_WIDTH;
memmove(pLine + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna)); memmove(p_line + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna));
if (Level >= 2) if (Level >= 2)
memmove(pLine + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); memmove(p_line + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1));
if (Level >= 3) if (Level >= 3)
memmove(pLine + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); memmove(p_line + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2));
if (Level >= 4) if (Level >= 4)
memmove(pLine + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); memmove(p_line + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3));
if (Level >= 5) if (Level >= 5)
memmove(pLine + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); memmove(p_line + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4));
if (Level >= 6) if (Level >= 6)
memmove(pLine + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); memmove(p_line + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5));
if (Level >= 7) if (Level >= 7)
memmove(pLine + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); memmove(p_line + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6));
} }
} }
@@ -647,21 +670,21 @@ 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 >= 0 && 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);
if (State != VFO_STATE_TX_DISABLE) if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM)
{ // 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 >= 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);
} }
if (gEeprom.VfoInfo[vfo_num].freq_config_RX.Frequency != gEeprom.VfoInfo[vfo_num].freq_config_TX.Frequency) if (gEeprom.VfoInfo[vfo_num].freq_config_RX.Frequency != gEeprom.VfoInfo[vfo_num].freq_config_TX.Frequency)
@@ -670,12 +693,12 @@ void UI_DisplayMain(void)
const unsigned int i = gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION; const unsigned int i = gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION;
String[0] = (i < sizeof(dir_list)) ? dir_list[i] : '?'; String[0] = (i < sizeof(dir_list)) ? dir_list[i] : '?';
String[1] = '\0'; String[1] = '\0';
UI_PrintStringSmall(String, LCD_WIDTH + 54, 0, Line + 1); UI_PrintStringSmall(String, LCD_WIDTH + 54, 0, line + 1);
} }
// show the TX/RX reverse symbol // show the TX/RX reverse symbol
if (gEeprom.VfoInfo[vfo_num].FrequencyReverse) if (gEeprom.VfoInfo[vfo_num].FrequencyReverse)
UI_PrintStringSmall("R", LCD_WIDTH + 62, 0, Line + 1); UI_PrintStringSmall("R", LCD_WIDTH + 62, 0, line + 1);
{ // show the narrow band symbol { // show the narrow band symbol
String[0] = '\0'; String[0] = '\0';
@@ -684,19 +707,19 @@ void UI_DisplayMain(void)
String[0] = 'N'; String[0] = 'N';
String[1] = '\0'; String[1] = '\0';
} }
UI_PrintStringSmall(String, LCD_WIDTH + 70, 0, Line + 1); UI_PrintStringSmall(String, LCD_WIDTH + 70, 0, line + 1);
} }
// show the DTMF decoding symbol // show the DTMF decoding symbol
if (gEeprom.VfoInfo[vfo_num].DTMF_DECODING_ENABLE || gSetting_KILLED) if (gEeprom.VfoInfo[vfo_num].DTMF_DECODING_ENABLE || gSetting_KILLED)
UI_PrintStringSmall("DTMF", LCD_WIDTH + 78, 0, Line + 1); UI_PrintStringSmall("DTMF", LCD_WIDTH + 78, 0, line + 1);
// show the audio scramble symbol // show the audio scramble symbol
if (gEeprom.VfoInfo[vfo_num].SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable) if (gEeprom.VfoInfo[vfo_num].SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable)
UI_PrintStringSmall("SCR", LCD_WIDTH + 106, 0, Line + 1); UI_PrintStringSmall("SCR", LCD_WIDTH + 106, 0, line + 1);
} }
if (center_line_is_free) if (center_line == CENTER_LINE_NONE)
{ // we're free to use the middle line { // we're free to use the middle line
const bool rx = (gCurrentFunction == FUNCTION_RECEIVE || const bool rx = (gCurrentFunction == FUNCTION_RECEIVE ||
@@ -705,13 +728,17 @@ 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)
{
center_line = CENTER_LINE_AUDIO_BAR;
UI_DisplayAudioBar(); 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_CHANNEL].AM_mode && gSetting_AM_fix)
{ {
center_line = CENTER_LINE_AM_FIX_DATA;
AM_fix_print_data(gEeprom.RX_CHANNEL, String); AM_fix_print_data(gEeprom.RX_CHANNEL, String);
UI_PrintStringSmall(String, 2, 0, 3); UI_PrintStringSmall(String, 2, 0, 3);
} }
@@ -720,7 +747,10 @@ void UI_DisplayMain(void)
#ifdef ENABLE_RSSI_BAR #ifdef ENABLE_RSSI_BAR
if (rx) if (rx)
{
center_line = CENTER_LINE_RSSI;
UI_DisplayRSSIBar(gCurrentRSSI[gEeprom.RX_CHANNEL], false); UI_DisplayRSSIBar(gCurrentRSSI[gEeprom.RX_CHANNEL], false);
}
else else
#endif #endif
@@ -731,6 +761,7 @@ 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
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);
@@ -740,6 +771,7 @@ void UI_DisplayMain(void)
{ // 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
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);
@@ -750,9 +782,11 @@ void UI_DisplayMain(void)
else else
if (gChargingWithTypeC) if (gChargingWithTypeC)
{ // charging .. show the battery state { // charging .. show the battery state
const uint16_t percent = BATTERY_VoltsToPercent(gBatteryVoltageAverage); center_line = CENTER_LINE_CHARGE_DATA;
sprintf(String, "Charge %u.%02uV %u%%", gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, percent); sprintf(String, "Charge %u.%02uV %u%%",
UI_PrintStringSmall(String, 2, 0, 3); gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100,
BATTERY_VoltsToPercent(gBatteryVoltageAverage));
UI_PrintStringSmall(String, 2, 0, 3);
} }
#endif #endif
} }

392
ui/menu.c
View File

@@ -44,36 +44,37 @@ const t_menu_item MenuList[] =
{"SQL", VOICE_ID_SQUELCH, MENU_SQL }, {"SQL", VOICE_ID_SQUELCH, MENU_SQL },
{"STEP", VOICE_ID_FREQUENCY_STEP, MENU_STEP }, {"STEP", VOICE_ID_FREQUENCY_STEP, MENU_STEP },
{"T-PWR", VOICE_ID_POWER, MENU_TXP }, // was "TXP" {"T PWR", VOICE_ID_POWER, MENU_TXP }, // was "TXP"
{"R-DCS", VOICE_ID_DCS, MENU_R_DCS }, // was "R_DCS" {"R DCS", VOICE_ID_DCS, MENU_R_DCS }, // was "R_DCS"
{"R-CTCS", VOICE_ID_CTCSS, MENU_R_CTCS }, // was "R_CTCS" {"R CTCS", VOICE_ID_CTCSS, MENU_R_CTCS }, // was "R_CTCS"
{"T-DCS", VOICE_ID_DCS, MENU_T_DCS }, // was "T_DCS" {"T DCS", VOICE_ID_DCS, MENU_T_DCS }, // was "T_DCS"
{"T-CTCS", VOICE_ID_CTCSS, MENU_T_CTCS }, // was "T_CTCS" {"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 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 OFFS", VOICE_ID_TX_OFFSET_FREQUENCY, MENU_OFFSET }, // was "OFFSET"
{"T-VFO", VOICE_ID_INVALID, MENU_XB }, // was "WX" {"T VFO", VOICE_ID_INVALID, MENU_XB }, // was "WX"
{"T-TOUT", VOICE_ID_TRANSMIT_OVER_TIME, MENU_TOT }, // was "TOT" {"T TOUT", VOICE_ID_TRANSMIT_OVER_TIME, MENU_TOT }, // was "TOT"
{"W/N", VOICE_ID_CHANNEL_BANDWIDTH, MENU_W_N }, {"W/N", VOICE_ID_CHANNEL_BANDWIDTH, MENU_W_N },
{"SCRAM", VOICE_ID_SCRAMBLER_ON, MENU_SCR }, // was "SCR" {"SCRAM", VOICE_ID_SCRAMBLER_ON, MENU_SCR }, // was "SCR"
{"BUSYCL", VOICE_ID_BUSY_LOCKOUT, MENU_BCL }, // was "BCL" {"BUSYCL", VOICE_ID_BUSY_LOCKOUT, MENU_BCL }, // was "BCL"
{"CH-SAV", VOICE_ID_MEMORY_CHANNEL, MENU_MEM_CH }, // was "MEM-CH" {"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 DEL", VOICE_ID_DELETE_CHANNEL, MENU_DEL_CH }, // was "DEL-CH"
{"CH-NAM", VOICE_ID_INVALID, MENU_MEM_NAME }, {"CH NAM", VOICE_ID_INVALID, MENU_MEM_NAME },
{"CH-DIS", VOICE_ID_INVALID, MENU_MDF }, // was "MDF" {"CH DIS", VOICE_ID_INVALID, MENU_MDF }, // was "MDF"
{"BATSAV", VOICE_ID_SAVE_MODE, MENU_SAVE }, // was "SAVE" {"BATSAV", VOICE_ID_SAVE_MODE, MENU_SAVE }, // was "SAVE"
{"VOX", VOICE_ID_VOX, MENU_VOX }, {"VOX", VOICE_ID_VOX, MENU_VOX },
{"BACKLT", VOICE_ID_INVALID, MENU_ABR }, // was "ABR" {"BLT", VOICE_ID_INVALID, MENU_ABR }, // was "ABR"
{"BLT RX", VOICE_ID_INVALID, MENU_ABR_ON_RX },
{"DUALRX", VOICE_ID_DUAL_STANDBY, MENU_TDR }, // was "TDR" {"DUALRX", VOICE_ID_DUAL_STANDBY, MENU_TDR }, // was "TDR"
{"BEEP", VOICE_ID_BEEP_PROMPT, MENU_BEEP }, {"BEEP", VOICE_ID_BEEP_PROMPT, MENU_BEEP },
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
{"VOICE", VOICE_ID_VOICE_PROMPT, MENU_VOICE }, {"VOICE", VOICE_ID_VOICE_PROMPT, MENU_VOICE },
#endif #endif
{"SC-REV", VOICE_ID_INVALID, MENU_SC_REV }, {"SC REV", VOICE_ID_INVALID, MENU_SC_REV },
{"KEYLOC", VOICE_ID_INVALID, MENU_AUTOLK }, // was "AUTOLk" {"KEYLOC", VOICE_ID_INVALID, MENU_AUTOLK }, // was "AUTOLk"
{"S-ADD1", VOICE_ID_INVALID, MENU_S_ADD1 }, {"S ADD1", VOICE_ID_INVALID, MENU_S_ADD1 },
{"S-ADD2", VOICE_ID_INVALID, MENU_S_ADD2 }, {"S ADD2", VOICE_ID_INVALID, MENU_S_ADD2 },
{"STE", VOICE_ID_INVALID, MENU_STE }, {"STE", VOICE_ID_INVALID, MENU_STE },
{"RP-STE", VOICE_ID_INVALID, MENU_RP_STE }, {"RP STE", VOICE_ID_INVALID, MENU_RP_STE },
{"MIC", VOICE_ID_INVALID, MENU_MIC }, {"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 },
@@ -81,34 +82,34 @@ const t_menu_item MenuList[] =
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
{"COMPND", VOICE_ID_INVALID, MENU_COMPAND }, {"COMPND", VOICE_ID_INVALID, MENU_COMPAND },
#endif #endif
{"1-CALL", VOICE_ID_INVALID, MENU_1_CALL }, {"1 CALL", VOICE_ID_INVALID, MENU_1_CALL },
{"SLIST", VOICE_ID_INVALID, MENU_S_LIST }, {"SLIST", VOICE_ID_INVALID, MENU_S_LIST },
{"SLIST1", VOICE_ID_INVALID, MENU_SLIST1 }, {"SLIST1", VOICE_ID_INVALID, MENU_SLIST1 },
{"SLIST2", VOICE_ID_INVALID, MENU_SLIST2 }, {"SLIST2", VOICE_ID_INVALID, MENU_SLIST2 },
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
{"AL-MOD", VOICE_ID_INVALID, MENU_AL_MOD }, {"AL-MOD", 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 },
{"D-ST", VOICE_ID_INVALID, MENU_D_ST }, {"PTT ID", VOICE_ID_INVALID, MENU_PTT_ID },
{"D-RSP", VOICE_ID_INVALID, MENU_D_RSP }, {"D ST", VOICE_ID_INVALID, MENU_D_ST },
{"D-HOLD", VOICE_ID_INVALID, MENU_D_HOLD }, {"D RSP", VOICE_ID_INVALID, MENU_D_RSP },
{"D-PRE", VOICE_ID_INVALID, MENU_D_PRE }, {"D HOLD", VOICE_ID_INVALID, MENU_D_HOLD },
{"PTT-ID", VOICE_ID_INVALID, MENU_PTT_ID }, {"D PRE", VOICE_ID_INVALID, MENU_D_PRE },
{"D-DCD", VOICE_ID_INVALID, MENU_D_DCD }, {"D DCD", 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 }, {"PONMSG", VOICE_ID_INVALID, MENU_PONMSG },
{"ROGER", VOICE_ID_INVALID, MENU_ROGER }, {"ROGER", VOICE_ID_INVALID, MENU_ROGER },
{"BATVOL", VOICE_ID_INVALID, MENU_VOL }, // was "VOL" {"BATVOL", VOICE_ID_INVALID, MENU_VOL }, // was "VOL"
{"BATTXT", VOICE_ID_INVALID, MENU_BAT_TXT }, {"BATTXT", VOICE_ID_INVALID, MENU_BAT_TXT },
{"MODE", VOICE_ID_INVALID, MENU_AM }, // was "AM" {"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_NOAA
{"NOAA-S", VOICE_ID_INVALID, MENU_NOAA_S }, {"NOAA-S", VOICE_ID_INVALID, MENU_NOAA_S },
@@ -118,15 +119,18 @@ const t_menu_item MenuList[] =
// 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"
{"SCR-EN", VOICE_ID_INVALID, MENU_SCREN }, // was "SCREN" {"SCR EN", VOICE_ID_INVALID, MENU_SCREN }, // was "SCREN"
{"TX-EN", VOICE_ID_INVALID, MENU_TX_EN }, // enable TX {"TX EN", VOICE_ID_INVALID, MENU_TX_EN }, // enable TX
{"F-CALI", VOICE_ID_INVALID, MENU_F_CALI }, // reference xtal calibration #ifdef ENABLE_F_CAL_MENU
{"F CALI", VOICE_ID_INVALID, MENU_F_CALI }, // reference xtal calibration
#endif
{"BATCAL", VOICE_ID_INVALID, MENU_BATCAL }, // battery voltage calibration
{"", 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
}; };
@@ -168,7 +172,6 @@ const char gSubMenu_SAVE[5][4] =
const char gSubMenu_TOT[11][7] = const char gSubMenu_TOT[11][7] =
{ {
"OFF",
"30 sec", "30 sec",
"1 min", "1 min",
"2 min", "2 min",
@@ -178,21 +181,22 @@ const char gSubMenu_TOT[11][7] =
"6 min", "6 min",
"7 min", "7 min",
"8 min", "8 min",
"9 min" "9 min",
"15 min"
}; };
const char gSubMenu_CHAN[3][7] = const char gSubMenu_CHAN[3][10] =
{ {
"OFF", "OFF",
"CHAN A", "UPPER\nVFO",
"CHAN B" "LOWER\nVFO"
}; };
const char gSubMenu_XB[3][7] = const char gSubMenu_XB[3][10] =
{ {
"SAME", "MAIN\nVFO",
"CHAN A", "UPPER\nVFO",
"CHAN B" "LOWER\nVFO"
}; };
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -204,19 +208,19 @@ const char gSubMenu_XB[3][7] =
}; };
#endif #endif
const char gSubMenu_SC_REV[3][3] = const char gSubMenu_SC_REV[3][13] =
{ {
"TO", "TIME",
"CO", "CARRIER",
"SE" "SEARCH"
}; };
const char gSubMenu_MDF[4][8] = const char gSubMenu_MDF[4][15] =
{ {
"FREQ", "FREQ",
"CHAN", "CHANNEL\nNUMBER",
"NAME", "NAME",
"NAM+FRE" "NAME\n+\nFREQ"
}; };
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
@@ -227,35 +231,35 @@ const char gSubMenu_MDF[4][8] =
}; };
#endif #endif
const char gSubMenu_D_RSP[4][6] = const char gSubMenu_D_RSP[4][11] =
{ {
"NULL", "DO\nNOTHING",
"RING", "RING",
"REPLY", "REPLY",
"BOTH" "BOTH"
}; };
const char gSubMenu_PTT_ID[4][5] = const char gSubMenu_PTT_ID[4][7] =
{ {
"OFF", "OFF",
"BOT", "KEY UP",
"EOT", "KEY DN",
"BOTH" "BOTH"
}; };
const char gSubMenu_PONMSG[4][5] = const char gSubMenu_PONMSG[4][8] =
{ {
"FULL", "FULL",
"MSG", "MESSAGE",
"VOL", "VOLTAGE",
"NONE" "NONE"
}; };
const char gSubMenu_ROGER[3][6] = const char gSubMenu_ROGER[3][9] =
{ {
"OFF", "OFF",
"ROGER", "ROGER",
"MDC" "MDC\n1200"
}; };
const char gSubMenu_RESET[2][4] = const char gSubMenu_RESET[2][4] =
@@ -344,34 +348,90 @@ void UI_DisplayMenu(void)
const unsigned int menu_item_x1 = (8 * menu_list_width) + 2; const unsigned int menu_item_x1 = (8 * menu_list_width) + 2;
const unsigned int menu_item_x2 = LCD_WIDTH - 1; const unsigned int menu_item_x2 = LCD_WIDTH - 1;
unsigned int i; unsigned int i;
char String[16]; char String[64]; // bigger cuz we can now do multi-line in one string (use '\n' char)
char Contact[16]; char Contact[16];
// clear the screen buffer
memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
for (i = 0; i < 3; i++) #if 0
if (gMenuCursor > 0 || i > 0) // original menu layout
if ((gMenuListCount - 1) != gMenuCursor || i != 2)
UI_PrintString(MenuList[gMenuCursor + i - 1].name, 0, 0, i * 2, 8);
// invert the menu list text pixels for (i = 0; i < 3; i++)
for (i = 0; i < (8 * menu_list_width); i++) if (gMenuCursor > 0 || i > 0)
{ if ((gMenuListCount - 1) != gMenuCursor || i != 2)
gFrameBuffer[2][i] ^= 0xFF; UI_PrintString(MenuList[gMenuCursor + i - 1].name, 0, 0, i * 2, 8);
gFrameBuffer[3][i] ^= 0xFF;
// invert the current menu list item pixels
for (i = 0; i < (8 * menu_list_width); i++)
{
gFrameBuffer[2][i] ^= 0xFF;
gFrameBuffer[3][i] ^= 0xFF;
}
// draw vertical separating dotted line
for (i = 0; i < 7; i++)
gFrameBuffer[i][(8 * menu_list_width) + 1] = 0xAA;
// draw the little sub-menu triangle marker
if (gIsInSubMenu)
memmove(gFrameBuffer[0] + (8 * menu_list_width) + 1, BITMAP_CurrentIndicator, sizeof(BITMAP_CurrentIndicator));
// draw the menu index number/count
sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount);
UI_PrintStringSmall(String, 2, 0, 6);
#else
{ // new menu layout .. experimental & unfinished
const int menu_index = gMenuCursor; // current selected menu item
i = 1;
if (!gIsInSubMenu)
{
while (i < 2)
{ // leading menu items - small text
const int k = menu_index + i - 2;
if (k < 0)
UI_PrintStringSmall(MenuList[gMenuListCount + k].name, 0, 0, i); // wrap-a-round
else
if (k >= 0 && k < (int)gMenuListCount)
UI_PrintStringSmall(MenuList[k].name, 0, 0, i);
i++;
}
// current menu item - keep big n fat
if (menu_index >= 0 && menu_index < (int)gMenuListCount)
UI_PrintString(MenuList[menu_index].name, 0, 0, 2, 8);
i++;
while (i < 4)
{ // trailing menu item - small text
const int k = menu_index + i - 2;
if (k >= 0 && k < (int)gMenuListCount)
UI_PrintStringSmall(MenuList[k].name, 0, 0, 1 + i);
else
if (k >= (int)gMenuListCount)
UI_PrintStringSmall(MenuList[gMenuListCount - k].name, 0, 0, 1 + i); // wrap-a-round
i++;
}
// draw the menu index number/count
sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount);
UI_PrintStringSmall(String, 2, 0, 6);
}
else
if (menu_index >= 0 && menu_index < (int)gMenuListCount)
{ // current menu item
strcpy(String, MenuList[menu_index].name);
// strcat(String, ":");
UI_PrintString(String, 0, 0, 0, 8);
// UI_PrintStringSmall(String, 0, 0, 0);
}
} }
#endif
// draw vertical separating dotted line // **************
for (i = 0; i < 7; i++)
gFrameBuffer[i][(8 * menu_list_width) + 1] = 0xAA;
// draw the menu index number/count
sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount);
UI_PrintStringSmall(String, 8, 0, 6);
// draw the little marker
if (gIsInSubMenu)
memmove(gFrameBuffer[0] + (8 * menu_list_width) + 1, BITMAP_CurrentIndicator, sizeof(BITMAP_CurrentIndicator));
memset(String, 0, sizeof(String)); memset(String, 0, sizeof(String));
@@ -397,7 +457,7 @@ void UI_DisplayMenu(void)
#endif #endif
case MENU_STEP: case MENU_STEP:
sprintf(String, "%d.%02uKHz", StepFrequencyTable[gSubMenuSelection] / 100, abs(StepFrequencyTable[gSubMenuSelection]) % 100); sprintf(String, "%d.%02ukHz", StepFrequencyTable[gSubMenuSelection] / 100, abs(StepFrequencyTable[gSubMenuSelection]) % 100);
break; break;
case MENU_TXP: case MENU_TXP:
@@ -417,11 +477,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 = (gMenuCursor == 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]);
@@ -459,6 +549,12 @@ 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: case MENU_VOX:
@@ -479,6 +575,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
@@ -495,6 +592,7 @@ void UI_DisplayMenu(void)
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
case MENU_AM_FIX: case MENU_AM_FIX:
#endif #endif
case MENU_ABR_ON_RX:
case MENU_BCL: case MENU_BCL:
case MENU_BEEP: case MENU_BEEP:
case MENU_S_ADD1: case MENU_S_ADD1:
@@ -529,7 +627,6 @@ void UI_DisplayMenu(void)
const uint32_t frequency = BOARD_fetchChannelFrequency(gSubMenuSelection); const uint32_t frequency = BOARD_fetchChannelFrequency(gSubMenuSelection);
sprintf(String, "%u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%u.%05u", frequency / 100000, frequency % 100000);
UI_PrintString(String, menu_item_x1, menu_item_x2, 4, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 4, 8);
// UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 5);
} }
already_printed = true; already_printed = true;
@@ -559,7 +656,6 @@ void UI_DisplayMenu(void)
UI_PrintString(edit, menu_item_x1, 0, 2, 8); UI_PrintString(edit, menu_item_x1, 0, 2, 8);
if (edit_index < 10) if (edit_index < 10)
UI_PrintString( "^", menu_item_x1 + (8 * edit_index), 0, 4, 8); // show the cursor UI_PrintString( "^", menu_item_x1 + (8 * edit_index), 0, 4, 8); // show the cursor
// UI_PrintStringSmall("^", menu_item_x1 + (8 * edit_index), 0, 4);
} }
if (!gAskForConfirmation) if (!gAskForConfirmation)
@@ -569,7 +665,6 @@ 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);
else else
UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8);
// UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 5);
} }
} }
@@ -673,29 +768,9 @@ void UI_DisplayMenu(void)
break; break;
case MENU_VOL: case MENU_VOL:
sprintf(String, "%u.%02uV\n%u%%",
// 1st text line gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100,
sprintf(String, "%u.%02uV", gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100); BATTERY_VoltsToPercent(gBatteryVoltageAverage));
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
{ // 2nd text line .. percentage
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
const uint16_t percent = BATTERY_VoltsToPercent(gBatteryVoltageAverage);
sprintf(String, "%u%%", percent);
UI_PrintString(String, menu_item_x1, menu_item_x2, 3, 8);
#if 0
sprintf(String, "Curr %u", gBatteryCurrent); // needs scaling into mA
UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8);
#endif
}
if(gF_LOCK){
gBatteryCalibration[3] = gSubMenuSelection;
sprintf(String, "%u", gSubMenuSelection);
UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8);
}
already_printed = true;
break; break;
case MENU_RESET: case MENU_RESET:
@@ -706,28 +781,83 @@ void UI_DisplayMenu(void)
strcpy(String, gSubMenu_F_LOCK[gSubMenuSelection]); strcpy(String, gSubMenu_F_LOCK[gSubMenuSelection]);
break; break;
case MENU_F_CALI: #ifdef ENABLE_F_CAL_MENU
{ case MENU_F_CALI:
const uint32_t value = 22656 + gSubMenuSelection; {
//gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; // already set when the user was adjusting the value const uint32_t value = 22656 + gSubMenuSelection;
BK4819_WriteRegister(BK4819_REG_3B, value); const uint32_t xtal_Hz = (0x4f0000u + value) * 5;
sprintf(String, "%d", gSubMenuSelection); //gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; // already set when the user was adjusting the value
UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8); BK4819_WriteRegister(BK4819_REG_3B, value);
const uint32_t xtal_Hz = (0x4f0000u + value) * 5; sprintf(String, "%d\n%u.%06u\nMHz",
sprintf(String, "%u.%06u", xtal_Hz / 1000000, xtal_Hz % 1000000); gSubMenuSelection,
UI_PrintString(String, menu_item_x1, menu_item_x2, 2, 8); xtal_Hz / 1000000, xtal_Hz % 1000000);
}
break;
#endif
UI_PrintString("MHz", menu_item_x1, menu_item_x2, 4, 8); case MENU_BATCAL:
{
already_printed = true; const uint16_t vol = (uint32_t)gBatteryVoltageAverage * gBatteryCalibration[3] / gSubMenuSelection;
} sprintf(String, "%u.%02uV\n%u", vol / 100, vol % 100, gSubMenuSelection);
break; break;
}
} }
if (!already_printed) if (!already_printed)
UI_PrintString(String, menu_item_x1, menu_item_x2, 2, 8); { // we now do multi-line text in a single string
unsigned int y;
unsigned int lines = 1;
unsigned int len = strlen(String);
bool small = false;
if (len > 0)
{
// count number of lines
for (i = 0; i < len; i++)
{
if (String[i] == '\n' && i < (len - 1))
{ // found new line char
lines++;
String[i] = 0; // null terminate the line
}
}
if (lines > 3)
{ // use small text
small = true;
if (lines > 7)
lines = 7;
}
// center vertically'ish
if (small)
y = 3 - ((lines + 0) / 2); // untested
else
y = 2 - ((lines + 0) / 2);
// draw the text lines
for (i = 0; i < len && lines > 0; lines--)
{
if (small)
UI_PrintStringSmall(String + i, menu_item_x1, menu_item_x2, y);
else
UI_PrintString(String + i, menu_item_x1, menu_item_x2, y, 8);
// look for start of next line
while (i < len && String[i] >= 32)
i++;
// hop over the null term char(s)
while (i < len && String[i] < 32)
i++;
y += small ? 1 : 2;
}
}
}
if (gMenuCursor == MENU_SLIST1 || gMenuCursor == MENU_SLIST2) if (gMenuCursor == MENU_SLIST1 || gMenuCursor == MENU_SLIST2)
{ {

View File

@@ -51,11 +51,12 @@ enum
MENU_SAVE, MENU_SAVE,
MENU_VOX, MENU_VOX,
MENU_ABR, MENU_ABR,
MENU_ABR_ON_RX,
MENU_TDR, MENU_TDR,
MENU_BEEP, MENU_BEEP,
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
MENU_VOICE, MENU_VOICE,
#endif #endif
MENU_SC_REV, MENU_SC_REV,
MENU_AUTOLK, MENU_AUTOLK,
MENU_S_ADD1, MENU_S_ADD1,
@@ -63,27 +64,27 @@ enum
MENU_STE, MENU_STE,
MENU_RP_STE, MENU_RP_STE,
MENU_MIC, MENU_MIC,
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
MENU_MIC_BAR, MENU_MIC_BAR,
#endif #endif
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
MENU_COMPAND, MENU_COMPAND,
#endif #endif
MENU_1_CALL, MENU_1_CALL,
MENU_S_LIST, MENU_S_LIST,
MENU_SLIST1, MENU_SLIST1,
MENU_SLIST2, MENU_SLIST2,
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
MENU_AL_MOD, MENU_AL_MOD,
#endif #endif
MENU_ANI_ID, MENU_ANI_ID,
MENU_UPCODE, MENU_UPCODE,
MENU_DWCODE, MENU_DWCODE,
MENU_PTT_ID,
MENU_D_ST, MENU_D_ST,
MENU_D_RSP, MENU_D_RSP,
MENU_D_HOLD, MENU_D_HOLD,
MENU_D_PRE, MENU_D_PRE,
MENU_PTT_ID,
MENU_D_DCD, MENU_D_DCD,
MENU_D_LIST, MENU_D_LIST,
MENU_D_LIVE_DEC, MENU_D_LIVE_DEC,
@@ -92,15 +93,15 @@ enum
MENU_VOL, MENU_VOL,
MENU_BAT_TXT, MENU_BAT_TXT,
MENU_AM, MENU_AM,
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
MENU_AM_FIX, MENU_AM_FIX,
#endif #endif
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
MENU_AM_FIX_TEST1, MENU_AM_FIX_TEST1,
#endif #endif
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
MENU_NOAA_S, MENU_NOAA_S,
#endif #endif
MENU_RESET, MENU_RESET,
// items after here are normally hidden // items after here are normally hidden
@@ -113,7 +114,10 @@ enum
MENU_SCREN, MENU_SCREN,
MENU_TX_EN, // enable TX MENU_TX_EN, // enable TX
MENU_F_CALI // reference xtal calibration #ifdef ENABLE_F_CAL_MENU
MENU_F_CALI, // reference xtal calibration
#endif
MENU_BATCAL // battery voltage calibration
}; };
extern const t_menu_item MenuList[]; extern const t_menu_item MenuList[];
@@ -124,20 +128,20 @@ 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][7]; extern const char gSubMenu_CHAN[3][10];
extern const char gSubMenu_XB[3][7]; 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][3]; extern const char gSubMenu_SC_REV[3][13];
extern const char gSubMenu_MDF[4][8]; extern const char gSubMenu_MDF[4][15];
#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][6]; extern const char gSubMenu_D_RSP[4][11];
extern const char gSubMenu_PTT_ID[4][5]; extern const char gSubMenu_PTT_ID[4][7];
extern const char gSubMenu_PONMSG[4][5]; extern const char gSubMenu_PONMSG[4][8];
extern const char gSubMenu_ROGER[3][6]; extern const char gSubMenu_ROGER[3][9];
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];

View File

@@ -45,12 +45,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
@@ -169,8 +183,7 @@ void UI_DisplayStatus(const bool test_display)
case 2: // percentage case 2: // percentage
{ {
const uint16_t percent = BATTERY_VoltsToPercent(gBatteryVoltageAverage); sprintf(s, "%u%%", BATTERY_VoltsToPercent(gBatteryVoltageAverage));
sprintf(s, "%u%%", percent);
space_needed = (7 * strlen(s)); space_needed = (7 * strlen(s));
if (x2 >= (x1 + space_needed)) if (x2 >= (x1 + space_needed))
UI_PrintStringSmallBuffer(s, line + x2 - space_needed); UI_PrintStringSmallBuffer(s, line + x2 - space_needed);
@@ -188,54 +201,35 @@ void UI_DisplayStatus(const bool test_display)
x += sizeof(BITMAP_USB_C); x += sizeof(BITMAP_USB_C);
// BATTERY LEVEL indicator // BATTERY LEVEL indicator
#if 1
if (gBatteryDisplayLevel >= 2 && !gLowBattery) if (gBatteryDisplayLevel >= 2 && !gLowBattery)
{ {
line += x; line += x;
memmove(line, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1)); memmove(line, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
#ifndef ENABLE_REVERSE_BAT_SYMBOL #ifndef ENABLE_REVERSE_BAT_SYMBOL
line += sizeof(BITMAP_BatteryLevel1); line += sizeof(BITMAP_BatteryLevel1);
if (gBatteryDisplayLevel >= 2) if (gBatteryDisplayLevel >= 2)
memmove(line - 4, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); memmove(line - 4, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 5) if (gBatteryDisplayLevel >= 3)
memmove(line - 7, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); memmove(line - 7, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 7) if (gBatteryDisplayLevel >= 4)
memmove(line - 10, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); memmove(line - 10, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 9) if (gBatteryDisplayLevel >= 5)
memmove(line - 13, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); memmove(line - 13, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
#else #else
if (gBatteryDisplayLevel >= 2) if (gBatteryDisplayLevel >= 2)
memmove(line + 3, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); memmove(line + 3, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 5) if (gBatteryDisplayLevel >= 3)
memmove(line + 6, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); memmove(line + 6, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 7) if (gBatteryDisplayLevel >= 4)
memmove(line + 9, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); memmove(line + 9, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
if (gBatteryDisplayLevel >= 9) if (gBatteryDisplayLevel >= 5)
memmove(line + 12, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel)); memmove(line + 12, BITMAP_BatteryLevel, sizeof(BITMAP_BatteryLevel));
#endif #endif
} }
else else
if (gLowBatteryBlink == 1) if (gLowBatteryBlink == 1)
memmove(line + x, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1)); memmove(line + x, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
#else
// UI_DisplayBattery(gBatteryDisplayLevel);
line += x;
if (gBatteryDisplayLevel > 0)
{
const uint8_t level = (gBatteryDisplayLevel <= 11) ? gBatteryDisplayLevel : 11;
memmove(line, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
#ifdef ENABLE_REVERSE_BAT_SYMBOL
for (uint8_t i = 0; i < level; i++)
line[3 + i] = (i & 1u) ? 0b01011101 : 0b01011101;
#else
for (uint8_t i = 0; i < level; i++)
line[sizeof(BITMAP_BatteryLevel1) - 3 - i] = (i & 1u) ? 0b01011101 : 0b01011101;
#endif
}
else
memset(line, 0, sizeof(BITMAP_BatteryLevel1));
#endif
// ************** // **************

View File

@@ -91,7 +91,6 @@ void GUI_SelectNextDisplay(GUI_DisplayType_t Display)
gAskForConfirmation = 0; gAskForConfirmation = 0;
gDTMF_InputMode = false; gDTMF_InputMode = false;
gDTMF_InputIndex = 0; gDTMF_InputIndex = 0;
gF_LOCK = false;
gAskToSave = false; gAskToSave = false;
gAskToDelete = false; gAskToDelete = false;

View File

@@ -27,6 +27,18 @@
#include "ui/status.h" #include "ui/status.h"
#include "version.h" #include "version.h"
void UI_DisplayReleaseKeys(void)
{
memset(gStatusLine, 0, sizeof(gStatusLine));
memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
UI_PrintString("RELEASE", 0, 127, 1, 10);
UI_PrintString("ALL KEYS", 0, 127, 3, 10);
ST7565_BlitStatusLine(); // blank status line
ST7565_BlitFullScreen();
}
void UI_DisplayWelcome(void) void UI_DisplayWelcome(void)
{ {
char WelcomeString0[16]; char WelcomeString0[16];

View File

@@ -17,6 +17,7 @@
#ifndef UI_WELCOME_H #ifndef UI_WELCOME_H
#define UI_WELCOME_H #define UI_WELCOME_H
void UI_DisplayReleaseKeys(void);
void UI_DisplayWelcome(void); void UI_DisplayWelcome(void);
#endif #endif

View File

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