0
mirror of https://github.com/OneOfEleven/uv-k5-firmware-custom.git synced 2025-06-18 22:29:50 +03:00

fix tx tones

This commit is contained in:
OneOfEleven
2023-11-03 18:41:54 +00:00
parent 474317c149
commit e2e030aed4
16 changed files with 470 additions and 460 deletions

View File

@ -57,7 +57,7 @@ ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1
ENABLE_CONTRAST := 0
ENABLE_BOOT_BEEPS := 0
ENABLE_DTMF_CALL_FLASH_LIGHT := 1
ENABLE_FLASH_LIGHT_SOS_TONE := 0
ENABLE_FLASH_LIGHT_SOS_TONE := 1
ENABLE_SHOW_CHARGE_LEVEL := 0
ENABLE_REVERSE_BAT_SYMBOL := 1
ENABLE_FREQ_SEARCH_TIMEOUT := 0

203
am_fix.c
View File

@ -28,72 +28,72 @@
#include "functions.h"
#include "misc.h"
#ifdef ENABLE_AM_FIX
//#define SET_RSSI_COMP
typedef struct
{
typedef struct
{
uint16_t reg_val;
int8_t gain_dB;
} __attribute__((packed)) t_gain_table;
} __attribute__((packed)) t_gain_table;
// REG_10 AGC gain table
//
// <15:10> ???
//
// <9:8> = LNA Gain Short
// 3 = 0dB < original value
// 2 = -24dB // was -11
// 1 = -30dB // was -16
// 0 = -33dB // was -19
//
// <7:5> = LNA Gain
// 7 = 0dB
// 6 = -2dB
// 5 = -4dB < original value
// 4 = -6dB
// 3 = -9dB
// 2 = -14dB
// 1 = -19dB
// 0 = -24dB
//
// <4:3> = MIXER Gain
// 3 = 0dB < original value
// 2 = -3dB
// 1 = -6dB
// 0 = -8dB
//
// <2:0> = PGA Gain
// 7 = 0dB
// 6 = -3dB < original value
// 5 = -6dB
// 4 = -9dB
// 3 = -15dB
// 2 = -21dB
// 1 = -27dB
// 0 = -33dB
// REG_10 AGC gain table
//
// <15:10> ???
//
// <9:8> = LNA Gain Short
// 3 = 0dB < original value
// 2 = -24dB // was -11
// 1 = -30dB // was -16
// 0 = -33dB // was -19
//
// <7:5> = LNA Gain
// 7 = 0dB
// 6 = -2dB
// 5 = -4dB < original value
// 4 = -6dB
// 3 = -9dB
// 2 = -14dB
// 1 = -19dB
// 0 = -24dB
//
// <4:3> = MIXER Gain
// 3 = 0dB < original value
// 2 = -3dB
// 1 = -6dB
// 0 = -8dB
//
// <2:0> = PGA Gain
// 7 = 0dB
// 6 = -3dB < original value
// 5 = -6dB
// 4 = -9dB
// 3 = -15dB
// 2 = -21dB
// 1 = -27dB
// 0 = -33dB
// front end register dB values
//
// these values need to be accurate for the code to properly/reliably switch
// between table entries when adjusting the front end registers.
//
// these 4 tables need a measuring/calibration update
//
//
// QUESTION: why do I have to surround the negative numbers in brackets ???
// if I don't add the brackets, reading the table returns unexpected/different values !!!
//
//
// front end register dB values
//
// these values need to be accurate for the code to properly/reliably switch
// between table entries when adjusting the front end registers.
//
// these 4 tables need a measuring/calibration update
//
//
// QUESTION: why do I have to surround the negative numbers in brackets ???
// if I don't add the brackets, reading the table returns unexpected/different values !!!
//
//
//// static const int16_t lnas_dB[] = { -19, -16, -11, 0}; // was (but wrong)
// static const int16_t lnas_dB[] = { (-33), (-30), (-24), 0}; // corrected'ish
// static const int16_t lna_dB[] = { (-24), (-19), (-14), ( -9), (-6), (-4), (-2), 0};
// static const int16_t mixer_dB[] = { ( -8), ( -6), ( -3), 0};
// static const int16_t pga_dB[] = { (-33), (-27), (-21), (-15), (-9), (-6), (-3), 0};
// lookup table is hugely easier than writing code to do the same
//
static const t_gain_table gain_table[] =
{
// lookup table is hugely easier than writing code to do the same
//
static const t_gain_table gain_table[] =
{
{0x03BE, -7}, // 3 5 3 6 .. 0dB -4dB 0dB -3dB .. -7dB original
#ifdef ENABLE_AM_FIX_TEST1
@ -105,9 +105,9 @@
{0x015E, -47}, // 2 .. 1 2 3 6 .. -30dB -14dB 0dB -3dB .. -47dB
{0x025E, -41}, // 3 .. 2 2 3 6 .. -24dB -14dB 0dB -3dB .. -41dB
{0x035E, -17} // 4 .. 3 2 3 6 .. 0dB -14dB 0dB -3dB .. -17dB original
};
};
static const unsigned int original_index = 1;
static const unsigned int original_index = 1;
#else
{0x0000, -98}, // 1 .. 0 0 0 0 .. -33dB -24dB -8dB -33dB .. -98dB
@ -206,44 +206,44 @@
{0x03F7, -3}, // 94 .. 3 7 2 7 .. 0dB 0dB -3dB 0dB .. -3dB
{0x03DF, -2}, // 95 .. 3 6 3 7 .. 0dB -2dB 0dB 0dB .. -2dB
{0x03FF, 0}, // 96 .. 3 7 3 7 .. 0dB 0dB 0dB 0dB .. 0dB
};
};
static const unsigned int original_index = 90;
static const unsigned int original_index = 90;
#endif
#ifdef ENABLE_AM_FIX_SHOW_DATA
#ifdef ENABLE_AM_FIX_SHOW_DATA
// display update rate
static const unsigned int display_update_rate = 250 / 10; // max 250ms display update rate
unsigned int display_update_tick = 0;
#endif
#endif
#ifdef ENABLE_AM_FIX_TEST1
#ifdef ENABLE_AM_FIX_TEST1
// user manually sets the table index .. used to calibrate the desired dB gain table
unsigned int gain_table_index[2] = {1 + g_eeprom.config.setting.am_fix_test1, 1 + g_eeprom.config.setting.am_fix_test1};
#else
#else
unsigned int gain_table_index[2] = {original_index, original_index};
#endif
#endif
// used simply to detect a changed gain setting
unsigned int gain_table_index_prev[2] = {0, 0};
// used simply to detect a changed gain setting
unsigned int gain_table_index_prev[2] = {0, 0};
// to help reduce gain hunting, peak hold count down tick
unsigned int hold_counter[2] = {0, 0};
// to help reduce gain hunting, peak hold count down tick
unsigned int hold_counter[2] = {0, 0};
// holds the previous RSSI level .. we do an average of old + new RSSI reading
int16_t prev_rssi[2] = {0, 0};
// holds the previous RSSI level .. we do an average of old + new RSSI reading
int16_t prev_rssi[2] = {0, 0};
// used to correct the RSSI readings after our RF gain adjustments
int16_t rssi_gain_diff[2] = {0, 0};
// used to correct the RSSI readings after our RF gain adjustments
int16_t rssi_gain_diff[2] = {0, 0};
#ifndef ENABLE_AM_FIX_TEST1
#ifndef ENABLE_AM_FIX_TEST1
// -89 dBm, any higher and the AM demodulator starts to saturate/clip/distort
const int16_t desired_rssi = (-89 + 160) * 2;
#endif
#endif
void AM_fix_init(void)
{ // called at boot-up
void AM_fix_init(void)
{ // called at boot-up
unsigned int vfo;
for (vfo = 0; vfo < 2; vfo++)
{
@ -252,12 +252,12 @@
#else
gain_table_index[vfo] = original_index; // re-start with original QS setting
#endif
// AM_fix_reset(vfo);
}
//AM_fix_reset(vfo);
}
}
void AM_fix_reset(const int vfo)
{ // reset the AM fixer upper
void AM_fix_reset(const int vfo)
{ // reset the AM fixer upper
if (vfo < 0 || vfo >= 2)
return;
@ -271,21 +271,21 @@
rssi_gain_diff[vfo] = 0;
gain_table_index_prev[vfo] = 0;
#ifdef ENABLE_AM_FIX_TEST1
// gain_table_index[vfo] = 1 + g_eeprom.config.setting.am_fix_test1;
//gain_table_index[vfo] = 1 + g_eeprom.config.setting.am_fix_test1;
#else
// gain_table_index[vfo] = original_index; // re-start with original QS setting
//gain_table_index[vfo] = original_index; // re-start with original QS setting
#endif
}
}
// adjust the RX gain to try and prevent the AM demodulator from
// saturating (distorted AM audio)
//
// we're actually doing the BK4819's job for it here, but as the chip
// won't/don't do it for itself, we're left to bodging it ourself by
// playing with the RF front end gain setting
//
void AM_fix_10ms(const int vfo)
{
// adjust the RX gain to try and prevent the AM demodulator from
// saturating (distorted AM audio)
//
// we're actually doing the BK4819's job for it here, but as the chip
// won't/don't do it for itself, we're left to bodging it ourself by
// playing with the RF front end gain setting
//
void AM_fix_10ms(const int vfo)
{
int16_t diff_dB;
int16_t rssi;
@ -328,9 +328,14 @@
#ifdef ENABLE_AM_FIX_SHOW_DATA
{
const int16_t new_rssi = rssi - rssi_gain_diff[vfo];
const uint16_t new_glitch = BK4819_GetGlitchIndicator();
const uint16_t new_noise = BK4819_GetExNoiceIndicator();
if (g_current_rssi[vfo] != new_rssi)
{
g_current_rssi[vfo] = new_rssi;
g_current_glitch[vfo] = new_glitch;
g_current_noise[vfo] = new_noise;
if (display_update_tick == 0)
{ // trigger a display update
@ -387,9 +392,9 @@
else
{ // incrementally reduce the gain .. taking it slow improves noise/spike immunity
// if (index >= (1 + 3) && diff_dB >= 3)
// index -= 3; // faster gain reduction
// else
//if (index >= (1 + 3) && diff_dB >= 3)
// index -= 3; // faster gain reduction
//else
if (index > 1)
index--; // slow step-by-step gain reduction
}
@ -426,8 +431,10 @@
// offset the RSSI reading to the rest of the firmware to cancel out the gain adjustments we make
#ifdef SET_RSSI_COMP
// RF gain difference from original QS setting
rssi_gain_diff[vfo] = ((int16_t)gain_table[index].gain_dB - gain_table[original_index].gain_dB) * 2;
#endif
}
// save the corrected RSSI level
@ -440,9 +447,9 @@
g_update_display = true;
}
#endif
}
}
#ifdef ENABLE_AM_FIX_SHOW_DATA
#ifdef ENABLE_AM_FIX_SHOW_DATA
void AM_fix_print_data(const int vfo, char *s)
{
@ -458,6 +465,4 @@
}
}
#endif
#endif

