diff --git a/app/app.c b/app/app.c index cb96a1e..7da0bc6 100644 --- a/app/app.c +++ b/app/app.c @@ -91,7 +91,7 @@ static void APP_CheckForIncoming(void) return; } - gDualWatchCountdown = 100; + gDualWatchCountdown = dual_watch_count_after_rx; gScheduleDualWatch = false; } else @@ -156,7 +156,7 @@ static void APP_HandleIncoming(void) { if (gRxReceptionMode == RX_MODE_DETECTED) { - gDualWatchCountdown = 500; + gDualWatchCountdown = dual_watch_count_after_1; gScheduleDualWatch = false; gRxReceptionMode = RX_MODE_LISTENING; return; @@ -432,7 +432,8 @@ void APP_StartListening(FUNCTION_Type_t Function) if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) { gRxVfoIsActive = true; - gDualWatchCountdown = 360; + + gDualWatchCountdown = dual_watch_count_after_2; gScheduleDualWatch = false; } @@ -572,17 +573,17 @@ static void DUALWATCH_Alternate(void) } else #endif - { - gEeprom.RX_CHANNEL = 1 - gEeprom.RX_CHANNEL; + { // toggle between VFO's + gEeprom.RX_CHANNEL = (1 - gEeprom.RX_CHANNEL) & 1; gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_CHANNEL]; } RADIO_SetupRegisters(false); #ifndef DISABLE_NOAA - gDualWatchCountdown = gIsNoaaMode ? 7 : 10; + gDualWatchCountdown = gIsNoaaMode ? dual_watch_count_noaa : dual_watch_count_toggle; #else - gDualWatchCountdown = 10; + gDualWatchCountdown = dual_watch_count_toggle; #endif } @@ -592,14 +593,17 @@ void APP_CheckRadioInterrupts(void) return; while (BK4819_ReadRegister(BK4819_REG_0C) & 1u) - { - uint16_t Mask; + { // BK chip interrupt request + uint16_t interrupt_status_bits; + + // reset the interrupt ? BK4819_WriteRegister(BK4819_REG_02, 0); - Mask = BK4819_ReadRegister(BK4819_REG_02); + // fetch the interrupt status bits + interrupt_status_bits = BK4819_ReadRegister(BK4819_REG_02); - if (Mask & BK4819_REG_02_DTMF_5TONE_FOUND) + if (interrupt_status_bits & BK4819_REG_02_DTMF_5TONE_FOUND) { gDTMF_RequestPending = true; gDTMF_RecvTimeout = 5; @@ -618,25 +622,25 @@ void APP_CheckRadioInterrupts(void) DTMF_HandleRequest(); } - if (Mask & BK4819_REG_02_CxCSS_TAIL) + if (interrupt_status_bits & BK4819_REG_02_CxCSS_TAIL) g_CxCSS_TAIL_Found = true; - if (Mask & BK4819_REG_02_CDCSS_LOST) + if (interrupt_status_bits & BK4819_REG_02_CDCSS_LOST) { g_CDCSS_Lost = true; gCDCSSCodeType = BK4819_GetCDCSSCodeType(); } - if (Mask & BK4819_REG_02_CDCSS_FOUND) + if (interrupt_status_bits & BK4819_REG_02_CDCSS_FOUND) g_CDCSS_Lost = false; - if (Mask & BK4819_REG_02_CTCSS_LOST) + if (interrupt_status_bits & BK4819_REG_02_CTCSS_LOST) g_CTCSS_Lost = true; - if (Mask & BK4819_REG_02_CTCSS_FOUND) + if (interrupt_status_bits & BK4819_REG_02_CTCSS_FOUND) g_CTCSS_Lost = false; - if (Mask & BK4819_REG_02_VOX_LOST) + if (interrupt_status_bits & BK4819_REG_02_VOX_LOST) { g_VOX_Lost = true; gVoxPauseCountdown = 10; @@ -649,34 +653,37 @@ void APP_CheckRadioInterrupts(void) gBatterySaveCountdownExpired = 0; } - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown < 20)) + if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown < dual_watch_count_after_vox)) { - gDualWatchCountdown = 20; + gDualWatchCountdown = dual_watch_count_after_vox; gScheduleDualWatch = false; } } } - if (Mask & BK4819_REG_02_VOX_FOUND) + if (interrupt_status_bits & BK4819_REG_02_VOX_FOUND) { g_VOX_Lost = false; gVoxPauseCountdown = 0; } - if (Mask & BK4819_REG_02_SQUELCH_LOST) + if (interrupt_status_bits & BK4819_REG_02_SQUELCH_LOST) { g_SquelchLost = true; BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_GREEN, true); } - if (Mask & BK4819_REG_02_SQUELCH_FOUND) + if (interrupt_status_bits & BK4819_REG_02_SQUELCH_FOUND) { g_SquelchLost = false; BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_GREEN, false); } #ifndef DISABLE_AIRCOPY - if (Mask & BK4819_REG_02_FSK_FIFO_ALMOST_FULL && gScreenToDisplay == DISPLAY_AIRCOPY && gAircopyState == AIRCOPY_TRANSFER && gAirCopyIsSendMode == 0) + if (interrupt_status_bits & BK4819_REG_02_FSK_FIFO_ALMOST_FULL && + gScreenToDisplay == DISPLAY_AIRCOPY && + gAircopyState == AIRCOPY_TRANSFER && + gAirCopyIsSendMode == 0) { unsigned int i; for (i = 0; i < 4; i++) @@ -692,16 +699,17 @@ void APP_EndTransmission(void) RADIO_SendEndOfTransmission(); if (gCurrentVfo->pTX->CodeType != CODE_TYPE_OFF) - { // CTCSS/CDCSS is enabled + { // CTCSS/DCS is enabled //if (gEeprom.TAIL_NOTE_ELIMINATION && gEeprom.REPEATER_TAIL_TONE_ELIMINATION > 0) if (gEeprom.TAIL_NOTE_ELIMINATION) - { // send the tail tone + { // send the CTCSS/DCS tail tone - allows the receivers to mute the usual FM squelch tail/crash RADIO_EnableCxCSS(); } #if 0 else - { // TX a short blank carrier - gives the receivers time to mute RX audio before we drop carrier + { // TX a short blank carrier + // this gives the receivers time to mute RX audio before we drop carrier BK4819_ExitSubAu(); SYSTEM_DelayMs(200); } @@ -879,15 +887,16 @@ void APP_Update(void) { if (!gPttIsPressed && !gFmRadioMode && gDTMF_CallState == DTMF_CALL_STATE_NONE && gCurrentFunction != FUNCTION_POWER_SAVE) { - DUALWATCH_Alternate(); + gScheduleDualWatch = false; + + DUALWATCH_Alternate(); // 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; + gRxVfoIsActive = false; + gScanPauseMode = false; + gRxReceptionMode = RX_MODE_NONE; } } } @@ -955,7 +964,7 @@ void APP_Update(void) if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF) { - DUALWATCH_Alternate(); + DUALWATCH_Alternate(); // toggle between the two VFO's gUpdateRSSI = false; } @@ -982,7 +991,7 @@ void APP_Update(void) } else { - DUALWATCH_Alternate(); + DUALWATCH_Alternate(); // toggle between the two VFO's gUpdateRSSI = true; gBatterySave = 10; diff --git a/driver/bk4819-regs.h b/driver/bk4819-regs.h index b7c2401..64a6825 100644 --- a/driver/bk4819-regs.h +++ b/driver/bk4819-regs.h @@ -286,50 +286,50 @@ enum { // REG 51 -#define BK4819_REG_51_SHIFT_ENABLE_CxCSS 15 -#define BK4819_REG_51_SHIFT_GPIO6_PIN2_INPUT 14 -#define BK4819_REG_51_SHIFT_TX_CDCSS_POLARITY 13 -#define BK4819_REG_51_SHIFT_CxCSS_MODE 12 -#define BK4819_REG_51_SHIFT_CDCSS_BIT_WIDTH 11 -#define BK4819_REG_51_SHIFT_1050HZ_DETECTION 10 -#define BK4819_REG_51_SHIFT_AUTO_CDCSS_BW 9 -#define BK4819_REG_51_SHIFT_AUTO_CTCSS_BW 8 -#define BK4819_REG_51_SHIFT_CxCSS_TX_GAIN1 0 +#define BK4819_REG_51_SHIFT_ENABLE_CxCSS 15 +#define BK4819_REG_51_SHIFT_GPIO6_PIN2_INPUT 14 +#define BK4819_REG_51_SHIFT_TX_CDCSS_POLARITY 13 +#define BK4819_REG_51_SHIFT_CxCSS_MODE 12 +#define BK4819_REG_51_SHIFT_CDCSS_BIT_WIDTH 11 +#define BK4819_REG_51_SHIFT_1050HZ_DETECTION 10 +#define BK4819_REG_51_SHIFT_AUTO_CDCSS_BW 9 +#define BK4819_REG_51_SHIFT_AUTO_CTCSS_BW 8 +#define BK4819_REG_51_SHIFT_CxCSS_TX_GAIN1 0 -#define BK4819_REG_51_MASK_ENABLE_CxCSS (0x01U << BK4819_REG_51_SHIFT_ENABLE_CxCSS) -#define BK4819_REG_51_MASK_GPIO6_PIN2_INPUT (0x01U << BK4819_REG_51_SHIFT_GPIO6_PIN2_INPUT) -#define BK4819_REG_51_MASK_TX_CDCSS_POLARITY (0x01U << BK4819_REG_51_SHIFT_TX_CDCSS_POLARITY) -#define BK4819_REG_51_MASK_CxCSS_MODE (0x01U << BK4819_REG_51_SHIFT_CxCSS_MODE) -#define BK4819_REG_51_MASK_CDCSS_BIT_WIDTH (0x01U << BK4819_REG_51_SHIFT_CDCSS_BIT_WIDTH) -#define BK4819_REG_51_MASK_1050HZ_DETECTION (0x01U << BK4819_REG_51_SHIFT_1050HZ_DETECTION) -#define BK4819_REG_51_MASK_AUTO_CDCSS_BW (0x01U << BK4819_REG_51_SHIFT_AUTO_CDCSS_BW) -#define BK4819_REG_51_MASK_AUTO_CTCSS_BW (0x01U << BK4819_REG_51_SHIFT_AUTO_CTCSS_BW) -#define BK4819_REG_51_MASK_CxCSS_TX_GAIN1 (0x7FU << BK4819_REG_51_SHIFT_CxCSS_TX_GAIN1) +#define BK4819_REG_51_MASK_ENABLE_CxCSS (0x01U << BK4819_REG_51_SHIFT_ENABLE_CxCSS) +#define BK4819_REG_51_MASK_GPIO6_PIN2_INPUT (0x01U << BK4819_REG_51_SHIFT_GPIO6_PIN2_INPUT) +#define BK4819_REG_51_MASK_TX_CDCSS_POLARITY (0x01U << BK4819_REG_51_SHIFT_TX_CDCSS_POLARITY) +#define BK4819_REG_51_MASK_CxCSS_MODE (0x01U << BK4819_REG_51_SHIFT_CxCSS_MODE) +#define BK4819_REG_51_MASK_CDCSS_BIT_WIDTH (0x01U << BK4819_REG_51_SHIFT_CDCSS_BIT_WIDTH) +#define BK4819_REG_51_MASK_1050HZ_DETECTION (0x01U << BK4819_REG_51_SHIFT_1050HZ_DETECTION) +#define BK4819_REG_51_MASK_AUTO_CDCSS_BW (0x01U << BK4819_REG_51_SHIFT_AUTO_CDCSS_BW) +#define BK4819_REG_51_MASK_AUTO_CTCSS_BW (0x01U << BK4819_REG_51_SHIFT_AUTO_CTCSS_BW) +#define BK4819_REG_51_MASK_CxCSS_TX_GAIN1 (0x7FU << BK4819_REG_51_SHIFT_CxCSS_TX_GAIN1) enum { - BK4819_REG_51_ENABLE_CxCSS = (1U << BK4819_REG_51_SHIFT_ENABLE_CxCSS), - BK4819_REG_51_DISABLE_CxCSS = (0U << BK4819_REG_51_SHIFT_ENABLE_CxCSS), + BK4819_REG_51_ENABLE_CxCSS = (1U << BK4819_REG_51_SHIFT_ENABLE_CxCSS), + BK4819_REG_51_DISABLE_CxCSS = (0U << BK4819_REG_51_SHIFT_ENABLE_CxCSS), - BK4819_REG_51_GPIO6_PIN2_INPUT = (1U << BK4819_REG_51_SHIFT_GPIO6_PIN2_INPUT), - BK4819_REG_51_GPIO6_PIN2_NORMAL = (0U << BK4819_REG_51_SHIFT_GPIO6_PIN2_INPUT), + BK4819_REG_51_GPIO6_PIN2_INPUT = (1U << BK4819_REG_51_SHIFT_GPIO6_PIN2_INPUT), + BK4819_REG_51_GPIO6_PIN2_NORMAL = (0U << BK4819_REG_51_SHIFT_GPIO6_PIN2_INPUT), - BK4819_REG_51_TX_CDCSS_NEGATIVE = (1U << BK4819_REG_51_SHIFT_TX_CDCSS_POLARITY), - BK4819_REG_51_TX_CDCSS_POSITIVE = (0U << BK4819_REG_51_SHIFT_TX_CDCSS_POLARITY), + BK4819_REG_51_TX_CDCSS_NEGATIVE = (1U << BK4819_REG_51_SHIFT_TX_CDCSS_POLARITY), + BK4819_REG_51_TX_CDCSS_POSITIVE = (0U << BK4819_REG_51_SHIFT_TX_CDCSS_POLARITY), - BK4819_REG_51_MODE_CTCSS = (1U << BK4819_REG_51_SHIFT_CxCSS_MODE), - BK4819_REG_51_MODE_CDCSS = (0U << BK4819_REG_51_SHIFT_CxCSS_MODE), + BK4819_REG_51_MODE_CTCSS = (1U << BK4819_REG_51_SHIFT_CxCSS_MODE), + BK4819_REG_51_MODE_CDCSS = (0U << BK4819_REG_51_SHIFT_CxCSS_MODE), - BK4819_REG_51_CDCSS_24_BIT = (1U << BK4819_REG_51_SHIFT_CDCSS_BIT_WIDTH), - BK4819_REG_51_CDCSS_23_BIT = (0U << BK4819_REG_51_SHIFT_CDCSS_BIT_WIDTH), + BK4819_REG_51_CDCSS_24_BIT = (1U << BK4819_REG_51_SHIFT_CDCSS_BIT_WIDTH), + BK4819_REG_51_CDCSS_23_BIT = (0U << BK4819_REG_51_SHIFT_CDCSS_BIT_WIDTH), - BK4819_REG_51_1050HZ_DETECTION = (1U << BK4819_REG_51_SHIFT_1050HZ_DETECTION), - BK4819_REG_51_1050HZ_NO_DETECTION = (0U << BK4819_REG_51_SHIFT_1050HZ_DETECTION), + BK4819_REG_51_1050HZ_DETECTION = (1U << BK4819_REG_51_SHIFT_1050HZ_DETECTION), + BK4819_REG_51_1050HZ_NO_DETECTION = (0U << BK4819_REG_51_SHIFT_1050HZ_DETECTION), - BK4819_REG_51_AUTO_CDCSS_BW_DISABLE = (1U << BK4819_REG_51_SHIFT_AUTO_CDCSS_BW), - BK4819_REG_51_AUTO_CDCSS_BW_ENABLE = (0U << BK4819_REG_51_SHIFT_AUTO_CDCSS_BW), + BK4819_REG_51_AUTO_CDCSS_BW_DISABLE = (1U << BK4819_REG_51_SHIFT_AUTO_CDCSS_BW), + BK4819_REG_51_AUTO_CDCSS_BW_ENABLE = (0U << BK4819_REG_51_SHIFT_AUTO_CDCSS_BW), - BK4819_REG_51_AUTO_CTCSS_BW_DISABLE = (1U << BK4819_REG_51_SHIFT_AUTO_CTCSS_BW), - BK4819_REG_51_AUTO_CTCSS_BW_ENABLE = (0U << BK4819_REG_51_SHIFT_AUTO_CTCSS_BW), + BK4819_REG_51_AUTO_CTCSS_BW_DISABLE = (1U << BK4819_REG_51_SHIFT_AUTO_CTCSS_BW), + BK4819_REG_51_AUTO_CTCSS_BW_ENABLE = (0U << BK4819_REG_51_SHIFT_AUTO_CTCSS_BW), }; // REG 70 diff --git a/driver/bk4819.c b/driver/bk4819.c index dae22c8..01f9767 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -604,6 +604,16 @@ void BK4819_TxOn_Beep(void) void BK4819_ExitSubAu(void) { + // REG_51 <15> 0 1 = Enable TxCTCSS/CDCSS 0 = Disable + // REG_51 <14> 0 1 = GPIO0Input for CDCSS 0 = Normal Mode.(for BK4819v3) + // REG_51 <13> 0 1 = Transmit negative CDCSS code 0 = Transmit positive CDCSScode + // REG_51 <12> 0 CTCSS/CDCSS mode selection 1 = CTCSS 0 = CDCSS + // REG_51 <11> 0 CDCSS 24/23bit selection 1 = 24bit 0 = 23bit + // REG_51 <10> 0 1050HzDetectionMode 1 = 1050/4 Detect Enable, CTC1 should be set to 1050/4 Hz + // REG_51 <9> 0 Auto CDCSS Bw Mode 1 = Disable 0 = Enable. + // REG_51 <8> 0 Auto CTCSS Bw Mode 0 = Enable 1 = Disable + // REG_51 <6:0> 0 CTCSS/CDCSS Tx Gain1 Tuning 0 = min 127 = max + BK4819_WriteRegister(BK4819_REG_51, 0x0000); } @@ -853,6 +863,17 @@ void BK4819_EnableFrequencyScan(void) void BK4819_SetScanFrequency(uint32_t Frequency) { BK4819_SetFrequency(Frequency); + + // REG_51 <15> 0 1 = Enable TxCTCSS/CDCSS 0 = Disable + // REG_51 <14> 0 1 = GPIO0 Input for CDCSS 0 = Normal Mode.(for BK4819v3) + // REG_51 <13> 0 1 = Transmit negative CDCSS code 0 = Transmit positive CDCSScode + // REG_51 <12> 0 CTCSS/CDCSS mode selection 1 = CTCSS 0 = CDCSS + // REG_51 <11> 0 CDCSS 24/23bit selection 1 = 24bit 0 = 23bit + // REG_51 <10> 0 1050HzDetectionMode 1 = 1050/4 Detect Enable, CTC1 should be set to 1050/4 Hz + // REG_51 <9> 0 Auto CDCSS Bw Mode 1 = Disable 0 = Enable. + // REG_51 <8> 0 Auto CTCSS Bw Mode 0 = Enable 1 = Disable + // REG_51 <6:0> 0 CTCSS/CDCSS Tx Gain1 Tuning 0 = min 127 = max + BK4819_WriteRegister(BK4819_REG_51, 0 | BK4819_REG_51_DISABLE_CxCSS | BK4819_REG_51_GPIO6_PIN2_NORMAL @@ -862,6 +883,7 @@ void BK4819_SetScanFrequency(uint32_t Frequency) | BK4819_REG_51_1050HZ_NO_DETECTION | BK4819_REG_51_AUTO_CDCSS_BW_DISABLE | BK4819_REG_51_AUTO_CTCSS_BW_DISABLE); + BK4819_RX_TurnOn(); } diff --git a/firmware b/firmware index 6a19631..1f0949c 100644 Binary files a/firmware and b/firmware differ diff --git a/firmware.bin b/firmware.bin index e8faa94..c8a1d20 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index e5bad1b..c27b87d 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/misc.c b/misc.c index 7e3ed9b..8815951 100644 --- a/misc.c +++ b/misc.c @@ -30,6 +30,15 @@ const uint32_t gDefaultAesKey[4] = {0x4AA5CC60, 0x0312CC5F, 0xFFD2DABB, 0x6BB const uint8_t gMicGain_dB2[5] = {3, 8, 16, 24, 31}; +// 10ms count down resolution +const uint16_t dual_watch_count_after_tx = 3600 / 10; // 3.6 sec after TX ends +const uint16_t dual_watch_count_after_rx = 1000 / 10; // 1 sec after RX ends ? +const uint16_t dual_watch_count_after_1 = 5000 / 10; // 5 sec +const uint16_t dual_watch_count_after_2 = 3600 / 10; // 3.6 sec +const uint16_t dual_watch_count_toggle = 100 / 10; // 100ms between VFO toggles +const uint16_t dual_watch_count_noaa = 70 / 10; // 70ms +const uint16_t dual_watch_count_after_vox = 200 / 10; // 200ms + bool gSetting_350TX; bool gSetting_KILLED; bool gSetting_200TX; diff --git a/misc.h b/misc.h index e56abaa..f87ccc3 100644 --- a/misc.h +++ b/misc.h @@ -83,6 +83,14 @@ extern const uint16_t gMin_bat_v; extern const uint8_t gMicGain_dB2[5]; +extern const uint16_t dual_watch_count_after_tx; +extern const uint16_t dual_watch_count_after_rx; +extern const uint16_t dual_watch_count_after_1; +extern const uint16_t dual_watch_count_after_2; +extern const uint16_t dual_watch_count_toggle; +extern const uint16_t dual_watch_count_noaa; +extern const uint16_t dual_watch_count_after_vox; + extern bool gSetting_350TX; extern bool gSetting_KILLED; extern bool gSetting_200TX; diff --git a/radio.c b/radio.c index ce33bab..d7b0b02 100644 --- a/radio.c +++ b/radio.c @@ -799,8 +799,9 @@ void RADIO_PrepareTX(void) { if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) { - gDualWatchCountdown = 360; + gDualWatchCountdown = dual_watch_count_after_tx; gScheduleDualWatch = false; + if (!gRxVfoIsActive) { gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL; diff --git a/scheduler.c b/scheduler.c index 71eee11..bb28bc4 100644 --- a/scheduler.c +++ b/scheduler.c @@ -71,9 +71,8 @@ void SystickHandler(void) DECREMENT_AND_TRIGGER(gBatterySave, gBatterySaveCountdownExpired); if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) - if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT) - if (gCurrentFunction != FUNCTION_RECEIVE) - DECREMENT_AND_TRIGGER(gDualWatchCountdown, gScheduleDualWatch); + if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT && gCurrentFunction != FUNCTION_RECEIVE) + DECREMENT_AND_TRIGGER(gDualWatchCountdown, gScheduleDualWatch); #ifndef DISABLE_NOAA if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH == DUAL_WATCH_OFF)