From b058541e97fb01272a41283bcfe51639697d8de4 Mon Sep 17 00:00:00 2001 From: wu58430 Date: Sun, 17 Dec 2023 12:23:45 +0800 Subject: [PATCH] 109 UPDATE --- .idea/workspace.xml | 48 +++- Makefile | 120 ++++----- am_fix.c | 129 +++------ app/action.c | 6 +- app/app.c | 327 ++++++++++------------- app/dtmf.c | 8 +- app/fm.c | 1 + app/generic.c | 11 +- app/main.c | 2 +- app/mdc1200.c | 2 +- app/menu.c | 13 +- app/uart.c | 6 +- audio.c | 2 +- audio.h | 1 - bitmaps.c | 429 +++++++++++++++--------------- bitmaps.h | 17 +- board.c | 7 +- debugging.h | 31 ++- driver/backlight.c | 15 +- driver/backlight.h | 2 +- driver/bk4819.c | 12 +- driver/crc.c | 5 +- driver/keyboard.c | 19 +- driver/system.c | 8 +- driver/systick.c | 35 +-- font.c | 621 ++++++++++++++++++++++++-------------------- font.h | 11 +- helper/battery.c | 284 ++++++++++---------- helper/battery.h | 8 +- main.c | 45 ++-- misc.c | 4 +- misc.h | 6 +- radio.c | 85 +++--- radio.h | 2 +- settings.c | 25 +- settings.h | 4 + ui/battery.c | 50 ++-- ui/helper.c | 68 +++-- ui/lock.c | 4 +- ui/main.c | 29 ++- ui/menu.c | 10 +- ui/status.c | 159 +++++------- uv-k5font/font.xlsx | Bin 49199 -> 48030 bytes version.c | 2 +- 44 files changed, 1298 insertions(+), 1375 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 321de3c..dcb34e9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -21,24 +21,47 @@ - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + - + @@ -233,6 +256,7 @@ + 1701689801897 diff --git a/Makefile b/Makefile index 533f309..734548d 100644 --- a/Makefile +++ b/Makefile @@ -4,56 +4,56 @@ # 1 = enable # ---- COMPILER/LINKER OPTIONS ---- -ENABLE_CLANG := 0 -ENABLE_SWD := 0 -ENABLE_OVERLAY := 0 -ENABLE_LTO := 1 +ENABLE_CLANG ?= 0 +ENABLE_SWD ?= 0 +ENABLE_OVERLAY ?= 0 +ENABLE_LTO ?= 1 # ---- STOCK QUANSHENG FERATURES ---- -ENABLE_UART := 1 -ENABLE_AIRCOPY := 0 -ENABLE_FMRADIO := 1 -ENABLE_NOAA := 0 -ENABLE_VOICE := 0 -ENABLE_VOX := 1 -ENABLE_ALARM := 0 -ENABLE_TX1750 := 0 -ENABLE_PWRON_PASSWORD := 0 -ENABLE_DTMF_CALLING := 1 -ENABLE_FLASHLIGHT := 1 +ENABLE_UART ?= 1 +ENABLE_AIRCOPY ?= 0 +ENABLE_FMRADIO ?= 1 +ENABLE_NOAA ?= 0 +ENABLE_VOICE ?= 0 +ENABLE_VOX ?= 1 +ENABLE_ALARM ?= 0 +ENABLE_TX1750 ?= 0 +ENABLE_PWRON_PASSWORD ?= 0 +ENABLE_DTMF_CALLING ?= 1 +ENABLE_FLASHLIGHT ?= 1 # ---- CUSTOM MODS ---- -ENABLE_BIG_FREQ := 1 -ENABLE_SMALL_BOLD := 1 -ENABLE_KEEP_MEM_NAME := 1 -ENABLE_WIDE_RX := 1 -ENABLE_TX_WHEN_AM := 0 -ENABLE_F_CAL_MENU := 0 -ENABLE_CTCSS_TAIL_PHASE_SHIFT := 0 -ENABLE_BOOT_BEEPS := 0 -ENABLE_SHOW_CHARGE_LEVEL := 0 -ENABLE_REVERSE_BAT_SYMBOL := 0 -ENABLE_NO_CODE_SCAN_TIMEOUT := 1 -ENABLE_AM_FIX := 1 -ENABLE_SQUELCH_MORE_SENSITIVE := 1 -ENABLE_FASTER_CHANNEL_SCAN := 1 -ENABLE_RSSI_BAR := 1 -ENABLE_AUDIO_BAR := 1 -ENABLE_COPY_CHAN_TO_VFO := 1 -ENABLE_SPECTRUM := 1 -ENABLE_REDUCE_LOW_MID_TX_POWER:= 0 -ENABLE_BYP_RAW_DEMODULATORS := 0 -ENABLE_BLMIN_TMP_OFF := 0 -ENABLE_SCAN_RANGES := 1 -ENABLE_MDC1200 := 1 -ENABLE_MDC1200_SHOW_OP_ARG := 1 -ENABLE_MDC1200_SIDE_BEEP := 0 -ENABLE_MDC1200_CONRACT := 1 +ENABLE_BIG_FREQ ?= 1 +ENABLE_SMALL_BOLD ?= 1 +ENABLE_KEEP_MEM_NAME ?= 1 +ENABLE_WIDE_RX ?= 1 +ENABLE_TX_WHEN_AM ?= 0 +ENABLE_F_CAL_MENU ?= 0 +ENABLE_CTCSS_TAIL_PHASE_SHIFT ?= 0 +ENABLE_BOOT_BEEPS ?= 0 +ENABLE_SHOW_CHARGE_LEVEL ?= 0 +ENABLE_REVERSE_BAT_SYMBOL ?= 0 +ENABLE_NO_CODE_SCAN_TIMEOUT ?= 1 +ENABLE_AM_FIX ?= 1 +ENABLE_SQUELCH_MORE_SENSITIVE ?= 1 +ENABLE_FASTER_CHANNEL_SCAN ?= 1 +ENABLE_RSSI_BAR ?= 1 +ENABLE_AUDIO_BAR ?= 1 +ENABLE_COPY_CHAN_TO_VFO ?= 1 +ENABLE_SPECTRUM ?= 1 +ENABLE_REDUCE_LOW_MID_TX_POWER?= 0 +ENABLE_BYP_RAW_DEMODULATORS ?= 0 +ENABLE_BLMIN_TMP_OFF ?= 0 +ENABLE_SCAN_RANGES ?= 1 +ENABLE_MDC1200 ?= 1 +ENABLE_MDC1200_SHOW_OP_ARG ?= 1 +ENABLE_MDC1200_SIDE_BEEP ?= 0 +ENABLE_MDC1200_CONRACT ?= 1 # ---- DEBUGGING ---- -ENABLE_AM_FIX_SHOW_DATA := 0 -ENABLE_AGC_SHOW_DATA := 0 +ENABLE_AM_FIX_SHOW_DATA ?= 0 +ENABLE_AGC_SHOW_DATA ?= 0 ############################################################# @@ -174,27 +174,21 @@ OBJS += ui/ui.o OBJS += ui/welcome.o OBJS += version.o OBJS += main.o - -ifeq ($(OS), Windows_NT) - TOP := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) -else - TOP := $(shell pwd) -endif - -ifdef OS # windows - RM = del - FixPath = $(subst /,\,$1) - WHERE = where - NULL_OUTPUT = nul +ifeq ($(OS), Windows_NT) # windows + TOP := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) + RM = del /Q + FixPath = $(subst /,\,$1) + WHERE = where + NULL_OUTPUT = nul else # unix - ifeq ($(shell uname), Linux) - RM = rm -f - FixPath = $1 - WHERE = which - NULL_OUTPUT = /dev/null - endif + TOP := $(shell pwd) + RM = rm -f + FixPath = $1 + WHERE = which + NULL_OUTPUT = /dev/null endif + AS = arm-none-eabi-gcc LD = arm-none-eabi-gcc @@ -212,11 +206,11 @@ endif OBJCOPY = arm-none-eabi-objcopy SIZE = arm-none-eabi-size -AUTHOR_STRING := LOSEHU +AUTHOR_STRING ?= LOSEHU # the user might not have/want git installed # can set own version string here (max 7 chars) ifneq (, $(shell $(WHERE) git)) - VERSION_STRING := $(shell git describe --tags --exact-match 2>$(NULL_OUTPUT)) + VERSION_STRING ?= $(shell git describe --tags --exact-match 2>$(NULL_OUTPUT)) ifeq (, $(VERSION_STRING)) VERSION_STRING := $(shell git rev-parse --short HEAD) endif diff --git a/am_fix.c b/am_fix.c index 339f563..00db8a5 100644 --- a/am_fix.c +++ b/am_fix.c @@ -100,95 +100,46 @@ static const t_gain_table gain_table[] = {0x0000,-93}, // 1 .. 0 0 0 0 .. -28dB -24dB -8dB -33dB .. -93dB {0x0008,-91}, // 2 .. 0 0 1 0 .. -28dB -24dB -6dB -33dB .. -91dB - {0x0100,-89}, // 3 .. 1 0 0 0 .. -24dB -24dB -8dB -33dB .. -89dB - {0x0020,-88}, // 4 .. 0 1 0 0 .. -28dB -19dB -8dB -33dB .. -88dB - {0x0108,-87}, // 5 .. 1 0 1 0 .. -24dB -24dB -6dB -33dB .. -87dB - {0x0028,-86}, // 6 .. 0 1 1 0 .. -28dB -19dB -6dB -33dB .. -86dB - {0x0018,-85}, // 7 .. 0 0 3 0 .. -28dB -24dB 0dB -33dB .. -85dB - {0x0200,-84}, // 8 .. 2 0 0 0 .. -19dB -24dB -8dB -33dB .. -84dB - {0x0101,-83}, // 9 .. 1 0 0 1 .. -24dB -24dB -8dB -27dB .. -83dB - {0x0208,-82}, // 10 .. 2 0 1 0 .. -19dB -24dB -6dB -33dB .. -82dB - {0x0118,-81}, // 11 .. 1 0 3 0 .. -24dB -24dB 0dB -33dB .. -81dB - {0x0038,-80}, // 12 .. 0 1 3 0 .. -28dB -19dB 0dB -33dB .. -80dB - {0x0220,-79}, // 13 .. 2 1 0 0 .. -19dB -19dB -8dB -33dB .. -79dB - {0x0201,-78}, // 14 .. 2 0 0 1 .. -19dB -24dB -8dB -27dB .. -78dB - {0x0228,-77}, // 15 .. 2 1 1 0 .. -19dB -19dB -6dB -33dB .. -77dB - {0x0218,-76}, // 16 .. 2 0 3 0 .. -19dB -24dB 0dB -33dB .. -76dB - {0x0119,-75}, // 17 .. 1 0 3 1 .. -24dB -24dB 0dB -27dB .. -75dB - {0x0240,-74}, // 18 .. 2 2 0 0 .. -19dB -14dB -8dB -33dB .. -74dB - {0x0221,-73}, // 19 .. 2 1 0 1 .. -19dB -19dB -8dB -27dB .. -73dB - {0x0248,-72}, // 20 .. 2 2 1 0 .. -19dB -14dB -6dB -33dB .. -72dB - {0x0238,-71}, // 21 .. 2 1 3 0 .. -19dB -19dB 0dB -33dB .. -71dB - {0x0219,-70}, // 22 .. 2 0 3 1 .. -19dB -24dB 0dB -27dB .. -70dB - {0x0260,-69}, // 23 .. 2 3 0 0 .. -19dB -9dB -8dB -33dB .. -69dB - {0x0241,-68}, // 24 .. 2 2 0 1 .. -19dB -14dB -8dB -27dB .. -68dB - {0x0268,-67}, // 25 .. 2 3 1 0 .. -19dB -9dB -6dB -33dB .. -67dB - {0x0280,-66}, // 26 .. 2 4 0 0 .. -19dB -6dB -8dB -33dB .. -66dB - {0x0300,-65}, // 27 .. 3 0 0 0 .. 0dB -24dB -8dB -33dB .. -65dB - {0x02A0,-64}, // 28 .. 2 5 0 0 .. -19dB -4dB -8dB -33dB .. -64dB - {0x0308,-63}, // 29 .. 3 0 1 0 .. 0dB -24dB -6dB -33dB .. -63dB - {0x02C0,-62}, // 30 .. 2 6 0 0 .. -19dB -2dB -8dB -33dB .. -62dB - {0x0290,-61}, // 31 .. 2 4 2 0 .. -19dB -6dB -3dB -33dB .. -61dB - {0x0320,-60}, // 32 .. 3 1 0 0 .. 0dB -19dB -8dB -33dB .. -60dB - {0x0301,-59}, // 33 .. 3 0 0 1 .. 0dB -24dB -8dB -27dB .. -59dB - {0x0328,-58}, // 34 .. 3 1 1 0 .. 0dB -19dB -6dB -33dB .. -58dB - {0x0318,-57}, // 35 .. 3 0 3 0 .. 0dB -24dB 0dB -33dB .. -57dB - {0x02C1,-56}, // 36 .. 2 6 0 1 .. -19dB -2dB -8dB -27dB .. -56dB - {0x0340,-55}, // 37 .. 3 2 0 0 .. 0dB -14dB -8dB -33dB .. -55dB - {0x0321,-54}, // 38 .. 3 1 0 1 .. 0dB -19dB -8dB -27dB .. -54dB - {0x0348,-53}, // 39 .. 3 2 1 0 .. 0dB -14dB -6dB -33dB .. -53dB - {0x0338,-52}, // 40 .. 3 1 3 0 .. 0dB -19dB 0dB -33dB .. -52dB - {0x0319,-51}, // 41 .. 3 0 3 1 .. 0dB -24dB 0dB -27dB .. -51dB - {0x0360,-50}, // 42 .. 3 3 0 0 .. 0dB -9dB -8dB -33dB .. -50dB - {0x0341,-49}, // 43 .. 3 2 0 1 .. 0dB -14dB -8dB -27dB .. -49dB - {0x0368,-48}, // 44 .. 3 3 1 0 .. 0dB -9dB -6dB -33dB .. -48dB - {0x0380,-47}, // 45 .. 3 4 0 0 .. 0dB -6dB -8dB -33dB .. -47dB - {0x0339,-46}, // 46 .. 3 1 3 1 .. 0dB -19dB 0dB -27dB .. -46dB - {0x03A0,-45}, // 47 .. 3 5 0 0 .. 0dB -4dB -8dB -33dB .. -45dB - {0x0361,-44}, // 48 .. 3 3 0 1 .. 0dB -9dB -8dB -27dB .. -44dB - {0x03C0,-43}, // 49 .. 3 6 0 0 .. 0dB -2dB -8dB -33dB .. -43dB - {0x0390,-42}, // 50 .. 3 4 2 0 .. 0dB -6dB -3dB -33dB .. -42dB - {0x03E0,-41}, // 51 .. 3 7 0 0 .. 0dB 0dB -8dB -33dB .. -41dB - {0x03B0,-40}, // 52 .. 3 5 2 0 .. 0dB -4dB -3dB -33dB .. -40dB - {0x03E8,-39}, // 53 .. 3 7 1 0 .. 0dB 0dB -6dB -33dB .. -39dB - {0x03D0,-38}, // 54 .. 3 6 2 0 .. 0dB -2dB -3dB -33dB .. -38dB - {0x03C1,-37}, // 55 .. 3 6 0 1 .. 0dB -2dB -8dB -27dB .. -37dB - {0x03F0,-36}, // 56 .. 3 7 2 0 .. 0dB 0dB -3dB -33dB .. -36dB - {0x03E1,-35}, // 57 .. 3 7 0 1 .. 0dB 0dB -8dB -27dB .. -35dB - {0x03B1,-34}, // 58 .. 3 5 2 1 .. 0dB -4dB -3dB -27dB .. -34dB - {0x03F8,-33}, // 59 .. 3 7 3 0 .. 0dB 0dB 0dB -33dB .. -33dB - {0x03D1,-32}, // 60 .. 3 6 2 1 .. 0dB -2dB -3dB -27dB .. -32dB - {0x03C2,-31}, // 61 .. 3 6 0 2 .. 0dB -2dB -8dB -21dB .. -31dB - {0x03F1,-30}, // 62 .. 3 7 2 1 .. 0dB 0dB -3dB -27dB .. -30dB - {0x03E2,-29}, // 63 .. 3 7 0 2 .. 0dB 0dB -8dB -21dB .. -29dB - {0x03B2,-28}, // 64 .. 3 5 2 2 .. 0dB -4dB -3dB -21dB .. -28dB - {0x03F9,-27}, // 65 .. 3 7 3 1 .. 0dB 0dB 0dB -27dB .. -27dB - {0x03D2,-26}, // 66 .. 3 6 2 2 .. 0dB -2dB -3dB -21dB .. -26dB - {0x03C3,-25}, // 67 .. 3 6 0 3 .. 0dB -2dB -8dB -15dB .. -25dB - {0x03F2,-24}, // 68 .. 3 7 2 2 .. 0dB 0dB -3dB -21dB .. -24dB - {0x03E3,-23}, // 69 .. 3 7 0 3 .. 0dB 0dB -8dB -15dB .. -23dB - {0x03B3,-22}, // 70 .. 3 5 2 3 .. 0dB -4dB -3dB -15dB .. -22dB - {0x03FA,-21}, // 71 .. 3 7 3 2 .. 0dB 0dB 0dB -21dB .. -21dB - {0x03D3,-20}, // 72 .. 3 6 2 3 .. 0dB -2dB -3dB -15dB .. -20dB - {0x03C4,-19}, // 73 .. 3 6 0 4 .. 0dB -2dB -8dB -9dB .. -19dB - {0x03F3,-18}, // 74 .. 3 7 2 3 .. 0dB 0dB -3dB -15dB .. -18dB - {0x03E4,-17}, // 75 .. 3 7 0 4 .. 0dB 0dB -8dB -9dB .. -17dB - {0x03C5,-16}, // 76 .. 3 6 0 5 .. 0dB -2dB -8dB -6dB .. -16dB - {0x03FB,-15}, // 77 .. 3 7 3 3 .. 0dB 0dB 0dB -15dB .. -15dB - {0x03E5,-14}, // 78 .. 3 7 0 5 .. 0dB 0dB -8dB -6dB .. -14dB - {0x03C6,-13}, // 79 .. 3 6 0 6 .. 0dB -2dB -8dB -3dB .. -13dB - {0x03F4,-12}, // 80 .. 3 7 2 4 .. 0dB 0dB -3dB -9dB .. -12dB - {0x03E6,-11}, // 81 .. 3 7 0 6 .. 0dB 0dB -8dB -3dB .. -11dB - {0x03C7,-10}, // 82 .. 3 6 0 7 .. 0dB -2dB -8dB 0dB .. -10dB - {0x03FC, -9}, // 83 .. 3 7 3 4 .. 0dB 0dB 0dB -9dB .. -9dB - {0x03E7, -8}, // 84 .. 3 7 0 7 .. 0dB 0dB -8dB 0dB .. -8dB - {0x03BE, -7}, // 85 .. 3 5 3 6 .. 0dB -4dB 0dB -3dB .. -7dB original - {0x03FD, -6}, // 86 .. 3 7 3 5 .. 0dB 0dB 0dB -6dB .. -6dB - {0x03DE, -5}, // 87 .. 3 6 3 6 .. 0dB -2dB 0dB -3dB .. -5dB - {0x03BF, -4}, // 88 .. 3 5 3 7 .. 0dB -4dB 0dB 0dB .. -4dB - {0x03FE, -3}, // 89 .. 3 7 3 6 .. 0dB 0dB 0dB -3dB .. -3dB - {0x03DF, -2}, // 90 .. 3 6 3 7 .. 0dB -2dB 0dB 0dB .. -2dB - {0x03FF, 0}, // 91 .. 3 7 3 7 .. 0dB 0dB 0dB 0dB .. 0dB + {0x0010,-88}, // 3 .. 0 0 2 0 .. -28dB -24dB -3dB -33dB .. -88dB + {0x0001,-87}, // 4 .. 0 0 0 1 .. -28dB -24dB -8dB -27dB .. -87dB + {0x0009,-85}, // 5 .. 0 0 1 1 .. -28dB -24dB -6dB -27dB .. -85dB + {0x0011,-82}, // 6 .. 0 0 2 1 .. -28dB -24dB -3dB -27dB .. -82dB + {0x0002,-81}, // 7 .. 0 0 0 2 .. -28dB -24dB -8dB -21dB .. -81dB + {0x000A,-79}, // 8 .. 0 0 1 2 .. -28dB -24dB -6dB -21dB .. -79dB + {0x0012,-76}, // 9 .. 0 0 2 2 .. -28dB -24dB -3dB -21dB .. -76dB + {0x0003,-75}, // 10 .. 0 0 0 3 .. -28dB -24dB -8dB -15dB .. -75dB + {0x000B,-73}, // 11 .. 0 0 1 3 .. -28dB -24dB -6dB -15dB .. -73dB + {0x0013,-70}, // 12 .. 0 0 2 3 .. -28dB -24dB -3dB -15dB .. -70dB + {0x0004,-69}, // 13 .. 0 0 0 4 .. -28dB -24dB -8dB -9dB .. -69dB + {0x000C,-67}, // 14 .. 0 0 1 4 .. -28dB -24dB -6dB -9dB .. -67dB + {0x000D,-64}, // 15 .. 0 0 1 5 .. -28dB -24dB -6dB -6dB .. -64dB + {0x001C,-61}, // 16 .. 0 0 3 4 .. -28dB -24dB 0dB - 9dB .. -61dB + {0x001D,-58}, // 17 .. 0 0 3 5 .. -28dB -24dB 0dB -6dB .. -58dB + {0x001E,-55}, // 18 .. 0 0 3 6 .. -28dB -24dB 0dB -3dB .. -55dB + {0x001F,-52}, // 19 .. 0 0 3 7 .. -28dB -24dB 0dB 0dB .. -52dB + {0x003E,-50}, // 20 .. 0 1 3 6 .. -28dB -19dB 0dB -3dB .. -50dB + {0x003F,-47}, // 21 .. 0 1 3 7 .. -28dB -19dB 0dB 0dB .. -47dB + {0x005E,-45}, // 22 .. 0 2 3 6 .. -28dB -14dB 0dB -3dB .. -45dB + {0x005F,-42}, // 23 .. 0 2 3 7 .. -28dB -14dB 0dB 0dB .. -42dB + {0x007E,-40}, // 24 .. 0 3 3 6 .. -28dB -9dB 0dB -3dB .. -40dB + {0x007F,-37}, // 25 .. 0 3 3 7 .. -28dB -9dB 0dB 0dB .. -37dB + {0x009F,-34}, // 26 .. 0 4 3 7 .. -28dB -6dB 0dB 0dB .. -34dB + {0x00BF,-32}, // 27 .. 0 5 3 7 .. -28dB -4dB 0dB 0dB .. -32dB + {0x00DF,-30}, // 28 .. 0 6 3 7 .. -28dB -2dB 0dB 0dB .. -30dB + {0x00FF,-28}, // 29 .. 0 7 3 7 .. -28dB 0dB 0dB 0dB .. -28dB + {0x01DF,-26}, // 30 .. 1 6 3 7 .. -24dB -2dB 0dB 0dB .. -26dB + {0x01FF,-24}, // 31 .. 1 7 3 7 .. -24dB 0dB 0dB 0dB .. -24dB + {0x02BF,-23}, // 32 .. 2 5 3 7 .. -19dB -4dB 0dB 0dB .. -23dB + {0x02DF,-21}, // 33 .. 2 6 3 7 .. -19dB -2dB 0dB -0dB .. -21dB + {0x02FF,-19}, // 34 .. 2 7 3 7 .. -19dB 0dB 0dB 0dB .. -19dB + {0x035E,-17}, // 35 .. 3 2 3 6 .. 0dB -14dB 0dB -3dB .. -17dB + {0x035F,-14}, // 36 .. 3 2 3 7 .. 0dB -14dB 0dB 0dB .. -14dB + {0x037E,-12}, // 37 .. 3 3 3 6 .. 0dB -9dB 0dB -3dB .. -12dB + {0x037F,-9}, // 38 .. 3 3 3 7 .. 0dB -9dB 0dB 0dB .. -9dB + {0x038F,-6}, // 39 .. 3 4 3 7 .. 0dB - 6dB 0dB 0dB .. -6dB + {0x03BF,-4}, // 40 .. 3 5 3 7 .. 0dB -4dB 0dB 0dB .. -4dB + {0x03DF,-2}, // 41 .. 3 6 3 7 .. 0dB - 2dB 0dB 0dB .. -2dB + {0x03FF,0} // 42 .. 3 7 3 7 .. 0dB 0dB 0dB 0dB .. 0dB }; const uint8_t gain_table_size = ARRAY_SIZE(gain_table); #else diff --git a/app/action.c b/app/action.c index 50e2166..643c317 100644 --- a/app/action.c +++ b/app/action.c @@ -55,7 +55,6 @@ inline static void ACTION_ScanRestart() { ACTION_Scan(true); }; void (*action_opt_table[])(void) = { [ACTION_OPT_NONE] = &FUNCTION_NOP, - [ACTION_OPT_FLASHLIGHT] = &ACTION_FlashLight, [ACTION_OPT_POWER] = &ACTION_Power, [ACTION_OPT_MONITOR] = &ACTION_Monitor, [ACTION_OPT_SCAN] = &ACTION_ScanRestart, @@ -64,6 +63,11 @@ void (*action_opt_table[])(void) = { [ACTION_OPT_VFO_MR] = &COMMON_SwitchVFOMode, [ACTION_OPT_SWITCH_DEMODUL] = &ACTION_SwitchDemodul, +#ifdef ENABLE_FLASHLIGHT + [ACTION_OPT_FLASHLIGHT] = &ACTION_FlashLight, +#else + [ACTION_OPT_FLASHLIGHT] = &FUNCTION_NOP, +#endif #ifdef ENABLE_VOX [ACTION_OPT_VOX] = &ACTION_Vox, #else diff --git a/app/app.c b/app/app.c index 6811b74..186ba31 100644 --- a/app/app.c +++ b/app/app.c @@ -21,7 +21,6 @@ #include #include "mdc1200.h" #include "app/action.h" -#include "debugging.h" #ifdef ENABLE_AIRCOPY #include "app/aircopy.h" #endif @@ -36,7 +35,9 @@ #include "app/main.h" #include "app/menu.h" #include "app/scanner.h" +#ifdef ENABLE_UART #include "app/uart.h" +#endif #include "ARMCM0.h" #include "audio.h" #include "board.h" @@ -1133,27 +1134,28 @@ static void CheckKeys(void) void APP_TimeSlice10ms(void) { + gNextTimeslice = false; gFlashLightBlinkCounter++; - #ifdef ENABLE_BOOT_BEEPS - if (boot_counter_10ms > 0) - if ((boot_counter_10ms % 25) == 0) - AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL); + if (boot_counter_10ms > 0 && (boot_counter_10ms % 25) == 0) { + AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL); + } #endif #ifdef ENABLE_AM_FIX - if (gRxVfo->Modulation == MODULATION_AM) -AM_fix_10ms(gEeprom.RX_VFO); + if (gRxVfo->Modulation == MODULATION_AM) { + AM_fix_10ms(gEeprom.RX_VFO); + } #endif - if (UART_IsCommandAvailable()) - { +#ifdef ENABLE_UART + if (UART_IsCommandAvailable()) { __disable_irq(); UART_HandleCommand(); __enable_irq(); } - +#endif if (gReducedService) return; @@ -1312,6 +1314,7 @@ void cancelUserInputModes(void) // this is called once every 500ms void APP_TimeSlice500ms(void) { + gNextTimeslice_500ms = false; bool exit_menu = false; // Skipped authentic device check @@ -1374,86 +1377,23 @@ void APP_TimeSlice500ms(void) #endif // Skipped authentic device check + if (!gCssBackgroundScan #ifdef ENABLE_FMRADIO - if (gFmRadioCountdown_500ms > 0) - { - gFmRadioCountdown_500ms--; - if (gFmRadioMode) // 1of11 - return; - } + && (gFM_ScanState == FM_SCAN_OFF || gAskToSave) #endif - - if (gBacklightCountdown_500ms > 0 && !gAskToSave && !gCssBackgroundScan && - // don't turn off backlight if user is in backlight menu option - - !(gScreenToDisplay == DISPLAY_MENU && (UI_MENU_GetCurrentMenuId() == MENU_ABR || UI_MENU_GetCurrentMenuId() == MENU_ABR_MAX))) - { - if (--gBacklightCountdown_500ms == 0) { - if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) { - // backlight is not set to be always on - BACKLIGHT_TurnOff(); - } - } - } - - - - if (gReducedService) - { - BOARD_ADC_GetBatteryInfo(&gBatteryCurrentVoltage, &gBatteryCurrent); - - if (gBatteryCurrent > 500 || gBatteryCalibration[3] < gBatteryCurrentVoltage) - { -#ifdef ENABLE_OVERLAY - overlay_FLASH_RebootToBootloader(); -#else - NVIC_SystemReset(); -#endif - } - - return; - } - - gBatteryCheckCounter++; - - // Skipped authentic device check - - if (gCurrentFunction != FUNCTION_TRANSMIT) - { - - if ((gBatteryCheckCounter & 1) == 0) - { - BOARD_ADC_GetBatteryInfo(&gBatteryVoltages[gBatteryVoltageIndex++], &gBatteryCurrent); - if (gBatteryVoltageIndex > 3) - gBatteryVoltageIndex = 0; - BATTERY_GetReadings(true); - } - } - - // regular display updates (once every 2 sec) - if need be - if ((gBatteryCheckCounter & 3) == 0) - { - if (gChargingWithTypeC ) - gUpdateStatus = true; -#ifdef ENABLE_SHOW_CHARGE_LEVEL - if (gChargingWithTypeC) - gUpdateDisplay = true; -#endif - } - -#ifdef ENABLE_FMRADIO - if ((gFM_ScanState == FM_SCAN_OFF || gAskToSave) && !gCssBackgroundScan) -#else - if (!gCssBackgroundScan) -#endif - { + ) { + if (gScanStateDir == SCAN_OFF && !SCANNER_IsScanning() #ifdef ENABLE_AIRCOPY - if (gScanStateDir == SCAN_OFF && gScreenToDisplay != DISPLAY_AIRCOPY && !SCANNER_IsScanning()) -#else - if (gScanStateDir == SCAN_OFF && !SCANNER_IsScanning()) + && gScreenToDisplay != DISPLAY_AIRCOPY #endif - { + ) { + if (gKeyLockCountdown > 0 && !gDTMF_InputMode && gScreenToDisplay != DISPLAY_MENU) { + if (--gKeyLockCountdown == 0) { + gEeprom.KEY_LOCK = true; // lock the keyboard + gUpdateStatus = true; // lock symbol needs showing + } + } if (exit_menu) { @@ -1488,25 +1428,25 @@ void APP_TimeSlice500ms(void) gUpdateStatus = true; gUpdateDisplay = true; - { - GUI_DisplayType_t disp = DISPLAY_INVALID; + GUI_DisplayType_t disp = DISPLAY_INVALID; #ifdef ENABLE_FMRADIO - if (gFmRadioMode && ! FUNCTION_IsRx()) { - disp = DISPLAY_FM; - } + if (gFmRadioMode && ! FUNCTION_IsRx()) { + disp = DISPLAY_FM; + } #endif - if (disp == DISPLAY_INVALID) - { + if (disp == DISPLAY_INVALID) { #ifndef ENABLE_NO_CODE_SCAN_TIMEOUT - if (!SCANNER_IsScanning()) + if (!SCANNER_IsScanning()) #endif - disp = DISPLAY_MAIN; + { + disp = DISPLAY_MAIN; } + } - if (disp != DISPLAY_INVALID) - GUI_SelectNextDisplay(disp); + if (disp != DISPLAY_INVALID) { + GUI_SelectNextDisplay(disp); } } } @@ -1798,101 +1738,97 @@ static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gUpdateStatus = true; } - if (!bFlag) - { - if (gCurrentFunction == FUNCTION_TRANSMIT) - { // transmitting - + if (bFlag) { + goto Skip; + } + if (gCurrentFunction == FUNCTION_TRANSMIT) { #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) - if (gAlarmState == ALARM_STATE_OFF) -#endif - { - char Code; - - if (Key == KEY_PTT) - { - GENERIC_Key_PTT(bKeyPressed); - goto Skip; - } - - if (Key == KEY_SIDE2) - { // transmit 1750Hz tone - Code = 0xFE; - } - else - { - Code = DTMF_GetCharacter(Key - KEY_0); - if (Code == 0xFF) - goto Skip; - - // transmit DTMF keys - } - - if (!bKeyPressed || bKeyHeld) - { - if (!bKeyPressed) - { - AUDIO_AudioPathOff(); - - gEnableSpeaker = false; - - BK4819_ExitDTMF_TX(false); - - if (gCurrentVfo->SCRAMBLING_TYPE == 0 || !gSetting_ScrambleEnable) - BK4819_DisableScramble(); - else - BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1); - } - } - else - { - if (gEeprom.DTMF_SIDE_TONE) - { // user will here the DTMF tones in speaker - AUDIO_AudioPathOn(); - gEnableSpeaker = true; - } - - BK4819_DisableScramble(); - - if (Code == 0xFE) - BK4819_TransmitTone(gEeprom.DTMF_SIDE_TONE, 1750); - else - BK4819_PlayDTMFEx(gEeprom.DTMF_SIDE_TONE, Code); - } - } -#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) - else if ((!bKeyHeld && bKeyPressed) || (gAlarmState == ALARM_STATE_TX1750 && bKeyHeld && !bKeyPressed)) - { - ALARM_Off(); - - if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) - FUNCTION_Select(FUNCTION_FOREGROUND); - else - gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; - - if (Key == KEY_PTT) - gPttWasPressed = true; - else - if (!bKeyHeld) - gPttWasReleased = true; - } -#endif - } - - else if (Key != KEY_SIDE1 && Key != KEY_SIDE2 && gScreenToDisplay != DISPLAY_INVALID) { - ProcessKeysFunctions[gScreenToDisplay](Key, bKeyPressed, bKeyHeld); - } - else -#ifdef ENABLE_AIRCOPY - if (!SCANNER_IsScanning() && gScreenToDisplay != DISPLAY_AIRCOPY) -#else - if (!SCANNER_IsScanning()) + if (gAlarmState == ALARM_STATE_OFF) #endif { - ACTION_Handle(Key, bKeyPressed, bKeyHeld); + char Code; + + if (Key == KEY_PTT) + { + GENERIC_Key_PTT(bKeyPressed); + goto Skip; + } + + if (Key == KEY_SIDE2) + { // transmit 1750Hz tone + Code = 0xFE; + } + else + { + + Code = DTMF_GetCharacter(Key - KEY_0); + if (Code == 0xFF) + goto Skip; + + // transmit DTMF keys + } + + if (!bKeyPressed || bKeyHeld) + { + if (!bKeyPressed) + { + AUDIO_AudioPathOff(); + + gEnableSpeaker = false; + + BK4819_ExitDTMF_TX(false); + + if (gCurrentVfo->SCRAMBLING_TYPE == 0 || !gSetting_ScrambleEnable) + BK4819_DisableScramble(); + else + BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1); + } + } + else + { + if (gEeprom.DTMF_SIDE_TONE) + { // user will here the DTMF tones in speaker + AUDIO_AudioPathOn(); + gEnableSpeaker = true; + } + + BK4819_DisableScramble(); + + if (Code == 0xFE) + BK4819_TransmitTone(gEeprom.DTMF_SIDE_TONE, 1750); + else + BK4819_PlayDTMFEx(gEeprom.DTMF_SIDE_TONE, Code); + } } - else if (!bKeyHeld && bKeyPressed) - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; +#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) + else if ((!bKeyHeld && bKeyPressed) || (gAlarmState == ALARM_STATE_TX1750 && bKeyHeld && !bKeyPressed)) { + ALARM_Off(); + + if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) + FUNCTION_Select(FUNCTION_FOREGROUND); + else + gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; + + if (Key == KEY_PTT) + gPttWasPressed = true; + else + if (!bKeyHeld) + gPttWasReleased = true; + } +#endif + } + else if (Key != KEY_SIDE1 && Key != KEY_SIDE2 && gScreenToDisplay != DISPLAY_INVALID) { + ProcessKeysFunctions[gScreenToDisplay](Key, bKeyPressed, bKeyHeld); + } + else if (!SCANNER_IsScanning() +#ifdef ENABLE_AIRCOPY + && gScreenToDisplay != DISPLAY_AIRCOPY +#endif + ) { + ACTION_Handle(Key, bKeyPressed, bKeyHeld); + } + else if (!bKeyHeld && bKeyPressed) { + gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; } Skip: @@ -1921,25 +1857,24 @@ static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gRequestSaveSettings = false; gUpdateStatus = true; } - #ifdef ENABLE_FMRADIO if (gRequestSaveFM) - { - if (!bKeyHeld) - SETTINGS_SaveFM(); - else - gFlagSaveFM = true; - gRequestSaveFM = false; - } + { + gRequestSaveFM = false; + if (!bKeyHeld) + SETTINGS_SaveFM(); + else + gFlagSaveFM = true; + } #endif if (gRequestSaveVFO) { + gRequestSaveVFO = false; if (!bKeyHeld) SETTINGS_SaveVfoIndices(); else gFlagSaveVfo = true; - gRequestSaveVFO = false; } if (gRequestSaveChannel > 0) diff --git a/app/dtmf.c b/app/dtmf.c index 5dced36..4040877 100644 --- a/app/dtmf.c +++ b/app/dtmf.c @@ -109,7 +109,7 @@ bool DTMF_GetContact(const int Index, char *pContact) EEPROM_ReadBuffer(0x1C00 + (Index * 16), pContact, 16); i = (int)pContact[0] - ' '; } - return (i < 0 || i >= 95) ? false : true; + return (i >= 0 && i < 95); } bool DTMF_FindContact(const char *pContact, char *pResult) @@ -130,7 +130,7 @@ bool DTMF_FindContact(const char *pContact, char *pResult) if (j == 3) { - memmove(pResult, Contact, 8); +memcpy(pResult, Contact, 8); pResult[8] = 0; return true; } @@ -361,8 +361,8 @@ void DTMF_HandleRequest(void) memset(gDTMF_Callee, 0, sizeof(gDTMF_Callee)); memset(gDTMF_Caller, 0, sizeof(gDTMF_Caller)); - memmove(gDTMF_Callee, gDTMF_RX + Offset + 0, 3); - memmove(gDTMF_Caller, gDTMF_RX + Offset + 4, 3); + memcpy(gDTMF_Callee, gDTMF_RX + Offset + 0, 3); + memcpy(gDTMF_Caller, gDTMF_RX + Offset + 4, 3); DTMF_clear_RX(); diff --git a/app/fm.c b/app/fm.c index 9259a31..5c5bf64 100644 --- a/app/fm.c +++ b/app/fm.c @@ -621,6 +621,7 @@ void FM_Play(void) void FM_Start(void) { + gDualWatchActive = false; gFmRadioMode = true; gFM_ScanState = FM_SCAN_OFF; gFM_RestoreCountdown_10ms = 0; diff --git a/app/generic.c b/app/generic.c index 6c5e50d..dcb9eee 100644 --- a/app/generic.c +++ b/app/generic.c @@ -83,7 +83,10 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld) } else // short pressed { + +#ifdef ENABLE_FMRADIO if (gScreenToDisplay != DISPLAY_FM) +#endif { gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; return; @@ -229,8 +232,14 @@ void GENERIC_Key_PTT(bool bKeyPressed) done: gPttDebounceCounter = 0; - if (gScreenToDisplay != DISPLAY_MENU && gRequestDisplayScreen != DISPLAY_FM) // 1of11 .. don't close the menu + if (gScreenToDisplay != DISPLAY_MENU +#ifdef ENABLE_FMRADIO + && gRequestDisplayScreen != DISPLAY_FM +#endif + ) { + // 1of11 .. don't close the menu gRequestDisplayScreen = DISPLAY_MAIN; + } gUpdateStatus = true; gUpdateDisplay = true; } \ No newline at end of file diff --git a/app/main.c b/app/main.c index 1b6073f..5f979b5 100644 --- a/app/main.c +++ b/app/main.c @@ -583,7 +583,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) { #endif ) { // start entering a DTMF string gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - memmove(gDTMF_InputBox, gDTMF_String, MIN(sizeof(gDTMF_InputBox), sizeof(gDTMF_String) - 1)); + memcpy(gDTMF_InputBox, gDTMF_String, MIN(sizeof(gDTMF_InputBox), sizeof(gDTMF_String) - 1)); gDTMF_InputBox_Index = 0; gDTMF_InputMode = true; diff --git a/app/mdc1200.c b/app/mdc1200.c index ef90a1a..942bbbd 100644 --- a/app/mdc1200.c +++ b/app/mdc1200.c @@ -533,7 +533,7 @@ uint16_t extractHex(const char *str) { } return result; } -#ifdef ENABLE_MDC1200_CONRACT +#ifdef ENABLE_MDC1200_CONTACT uint8_t contact_num=0; uint16_t MDC_ADD[4] = {0x1D48, 0x1D88, 0x1DC8,0x1F08}; void mdc1200_update_contact_num() diff --git a/app/menu.c b/app/menu.c index 7e2a8c1..9ae6d36 100644 --- a/app/menu.c +++ b/app/menu.c @@ -691,7 +691,7 @@ void MENU_AcceptSetting(void) { GUI_SelectNextDisplay(DISPLAY_MAIN); gDTMF_InputMode = true; gDTMF_InputBox_Index = 3; - memmove(gDTMF_InputBox, gDTMF_ID, 4); + memcpy(gDTMF_InputBox, gDTMF_ID, 4); gRequestDisplayScreen = DISPLAY_INVALID; } return; @@ -1339,6 +1339,9 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) { gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; if (!gCssBackgroundScan) { + /* Backlight related menus set full brightness. Set it back to the configured value, + just in case we are exiting from one of them. */ + BACKLIGHT_TurnOn(); if (gIsInSubMenu) { if (gInputBoxIndex == 0 || UI_MENU_GetCurrentMenuId() != MENU_OFFSET) { gAskForConfirmation = 0; @@ -1459,8 +1462,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) { edit_index = 0; // 'edit_index' is going to be used as the cursor position // make a copy so we can test for change when exiting the menu item - memmove(edit_original, edit, sizeof(edit_original)); - + memcpy(edit_original, edit, sizeof(edit_original)); return; } else if (edit_index >= 0 && edit_index < 10) { // editing the channel name characters @@ -1637,8 +1639,9 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) gRequestDisplayScreen = DISPLAY_MENU; - if (UI_MENU_GetCurrentMenuId() != MENU_ABR && - gEeprom.BACKLIGHT_TIME == 0) // backlight always off and not in the backlight menu + if (UI_MENU_GetCurrentMenuId() != MENU_ABR + && UI_MENU_GetCurrentMenuId() != MENU_ABR_MAX + && gEeprom.BACKLIGHT_TIME == 0) // backlight always off and not in the backlight menu { BACKLIGHT_TurnOff(); } diff --git a/app/uart.c b/app/uart.c index e85f632..ab7f085 100644 --- a/app/uart.c +++ b/app/uart.c @@ -480,11 +480,11 @@ bool UART_IsCommandAvailable(void) if (TailIndex < Index) { const uint16_t ChunkSize = sizeof(UART_DMA_Buffer) - Index; - memmove(UART_Command.Buffer, UART_DMA_Buffer + Index, ChunkSize); - memmove(UART_Command.Buffer + ChunkSize, UART_DMA_Buffer, TailIndex); + memcpy(UART_Command.Buffer, UART_DMA_Buffer + Index, ChunkSize); + memcpy(UART_Command.Buffer + ChunkSize, UART_DMA_Buffer, TailIndex); } else - memmove(UART_Command.Buffer, UART_DMA_Buffer + Index, TailIndex - Index); + memcpy(UART_Command.Buffer, UART_DMA_Buffer + Index, TailIndex - Index); TailIndex = DMA_INDEX(TailIndex, 2); if (TailIndex < gUART_WriteIndex) diff --git a/audio.c b/audio.c index e0b4fa7..db75b88 100644 --- a/audio.c +++ b/audio.c @@ -205,7 +205,7 @@ volatile bool gFlagPlayQueuedVoice; VOICE_ID_t gAnotherVoiceID = VOICE_ID_INVALID; -void AUDIO_PlayVoice(uint8_t VoiceID) +static void AUDIO_PlayVoice(uint8_t VoiceID) { unsigned int i; diff --git a/audio.h b/audio.h index e32575f..55662aa 100644 --- a/audio.h +++ b/audio.h @@ -149,7 +149,6 @@ static inline void AUDIO_AudioPathOff(void) { extern volatile bool gFlagPlayQueuedVoice; extern VOICE_ID_t gAnotherVoiceID; - void AUDIO_PlayVoice(uint8_t VoiceID); void AUDIO_PlaySingleVoice(bool bFlag); void AUDIO_SetVoiceID(uint8_t Index, VOICE_ID_t VoiceID); uint8_t AUDIO_SetDigitVoice(uint8_t Index, uint16_t Value); diff --git a/bitmaps.c b/bitmaps.c index e98a987..3ac1a0c 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -5,84 +5,87 @@ // turn your monitor 90-deg anti-clockwise to see the images const uint8_t BITMAP_POWERSAVE[8] = -{ - #if 0 - // "S" - 0b00000000, - 0b00100110, - 0b01001001, - 0b01001001, - 0b01001001, - 0b01001001, - 0b01001001, - 0b00110010 - #else - // "PS" - 0b00000000, - 0b01111111, - 0b00010001, - 0b00001110, - 0b00000000, - 0b01000110, - 0b01001001, - 0b00110001 - #endif -}; + { + // "PS" + 0b00000000, + 0b01111111, + 0b00010001, + 0b00001110, + 0b00000000, + 0b01000110, + 0b01001001, + 0b00110001 + + }; const uint8_t BITMAP_TX[8] = -{ // "TX" - 0b00000000, - 0b00000001, - 0b00000001, - 0b01111111, - 0b00000001, - 0b00000001, - 0b00000000, - 0b00000000 -}; + { // "TX" + 0b00000000, + 0b00000001, + 0b00000001, + 0b01111111, + 0b00000001, + 0b00000001, + 0b00000000, + 0b00000000 + }; const uint8_t BITMAP_RX[8] = -{ // "RX" - 0b00000000, - 0b01111111, - 0b00001001, - 0b00011001, - 0b01100110, - 0b00000000, - 0b00000000, - 0b00000000 -}; + { // "RX" + 0b00000000, + 0b01111111, + 0b00001001, + 0b00011001, + 0b01100110, + 0b00000000, + 0b00000000, + 0b00000000 + }; + +const uint8_t BITMAP_FM[10] = + { // "FM" + 0b00000000, + 0b01111111, + 0b00001001, + 0b00000001, + 0b00000000, + 0b01111111, + 0b00000010, + 0b00001100, + 0b00000010, + 0b01111111 + }; const uint8_t BITMAP_BatteryLevel[2] = -{ - 0b01011101, - 0b01011101 -}; + { + 0b01011101, + 0b01011101 + }; #ifndef ENABLE_REVERSE_BAT_SYMBOL - // Quansheng way (+ pole to the left) - const uint8_t BITMAP_BatteryLevel1[17] = - { - 0b00000000, - 0b00111110, - 0b00100010, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01000001, - 0b01111111 - }; +// Quansheng way (+ pole to the left) +const uint8_t BITMAP_BatteryLevel1[17] = + { + 0b00000000, + 0b00111110, + 0b00100010, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01000001, + 0b01111111 + }; #else - // reversed (+ pole to the right) +// reversed (+ pole to the right) const uint8_t BITMAP_BatteryLevel1[17] = { 0b00000000, @@ -106,40 +109,40 @@ const uint8_t BITMAP_BatteryLevel[2] = #endif const uint8_t BITMAP_USB_C[9] = -{ // USB symbol - 0b00000000, - 0b00011100, - 0b00100111, - 0b01000100, - 0b01000100, - 0b01000100, - 0b01000100, - 0b00100111, - 0b00011100 -}; + { // USB symbol + 0b00000000, + 0b00011100, + 0b00100111, + 0b01000100, + 0b01000100, + 0b01000100, + 0b01000100, + 0b00100111, + 0b00011100 + }; const uint8_t BITMAP_KeyLock[6] = -{ // teeny padlock symbol - 0b00000000, - 0b01111100, - 0b01000110, - 0b01000101, - 0b01000110, - 0b01111100 -}; + { // teeny padlock symbol + 0b00000000, + 0b01111100, + 0b01000110, + 0b01000101, + 0b01000110, + 0b01111100 + }; const uint8_t BITMAP_F_Key[6] = -{ // F-Key symbol - 0b00000000, - 0b01011111, - 0b01000101, - 0b01000101, - 0b01000101, - 0b01000001 -}; + { // F-Key symbol + 0b00000000, + 0b01011111, + 0b01000101, + 0b01000101, + 0b01000101, + 0b01000001 + }; #ifdef ENABLE_VOX - const uint8_t BITMAP_VOX[18] = +const uint8_t BITMAP_VOX[18] = { // "VOX" 0b00000000, 0b00011111, @@ -162,75 +165,61 @@ const uint8_t BITMAP_F_Key[6] = }; #endif -#if 0 - const uint8_t BITMAP_WX[12] = - { // "WX" - 0b00000000, - 0b01111111, - 0b00100000, - 0b00011000, - 0b00100000, - 0b01111111, - 0b00000000, - 0b01100011, - 0b00010100, - 0b00001000, - 0b00010100, - 0b01100011 - }; -#else - // 'XB' (cross-band/cross-VFO) - const uint8_t BITMAP_XB[12] = - { // "XB" - 0b00000000, - 0b01100011, - 0b00010100, - 0b00001000, - 0b00010100, - 0b01100011, - 0b00000000, - 0b01111111, - 0b01001001, - 0b01001001, - 0b01001001, - 0b00110110 - }; -#endif -const uint8_t BITMAP_TDR1[15] = -{ // "DWR" - 0b01111111, - 0b01000001, - 0b01000001, - 0b00111110, - 0b00000000, - 0b01111111, - 0b00100000, - 0b00011000, - 0b00100000, - 0b01111111, - 0b00000000, - 0b01111111, - 0b00011001, - 0b00101001, - 0b01000110 -}; +// 'XB' (cross-band/cross-VFO) +const uint8_t BITMAP_XB[12] = + { // "XB" + 0b00000000, + 0b01100011, + 0b00010100, + 0b00001000, + 0b00010100, + 0b01100011, + 0b00000000, + 0b01111111, + 0b01001001, + 0b01001001, + 0b01001001, + 0b00110110 + }; -const uint8_t BITMAP_TDR2[9] = -{ // "><" .. DW on hold - 0b00100010, - 0b00110110, - 0b00011100, - 0b00001000, - 0b00000000, - 0b00001000, - 0b00011100, - 0b00110110, - 0b00100010, -}; + +const uint8_t BITMAP_TDR1[16] = + { // "DWR" + 0b00000000, + 0b01111111, + 0b01000001, + 0b01000001, + 0b00111110, + 0b00000000, + 0b01111111, + 0b00100000, + 0b00011000, + 0b00100000, + 0b01111111, + 0b00000000, + 0b01111111, + 0b00011001, + 0b00101001, + 0b01000110 + }; + +const uint8_t BITMAP_TDR2[10] = + { // "><" .. DW on hold + 0b00000000, + 0b00100010, + 0b00110110, + 0b00011100, + 0b00001000, + 0b00000000, + 0b00001000, + 0b00011100, + 0b00110110, + 0b00100010, + }; #ifdef ENABLE_VOICE - const uint8_t BITMAP_VoicePrompt[9] = +const uint8_t BITMAP_VoicePrompt[9] = { 0b00000000, 0b00011000, @@ -245,7 +234,7 @@ const uint8_t BITMAP_TDR2[9] = #endif #ifdef ENABLE_NOAA - const uint8_t BITMAP_NOAA[11] = +const uint8_t BITMAP_NOAA[11] = { // "NS" 0b00000000, 0b01111111, @@ -262,76 +251,64 @@ const uint8_t BITMAP_TDR2[9] = #endif const uint8_t BITMAP_Antenna[5] = -{ - 0b00000011, - 0b00000101, - 0b01111111, - 0b00000101, - 0b00000011 -}; - -const uint8_t BITMAP_MARKER[8] = -{ - 0b11111111, - 0b11111111, - 0b01111110, - 0b01111110, - 0b00111100, - 0b00111100, - 0b00011000, - 0b00011000 -}; + { + 0b00000011, + 0b00000101, + 0b01111111, + 0b00000101, + 0b00000011 + }; const uint8_t BITMAP_VFO_Default[8] = -{ - 0b00000000, - 0b01111111, - 0b01111111, - 0b00111110, - 0b00111110, - 0b00011100, - 0b00011100, - 0b00001000 -}; + { + 0b00000000, + 0b01111111, + 0b01111111, + 0b00111110, + 0b00111110, + 0b00011100, + 0b00011100, + 0b00001000 + }; const uint8_t BITMAP_VFO_NotDefault[8] = -{ - 0b00000000, - 0b01000001, - 0b01000001, - 0b00100010, - 0b00100010, - 0b00010100, - 0b00010100, - 0b00001000 -}; + { + 0b00000000, + 0b01000001, + 0b01000001, + 0b00100010, + 0b00100010, + 0b00010100, + 0b00010100, + 0b00001000 + }; const uint8_t BITMAP_ScanList1[6] = -{ // 'I' symbol - 0b00000000, - 0b00000000, - 0b01000010, - 0b01111110, - 0b01000010, - 0b00000000 -}; + { // 'I' symbol + 0b00000000, + 0b00000000, + 0b01000010, + 0b01111110, + 0b01000010, + 0b00000000 + }; const uint8_t BITMAP_ScanList2[6] = -{ // 'II' symbol - 0b00000000, - 0b01000010, - 0b01111110, - 0b01000010, - 0b01111110, - 0b01000010 -}; + { // 'II' symbol + 0b00000000, + 0b01000010, + 0b01111110, + 0b01000010, + 0b01111110, + 0b01000010 + }; const uint8_t BITMAP_compand[6] = -{ - 0b00000000, - 0b00111100, - 0b01000010, - 0b01000010, - 0b01000010, - 0b00100100 -}; + { + 0b00000000, + 0b00111100, + 0b01000010, + 0b01000010, + 0b01000010, + 0b00100100 + }; \ No newline at end of file diff --git a/bitmaps.h b/bitmaps.h index f346c49..c3d23f1 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -7,7 +7,7 @@ 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_FM[10]; extern const uint8_t BITMAP_BatteryLevel[2]; extern const uint8_t BITMAP_BatteryLevel1[17]; @@ -18,26 +18,24 @@ extern const uint8_t BITMAP_KeyLock[6]; extern const uint8_t BITMAP_F_Key[6]; #ifdef ENABLE_VOX - extern const uint8_t BITMAP_VOX[18]; +extern const uint8_t BITMAP_VOX[18]; #endif extern const uint8_t BITMAP_XB[12]; -extern const uint8_t BITMAP_TDR1[15]; -extern const uint8_t BITMAP_TDR2[9]; +extern const uint8_t BITMAP_TDR1[16]; +extern const uint8_t BITMAP_TDR2[10]; #ifdef ENABLE_VOICE - extern const uint8_t BITMAP_VoicePrompt[9]; +extern const uint8_t BITMAP_VoicePrompt[9]; #endif #ifdef ENABLE_NOAA - extern const uint8_t BITMAP_NOAA[11]; +extern const uint8_t BITMAP_NOAA[11]; #endif extern const uint8_t BITMAP_Antenna[5]; -extern const uint8_t BITMAP_MARKER[8]; - extern const uint8_t BITMAP_VFO_Default[8]; extern const uint8_t BITMAP_VFO_NotDefault[8]; @@ -46,5 +44,4 @@ extern const uint8_t BITMAP_ScanList2[6]; extern const uint8_t BITMAP_compand[6]; -#endif - +#endif \ No newline at end of file diff --git a/board.c b/board.c index 44a77ac..ad1951a 100644 --- a/board.c +++ b/board.c @@ -497,6 +497,9 @@ void BOARD_Init(void) #ifdef ENABLE_FMRADIO BK1080_Init(0, false); #endif - CRC_Init(); -} +#if defined(ENABLE_UART) || defined(ENABLED_AIRCOPY) + CRC_Init(); +#endif + +} diff --git a/debugging.h b/debugging.h index 9f1bed9..1ea660c 100644 --- a/debugging.h +++ b/debugging.h @@ -1,6 +1,6 @@ #ifndef DEBUGGING_H #define DEBUGGING_H - +#ifdef ENABLE_UART #include "driver/uart.h" #include "driver/bk4819.h" #include "string.h" @@ -9,28 +9,31 @@ #include "am_fix.h" -static inline void LogUart(char * str) + +static inline void LogUart(const char *const str) { - UART_Send(str, strlen(str)); + UART_Send(str, strlen(str)); } static inline void LogRegUart(uint16_t reg) { - uint16_t regVal = BK4819_ReadRegister(reg); - char buf[32]; - sprintf(buf, "reg%02X: %04X\n", reg, regVal); - LogUart(buf); + uint16_t regVal = BK4819_ReadRegister(reg); + char buf[32]; + sprintf(buf, "reg%02X: %04X\n", reg, regVal); + LogUart(buf); } - static inline void LogPrint() { - uint16_t rssi = BK4819_GetRSSI(); - uint16_t reg7e = BK4819_ReadRegister(0x7E); - char buf[32]; - sprintf(buf, "reg7E: %d %2d %6d %2d %d rssi: %d\n", - (reg7e >> 15), (reg7e >> 12) & 0b111, (reg7e >> 5) & 0b1111111, (reg7e >> 2) & 0b111, (reg7e >> 0) & 0b11, rssi); - LogUart(buf); + uint16_t rssi = BK4819_GetRSSI(); + uint16_t reg7e = BK4819_ReadRegister(0x7E); + char buf[32]; + sprintf(buf, "reg7E: %d %2d %6d %2d %d rssi: %d\n", (reg7e >> 15), + (reg7e >> 12) & 0b111, (reg7e >> 5) & 0b1111111, + (reg7e >> 2) & 0b111, (reg7e >> 0) & 0b11, rssi); + LogUart(buf); } +#endif + #endif \ No newline at end of file diff --git a/driver/backlight.c b/driver/backlight.c index e4442ac..52e8fe6 100644 --- a/driver/backlight.c +++ b/driver/backlight.c @@ -64,12 +64,12 @@ void BACKLIGHT_TurnOn(void) { case 1: // 5 sec case 2: // 10 sec case 3: // 20 sec - gBacklightCountdown_500ms = 1 + (2 << (gEeprom.BACKLIGHT_TIME - 1)) * 10; + gBacklightCountdown_500ms = 1 + (2 << (gEeprom.BACKLIGHT_TIME - 1)) * 5; break; case 4: // 1 min case 5: // 2 min case 6: // 4 min - gBacklightCountdown_500ms = 1 + (2 << (gEeprom.BACKLIGHT_TIME - 4)) * 120; + gBacklightCountdown_500ms = 1 + (2 << (gEeprom.BACKLIGHT_TIME - 4)) * 60; break; case 7: // always on gBacklightCountdown_500ms = 0; @@ -96,7 +96,16 @@ bool BACKLIGHT_IsOn() { return backlightOn; } -void BACKLIGHT_SetBrightness(uint8_t brigtness) { +static uint8_t currentBrightness; + +void BACKLIGHT_SetBrightness(uint8_t brigtness) +{ + currentBrightness = brigtness; PWM_PLUS0_CH0_COMP = (1 << brigtness) - 1; //PWM_PLUS0_SWLOAD = 1; } + +uint8_t BACKLIGHT_GetBrightness(void) +{ + return currentBrightness; +} \ No newline at end of file diff --git a/driver/backlight.h b/driver/backlight.h index 59e1551..f22791b 100644 --- a/driver/backlight.h +++ b/driver/backlight.h @@ -36,6 +36,6 @@ void BACKLIGHT_TurnOn(); void BACKLIGHT_TurnOff(); bool BACKLIGHT_IsOn(); void BACKLIGHT_SetBrightness(uint8_t brigtness); - +uint8_t BACKLIGHT_GetBrightness(void); #endif diff --git a/driver/bk4819.c b/driver/bk4819.c index 0ce24e9..901c979 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -16,13 +16,13 @@ #include // NULL -#include "audio.h" +#include "../audio.h" +#include "../bsp/dp32g030/gpio.h" +#include "../bsp/dp32g030/portcon.h" #include "bk4819.h" -#include "bsp/dp32g030/gpio.h" -#include "bsp/dp32g030/portcon.h" -#include "driver/gpio.h" -#include "driver/system.h" -#include "driver/systick.h" +#include "gpio.h" +#include "system.h" +#include "systick.h" #ifdef ENABLE_MDC1200 #include "app/mdc1200.h" #endif diff --git a/driver/crc.c b/driver/crc.c index b1aaa8d..cb6a92c 100644 --- a/driver/crc.c +++ b/driver/crc.c @@ -14,9 +14,8 @@ * limitations under the License. */ -#include "bsp/dp32g030/crc.h" -#include "driver/crc.h" -#include "driver/uart.h" +#include "../bsp/dp32g030/crc.h" +#include "crc.h" void CRC_Init(void) { diff --git a/driver/keyboard.c b/driver/keyboard.c index d0e1ace..6dfb813 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -117,19 +117,12 @@ KEY_Code_t KEYBOARD_Poll(void) GPIOA->DATA &= keyboard[j].set_to_zero_mask; // Read all 4 GPIO pins at once .. with de-noise, max of 8 sample loops - for (i = 0, k = 0, reg = 0; i < 3 && k < 8; i++, k++) - { - uint16_t reg2; - - SYSTICK_DelayUs(1); - - reg2 = GPIOA->DATA; - if (reg != reg2) - { // noise - reg = reg2; - i = 0; - } - } + for (i = 0, k = 0, reg = 0; i < 3 && k < 8; i++, k++) { + SYSTICK_DelayUs(1); + uint16_t reg2 = GPIOA->DATA; + i *= reg == reg2; + reg = reg2; + } if (i < 3) break; // noise is too bad diff --git a/driver/system.c b/driver/system.c index b956662..a605248 100644 --- a/driver/system.c +++ b/driver/system.c @@ -14,10 +14,10 @@ * limitations under the License. */ -#include "bsp/dp32g030/pmu.h" -#include "bsp/dp32g030/syscon.h" -#include "driver/system.h" -#include "driver/systick.h" +#include "../bsp/dp32g030/pmu.h" +#include "../bsp/dp32g030/syscon.h" +#include "system.h" +#include "systick.h" void SYSTEM_DelayMs(uint32_t Delay) { diff --git a/driver/systick.c b/driver/systick.c index e836c37..086dce6 100644 --- a/driver/systick.c +++ b/driver/systick.c @@ -15,9 +15,8 @@ */ #include "ARMCM0.h" -#include "driver/systick.h" -#include "misc.h" - +#include "systick.h" +#include "../misc.h" // 0x20000324 static uint32_t gTickMultiplier; @@ -26,21 +25,25 @@ void SYSTICK_Init(void) SysTick_Config(480000); gTickMultiplier = 48; } - void SYSTICK_DelayUs(uint32_t Delay) { - const uint32_t ticks = Delay * gTickMultiplier; - uint32_t i = 0; - uint32_t Start = SysTick->LOAD; - uint32_t Previous = SysTick->VAL; - do { - uint32_t Current; - uint32_t Delta; - while ((Current = SysTick->VAL) == Previous) {} - Delta = (Current < Previous) ? -Current : Start - Current; - i += Delta + Previous; - Previous = Current; - } while (i < ticks); + const uint32_t ticks = Delay * gTickMultiplier; + uint32_t elapsed_ticks = 0; + uint32_t Start = SysTick->LOAD; + uint32_t Previous = SysTick->VAL; + do { + uint32_t Current; + + do { + Current = SysTick->VAL; + } while (Current == Previous); + + uint32_t Delta = ((Current < Previous) ? - Current : Start - Current); + + elapsed_ticks += Delta + Previous; + + Previous = Current; + } while (elapsed_ticks < ticks); } void SYSTICK_Delay250ns(const uint32_t Delay) diff --git a/font.c b/font.c index 006aad2..07cf361 100644 --- a/font.c +++ b/font.c @@ -347,285 +347,342 @@ const uint8_t gFont3x5[][3] = }; #endif -const uint8_t gFontChinese_out[1678]={ - 0X88,0X48,0X2E,0X08,0X08,0X7F,0X8A, - 0X4A,0X2A,0X08,0X00,0XA8,0X06, - 0X40,0X82,0X3E,0X00,0X25,0XD5, - 0X0F,0XC5,0X3F,0X05,0X05,0X80, - 0XA9,0XAA,0XE2,0X84,0XF2,0XA7, - 0XA8,0X06,0XD0,0X77,0XD0,0X5F, - 0XD0,0XA7,0X01,0X46,0X0A,0XAA, - 0X4A,0X0A,0XCF,0XCB,0X0B,0X4B, - 0XAA,0X0A,0X02,0X00,0X0C,0X00, - 0X24,0XFF,0X14,0X00,0X2A,0XEE, - 0X3B,0XAA,0X6E,0X2A,0X00,0X8E, - 0X5A,0X8A,0X3F,0X20,0XD0,0X3F, - 0X00,0X02,0XC1,0X8E,0XB0,0X9F, - 0X00,0X30,0X68,0X59,0XE5,0XCC, - 0XF6,0XE5,0X54,0X8D,0XF0,0X47, - 0XC8,0X47,0XA0,0X95,0X46,0X3A, - 0X09,0X29,0X29,0X29,0XAD,0X6B, - 0X09,0X09,0X39,0X01,0X00,0X3A, - 0X00,0X19,0X61,0X01,0XFF,0X01, - 0X01,0XFF,0X01,0X61,0X19,0X00, - 0XEA,0XBA,0X0A,0X82,0X82,0XBB, - 0XEB,0XAA,0XAA,0XAB,0XBB,0X02, - 0X02,0X00,0XAC,0X3A,0X40,0X44, - 0XF3,0X4F,0X01,0XA4,0XF7,0XA5, - 0XFD,0XA6,0X07,0X04,0XA3,0X91, - 0X92,0XFC,0X53,0X00,0XF8,0X03, - 0X89,0X30,0X02,0XFF,0X00,0X38, - 0X60,0X90,0X04,0X87,0X64,0X1C, - 0X07,0X34,0XD4,0X55,0X35,0X02, - 0X04,0X86,0X56,0X69,0X82,0X3E, - 0X00,0X65,0XA5,0X9F,0X55,0X25, - 0X25,0X00,0X80,0XA9,0XAA,0X22, - 0XA1,0XA9,0XB7,0XE1,0XA5,0XB5, - 0XAD,0XA5,0X25,0X21,0X11,0XAA, - 0XAB,0X10,0X10,0X10,0X10,0XF6, - 0X51,0X50,0X50,0X50,0XD0,0X13, - 0X68,0X80,0X1A,0XFE,0X02,0X02, - 0XFA,0X8B,0X8A,0XFA,0X02,0X02, - 0XFE,0X00,0X03,0X80,0X0E,0X01, - 0XE1,0X1F,0X01,0X01,0X3F,0X80, - 0XBF,0X80,0X80,0XBF,0XA1,0X51, - 0X65,0XA3,0X2A,0XA1,0X63,0XB3, - 0X6B,0X22,0XA3,0X68,0X01,0XC0, - 0XEA,0X3A,0X24,0XE8,0X03,0XBC, - 0XB7,0XB4,0XFE,0XB7,0XB6,0XBC, - 0X03,0X98,0XAA,0X2A,0X1C,0X00, - 0XFF,0X08,0X00,0X04,0XFC,0X07, - 0X04,0X04,0X04,0X30,0XB0,0XAA, - 0X92,0XD5,0X97,0X95,0X16,0XB4, - 0X96,0XD5,0X97,0X95,0X92,0X86, - 0X43,0X0A,0XF0,0X1F,0X10,0X11, - 0XD1,0X1F,0X11,0X15,0X19,0X00, - 0X60,0XEA,0XAA,0X48,0XFC,0X2B, - 0X00,0XE0,0X13,0X10,0X14,0X10, - 0X10,0X00,0X30,0X06,0X00,0X22, - 0X12,0XFA,0X06,0X43,0X4A,0X4A, - 0XEA,0X5A,0X42,0X02,0X30,0XE0, - 0XC0,0X42,0X43,0XFB,0X5A,0X7F, - 0XEB,0X4A,0X7B,0XC3,0X02,0X80, - 0XAE,0XBF,0X82,0XC0,0X3F,0X00, - 0X20,0XA8,0XBA,0XAA,0XAA,0X2A, - 0X08,0XC0,0XB0,0XEA,0X24,0XE8, - 0X03,0X08,0XE8,0X6F,0X5B,0X6D, - 0XEB,0X0B,0X00,0X98,0XAA,0X2A, - 0XFF,0X11,0XFF,0X10,0XFF,0X11, - 0XFF,0X00,0X7E,0X00,0XFF,0X31, - 0X31,0XF8,0X7F,0XE0,0X3F,0X00, - 0X81,0X68,0X4A,0X7E,0X8A,0X2A, - 0XC1,0X40,0X38,0X84,0X80,0X4E, - 0XA2,0XAE,0X90,0XAE,0XA2,0X42, - 0X8E,0X80,0X40,0XC5,0X14,0X00, - 0X10,0X52,0X8B,0XCC,0XEB,0XA8, - 0XA8,0X98,0X80,0X80,0X07,0XAC, - 0XEA,0X24,0XFF,0X14,0X00,0X11, - 0X11,0X11,0X11,0X11,0X11,0XFF, - 0X0E,0XAA,0X3A,0XC9,0X3F,0X05, - 0X80,0XBE,0XD2,0X93,0XBE,0XD2, - 0X93,0XBE,0XC3,0XBA,0X1E,0X92, - 0XF1,0X90,0X92,0X0F,0XC0,0X07, - 0X00,0XF0,0X0F,0X80,0X06,0XE8, - 0X80,0XA8,0XA8,0XAA,0XAA,0XFD, - 0XA8,0XA9,0XAA,0XA8,0X82,0X10, - 0X1B,0XA4,0X24,0XFF,0X14,0X00, - 0X1E,0X5A,0XD0,0X7F,0X50,0XDA, - 0X5E,0X0E,0X7A,0X29,0X86,0XA2, - 0XAA,0XAA,0XF6,0XB7,0XAA,0XA6, - 0XA2,0X02,0X86,0XC6,0X90,0X82, - 0XC0,0X3F,0XC0,0X04,0XA2,0X61, - 0X36,0XA4,0X2F,0X22,0XC1,0X80, - 0X46,0X12,0X0E,0X7A,0XE9,0X6B, - 0X69,0X69,0X69,0X7B,0X09,0X00, - 0XA8,0X56,0X2A,0X14,0X14,0XF4, - 0X14,0X14,0X14,0X04,0X3F,0XC4, - 0X05,0X86,0XBA,0X05,0X34,0X82, - 0XBA,0XC2,0XBF,0X92,0X12,0XC0, - 0X7C,0X64,0XE5,0XFD,0X94,0XAA, - 0XEA,0X2F,0X21,0XE1,0X0F,0X40, - 0X40,0X41,0X46,0XF0,0X4F,0X50, - 0X05,0XE8,0X50,0X48,0XC4,0XA3, - 0XA2,0XBE,0XA2,0XB6,0XEA,0X13, - 0X00,0XC0,0XAA,0X0E,0X7E,0X4A, - 0X4A,0X4A,0XFF,0X4A,0X4A,0X4A, - 0X7E,0X00,0X80,0X00,0XAB,0X3A, - 0X84,0XA4,0XA6,0XB6,0XDE,0X97, - 0X96,0XB6,0X96,0X04,0X84,0X6A, - 0XA5,0X2A,0X20,0XA0,0XA3,0XA2, - 0XFE,0XA2,0XAE,0XA2,0X23,0X20, - 0XA8,0X06,0XA9,0X03,0XFC,0X07, - 0X14,0X26,0XC5,0X24,0X15,0X06, - 0XFC,0X03,0X18,0X00,0XD0,0X88, - 0XFE,0X88,0X00,0X1E,0XFB,0X52, - 0XDE,0XB3,0XFA,0X1E,0X00,0XBC, - 0X8E,0X84,0XF4,0X92,0XB2,0X90, - 0X90,0XF2,0X92,0XB4,0X04,0X80, - 0XBB,0XEE,0X02,0XF2,0X55,0X59, - 0X5F,0X51,0X51,0X5F,0XF9,0X05, - 0X02,0XA0,0XAE,0XAB,0X20,0X24, - 0XA6,0X25,0X24,0XE4,0X27,0X24, - 0XA4,0X20,0X21,0X06,0X3A,0X40, - 0X00,0XFE,0X52,0X52,0X52,0X53, - 0X52,0X52,0XFE,0X00,0X00,0XAC, - 0XAA,0X03,0XA2,0X9A,0X86,0XA2, - 0X32,0X00,0X01,0XE1,0X1F,0X01, - 0X7F,0X45,0X18,0X26,0XA1,0XF0, - 0X00,0X0F,0X05,0X05,0XF5,0X2E, - 0X11,0X81,0X00,0X5C,0X0D,0X40, - 0X48,0X50,0X60,0XC3,0X7C,0XC0, - 0X63,0X50,0X48,0X40,0X6A,0XC0, - 0XEA,0X32,0X12,0X16,0XDA,0X1B, - 0X1A,0XDA,0X16,0X12,0X32,0X00, - 0X1A,0XB0,0X0E,0X80,0XBF,0X82, - 0X92,0XF7,0X96,0X96,0XB7,0X92, - 0X00,0X80,0XA9,0XA5,0X02,0X20, - 0XA0,0XBF,0XAA,0XEA,0XAA,0XBA, - 0XAA,0X2F,0X00,0X00,0XAB,0X3A, - 0X00,0XFC,0X17,0X94,0XD6,0XD6, - 0XD6,0X77,0X55,0X15,0X1D,0X19, - 0XC0,0XEA,0X04,0XC9,0X02,0X00, - 0XF9,0XAA,0XAF,0XA8,0XAC,0XFA, - 0X01,0X03,0X03,0X4E,0X82,0X3E, - 0X00,0X01,0X05,0X2D,0XE1,0X3F, - 0X01,0X01,0X80,0XA9,0XAA,0XCA, - 0X43,0X42,0X42,0X42,0XF2,0X4F, - 0X42,0X42,0X42,0XC2,0X03,0XC0, - 0X00,0XB0,0X4D,0X21,0X01,0XFC, - 0X03,0X58,0XE3,0XF8,0XE3,0X58, - 0X6B,0XAC,0XAA,0X24,0XFF,0X14, - 0X00,0X16,0X52,0XBB,0X92,0X72, - 0X16,0X00,0X0E,0X6A,0X2A,0XCB, - 0XBE,0X0A,0X41,0X3E,0X80,0X8A, - 0XEA,0XBF,0XAA,0X0F,0XCB,0XEA, - 0XFA,0X5F,0X51,0XF5,0X09,0X00, - 0XF0,0X1F,0X14,0XF8,0X07,0XB0, - 0X11,0X03,0XF8,0X0B,0XFA,0X03, - 0X90,0X98,0XA8,0XFC,0X87,0XA4, - 0X90,0X00,0X80,0X03,0X00,0X00, - 0X00,0X00,0X00,0XFF,0X08,0X08, - 0X08,0X00,0X00,0XAA,0XAE,0X2A, - 0X16,0XDD,0X14,0X12,0X00,0X0A, - 0XCA,0X1F,0X65,0XA5,0X95,0X16, - 0X5A,0X9E,0XD0,0XBF,0X90,0X0F, - 0X10,0XF8,0X19,0XF9,0X01,0X0F, - 0X40,0X05,0X6A,0X04,0X04,0X04, - 0X04,0XFC,0X07,0X24,0X44,0X84, - 0X04,0X00,0X00,0X0C,0X00,0XFE, - 0X01,0X7E,0X02,0XFA,0X02,0X7E, - 0X00,0X7E,0X00,0XFF,0X63,0X24, - 0XBA,0XBF,0XA0,0X3F,0X00,0X3F, - 0X81,0X7D,0X25,0X3D,0X01,0X3F, - 0XC0,0X00,0X0E,0XE0,0X2F,0X20, - 0X21,0XA6,0X30,0X23,0XAC,0X23, - 0X00,0X60,0XAA,0XAE,0X20,0XF0, - 0X0F,0X10,0XF0,0X10,0X17,0X18, - 0X10,0XF3,0X10,0X30,0XAA,0XAB, - 0X09,0X0D,0XFD,0X4B,0X39,0X00, - 0X7D,0X05,0XFF,0X05,0X7D,0X39, - 0X60,0X24,0X8A,0X9E,0XD6,0XBF, - 0X96,0X1A,0XC2,0X0F,0X72,0X8A, - 0X66,0X75,0X19,0X0D,0X90,0X2C, - 0X01,0XC0,0X6F,0X20,0X23,0XF5, - 0X29,0X65,0X33,0X18,0X46,0X06, - 0XFC,0X97,0XFE,0X03,0X01,0X94, - 0X98,0XF0,0X9B,0X94,0X04,0X83, - 0X91,0X20,0X22,0XBA,0X3A,0X36, - 0XF2,0X2A,0XA5,0X11,0X20,0X00, - 0X05,0X0E,0X05,0X00,0X00,0X20, - 0X18,0XC6,0X01,0X06,0X38,0X00, - 0X00,0X80,0X01,0X40,0X22,0X61, - 0XFF,0X65,0X25,0X0F,0X41,0X75, - 0XE5,0X4F,0XC5,0XC7,0X35,0X38, - 0XF8,0X0B,0XFA,0X03,0X70,0X52, - 0X7E,0X16,0X7F,0X52,0X72,0X02, - 0X1A,0X93,0X44,0X53,0X56,0XDA, - 0X52,0X54,0X53,0X7A,0XD2,0X56, - 0X5A,0X00,0XA1,0X03,0XDB,0X16, - 0X10,0X00,0X40,0XE0,0X5F,0X50, - 0XE2,0X13,0X8E,0X86,0X19,0X09, - 0XE0,0XAF,0X12,0X88,0X60,0X12, - 0X15,0X19,0X65,0X82,0XD0,0X81, - 0X91,0XD0,0XAB,0XEE,0XAB,0XDA, - 0X03,0X24,0X9D,0XC5,0X27,0X3D, - 0X44,0X4E,0X5D,0X4C,0XFB,0X4A, - 0X00,0X79,0X0A,0X88,0X6F,0X88, - 0X0A,0X79,0X1C,0X06,0X24,0X90, - 0XDF,0XB2,0X94,0X3F,0X00,0X01, - 0X19,0XC1,0X3F,0X81,0XE1,0XA0, - 0X83,0X10,0X2D,0X00,0X00,0XE1, - 0X8F,0XF0,0X87,0X40,0XC2,0X3B, - 0XC0,0XAA,0X27,0XE8,0X03,0X00, - 0XFC,0X07,0X94,0XFF,0X96,0X07, - 0XFC,0XB3,0X05,0XE8,0X04,0X04, - 0X84,0X64,0X1F,0X24,0X44,0X84, - 0X04,0X04,0X00,0X1A,0X40,0X0A, - 0X10,0X0C,0X03,0X00,0XC0,0X3F, - 0X00,0X00,0X01,0X06,0X18,0XA0, - 0X03,0X00,0X45,0X65,0X5B,0XC9, - 0X4B,0X47,0X25,0X4B,0X05,0X05, - 0X80,0X6A,0X01,0X20,0XF0,0X0F, - 0X00,0XF8,0XAB,0XAA,0XAF,0XAA, - 0XAB,0XBA,0X33,0XCE,0XCC,0X92, - 0X72,0XFE,0X51,0X80,0X54,0XBA, - 0X33,0X32,0XAA,0X66,0X30,0X6A, - 0X01,0X08,0X49,0X89,0X29,0X1F, - 0X99,0X69,0X09,0X09,0X08,0X80, - 0X06,0X90,0X92,0X2F,0X00,0X19, - 0X19,0XD5,0X1F,0X11,0X11,0X11, - 0XF0,0X3F,0XE0,0X80,0X43,0X44, - 0X44,0XFE,0X45,0X44,0X44,0XFC, - 0X47,0X44,0X40,0X60,0X00,0X03, - 0X00,0X80,0X7E,0XEA,0X2A,0X2A, - 0X2B,0X2A,0X2A,0XEE,0X00,0XC6, - 0XAA,0X8E,0XA2,0X9A,0X7F,0X12, - 0X00,0X07,0XC0,0X0F,0X20,0X11, - 0X0A,0X0C,0X16,0X00,0X81,0X40, - 0X31,0X09,0X07,0X31,0X41,0X8F, - 0X00,0X01,0XA0,0X01,0X06,0X00, - 0X10,0X90,0X90,0X94,0XF8,0X93, - 0X90,0X90,0X10,0X00,0XA0,0XBA, - 0X2A,0X07,0X99,0X61,0X99,0X07, - 0X00,0X07,0X99,0X61,0X99,0X07, - 0X46,0X62,0X64,0X78,0X6B,0X6A, - 0X7B,0X69,0X6B,0X38,0X00,0X1F, - 0XC0,0XFF,0XBA,0X8E,0X0E,0X02, - 0XF2,0X92,0X9E,0X9A,0X9A,0XFA, - 0X0A,0X0A,0X02,0X00,0X80,0X1A, - 0X00,0XF8,0X2B,0XA8,0XAB,0XA8, - 0XA4,0XA4,0XA4,0X23,0X00,0X18, - 0XAB,0X0E,0X08,0XFC,0X03,0X00, - 0X32,0X52,0X56,0XD7,0X56,0X52, - 0X32,0X0C,0XE8,0X00,0X00,0X00, - 0X3E,0X00,0XC0,0X3F,0X02,0X02, - 0X02,0X00,0X80,0XAE,0XAB,0XAA, - 0XA8,0XE6,0X9F,0X12,0XC8,0X36, - 0XE0,0X2F,0X20,0X63,0X0C,0X03, - 0X0E,0X84,0X84,0X44,0X24,0XF4, - 0X0F,0X24,0X44,0X84,0X04,0X01, - 0X00,0X0C,0X00,0X84,0X44,0XA4, - 0X9C,0X84,0XFF,0X84,0X9C,0XA4, - 0X44,0X84,0X00,0X0C,0X00,0XC2, - 0X3F,0X12,0X00,0X88,0X3F,0XC4, - 0X1F,0X0A,0X12,0X5E,0X00,0XAB, - 0XCE,0XB2,0XAF,0X02,0X80,0X42, - 0X2A,0X9A,0X2A,0X4A,0X8A,0XC2, - 0X02,0X1A,0XFC,0X07,0X04,0XE4, - 0X25,0X25,0XE5,0X05,0X04,0XFC, - 0X03,0XAC,0XAA,0X3A,0X08,0X04, - 0X44,0X4A,0X4A,0XF9,0X4A,0X4A, - 0X44,0X04,0X08,0XA8,0XAE,0X0A, - 0X84,0XB4,0XD6,0X94,0X96,0X34, - 0XC4,0X7F,0X62,0XE2,0X1D,0XAB, - 0X33,0X00,0XF0,0X9F,0X94,0X94, - 0XF4,0X9F,0X94,0X94,0XF4,0X0F, - 0X60,0XC0,0XE0,0X10,0XF8,0X07, - 0XE4,0X93,0X88,0X88,0XF8,0X8B, - 0X84,0X00,0X30,0X99,0X64,0X10, - 0X10,0XFF,0X10,0X18,0X54,0X92, - 0X11,0X10,0X10,0X00,0XB0,0X41, - 0X8A,0XBC,0X84,0X85,0XB6,0XD6, - 0X96,0XB6,0X85,0X84,0X3C,0XC0, - 0X50,0X85,0X03 -}; \ No newline at end of file + +const uint8_t gFontChinese_out[2013]={ + + 0X20,0X20,0X3E,0XA0,0X20,0XBF,0X24, + 0X24,0X24,0XA4,0X20,0XA0,0X89, + 0X74,0X22,0X01,0X00,0X11,0X21, + 0X0F,0X44,0XF4,0X4F,0X44,0XF4, + 0X4F,0X04,0X84,0X34,0XA4,0X89, + 0XB8,0X88,0X10,0XDE,0X10,0XFF, + 0X12,0X92,0XF9,0X0D,0XEB,0X09, + 0XF9,0X89,0X24,0X01,0X49,0X43, + 0X29,0XA0,0X28,0XA5,0X69,0X3D, + 0X2B,0XAD,0X28,0XA5,0X28,0X20, + 0X22,0X22,0X2F,0X22,0X22,0X88, + 0X88,0XFF,0X48,0XA4,0XAC,0XB5, + 0XE6,0XB4,0XAC,0XA4,0X80,0X0F, + 0XA8,0X4B,0XB4,0XE8,0X0F,0X00, + 0XF8,0X0F,0X02,0XF1,0X8E,0X80, + 0X88,0X87,0X30,0X01,0X8F,0X24, + 0X21,0X84,0X48,0X2A,0X98,0X7F, + 0X28,0X4A,0X10,0XEF,0X08,0XF8, + 0X08,0XB9,0X55,0X0B,0X58,0X52, + 0XC8,0X40,0X40,0X42,0X52,0X62, + 0X42,0X4A,0X46,0X42,0XC0,0X10, + 0X11,0X99,0X1F,0X11,0X11,0X20, + 0X42,0X82,0XFE,0X02,0X02,0X02, + 0XFE,0X82,0X42,0X20,0X88,0XF8, + 0X88,0XF8,0X88,0X08,0X21,0X6D, + 0XA5,0X25,0X35,0X25,0XA5,0X65, + 0X25,0X0D,0X01,0X5F,0X55,0X55, + 0X55,0X0F,0X88,0X68,0XFF,0X48, + 0X02,0XFA,0XAF,0XAA,0XAF,0XFA, + 0X02,0X00,0X0F,0XAA,0X36,0XA6, + 0X8A,0XF8,0X8F,0X04,0XE0,0X0F, + 0X20,0XC8,0X00,0XFE,0X01,0X80, + 0X0F,0X30,0X49,0X03,0XC3,0X0E, + 0X08,0X88,0X78,0XCF,0X48,0X48, + 0X49,0XCA,0X08,0X08,0X24,0X89, + 0X54,0X52,0X84,0X18,0X21,0X0F, + 0X84,0X94,0XA4,0X84,0XAF,0X94, + 0X84,0X04,0X84,0X87,0XAC,0X89, + 0XA9,0X8C,0X44,0X54,0X55,0XD6, + 0X74,0X5C,0X54,0X56,0X55,0X54, + 0X44,0X24,0X99,0X99,0X9F,0X99, + 0X48,0X40,0X40,0XC0,0X5F,0X62, + 0X42,0X42,0X42,0X42,0X4E,0X80, + 0X34,0X00,0X80,0X88,0X07,0XFC, + 0X04,0X04,0XE6,0X25,0X24,0X24, + 0XE4,0X04,0X04,0XFC,0X0F,0X30, + 0X22,0X32,0X88,0X8F,0X80,0XF0, + 0X8F,0X80,0X80,0X0F,0XC0,0X4F, + 0X40,0XC0,0X8F,0X16,0X88,0X07, + 0X4F,0XF4,0X46,0X32,0X82,0XB2, + 0X46,0X6B,0X52,0X4A,0X62,0X12, + 0X66,0XE0,0X88,0XF8,0X88,0XE8, + 0X10,0X22,0X0E,0X00,0XFC,0X55, + 0XF5,0X5F,0X55,0XFD,0X05,0X8C, + 0X87,0X8B,0X99,0X99,0XBA,0X78, + 0X00,0XFF,0X04,0X08,0XF8,0X09, + 0X0A,0X08,0X08,0X08,0X00,0X0F, + 0XF0,0X88,0X88,0X20,0XA1,0XF4, + 0XA7,0X24,0X05,0X24,0XA5,0XF4, + 0XA7,0X24,0X11,0X59,0X91,0X1F, + 0X51,0X19,0X00,0XFE,0X02,0X42, + 0X42,0X42,0XFA,0X42,0X42,0X42, + 0X02,0X78,0X88,0X88,0X8F,0XA9, + 0X88,0X88,0XF8,0X8F,0X04,0XC0, + 0X4F,0X50,0X60,0X40,0X40,0X00, + 0XF8,0X80,0X07,0X00,0X00,0X84, + 0X44,0XF4,0X0C,0X87,0X94,0X94, + 0XD4,0XB4,0X94,0X84,0X00,0X0F, + 0X00,0XF8,0X00,0X00,0X71,0X51, + 0X5D,0X75,0XD5,0X77,0X55,0X55, + 0X7D,0X01,0X81,0XF8,0X88,0X8E, + 0XF8,0X88,0X10,0XFC,0X03,0X04, + 0X54,0X54,0X55,0X56,0X54,0X54, + 0X04,0XF0,0X00,0X5F,0X55,0XF5, + 0X00,0X11,0X21,0X0F,0XA0,0XBF, + 0XEA,0XAA,0XAA,0XBA,0XAA,0X8F, + 0X34,0XB4,0XAA,0XAA,0XBA,0XFE, + 0X22,0XFE,0X20,0XFE,0X22,0XFE, + 0X20,0XFC,0X00,0XFF,0X87,0X0F, + 0X87,0X0F,0X81,0XEF,0X2F,0XE3, + 0X0C,0X80,0X44,0X25,0X15,0X2F, + 0X45,0X85,0XF4,0X12,0X24,0X81, + 0X0F,0X61,0X10,0XD0,0X48,0X54, + 0XD2,0X11,0XD2,0X54,0X48,0XD0, + 0X10,0X70,0X22,0X07,0X0F,0X74, + 0X00,0X00,0X81,0X48,0X79,0X4E, + 0X4C,0X4A,0X4A,0XC9,0X08,0X18, + 0X01,0X4F,0X44,0X44,0XF4,0X88, + 0X88,0XFF,0X48,0X48,0X02,0X22, + 0X22,0X22,0X22,0XFE,0X80,0X0F, + 0X40,0X44,0X44,0X8F,0X88,0XF8, + 0X8F,0X24,0X7F,0X29,0X29,0X2F, + 0X79,0X29,0X0F,0XF8,0XF0,0X44, + 0X47,0XF4,0X42,0X22,0X5E,0X92, + 0X12,0XF2,0X00,0XFC,0X00,0X00, + 0XFF,0X80,0X24,0X01,0X10,0X88, + 0X0F,0X44,0X44,0X45,0X45,0XFD, + 0X47,0X4D,0X45,0X45,0X04,0X44, + 0X24,0X8F,0X14,0X42,0X9A,0X88, + 0X88,0XFF,0X48,0XBC,0XAA,0XA0, + 0XFF,0XA0,0XAA,0XBE,0X80,0X0F, + 0X98,0X4A,0XA4,0X89,0XA1,0XA0, + 0XA4,0XA6,0XFD,0XA4,0XA4,0XA2, + 0XA8,0X80,0X01,0X59,0X91,0X1F, + 0X51,0X09,0X78,0X00,0XFF,0X08, + 0XC4,0X3F,0XC4,0X04,0XF4,0X44, + 0X24,0X00,0X4F,0X83,0X24,0X61, + 0X48,0X20,0XD0,0X57,0X5D,0X55, + 0X55,0X55,0X55,0XD5,0X17,0X00, + 0X9A,0X5B,0X55,0XB5,0X89,0X08, + 0X48,0X48,0XC8,0X48,0X48,0X08, + 0XFF,0X08,0X09,0X0A,0X88,0X78, + 0X44,0X04,0X43,0X0E,0X42,0X4A, + 0XF2,0X4F,0X02,0X22,0XED,0X24, + 0X24,0XE5,0X8D,0X47,0X9F,0XB9, + 0XAA,0XBA,0XFE,0X22,0X22,0XFE, + 0X00,0X08,0X48,0X88,0X08,0XFF, + 0X08,0X27,0X72,0X00,0X90,0XF8, + 0X80,0X42,0X22,0X0E,0X0B,0XFB, + 0X8A,0X4A,0X2A,0X4A,0X8E,0X00, + 0XF0,0XAA,0XAA,0XAA,0X0F,0XFC, + 0X24,0X24,0X24,0XFF,0X24,0X24, + 0X24,0XFC,0X00,0X00,0X13,0X11, + 0X97,0X99,0X89,0X0E,0X22,0XA2, + 0XA2,0XAE,0XFA,0XAB,0XAA,0XAA, + 0X2A,0X02,0X82,0X9A,0X4A,0X44, + 0X9A,0X88,0X04,0XF4,0X94,0X94, + 0X94,0X9F,0X94,0X94,0X94,0XF4, + 0X04,0X88,0X34,0X00,0X70,0X88, + 0X0C,0XE0,0X2F,0X21,0X22,0X2C, + 0XA2,0X21,0XE0,0X0F,0X00,0X80, + 0X27,0X01,0X21,0X30,0XF4,0X10, + 0X10,0XFF,0X10,0X3E,0XAB,0XA2, + 0XBE,0XA2,0XAB,0X3E,0X44,0X23, + 0XF0,0XAA,0XFA,0X80,0X94,0XAA, + 0XC9,0X88,0X88,0X88,0XC8,0XA8, + 0X99,0X8A,0X84,0X8F,0XF8,0XF8, + 0X88,0X8F,0X80,0X3E,0X2A,0XEA, + 0X2A,0X2A,0X2A,0XEA,0X2A,0X3E, + 0X80,0X98,0XFA,0X88,0XF8,0X9A, + 0X08,0X01,0X21,0X29,0X21,0X21, + 0X2F,0X21,0X21,0X09,0X01,0X41, + 0X12,0X80,0X0F,0X00,0X61,0X00, + 0XFC,0X24,0X24,0X26,0X25,0X24, + 0X24,0X24,0XFC,0X00,0XF0,0X99, + 0X99,0X99,0XF9,0X00,0X21,0X2D, + 0X23,0X09,0X01,0X80,0XF0,0X8F, + 0X80,0X80,0X3F,0X22,0X32,0X68, + 0X81,0X78,0X12,0X12,0XEA,0XBF, + 0XA0,0XA0,0XA7,0XAA,0XEA,0X09, + 0X0C,0X00,0X2F,0X22,0XA2,0X0F, + 0X00,0X22,0X42,0X82,0X0E,0XF2, + 0X03,0X82,0X4E,0X22,0X02,0X82, + 0X24,0X01,0X00,0X87,0XE8,0X82, + 0X82,0XBA,0XAA,0XAA,0XAB,0XAA, + 0XAA,0XBA,0X82,0X82,0X89,0X26, + 0X22,0X62,0X88,0X0D,0XE0,0XAF, + 0XA0,0XE8,0XAB,0XBA,0XAA,0XEA, + 0XAB,0XA8,0X80,0X07,0X98,0X4A, + 0XA4,0X89,0X04,0XF4,0X55,0X56, + 0X54,0X5C,0X54,0X56,0X55,0XF4, + 0X04,0XF0,0X55,0X55,0X55,0XF5, + 0X00,0XF0,0X5F,0X50,0X5A,0X5A, + 0X5A,0X5E,0X55,0X55,0X71,0X80, + 0X27,0X22,0X72,0X99,0XC9,0X10, + 0X22,0X04,0X00,0XF2,0X54,0X50, + 0X5F,0X50,0X54,0XF2,0X24,0X01, + 0X1F,0X11,0X91,0X0F,0X11,0X21, + 0X0F,0X80,0X80,0X82,0X8C,0X80, + 0XF0,0X8F,0X80,0X34,0X84,0X88, + 0XAA,0X8B,0X00,0XF8,0X88,0X88, + 0X88,0XFF,0X88,0X88,0X88,0XF8, + 0X00,0X10,0X00,0XF0,0X00,0X10, + 0X80,0X49,0X3D,0X8B,0X08,0XE0, + 0X4F,0X82,0XFA,0X8F,0X4A,0X42, + 0X24,0X02,0X9F,0XF8,0X98,0X88, + 0X88,0XFF,0X48,0X00,0X4C,0XC4, + 0X75,0X46,0XC4,0X4C,0X80,0X0F, + 0X88,0X25,0X52,0X48,0X39,0X2F, + 0X49,0XC6,0X8D,0XA8,0XFA,0XAF, + 0XEA,0X8B,0X00,0X4F,0X7A,0XAA, + 0XAF,0XAA,0X00,0XFE,0X2A,0XAA, + 0X2A,0X3E,0X00,0XFE,0X02,0X02, + 0XFE,0XF0,0X24,0X61,0XF0,0X20, + 0XE3,0X2F,0XE0,0X0F,0XA0,0X24, + 0X25,0XE4,0X1F,0X14,0X95,0X34, + 0X31,0X00,0X88,0X0F,0X00,0X00, + 0X00,0X00,0X00,0XFF,0X10,0X10, + 0X10,0X10,0X10,0X00,0X88,0X88, + 0X8F,0X88,0X88,0X88,0X49,0X3D, + 0X8B,0X08,0X80,0X84,0XF4,0X4F, + 0X52,0X6A,0X42,0X24,0X82,0X48, + 0X53,0XE8,0X42,0XF2,0X2E,0XE2, + 0X01,0X3D,0X21,0X21,0X21,0X3F, + 0XE0,0X70,0X72,0X11,0X11,0X89, + 0X27,0X20,0X20,0X20,0XE0,0X2F, + 0X20,0X21,0X22,0X24,0X28,0X00, + 0X00,0XF0,0X00,0X00,0X01,0X10, + 0XFC,0X03,0XFE,0XC2,0X02,0XFE, + 0X00,0XFC,0X00,0XFF,0XF0,0X48, + 0X43,0X08,0X81,0XCF,0X4F,0XC0, + 0X0F,0XC0,0X4F,0X60,0X5E,0X42, + 0X4E,0XC0,0X3F,0X31,0XF0,0X10, + 0X11,0XF8,0X00,0XFC,0X04,0X44, + 0X84,0X15,0XE6,0X04,0X04,0XE4, + 0X04,0X78,0X88,0X8B,0XC8,0X8B, + 0X08,0XC1,0X3F,0X80,0X80,0X86, + 0X98,0XA0,0X80,0X80,0X8E,0X00, + 0X0F,0X88,0X8B,0XBC,0X88,0X20, + 0X2A,0XF2,0X2E,0X60,0X00,0XF2, + 0X1A,0XD6,0X12,0XF2,0X80,0X0F, + 0X00,0X49,0X43,0X89,0XA2,0XAE, + 0XFB,0XAE,0XAA,0X8A,0XF0,0X8F, + 0X90,0XAE,0X40,0X44,0X2F,0X82, + 0X34,0XE4,0X22,0X44,0X00,0XFC, + 0X24,0XE4,0X24,0X3F,0X24,0XE4, + 0X0C,0X24,0X78,0X88,0X25,0X85, + 0X28,0XE0,0X2F,0XE5,0X2F,0X94, + 0XA4,0X84,0XAF,0X94,0X04,0X24, + 0X23,0X9F,0X34,0X30,0X84,0X00, + 0X82,0X92,0XDA,0XD6,0XB2,0XB1, + 0X91,0X89,0XC1,0X80,0X48,0X02, + 0XF8,0X00,0X42,0X09,0X00,0X00, + 0X00,0X08,0XF6,0X01,0X06,0X08, + 0X00,0X00,0X80,0X24,0X01,0X00, + 0X21,0X84,0X22,0XEA,0XBF,0XEA, + 0X2A,0X54,0X53,0XFA,0X56,0XF0, + 0X40,0XF0,0XF2,0X10,0XF9,0X31, + 0XE0,0X2F,0XE0,0X0F,0X00,0X77, + 0X55,0X57,0X58,0X77,0X05,0X37, + 0X31,0X90,0X35,0X3F,0X95,0X44, + 0X53,0X52,0X56,0X52,0X7C,0X53, + 0XD2,0X56,0X52,0X42,0X11,0X53, + 0X91,0XF9,0X11,0X81,0X49,0X3D, + 0X8B,0X28,0XE0,0X2F,0X28,0X20, + 0XE3,0X02,0X4E,0X24,0X6A,0X81, + 0X25,0X85,0X00,0XFE,0X2A,0XA9, + 0X00,0X28,0XE7,0X21,0X21,0XEF, + 0X08,0XF2,0X01,0X88,0X25,0X85, + 0X88,0X40,0X3F,0XA5,0X6F,0X05, + 0X9F,0X78,0X16,0X94,0XFE,0X84, + 0X17,0X97,0X0F,0X22,0X2F,0X94, + 0XF3,0X92,0X00,0XF2,0X14,0X10, + 0XDF,0X10,0X14,0XF2,0XF0,0X84, + 0X49,0X12,0X42,0X09,0XE8,0XBF, + 0XAA,0XEA,0X0F,0X80,0X84,0X88, + 0XF0,0X8F,0X40,0X12,0XF8,0X00, + 0X89,0X0F,0X22,0X44,0X40,0XFC, + 0X20,0X10,0XFF,0X08,0X04,0XFC, + 0X00,0X24,0X70,0X88,0X8B,0X99, + 0X1C,0X21,0X0F,0X00,0XF0,0X1F, + 0X92,0XDA,0X9B,0X1A,0XF2,0X0F, + 0X27,0X78,0X30,0XB2,0XF8,0X10, + 0X10,0X10,0X10,0XD0,0X3F,0XD0, + 0X10,0X10,0X10,0X10,0X88,0X34, + 0X00,0X30,0X84,0X08,0X00,0X0C, + 0X03,0X00,0XF0,0X0F,0X00,0X00, + 0X01,0X06,0X18,0X00,0X88,0X0F, + 0X00,0X10,0X90,0X54,0XB6,0X95, + 0X5C,0X54,0X34,0X94,0X36,0X54, + 0X90,0XA0,0XAA,0X9A,0X45,0X24, + 0X00,0XC1,0X3F,0X00,0XE8,0XAF, + 0XA2,0XBE,0XA2,0XAE,0XE2,0X0E, + 0X1F,0XF0,0X71,0X71,0XF9,0X12, + 0XD2,0XFE,0X91,0X08,0X44,0XAB, + 0X52,0X6A,0X46,0XC0,0X01,0X0F, + 0X98,0X54,0X12,0X00,0X84,0X94, + 0XA4,0X84,0X84,0X8F,0XA4,0X94, + 0X84,0X04,0X84,0X48,0X12,0X10, + 0X42,0X88,0X00,0XF9,0X02,0X20, + 0X20,0XA2,0XFA,0X22,0X22,0X02, + 0XFE,0XF0,0X20,0X41,0X07,0X88, + 0X0F,0X24,0X24,0XE4,0X2F,0X24, + 0X24,0XE4,0X2F,0X24,0X04,0X04, + 0X68,0X01,0X00,0X0F,0X00,0X00, + 0X00,0XFC,0XA4,0XA4,0XA5,0XA6, + 0XA4,0XA4,0XA4,0XBC,0X68,0XF1, + 0X44,0X44,0X44,0X2F,0X21,0XED, + 0X1F,0X09,0X84,0X03,0XF0,0X0F, + 0X40,0X80,0X1B,0XF0,0X80,0X48, + 0X24,0X01,0X20,0X10,0X2C,0X23, + 0XE0,0X20,0X20,0X23,0XEC,0X10, + 0X20,0X80,0X34,0X80,0X88,0X07, + 0X00,0X80,0X88,0X88,0X98,0XA8, + 0X8F,0X88,0X88,0X88,0X08,0X80, + 0X88,0X88,0X8F,0X88,0X88,0X12, + 0X62,0X82,0X62,0X1E,0X00,0X1E, + 0X62,0X82,0X62,0X1E,0X68,0X61, + 0X80,0X24,0X61,0X18,0XDC,0X55, + 0X55,0X5D,0XD5,0X15,0X0C,0XC0, + 0X0F,0XF0,0XFF,0X55,0X57,0XF5, + 0X10,0XF8,0X20,0X20,0XAF,0X69, + 0X29,0X29,0X29,0X29,0X2F,0X20, + 0X20,0X00,0X11,0X11,0X91,0X79, + 0X00,0X00,0XE0,0X2F,0X21,0X29, + 0X29,0X19,0X19,0X19,0X09,0X89, + 0X16,0XF0,0X44,0X44,0XF4,0X20, + 0X10,0XFC,0X03,0X82,0XBA,0XAA, + 0XAB,0XAA,0XBA,0X82,0X00,0X0F, + 0X21,0XEA,0X22,0X01,0X00,0X80, + 0X0F,0X00,0X00,0XF0,0X0F,0X01, + 0X01,0X01,0X80,0XF8,0X88,0XF8, + 0X88,0X88,0X12,0XD2,0XFE,0X51, + 0X90,0XC8,0X07,0XF4,0X04,0X54, + 0X8C,0X01,0X0F,0X12,0XF8,0X00, + 0X23,0X20,0X20,0X28,0X24,0X22, + 0XEF,0X20,0X22,0X24,0X28,0X10, + 0X01,0X00,0X0F,0X00,0X10,0X04, + 0X04,0X84,0X64,0X14,0XFF,0X14, + 0X64,0X84,0X04,0X04,0X12,0X22, + 0XF2,0X22,0X12,0X02,0X01,0XF1, + 0X0F,0X01,0XC2,0X0F,0XF1,0X8F, + 0X40,0XC8,0X4F,0X34,0X02,0X87, + 0X89,0XE8,0X98,0XF7,0X94,0X84, + 0X10,0X48,0X44,0X53,0X64,0XC8, + 0X10,0XF0,0X24,0X00,0X42,0X0B, + 0X00,0XE0,0X2F,0X20,0X20,0X2F, + 0X29,0X29,0X2F,0X20,0XE0,0X0F, + 0X4F,0X44,0X44,0X44,0XF4,0X10, + 0X10,0X28,0X24,0X22,0XE1,0X22, + 0X24,0X28,0X10,0X10,0X98,0X99, + 0XF9,0X99,0X99,0X08,0XA2,0X2A, + 0X3B,0X2A,0XAB,0X0A,0XE2,0X2F, + 0X20,0XE3,0X0C,0X4F,0X44,0X0F, + 0X2F,0X12,0X00,0XFE,0X92,0X92, + 0X92,0XFE,0X92,0X92,0X92,0XFE, + 0X00,0X78,0X00,0X70,0X80,0XF8, + 0X00,0X02,0XC1,0X3F,0XE0,0X2F, + 0X22,0XE2,0X1F,0X12,0X02,0X02, + 0XF0,0X70,0X52,0X38,0XF4,0X20, + 0X20,0X20,0XFF,0X28,0X28,0XE4, + 0X24,0X22,0X22,0X20,0X00,0XF0, + 0X24,0X10,0X42,0X24,0X28,0XA8, + 0XAB,0XAA,0XBA,0XAA,0XAA,0XAA, + 0X2B,0X28,0XF8,0X00,0XAE,0XAA, + 0X0E,0XF8,}; \ No newline at end of file diff --git a/font.h b/font.h index 3073291..bbd91ff 100644 --- a/font.h +++ b/font.h @@ -18,14 +18,11 @@ #define FONT_H #include -extern const uint8_t gFontChinese_out[1678]; -#define CHAR_SIZE 20U -#define CHAR_COL 10U -#define CHAR_ROW 11U -#define GET_BIT(byte, bitPosition) (((byte) >> (bitPosition)) & 0x01U) +extern const uint8_t gFontChinese_out[2013]; +#define CHN_FONT_WIDTH 11U +#define CHN_FONT_HIGH 12U + -//extern const uint8_t gFontChinese[123][16] ; -//gFontBig extern const uint8_t gFontBigDigits[11][20/*20*/]; extern const uint8_t gFont3x5[96][3]; extern const uint8_t gFontSmall[95 - 1][6]; diff --git a/helper/battery.c b/helper/battery.c index 75bc28c..0ebd824 100644 --- a/helper/battery.c +++ b/helper/battery.c @@ -37,9 +37,9 @@ bool gLowBatteryConfirmed; uint16_t gBatteryCheckCounter; typedef enum { - BATTERY_LOW_INACTIVE, - BATTERY_LOW_ACTIVE, - BATTERY_LOW_CONFIRMED + BATTERY_LOW_INACTIVE, + BATTERY_LOW_ACTIVE, + BATTERY_LOW_CONFIRMED } BatteryLow_t; @@ -49,175 +49,175 @@ const uint16_t lowBatteryPeriod = 30; volatile uint16_t gPowerSave_10ms; +const uint16_t Voltage2PercentageTable[][7][2] = { + [BATTERY_TYPE_1600_MAH] = { + {828, 100}, + {814, 97 }, + {760, 25 }, + {729, 6 }, + {630, 0 }, + {0, 0 }, + {0, 0 }, + }, + + [BATTERY_TYPE_2200_MAH] = { + {832, 100}, + {813, 95 }, + {740, 60 }, + {707, 21 }, + {682, 5 }, + {630, 0 }, + {0, 0 }, + }, +}; + +static_assert(ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_1600_MAH]) == + ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH])); + + unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV) { - const uint16_t crv1600[][2] = { - {828, 100}, - {814, 97 }, - {760, 25 }, - {729, 6 }, - {630, 0 }, - {0, 0 } - }; + const uint16_t (*crv)[2] = Voltage2PercentageTable[gEeprom.BATTERY_TYPE]; + const int mulipl = 1000; + for (unsigned int i = 1; i < ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH]); i++) { + if (voltage_10mV > crv[i][0]) { + const int a = (crv[i - 1][1] - crv[i][1]) * mulipl / (crv[i - 1][0] - crv[i][0]); + const int b = crv[i][1] - a * crv[i][0] / mulipl; + const int p = a * voltage_10mV / mulipl + b; + return MIN(p, 100); + } + } - const uint16_t crv2200[][2] = { - {832, 100}, - {813, 95 }, - {740, 60 }, - {707, 21 }, - {682, 5 }, - {630, 0 }, - {0, 0 } - }; - - const BATTERY_Type_t type = gEeprom.BATTERY_TYPE; - const uint16_t(*crv)[2]; - uint8_t size; - if (type == BATTERY_TYPE_2200_MAH) { - crv = crv2200; - size = ARRAY_SIZE(crv2200); - } - else { - crv = crv1600; - size = ARRAY_SIZE(crv1600); - } - - const int mulipl = 1000; - for (int i = 1; i < size; i++) { - if (voltage_10mV > crv[i][0]) { - int a = (crv[i - 1][1] - crv[i][1]) * mulipl / (crv[i - 1][0] - crv[i][0]); - int b = crv[i][1] - a * crv[i][0] / mulipl; - int p = a * voltage_10mV / mulipl + b; - return MIN(p, 100); - } - } - return 0; + return 0; } void BATTERY_GetReadings(const bool bDisplayBatteryLevel) { - const uint8_t PreviousBatteryLevel = gBatteryDisplayLevel; - const uint16_t Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + gBatteryVoltages[3]) / 4; + const uint8_t PreviousBatteryLevel = gBatteryDisplayLevel; + const uint16_t Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + gBatteryVoltages[3]) / 4; - + gBatteryVoltageAverage = (Voltage * 760) / gBatteryCalibration[3]; - gBatteryVoltageAverage = (Voltage * 760) / gBatteryCalibration[3]; - - if(gBatteryVoltageAverage > 890) - gBatteryDisplayLevel = 7; // battery overvoltage - else if(gBatteryVoltageAverage < 630) - gBatteryDisplayLevel = 0; // battery critical - else { - gBatteryDisplayLevel = 1; - const uint8_t levels[] = {5,17,41,65,88}; - uint8_t perc = BATTERY_VoltsToPercent(gBatteryVoltageAverage); - for(uint8_t i = 6; i >= 1; i--){ - if (perc > levels[i-2]) { - gBatteryDisplayLevel = i; - break; - } - } - } + if(gBatteryVoltageAverage > 890) + gBatteryDisplayLevel = 7; // battery overvoltage + else if(gBatteryVoltageAverage < 630) + gBatteryDisplayLevel = 0; // battery critical + else { + gBatteryDisplayLevel = 1; + const uint8_t levels[] = {5,17,41,65,88}; + uint8_t perc = BATTERY_VoltsToPercent(gBatteryVoltageAverage); + for(uint8_t i = 6; i >= 1; i--){ + if (perc > levels[i-2]) { + gBatteryDisplayLevel = i; + break; + } + } + } - if ((gScreenToDisplay == DISPLAY_MENU) ) - gUpdateDisplay = true; + if ((gScreenToDisplay == DISPLAY_MENU)) + gUpdateDisplay = true; - if (gBatteryCurrent < 501) - { - if (gChargingWithTypeC) - { - gUpdateStatus = true; - gUpdateDisplay = true; - } + if (gBatteryCurrent < 501) + { + if (gChargingWithTypeC) + { + gUpdateStatus = true; + gUpdateDisplay = true; + } - gChargingWithTypeC = false; - } - else - { - if (!gChargingWithTypeC) - { - gUpdateStatus = true; - gUpdateDisplay = true; - BACKLIGHT_TurnOn(); - } + gChargingWithTypeC = false; + } + else + { + if (!gChargingWithTypeC) + { + gUpdateStatus = true; + gUpdateDisplay = true; + BACKLIGHT_TurnOn(); + } - gChargingWithTypeC = true; - } + gChargingWithTypeC = true; + } - if (PreviousBatteryLevel != gBatteryDisplayLevel) - { - if(gBatteryDisplayLevel > 2) - gLowBatteryConfirmed = false; - else if (gBatteryDisplayLevel < 2) - { - gLowBattery = true; - } - else - { - gLowBattery = false; + if (PreviousBatteryLevel != gBatteryDisplayLevel) + { + if(gBatteryDisplayLevel > 2) + gLowBatteryConfirmed = false; + else if (gBatteryDisplayLevel < 2) + { + gLowBattery = true; + } + else + { + gLowBattery = false; - if (bDisplayBatteryLevel) - UI_DisplayBattery(gBatteryDisplayLevel, gLowBatteryBlink); - } - - if(!gLowBatteryConfirmed) - gUpdateDisplay = true; + if (bDisplayBatteryLevel) + UI_DisplayBattery(gBatteryDisplayLevel, gLowBatteryBlink); + } - lowBatteryCountdown = 0; - } + if(!gLowBatteryConfirmed) + gUpdateDisplay = true; + + lowBatteryCountdown = 0; + } } -void BATTERY_TimeSlice500ms(void) +void BATTERY_TimeSlice500ms(void) { - if (gLowBattery) - { - gLowBatteryBlink = ++lowBatteryCountdown & 1; + if (!gLowBattery) { + return; + } - UI_DisplayBattery(0, gLowBatteryBlink); + gLowBatteryBlink = ++lowBatteryCountdown & 1; - if (gCurrentFunction != FUNCTION_TRANSMIT) - { // not transmitting + UI_DisplayBattery(0, gLowBatteryBlink); - if (lowBatteryCountdown < lowBatteryPeriod) - { - if (lowBatteryCountdown == lowBatteryPeriod-1 && !gChargingWithTypeC && !gLowBatteryConfirmed) - AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP); - } - else - { - lowBatteryCountdown = 0; + if (gCurrentFunction == FUNCTION_TRANSMIT) { + return; + } - if (!gChargingWithTypeC) - { // not on charge - if(!gLowBatteryConfirmed) { - AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP); + // not transmitting + + if (lowBatteryCountdown < lowBatteryPeriod) { + if (lowBatteryCountdown == lowBatteryPeriod-1 && !gChargingWithTypeC && !gLowBatteryConfirmed) { + AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP); + } + return; + } + + lowBatteryCountdown = 0; + + if (gChargingWithTypeC) { + return; + } + + // not on charge + if (!gLowBatteryConfirmed) { + AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP); #ifdef ENABLE_VOICE - AUDIO_SetVoiceID(0, VOICE_ID_LOW_VOLTAGE); + AUDIO_SetVoiceID(0, VOICE_ID_LOW_VOLTAGE); #endif - } - if (gBatteryDisplayLevel == 0) - { + } + + if (gBatteryDisplayLevel != 0) { #ifdef ENABLE_VOICE - AUDIO_PlaySingleVoice(true); + AUDIO_PlaySingleVoice(false); +#endif + return; + } + +#ifdef ENABLE_VOICE + AUDIO_PlaySingleVoice(true); #endif - gReducedService = true; + gReducedService = true; - //if (gCurrentFunction != FUNCTION_POWER_SAVE) - FUNCTION_Select(FUNCTION_POWER_SAVE); + FUNCTION_Select(FUNCTION_POWER_SAVE); - ST7565_HardwareReset(); + ST7565_HardwareReset(); - if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) - BACKLIGHT_TurnOff(); // turn the backlight off - } -#ifdef ENABLE_VOICE - else - AUDIO_PlaySingleVoice(false); -#endif - } - } - } - } + if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) { + BACKLIGHT_TurnOff(); + } } \ No newline at end of file diff --git a/helper/battery.h b/helper/battery.h index 9b863a0..65418a7 100644 --- a/helper/battery.h +++ b/helper/battery.h @@ -40,9 +40,9 @@ typedef enum { BATTERY_TYPE_UNKNOWN } BATTERY_Type_t; -unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV); -void BATTERY_GetReadings(const bool bDisplayBatteryLevel); + +unsigned int BATTERY_VoltsToPercent(unsigned int voltage_10mV); +void BATTERY_GetReadings(bool bDisplayBatteryLevel); void BATTERY_TimeSlice500ms(void); -#endif - +#endif \ No newline at end of file diff --git a/main.c b/main.c index 25a8182..3d9d2dc 100644 --- a/main.c +++ b/main.c @@ -14,6 +14,7 @@ * limitations under the License. */ #include "ui/ui.h" +#include #include #include // NULL @@ -22,33 +23,40 @@ #ifdef ENABLE_AM_FIX #include "am_fix.h" #endif +#include "audio.h" +#include "board.h" +#include "misc.h" +#include "radio.h" +#include "settings.h" +#include "version.h" #include "app/app.h" #include "app/dtmf.h" -#include "audio.h" #include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/syscon.h" -#include "board.h" #include "driver/backlight.h" #include "driver/bk4819.h" #include "driver/gpio.h" #include "driver/system.h" #include "driver/systick.h" +#ifdef ENABLE_UART #include "driver/uart.h" +#endif #include "helper/battery.h" #include "helper/boot.h" -#include "misc.h" -#include "radio.h" -#include "settings.h" + #include "ui/lock.h" #include "ui/welcome.h" #include "ui/menu.h" -#include "version.h" #include "driver/eeprom.h" -void _putchar(char c) -{ - UART_Send((uint8_t *)&c, 1); -} +void _putchar(__attribute__((unused)) char c) +{ + +#ifdef ENABLE_UART + UART_Send((uint8_t *)&c, 1); +#endif + +} void Main(void) { //BOOT_Mode_t BootMode; @@ -67,15 +75,14 @@ void Main(void) SYSTICK_Init(); BOARD_Init(); - UART_Init(); + boot_counter_10ms = 250; // 2.5 sec +#ifdef ENABLE_UART + UART_Init(); +#endif - //UART_Send(UART_Version, strlen(UART_Version)); - // Not implementing authentic device checks - - memset(&gEeprom, 0, sizeof(gEeprom)); memset(gDTMF_String, '-', sizeof(gDTMF_String)); gDTMF_String[sizeof(gDTMF_String) - 1] = 0; @@ -98,9 +105,9 @@ void Main(void) RADIO_SetupRegisters(true); - for (unsigned int i = 0; i < ARRAY_SIZE(gBatteryVoltages); i++) - BOARD_ADC_GetBatteryInfo(&gBatteryVoltages[i], &gBatteryCurrent); - + for (unsigned int i = 0; i < ARRAY_SIZE(gBatteryVoltages); i++) { + BOARD_ADC_GetBatteryInfo(&gBatteryVoltages[i], &gBatteryCurrent); + } BATTERY_GetReadings(false); #ifdef ENABLE_AM_FIX @@ -208,13 +215,11 @@ void Main(void) if (gNextTimeslice) { APP_TimeSlice10ms(); - gNextTimeslice = false; } if (gNextTimeslice_500ms) { APP_TimeSlice500ms(); - gNextTimeslice_500ms = false; } } } diff --git a/misc.c b/misc.c index 854478d..a5bbf72 100644 --- a/misc.c +++ b/misc.c @@ -87,9 +87,7 @@ bool gSetting_KILLED; //bool gSetting_350EN; uint8_t gSetting_F_LOCK; bool gSetting_ScrambleEnable; -#ifdef ENABLE_AIRCOPY -uint8_t gAircopySendCountdown; -#endif + #ifdef ENABLE_AM_FIX bool gSetting_AM_fix; diff --git a/misc.h b/misc.h index cad9c04..63f3a7c 100644 --- a/misc.h +++ b/misc.h @@ -16,7 +16,7 @@ #ifndef MISC_H #define MISC_H - +#include "assert.h" #include #include @@ -163,9 +163,7 @@ extern uint32_t gCustomAesKey[4]; extern bool bHasCustomAesKey; extern uint32_t gChallenge[4]; extern uint8_t gTryCount; -#ifdef ENABLE_AIRCOPY -extern uint8_t gAircopySendCountdown; -#endif + extern uint16_t gEEPROM_RSSI_CALIB[7][4]; extern uint16_t gEEPROM_1F8A; diff --git a/radio.c b/radio.c index 1158e2d..629fbd5 100644 --- a/radio.c +++ b/radio.c @@ -736,53 +736,40 @@ void RADIO_SetupRegisters(bool switchToForeground) #endif #ifdef ENABLE_VOX - #ifdef ENABLE_NOAA - #ifdef ENABLE_FMRADIO - if (gEeprom.VOX_SWITCH && !gFmRadioMode && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->Modulation == MODULATION_FM) - #else - if (gEeprom.VOX_SWITCH && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->Modulation == MODULATION_FM) - #endif - #else - #ifdef ENABLE_FMRADIO - if (gEeprom.VOX_SWITCH && !gFmRadioMode && gCurrentVfo->Modulation == MODULATION_FM) - #else - if (gEeprom.VOX_SWITCH && gCurrentVfo->Modulation == MODULATION_FM) - #endif - #endif - { - BK4819_EnableVox(gEeprom.VOX1_THRESHOLD, gEeprom.VOX0_THRESHOLD); - InterruptMask |= BK4819_REG_3F_VOX_FOUND | BK4819_REG_3F_VOX_LOST; - } - else + if (gEeprom.VOX_SWITCH && gCurrentVfo->Modulation == MODULATION_FM +#ifdef ENABLE_NOAA + && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) #endif - BK4819_DisableVox(); - +#ifdef ENABLE_FMRADIO + && !gFmRadioMode +#endif + ){ + BK4819_EnableVox(gEeprom.VOX1_THRESHOLD, gEeprom.VOX0_THRESHOLD); + InterruptMask |= BK4819_REG_3F_VOX_FOUND | BK4819_REG_3F_VOX_LOST; + } + else +#endif + { + BK4819_DisableVox(); + } // RX expander BK4819_SetCompander((gRxVfo->Modulation == MODULATION_FM && gRxVfo->Compander >= 2) ? gRxVfo->Compander : 0); - #if 0 if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED) - { - BK4819_DisableDTMF(); - } - else - { - BK4819_EnableDTMF(); - InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND; - } + { + BK4819_DisableDTMF(); + } + else + { + BK4819_EnableDTMF(); + InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND; + } #else - if (gCurrentFunction != FUNCTION_TRANSMIT) - { - BK4819_DisableDTMF(); + BK4819_DisableDTMF(); + + if (gCurrentFunction != FUNCTION_TRANSMIT) { BK4819_EnableDTMF(); InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND; - - - - } - else - { - BK4819_DisableDTMF(); } #endif RADIO_SetupAGC(gRxVfo->Modulation == MODULATION_AM, false); @@ -1056,14 +1043,12 @@ void RADIO_PrepareTX(void) #ifdef ENABLE_DTMF_CALLING if (gDTMF_ReplyState == DTMF_REPLY_ANI) { - if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF) - { - gDTMF_IsTx = true; - gDTMF_CallState = DTMF_CALL_STATE_NONE; + gDTMF_IsTx = gDTMF_CallMode == DTMF_CALL_MODE_DTMF; + + if (gDTMF_IsTx) { + gDTMF_CallState = DTMF_CALL_STATE_NONE; gDTMF_TxStopCountdown_500ms = DTMF_txstop_countdown_500ms; - } - else - { + } else { gDTMF_CallState = DTMF_CALL_STATE_CALL_OUT; } } @@ -1139,13 +1124,11 @@ void RADIO_SendEndOfTransmission(void) { BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE); } - if ( + if ((gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH) #ifdef ENABLE_DTMF_CALLING - gDTMF_CallState == DTMF_CALL_STATE_NONE && + && gDTMF_CallState == DTMF_CALL_STATE_NONE #endif - (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN || - gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH)) - { // end-of-tx + ) { // end-of-tx if (gEeprom.DTMF_SIDE_TONE) { AUDIO_AudioPathOn(); diff --git a/radio.h b/radio.h index d0bd415..a2a7a17 100644 --- a/radio.h +++ b/radio.h @@ -155,7 +155,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int confi void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo); void RADIO_ApplyOffset(VFO_Info_t *pInfo); void RADIO_SelectVfos(void); -void RADIO_SetupRegisters(bool bSwitchToFunction0); +void RADIO_SetupRegisters(bool switchToForeground); #ifdef ENABLE_NOAA void RADIO_ConfigureNOAA(void); #endif diff --git a/settings.c b/settings.c index 5c9e367..017e193 100644 --- a/settings.c +++ b/settings.c @@ -22,7 +22,6 @@ #endif #include "driver/bk4819.h" #include "driver/eeprom.h" -#include "driver/uart.h" #include "misc.h" #include "settings.h" #include "ui/menu.h" @@ -44,7 +43,7 @@ void SETTINGS_InitEEPROM(void) uint8_t Data[16]; memset(Data, 0, sizeof(Data)); - + memset(&gEeprom, 0, sizeof(gEeprom)); // 0E70..0E77 EEPROM_ReadBuffer(0x0E70, Data, 8); gEeprom.CHAN_1_CALL = IS_MR_CHANNEL(Data[0]) ? Data[0] : MR_CHANNEL_FIRST; @@ -132,10 +131,21 @@ void SETTINGS_InitEEPROM(void) memmove(&gEeprom.POWER_ON_PASSWORD, Data, 4); // 0EA0..0EA7 -#ifdef ENABLE_VOICE EEPROM_ReadBuffer(0x0EA0, Data, 8); - gEeprom.VOICE_PROMPT = (Data[0] < 3) ? Data[0] : VOICE_PROMPT_ENGLISH; +#ifdef ENABLE_VOICE + gEeprom.VOICE_PROMPT = (Data[0] < 3) ? Data[0] : VOICE_PROMPT_ENGLISH; #endif +#ifdef ENABLE_RSSI_BAR + if((Data[1] < 200 && Data[1] > 90) && (Data[2] < Data[1]-9 && Data[2] > 50)) { + gEeprom.S0_LEVEL = Data[1]; + gEeprom.S9_LEVEL = Data[2]; + } + else { + gEeprom.S0_LEVEL = 130; + gEeprom.S9_LEVEL = 76; + } +#endif + // 0EA8..0EAF EEPROM_ReadBuffer(0x0EA8, Data, 8); @@ -531,9 +541,12 @@ void SETTINGS_SaveSettings(void) memset(State, 0xFF, sizeof(State)); #ifdef ENABLE_VOICE State[0] = gEeprom.VOICE_PROMPT; - EEPROM_WriteBuffer(0x0EA0, State); #endif - +#ifdef ENABLE_RSSI_BAR + State[1] = gEeprom.S0_LEVEL; + State[2] = gEeprom.S9_LEVEL; +#endif + EEPROM_WriteBuffer(0x0EA0, State); #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) State[0] = gEeprom.ALARM_MODE; #else diff --git a/settings.h b/settings.h index bfc5dde..e514ba2 100644 --- a/settings.h +++ b/settings.h @@ -252,6 +252,10 @@ typedef struct { #endif uint8_t BACKLIGHT_MAX; BATTERY_Type_t BATTERY_TYPE; +#ifdef ENABLE_RSSI_BAR + uint8_t S0_LEVEL; + uint8_t S9_LEVEL; +#endif uint32_t MDC1200_ID; } EEPROM_Config_t; diff --git a/ui/battery.c b/ui/battery.c index 631fe23..36e7f0f 100644 --- a/ui/battery.c +++ b/ui/battery.c @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +#include #include #include @@ -21,36 +21,34 @@ #include "driver/st7565.h" #include "functions.h" #include "ui/battery.h" +#include "../misc.h" void UI_DrawBattery(uint8_t* bitmap, uint8_t level, uint8_t blink) { - if (level < 2 && blink == 1) { - memset(bitmap, 0, sizeof(BITMAP_BatteryLevel1)); - } - else - { - memmove(bitmap, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1)); - if (level > 2) - { - unsigned int i; - uint8_t bars = level - 2; - if (bars > 4) - bars = 4; - for (i = 0; i < bars; i++) - { - #ifndef ENABLE_REVERSE_BAT_SYMBOL - memcpy(bitmap + sizeof(BITMAP_BatteryLevel1) - 4 - (i * 3), BITMAP_BatteryLevel, 2); - #else - memcpy(bitmap + 3 + (i * 3) + 0, BITMAP_BatteryLevel, 2); - #endif - } - } - } + if (level < 2 && blink == 1) { + memset(bitmap, 0, sizeof(BITMAP_BatteryLevel1)); + return; + } + + memcpy(bitmap, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1)); + + if (level <= 2) { + return; + } + + const uint8_t bars = MIN(4, level - 2); + for (int i = 0; i < bars; i++) { +#ifndef ENABLE_REVERSE_BAT_SYMBOL + memcpy(bitmap + sizeof(BITMAP_BatteryLevel1) - 4 - (i * 3), BITMAP_BatteryLevel, 2); +#else + memcpy(bitmap + 3 + (i * 3) + 0, BITMAP_BatteryLevel, 2); +#endif + } } void UI_DisplayBattery(uint8_t level, uint8_t blink) { - uint8_t bitmap[sizeof(BITMAP_BatteryLevel1)]; - UI_DrawBattery(bitmap, level, blink); + uint8_t bitmap[sizeof(BITMAP_BatteryLevel1)]; + UI_DrawBattery(bitmap, level, blink); ST7565_DrawLine(LCD_WIDTH - sizeof(bitmap), 0, bitmap, sizeof(bitmap)); -} +} \ No newline at end of file diff --git a/ui/helper.c b/ui/helper.c index d47fa72..39e9ce1 100644 --- a/ui/helper.c +++ b/ui/helper.c @@ -23,6 +23,7 @@ #include "ui/inputbox.h" #include "misc.h" #include "chinese.h" + #ifndef ARRAY_SIZE #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0])) #endif @@ -31,9 +32,9 @@ uint8_t menu_set_flag = 0; void set_bit(uint8_t *value, uint8_t bit_position, uint8_t bit_value) { if (bit_value == 0) { - *value = *value & ~(1 << bit_position); // ��ָ��λ����Ϊ 0 + *value = *value & ~(1 << bit_position); } else { - *value = *value | (1 << bit_position); // ��ָ��λ����Ϊ 1 + *value = *value | (1 << bit_position); } } @@ -92,7 +93,7 @@ void UI_PrintCharSmall(char character, uint8_t Start, uint8_t Line) { // Display the character if it's a printable character if (character > ' ') { - const unsigned int index = (unsigned int)character - ' ' - 1; + const unsigned int index = (unsigned int) character - ' ' - 1; if (index < ARRAY_SIZE(gFontSmall)) { memmove(pFb, &gFontSmall[index], char_width); } @@ -102,8 +103,7 @@ void UI_PrintCharSmall(char character, uint8_t Start, uint8_t Line) { void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_t Line) { uint8_t Length = strlen(pString); - if (menu_set_flag == 1) - { + if (menu_set_flag == 1) { Length = Length > 7 ? 7 : Length; menu_set_flag = 0; } @@ -112,9 +112,9 @@ void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_ uint8_t chn_flag[Length]; for (size_t j = 0; j < Length; j++) { chn_flag[j] = is_chn(pString[j]); - if (chn_flag[j] == 255&&pString[j]!='\n'&&pString[j]!='\0')sum_pixel += 7; + if (chn_flag[j] == 255 && pString[j] != '\n' && pString[j] != '\0')sum_pixel += 7; - else if(chn_flag[j] != 255)sum_pixel += 12; + else if (chn_flag[j] != 255)sum_pixel += 12; } if (End > Start) @@ -122,42 +122,39 @@ void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_ // if(Start+sum_pixel>=128)Start=128-sum_pixel; uint8_t *pFb = gFrameBuffer[Line] + Start; uint8_t *pFb1 = gFrameBuffer[Line + 1] + Start; - uint8_t now_pixel = 0; for (i = 0; i < Length; i++) { if (chn_flag[i] == 255) { if (pString[i] > ' ') { const unsigned int index = (unsigned int) pString[i] - ' ' - 1; if (index < ARRAY_SIZE(gFontSmall)) { - memmove(pFb + now_pixel + 1, &gFontSmall[index], 6); + memcpy(pFb + now_pixel + 1, &gFontSmall[index], 6); } now_pixel += 7; - - } else if(pString[i] == ' ') - + } else if (pString[i] == ' ') now_pixel += 7; - - - } else { - uint8_t bit_cnt = 0; - uint8_t cntt = 0; uint8_t gFontChinese[22] = {0}; - for (int j = 0; j < 110; j++) { - if (IS_BIT_SET(gFontChinese_out[(j + chn_flag[i] * 110) / 8], (j + chn_flag[i] * 110) % 8)) - set_bit(&gFontChinese[cntt], bit_cnt, 1); - bit_cnt++; - if ((bit_cnt == 8 && cntt < 11) || (bit_cnt == 2 && cntt >= 11)) { - bit_cnt = 0; - - cntt++; + unsigned int local = CHN_FONT_HIGH * CHN_FONT_WIDTH * chn_flag[i] / 8; + unsigned int local_bit = (CHN_FONT_HIGH * CHN_FONT_WIDTH * chn_flag[i]) % 8; + for (unsigned char i = 0; i < CHN_FONT_WIDTH * 2; ++i) { + unsigned char j_end = 8; + if (i >= CHN_FONT_WIDTH) + j_end = CHN_FONT_HIGH - 8; + for (unsigned char j = 0; j < j_end; ++j) { + if (IS_BIT_SET(gFontChinese_out[local], local_bit)) + set_bit(&gFontChinese[i], j, 1); + local_bit++; + if (local_bit == 8) { + local_bit = 0; + local++; + } } } - memmove(pFb + now_pixel + 1, &gFontChinese[0], 11); - memmove(pFb1 + now_pixel + 1, &gFontChinese[11], 11); + memcpy(pFb + now_pixel + 1, &gFontChinese[0], 11); + memcpy(pFb1 + now_pixel + 1, &gFontChinese[11], 11); + -// memmove(gFrameBuffer[Line + 0] + Start, &gFontChinese[0], 11); -// memmove(gFrameBuffer[Line + 1] + Start, &gFontChinese[11], 11); now_pixel += 12; } } @@ -194,7 +191,7 @@ void UI_PrintStringSmallBuffer(const char *pString, uint8_t *buffer) { if (pString[i] > ' ') { const unsigned int index = (unsigned int) pString[i] - ' ' - 1; if (index < ARRAY_SIZE(gFontSmall)) - memmove(buffer + (i * (char_width + 1)) + 1, &gFontSmall[index], char_width); + memcpy(buffer + (i * (char_width + 1)) + 1, &gFontSmall[index], char_width); } } } @@ -237,18 +234,15 @@ void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center) } -void UI_DrawPixelBuffer(uint8_t (*buffer)[128], uint8_t x, uint8_t y, bool black) -{ +void UI_DrawPixelBuffer(uint8_t (*buffer)[128], uint8_t x, uint8_t y, bool black) { const uint8_t pattern = 1 << (y % 8); - if(black) - buffer[y/8][x] |= pattern; + if (black) + buffer[y / 8][x] |= pattern; else - buffer[y/8][x] &= ~pattern; + buffer[y / 8][x] &= ~pattern; } - - void UI_DisplayPopup(const char *string) { for (uint8_t i = 0; i < 7; i++) { memset(gFrameBuffer[i], 0x00, 128); diff --git a/ui/lock.c b/ui/lock.c index 0c84169..33d4a8d 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -142,14 +142,14 @@ void UI_DisplayLock(void) gDebounceCounter = 0; gKeyReading0 = Key; } - +#ifdef ENABLE_UART if (UART_IsCommandAvailable()) { __disable_irq(); UART_HandleCommand(); __enable_irq(); } - +#endif if (gUpdateDisplay) { Render(); diff --git a/ui/main.c b/ui/main.c index a2e1cdd..6598fdb 100644 --- a/ui/main.c +++ b/ui/main.c @@ -20,9 +20,8 @@ #include "driver/uart.h" #include "app/dtmf.h" #include "app/chFrScanner.h" -#include "debugging.h" -#ifdef ENABLE_AM_FIX_SHOW_DATA +#ifdef ENABLE_AM_FIX #include "am_fix.h" #endif @@ -197,15 +196,17 @@ void DisplayRSSIBar(const bool now) { } - const int16_t s0_dBm = -130; // S0 .. base level -const int16_t rssi_dBm = +const int16_t s0_dBm = -gEeprom.S0_LEVEL; // S0 .. base level + const int16_t rssi_dBm = BK4819_GetRSSI_dBm() #ifdef ENABLE_AM_FIX + ((gSetting_AM_fix && gRxVfo->Modulation == MODULATION_AM) ? AM_fix_get_gain_diff() : 0) #endif + dBmCorrTable[gRxVfo->Band]; - const uint8_t s_level = MIN(MAX((rssi_dBm - s0_dBm) / 6, 0), 9); // S0 - S9 - uint8_t overS9dBm = MIN(MAX(rssi_dBm - (s0_dBm + 9*6), 0), 99); + + int s0_9 = gEeprom.S0_LEVEL - gEeprom.S9_LEVEL; + const uint8_t s_level = MIN(MAX((int32_t)(rssi_dBm - s0_dBm)*100 / (s0_9*100/9), 0), 9); // S0 - S9 + uint8_t overS9dBm = MIN(MAX(rssi_dBm + gEeprom.S9_LEVEL, 0), 99); uint8_t overS9Bars = MIN(overS9dBm/10, 4); if(overS9Bars == 0) { @@ -416,13 +417,13 @@ void UI_DisplayMain(void) { // highlight the selected/used VFO with a marker if (isMainVFO) - memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); + memcpy(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); } else // active TX VFO { // highlight the selected/used VFO with a marker if (isMainVFO) - memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); + memcpy(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); else - memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); + memcpy(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); } if (gCurrentFunction == FUNCTION_TRANSMIT) { // transmitting @@ -537,15 +538,15 @@ void UI_DisplayMain(void) { const ChannelAttributes_t att = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; if (att.scanlist1) - memmove(p_line0 + 113, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); + memcpy(p_line0 + 113, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); if (att.scanlist2) - memmove(p_line0 + 120, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); + memcpy(p_line0 + 120, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); // compander symbol #ifndef ENABLE_BIG_FREQ if (att.compander) - memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); + memcpy(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); #else // TODO: // find somewhere else to put the symbol #endif @@ -624,9 +625,9 @@ void UI_DisplayMain(void) { if (att.compander) #ifdef ENABLE_BIG_FREQ - memmove(p_line0 + 120, BITMAP_compand, sizeof(BITMAP_compand)); + memcpy(p_line0 + 120, BITMAP_compand, sizeof(BITMAP_compand)); #else - memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); + memcpy(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); #endif } } diff --git a/ui/menu.c b/ui/menu.c index afce6ed..f32aa86 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -436,7 +436,7 @@ void UI_DisplayMenu(void) { //const void *BITMAP_CurrentIndicator = BITMAP_MARKER; if (gIsInSubMenu) - memmove(gFrameBuffer[2] + 40, BITMAP_MARKER, sizeof(BITMAP_MARKER)); + memmove(gFrameBuffer[2] + 40, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); // draw the menu index number/count绘制菜单索引号/总数 : sprintf(String, "%2u/%u", 1 + gMenuCursor, gMenuListCount); @@ -499,7 +499,11 @@ void UI_DisplayMenu(void) { memset(String, 0, sizeof(String)); bool already_printed = false; +/* Brightness is set to max in some entries of this menu. Return it to the configured brightness + level the "next" time we enter here.I.e., when we move from one menu to another. + It also has to be set back to max when pressing the Exit key. */ + BACKLIGHT_TurnOn(); switch (UI_MENU_GetCurrentMenuId()) { case MENU_SQL: sprintf(String, "%d", gSubMenuSelection); @@ -904,7 +908,7 @@ void UI_DisplayMenu(void) { if (!gIsDtmfContactValid) strcpy(String, "NULL"); else - memmove(String, Contact, 8); + memcpy(String, Contact, 8); break; #endif // case MENU_PONMSG: @@ -1091,7 +1095,7 @@ void UI_DisplayMenu(void) { #ifdef ENABLE_DTMF_CALLING if (UI_MENU_GetCurrentMenuId() == MENU_D_LIST && gIsDtmfContactValid) { Contact[11] = 0; - memmove(&gDTMF_ID, Contact + 8, 4); + memcpy(&gDTMF_ID, Contact + 8, 4); sprintf(String, "ID:%s", Contact + 8); UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 5); } diff --git a/ui/status.c b/ui/status.c index 313b3ba..41f0775 100644 --- a/ui/status.c +++ b/ui/status.c @@ -36,172 +36,139 @@ void UI_DisplayStatus() { - uint8_t *line = gStatusLine; - unsigned int x = 0; - unsigned int x1 = 0; - gUpdateStatus = false; - memset(gStatusLine, 0, sizeof(gStatusLine)); + uint8_t *line = gStatusLine; + unsigned int x = 0; // ************** // POWER-SAVE indicator - if (gCurrentFunction == FUNCTION_TRANSMIT) - { - memmove(line + x, BITMAP_TX, sizeof(BITMAP_TX)); - x1 = x + sizeof(BITMAP_TX); + if (gCurrentFunction == FUNCTION_TRANSMIT) { + memcpy(line + x, BITMAP_TX, sizeof(BITMAP_TX)); } - else - if (FUNCTION_IsRx()) - { - memmove(line + x, BITMAP_RX, sizeof(BITMAP_RX)); - x1 = x + sizeof(BITMAP_RX); + else if (FUNCTION_IsRx()) { + memcpy(line + x, BITMAP_RX, sizeof(BITMAP_RX)); } - else - if (gCurrentFunction == FUNCTION_POWER_SAVE) - { - memmove(line + x, BITMAP_POWERSAVE, sizeof(BITMAP_POWERSAVE)); - x1 = x + sizeof(BITMAP_POWERSAVE); + else if (gCurrentFunction == FUNCTION_POWER_SAVE) { + memcpy(line + x, BITMAP_POWERSAVE, sizeof(BITMAP_POWERSAVE)); } - x += sizeof(BITMAP_POWERSAVE); + x += 8; + unsigned int x1 = x; #ifdef ENABLE_NOAA - // NOASS SCAN indicator - if (gIsNoaaMode) - { - memmove(line + x, BITMAP_NOAA, sizeof(BITMAP_NOAA)); - x1 = x + sizeof(BITMAP_NOAA); - } - x += sizeof(BITMAP_NOAA); -#else - // hmmm, what to put in it's place + if (gIsNoaaMode) { // NOASS SCAN indicator + memcpy(line + x, BITMAP_NOAA, sizeof(BITMAP_NOAA)); + x1 = x + sizeof(BITMAP_NOAA); + } + x += sizeof(BITMAP_NOAA); #endif #ifdef ENABLE_DTMF_CALLING - if (gSetting_KILLED) - { + if (gSetting_KILLED) { memset(line + x, 0xFF, 10); x1 = x + 10; } else #endif - { - // SCAN indicator - if (gScanStateDir != SCAN_OFF || SCANNER_IsScanning()) - { +#ifdef ENABLE_FMRADIO + if (gFmRadioMode) { // FM indicator + memcpy(line + x, BITMAP_FM, sizeof(BITMAP_FM)); + x1 = x + sizeof(BITMAP_FM); + } + else +#endif + { // SCAN indicator + if (gScanStateDir != SCAN_OFF || SCANNER_IsScanning()) { char * s = ""; - if (IS_MR_CHANNEL(gNextMrChannel) && !SCANNER_IsScanning()) - { // channel mode + if (IS_MR_CHANNEL(gNextMrChannel) && !SCANNER_IsScanning()) { // channel mode switch(gEeprom.SCAN_LIST_DEFAULT) { case 0: s = "1"; break; case 1: s = "2"; break; case 2: s = "*"; break; } } - else - { // frequency mode + else { // frequency mode s = "S"; } - UI_PrintStringSmallBuffer(s, line + x); - x1 = x + 7; + UI_PrintStringSmallBuffer(s, line + x + 1); + x1 = x + 10; } } - x += 7; // font character width + x += 10; // font character width #ifdef ENABLE_VOICE // VOICE indicator - if (gEeprom.VOICE_PROMPT != VOICE_PROMPT_OFF) - { - memmove(line + x, BITMAP_VoicePrompt, sizeof(BITMAP_VoicePrompt)); - x1 = x + sizeof(BITMAP_VoicePrompt); - } - x += sizeof(BITMAP_VoicePrompt) + 1; -#else - // hmmm, what to put in it's place + if (gEeprom.VOICE_PROMPT != VOICE_PROMPT_OFF){ + memcpy(line + x, BITMAP_VoicePrompt, sizeof(BITMAP_VoicePrompt)); + x1 = x + sizeof(BITMAP_VoicePrompt); + } + x += sizeof(BITMAP_VoicePrompt); #endif - x++; if(!SCANNER_IsScanning()) { uint8_t dw = (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) * 2; if(dw == 1 || dw == 3) { // DWR - dual watch + respond if(gDualWatchActive) - memmove(line + x, BITMAP_TDR1, sizeof(BITMAP_TDR1) - (dw==1?0:5)); + memcpy(line + x + (dw==1?0:2), BITMAP_TDR1, sizeof(BITMAP_TDR1) - (dw==1?0:5)); else - memmove(line + x + 3, BITMAP_TDR2, sizeof(BITMAP_TDR2)); + memcpy(line + x + 3, BITMAP_TDR2, sizeof(BITMAP_TDR2)); } else if(dw == 2) { // XB - crossband - memmove(line + x, BITMAP_XB, sizeof(BITMAP_XB)); + memcpy(line + x + 2, BITMAP_XB, sizeof(BITMAP_XB)); } } - x += sizeof(BITMAP_TDR1) + 2; + x += sizeof(BITMAP_TDR1) + 1; #ifdef ENABLE_VOX // VOX indicator - if (gEeprom.VOX_SWITCH) - { - memmove(line + x, BITMAP_VOX, sizeof(BITMAP_VOX)); - x1 = x + sizeof(BITMAP_VOX); - } - x += sizeof(BITMAP_VOX) + 2; + if (gEeprom.VOX_SWITCH) { + memcpy(line + x, BITMAP_VOX, sizeof(BITMAP_VOX)); + x1 = x + sizeof(BITMAP_VOX) + 1; + } + x += sizeof(BITMAP_VOX) + 1; #endif - x = MAX(x, 61u); - x1 = x; + x = MAX(x1, 61u); // KEY-LOCK indicator - if (gEeprom.KEY_LOCK) - { - - memmove(line + x, BITMAP_KeyLock, sizeof(BITMAP_KeyLock)); + if (gEeprom.KEY_LOCK) { + memcpy(line + x, BITMAP_KeyLock, sizeof(BITMAP_KeyLock)); x += sizeof(BITMAP_KeyLock); x1 = x; - //按键锁定禁止发射 - // RADIO_SetVfoState(VFO_STATE_TX_DISABLE); - } - else - if (gWasFKeyPressed) - { - memmove(line + x, BITMAP_F_Key, sizeof(BITMAP_F_Key)); + else if (gWasFKeyPressed) { + memcpy(line + x, BITMAP_F_Key, sizeof(BITMAP_F_Key)); x += sizeof(BITMAP_F_Key); x1 = x; } { // battery voltage or percentage - char s[16]; - unsigned int space_needed; - - unsigned int x2 = LCD_WIDTH - sizeof(BITMAP_BatteryLevel1) - 3; + char s[8] = ""; + unsigned int x2 = LCD_WIDTH - sizeof(BITMAP_BatteryLevel1) - 0; if (gChargingWithTypeC) x2 -= sizeof(BITMAP_USB_C); // the radio is on charge - +// switch (gSetting_battery_text) { // default: // case 0: // break; // -// case 1: // voltage -// { - const uint16_t voltage = (gBatteryVoltageAverage <= 999) ? gBatteryVoltageAverage : 999; // limit to 9.99V - sprintf(s, "%u.%02uV", voltage / 100, voltage % 100); - space_needed = (7 * strlen(s)); - if (x2 >= (x1 + space_needed)) - { - UI_PrintStringSmallBuffer(s, line + x2 - space_needed); - } +// case 1: { // voltage +// const uint16_t voltage = (gBatteryVoltageAverage <= 999) ? gBatteryVoltageAverage : 999; // limit to 9.99V +// sprintf(s, "%u.%02uV", voltage / 100, voltage % 100); // break; // } - +// // case 2: // percentage -// { -// sprintf(s, "%u%%", BATTERY_VoltsToPercent(gBatteryVoltageAverage)); -// space_needed = (7 * strlen(s)); -// if (x2 >= (x1 + space_needed)) -// UI_PrintStringSmallBuffer(s, line + x2 - space_needed); -// } + sprintf(s, "%u%%", BATTERY_VoltsToPercent(gBatteryVoltageAverage)); +// break; +// } + unsigned int space_needed = (7 * strlen(s)); + if (x2 >= (x1 + space_needed)) + UI_PrintStringSmallBuffer(s, line + x2 - space_needed); } // move to right side of the screen @@ -209,7 +176,7 @@ void UI_DisplayStatus() // USB-C charge indicator if (gChargingWithTypeC) - memmove(line + x, BITMAP_USB_C, sizeof(BITMAP_USB_C)); + memcpy(line + x, BITMAP_USB_C, sizeof(BITMAP_USB_C)); x += sizeof(BITMAP_USB_C); // BATTERY LEVEL indicator diff --git a/uv-k5font/font.xlsx b/uv-k5font/font.xlsx index d2cb098452386f7351c2a5e5c27c1f98d132b513..b5d83a792ca6e2e8bb560e0ea47982f8cc2a5396 100644 GIT binary patch delta 43163 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 delta 44267 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�Igb0}~hA-6)rez6sK{Z}I`T8H*u{V#o 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 McCevHbvzUKKOmyK