From 38aec1624fb5d435ba8260fae4cbbc42a2ee790f Mon Sep 17 00:00:00 2001 From: wu58430 Date: Mon, 25 Dec 2023 13:43:25 +0800 Subject: [PATCH] 112 --- .idea/workspace.xml | 44 +++---- Doxyfile | 17 +++ Makefile | 9 ++ app/app.c | 116 ++++++++--------- app/dtmf.c | 56 ++++++--- app/dtmf.h | 2 +- app/spectrum.c | 44 ++++--- driver/bk4819-regs.h | 2 +- driver/bk4819.c | 193 ++++++++++++++--------------- driver/bk4819.h | 5 +- firmware | Bin 0 -> 162840 bytes font.c | 4 +- font.h | 5 +- functions.c | 58 ++++----- main.c | 2 +- radio.c | 57 ++------- ui/main.c | 116 ++++++++++------- ui/welcome.c | 2 +- uv-k5font/uv-k5font_full/font.xlsx | Bin 203978 -> 203949 bytes version.c | 10 +- win_make.bat | 2 +- 21 files changed, 386 insertions(+), 358 deletions(-) create mode 100644 Doxyfile create mode 100644 firmware diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2d9d1b7..ebc3ece 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -20,7 +20,7 @@ - + - - - - @@ -240,22 +235,7 @@ - - - - - 1701693594928 - - - 1701736695809 - 1701737194492 @@ -586,7 +566,21 @@ - @@ -613,7 +607,6 @@ - @@ -638,7 +631,8 @@ - diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..9f2c452 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,17 @@ +OUTPUT_DIRECTORY = docs +GENERATE_LATEX = NO +GENERATE_RTF = NO +GENERATE_MAN = NO +OPTIMIZE_OUTPUT_FOR_C = YES +HAVE_DOT = YES +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +CALL_GRAPH = YES +CALLER_GRAPH = YES +DISABLE_INDEX = YES +GENERATE_TREEVIEW = YES +RECURSIVE = YES +COLLABORATION_GRAPH = YES +GRAPHICAL_HIERARCHY = YES +DOT_MULTI_TARGETS = YES \ No newline at end of file diff --git a/Makefile b/Makefile index b5a3273..117df0d 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,7 @@ ENABLE_MDC1200 ?= 1 ENABLE_MDC1200_SHOW_OP_ARG ?= 1 ENABLE_MDC1200_SIDE_BEEP ?= 0 ENABLE_MDC1200_CONTACT ?= 1 +ENABLE_CHINESE_FULL =0 @@ -215,6 +216,11 @@ ifneq (, $(shell $(WHERE) git)) VERSION_STRING := $(shell git rev-parse --short HEAD) endif endif +# If there is still no VERSION_STRING we need to make one. +# It is needed for the firmware packing script +ifeq (, $(VERSION_STRING)) + VERSION_STRING := NOGIT +endif #VERSION_STRING := 230930b @@ -262,6 +268,7 @@ endif ifeq ($(ENABLE_MDC1200_CONTACT),1) CFLAGS += -DENABLE_MDC1200_CONTACT endif +CFLAGS += -DENABLE_CHINESE_FULL=$(ENABLE_CHINESE_FULL) ifeq ($(ENABLE_MDC1200_SHOW_OP_ARG),1) @@ -466,6 +473,8 @@ ifdef OS else clean: $(RM) $(call FixPath, $(TARGET).bin $(TARGET).packed.bin $(TARGET) $(OBJS) $(DEPS)) + doxygen: + doxygen endif else clean: diff --git a/app/app.c b/app/app.c index 7cb7644..b4194dd 100644 --- a/app/app.c +++ b/app/app.c @@ -732,16 +732,15 @@ static void CheckRadioInterrupts(void) } } void APP_EndTransmission(void) -{ // back to RX mode +{ + // back to RX mode RADIO_SendEndOfTransmission(); - // send the CTCSS/DCS tail tone - allows the receivers to mute the usual FM squelch tail/crash - RADIO_EnableCxCSS(); - RADIO_SetupRegisters(false); - if (gMonitor) - gFlagReconfigureVfos = true; //turn the monitor back on + if (gMonitor) { + //turn the monitor back on + gFlagReconfigureVfos = true; + } } - #ifdef ENABLE_VOX static void HandleVox(void) { @@ -883,37 +882,32 @@ void APP_Update(void) #endif // toggle between the VFO's if dual watch is enabled - if (!SCANNER_IsScanning() && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) - { + if (!SCANNER_IsScanning() + && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF + && gScheduleDualWatch + && gScanStateDir == SCAN_OFF + && !gPttIsPressed + && gCurrentFunction != FUNCTION_POWER_SAVE #ifdef ENABLE_VOICE - if (gScheduleDualWatch && gVoiceWriteIndex == 0) -#else - if (gScheduleDualWatch) + && gVoiceWriteIndex == 0 #endif - { - if (gScanStateDir == SCAN_OFF) - { - if (!gPttIsPressed && - #ifdef ENABLE_FMRADIO - !gFmRadioMode && - #endif - #ifdef ENABLE_DTMF_CALLING - gDTMF_CallState == DTMF_CALL_STATE_NONE && - #endif - gCurrentFunction != FUNCTION_POWER_SAVE) - { - DualwatchAlternate(); // toggle between the two VFO's +#ifdef ENABLE_FMRADIO + && !gFmRadioMode +#endif +#ifdef ENABLE_DTMF_CALLING + && gDTMF_CallState == DTMF_CALL_STATE_NONE +#endif + ) { + DualwatchAlternate(); // toggle between the two VFO's - if (gRxVfoIsActive && gScreenToDisplay == DISPLAY_MAIN) - GUI_SelectNextDisplay(DISPLAY_MAIN); - - gRxVfoIsActive = false; - gScanPauseMode = false; - gRxReceptionMode = RX_MODE_NONE; - gScheduleDualWatch = false; - } - } + if (gRxVfoIsActive && gScreenToDisplay == DISPLAY_MAIN) { + GUI_SelectNextDisplay(DISPLAY_MAIN); } + + gRxVfoIsActive = false; + gScanPauseMode = false; + gRxReceptionMode = RX_MODE_NONE; + gScheduleDualWatch = false; } #ifdef ENABLE_FMRADIO @@ -930,39 +924,31 @@ void APP_Update(void) #endif if (gSchedulePowerSave) { - if (gPttIsPressed || - gKeyBeingHeld || - gEeprom.BATTERY_SAVE == 0 || - gScanStateDir != SCAN_OFF || - gCssBackgroundScan || - gScreenToDisplay != DISPLAY_MAIN + if (gPttIsPressed + || gKeyBeingHeld + || gEeprom.BATTERY_SAVE == 0 + || gScanStateDir != SCAN_OFF + || gCssBackgroundScan + || gScreenToDisplay != DISPLAY_MAIN #ifdef ENABLE_FMRADIO || gFmRadioMode #endif #ifdef ENABLE_DTMF_CALLING || gDTMF_CallState != DTMF_CALL_STATE_NONE #endif - ){ - gBatterySaveCountdown_10ms = battery_save_count_10ms; - } - else + + #ifdef ENABLE_NOAA - if ((!IS_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) && !IS_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) || !gIsNoaaMode) + || (gIsNoaaMode && (IS_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) || IS_NOAA_CHANNEL(gEeprom.ScreenChannel[1]))) #endif - { - //if (gCurrentFunction != FUNCTION_POWER_SAVE) + ) { + gBatterySaveCountdown_10ms = battery_save_count_10ms; + } else { FUNCTION_Select(FUNCTION_POWER_SAVE); } -#ifdef ENABLE_NOAA - else - { - gBatterySaveCountdown_10ms = battery_save_count_10ms; - } -#else - gSchedulePowerSave = false; -#endif - } + gSchedulePowerSave = false; + } if (gPowerSaveCountdownExpired && gCurrentFunction == FUNCTION_POWER_SAVE #ifdef ENABLE_VOICE @@ -1023,16 +1009,17 @@ void APP_Update(void) // called every 10ms static void CheckKeys(void) { - - if (0 #ifdef ENABLE_DTMF_CALLING - || gSetting_KILLED + if(gSetting_KILLED){ + return; + } #endif + #ifdef ENABLE_AIRCOPY - || (gScreenToDisplay == DISPLAY_AIRCOPY && gAircopyState != AIRCOPY_READY) + if (gScreenToDisplay == DISPLAY_AIRCOPY && gAircopyState != AIRCOPY_READY){ + return; + } #endif - ) - return; // -------------------- PTT ------------------------ @@ -1578,9 +1565,8 @@ static void ALARM_Off(void) AUDIO_AudioPathOff(); gEnableSpeaker = false; - if (gAlarmState == ALARM_STATE_TXALARM) { - RADIO_SendEndOfTransmission(); - RADIO_EnableCxCSS(); +if (gAlarmState == ALARM_STATE_TXALARM || gAlarmState == ALARM_STATE_TX1750) { + RADIO_SendEndOfTransmission(); } gAlarmState = ALARM_STATE_OFF; diff --git a/app/dtmf.c b/app/dtmf.c index 4040877..5d98fc2 100644 --- a/app/dtmf.c +++ b/app/dtmf.c @@ -114,23 +114,16 @@ bool DTMF_GetContact(const int Index, char *pContact) bool DTMF_FindContact(const char *pContact, char *pResult) { - char Contact[16]; - unsigned int i; + pResult[0] = 0; - for (i = 0; i < MAX_DTMF_CONTACTS; i++) - { - unsigned int j; - - if (!DTMF_GetContact(i, Contact)) + for (unsigned int i = 0; i < MAX_DTMF_CONTACTS; i++) { + char Contact[16]; + if (!DTMF_GetContact(i, Contact)) { return false; + } - for (j = 0; j < 3; j++) - if (pContact[j] != Contact[j + 8]) - break; - - if (j == 3) - { -memcpy(pResult, Contact, 8); + if (memcmp(pContact, Contact + 8, 3) == 0) { + memcpy(pResult, Contact, 8); pResult[8] = 0; return true; } @@ -478,4 +471,39 @@ gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN) BK4819_ExitDTMF_TX(false); return true; +} + +void DTMF_SendEndOfTransmission(void) +{ + if (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO) { + BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE); + } + + 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 +#endif + ) { // end-of-tx + if (gEeprom.DTMF_SIDE_TONE) + { + AUDIO_AudioPathOn(); + gEnableSpeaker = true; + SYSTEM_DelayMs(60); + } + + BK4819_EnterDTMF_TX(gEeprom.DTMF_SIDE_TONE); + + BK4819_PlayDTMFString( + gEeprom.DTMF_DOWN_CODE, + 0, + gEeprom.DTMF_FIRST_CODE_PERSIST_TIME, + gEeprom.DTMF_HASH_CODE_PERSIST_TIME, + gEeprom.DTMF_CODE_PERSIST_TIME, + gEeprom.DTMF_CODE_INTERVAL_TIME); + + AUDIO_AudioPathOff(); + gEnableSpeaker = false; + } + + BK4819_ExitDTMF_TX(true); } \ No newline at end of file diff --git a/app/dtmf.h b/app/dtmf.h index fcb9b31..034a4e0 100644 --- a/app/dtmf.h +++ b/app/dtmf.h @@ -105,7 +105,7 @@ char DTMF_GetCharacter(const unsigned int code); void DTMF_clear_input_box(void); void DTMF_Append(const char vode); bool DTMF_Reply(); - +void DTMF_SendEndOfTransmission(void); #ifdef ENABLE_DTMF_CALLING void DTMF_clear_RX(void); DTMF_CallMode_t DTMF_CheckGroupCall(const char *pDTMF, const unsigned int size); diff --git a/app/spectrum.c b/app/spectrum.c index 56ecad7..939b120 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -16,6 +16,7 @@ #include "app/spectrum.h" #include "am_fix.h" #include "audio.h" +#include "misc.h" #ifdef ENABLE_SCAN_RANGES #include "chFrScanner.h" @@ -37,7 +38,6 @@ struct FrequencyBandInfo { const uint16_t RSSI_MAX_VALUE = 65535; -static uint16_t R30, R37, R3D, R43, R47, R48, R7E; static uint32_t initialFreq; static char String[32]; @@ -221,24 +221,29 @@ static void ToggleAFBit(bool on) { BK4819_WriteRegister(BK4819_REG_47, reg); } +static const BK4819_REGISTER_t registers_to_save[] ={ + BK4819_REG_30, + BK4819_REG_37, + BK4819_REG_3D, + BK4819_REG_43, + BK4819_REG_47, + BK4819_REG_48, + BK4819_REG_7E, +}; + +static uint16_t registers_stack [sizeof(registers_to_save)]; + static void BackupRegisters() { - R30 = BK4819_ReadRegister(BK4819_REG_30); - R37 = BK4819_ReadRegister(BK4819_REG_37); - R3D = BK4819_ReadRegister(BK4819_REG_3D); - R43 = BK4819_ReadRegister(BK4819_REG_43); - R47 = BK4819_ReadRegister(BK4819_REG_47); - R48 = BK4819_ReadRegister(BK4819_REG_48); - R7E = BK4819_ReadRegister(BK4819_REG_7E); + for (uint32_t i = 0; i < ARRAY_SIZE(registers_to_save); i++){ + registers_stack[i] = BK4819_ReadRegister(registers_to_save[i]); + } } static void RestoreRegisters() { - BK4819_WriteRegister(BK4819_REG_30, R30); - BK4819_WriteRegister(BK4819_REG_37, R37); - BK4819_WriteRegister(BK4819_REG_3D, R3D); - BK4819_WriteRegister(BK4819_REG_43, R43); - BK4819_WriteRegister(BK4819_REG_47, R47); - BK4819_WriteRegister(BK4819_REG_48, R48); - BK4819_WriteRegister(BK4819_REG_7E, R7E); + + for (uint32_t i = 0; i < ARRAY_SIZE(registers_to_save); i++){ + BK4819_WriteRegister(registers_to_save[i], registers_stack[i]); + } } static void ToggleAFDAC(bool on) { @@ -483,13 +488,12 @@ static void UpdateDBMax(bool inc) { } static void UpdateScanStep(bool inc) { - if (inc && settings.scanStepIndex < S_STEP_100_0kHz) { - settings.scanStepIndex++; - } else if (!inc && settings.scanStepIndex > 0) { - settings.scanStepIndex--; + if (inc) { + settings.scanStepIndex = settings.scanStepIndex != S_STEP_100_0kHz ? settings.scanStepIndex + 1 : 0; } else { - return; + settings.scanStepIndex = settings.scanStepIndex != 0 ? settings.scanStepIndex - 1 : S_STEP_100_0kHz; } + settings.frequencyChangeStep = GetBW() >> 1; RelaunchScan(); ResetBlacklist(); diff --git a/driver/bk4819-regs.h b/driver/bk4819-regs.h index 15d753e..3446f2d 100644 --- a/driver/bk4819-regs.h +++ b/driver/bk4819-regs.h @@ -17,7 +17,7 @@ #ifndef BK4819_REGS_H #define BK4819_REGS_H - +#include typedef struct { const char *name; uint8_t num; diff --git a/driver/bk4819.c b/driver/bk4819.c index f1c2bd0..a55af9e 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -14,8 +14,10 @@ * limitations under the License. */ -#include // NULL +#include +#include +#include "settings.h" #include "../audio.h" #include "../bsp/dp32g030/gpio.h" #include "../bsp/dp32g030/portcon.h" @@ -26,6 +28,7 @@ #ifdef ENABLE_MDC1200 #include "app/mdc1200.h" #endif +#include "misc.h" #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #endif @@ -325,6 +328,22 @@ void BK4819_InitAGC(bool amModulation) } +void BK4819_PlayRoger(void) +{ + if (gEeprom.ROGER == ROGER_MODE_ROGER||gEeprom.ROGER==ROGER_MODE_MDC_HEAD_ROGER) + BK4819_PlayRogerNormal(); + else + if (gEeprom.ROGER == ROGER_MODE_MDC_END||gEeprom.ROGER==ROGER_MODE_MDC_BOTH) { + + BK4819_send_MDC1200(MDC1200_OP_CODE_POST_ID, 0x00, gEeprom.MDC1200_ID, false); + +#ifdef ENABLE_MDC1200_SIDE_BEEP + BK4819_start_tone(880, 10, true, true); + SYSTEM_DelayMs(120); + BK4819_stop_tones(true); +#endif + } +} int8_t BK4819_GetRxGain_dB(void) { union { @@ -609,90 +628,54 @@ void BK4819_SetFilterBandwidth(const BK4819_FilterBandwidth_t Bandwidth, const b // // <1:0> 0 ??? - uint16_t val; - m_bandwidth = Bandwidth; - + uint16_t val = 0; switch (Bandwidth) { default: case BK4819_FILTER_BW_WIDE: // 25kHz - if (weak_no_different) - { // make the RX bandwidth the same with weak signals - val = - (0u << 15) | // 0 - (4u << 12) | // *3 RF filter bandwidth - (4u << 9) | // *0 RF filter bandwidth when signal is weak - (6u << 6) | // *0 AFTxLPF2 filter Band Width - (2u << 4) | // 2 BW Mode Selection - (1u << 3) | // 1 - (0u << 2) | // 0 Gain after FM Demodulation - (0u << 0); // 0 - } - else - { // with weak RX signals the RX bandwidth is reduced - val = // 0x3028); // 0 011 000 000 10 1 0 00 - (0u << 15) | // 0 - (4u << 12) | // *3 RF filter bandwidth - (2u << 9) | // *0 RF filter bandwidth when signal is weak - (6u << 6) | // *0 AFTxLPF2 filter Band Width - (2u << 4) | // 2 BW Mode Selection - (1u << 3) | // 1 - (0u << 2) | // 0 Gain after FM Demodulation - (0u << 0); // 0 + val = (4u << 12) | // *3 RF filter bandwidth + (6u << 6) | // *0 AFTxLPF2 filter Band Width + (2u << 4) | // 2 BW Mode Selection + (1u << 3) | // 1 + (0u << 2); // 0 Gain after FM Demodulation + + if (weak_no_different) { + // make the RX bandwidth the same with weak signals + val |= (4u << 9); // *0 RF filter bandwidth when signal is weak + } else { + /// with weak RX signals the RX bandwidth is reduced + val |= (2u << 9); // *0 RF filter bandwidth when signal is weak } + break; case BK4819_FILTER_BW_NARROW: // 12.5kHz - if (weak_no_different) - { - val = - (0u << 15) | // 0 - (4u << 12) | // *4 RF filter bandwidth - (4u << 9) | // *0 RF filter bandwidth when signal is weak - (0u << 6) | // *1 AFTxLPF2 filter Band Width - (0u << 4) | // 0 BW Mode Selection - (1u << 3) | // 1 - (0u << 2) | // 0 Gain after FM Demodulation - (0u << 0); // 0 - } - else - { - val = // 0x4048); // 0 100 000 001 00 1 0 00 - (0u << 15) | // 0 - (4u << 12) | // *4 RF filter bandwidth - (2u << 9) | // *0 RF filter bandwidth when signal is weak - (0u << 6) | // *1 AFTxLPF2 filter Band Width - (0u << 4) | // 0 BW Mode Selection - (1u << 3) | // 1 - (0u << 2) | // 0 Gain after FM Demodulation - (0u << 0); // 0 + val = (4u << 12) | // *4 RF filter bandwidth + (0u << 6) | // *1 AFTxLPF2 filter Band Width + (0u << 4) | // 0 BW Mode Selection + (1u << 3) | // 1 + (0u << 2); // 0 Gain after FM Demodulation + + if (weak_no_different) { + val |= (4u << 9); // *0 RF filter bandwidth when signal is weak + } else { + val |= (2u << 9); } + break; case BK4819_FILTER_BW_NARROWER: // 6.25kHz - if (weak_no_different) - { - val = - (0u << 15) | // 0 - (3u << 12) | // 3 RF filter bandwidth - (3u << 9) | // *0 RF filter bandwidth when signal is weak - (1u << 6) | // 1 AFTxLPF2 filter Band Width - (1u << 4) | // 1 BW Mode Selection - (1u << 3) | // 1 - (0u << 2) | // 0 Gain after FM Demodulation - (0u << 0); // 0 - } - else - { - val = - (0u << 15) | // 0 - (3u << 12) | // 3 RF filter bandwidth - (0u << 9) | // 0 RF filter bandwidth when signal is weak - (1u << 6) | // 1 AFTxLPF2 filter Band Width - (1u << 4) | // 1 BW Mode Selection - (1u << 3) | // 1 - (0u << 2) | // 1 Gain after FM Demodulation - (0u << 0); // 0 + val = (3u << 12) | // 3 RF filter bandwidth + (3u << 9) | // *0 RF filter bandwidth when signal is weak + (1u << 6) | // 1 AFTxLPF2 filter Band Width + (1u << 4) | // 1 BW Mode Selection + (1u << 3) | // 1 + (0u << 2); // 0 Gain after FM Demodulation + + if (weak_no_different) { + val |= (3u << 9); + } else { + val |= (0u << 9); // 0 RF filter bandwidth when signal is weak } break; } @@ -1268,36 +1251,48 @@ void BK4819_EnableTXLink(void) BK4819_REG_30_ENABLE_TX_DSP | BK4819_REG_30_DISABLE_RX_DSP); } - void BK4819_PlayDTMF(char Code) { - uint16_t tone1 = 0; - uint16_t tone2 = 0; + struct DTMF_TonePair { + uint16_t tone1; + uint16_t tone2; + }; + + const struct DTMF_TonePair tones[] = { + {941, 1336}, + {697, 1209}, + {697, 1336}, + {697, 1477}, + {770, 1209}, + {770, 1336}, + {770, 1477}, + {852, 1209}, + {852, 1336}, + {852, 1477}, + {697, 1633}, + {770, 1633}, + {852, 1633}, + {941, 1633}, + {941, 1209}, + {941, 1477}, + }; + + + const struct DTMF_TonePair *pSelectedTone = NULL; switch (Code) { - case '0': tone1 = 941; tone2 = 1336; break; - case '1': tone1 = 697; tone2 = 1209; break; - case '2': tone1 = 697; tone2 = 1336; break; - case '3': tone1 = 697; tone2 = 1477; break; - case '4': tone1 = 770; tone2 = 1209; break; - case '5': tone1 = 770; tone2 = 1336; break; - case '6': tone1 = 770; tone2 = 1477; break; - case '7': tone1 = 852; tone2 = 1209; break; - case '8': tone1 = 852; tone2 = 1336; break; - case '9': tone1 = 852; tone2 = 1477; break; - case 'A': tone1 = 697; tone2 = 1633; break; - case 'B': tone1 = 770; tone2 = 1633; break; - case 'C': tone1 = 852; tone2 = 1633; break; - case 'D': tone1 = 941; tone2 = 1633; break; - case '*': tone1 = 941; tone2 = 1209; break; - case '#': tone1 = 941; tone2 = 1477; break; + case '0'...'9': pSelectedTone = &tones[0 + Code - '0']; break; + case 'A'...'D': pSelectedTone = &tones[10 + Code - 'A']; break; + case '*': pSelectedTone = &tones[14]; break; + case '#': pSelectedTone = &tones[15]; break; + default: pSelectedTone = NULL; } - if (tone1 > 0) - BK4819_WriteRegister(BK4819_REG_71, (((uint32_t)tone1 * 103244) + 5000) / 10000); // with rounding - if (tone2 > 0) - BK4819_WriteRegister(BK4819_REG_72, (((uint32_t)tone2 * 103244) + 5000) / 10000); // with rounding + if (pSelectedTone) { + BK4819_WriteRegister(BK4819_REG_71, (((uint32_t)pSelectedTone->tone1 * 103244) + 5000) / 10000); // with rounding + BK4819_WriteRegister(BK4819_REG_72, (((uint32_t)pSelectedTone->tone2 * 103244) + 5000) / 10000); // with rounding + } } void BK4819_PlayDTMFString(const char *pString, bool bDelayFirst, uint16_t FirstCodePersistTime, uint16_t HashCodePersistTime, uint16_t CodePersistTime, uint16_t CodeInternalTime) @@ -1717,8 +1712,8 @@ void BK4819_PrepareFSKReceive(void) BK4819_WriteRegister(BK4819_REG_59, 0x3068); } -void BK4819_PlayRoger(void) -{ + + void BK4819_PlayRogerNormal(void){ #if 0 const uint32_t tone1_Hz = 500; const uint32_t tone2_Hz = 700; @@ -2426,4 +2421,4 @@ void BK4819_enable_mdc1200_rx(const bool enable) //BK4819_ExitTxMute(); BK4819_WriteRegister(0x50, 0x3B20); // 0011 1011 0010 0000 } -#endif \ No newline at end of file +#endif diff --git a/driver/bk4819.h b/driver/bk4819.h index 542bdbc..536119b 100644 --- a/driver/bk4819.h +++ b/driver/bk4819.h @@ -160,8 +160,9 @@ uint8_t BK4819_GetCTCType(void); void BK4819_SendFSKData(uint16_t *pData); void BK4819_PrepareFSKReceive(void); - -void BK4819_PlayRoger(void); +void BK4819_PlayRoger(void); + + void BK4819_PlayRogerNormal(void); void BK4819_PlayRogerMDC(void); void BK4819_Enable_AfDac_DiscMode_TxDsp(void); diff --git a/firmware b/firmware new file mode 100644 index 0000000000000000000000000000000000000000..d6f645f2ebf3eed906646d9b5038a8b589d952bb GIT binary patch literal 162840 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 I_|^6PA7OF+6#xJL literal 0 HcmV?d00001 diff --git a/font.c b/font.c index 1eeb17b..5354557 100644 --- a/font.c +++ b/font.c @@ -16,7 +16,9 @@ #include "font.h" bool menu_set_flag=false; - +#if ENABLE_CHINESE_FULL ==4 + bool audio_keep_flag=false; +#endif #if 0 #elif 0 diff --git a/font.h b/font.h index d467532..55299e5 100644 --- a/font.h +++ b/font.h @@ -16,14 +16,15 @@ #ifndef FONT_H #define FONT_H - +#include "stdbool.h" #include extern const uint8_t gFontChinese_out[2013]; #define CHN_FONT_WIDTH 11U #define CHN_FONT_HIGH 12U -#define ENABLE_CHINESE_FULL 0 #if ENABLE_CHINESE_FULL ==4 +extern bool audio_keep_flag; + #define MAX_EDIT_INDEX 13 #else #define MAX_EDIT_INDEX 10 diff --git a/functions.c b/functions.c index c9e3573..a107fdd 100644 --- a/functions.c +++ b/functions.c @@ -46,53 +46,50 @@ FUNCTION_Type_t gCurrentFunction; -inline bool FUNCTION_IsRx() { + +bool FUNCTION_IsRx() +{ return gCurrentFunction == FUNCTION_MONITOR || gCurrentFunction == FUNCTION_INCOMING || gCurrentFunction == FUNCTION_RECEIVE; } -void FUNCTION_Init(void) { -#ifdef ENABLE_NOAA - if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) -#endif - { - gCurrentCodeType = (gRxVfo->Modulation != MODULATION_FM) ? CODE_TYPE_OFF : gRxVfo->pRX->CodeType; - } -#ifdef ENABLE_NOAA - else - gCurrentCodeType = CODE_TYPE_CONTINUOUS_TONE; +void FUNCTION_Init(void) +{ + g_CxCSS_TAIL_Found = false; + g_CDCSS_Lost = false; + g_CTCSS_Lost = false; + + g_SquelchLost = false; + + gFlagTailNoteEliminationComplete = false; + gTailNoteEliminationCountdown_10ms = 0; + gFoundCTCSS = false; + gFoundCDCSS = false; + gFoundCTCSSCountdown_10ms = 0; + gFoundCDCSSCountdown_10ms = 0; + gEndOfRxDetectedMaybe = false; + + gCurrentCodeType = (gRxVfo->Modulation != MODULATION_FM) ? CODE_TYPE_OFF : gRxVfo->pRX->CodeType; + +#ifdef ENABLE_VOX + g_VOX_Lost = false; #endif #ifdef ENABLE_DTMF_CALLING DTMF_clear_RX(); #endif - g_CxCSS_TAIL_Found = false; - g_CDCSS_Lost = false; - g_CTCSS_Lost = false; - -#ifdef ENABLE_VOX - g_VOX_Lost = false; -#endif - - g_SquelchLost = false; - - gFlagTailNoteEliminationComplete = false; - gTailNoteEliminationCountdown_10ms = 0; - gFoundCTCSS = false; - gFoundCDCSS = false; - gFoundCTCSSCountdown_10ms = 0; - gFoundCDCSSCountdown_10ms = 0; - gEndOfRxDetectedMaybe = false; - #ifdef ENABLE_NOAA gNOAACountdown_10ms = 0; + + if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) { + gCurrentCodeType = CODE_TYPE_CONTINUOUS_TONE; + } #endif gUpdateStatus = true; } - void FUNCTION_Foreground(const FUNCTION_Type_t PreviousFunction) { #ifdef ENABLE_DTMF_CALLING if (gDTMF_ReplyState != DTMF_REPLY_NONE) @@ -155,7 +152,6 @@ void FUNCTION_Transmit() { // clear the DTMF RX live decoder buffer gDTMF_RX_live_timeout = 0; - gDTMF_RX_live_timeout = 0; memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live)); #if defined(ENABLE_FMRADIO) diff --git a/main.c b/main.c index 6eb79cd..feba3df 100644 --- a/main.c +++ b/main.c @@ -302,7 +302,6 @@ void Main(void) { // BootMode != BOOT_MODE_NORMAL) // { // keys are pressed // UI_DisplayReleaseKeys(BootMode); - BACKLIGHT_TurnOn(); while (KEYBOARD_Poll() != KEY_INVALID) // 500ms { } @@ -315,6 +314,7 @@ void Main(void) { UI_DisplayWelcome(); + boot_counter_10ms = 250; while (boot_counter_10ms > 0) { if (KEYBOARD_Poll() == KEY_EXIT) { // halt boot beeps diff --git a/radio.c b/radio.c index 2ec5d1f..b9849f7 100644 --- a/radio.c +++ b/radio.c @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "driver/bk4819-regs.h" #include "driver/bk4819.h" #include #include "app/mdc1200.h" @@ -52,7 +53,15 @@ const char gModulationStr[MODULATION_UKNOWN][4] = { [MODULATION_RAW]="RAW" #endif }; +void RADIO_SendEndOfTransmission(void) +{ + BK4819_PlayRoger(); + DTMF_SendEndOfTransmission(); + // send the CTCSS/DCS tail tone - allows the receivers to mute the usual FM squelch tail/crash + RADIO_EnableCxCSS(); + RADIO_SetupRegisters(false); +} bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) { // return true if the channel appears valid @@ -1104,51 +1113,3 @@ void RADIO_PrepareCssTX(void) RADIO_EnableCxCSS(); RADIO_SetupRegisters(true); } - -void RADIO_SendEndOfTransmission(void) -{ - if (gEeprom.ROGER == ROGER_MODE_ROGER||gEeprom.ROGER==ROGER_MODE_MDC_HEAD_ROGER) - BK4819_PlayRoger(); - else - if (gEeprom.ROGER == ROGER_MODE_MDC_END||gEeprom.ROGER==ROGER_MODE_MDC_BOTH) { - - BK4819_send_MDC1200(MDC1200_OP_CODE_POST_ID, 0x00, gEeprom.MDC1200_ID, false); - -#ifdef ENABLE_MDC1200_SIDE_BEEP - BK4819_start_tone(880, 10, true, true); - SYSTEM_DelayMs(120); - BK4819_stop_tones(true); -#endif - } - if (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO) - { BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE); - - } - 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 -#endif - ) { // end-of-tx - if (gEeprom.DTMF_SIDE_TONE) - { - AUDIO_AudioPathOn(); - gEnableSpeaker = true; - SYSTEM_DelayMs(60); - } - - BK4819_EnterDTMF_TX(gEeprom.DTMF_SIDE_TONE); - - BK4819_PlayDTMFString( - gEeprom.DTMF_DOWN_CODE, - 0, - gEeprom.DTMF_FIRST_CODE_PERSIST_TIME, - gEeprom.DTMF_HASH_CODE_PERSIST_TIME, - gEeprom.DTMF_CODE_PERSIST_TIME, - gEeprom.DTMF_CODE_INTERVAL_TIME); - - AUDIO_AudioPathOff(); - gEnableSpeaker = false; - } - - BK4819_ExitDTMF_TX(true); -} \ No newline at end of file diff --git a/ui/main.c b/ui/main.c index a0b15d7..40841e0 100644 --- a/ui/main.c +++ b/ui/main.c @@ -19,8 +19,8 @@ #include // abs() #include "driver/uart.h" #include "app/dtmf.h" +#include "font.h" #include "app/chFrScanner.h" - #ifdef ENABLE_AM_FIX #include "am_fix.h" #endif @@ -149,7 +149,14 @@ void UI_DisplayAudioBar(void) uint8_t bars = 13 * sqrt_level / 124; uint8_t *p_line = gFrameBuffer[line]; - memset(p_line, 0, LCD_WIDTH); +#if ENABLE_CHINESE_FULL==4 + if(audio_keep_flag) + { +// audio_keep_flag=false; + }else +#endif + memset(p_line, 0, LCD_WIDTH); + DrawLevelBar(62, line, bars); @@ -241,9 +248,24 @@ UI_PrintStringSmall(str, 2, 0, line); uint8_t *pLine = (gEeprom.RX_VFO == 0) ? gFrameBuffer[2] : gFrameBuffer[6]; if (now) +#if ENABLE_CHINESE_FULL==0 memset(pLine, 0, 23); - DrawSmallAntennaAndBars(pLine, Level); + DrawSmallAntennaAndBars(pLine, Level); +#else + if(IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num]) ) + { + memset(gFrameBuffer[3], 0, 23); + + DrawSmallAntennaAndBars(gFrameBuffer[3], Level); + audio_keep_flag=true; + } +else{ + audio_keep_flag=false; + memset(pLine, 0, 23); + DrawSmallAntennaAndBars(pLine, Level); +} +#endif if (now) ST7565_BlitFullScreen(); #endif @@ -295,13 +317,9 @@ void UI_MAIN_TimeSlice500ms(void) { PrintAGC(true); return; #endif -// const bool rx = (gCurrentFunction == FUNCTION_RECEIVE || -// gCurrentFunction == FUNCTION_MONITOR || -// gCurrentFunction == FUNCTION_INCOMING); -// -// -// if (rx && mdc1200_rx_ready_tick_500ms <= 0) -// DisplayRSSIBar(true); + if(FUNCTION_IsRx()) { + DisplayRSSIBar(true); + } } } // *************************************************************************** @@ -352,6 +370,7 @@ void UI_DisplayMain(void) { const bool isMainVFO = (vfo_num == gEeprom.TX_VFO); uint8_t *p_line0 = gFrameBuffer[line + 0]; uint8_t *p_line1 = gFrameBuffer[line + 1]; + enum Vfo_txtr_mode mode = VFO_MODE_NONE; if (activeTxVFO != vfo_num) // this is not active TX VFO { @@ -367,48 +386,47 @@ void UI_DisplayMain(void) { #endif - if ( + if (gDTMF_InputMode #ifdef ENABLE_DTMF_CALLING - gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx || + || gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx #endif - gDTMF_InputMode) { // show DTMF stuff + ) { + char *pPrintStr = ""; + + // show DTMF stuff #ifdef ENABLE_DTMF_CALLING char Contact[16]; +if (!gDTMF_InputMode) { + if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) { + pPrintStr = DTMF_FindContact(gDTMF_String, Contact) ? Contact : gDTMF_String; + } else if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY){ + pPrintStr = DTMF_FindContact(gDTMF_Callee, Contact) ? Contact : gDTMF_Callee; + }else if (gDTMF_IsTx) { + pPrintStr = gDTMF_String; + } + } - if (!gDTMF_InputMode) - { - memset(Contact, 0, sizeof(Contact)); - if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) - strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT"); - else - if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) - sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller); - else - if (gDTMF_IsTx) - strcpy(String, (gDTMF_State == DTMF_STATE_TX_SUCC) ? "DTMF TX(SUCC)" : "DTMF TX"); + UI_PrintStringSmall(pPrintStr, 2, 0, 2 + (vfo_num * 3)); + + pPrintStr = ""; + if (!gDTMF_InputMode) { + if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) { + pPrintStr = (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT"; + } else if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) { + sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller); + pPrintStr = String; + } else if (gDTMF_IsTx) { + pPrintStr = (gDTMF_State == DTMF_STATE_TX_SUCC) ? "DTMF TX(SUCC)" : "DTMF TX"; + } } else #endif { sprintf(String, ">%s", gDTMF_InputBox); - } - UI_PrintStringSmall(String, 2, 0, 0 + (vfo_num * 3)); -#ifdef ENABLE_DTMF_CALLING - memset(String, 0, sizeof(String)); - if (!gDTMF_InputMode) { + pPrintStr = String; - memset(Contact, 0, sizeof(Contact)); - if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) - sprintf(String, ">%s", (DTMF_FindContact(gDTMF_String, Contact)) ? Contact : gDTMF_String); - else - if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) - sprintf(String, ">%s", (DTMF_FindContact(gDTMF_Callee, Contact)) ? Contact : gDTMF_Callee); - else - if (gDTMF_IsTx) - sprintf(String, ">%s", gDTMF_String); } - UI_PrintStringSmall(String, 2, 0, 2 + (vfo_num * 3)); -#endif + UI_PrintStringSmall(pPrintStr, 2, 0, 0 + (vfo_num * 3)); center_line = CENTER_LINE_IN_USE; continue; @@ -452,7 +470,7 @@ void UI_DisplayMain(void) { if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { // channel mode const unsigned int x = 2; - const bool inputting = (gInputBoxIndex == 0 || gEeprom.TX_VFO != vfo_num) ? false : true; + const bool inputting = gInputBoxIndex != 0 && gEeprom.TX_VFO == vfo_num; if (!inputting) sprintf(String, "M%u", gEeprom.ScreenChannel[vfo_num] + 1); else @@ -676,8 +694,20 @@ void UI_DisplayMain(void) { Level = gVFO_RSSI_bar_level[vfo_num]; #endif } - if (Level) + if (Level) { +#if ENABLE_CHINESE_FULL==0 DrawSmallAntennaAndBars(p_line1 + LCD_WIDTH, Level); +#else + if(IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num]) ) + { DrawSmallAntennaAndBars(gFrameBuffer[2]+LCD_WIDTH, Level); + audio_keep_flag=true; + } + +else + DrawSmallAntennaAndBars(p_line1 + LCD_WIDTH, Level); + +#endif + } } // ************ @@ -756,7 +786,7 @@ void UI_DisplayMain(void) { #else if(IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num]) &&!(FUNCTION_IsRx() && gEeprom.RX_VFO == vfo_num ) &&!( gCurrentFunction == FUNCTION_TRANSMIT&&activeTxVFO == vfo_num) ) UI_PrintStringSmall("R", LCD_WIDTH + 24, 0, line - 1);//中文信道1 - else if(IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) + else if(!IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) UI_PrintStringSmall("R", LCD_WIDTH + 62, 0, line + 1);//中文信道1 #endif diff --git a/ui/welcome.c b/ui/welcome.c index 91a4116..c220c43 100644 --- a/ui/welcome.c +++ b/ui/welcome.c @@ -44,13 +44,13 @@ //} void UI_DisplayWelcome(void) { - BACKLIGHT_TurnOn(); char WelcomeString0[19] = {0}; char WelcomeString1[19] = {0}; memset(gStatusLine, 0, sizeof(gStatusLine)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); + BACKLIGHT_TurnOn(); #if ENABLE_CHINESE_FULL == 4 diff --git a/uv-k5font/uv-k5font_full/font.xlsx b/uv-k5font/uv-k5font_full/font.xlsx index dca804eda45c6d399e158c264f76841ba2f55412..ffa02b7991657d4d846c56b8e28d1aa307b00d56 100644 GIT binary patch delta 11666 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 o3B1K?FDBk=(twd4;d}LJu1X$ny4