View File

@ -16,20 +16,18 @@
*/
#ifndef AM_FIXH
#define AM_FIXH
#include <stdint.h>
#include <stdbool.h>
#ifdef ENABLE_AM_FIX
extern int16_t rssi_gain_diff[2];
extern int16_t rssi_gain_diff[2];
void AM_fix_init(void);
void AM_fix_reset(const int vfo);
void AM_fix_10ms(const int vfo);
#ifdef ENABLE_AM_FIX_SHOW_DATA
void AM_fix_init(void);
void AM_fix_reset(const int vfo);
void AM_fix_10ms(const int vfo);
#ifdef ENABLE_AM_FIX_SHOW_DATA
void AM_fix_print_data(const int vfo, char *s);
#endif
#endif
#endif

View File

@ -83,6 +83,8 @@ static void APP_process_key(const key_code_t Key, const bool key_pressed, const
static void APP_update_rssi(const int vfo)
{
int16_t rssi = BK4819_GetRSSI();
uint8_t glitch = BK4819_GetGlitchIndicator();
uint8_t noise = BK4819_GetExNoiceIndicator();
#ifdef ENABLE_AM_FIX
// add RF gain adjust compensation
@ -94,8 +96,10 @@ static void APP_update_rssi(const int vfo)
return; // no change
g_current_rssi[vfo] = rssi;
g_current_glitch[vfo] = glitch;
g_current_noise[vfo] = noise;
UI_update_rssi(rssi, vfo);
UI_update_rssi(rssi, glitch, noise, vfo);
}
static void APP_check_for_new_receive(void)
@ -1560,7 +1564,7 @@ void APP_process_flash_light_10ms(void)
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
#ifdef ENABLE_FLASH_LIGHT_SOS_TONE
if (!g_squelch_open && !g_monitor_enabled && !GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER))
BK4819_StartTone1(880, 50);
BK4819_StartTone1(880, 50, g_current_function == FUNCTION_TRANSMIT);
#endif
}
}

