Compare commits
62 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d0aea4587 | ||
|
|
ec2d6e4a74 | ||
|
|
b301a8d21e | ||
|
|
339e280a27 | ||
|
|
f8aaf47374 | ||
|
|
84e174544d | ||
|
|
ac05207ef0 | ||
|
|
9d5d36cc1f | ||
|
|
c5c86d0ad0 | ||
|
|
010ea0308a | ||
|
|
b3ca095af1 | ||
|
|
6a3a26c470 | ||
|
|
2551077cef | ||
|
|
2397e3950b | ||
|
|
d11e7863dc | ||
|
|
35c7530036 | ||
|
|
87d1cf7c86 | ||
|
|
bf2564b9f5 | ||
|
|
c59e0ea06c | ||
|
|
9ac3525683 | ||
|
|
3ac330ddee | ||
|
|
af342cf904 | ||
|
|
ec33203403 | ||
|
|
3c7f496f3e | ||
|
|
174c06dfbf | ||
|
|
d86ccaafcd | ||
|
|
d826ecb0ae | ||
|
|
e0aa1a83be | ||
|
|
e64bf6bbd6 | ||
|
|
aafc93c2ee | ||
|
|
58eced120e | ||
|
|
bbf8a7061e | ||
|
|
aea80cb046 | ||
|
|
4333fdeb3a | ||
|
|
a9aa37e043 | ||
|
|
1fc1a102ea | ||
|
|
86d2dade7a | ||
|
|
6f7bb75b52 | ||
|
|
82b8f6755f | ||
|
|
8caff25b7c | ||
|
|
c644b30b2f | ||
|
|
de174d072c | ||
|
|
c3c344daec | ||
|
|
fc1bc8791c | ||
|
|
5c413eb7cd | ||
|
|
fa4ae2caa6 | ||
|
|
e092145542 | ||
|
|
5ba5b9f2eb | ||
|
|
4fb8f7b0e7 | ||
|
|
0f210ff872 | ||
|
|
b45043aab2 | ||
|
|
ba3decad78 | ||
|
|
7df7461d31 | ||
|
|
b7241f77ef | ||
|
|
ae6cf797cb | ||
|
|
618a184bf1 | ||
|
|
b0f6be2c7c | ||
|
|
aba9e435f2 | ||
|
|
6546f9d4ce | ||
|
|
1eac6018ba | ||
|
|
f32eeda636 | ||
|
|
9493f34c23 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,3 +3,4 @@
|
|||||||
firmware
|
firmware
|
||||||
/firmware.packed.bin
|
/firmware.packed.bin
|
||||||
/firmware.bin
|
/firmware.bin
|
||||||
|
/compiled-firmware
|
||||||
|
|||||||
12
Dockerfile
Normal file
12
Dockerfile
Normal 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/
|
||||||
66
Makefile
66
Makefile
@@ -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 := 1
|
ENABLE_ALARM := 1
|
||||||
|
ENABLE_TX1750 := 0
|
||||||
ENABLE_BIG_FREQ := 1
|
ENABLE_BIG_FREQ := 1
|
||||||
ENABLE_SMALL_BOLD := 1
|
ENABLE_SMALL_BOLD := 1
|
||||||
ENABLE_KEEP_MEM_NAME := 1
|
ENABLE_KEEP_MEM_NAME := 1
|
||||||
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 := 1
|
||||||
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_SQUELCH1_LOWER := 0
|
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_SQUELCH1_LOWER),1)
|
ifeq ($(ENABLE_SQUELCH_MORE_SENSITIVE),1)
|
||||||
CFLAGS += -DENABLE_SQUELCH1_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
|
||||||
|
|||||||
63
README.md
63
README.md
@@ -1,10 +1,20 @@
|
|||||||
# Main features:
|
# Main features:
|
||||||
- OneOfEleven mods, including AM fix
|
- OneOfEleven mods, including AM fix
|
||||||
- fagci spectrum analyzer
|
- fagci spectrum analyzer (**F+5** to turn on)
|
||||||
- better battery percentage calculation (based on real measurement)
|
- better battery percentage calculation (based on real measurement, battery calibration recommended)
|
||||||
|
- battery calibration option available available in the menu (instructions below)
|
||||||
|
|
||||||
<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 />
|
||||||
|
|
||||||
|
❗❗❗You can now calibrate the battery voltage reading in the radio menu.
|
||||||
|
|
||||||
|
<img src="images/batcal.jpg" width=300 />
|
||||||
|
|
||||||
|
To enter the calibration:
|
||||||
|
|
||||||
|
1. turn the radio on while holding PTT and the first side button
|
||||||
|
2. go to BATCAL option and adjust the voltage with UP/DOWN buttons
|
||||||
|
3. confirm the setting, calibration will be saved to EEPROM
|
||||||
|
|
||||||
|
|
||||||
# Open reimplementation of the Quan Sheng UV-K5 v2.1.27 firmware
|
# Open reimplementation of the Quan Sheng UV-K5 v2.1.27 firmware
|
||||||
@@ -16,18 +26,21 @@ https://github.com/fagci/uv-k5-firmware-fagci-mod/tree/refactor
|
|||||||
|
|
||||||
All is a cloned and customized version of DualTachyon's open firmware found here ..
|
All is a cloned and customized version of DualTachyon's open firmware found here ..
|
||||||
|
|
||||||
https://github.com/DualTachyon/uv-k5-firmware
|
https://github.com/DualTachyon/uv-k5-firmware .. a cool achievement !
|
||||||
|
|
||||||
A cool achievement
|
Use this firmware at your own risk (entirely). There is absolutely no guarantee that it will work in any way shape or form on your radio(s), it may even brick your radio(s), in which case, you'd need to buy another radio.
|
||||||
|
Anyway, have fun.
|
||||||
|
|
||||||
# Radio performance
|
# Radio performance
|
||||||
|
|
||||||
Please note that the Quansheng uv-k radios are not professional quality transceivers, their
|
Please note that the Quansheng uv-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.
|
||||||
|
|
||||||
@@ -38,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_SQUELCH1_LOWER := 0 adjusts squelch setting '1' to be more sensitive - I 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
|
||||||
```
|
```
|
||||||
|
|||||||
14
am_fix.c
14
am_fix.c
@@ -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
|
||||||
|
|
||||||
|
|||||||
5
am_fix.h
5
am_fix.h
@@ -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];
|
||||||
|
|
||||||
|
|||||||
39
app/action.c
39
app/action.c
@@ -14,6 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "app/action.h"
|
#include "app/action.h"
|
||||||
#include "app/app.h"
|
#include "app/app.h"
|
||||||
#include "app/dtmf.h"
|
#include "app/dtmf.h"
|
||||||
@@ -107,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)
|
||||||
@@ -167,6 +169,11 @@ void ACTION_Scan(bool bRestart)
|
|||||||
|
|
||||||
gMonitor = false;
|
gMonitor = false;
|
||||||
|
|
||||||
|
DTMF_clear_RX();
|
||||||
|
|
||||||
|
gDTMF_RX_live_timeout = 0;
|
||||||
|
memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live));
|
||||||
|
|
||||||
RADIO_SelectVfos();
|
RADIO_SelectVfos();
|
||||||
|
|
||||||
#ifdef ENABLE_NOAA
|
#ifdef ENABLE_NOAA
|
||||||
@@ -228,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)
|
||||||
{
|
{
|
||||||
@@ -251,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;
|
||||||
}
|
}
|
||||||
@@ -262,7 +282,8 @@ void ACTION_Vox(void)
|
|||||||
|
|
||||||
FM_Start();
|
FM_Start();
|
||||||
|
|
||||||
gInputBoxIndex = 0;
|
gInputBoxIndex = 0;
|
||||||
|
|
||||||
gRequestDisplayScreen = DISPLAY_FM;
|
gRequestDisplayScreen = DISPLAY_FM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -361,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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
210
app/dtmf.c
210
app/dtmf.c
@@ -22,6 +22,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "app/scanner.h"
|
#include "app/scanner.h"
|
||||||
#include "bsp/dp32g030/gpio.h"
|
#include "bsp/dp32g030/gpio.h"
|
||||||
|
#include "audio.h"
|
||||||
#include "driver/bk4819.h"
|
#include "driver/bk4819.h"
|
||||||
#include "driver/eeprom.h"
|
#include "driver/eeprom.h"
|
||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
@@ -33,12 +34,16 @@
|
|||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
|
|
||||||
char gDTMF_String[15];
|
char gDTMF_String[15];
|
||||||
char gDTMF_InputBox[15];
|
|
||||||
|
|
||||||
char gDTMF_Received[16];
|
char gDTMF_InputBox[15];
|
||||||
uint8_t gDTMF_WriteIndex = 0;
|
uint8_t gDTMF_InputIndex = 0;
|
||||||
|
bool gDTMF_InputMode = false;
|
||||||
uint8_t gDTMF_PreviousIndex = 0;
|
uint8_t gDTMF_PreviousIndex = 0;
|
||||||
uint8_t gDTMF_RecvTimeout = 0;
|
|
||||||
|
char gDTMF_RX[17];
|
||||||
|
uint8_t gDTMF_RX_index = 0;
|
||||||
|
uint8_t gDTMF_RX_timeout = 0;
|
||||||
|
bool gDTMF_RX_pending = false;
|
||||||
|
|
||||||
char gDTMF_RX_live[20];
|
char gDTMF_RX_live[20];
|
||||||
uint8_t gDTMF_RX_live_timeout = 0;
|
uint8_t gDTMF_RX_live_timeout = 0;
|
||||||
@@ -48,12 +53,9 @@ char gDTMF_ID[4];
|
|||||||
char gDTMF_Caller[4];
|
char gDTMF_Caller[4];
|
||||||
char gDTMF_Callee[4];
|
char gDTMF_Callee[4];
|
||||||
DTMF_State_t gDTMF_State;
|
DTMF_State_t gDTMF_State;
|
||||||
bool gDTMF_DecodeRing;
|
|
||||||
uint8_t gDTMF_DecodeRingCountdown_500ms;
|
uint8_t gDTMF_DecodeRingCountdown_500ms;
|
||||||
uint8_t gDTMFChosenContact;
|
uint8_t gDTMFChosenContact;
|
||||||
uint8_t gDTMF_AUTO_RESET_TIME;
|
uint8_t gDTMF_AUTO_RESET_TIME;
|
||||||
uint8_t gDTMF_InputIndex;
|
|
||||||
bool gDTMF_InputMode;
|
|
||||||
DTMF_CallState_t gDTMF_CallState;
|
DTMF_CallState_t gDTMF_CallState;
|
||||||
DTMF_ReplyState_t gDTMF_ReplyState;
|
DTMF_ReplyState_t gDTMF_ReplyState;
|
||||||
DTMF_CallMode_t gDTMF_CallMode;
|
DTMF_CallMode_t gDTMF_CallMode;
|
||||||
@@ -61,14 +63,22 @@ bool gDTMF_IsTx;
|
|||||||
uint8_t gDTMF_TxStopCountdown_500ms;
|
uint8_t gDTMF_TxStopCountdown_500ms;
|
||||||
bool gDTMF_IsGroupCall;
|
bool gDTMF_IsGroupCall;
|
||||||
|
|
||||||
bool DTMF_ValidateCodes(char *pCode, uint8_t Size)
|
void DTMF_clear_RX(void)
|
||||||
|
{
|
||||||
|
gDTMF_RX_timeout = 0;
|
||||||
|
gDTMF_RX_index = 0;
|
||||||
|
gDTMF_RX_pending = false;
|
||||||
|
memset(gDTMF_RX, 0, sizeof(gDTMF_RX));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DTMF_ValidateCodes(char *pCode, const unsigned int size)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (pCode[0] == 0xFF || pCode[0] == 0)
|
if (pCode[0] == 0xFF || pCode[0] == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (i = 0; i < Size; i++)
|
for (i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
if (pCode[i] == 0xFF || pCode[i] == 0)
|
if (pCode[i] == 0xFF || pCode[i] == 0)
|
||||||
{
|
{
|
||||||
@@ -121,16 +131,16 @@ bool DTMF_FindContact(const char *pContact, char *pResult)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char DTMF_GetCharacter(const uint8_t code)
|
char DTMF_GetCharacter(const unsigned int code)
|
||||||
{
|
{
|
||||||
const char list[] = "0123456789ABCD*#";
|
const char list[] = "0123456789ABCD*#";
|
||||||
return (code < ARRAY_SIZE(list)) ? list[code] : 0xFF;
|
return (code < ARRAY_SIZE(list)) ? list[code] : 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DTMF_CompareMessage(const char *pMsg, const char *pTemplate, uint8_t Size, bool bCheckGroup)
|
bool DTMF_CompareMessage(const char *pMsg, const char *pTemplate, const unsigned int size, const bool bCheckGroup)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i = 0; i < Size; i++)
|
for (i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
if (pMsg[i] != pTemplate[i])
|
if (pMsg[i] != pTemplate[i])
|
||||||
{
|
{
|
||||||
@@ -140,58 +150,69 @@ bool DTMF_CompareMessage(const char *pMsg, const char *pTemplate, uint8_t Size,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DTMF_CALL_MODE_NOT_GROUP;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DTMF_CallMode_t DTMF_CheckGroupCall(const char *pMsg, uint32_t Size)
|
DTMF_CallMode_t DTMF_CheckGroupCall(const char *pMsg, const unsigned int size)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
unsigned int i;
|
||||||
for (i = 0; i < Size; i++)
|
for (i = 0; i < size; i++)
|
||||||
if (pMsg[i] == gEeprom.DTMF_GROUP_CALL_CODE)
|
if (pMsg[i] == gEeprom.DTMF_GROUP_CALL_CODE)
|
||||||
break;
|
break;
|
||||||
return (i != Size) ? DTMF_CALL_MODE_GROUP : DTMF_CALL_MODE_NOT_GROUP;
|
|
||||||
|
return (i < size) ? DTMF_CALL_MODE_GROUP : DTMF_CALL_MODE_NOT_GROUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DTMF_Append(char Code)
|
void DTMF_Append(const char code)
|
||||||
{
|
{
|
||||||
if (gDTMF_InputIndex == 0)
|
if (gDTMF_InputIndex == 0)
|
||||||
{
|
{
|
||||||
memset(gDTMF_InputBox, '-', sizeof(gDTMF_InputBox));
|
memset(gDTMF_InputBox, '-', sizeof(gDTMF_InputBox));
|
||||||
gDTMF_InputBox[sizeof(gDTMF_InputBox) - 1] = 0;
|
gDTMF_InputBox[sizeof(gDTMF_InputBox) - 1] = 0;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
if (gDTMF_InputIndex >= sizeof(gDTMF_InputBox))
|
|
||||||
return;
|
|
||||||
|
|
||||||
gDTMF_InputBox[gDTMF_InputIndex++] = Code;
|
if (gDTMF_InputIndex < sizeof(gDTMF_InputBox))
|
||||||
|
gDTMF_InputBox[gDTMF_InputIndex++] = code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DTMF_HandleRequest(void)
|
void DTMF_HandleRequest(void)
|
||||||
{
|
{ // proccess the RX'ed DTMF characters
|
||||||
char String[20];
|
|
||||||
uint8_t Offset;
|
|
||||||
|
|
||||||
if (!gDTMF_RequestPending)
|
char String[20];
|
||||||
return;
|
unsigned int Offset;
|
||||||
|
|
||||||
gDTMF_RequestPending = false;
|
if (!gDTMF_RX_pending)
|
||||||
|
return; // nothing new received
|
||||||
|
|
||||||
if (gScanState != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF)
|
if (gScanState != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF)
|
||||||
|
{ // we're busy scanning
|
||||||
|
DTMF_clear_RX();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED)
|
if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED)
|
||||||
|
{ // D-DCD is disabled or we're alive
|
||||||
|
DTMF_clear_RX();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gDTMF_RX_pending = false;
|
||||||
|
|
||||||
|
if (gDTMF_RX_index >= 9)
|
||||||
|
{ // look for the KILL code
|
||||||
|
|
||||||
if (gDTMF_WriteIndex >= 9)
|
|
||||||
{
|
|
||||||
Offset = gDTMF_WriteIndex - 9;
|
|
||||||
sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, gEeprom.KILL_CODE);
|
sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, gEeprom.KILL_CODE);
|
||||||
|
|
||||||
if (DTMF_CompareMessage(gDTMF_Received + Offset, String, 9, true))
|
Offset = gDTMF_RX_index - strlen(String);
|
||||||
{
|
|
||||||
|
if (DTMF_CompareMessage(gDTMF_RX + Offset, String, strlen(String), true))
|
||||||
|
{ // bugger
|
||||||
|
|
||||||
if (gEeprom.PERMIT_REMOTE_KILL)
|
if (gEeprom.PERMIT_REMOTE_KILL)
|
||||||
{
|
{
|
||||||
gSetting_KILLED = true;
|
gSetting_KILLED = true; // oooerr !
|
||||||
|
|
||||||
|
DTMF_clear_RX();
|
||||||
|
|
||||||
SETTINGS_SaveSettings();
|
SETTINGS_SaveSettings();
|
||||||
|
|
||||||
@@ -212,82 +233,117 @@ void DTMF_HandleRequest(void)
|
|||||||
|
|
||||||
gDTMF_CallState = DTMF_CALL_STATE_NONE;
|
gDTMF_CallState = DTMF_CALL_STATE_NONE;
|
||||||
|
|
||||||
gUpdateDisplay = true;
|
gUpdateDisplay = true;
|
||||||
gUpdateStatus = true;
|
gUpdateStatus = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gDTMF_RX_index >= 9)
|
||||||
|
{ // look for the REVIVE code
|
||||||
|
|
||||||
sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, gEeprom.REVIVE_CODE);
|
sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, gEeprom.REVIVE_CODE);
|
||||||
if (DTMF_CompareMessage(gDTMF_Received + Offset, String, 9, true))
|
|
||||||
{
|
Offset = gDTMF_RX_index - strlen(String);
|
||||||
|
|
||||||
|
if (DTMF_CompareMessage(gDTMF_RX + Offset, String, strlen(String), true))
|
||||||
|
{ // shit, we're back !
|
||||||
|
|
||||||
gSetting_KILLED = false;
|
gSetting_KILLED = false;
|
||||||
|
|
||||||
|
DTMF_clear_RX();
|
||||||
|
|
||||||
SETTINGS_SaveSettings();
|
SETTINGS_SaveSettings();
|
||||||
|
|
||||||
gDTMF_ReplyState = DTMF_REPLY_AB;
|
gDTMF_ReplyState = DTMF_REPLY_AB;
|
||||||
gDTMF_CallState = DTMF_CALL_STATE_NONE;
|
gDTMF_CallState = DTMF_CALL_STATE_NONE;
|
||||||
|
|
||||||
gUpdateDisplay = true;
|
gUpdateDisplay = true;
|
||||||
gUpdateStatus = true;
|
gUpdateStatus = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gDTMF_WriteIndex >= 2)
|
if (gDTMF_RX_index >= 2)
|
||||||
{
|
{ // look for ACK reply
|
||||||
if (DTMF_CompareMessage(gDTMF_Received + (gDTMF_WriteIndex - 2), "AB", 2, true))
|
|
||||||
{
|
strcpy(String, "AB");
|
||||||
gDTMF_State = DTMF_STATE_TX_SUCC;
|
|
||||||
gUpdateDisplay = true;
|
Offset = gDTMF_RX_index - strlen(String);
|
||||||
return;
|
|
||||||
|
if (DTMF_CompareMessage(gDTMF_RX + Offset, String, strlen(String), true))
|
||||||
|
{ // ends with "AB"
|
||||||
|
|
||||||
|
if (gDTMF_ReplyState != DTMF_REPLY_NONE) // 1of11
|
||||||
|
// if (gDTMF_CallState != DTMF_CALL_STATE_NONE) // 1of11
|
||||||
|
// if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) // 1of11
|
||||||
|
{
|
||||||
|
gDTMF_State = DTMF_STATE_TX_SUCC;
|
||||||
|
DTMF_clear_RX();
|
||||||
|
gUpdateDisplay = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT && gDTMF_CallMode == DTMF_CALL_MODE_NOT_GROUP && gDTMF_WriteIndex >= 9)
|
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT &&
|
||||||
{
|
gDTMF_CallMode == DTMF_CALL_MODE_NOT_GROUP &&
|
||||||
Offset = gDTMF_WriteIndex - 9;
|
gDTMF_RX_index >= 9)
|
||||||
|
{ // waiting for a reply
|
||||||
|
|
||||||
sprintf(String, "%s%c%s", gDTMF_String, gEeprom.DTMF_SEPARATE_CODE, "AAAAA");
|
sprintf(String, "%s%c%s", gDTMF_String, gEeprom.DTMF_SEPARATE_CODE, "AAAAA");
|
||||||
|
|
||||||
if (DTMF_CompareMessage(gDTMF_Received + Offset, String, 9, false))
|
Offset = gDTMF_RX_index - strlen(String);
|
||||||
{
|
|
||||||
|
if (DTMF_CompareMessage(gDTMF_RX + Offset, String, strlen(String), false))
|
||||||
|
{ // we got a response
|
||||||
gDTMF_State = DTMF_STATE_CALL_OUT_RSP;
|
gDTMF_State = DTMF_STATE_CALL_OUT_RSP;
|
||||||
|
DTMF_clear_RX();
|
||||||
gUpdateDisplay = true;
|
gUpdateDisplay = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gSetting_KILLED || gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
if (gSetting_KILLED || gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||||
|
{ // we've been killed or expecting a reply
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (gDTMF_WriteIndex >= 7)
|
if (gDTMF_RX_index >= 7)
|
||||||
{
|
{ // see if we're being called
|
||||||
Offset = gDTMF_WriteIndex - 7;
|
|
||||||
|
|
||||||
sprintf(String, "%s%c", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE);
|
|
||||||
|
|
||||||
gDTMF_IsGroupCall = false;
|
gDTMF_IsGroupCall = false;
|
||||||
|
|
||||||
if (DTMF_CompareMessage(gDTMF_Received + Offset, String, 4, true))
|
sprintf(String, "%s%c", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE);
|
||||||
{
|
|
||||||
|
Offset = gDTMF_RX_index - strlen(String) - 3;
|
||||||
|
|
||||||
|
if (DTMF_CompareMessage(gDTMF_RX + Offset, String, strlen(String), true))
|
||||||
|
{ // it's for us !
|
||||||
|
|
||||||
gDTMF_CallState = DTMF_CALL_STATE_RECEIVED;
|
gDTMF_CallState = DTMF_CALL_STATE_RECEIVED;
|
||||||
|
|
||||||
memmove(gDTMF_Callee, gDTMF_Received + Offset + 0, 3);
|
memset(gDTMF_Callee, 0, sizeof(gDTMF_Callee));
|
||||||
memmove(gDTMF_Caller, gDTMF_Received + Offset + 4, 3);
|
memset(gDTMF_Caller, 0, sizeof(gDTMF_Caller));
|
||||||
|
memmove(gDTMF_Callee, gDTMF_RX + Offset + 0, 3);
|
||||||
|
memmove(gDTMF_Caller, gDTMF_RX + Offset + 4, 3);
|
||||||
|
|
||||||
|
DTMF_clear_RX();
|
||||||
|
|
||||||
gUpdateDisplay = true;
|
gUpdateDisplay = true;
|
||||||
|
|
||||||
switch (gEeprom.DTMF_DECODE_RESPONSE)
|
switch (gEeprom.DTMF_DECODE_RESPONSE)
|
||||||
{
|
{
|
||||||
case 3:
|
case DTMF_DEC_RESPONSE_BOTH:
|
||||||
gDTMF_DecodeRing = true;
|
|
||||||
gDTMF_DecodeRingCountdown_500ms = DTMF_decode_ring_countdown_500ms;
|
gDTMF_DecodeRingCountdown_500ms = DTMF_decode_ring_countdown_500ms;
|
||||||
// Fallthrough
|
case DTMF_DEC_RESPONSE_REPLY:
|
||||||
case 2:
|
|
||||||
gDTMF_ReplyState = DTMF_REPLY_AAAAA;
|
gDTMF_ReplyState = DTMF_REPLY_AAAAA;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case DTMF_DEC_RESPONSE_RING:
|
||||||
gDTMF_DecodeRing = true;
|
|
||||||
gDTMF_DecodeRingCountdown_500ms = DTMF_decode_ring_countdown_500ms;
|
gDTMF_DecodeRingCountdown_500ms = DTMF_decode_ring_countdown_500ms;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gDTMF_DecodeRing = false;
|
case DTMF_DEC_RESPONSE_NONE:
|
||||||
|
gDTMF_DecodeRingCountdown_500ms = 0;
|
||||||
gDTMF_ReplyState = DTMF_REPLY_NONE;
|
gDTMF_ReplyState = DTMF_REPLY_NONE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -306,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)
|
||||||
{
|
{
|
||||||
@@ -320,22 +373,27 @@ void DTMF_Reply(void)
|
|||||||
pString = String;
|
pString = String;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DTMF_REPLY_AB:
|
case DTMF_REPLY_AB:
|
||||||
pString = "AB";
|
pString = "AB";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DTMF_REPLY_AAAAA:
|
case DTMF_REPLY_AAAAA:
|
||||||
sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, "AAAAA");
|
sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, "AAAAA");
|
||||||
pString = String;
|
pString = String;
|
||||||
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;
|
||||||
}
|
}
|
||||||
@@ -344,14 +402,16 @@ void DTMF_Reply(void)
|
|||||||
|
|
||||||
if (pString == NULL)
|
if (pString == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Delay = gEeprom.DTMF_PRELOAD_TIME;
|
Delay = gEeprom.DTMF_PRELOAD_TIME;
|
||||||
|
|
||||||
if (gEeprom.DTMF_SIDE_TONE)
|
if (gEeprom.DTMF_SIDE_TONE)
|
||||||
{
|
{ // the will also hear the transmitted tones
|
||||||
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
|
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
|
||||||
gEnableSpeaker = true;
|
gEnableSpeaker = true;
|
||||||
Delay = (gEeprom.DTMF_PRELOAD_TIME < 60) ? 60 : gEeprom.DTMF_PRELOAD_TIME;
|
Delay = (gEeprom.DTMF_PRELOAD_TIME < 60) ? 60 : gEeprom.DTMF_PRELOAD_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
SYSTEM_DelayMs(Delay);
|
SYSTEM_DelayMs(Delay);
|
||||||
|
|
||||||
BK4819_EnterDTMF_TX(gEeprom.DTMF_SIDE_TONE);
|
BK4819_EnterDTMF_TX(gEeprom.DTMF_SIDE_TONE);
|
||||||
|
|||||||
33
app/dtmf.h
33
app/dtmf.h
@@ -36,6 +36,13 @@ enum DTMF_CallState_t {
|
|||||||
DTMF_CALL_STATE_RECEIVED
|
DTMF_CALL_STATE_RECEIVED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum DTMF_DecodeResponse_t {
|
||||||
|
DTMF_DEC_RESPONSE_NONE = 0,
|
||||||
|
DTMF_DEC_RESPONSE_RING,
|
||||||
|
DTMF_DEC_RESPONSE_REPLY,
|
||||||
|
DTMF_DEC_RESPONSE_BOTH
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum DTMF_CallState_t DTMF_CallState_t;
|
typedef enum DTMF_CallState_t DTMF_CallState_t;
|
||||||
|
|
||||||
enum DTMF_ReplyState_t {
|
enum DTMF_ReplyState_t {
|
||||||
@@ -56,12 +63,16 @@ enum DTMF_CallMode_t {
|
|||||||
typedef enum DTMF_CallMode_t DTMF_CallMode_t;
|
typedef enum DTMF_CallMode_t DTMF_CallMode_t;
|
||||||
|
|
||||||
extern char gDTMF_String[15];
|
extern char gDTMF_String[15];
|
||||||
extern char gDTMF_InputBox[15];
|
|
||||||
|
|
||||||
extern char gDTMF_Received[16];
|
extern char gDTMF_InputBox[15];
|
||||||
extern uint8_t gDTMF_WriteIndex;
|
extern uint8_t gDTMF_InputIndex;
|
||||||
|
extern bool gDTMF_InputMode;
|
||||||
extern uint8_t gDTMF_PreviousIndex;
|
extern uint8_t gDTMF_PreviousIndex;
|
||||||
extern uint8_t gDTMF_RecvTimeout;
|
|
||||||
|
extern char gDTMF_RX[17];
|
||||||
|
extern uint8_t gDTMF_RX_index;
|
||||||
|
extern uint8_t gDTMF_RX_timeout;
|
||||||
|
extern bool gDTMF_RX_pending;
|
||||||
|
|
||||||
extern char gDTMF_RX_live[20];
|
extern char gDTMF_RX_live[20];
|
||||||
extern uint8_t gDTMF_RX_live_timeout;
|
extern uint8_t gDTMF_RX_live_timeout;
|
||||||
@@ -71,25 +82,23 @@ extern char gDTMF_ID[4];
|
|||||||
extern char gDTMF_Caller[4];
|
extern char gDTMF_Caller[4];
|
||||||
extern char gDTMF_Callee[4];
|
extern char gDTMF_Callee[4];
|
||||||
extern DTMF_State_t gDTMF_State;
|
extern DTMF_State_t gDTMF_State;
|
||||||
extern bool gDTMF_DecodeRing;
|
|
||||||
extern uint8_t gDTMF_DecodeRingCountdown_500ms;
|
extern uint8_t gDTMF_DecodeRingCountdown_500ms;
|
||||||
extern uint8_t gDTMFChosenContact;
|
extern uint8_t gDTMFChosenContact;
|
||||||
extern uint8_t gDTMF_AUTO_RESET_TIME;
|
extern uint8_t gDTMF_AUTO_RESET_TIME;
|
||||||
extern uint8_t gDTMF_InputIndex;
|
|
||||||
extern bool gDTMF_InputMode;
|
|
||||||
extern DTMF_CallState_t gDTMF_CallState;
|
extern DTMF_CallState_t gDTMF_CallState;
|
||||||
extern DTMF_ReplyState_t gDTMF_ReplyState;
|
extern DTMF_ReplyState_t gDTMF_ReplyState;
|
||||||
extern DTMF_CallMode_t gDTMF_CallMode;
|
extern DTMF_CallMode_t gDTMF_CallMode;
|
||||||
extern bool gDTMF_IsTx;
|
extern bool gDTMF_IsTx;
|
||||||
extern uint8_t gDTMF_TxStopCountdown_500ms;
|
extern uint8_t gDTMF_TxStopCountdown_500ms;
|
||||||
|
|
||||||
bool DTMF_ValidateCodes(char *pCode, uint8_t Size);
|
void DTMF_clear_RX(void);
|
||||||
|
bool DTMF_ValidateCodes(char *pCode, const unsigned int size);
|
||||||
bool DTMF_GetContact(const int Index, char *pContact);
|
bool DTMF_GetContact(const int Index, char *pContact);
|
||||||
bool DTMF_FindContact(const char *pContact, char *pResult);
|
bool DTMF_FindContact(const char *pContact, char *pResult);
|
||||||
char DTMF_GetCharacter(const uint8_t code);
|
char DTMF_GetCharacter(const unsigned int code);
|
||||||
bool DTMF_CompareMessage(const char *pDTMF, const char *pTemplate, uint8_t Size, bool bFlag);
|
bool DTMF_CompareMessage(const char *pDTMF, const char *pTemplate, const unsigned int size, const bool bFlag);
|
||||||
DTMF_CallMode_t DTMF_CheckGroupCall(const char *pDTMF, uint32_t Size);
|
DTMF_CallMode_t DTMF_CheckGroupCall(const char *pDTMF, const unsigned int size);
|
||||||
void DTMF_Append(char Code);
|
void DTMF_Append(const char vode);
|
||||||
void DTMF_HandleRequest(void);
|
void DTMF_HandleRequest(void);
|
||||||
void DTMF_Reply(void);
|
void DTMF_Reply(void);
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld)
|
|||||||
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
if (gFM_ScanState == FM_SCAN_OFF)
|
if (gFM_ScanState == FM_SCAN_OFF)
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
@@ -247,11 +254,10 @@ void GENERIC_Key_PTT(bool bKeyPressed)
|
|||||||
gRequestDisplayScreen = DISPLAY_FM;
|
gRequestDisplayScreen = DISPLAY_FM;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ENABLE_VOICE
|
#ifdef ENABLE_VOICE
|
||||||
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
|
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gPttWasPressed = true;
|
gPttWasPressed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
68
app/main.c
68
app/main.c
@@ -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;
|
||||||
@@ -458,9 +463,17 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
|||||||
static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
|
static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
|
||||||
{
|
{
|
||||||
if (!bKeyHeld && bKeyPressed)
|
if (!bKeyHeld && bKeyPressed)
|
||||||
{
|
{ // exit key pressed
|
||||||
|
|
||||||
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||||
|
|
||||||
|
if (gDTMF_CallState != DTMF_CALL_STATE_NONE && gCurrentFunction != FUNCTION_TRANSMIT)
|
||||||
|
{ // clear CALL mode being displayed
|
||||||
|
gDTMF_CallState = DTMF_CALL_STATE_NONE;
|
||||||
|
gUpdateDisplay = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
if (!gFmRadioMode)
|
if (!gFmRadioMode)
|
||||||
#endif
|
#endif
|
||||||
@@ -499,7 +512,8 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bKeyHeld && bKeyPressed)
|
if (bKeyHeld && bKeyPressed)
|
||||||
{
|
{ // exit key held down
|
||||||
|
|
||||||
if (gInputBoxIndex > 0)
|
if (gInputBoxIndex > 0)
|
||||||
{ // cancel key input mode (channel/frequency entry)
|
{ // cancel key input mode (channel/frequency entry)
|
||||||
gDTMF_InputMode = false;
|
gDTMF_InputMode = false;
|
||||||
@@ -515,7 +529,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
|
|||||||
static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
|
static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
|
||||||
{
|
{
|
||||||
if (bKeyHeld)
|
if (bKeyHeld)
|
||||||
{ // key held down (long press)
|
{ // menu key held down (long press)
|
||||||
|
|
||||||
if (bKeyPressed)
|
if (bKeyPressed)
|
||||||
{
|
{
|
||||||
@@ -566,6 +580,7 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
|
|||||||
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: finish this
|
||||||
|
|
||||||
//gEeprom.RX_CHANNEL = () & 1; // swap to the VFO
|
//gEeprom.RX_CHANNEL = () & 1; // swap to the VFO
|
||||||
|
|
||||||
@@ -583,17 +598,19 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bKeyPressed)
|
if (!bKeyPressed && !gDTMF_InputMode)
|
||||||
{
|
{ // menu key released
|
||||||
bool bFlag;
|
const bool bFlag = (gInputBoxIndex == 0);
|
||||||
|
gInputBoxIndex = 0;
|
||||||
|
|
||||||
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||||
bFlag = (gInputBoxIndex == 0);
|
|
||||||
gInputBoxIndex = 0;
|
|
||||||
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
|
||||||
@@ -638,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;
|
||||||
}
|
}
|
||||||
@@ -725,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;
|
||||||
@@ -795,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;
|
||||||
|
|||||||
186
app/menu.c
186
app/menu.c
@@ -32,6 +32,7 @@
|
|||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
#include "driver/keyboard.h"
|
#include "driver/keyboard.h"
|
||||||
#include "frequencies.h"
|
#include "frequencies.h"
|
||||||
|
#include "helper/battery.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#if defined(ENABLE_OVERLAY)
|
#if defined(ENABLE_OVERLAY)
|
||||||
@@ -46,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;
|
||||||
@@ -109,11 +131,15 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_TDR:
|
case MENU_TDR:
|
||||||
case MENU_XB:
|
|
||||||
*pMin = 0;
|
*pMin = 0;
|
||||||
*pMax = ARRAY_SIZE(gSubMenu_CHAN) - 1;
|
*pMax = ARRAY_SIZE(gSubMenu_CHAN) - 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MENU_XB:
|
||||||
|
*pMin = 0;
|
||||||
|
*pMax = ARRAY_SIZE(gSubMenu_XB) - 1;
|
||||||
|
break;
|
||||||
|
|
||||||
#ifdef ENABLE_VOICE
|
#ifdef ENABLE_VOICE
|
||||||
case MENU_VOICE:
|
case MENU_VOICE:
|
||||||
*pMin = 0;
|
*pMin = 0;
|
||||||
@@ -186,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:
|
||||||
@@ -264,6 +291,11 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
|
|||||||
*pMax = ARRAY_SIZE(gSubMenu_PTT_ID) - 1;
|
*pMax = ARRAY_SIZE(gSubMenu_PTT_ID) - 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MENU_VOL:
|
||||||
|
*pMin = 0;
|
||||||
|
*pMax = 2300;
|
||||||
|
break;
|
||||||
|
|
||||||
case MENU_BAT_TXT:
|
case MENU_BAT_TXT:
|
||||||
*pMin = 0;
|
*pMin = 0;
|
||||||
*pMax = ARRAY_SIZE(gSubMenu_BAT_TXT) - 1;
|
*pMax = ARRAY_SIZE(gSubMenu_BAT_TXT) - 1;
|
||||||
@@ -284,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:
|
||||||
@@ -368,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)
|
||||||
{
|
{
|
||||||
@@ -380,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;
|
||||||
|
|
||||||
@@ -408,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;
|
||||||
|
|
||||||
@@ -462,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;
|
||||||
@@ -542,11 +594,14 @@ void MENU_AcceptSetting(void)
|
|||||||
gSetting_mic_bar = gSubMenuSelection;
|
gSetting_mic_bar = gSubMenuSelection;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#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
|
||||||
|
|
||||||
@@ -585,19 +640,26 @@ void MENU_AcceptSetting(void)
|
|||||||
gRequestSaveChannel = 1;
|
gRequestSaveChannel = 1;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case MENU_VOL:
|
||||||
|
if(gF_LOCK) {
|
||||||
|
EEPROM_WriteBuffer(0x1F40, gBatteryCalibration);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case MENU_BAT_TXT:
|
case MENU_BAT_TXT:
|
||||||
gSetting_battery_text = gSubMenuSelection;
|
gSetting_battery_text = gSubMenuSelection;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_D_DCD:
|
case MENU_D_DCD:
|
||||||
gTxVfo->DTMF_DECODING_ENABLE = gSubMenuSelection;
|
gTxVfo->DTMF_DECODING_ENABLE = gSubMenuSelection;
|
||||||
gRequestSaveChannel = 1;
|
DTMF_clear_RX();
|
||||||
|
gRequestSaveChannel = 1;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case MENU_D_LIVE_DEC:
|
case MENU_D_LIVE_DEC:
|
||||||
gDTMF_RX_live_timeout = 0;
|
|
||||||
gDTMF_RX_live[0] = '\0';
|
|
||||||
gSetting_live_DTMF_decoder = gSubMenuSelection;
|
gSetting_live_DTMF_decoder = gSubMenuSelection;
|
||||||
|
gDTMF_RX_live_timeout = 0;
|
||||||
|
memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live));
|
||||||
if (!gSetting_live_DTMF_decoder)
|
if (!gSetting_live_DTMF_decoder)
|
||||||
BK4819_DisableDTMF();
|
BK4819_DisableDTMF();
|
||||||
gFlagReconfigureVfos = true;
|
gFlagReconfigureVfos = true;
|
||||||
@@ -693,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;
|
||||||
@@ -880,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;
|
||||||
@@ -939,7 +995,7 @@ void MENU_ShowCurrentSetting(void)
|
|||||||
gSubMenuSelection = gSetting_mic_bar;
|
gSubMenuSelection = gSetting_mic_bar;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ENABLE_COMPANDER
|
#ifdef ENABLE_COMPANDER
|
||||||
case MENU_COMPAND:
|
case MENU_COMPAND:
|
||||||
gSubMenuSelection = gTxVfo->Compander;
|
gSubMenuSelection = gTxVfo->Compander;
|
||||||
@@ -988,6 +1044,10 @@ void MENU_ShowCurrentSetting(void)
|
|||||||
gSubMenuSelection = gTxVfo->DTMF_PTT_ID_TX_MODE;
|
gSubMenuSelection = gTxVfo->DTMF_PTT_ID_TX_MODE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MENU_VOL:
|
||||||
|
gSubMenuSelection = gBatteryCalibration[3];
|
||||||
|
return;
|
||||||
|
|
||||||
case MENU_BAT_TXT:
|
case MENU_BAT_TXT:
|
||||||
gSubMenuSelection = gSetting_battery_text;
|
gSubMenuSelection = gSetting_battery_text;
|
||||||
return;
|
return;
|
||||||
@@ -1021,7 +1081,7 @@ void MENU_ShowCurrentSetting(void)
|
|||||||
gSubMenuSelection = gSetting_AM_fix;
|
gSubMenuSelection = gSetting_AM_fix;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ENABLE_AM_FIX_TEST1
|
#ifdef ENABLE_AM_FIX_TEST1
|
||||||
case MENU_AM_FIX_TEST1:
|
case MENU_AM_FIX_TEST1:
|
||||||
gSubMenuSelection = gSetting_AM_fix_test1;
|
gSubMenuSelection = gSetting_AM_fix_test1;
|
||||||
@@ -1070,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1122,7 +1191,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
|||||||
gInputBoxIndex = 0;
|
gInputBoxIndex = 0;
|
||||||
|
|
||||||
Value = (gInputBox[0] * 10) + gInputBox[1];
|
Value = (gInputBox[0] * 10) + gInputBox[1];
|
||||||
|
|
||||||
if (Value > 0 && Value <= gMenuListCount)
|
if (Value > 0 && Value <= gMenuListCount)
|
||||||
{
|
{
|
||||||
gMenuCursor = Value - 1;
|
gMenuCursor = Value - 1;
|
||||||
@@ -1135,7 +1204,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
|||||||
|
|
||||||
gInputBox[0] = gInputBox[1];
|
gInputBox[0] = gInputBox[1];
|
||||||
gInputBoxIndex = 1;
|
gInputBoxIndex = 1;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
Value = gInputBox[0];
|
Value = gInputBox[0];
|
||||||
if (Value > 0 && Value <= gMenuListCount)
|
if (Value > 0 && Value <= gMenuListCount)
|
||||||
@@ -1264,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;
|
||||||
}
|
}
|
||||||
@@ -1273,7 +1344,7 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||||
|
|
||||||
if (gEeprom.BACKLIGHT == 0)
|
if (gEeprom.BACKLIGHT == 0)
|
||||||
{
|
{
|
||||||
gBacklightCountdown = 0;
|
gBacklightCountdown = 0;
|
||||||
@@ -1317,8 +1388,12 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
|
|||||||
|
|
||||||
gAskForConfirmation = 0;
|
gAskForConfirmation = 0;
|
||||||
gIsInSubMenu = true;
|
gIsInSubMenu = true;
|
||||||
gInputBoxIndex = 0;
|
|
||||||
edit_index = -1;
|
// if (gMenuCursor != MENU_D_LIST)
|
||||||
|
{
|
||||||
|
gInputBoxIndex = 0;
|
||||||
|
edit_index = -1;
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1545,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)
|
||||||
@@ -1554,7 +1631,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
|
|||||||
gBacklightCountdown = 0;
|
gBacklightCountdown = 0;
|
||||||
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
|
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1590,7 +1667,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
|
|||||||
bCheckScanList = true;
|
bCheckScanList = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
MENU_ClampSelection(Direction);
|
MENU_ClampSelection(Direction);
|
||||||
gRequestDisplayScreen = DISPLAY_MENU;
|
gRequestDisplayScreen = DISPLAY_MENU;
|
||||||
return;
|
return;
|
||||||
@@ -1665,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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "app/dtmf.h"
|
||||||
#include "app/generic.h"
|
#include "app/generic.h"
|
||||||
#include "app/scanner.h"
|
#include "app/scanner.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
@@ -91,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;
|
||||||
@@ -223,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)
|
||||||
{
|
{
|
||||||
@@ -366,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;
|
||||||
@@ -399,12 +401,13 @@ void SCANNER_Start(void)
|
|||||||
gUpdateStatus = true;
|
gUpdateStatus = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DTMF_clear_RX();
|
||||||
|
|
||||||
gScanDelay_10ms = scan_delay_10ms;
|
gScanDelay_10ms = scan_delay_10ms;
|
||||||
gScanCssResultCode = 0xFF;
|
gScanCssResultCode = 0xFF;
|
||||||
gScanCssResultType = 0xFF;
|
gScanCssResultType = 0xFF;
|
||||||
gScanHitCount = 0;
|
gScanHitCount = 0;
|
||||||
gScanUseCssResult = false;
|
gScanUseCssResult = false;
|
||||||
gDTMF_RequestPending = false;
|
|
||||||
g_CxCSS_TAIL_Found = false;
|
g_CxCSS_TAIL_Found = false;
|
||||||
g_CDCSS_Lost = false;
|
g_CDCSS_Lost = false;
|
||||||
gCDCSSCodeType = 0;
|
gCDCSSCodeType = 0;
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ PeakInfo peak;
|
|||||||
ScanInfo scanInfo;
|
ScanInfo scanInfo;
|
||||||
KeyboardState kbd = {KEY_INVALID, KEY_INVALID, 0};
|
KeyboardState kbd = {KEY_INVALID, KEY_INVALID, 0};
|
||||||
|
|
||||||
const char *bwOptions[] = {"25k", "12.5k", "6.25k"};
|
const char *bwOptions[] = {" 25k", "12.5k", "6.25k"};
|
||||||
const char *modulationTypeOptions[] = {"FM", "AM", "USB"};
|
const char *modulationTypeOptions[] = {" FM", " AM", "USB"};
|
||||||
const uint8_t modulationTypeTuneSteps[] = {100, 50, 10};
|
const uint8_t modulationTypeTuneSteps[] = {100, 50, 10};
|
||||||
const uint8_t modTypeReg47Values[] = {1, 7, 5};
|
const uint8_t modTypeReg47Values[] = {1, 7, 5};
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ SpectrumSettings settings = {STEPS_64,
|
|||||||
S_STEP_25_0kHz,
|
S_STEP_25_0kHz,
|
||||||
80000,
|
80000,
|
||||||
3200,
|
3200,
|
||||||
0,
|
150,
|
||||||
true,
|
true,
|
||||||
BK4819_FILTER_BW_WIDE,
|
BK4819_FILTER_BW_WIDE,
|
||||||
BK4819_FILTER_BW_WIDE,
|
BK4819_FILTER_BW_WIDE,
|
||||||
@@ -259,8 +259,9 @@ static void SetF(uint32_t f) {
|
|||||||
|
|
||||||
BK4819_SetFrequency(fMeasure);
|
BK4819_SetFrequency(fMeasure);
|
||||||
BK4819_PickRXFilterPathBasedOnFrequency(fMeasure);
|
BK4819_PickRXFilterPathBasedOnFrequency(fMeasure);
|
||||||
|
uint16_t reg = BK4819_ReadRegister(BK4819_REG_30);
|
||||||
BK4819_WriteRegister(BK4819_REG_30, 0);
|
BK4819_WriteRegister(BK4819_REG_30, 0);
|
||||||
BK4819_WriteRegister(BK4819_REG_30, 0xbff1);
|
BK4819_WriteRegister(BK4819_REG_30, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spectrum related
|
// Spectrum related
|
||||||
@@ -294,12 +295,16 @@ static void DeInitSpectrum() {
|
|||||||
isInitialized = false;
|
isInitialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t GetBWRegValueForScan() { return scanStepBWRegValues[0]; }
|
uint8_t GetBWRegValueForScan() {
|
||||||
|
return scanStepBWRegValues[settings.scanStepIndex];
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t GetRssi() {
|
uint16_t GetRssi() {
|
||||||
SYSTICK_DelayUs(settings.scanDelay);
|
// SYSTICK_DelayUs(800);
|
||||||
/* while ((BK4819_ReadRegister(0x63) & 0b11111111) >= 255)
|
// testing autodelay based on Glitch value
|
||||||
; */
|
while ((BK4819_ReadRegister(0x63) & 0b11111111) >= 255) {
|
||||||
|
SYSTICK_DelayUs(100);
|
||||||
|
}
|
||||||
return BK4819_GetRSSI();
|
return BK4819_GetRSSI();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,7 +366,9 @@ static void RelaunchScan() {
|
|||||||
InitScan();
|
InitScan();
|
||||||
ResetPeak();
|
ResetPeak();
|
||||||
ToggleRX(false);
|
ToggleRX(false);
|
||||||
|
#ifdef SPECTRUM_AUTOMATIC_SQUELCH
|
||||||
settings.rssiTriggerLevel = RSSI_MAX_VALUE;
|
settings.rssiTriggerLevel = RSSI_MAX_VALUE;
|
||||||
|
#endif
|
||||||
preventKeypress = true;
|
preventKeypress = true;
|
||||||
scanInfo.rssiMin = RSSI_MAX_VALUE;
|
scanInfo.rssiMin = RSSI_MAX_VALUE;
|
||||||
}
|
}
|
||||||
@@ -409,6 +416,7 @@ static void UpdateRssiTriggerLevel(bool inc) {
|
|||||||
else
|
else
|
||||||
settings.rssiTriggerLevel -= 2;
|
settings.rssiTriggerLevel -= 2;
|
||||||
redrawScreen = true;
|
redrawScreen = true;
|
||||||
|
redrawStatus = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UpdateDBMax(bool inc) {
|
static void UpdateDBMax(bool inc) {
|
||||||
@@ -419,8 +427,8 @@ static void UpdateDBMax(bool inc) {
|
|||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// RelaunchScan();
|
|
||||||
redrawStatus = true;
|
redrawStatus = true;
|
||||||
|
redrawScreen = true;
|
||||||
SYSTEM_DelayMs(20);
|
SYSTEM_DelayMs(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,7 +443,7 @@ static void UpdateScanStep(bool inc) {
|
|||||||
settings.frequencyChangeStep = GetBW() >> 1;
|
settings.frequencyChangeStep = GetBW() >> 1;
|
||||||
RelaunchScan();
|
RelaunchScan();
|
||||||
ResetBlacklist();
|
ResetBlacklist();
|
||||||
redrawStatus = true;
|
redrawScreen = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UpdateCurrentFreq(bool inc) {
|
static void UpdateCurrentFreq(bool inc) {
|
||||||
@@ -511,7 +519,7 @@ static void ToggleStepsCount() {
|
|||||||
settings.frequencyChangeStep = GetBW() >> 1;
|
settings.frequencyChangeStep = GetBW() >> 1;
|
||||||
RelaunchScan();
|
RelaunchScan();
|
||||||
ResetBlacklist();
|
ResetBlacklist();
|
||||||
redrawStatus = true;
|
redrawScreen = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ResetFreqInput() {
|
static void ResetFreqInput() {
|
||||||
@@ -584,14 +592,15 @@ static void Blacklist() {
|
|||||||
|
|
||||||
// Draw things
|
// Draw things
|
||||||
|
|
||||||
|
// applied x2 to prevent initial rounding
|
||||||
uint8_t Rssi2PX(uint16_t rssi, uint8_t pxMin, uint8_t pxMax) {
|
uint8_t Rssi2PX(uint16_t rssi, uint8_t pxMin, uint8_t pxMax) {
|
||||||
const int DB_MIN = settings.dbMin;
|
const int DB_MIN = settings.dbMin << 1;
|
||||||
const int DB_MAX = settings.dbMax;
|
const int DB_MAX = settings.dbMax << 1;
|
||||||
const int DB_RANGE = DB_MAX - DB_MIN;
|
const int DB_RANGE = DB_MAX - DB_MIN;
|
||||||
|
|
||||||
const uint8_t PX_RANGE = pxMax - pxMin;
|
const uint8_t PX_RANGE = pxMax - pxMin;
|
||||||
|
|
||||||
int dbm = clamp(Rssi2DBm(rssi), DB_MIN, DB_MAX);
|
int dbm = clamp(rssi - (160 << 1), DB_MIN, DB_MAX);
|
||||||
|
|
||||||
return ((dbm - DB_MIN) * PX_RANGE + DB_RANGE / 2) / DB_RANGE + pxMin;
|
return ((dbm - DB_MIN) * PX_RANGE + DB_RANGE / 2) / DB_RANGE + pxMin;
|
||||||
}
|
}
|
||||||
@@ -610,8 +619,14 @@ static void DrawSpectrum() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void DrawStatus() {
|
static void DrawStatus() {
|
||||||
|
#ifdef SPECTRUM_EXTRA_VALUES
|
||||||
|
sprintf(String, "%d/%d P:%d T:%d", settings.dbMin, settings.dbMax,
|
||||||
|
Rssi2DBm(peak.rssi), Rssi2DBm(settings.rssiTriggerLevel));
|
||||||
|
#else
|
||||||
sprintf(String, "%d/%d", settings.dbMin, settings.dbMax);
|
sprintf(String, "%d/%d", settings.dbMin, settings.dbMax);
|
||||||
GUI_DisplaySmallest(String, 0, 2, true, true);
|
#endif
|
||||||
|
GUI_DisplaySmallest(String, 0, 1, true, true);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
BOARD_ADC_GetBatteryInfo(&gBatteryVoltages[i], &gBatteryCurrent);
|
BOARD_ADC_GetBatteryInfo(&gBatteryVoltages[i], &gBatteryCurrent);
|
||||||
}
|
}
|
||||||
@@ -653,19 +668,15 @@ static void DrawStatus() {
|
|||||||
|
|
||||||
static void DrawF(uint32_t f) {
|
static void DrawF(uint32_t f) {
|
||||||
sprintf(String, "%u.%05u", f / 100000, f % 100000);
|
sprintf(String, "%u.%05u", f / 100000, f % 100000);
|
||||||
UI_PrintStringSmall(String, 0, 127, 0);
|
UI_PrintStringSmall(String, 8, 127, 0);
|
||||||
|
|
||||||
sprintf(String, "%s", modulationTypeOptions[settings.modulationType]);
|
sprintf(String, "%s", modulationTypeOptions[settings.modulationType]);
|
||||||
GUI_DisplaySmallest(String, 115, 1, false, true);
|
GUI_DisplaySmallest(String, 116, 1, false, true);
|
||||||
sprintf(String, "%s", bwOptions[settings.listenBw]);
|
sprintf(String, "%s", bwOptions[settings.listenBw]);
|
||||||
GUI_DisplaySmallest(String, 107, 7, false, true);
|
GUI_DisplaySmallest(String, 108, 7, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DrawNums() {
|
static void DrawNums() {
|
||||||
sprintf(String, "P:%d", Rssi2DBm(peak.rssi));
|
|
||||||
GUI_DisplaySmallest(String, 32, 8, false, true);
|
|
||||||
sprintf(String, "T:%d", Rssi2DBm(settings.rssiTriggerLevel));
|
|
||||||
GUI_DisplaySmallest(String, 64, 8, false, true);
|
|
||||||
|
|
||||||
if (currentState == SPECTRUM) {
|
if (currentState == SPECTRUM) {
|
||||||
sprintf(String, "%ux", GetStepsCount());
|
sprintf(String, "%ux", GetStepsCount());
|
||||||
@@ -966,8 +977,6 @@ static void RenderStill() {
|
|||||||
GUI_DisplaySmallest(String, 4, 25, false, true);
|
GUI_DisplaySmallest(String, 4, 25, false, true);
|
||||||
sprintf(String, "%d dBm", dbm);
|
sprintf(String, "%d dBm", dbm);
|
||||||
GUI_DisplaySmallest(String, 28, 25, false, true);
|
GUI_DisplaySmallest(String, 28, 25, false, true);
|
||||||
sprintf(String, "V: %d", scanInfo.rssi);
|
|
||||||
GUI_DisplaySmallest(String, 64, 25, false, true);
|
|
||||||
|
|
||||||
if (!monitorMode) {
|
if (!monitorMode) {
|
||||||
uint8_t x = Rssi2PX(settings.rssiTriggerLevel, 0, 121);
|
uint8_t x = Rssi2PX(settings.rssiTriggerLevel, 0, 121);
|
||||||
@@ -1107,7 +1116,6 @@ static void UpdateListening() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (currentState == SPECTRUM) {
|
if (currentState == SPECTRUM) {
|
||||||
SetF(fMeasure);
|
|
||||||
BK4819_WriteRegister(0x43, GetBWRegValueForScan());
|
BK4819_WriteRegister(0x43, GetBWRegValueForScan());
|
||||||
Measure();
|
Measure();
|
||||||
BK4819_WriteRegister(0x43, listenBWRegValues[settings.listenBw]);
|
BK4819_WriteRegister(0x43, listenBWRegValues[settings.listenBw]);
|
||||||
@@ -1167,7 +1175,7 @@ void APP_RunSpectrum() {
|
|||||||
redrawScreen = false; // we will wait until scan done
|
redrawScreen = false; // we will wait until scan done
|
||||||
newScanStart = true;
|
newScanStart = true;
|
||||||
|
|
||||||
ToggleRX(false);
|
ToggleRX(true), ToggleRX(false); // hack to prevent noise when squelch off
|
||||||
SetModulation(settings.modulationType = MOD_FM);
|
SetModulation(settings.modulationType = MOD_FM);
|
||||||
BK4819_SetFilterBandwidth(settings.listenBw = BK4819_FILTER_BW_WIDE, false);
|
BK4819_SetFilterBandwidth(settings.listenBw = BK4819_FILTER_BW_WIDE, false);
|
||||||
|
|
||||||
|
|||||||
15
app/uart.c
15
app/uart.c
@@ -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();
|
||||||
|
|||||||
22
audio.c
22
audio.c
@@ -76,7 +76,12 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
|
|||||||
uint16_t ToneFrequency;
|
uint16_t ToneFrequency;
|
||||||
uint16_t Duration;
|
uint16_t Duration;
|
||||||
|
|
||||||
if (Beep != BEEP_880HZ_60MS_TRIPLE_BEEP && Beep != BEEP_500HZ_60MS_DOUBLE_BEEP && Beep != BEEP_440HZ_500MS && !gEeprom.BEEP_CONTROL)
|
if (Beep != BEEP_880HZ_60MS_TRIPLE_BEEP &&
|
||||||
|
Beep != BEEP_500HZ_60MS_DOUBLE_BEEP &&
|
||||||
|
Beep != BEEP_440HZ_500MS &&
|
||||||
|
Beep != BEEP_880HZ_200MS &&
|
||||||
|
Beep != BEEP_880HZ_500MS &&
|
||||||
|
!gEeprom.BEEP_CONTROL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef ENABLE_AIRCOPY
|
#ifdef ENABLE_AIRCOPY
|
||||||
@@ -123,6 +128,8 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
|
|||||||
break;
|
break;
|
||||||
case BEEP_880HZ_40MS_OPTIONAL:
|
case BEEP_880HZ_40MS_OPTIONAL:
|
||||||
case BEEP_880HZ_60MS_TRIPLE_BEEP:
|
case BEEP_880HZ_60MS_TRIPLE_BEEP:
|
||||||
|
case BEEP_880HZ_200MS:
|
||||||
|
case BEEP_880HZ_500MS:
|
||||||
ToneFrequency = 880;
|
ToneFrequency = 880;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -161,7 +168,13 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
|
|||||||
Duration = 40;
|
Duration = 40;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case BEEP_880HZ_200MS:
|
||||||
|
BK4819_ExitTxMute();
|
||||||
|
Duration = 200;
|
||||||
|
break;
|
||||||
|
|
||||||
case BEEP_440HZ_500MS:
|
case BEEP_440HZ_500MS:
|
||||||
|
case BEEP_880HZ_500MS:
|
||||||
default:
|
default:
|
||||||
BK4819_ExitTxMute();
|
BK4819_ExitTxMute();
|
||||||
Duration = 500;
|
Duration = 500;
|
||||||
@@ -266,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)
|
||||||
|
|||||||
2
audio.h
2
audio.h
@@ -26,6 +26,8 @@ enum BEEP_Type_t
|
|||||||
BEEP_1KHZ_60MS_OPTIONAL,
|
BEEP_1KHZ_60MS_OPTIONAL,
|
||||||
BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL,
|
BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL,
|
||||||
BEEP_440HZ_500MS,
|
BEEP_440HZ_500MS,
|
||||||
|
BEEP_880HZ_200MS,
|
||||||
|
BEEP_880HZ_500MS,
|
||||||
BEEP_500HZ_60MS_DOUBLE_BEEP,
|
BEEP_500HZ_60MS_DOUBLE_BEEP,
|
||||||
BEEP_440HZ_40MS_OPTIONAL,
|
BEEP_440HZ_40MS_OPTIONAL,
|
||||||
BEEP_880HZ_40MS_OPTIONAL,
|
BEEP_880HZ_40MS_OPTIONAL,
|
||||||
|
|||||||
28
bitmaps.c
28
bitmaps.c
@@ -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,
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
3
board.c
3
board.c
@@ -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
4
compile-with-docker.bat
Normal 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
3
compile-with-docker.sh
Normal 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
2
dcs.c
@@ -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
2
dcs.h
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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,9 +850,18 @@ 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
|
||||||
//
|
//
|
||||||
// REG_28 <15:14> 01 Expander (AF Rx) Ratio
|
// REG_28 <15:14> 01 Expander (AF Rx) 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)
|
||||||
@@ -891,7 +911,7 @@ void BK4819_EnableDTMF(void)
|
|||||||
// REG_24 <3:0> 14 Max symbol number for SelCall detection
|
// REG_24 <3:0> 14 Max symbol number for SelCall detection
|
||||||
|
|
||||||
// const uint16_t threshold = 24; // doesn't decode non-QS radios
|
// const uint16_t threshold = 24; // doesn't decode non-QS radios
|
||||||
const uint16_t threshold = 200; // but 128 ~ 247 does
|
const uint16_t threshold = 140; // but 128 ~ 247 does
|
||||||
BK4819_WriteRegister(BK4819_REG_24, // 1 00011000 1 1 1 1110
|
BK4819_WriteRegister(BK4819_REG_24, // 1 00011000 1 1 1 1110
|
||||||
(1u << BK4819_REG_24_SHIFT_UNKNOWN_15)
|
(1u << BK4819_REG_24_SHIFT_UNKNOWN_15)
|
||||||
| (threshold << BK4819_REG_24_SHIFT_THRESHOLD) // 0 ~ 255
|
| (threshold << BK4819_REG_24_SHIFT_THRESHOLD) // 0 ~ 255
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
127
frequencies.c
127
frequencies.c
@@ -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)
|
|
||||||
{ // return '0' if TX frequency is allowed
|
|
||||||
// otherwise return '-1'
|
|
||||||
|
|
||||||
const uint32_t Frequency = pInfo->pTX->Frequency;
|
|
||||||
|
|
||||||
#ifdef ENABLE_NOAA
|
int TX_freq_check(const uint32_t Frequency)
|
||||||
if (pInfo->CHANNEL_SAVE > FREQ_CHANNEL_LAST)
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
int TX_FREQUENCY_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'
|
||||||
|
|
||||||
if (Frequency < LowerLimitFrequencyBandTable[0] || Frequency > UpperLimitFrequencyBandTable[6])
|
if (Frequency < frequencyBandTable[0].lower || Frequency > frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper)
|
||||||
return -1;
|
return -1; // not allowed outside this range
|
||||||
if (Frequency >= bx_stop1_Hz && Frequency < bx_start2_Hz)
|
|
||||||
return -1;
|
if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower)
|
||||||
|
return -1; // BX chip does not work in this range
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
49
functions.c
49
functions.c
@@ -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"
|
||||||
@@ -53,15 +54,8 @@ void FUNCTION_Init(void)
|
|||||||
gCurrentCodeType = CODE_TYPE_CONTINUOUS_TONE;
|
gCurrentCodeType = CODE_TYPE_CONTINUOUS_TONE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gDTMF_RequestPending = false;
|
DTMF_clear_RX();
|
||||||
|
|
||||||
gDTMF_RecvTimeout = 0;
|
|
||||||
gDTMF_WriteIndex = 0;
|
|
||||||
memset(gDTMF_Received, 0, sizeof(gDTMF_Received));
|
|
||||||
|
|
||||||
// gDTMF_RX_timeout_live = 0;
|
|
||||||
// gDTMF_RX_timeout_live[0] = '\0';
|
|
||||||
|
|
||||||
g_CxCSS_TAIL_Found = false;
|
g_CxCSS_TAIL_Found = false;
|
||||||
g_CDCSS_Lost = false;
|
g_CDCSS_Lost = false;
|
||||||
g_CTCSS_Lost = false;
|
g_CTCSS_Lost = false;
|
||||||
@@ -80,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)
|
||||||
@@ -119,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:
|
||||||
@@ -144,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:
|
||||||
@@ -152,8 +151,13 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
|
|||||||
// if DTMF is enabled when TX'ing, it changes the TX audio filtering !! .. 1of11
|
// if DTMF is enabled when TX'ing, it changes the TX audio filtering !! .. 1of11
|
||||||
BK4819_DisableDTMF();
|
BK4819_DisableDTMF();
|
||||||
|
|
||||||
|
// clear the DTMF RX buffer
|
||||||
|
DTMF_clear_RX();
|
||||||
|
|
||||||
|
// clear the DTMF RX live decoder buffer
|
||||||
gDTMF_RX_live_timeout = 0;
|
gDTMF_RX_live_timeout = 0;
|
||||||
gDTMF_RX_live[0] = 0;
|
gDTMF_RX_live_timeout = 0;
|
||||||
|
memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live));
|
||||||
|
|
||||||
#if defined(ENABLE_FMRADIO)
|
#if defined(ENABLE_FMRADIO)
|
||||||
if (gFmRadioMode)
|
if (gFmRadioMode)
|
||||||
@@ -185,27 +189,38 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
gUpdateStatus = true;
|
||||||
|
|
||||||
GUI_DisplayScreen();
|
GUI_DisplayScreen();
|
||||||
|
|
||||||
RADIO_SetTxParameters();
|
RADIO_SetTxParameters();
|
||||||
|
|
||||||
// turn the LED on RED
|
// turn the RED LED on
|
||||||
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, true);
|
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, true);
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
if (gCurrentVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable)
|
if (gCurrentVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable)
|
||||||
BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1);
|
BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
BIN
images/batcal.jpg
Normal file
BIN
images/batcal.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
51
main.c
51
main.c
@@ -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
|
||||||
@@ -67,7 +68,7 @@ void Main(void)
|
|||||||
UART_Init();
|
UART_Init();
|
||||||
|
|
||||||
boot_counter_10ms = 250; // 2.5 sec
|
boot_counter_10ms = 250; // 2.5 sec
|
||||||
|
|
||||||
UART_Send(UART_Version, strlen(UART_Version));
|
UART_Send(UART_Version, strlen(UART_Version));
|
||||||
|
|
||||||
// Not implementing authentic device checks
|
// Not implementing authentic device checks
|
||||||
@@ -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)
|
||||||
@@ -131,7 +164,7 @@ void Main(void)
|
|||||||
{
|
{
|
||||||
if (KEYBOARD_Poll() != KEY_INVALID)
|
if (KEYBOARD_Poll() != KEY_INVALID)
|
||||||
{ // halt boot beeps
|
{ // halt boot beeps
|
||||||
boot_counter_10ms = 0;
|
boot_counter_10ms = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_BOOT_BEEPS
|
#ifdef ENABLE_BOOT_BEEPS
|
||||||
@@ -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)
|
||||||
|
|||||||
38
misc.c
38
misc.c
@@ -24,11 +24,12 @@ 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
|
||||||
const uint8_t DTMF_decode_ring_countdown_500ms = 15000 / 500; // 15 seconds
|
const uint8_t DTMF_decode_ring_countdown_500ms = 15000 / 500; // 15 seconds .. time we sound the ringing for
|
||||||
const uint8_t DTMF_txstop_countdown_500ms = 3000 / 500; // 6 seconds
|
const uint8_t DTMF_txstop_countdown_500ms = 3000 / 500; // 6 seconds
|
||||||
|
|
||||||
const uint8_t key_input_timeout_500ms = 8000 / 500; // 8 seconds
|
const uint8_t key_input_timeout_500ms = 8000 / 500; // 8 seconds
|
||||||
@@ -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,15 +174,16 @@ 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;
|
||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
bool gFlagSaveFM;
|
bool gFlagSaveFM;
|
||||||
#endif
|
#endif
|
||||||
uint8_t gDTMF_RequestPending;
|
|
||||||
bool g_CDCSS_Lost;
|
bool g_CDCSS_Lost;
|
||||||
uint8_t gCDCSSCodeType;
|
uint8_t gCDCSSCodeType;
|
||||||
bool g_CTCSS_Lost;
|
bool g_CTCSS_Lost;
|
||||||
@@ -187,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;
|
||||||
@@ -206,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;
|
||||||
@@ -214,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;
|
||||||
|
|||||||
42
misc.h
42
misc.h
@@ -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,15 +244,16 @@ 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;
|
||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
extern bool gFlagSaveFM;
|
extern bool gFlagSaveFM;
|
||||||
#endif
|
#endif
|
||||||
extern uint8_t gDTMF_RequestPending;
|
|
||||||
extern bool g_CDCSS_Lost;
|
extern bool g_CDCSS_Lost;
|
||||||
extern uint8_t gCDCSSCodeType;
|
extern uint8_t gCDCSSCodeType;
|
||||||
extern bool g_CTCSS_Lost;
|
extern bool g_CTCSS_Lost;
|
||||||
@@ -251,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;
|
||||||
@@ -268,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;
|
||||||
|
|||||||
187
radio.c
187
radio.c
@@ -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))
|
||||||
@@ -345,7 +343,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ***************
|
// ***************
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint32_t Frequency;
|
uint32_t Frequency;
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -436,7 +434,7 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
|
|||||||
uint16_t Base = (Band < BAND4_174MHz) ? 0x1E60 : 0x1E00;
|
uint16_t Base = (Band < BAND4_174MHz) ? 0x1E60 : 0x1E00;
|
||||||
|
|
||||||
if (gEeprom.SQUELCH_LEVEL == 0)
|
if (gEeprom.SQUELCH_LEVEL == 0)
|
||||||
{
|
{ // squelch == 0 (off)
|
||||||
pInfo->SquelchOpenRSSIThresh = 0;
|
pInfo->SquelchOpenRSSIThresh = 0;
|
||||||
pInfo->SquelchOpenNoiseThresh = 127;
|
pInfo->SquelchOpenNoiseThresh = 127;
|
||||||
pInfo->SquelchCloseGlitchThresh = 255;
|
pInfo->SquelchCloseGlitchThresh = 255;
|
||||||
@@ -446,9 +444,8 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
|
|||||||
pInfo->SquelchOpenGlitchThresh = 255;
|
pInfo->SquelchOpenGlitchThresh = 255;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{ // squelch >= 1
|
||||||
Base += gEeprom.SQUELCH_LEVEL;
|
Base += gEeprom.SQUELCH_LEVEL; // my squelch-1
|
||||||
// my squelch-1
|
|
||||||
// VHF UHF
|
// VHF UHF
|
||||||
EEPROM_ReadBuffer(Base + 0x00, &pInfo->SquelchOpenRSSIThresh, 1); // 50 10
|
EEPROM_ReadBuffer(Base + 0x00, &pInfo->SquelchOpenRSSIThresh, 1); // 50 10
|
||||||
EEPROM_ReadBuffer(Base + 0x10, &pInfo->SquelchCloseRSSIThresh, 1); // 40 5
|
EEPROM_ReadBuffer(Base + 0x10, &pInfo->SquelchCloseRSSIThresh, 1); // 40 5
|
||||||
@@ -459,37 +456,26 @@ 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_SQUELCH1_LOWER
|
#if ENABLE_SQUELCH_MORE_SENSITIVE
|
||||||
// make squelch-1 more sensitive
|
// make squelch a little more sensitive
|
||||||
if (gEeprom.SQUELCH_LEVEL == 1)
|
//
|
||||||
{
|
// getting the best setting here is still experimental, bare with me
|
||||||
if (Band < BAND4_174MHz)
|
//
|
||||||
{
|
// note that 'noise' and 'glitch' value are inverted compared to 'rssi' values
|
||||||
pInfo->SquelchOpenRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 11) / 12;
|
|
||||||
pInfo->SquelchCloseRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 9) / 10;
|
|
||||||
|
|
||||||
pInfo->SquelchOpenNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 9) / 8;
|
pInfo->SquelchOpenRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 10) / 11;
|
||||||
pInfo->SquelchCloseNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 10) / 9;
|
pInfo->SquelchCloseRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 10) / 11;
|
||||||
|
|
||||||
pInfo->SquelchOpenGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 9) / 8;
|
pInfo->SquelchOpenNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 11) / 10;
|
||||||
pInfo->SquelchCloseGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 10) / 9;
|
pInfo->SquelchCloseNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 11) / 10;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pInfo->SquelchOpenRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 3) / 4;
|
|
||||||
pInfo->SquelchCloseRSSIThresh = ((uint16_t)pInfo->SquelchOpenRSSIThresh * 9) / 10;
|
|
||||||
|
|
||||||
pInfo->SquelchOpenNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 4) / 3;
|
pInfo->SquelchOpenGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 11) / 10;
|
||||||
pInfo->SquelchCloseNoiseThresh = ((uint16_t)pInfo->SquelchOpenNoiseThresh * 10) / 9;
|
pInfo->SquelchCloseGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 11) / 10;
|
||||||
|
|
||||||
pInfo->SquelchOpenGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 4) / 3;
|
|
||||||
pInfo->SquelchCloseGlitchThresh = ((uint16_t)pInfo->SquelchOpenGlitchThresh * 10) / 9;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (pInfo->SquelchOpenNoiseThresh > 127)
|
if (pInfo->SquelchOpenNoiseThresh > 127)
|
||||||
pInfo->SquelchOpenNoiseThresh = 127;
|
pInfo->SquelchOpenNoiseThresh = 127;
|
||||||
|
|
||||||
if (pInfo->SquelchCloseNoiseThresh > 127)
|
if (pInfo->SquelchCloseNoiseThresh > 127)
|
||||||
pInfo->SquelchCloseNoiseThresh = 127;
|
pInfo->SquelchCloseNoiseThresh = 127;
|
||||||
}
|
}
|
||||||
@@ -502,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -524,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;
|
||||||
}
|
}
|
||||||
@@ -574,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;
|
||||||
|
|
||||||
@@ -584,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:
|
||||||
@@ -592,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
|
||||||
@@ -637,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
|
||||||
@@ -649,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)
|
||||||
@@ -747,9 +724,6 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// there's no reason the DTMF decoder can't be used in AM RX mode too
|
|
||||||
// aircraft comms use it on HF (AM and SSB)
|
|
||||||
// if (gRxVfo->AM_mode || (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED))
|
|
||||||
if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED)
|
if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED)
|
||||||
{
|
{
|
||||||
BK4819_DisableDTMF();
|
BK4819_DisableDTMF();
|
||||||
@@ -760,7 +734,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
|
|||||||
InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND;
|
InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (gCurrentFunction != FUNCTION_TRANSMIT && gSetting_live_DTMF_decoder)
|
if (gCurrentFunction != FUNCTION_TRANSMIT)
|
||||||
{
|
{
|
||||||
BK4819_EnableDTMF();
|
BK4819_EnableDTMF();
|
||||||
InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND;
|
InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND;
|
||||||
@@ -827,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);
|
||||||
|
|
||||||
@@ -835,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:
|
||||||
@@ -843,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
|
||||||
@@ -885,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -912,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
|
||||||
@@ -935,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;
|
||||||
@@ -948,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
|
||||||
@@ -961,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
|
||||||
@@ -975,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
|
||||||
@@ -986,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,7 +972,7 @@ void RADIO_PrepareTX(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TX is allowed
|
// TX is allowed
|
||||||
|
|
||||||
if (gDTMF_ReplyState == DTMF_REPLY_ANI)
|
if (gDTMF_ReplyState == DTMF_REPLY_ANI)
|
||||||
{
|
{
|
||||||
if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF)
|
if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF)
|
||||||
@@ -1014,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;
|
||||||
|
|
||||||
@@ -1070,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
39
radio.h
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
10
settings.c
10
settings.c
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +216,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
|
|||||||
| (pVFO->OUTPUT_POWER << 2)
|
| (pVFO->OUTPUT_POWER << 2)
|
||||||
| (pVFO->CHANNEL_BANDWIDTH << 1)
|
| (pVFO->CHANNEL_BANDWIDTH << 1)
|
||||||
| (pVFO->FrequencyReverse << 0);
|
| (pVFO->FrequencyReverse << 0);
|
||||||
State[5] = (pVFO->DTMF_PTT_ID_TX_MODE << 1) | (pVFO->DTMF_DECODING_ENABLE < 0);
|
State[5] = (pVFO->DTMF_PTT_ID_TX_MODE << 1) | (pVFO->DTMF_DECODING_ENABLE << 0);
|
||||||
State[6] = pVFO->STEP_SETTING;
|
State[6] = pVFO->STEP_SETTING;
|
||||||
State[7] = pVFO->SCRAMBLING_TYPE;
|
State[7] = pVFO->SCRAMBLING_TYPE;
|
||||||
EEPROM_WriteBuffer(OffsetVFO + 8, State);
|
EEPROM_WriteBuffer(OffsetVFO + 8, State);
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
348
ui/main.c
348
ui/main.c
@@ -36,6 +36,19 @@
|
|||||||
#include "ui/main.h"
|
#include "ui/main.h"
|
||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
|
|
||||||
|
enum center_line_t {
|
||||||
|
CENTER_LINE_NONE = 0,
|
||||||
|
CENTER_LINE_IN_USE,
|
||||||
|
CENTER_LINE_AUDIO_BAR,
|
||||||
|
CENTER_LINE_RSSI,
|
||||||
|
CENTER_LINE_AM_FIX_DATA,
|
||||||
|
CENTER_LINE_DTMF_DEC,
|
||||||
|
CENTER_LINE_CHARGE_DATA
|
||||||
|
};
|
||||||
|
typedef enum center_line_t center_line_t;
|
||||||
|
|
||||||
|
center_line_t center_line = CENTER_LINE_NONE;
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
|
||||||
#ifdef ENABLE_AUDIO_BAR
|
#ifdef ENABLE_AUDIO_BAR
|
||||||
@@ -67,6 +80,9 @@
|
|||||||
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
|
||||||
|
|
||||||
@@ -94,18 +110,18 @@
|
|||||||
|
|
||||||
#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)
|
||||||
@@ -117,11 +133,13 @@
|
|||||||
#if defined(ENABLE_RSSI_BAR)
|
#if defined(ENABLE_RSSI_BAR)
|
||||||
void UI_DisplayRSSIBar(const int16_t rssi, const bool now)
|
void UI_DisplayRSSIBar(const int16_t rssi, const bool now)
|
||||||
{
|
{
|
||||||
const int16_t s9_dBm = -73; // S9
|
// const int16_t s0_dBm = -127; // S0 .. base level
|
||||||
const int16_t s0_dBm = -127; // S0
|
const int16_t s0_dBm = -147; // S0 .. base level
|
||||||
|
|
||||||
|
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; // S0
|
// const int16_t bar_min_dBm = s0_dBm + (6 * 0); // S0
|
||||||
|
const int16_t bar_min_dBm = s0_dBm + (6 * 4); // S4
|
||||||
|
|
||||||
// ************
|
// ************
|
||||||
|
|
||||||
@@ -129,46 +147,46 @@
|
|||||||
const unsigned int bar_x = 2 + txt_width + 4; // X coord of bar graph
|
const unsigned int bar_x = 2 + txt_width + 4; // X coord of bar graph
|
||||||
const unsigned int bar_width = LCD_WIDTH - 1 - bar_x;
|
const unsigned int bar_width = LCD_WIDTH - 1 - bar_x;
|
||||||
|
|
||||||
const int16_t dBm = (rssi / 2) - 160;
|
const int16_t rssi_dBm = (rssi / 2) - 160;
|
||||||
const int16_t clamped_dBm = (dBm <= bar_min_dBm) ? bar_min_dBm : (dBm >= bar_max_dBm) ? bar_max_dBm : dBm;
|
const int16_t clamped_dBm = (rssi_dBm <= bar_min_dBm) ? bar_min_dBm : (rssi_dBm >= bar_max_dBm) ? bar_max_dBm : rssi_dBm;
|
||||||
const unsigned int bar_range_dB = bar_max_dBm - bar_min_dBm;
|
const unsigned int bar_range_dB = bar_max_dBm - bar_min_dBm;
|
||||||
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;
|
||||||
unsigned int s_level = 0; // S0
|
|
||||||
|
|
||||||
if (gEeprom.KEY_LOCK && gKeypadLocked > 0)
|
if (gEeprom.KEY_LOCK && gKeypadLocked > 0)
|
||||||
return; // display is in use
|
return; // display is in use
|
||||||
if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN)
|
if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN)
|
||||||
return; // display is in use
|
return; // display is in use
|
||||||
|
|
||||||
if (dBm >= (s9_dBm + 10)) // S9+10dB
|
|
||||||
s_level = ((dBm - s9_dBm) / 10) * 10;
|
|
||||||
else
|
|
||||||
if (dBm >= s0_dBm) // S0
|
|
||||||
s_level = (dBm - s0_dBm) / 6; // 6dB per S point
|
|
||||||
|
|
||||||
if (now)
|
if (now)
|
||||||
memset(pLine, 0, LCD_WIDTH);
|
memset(p_line, 0, LCD_WIDTH);
|
||||||
|
|
||||||
if (s_level < 10)
|
if (rssi_dBm >= (s9_dBm + 6))
|
||||||
sprintf(s, "%-4d S%u ", dBm, s_level); // S0 ~ S9
|
{ // S9+XXdB, 1dB increment
|
||||||
|
const char *fmt[] = {"%3d 9+%u ", "%3d 9+%2u "};
|
||||||
|
const unsigned int s9_dB = ((rssi_dBm - s9_dBm) <= 99) ? rssi_dBm - s9_dBm : 99;
|
||||||
|
sprintf(s, (s9_dB < 10) ? fmt[0] : fmt[1], rssi_dBm, s9_dB);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
sprintf(s, "%-4d +%2u", dBm, s_level); // S9+XX
|
{ // S0 ~ S9, 6dB per S-point
|
||||||
|
const unsigned int s_level = (rssi_dBm >= s0_dBm) ? (rssi_dBm - s0_dBm) / 6 : 0;
|
||||||
|
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)
|
||||||
@@ -180,24 +198,25 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
|
|||||||
{
|
{
|
||||||
#ifdef ENABLE_RSSI_BAR
|
#ifdef ENABLE_RSSI_BAR
|
||||||
|
|
||||||
const bool rx = (gCurrentFunction == FUNCTION_RECEIVE ||
|
// optional larger RSSI dBm, S-point and bar level
|
||||||
gCurrentFunction == FUNCTION_MONITOR ||
|
|
||||||
gCurrentFunction == FUNCTION_INCOMING);
|
|
||||||
|
|
||||||
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA)
|
if (center_line != CENTER_LINE_RSSI)
|
||||||
if (gEeprom.VfoInfo[gEeprom.RX_CHANNEL].AM_mode && gSetting_AM_fix)
|
return;
|
||||||
{ // AM test data is currently being shown
|
|
||||||
}
|
if (gCurrentFunction == FUNCTION_RECEIVE ||
|
||||||
else
|
gCurrentFunction == FUNCTION_MONITOR ||
|
||||||
#endif
|
gCurrentFunction == FUNCTION_INCOMING)
|
||||||
if (rx)
|
{
|
||||||
UI_DisplayRSSIBar(rssi, true);
|
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
|
||||||
|
|
||||||
@@ -252,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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,9 +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;
|
||||||
bool center_line_is_free = true;
|
char String[16];
|
||||||
|
unsigned int vfo_num;
|
||||||
|
|
||||||
|
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;
|
||||||
@@ -294,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)
|
||||||
@@ -306,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
|
||||||
@@ -338,7 +364,7 @@ void UI_DisplayMain(void)
|
|||||||
strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT");
|
strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT");
|
||||||
else
|
else
|
||||||
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED)
|
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED)
|
||||||
sprintf(String, "CALL:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller);
|
sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller);
|
||||||
else
|
else
|
||||||
if (gDTMF_IsTx)
|
if (gDTMF_IsTx)
|
||||||
strcpy(String, (gDTMF_State == DTMF_STATE_TX_SUCC) ? "DTMF TX(SUCC)" : "DTMF TX");
|
strcpy(String, (gDTMF_State == DTMF_STATE_TX_SUCC) ? "DTMF TX(SUCC)" : "DTMF TX");
|
||||||
@@ -347,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);
|
||||||
|
|
||||||
@@ -366,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]))
|
||||||
@@ -424,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]))
|
||||||
@@ -435,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
|
||||||
@@ -448,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,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
|
||||||
|
|
||||||
@@ -517,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
|
||||||
@@ -543,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;
|
||||||
@@ -566,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
|
||||||
@@ -580,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
|
||||||
}
|
}
|
||||||
@@ -593,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)
|
||||||
{
|
{
|
||||||
@@ -603,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
|
||||||
@@ -614,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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -640,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)
|
||||||
@@ -663,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';
|
||||||
@@ -677,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 ||
|
||||||
@@ -698,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);
|
||||||
}
|
}
|
||||||
@@ -713,28 +747,46 @@ 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
|
||||||
|
|
||||||
if (rx || gCurrentFunction == FUNCTION_FOREGROUND || gCurrentFunction == FUNCTION_POWER_SAVE)
|
if (rx || gCurrentFunction == FUNCTION_FOREGROUND || gCurrentFunction == FUNCTION_POWER_SAVE)
|
||||||
{
|
{
|
||||||
if (gSetting_live_DTMF_decoder && gDTMF_RX_live[0] >= 32)
|
#if 1
|
||||||
{ // show live DTMF decode
|
if (gSetting_live_DTMF_decoder && gDTMF_RX_live[0] != 0)
|
||||||
const unsigned int len = strlen(gDTMF_RX_live);
|
{ // show live DTMF decode
|
||||||
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
|
const unsigned int len = strlen(gDTMF_RX_live);
|
||||||
strcpy(String, "DTMF ");
|
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
|
||||||
strcat(String, gDTMF_RX_live + idx);
|
center_line = CENTER_LINE_DTMF_DEC;
|
||||||
UI_PrintStringSmall(String, 2, 0, 3);
|
strcpy(String, "DTMF ");
|
||||||
}
|
strcat(String, gDTMF_RX_live + idx);
|
||||||
|
UI_PrintStringSmall(String, 2, 0, 3);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (gSetting_live_DTMF_decoder && gDTMF_RX_index > 0)
|
||||||
|
{ // show live DTMF decode
|
||||||
|
const unsigned int len = gDTMF_RX_index;
|
||||||
|
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 ");
|
||||||
|
strcat(String, gDTMF_RX + idx);
|
||||||
|
UI_PrintStringSmall(String, 2, 0, 3);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef ENABLE_SHOW_CHARGE_LEVEL
|
#ifdef ENABLE_SHOW_CHARGE_LEVEL
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|||||||
395
ui/menu.c
395
ui/menu.c
@@ -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,14 +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][10] =
|
||||||
|
{
|
||||||
|
"MAIN\nVFO",
|
||||||
|
"UPPER\nVFO",
|
||||||
|
"LOWER\nVFO"
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef ENABLE_VOICE
|
#ifdef ENABLE_VOICE
|
||||||
@@ -197,19 +208,19 @@ const char gSubMenu_CHAN[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
|
||||||
@@ -220,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] =
|
||||||
@@ -337,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);
|
for (i = 0; i < 3; i++)
|
||||||
|
if (gMenuCursor > 0 || i > 0)
|
||||||
|
if ((gMenuListCount - 1) != gMenuCursor || i != 2)
|
||||||
|
UI_PrintString(MenuList[gMenuCursor + i - 1].name, 0, 0, i * 2, 8);
|
||||||
|
|
||||||
// invert the menu list text pixels
|
// invert the current menu list item pixels
|
||||||
for (i = 0; i < (8 * menu_list_width); i++)
|
for (i = 0; i < (8 * menu_list_width); i++)
|
||||||
{
|
{
|
||||||
gFrameBuffer[2][i] ^= 0xFF;
|
gFrameBuffer[2][i] ^= 0xFF;
|
||||||
gFrameBuffer[3][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));
|
||||||
|
|
||||||
@@ -390,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:
|
||||||
@@ -410,12 +477,42 @@ 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;
|
||||||
break;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
case MENU_SFT_D:
|
case MENU_SFT_D:
|
||||||
strcpy(String, gSubMenu_SFT_D[gSubMenuSelection]);
|
strcpy(String, gSubMenu_SFT_D[gSubMenuSelection]);
|
||||||
break;
|
break;
|
||||||
@@ -452,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:
|
||||||
@@ -472,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
|
||||||
|
|
||||||
@@ -488,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:
|
||||||
@@ -522,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;
|
||||||
@@ -552,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)
|
||||||
@@ -562,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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -575,10 +677,13 @@ void UI_DisplayMenu(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_TDR:
|
case MENU_TDR:
|
||||||
case MENU_XB:
|
|
||||||
strcpy(String, gSubMenu_CHAN[gSubMenuSelection]);
|
strcpy(String, gSubMenu_CHAN[gSubMenuSelection]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MENU_XB:
|
||||||
|
strcpy(String, gSubMenu_XB[gSubMenuSelection]);
|
||||||
|
break;
|
||||||
|
|
||||||
case MENU_TOT:
|
case MENU_TOT:
|
||||||
strcpy(String, gSubMenu_TOT[gSubMenuSelection]);
|
strcpy(String, gSubMenu_TOT[gSubMenuSelection]);
|
||||||
break;
|
break;
|
||||||
@@ -663,22 +768,9 @@ void UI_DisplayMenu(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_VOL:
|
case MENU_VOL:
|
||||||
// 1st text line
|
sprintf(String, "%u.%02uV\n%u%%",
|
||||||
sprintf(String, "%u.%02uV", gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100);
|
gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100,
|
||||||
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
|
BATTERY_VoltsToPercent(gBatteryVoltageAverage));
|
||||||
|
|
||||||
{ // 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
|
|
||||||
}
|
|
||||||
|
|
||||||
already_printed = true;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_RESET:
|
case MENU_RESET:
|
||||||
@@ -689,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;
|
||||||
|
|
||||||
|
//gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; // already set when the user was adjusting the value
|
||||||
|
BK4819_WriteRegister(BK4819_REG_3B, value);
|
||||||
|
|
||||||
|
sprintf(String, "%d\n%u.%06u\nMHz",
|
||||||
|
gSubMenuSelection,
|
||||||
|
xtal_Hz / 1000000, xtal_Hz % 1000000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
sprintf(String, "%d", gSubMenuSelection);
|
case MENU_BATCAL:
|
||||||
UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8);
|
{
|
||||||
|
const uint16_t vol = (uint32_t)gBatteryVoltageAverage * gBatteryCalibration[3] / gSubMenuSelection;
|
||||||
const uint32_t xtal_Hz = (0x4f0000u + value) * 5;
|
sprintf(String, "%u.%02uV\n%u", vol / 100, vol % 100, gSubMenuSelection);
|
||||||
sprintf(String, "%u.%06u", xtal_Hz / 1000000, xtal_Hz % 1000000);
|
|
||||||
UI_PrintString(String, menu_item_x1, menu_item_x2, 2, 8);
|
|
||||||
|
|
||||||
UI_PrintString("MHz", menu_item_x1, menu_item_x2, 4, 8);
|
|
||||||
|
|
||||||
already_printed = true;
|
|
||||||
}
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|||||||
65
ui/menu.h
65
ui/menu.h
@@ -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,19 +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][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];
|
||||||
|
|||||||
56
ui/status.c
56
ui/status.c
@@ -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
|
|
||||||
|
|
||||||
// **************
|
// **************
|
||||||
|
|
||||||
|
|||||||
1
ui/ui.c
1
ui/ui.c
@@ -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;
|
||||||
|
|
||||||
|
|||||||
12
ui/welcome.c
12
ui/welcome.c
@@ -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];
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user