View File

@ -819,6 +819,7 @@ void MAIN_Key_STAR(bool key_pressed, bool key_held)
if (g_scan_state_dir != SCAN_STATE_DIR_OFF)
{ // RF scanning
#ifdef ENABLE_SCAN_IGNORE_LIST
if (scanning_paused())
{
FI_add_freq_ignored(g_rx_vfo->freq_config_rx.frequency);
@ -830,6 +831,7 @@ void MAIN_Key_STAR(bool key_pressed, bool key_held)
g_rx_reception_mode = RX_MODE_NONE;
FUNCTION_Select(FUNCTION_FOREGROUND);
}
#endif
return;
}

View File

@ -173,7 +173,7 @@ void AUDIO_PlayBeep(beep_type_t Beep)
}
// BK4819_PlayTone(ToneFrequency, true);
BK4819_StartTone1(ToneFrequency, 96);
BK4819_StartTone1(ToneFrequency, 96, false);
SYSTEM_DelayMs(2);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER);

View File

@ -881,7 +881,7 @@ void BK4819_EnableDTMF(void)
(15u << BK4819_REG_24_SHIFT_MAX_SYMBOLS)); // 0 ~ 15
}
void BK4819_StartTone1(const uint16_t frequency, const unsigned int level)
void BK4819_StartTone1(const uint16_t frequency, const unsigned int level, const bool tx)
{
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER);
SYSTEM_DelayMs(2);
@ -895,12 +895,16 @@ void BK4819_StartTone1(const uint16_t frequency, const unsigned int level)
BK4819_WriteRegister(0x70, BK4819_REG_70_ENABLE_TONE1 | ((level & 0x7f) << BK4819_REG_70_SHIFT_TONE1_TUNING_GAIN));
BK4819_WriteRegister(0x30, 0);
#if 1
if (!tx)
{
BK4819_WriteRegister(0x30,
BK4819_REG_30_ENABLE_AF_DAC |
BK4819_REG_30_ENABLE_DISC_MODE |
BK4819_REG_30_ENABLE_TX_DSP);
#else
}
else
{
BK4819_WriteRegister(0x30,
BK4819_REG_30_ENABLE_VCO_CALIB |
BK4819_REG_30_ENABLE_UNKNOWN |
@ -913,13 +917,14 @@ void BK4819_StartTone1(const uint16_t frequency, const unsigned int level)
BK4819_REG_30_ENABLE_TX_DSP | //
// BK4819_REG_30_ENABLE_RX_DSP |
0);
#endif
}
BK4819_WriteRegister(0x71, scale_freq(frequency));
BK4819_ExitTxMute();
SYSTEM_DelayMs(2);
if (!tx)
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER);
}
@ -978,7 +983,7 @@ void BK4819_StopTones(const bool tx)
void BK4819_PlayTone(const unsigned int tone_Hz, const unsigned int delay, const unsigned int level)
{
const uint16_t prev_af = BK4819_ReadRegister(0x47);
BK4819_StartTone1(tone_Hz, level);
BK4819_StartTone1(tone_Hz, level, g_current_function == FUNCTION_TRANSMIT);
SYSTEM_DelayMs(delay - 2);
BK4819_StopTones(g_current_function == FUNCTION_TRANSMIT);
BK4819_WriteRegister(0x47, prev_af);
@ -996,9 +1001,9 @@ void BK4819_PlayRoger(void)
#endif
const uint16_t prev_af = BK4819_ReadRegister(0x47);
BK4819_StartTone1(tone1_Hz, 96);
BK4819_StartTone1(tone1_Hz, 96, true);
SYSTEM_DelayMs(80 - 2);
BK4819_StartTone1(tone2_Hz, 96);
BK4819_StartTone1(tone2_Hz, 96, true);
SYSTEM_DelayMs(80);
BK4819_StopTones(true);
BK4819_WriteRegister(0x47, prev_af);

View File

@ -103,7 +103,7 @@ void BK4819_SetCompander(const unsigned int mode);
void BK4819_DisableVox(void);
void BK4819_DisableDTMF(void);
void BK4819_EnableDTMF(void);
void BK4819_StartTone1(const uint16_t frequency, const unsigned int level);
void BK4819_StartTone1(const uint16_t frequency, const unsigned int level, const bool tx);
void BK4819_StopTones(const bool tx);
void BK4819_PlayTone(const unsigned int tone_Hz, const unsigned int delay, const unsigned int level);
void BK4819_EnterTxMute(void);

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
#include "misc.h"
// a list of frequencies to ignore/skip when scanning
uint32_t ignore_frequencies[256];
uint32_t ignore_frequencies[64];
int ignore_frequencies_count = 0;
void FI_clear_freq_ignored(void)

View File

@ -220,7 +220,7 @@ void FUNCTION_Select(function_type_t Function)
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER);
SYSTEM_DelayMs(2);
BK4819_StartTone1(500, 28);
BK4819_StartTone1(500, 28, g_current_function == FUNCTION_TRANSMIT);
SYSTEM_DelayMs(2);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER);

4
misc.c
View File

@ -234,7 +234,9 @@ volatile bool g_flag_tail_tone_elimination_complete;
volatile uint16_t g_boot_tick_10ms = 4000 / 10; // 4 seconds
int16_t g_current_rssi[2] = {0, 0}; // now one per VFO
int16_t g_current_rssi[2] = {0, 0};
uint16_t g_current_glitch[2] = {0, 0};
uint16_t g_current_noise[2] = {0, 0};
uint8_t g_mic_sensitivity_tuning;

6
misc.h
View File

@ -321,7 +321,11 @@ extern volatile bool g_next_time_slice_40ms;
extern volatile bool g_schedule_noaa;
#endif
extern volatile bool g_flag_tail_tone_elimination_complete;
extern int16_t g_current_rssi[2]; // now one per VFO
extern int16_t g_current_rssi[2];
extern uint16_t g_current_glitch[2];
extern uint16_t g_current_noise[2];
extern volatile uint16_t g_boot_tick_10ms;
extern uint8_t g_mic_sensitivity_tuning;

View File

@ -55,27 +55,13 @@ void draw_bar(uint8_t *line, const int len, const int max_width)
for (i = 0; i < max_width; i += 2)
line[i] = (i <= len) ? 0x7f : 0x41;
#else
// segmented bar
for (i = 0; i < max_width; i += 4)
{
for (int k = i - 4; k < i && k < len; k++)
{
if (k >= 0)
// line[k] = (k < (i - 1)) ? 0x7f : 0x00;
if (k < (i - 1))
line[k] = 0x7f;
// line[k] = 0x3e;
}
}
#if 0
// top/bottom lines
for (i = 0; i < len; i += 2)
line[i] |= 0x41;
for (i &= ~3u ; i < max_width; i += 4)
line[i] = 0x41;
#endif
#endif
}
@ -179,10 +165,14 @@ void UI_drawBars(uint8_t *p, const unsigned int level)
#endif
#ifdef ENABLE_RX_SIGNAL_BAR
bool UI_DisplayRSSIBar(const int16_t rssi, const bool now)
bool UI_DisplayRSSIBar(const int16_t rssi, const int16_t glitch, const int16_t noise, const bool now)
{
if (g_eeprom.config.setting.enable_rssi_bar)
{
(void)glitch; // TODO:
(void)noise;
// const int16_t s0_dBm = -127; // S0 .. base level
const int16_t s0_dBm = -147; // S0 .. base level
@ -245,14 +235,14 @@ void UI_drawBars(uint8_t *p, const unsigned int level)
}
#endif
void UI_update_rssi(const int16_t rssi, const int vfo)
void UI_update_rssi(const int16_t rssi, const int16_t glitch, const int16_t noise, const int vfo)
{
#ifdef ENABLE_RX_SIGNAL_BAR
if (g_center_line == CENTER_LINE_RSSI)
{ // optional larger RSSI dBm, S-point and bar level
//if (g_current_function == FUNCTION_RECEIVE && g_squelch_open)
if (g_current_function == FUNCTION_RECEIVE)
UI_DisplayRSSIBar(rssi, true);
UI_DisplayRSSIBar(rssi, glitch, noise, true);
}
#endif
@ -921,7 +911,7 @@ void UI_DisplayMain(void)
if (rx && g_eeprom.config.setting.enable_rssi_bar)
{
g_center_line = CENTER_LINE_RSSI;
UI_DisplayRSSIBar(g_current_rssi[g_rx_vfo_num], false);
UI_DisplayRSSIBar(g_current_rssi[g_rx_vfo_num], g_current_glitch[g_rx_vfo_num], g_current_noise[g_rx_vfo_num], false);
}
else
#endif

View File

@ -34,7 +34,7 @@ extern center_line_t g_center_line;
#ifdef ENABLE_TX_AUDIO_BAR
bool UI_DisplayAudioBar(const bool now);
#endif
void UI_update_rssi(const int16_t rssi, const int vfo);
void UI_update_rssi(const int16_t rssi, const int16_t glitch, const int16_t noise, const int vfo);
void UI_DisplayMain(void);
#endif