kopia lustrzana https://github.com/UU5JPP/Wolf-LITE
test
rodzic
b7b56f8392
commit
941560ae27
Plik diff jest za duży
Load Diff
|
@ -5,21 +5,20 @@
|
|||
|
||||
//Private variables
|
||||
static float32_t AGC_RX_need_gain_db = 0.0f;
|
||||
static float32_t AGC_TX_need_gain_db = 0.0f;
|
||||
static float32_t AGC_RX_need_gain_db_old = 0.0f;
|
||||
static float32_t AGC_TX_need_gain_db_old = 0.0f;
|
||||
static float32_t AGC_RX_agcBuffer_kw[AUDIO_BUFFER_HALF_SIZE] = {0};
|
||||
IRAM2 static float32_t AGC_RX_ringbuffer[AGC_RINGBUFFER_TAPS_SIZE * AUDIO_BUFFER_HALF_SIZE] = {0};
|
||||
static float32_t AGC_TX_ringbuffer_i[AGC_RINGBUFFER_TAPS_SIZE * AUDIO_BUFFER_HALF_SIZE] = {0};
|
||||
|
||||
//Run AGC on data block
|
||||
void DoRxAGC(float32_t *agcBuffer, uint_fast16_t blockSize, uint_fast8_t mode)
|
||||
{
|
||||
//RX1 or RX2
|
||||
float32_t *AGC_need_gain_db = &AGC_RX_need_gain_db;
|
||||
float32_t *AGC_need_gain_db_old = &AGC_RX_need_gain_db_old;
|
||||
float32_t *agc_ringbuffer = (float32_t*)&AGC_RX_ringbuffer;
|
||||
|
||||
//higher speed in settings - higher speed of AGC processing
|
||||
float32_t RX_AGC_STEPSIZE_UP = 0.0f;
|
||||
float32_t RX_AGC_STEPSIZE_DOWN = 0.0f;
|
||||
if(mode == TRX_MODE_CW_L || mode == TRX_MODE_CW_U)
|
||||
if (mode == TRX_MODE_CW_L || mode == TRX_MODE_CW_U)
|
||||
{
|
||||
RX_AGC_STEPSIZE_UP = 200.0f / (float32_t)TRX.RX_AGC_CW_speed;
|
||||
RX_AGC_STEPSIZE_DOWN = 20.0f / (float32_t)TRX.RX_AGC_CW_speed;
|
||||
|
@ -30,38 +29,42 @@ void DoRxAGC(float32_t *agcBuffer, uint_fast16_t blockSize, uint_fast8_t mode)
|
|||
RX_AGC_STEPSIZE_DOWN = 20.0f / (float32_t)TRX.RX_AGC_SSB_speed;
|
||||
}
|
||||
|
||||
//do k-weighting (for LKFS)
|
||||
arm_biquad_cascade_df2T_f32(&AGC_RX_KW_HSHELF_FILTER, agcBuffer, AGC_RX_agcBuffer_kw, blockSize);
|
||||
arm_biquad_cascade_df2T_f32(&AGC_RX_KW_HPASS_FILTER, agcBuffer, AGC_RX_agcBuffer_kw, blockSize);
|
||||
|
||||
//do ring buffer
|
||||
static uint32_t ring_position = 0;
|
||||
//save new data to ring buffer
|
||||
memcpy(&agc_ringbuffer[ring_position * blockSize], agcBuffer, sizeof(float32_t) * blockSize);
|
||||
memcpy(&AGC_RX_ringbuffer[ring_position * blockSize], agcBuffer, sizeof(float32_t) * blockSize);
|
||||
//move ring buffer index
|
||||
ring_position++;
|
||||
if(ring_position >= AGC_RINGBUFFER_TAPS_SIZE)
|
||||
ring_position++;
|
||||
if (ring_position >= AGC_RINGBUFFER_TAPS_SIZE)
|
||||
ring_position = 0;
|
||||
//get old data to process
|
||||
memcpy(agcBuffer, &agc_ringbuffer[ring_position * blockSize], sizeof(float32_t) * blockSize);
|
||||
|
||||
memcpy(agcBuffer, &AGC_RX_ringbuffer[ring_position * blockSize], sizeof(float32_t) * blockSize);
|
||||
|
||||
//calculate the magnitude in dBFS
|
||||
float32_t AGC_RX_magnitude = 0;
|
||||
arm_rms_f32(agcBuffer, blockSize, &AGC_RX_magnitude);
|
||||
arm_rms_f32(AGC_RX_agcBuffer_kw, blockSize, &AGC_RX_magnitude);
|
||||
if (AGC_RX_magnitude == 0.0f)
|
||||
AGC_RX_magnitude = 0.001f;
|
||||
float32_t full_scale_rate = AGC_RX_magnitude / FLOAT_FULL_SCALE_POW;
|
||||
float32_t AGC_RX_dbFS = rate2dbV(full_scale_rate);
|
||||
|
||||
//move the gain one step
|
||||
if(!WM8731_Muting)
|
||||
if (!WM8731_Muting)
|
||||
{
|
||||
float32_t diff = ((float32_t)TRX.AGC_GAIN_TARGET - (AGC_RX_dbFS + *AGC_need_gain_db));
|
||||
float32_t diff = ((float32_t)TRX.AGC_GAIN_TARGET - (AGC_RX_dbFS + AGC_RX_need_gain_db));
|
||||
if (diff > 0)
|
||||
*AGC_need_gain_db += diff / RX_AGC_STEPSIZE_UP;
|
||||
AGC_RX_need_gain_db += diff / RX_AGC_STEPSIZE_UP;
|
||||
else
|
||||
*AGC_need_gain_db += diff / RX_AGC_STEPSIZE_DOWN;
|
||||
AGC_RX_need_gain_db += diff / RX_AGC_STEPSIZE_DOWN;
|
||||
|
||||
//overload (clipping), sharply reduce the gain
|
||||
if ((AGC_RX_dbFS + *AGC_need_gain_db) > ((float32_t)TRX.AGC_GAIN_TARGET + AGC_CLIPPING))
|
||||
if ((AGC_RX_dbFS + AGC_RX_need_gain_db) > ((float32_t)TRX.AGC_GAIN_TARGET + AGC_CLIPPING))
|
||||
{
|
||||
*AGC_need_gain_db = (float32_t)TRX.AGC_GAIN_TARGET - AGC_RX_dbFS;
|
||||
AGC_RX_need_gain_db = (float32_t)TRX.AGC_GAIN_TARGET - AGC_RX_dbFS;
|
||||
//sendToDebug_float32(diff,false);
|
||||
}
|
||||
}
|
||||
|
@ -72,16 +75,142 @@ void DoRxAGC(float32_t *agcBuffer, uint_fast16_t blockSize, uint_fast8_t mode)
|
|||
|
||||
//AGC off, not adjustable
|
||||
if (!CurrentVFO()->AGC)
|
||||
*AGC_need_gain_db = 1.0f;
|
||||
|
||||
AGC_RX_need_gain_db = 1.0f;
|
||||
|
||||
//Muting if need
|
||||
if(WM8731_Muting)
|
||||
if (WM8731_Muting)
|
||||
AGC_RX_need_gain_db = -200.0f;
|
||||
|
||||
//gain limitation
|
||||
if (AGC_RX_need_gain_db > AGC_MAX_GAIN)
|
||||
AGC_RX_need_gain_db = AGC_MAX_GAIN;
|
||||
|
||||
//apply gain
|
||||
//sendToDebug_float32(AGC_RX_need_gain_db, false);
|
||||
if (fabsf(AGC_RX_need_gain_db_old - AGC_RX_need_gain_db) > 0.0f) //gain changed
|
||||
{
|
||||
float32_t gainApplyStep = 0;
|
||||
if (AGC_RX_need_gain_db_old > AGC_RX_need_gain_db)
|
||||
gainApplyStep = -(AGC_RX_need_gain_db_old - AGC_RX_need_gain_db) / (float32_t)blockSize;
|
||||
if (AGC_RX_need_gain_db_old < AGC_RX_need_gain_db)
|
||||
gainApplyStep = (AGC_RX_need_gain_db - AGC_RX_need_gain_db_old) / (float32_t)blockSize;
|
||||
float32_t val_prev = 0.0f;
|
||||
bool zero_cross = false;
|
||||
for (uint_fast16_t i = 0; i < blockSize; i++)
|
||||
{
|
||||
if (val_prev < 0.0f && agcBuffer[i] > 0.0f)
|
||||
zero_cross = true;
|
||||
else if (val_prev > 0.0f && agcBuffer[i] < 0.0f)
|
||||
zero_cross = true;
|
||||
if (zero_cross)
|
||||
AGC_RX_need_gain_db_old += gainApplyStep;
|
||||
|
||||
agcBuffer[i] = agcBuffer[i] * db2rateV(AGC_RX_need_gain_db_old);
|
||||
val_prev = agcBuffer[i];
|
||||
}
|
||||
}
|
||||
else //gain did not change, apply gain across all samples
|
||||
{
|
||||
arm_scale_f32(agcBuffer, db2rateV(AGC_RX_need_gain_db), agcBuffer, blockSize);
|
||||
}
|
||||
}
|
||||
|
||||
//Run TX AGC on data block
|
||||
void DoTxAGC(float32_t *agcBuffer_i, uint_fast16_t blockSize, float32_t target, uint_fast8_t mode)
|
||||
{
|
||||
float32_t *AGC_need_gain_db = &AGC_TX_need_gain_db;
|
||||
float32_t *AGC_need_gain_db_old = &AGC_TX_need_gain_db_old;
|
||||
float32_t *agc_ringbuffer_i = (float32_t *)&AGC_TX_ringbuffer_i;
|
||||
|
||||
//higher speed in settings - higher speed of AGC processing
|
||||
float32_t TX_AGC_STEPSIZE_UP = 0.0f;
|
||||
float32_t TX_AGC_STEPSIZE_DOWN = 0.0f;
|
||||
switch(mode)
|
||||
{
|
||||
case TRX_MODE_LSB:
|
||||
case TRX_MODE_USB:
|
||||
case TRX_MODE_LOOPBACK:
|
||||
default:
|
||||
TX_AGC_STEPSIZE_UP = 200.0f / 3.0f; //TX_Compressor_speed_SSB
|
||||
TX_AGC_STEPSIZE_DOWN = 20.0f / 3.0f; //TX_Compressor_speed_SSB
|
||||
break;
|
||||
|
||||
case TRX_MODE_NFM:
|
||||
case TRX_MODE_WFM:
|
||||
case TRX_MODE_AM:
|
||||
TX_AGC_STEPSIZE_UP = 200.0f / 3.0f; //TX_Compressor_speed_AMFM
|
||||
TX_AGC_STEPSIZE_DOWN = 20.0f / 3.0f; //TX_Compressor_speed_AMFM
|
||||
break;
|
||||
}
|
||||
|
||||
//do ring buffer
|
||||
static uint32_t ring_position = 0;
|
||||
//save new data to ring buffer
|
||||
memcpy(&agc_ringbuffer_i[ring_position * blockSize], agcBuffer_i, sizeof(float32_t) * blockSize);
|
||||
//move ring buffer index
|
||||
ring_position++;
|
||||
if (ring_position >= AGC_RINGBUFFER_TAPS_SIZE)
|
||||
ring_position = 0;
|
||||
//get old data to process
|
||||
memcpy(agcBuffer_i, &agc_ringbuffer_i[ring_position * blockSize], sizeof(float32_t) * blockSize);
|
||||
|
||||
//calculate the magnitude
|
||||
float32_t AGC_TX_I_magnitude = 0;
|
||||
float32_t ampl_max_i = 0.0f;
|
||||
float32_t ampl_min_i = 0.0f;
|
||||
uint32_t tmp_index;
|
||||
arm_max_no_idx_f32(agcBuffer_i, blockSize, &l_max_i);
|
||||
arm_min_f32(agcBuffer_i, blockSize, &l_min_i, &tmp_index);
|
||||
if (ampl_max_i > -ampl_min_i)
|
||||
AGC_TX_I_magnitude = ampl_max_i;
|
||||
else
|
||||
AGC_TX_I_magnitude = -ampl_min_i;
|
||||
|
||||
if (AGC_TX_I_magnitude == 0.0f)
|
||||
AGC_TX_I_magnitude = 0.001f;
|
||||
float32_t AGC_TX_dbFS = rate2dbV(AGC_TX_I_magnitude);
|
||||
|
||||
//move the gain one step
|
||||
float32_t diff = (target - (AGC_TX_dbFS + *AGC_need_gain_db));
|
||||
if (diff > 0)
|
||||
*AGC_need_gain_db += diff / TX_AGC_STEPSIZE_UP;
|
||||
else
|
||||
*AGC_need_gain_db += diff / TX_AGC_STEPSIZE_DOWN;
|
||||
|
||||
//overload (clipping), sharply reduce the gain
|
||||
if ((AGC_TX_dbFS + *AGC_need_gain_db) > target)
|
||||
{
|
||||
*AGC_need_gain_db = target - AGC_TX_dbFS;
|
||||
//sendToDebug_float32(diff,false);
|
||||
}
|
||||
|
||||
//noise threshold, below it - do not amplify
|
||||
/*if (AGC_RX_dbFS < AGC_NOISE_GATE)
|
||||
*AGC_need_gain_db = 1.0f;*/
|
||||
|
||||
//Muting if need
|
||||
if (target == 0.0f)
|
||||
*AGC_need_gain_db = -200.0f;
|
||||
|
||||
//gain limitation
|
||||
if (*AGC_need_gain_db > AGC_MAX_GAIN)
|
||||
*AGC_need_gain_db = AGC_MAX_GAIN;
|
||||
|
||||
switch(mode)
|
||||
{
|
||||
case TRX_MODE_LSB:
|
||||
case TRX_MODE_USB:
|
||||
case TRX_MODE_LOOPBACK:
|
||||
default:
|
||||
if (*AGC_need_gain_db > 10.0f) //TX_Compressor_maxgain_SSB
|
||||
*AGC_need_gain_db = 10.0f; //TX_Compressor_maxgain_SSB
|
||||
break;
|
||||
|
||||
case TRX_MODE_NFM:
|
||||
case TRX_MODE_WFM:
|
||||
case TRX_MODE_AM:
|
||||
if (*AGC_need_gain_db > 10.0f) //TX_Compressor_maxgain_AMFM
|
||||
*AGC_need_gain_db = 10.0f; //TX_Compressor_maxgain_AMFM
|
||||
break;
|
||||
}
|
||||
|
||||
//apply gain
|
||||
if (fabsf(*AGC_need_gain_db_old - *AGC_need_gain_db) > 0.0f) //gain changed
|
||||
{
|
||||
|
@ -94,20 +223,20 @@ void DoRxAGC(float32_t *agcBuffer, uint_fast16_t blockSize, uint_fast8_t mode)
|
|||
bool zero_cross = false;
|
||||
for (uint_fast16_t i = 0; i < blockSize; i++)
|
||||
{
|
||||
if(val_prev < 0.0f && agcBuffer[i] > 0.0f)
|
||||
if (val_prev < 0.0f && agcBuffer_i[i] > 0.0f)
|
||||
zero_cross = true;
|
||||
else if(val_prev > 0.0f && agcBuffer[i] < 0.0f)
|
||||
else if (val_prev > 0.0f && agcBuffer_i[i] < 0.0f)
|
||||
zero_cross = true;
|
||||
if(zero_cross)
|
||||
if (zero_cross)
|
||||
*AGC_need_gain_db_old += gainApplyStep;
|
||||
|
||||
agcBuffer[i] = agcBuffer[i] * db2rateV(*AGC_need_gain_db_old);
|
||||
val_prev = agcBuffer[i];
|
||||
|
||||
agcBuffer_i[i] = agcBuffer_i[i] * db2rateV(*AGC_need_gain_db_old);
|
||||
val_prev = agcBuffer_i[i];
|
||||
}
|
||||
}
|
||||
else //gain did not change, apply gain across all samples
|
||||
{
|
||||
arm_scale_f32(agcBuffer, db2rateV(*AGC_need_gain_db), agcBuffer, blockSize);
|
||||
arm_scale_f32(agcBuffer_i, db2rateV(*AGC_need_gain_db), agcBuffer_i, blockSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
#define AGC_RINGBUFFER_TAPS_SIZE 3
|
||||
|
||||
//Public methods
|
||||
extern void DoRxAGC(float32_t *agcbuffer, uint_fast16_t blockSize, uint_fast8_t mode); // start AGC on a data block
|
||||
extern void DoRxAGC(float32_t *agcbuffer, uint_fast16_t blockSize, uint_fast8_t mode); // start RX AGC on a data block
|
||||
extern void DoTxAGC(float32_t *agcbuffer_i, uint_fast16_t blockSize, float32_t target, uint_fast8_t mode); // start TX AGC on a data block
|
||||
extern void ResetAGC(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -35,6 +35,10 @@ static float32_t EQ_MIC_HIG_FILTER_State[2 * EQ_STAGES] = {0};
|
|||
static float32_t EQ_MIC_LOW_FILTER_Coeffs[BIQUAD_COEFF_IN_STAGE * EQ_STAGES] = {0};
|
||||
static float32_t EQ_MIC_MID_FILTER_Coeffs[BIQUAD_COEFF_IN_STAGE * EQ_STAGES] = {0};
|
||||
static float32_t EQ_MIC_HIG_FILTER_Coeffs[BIQUAD_COEFF_IN_STAGE * EQ_STAGES] = {0};
|
||||
static float32_t AGC_RX_KW_HSHELF_FILTER_State[2 * EQ_STAGES] = {0};
|
||||
static float32_t AGC_RX_KW_HPASS_FILTER_State[2 * EQ_STAGES] = {0};
|
||||
static float32_t AGC_RX_KW_HSHELF_FILTER_Coeffs[BIQUAD_COEFF_IN_STAGE * EQ_STAGES] = {0};
|
||||
static float32_t AGC_RX_KW_HPASS_FILTER_Coeffs[BIQUAD_COEFF_IN_STAGE * EQ_STAGES] = {0};
|
||||
|
||||
static DC_filter_state_type DC_Filter_State[8] = {0}; // states of the DC corrector
|
||||
|
||||
|
@ -491,6 +495,8 @@ arm_biquad_cascade_df2T_instance_f32 EQ_RX_HIG_FILTER = {EQ_STAGES, EQ_RX_HIG_FI
|
|||
arm_biquad_cascade_df2T_instance_f32 EQ_MIC_LOW_FILTER = {EQ_STAGES, EQ_MIC_LOW_FILTER_State, EQ_MIC_LOW_FILTER_Coeffs};
|
||||
arm_biquad_cascade_df2T_instance_f32 EQ_MIC_MID_FILTER = {EQ_STAGES, EQ_MIC_MID_FILTER_State, EQ_MIC_MID_FILTER_Coeffs};
|
||||
arm_biquad_cascade_df2T_instance_f32 EQ_MIC_HIG_FILTER = {EQ_STAGES, EQ_MIC_HIG_FILTER_State, EQ_MIC_HIG_FILTER_Coeffs};
|
||||
arm_biquad_cascade_df2T_instance_f32 AGC_RX_KW_HSHELF_FILTER = {EQ_STAGES, AGC_RX_KW_HSHELF_FILTER_State, AGC_RX_KW_HSHELF_FILTER_Coeffs};
|
||||
arm_biquad_cascade_df2T_instance_f32 AGC_RX_KW_HPASS_FILTER = {EQ_STAGES, AGC_RX_KW_HPASS_FILTER_State, AGC_RX_KW_HPASS_FILTER_Coeffs};
|
||||
volatile bool NeedReinitNotch = false; // need to re-initialize the manual Notch filter
|
||||
volatile bool NeedReinitAudioFilters = false; // need to re-initialize Audio filters
|
||||
volatile bool NeedReinitAudioFiltersClean = false; //also clean state
|
||||
|
@ -509,6 +515,10 @@ void InitAudioFilters(void)
|
|||
arm_fir_init_f32(&FIR_TX_Hilbert_I, IQ_HILBERT_TAPS, (float32_t *)&FIR_HILB_I_coeffs, (float32_t *)&Fir_Tx_Hilbert_State_I[0], AUDIO_BUFFER_HALF_SIZE);
|
||||
arm_fir_init_f32(&FIR_TX_Hilbert_Q, IQ_HILBERT_TAPS, (float32_t *)&FIR_HILB_Q_coeffs, (float32_t *)&Fir_Tx_Hilbert_State_Q[0], AUDIO_BUFFER_HALF_SIZE);
|
||||
|
||||
//AGC K-Weight LKFS BS.1770
|
||||
calcBiquad(BIQUAD_highShelf, 1500, TRX_SAMPLERATE, 1.0f / sqrtf(2), 4.0f, AGC_RX_KW_HSHELF_FILTER_Coeffs);
|
||||
calcBiquad(BIQUAD_highpass, 38, TRX_SAMPLERATE, 0.5f, 0.0f, AGC_RX_KW_HPASS_FILTER_Coeffs);
|
||||
|
||||
//Other
|
||||
InitAutoNotchReduction();
|
||||
ReinitAudioFilters();
|
||||
|
|
|
@ -101,6 +101,8 @@ extern arm_biquad_cascade_df2T_instance_f32 EQ_RX_HIG_FILTER;
|
|||
extern arm_biquad_cascade_df2T_instance_f32 EQ_MIC_LOW_FILTER;
|
||||
extern arm_biquad_cascade_df2T_instance_f32 EQ_MIC_MID_FILTER;
|
||||
extern arm_biquad_cascade_df2T_instance_f32 EQ_MIC_HIG_FILTER;
|
||||
extern arm_biquad_cascade_df2T_instance_f32 AGC_RX_KW_HSHELF_FILTER;
|
||||
extern arm_biquad_cascade_df2T_instance_f32 AGC_RX_KW_HPASS_FILTER;
|
||||
extern volatile bool NeedReinitAudioFilters; // need to reinitialize the Audio filters
|
||||
|
||||
//Public methods
|
||||
|
|
|
@ -199,7 +199,7 @@ void processRxAudio(void)
|
|||
if (current_vfo->Mode == TRX_MODE_IQ)
|
||||
arm_float_to_q31(&FPGA_Audio_Buffer_RX_Q_tmp[i], &Processor_AudioBuffer_current[i * 2 + 1], 1); //right channel
|
||||
else
|
||||
arm_float_to_q31(&FPGA_Audio_Buffer_RX_I_tmp[i], &Processor_AudioBuffer_current[i * 2 + 1], 1); //right channel
|
||||
Processor_AudioBuffer_current[i * 2 + 1] = Processor_AudioBuffer_current[i * 2]; //right channel
|
||||
}
|
||||
if (Processor_AudioBuffer_ReadyBuffer == 0)
|
||||
Processor_AudioBuffer_ReadyBuffer = 1;
|
||||
|
|
|
@ -67,7 +67,7 @@ static const STRUCT_COLOR_THEME COLOR_THEMES[2] = {
|
|||
.FOREGROUND = COLOR_WHITE,
|
||||
.BUTTON_TEXT = rgb888torgb565(32, 191, 17),
|
||||
.BUTTON_INACTIVE_TEXT = rgb888torgb565(130, 130, 130),
|
||||
.BUTTON_BACKGROUND = rgb888torgb565(50, 50, 50),
|
||||
.BUTTON_BACKGROUND = rgb888torgb565(54, 54, 54),
|
||||
.FREQ_MHZ = COLOR_WHITE,
|
||||
.FREQ_KHZ = COLOR_WHITE,
|
||||
.FREQ_HZ = rgb888torgb565(150, 150, 150),
|
||||
|
|
|
@ -634,12 +634,12 @@ bool FFT_printFFT(void)
|
|||
//gradient
|
||||
for (uint32_t fft_x = 0; fft_x < LAY_FFT_PRINT_SIZE; fft_x++)
|
||||
{
|
||||
if (fft_x >= bw_line_start && fft_x <= bw_line_end) //bw bar
|
||||
if (fft_x == bw_line_start || fft_x == bw_line_end) //bw bar
|
||||
{
|
||||
if (fft_y >= (LAY_FFT_HEIGHT - fft_header[fft_x]))
|
||||
fft_output_buffer[fft_y][fft_x] = palette_bw_fft_colors[fft_y];
|
||||
fft_output_buffer[fft_y][fft_x] = palette_fft[LAY_FFT_HEIGHT / 2];
|
||||
else
|
||||
fft_output_buffer[fft_y][fft_x] = palette_bw_bg_colors[fft_y];
|
||||
fft_output_buffer[fft_y][fft_x] = palette_fft[LAY_FFT_HEIGHT / 2];
|
||||
}
|
||||
else //other fft data
|
||||
{
|
||||
|
@ -668,9 +668,13 @@ bool FFT_printFFT(void)
|
|||
}
|
||||
|
||||
//draw center line
|
||||
for (uint32_t fft_y = 0; fft_y < LAY_FFT_HEIGHT; fft_y++)
|
||||
fft_output_buffer[fft_y][(LAY_FFT_PRINT_SIZE / 2)] = palette_fft[LAY_FFT_HEIGHT / 2]; //mixColors(fft_output_buffer[fft_y][(LAY_FFT_PRINT_SIZE / 2)], palette_fft[fftHeight / 2], FFT_SCALE_LINES_BRIGHTNESS);
|
||||
|
||||
for (uint32_t fft_y = 0; fft_y < LAY_FFT_HEIGHT; fft_y++) {
|
||||
fft_output_buffer[fft_y] [(LAY_FFT_PRINT_SIZE / 2)] = palette_fft[LAY_FFT_HEIGHT / rgb888torgb565(0, 200, 255)]; //mixColors(fft_output_buffer[fft_y][(LAY_FFT_PRINT_SIZE / 2)], palette_fft[fftHeight / 2], FFT_SCALE_LINES_BRIGHTNESS);
|
||||
fft_output_buffer[fft_y] [(LAY_FFT_PRINT_SIZE / 2) -1] = palette_fft[LAY_FFT_HEIGHT / rgb888torgb565(0, 200, 255)];
|
||||
fft_output_buffer[fft_y] [(LAY_FFT_PRINT_SIZE / 2) +1] = palette_fft[LAY_FFT_HEIGHT / rgb888torgb565(0, 200, 255)];
|
||||
}
|
||||
|
||||
|
||||
//Print FFT
|
||||
LCDDriver_SetCursorAreaPosition(0, LAY_FFT_FFTWTF_POS_Y, LAY_FFT_PRINT_SIZE - 1, (LAY_FFT_FFTWTF_POS_Y + LAY_FFT_HEIGHT));
|
||||
print_fft_dma_estimated_size = LAY_FFT_PRINT_SIZE * LAY_FFT_HEIGHT;
|
||||
|
@ -793,27 +797,27 @@ void FFT_printWaterfallDMA(void)
|
|||
if (margin_left == 0 && margin_right == 0)
|
||||
{
|
||||
for (uint32_t wtf_x = 0; wtf_x < LAY_FFT_PRINT_SIZE; wtf_x++)
|
||||
if (wtf_x >= bw_line_start && wtf_x <= bw_line_end) //print bw bar
|
||||
wtf_output_line[wtf_x] = palette_bw_fft_colors[indexed_wtf_buffer[print_wtf_yindex][wtf_x]];
|
||||
else
|
||||
// if (wtf_x >= bw_line_start && wtf_x <= bw_line_end) //print bw bar
|
||||
// wtf_output_line[wtf_x] = palette_bw_fft_colors[indexed_wtf_buffer[print_wtf_yindex][wtf_x]];
|
||||
// else
|
||||
wtf_output_line[wtf_x] = palette_fft[indexed_wtf_buffer[print_wtf_yindex][wtf_x]];
|
||||
}
|
||||
else if (margin_left > 0)
|
||||
{
|
||||
memset(&wtf_output_line, BG_COLOR, (uint32_t)(margin_left * 2)); // fill the space to the left
|
||||
for (uint32_t wtf_x = 0; wtf_x < (LAY_FFT_PRINT_SIZE - margin_left); wtf_x++)
|
||||
if ((margin_left + wtf_x) >= bw_line_start && (margin_left + wtf_x) <= bw_line_end) //print bw bar
|
||||
wtf_output_line[margin_left + wtf_x] = palette_bw_fft_colors[indexed_wtf_buffer[print_wtf_yindex][wtf_x]];
|
||||
else
|
||||
// if ((margin_left + wtf_x) >= bw_line_start && (margin_left + wtf_x) <= bw_line_end) //print bw bar
|
||||
// wtf_output_line[margin_left + wtf_x] = palette_bw_fft_colors[indexed_wtf_buffer[print_wtf_yindex][wtf_x]];
|
||||
// else
|
||||
wtf_output_line[margin_left + wtf_x] = palette_fft[indexed_wtf_buffer[print_wtf_yindex][wtf_x]];
|
||||
}
|
||||
if (margin_right > 0)
|
||||
{
|
||||
memset(&wtf_output_line[(LAY_FFT_PRINT_SIZE - margin_right)], BG_COLOR, (uint32_t)(margin_right * 2)); // fill the space to the right
|
||||
for (uint32_t wtf_x = 0; wtf_x < (LAY_FFT_PRINT_SIZE - margin_right); wtf_x++)
|
||||
if (wtf_x >= bw_line_start && wtf_x <= bw_line_end) //print bw bar
|
||||
wtf_output_line[wtf_x] = palette_bw_fft_colors[indexed_wtf_buffer[print_wtf_yindex][wtf_x + margin_right]];
|
||||
else
|
||||
// if (wtf_x >= bw_line_start && wtf_x <= bw_line_end) //print bw bar
|
||||
// wtf_output_line[wtf_x] = palette_bw_fft_colors[indexed_wtf_buffer[print_wtf_yindex][wtf_x + margin_right]];
|
||||
// else
|
||||
wtf_output_line[wtf_x] = palette_fft[indexed_wtf_buffer[print_wtf_yindex][wtf_x + margin_right]];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,10 +11,10 @@
|
|||
#define FFT_SIZE 512 // specify the size of the calculated FFT
|
||||
#define FFT_USEFUL_SIZE 512 // size after FFT cropping
|
||||
#define FFT_DOUBLE_SIZE_BUFFER (FFT_SIZE * 2) // Buffer size for FFT calculation
|
||||
#define FFT_MIN 4.0f // MIN threshold of FFT signal
|
||||
#define FFT_MIN 1.5f // MIN threshold of FFT signal
|
||||
#define FFT_TARGET 6.0f // average threshold of the FFT signal
|
||||
#define FFT_COMPRESS_INTERVAL 0.9f // compress interval of the FFT signal
|
||||
#define FFT_MAX 8.0f // MAX FFT signal threshold
|
||||
#define FFT_MAX 9.0f // MAX FFT signal threshold
|
||||
#define FFT_STEP_COEFF 10.0f // step coefficient for auto-calibration of the FFT signal (more - slower)
|
||||
#define FFT_HZ_IN_PIXEL (float32_t)((float32_t)TRX_SAMPLERATE / (float32_t)LAY_FFT_PRINT_SIZE) // hertz per pixel
|
||||
#define FFT_BW_BRIGHTNESS 10 // pixel brightness on bw bar
|
||||
|
|
|
@ -53,6 +53,7 @@ static uint32_t ENCODER2_AValDeb = 0;
|
|||
|
||||
static bool enc2_func_mode = false; //false - fast-step, true - func mode (WPM, etc...)
|
||||
|
||||
#if (defined(BUTTONS_R7KBI)) //
|
||||
static PERIPH_FrontPanel_Button PERIPH_FrontPanel_Static_Buttons[] = {
|
||||
{.port = 1, .channel = 0, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
|
||||
{.port = 1, .channel = 1, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
|
||||
|
@ -74,7 +75,7 @@ static PERIPH_FrontPanel_Button PERIPH_FrontPanel_BottomScroll_Buttons[BOTTOM_SC
|
|||
},
|
||||
{
|
||||
{.port = 1, .channel = 5, .name = "AGC", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AGC, .holdHandler = FRONTPANEL_BUTTONHANDLER_AGC_SPEED}, //SB2
|
||||
{.port = 1, .channel = 6, .name = "TUNE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_TUNE, .holdHandler = FRONTPANEL_BUTTONHANDLER_TUNE}, //SB3
|
||||
{.port = 1, .channel = 6, .name = "ZOOM", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P}, //SB3
|
||||
{.port = 1, .channel = 6, .name = "NOTCH", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_NOTCH, .holdHandler = FRONTPANEL_BUTTONHANDLER_NOTCH}, //SB4
|
||||
{.port = 1, .channel = 6, .name = "FAST", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_FAST, .holdHandler = FRONTPANEL_BUTTONHANDLER_FAST}, //SB5
|
||||
{.port = 1, .channel = 7, .name = "CLAR", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_CLAR, .holdHandler = FRONTPANEL_BUTTONHANDLER_CLAR}, //SB3
|
||||
|
@ -98,7 +99,8 @@ static PERIPH_FrontPanel_Button PERIPH_FrontPanel_BottomScroll_Buttons[BOTTOM_SC
|
|||
{.port = 1, .channel = 6, .name = "BW+", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BW_P}, //SB3
|
||||
{.port = 1, .channel = 6, .name = "PWR-", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PWR_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_PWR_N}, //SB4
|
||||
{.port = 1, .channel = 6, .name = "PWR+", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PWR_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_PWR_P}, //SB5
|
||||
{.port = 1, .channel = 7, .name = "ZOOM", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P}, //SB2
|
||||
{.port = 1, .channel = 7, .name = "TUNE", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_TUNE, .holdHandler = FRONTPANEL_BUTTONHANDLER_TUNE}, //SB2
|
||||
//{.port = 1, .channel = 7, .name = "ZOOM", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P}, //SB2
|
||||
},
|
||||
{
|
||||
{.port = 1, .channel = 5, .name = "MODE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB6
|
||||
|
@ -108,6 +110,63 @@ static PERIPH_FrontPanel_Button PERIPH_FrontPanel_BottomScroll_Buttons[BOTTOM_SC
|
|||
{.port = 1, .channel = 7, .name = "POWER", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER, .holdHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER}, //SB2
|
||||
},
|
||||
};
|
||||
#else
|
||||
static PERIPH_FrontPanel_Button PERIPH_FrontPanel_Static_Buttons[] = {
|
||||
{.port = 1, .channel = 0, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
|
||||
{.port = 1, .channel = 1, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
|
||||
{.port = 1, .channel = 2, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
|
||||
{.port = 1, .channel = 3, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
|
||||
{.port = 1, .channel = 4, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
|
||||
{.port = 1, .channel = 7, .name = "MODE", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB6
|
||||
{.port = 1, .channel = 7, .name = "BAND", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB1
|
||||
{.port = 1, .channel = 6, .name = "MENU", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MENU, .holdHandler = FRONTPANEL_BUTTONHANDLER_MENU}, //SB1
|
||||
};
|
||||
|
||||
static PERIPH_FrontPanel_Button PERIPH_FrontPanel_BottomScroll_Buttons[BOTTOM_SCROLLBUTTONS_GROUPS_COUNT][5] = {
|
||||
{
|
||||
{.port = 1, .channel = 5, .name = "PRE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PRE, .holdHandler = FRONTPANEL_BUTTONHANDLER_PRE}, //SB2
|
||||
{.port = 1, .channel = 5, .name = "ATT", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ATT, .holdHandler = FRONTPANEL_BUTTONHANDLER_ATTHOLD}, //SB3
|
||||
{.port = 1, .channel = 5, .name = "BW", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW, .holdHandler = FRONTPANEL_BUTTONHANDLER_HPF}, //SB4
|
||||
{.port = 1, .channel = 6, .name = "A/B", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AsB, .holdHandler = FRONTPANEL_BUTTONHANDLER_ArB}, //SB5
|
||||
{.port = 1, .channel = 6, .name = "POWER", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER, .holdHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER}, //SB2
|
||||
},
|
||||
{
|
||||
{.port = 1, .channel = 5, .name = "AGC", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AGC, .holdHandler = FRONTPANEL_BUTTONHANDLER_AGC_SPEED}, //SB2
|
||||
{.port = 1, .channel = 5, .name = "TUNE", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_TUNE, .holdHandler = FRONTPANEL_BUTTONHANDLER_TUNE}, //SB3
|
||||
{.port = 1, .channel = 5, .name = "NOTCH", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_NOTCH, .holdHandler = FRONTPANEL_BUTTONHANDLER_NOTCH}, //SB4
|
||||
{.port = 1, .channel = 6, .name = "FAST", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_FAST, .holdHandler = FRONTPANEL_BUTTONHANDLER_FAST}, //SB5
|
||||
{.port = 1, .channel = 6, .name = "CLAR", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_CLAR, .holdHandler = FRONTPANEL_BUTTONHANDLER_CLAR}, //SB3
|
||||
},
|
||||
{
|
||||
{.port = 1, .channel = 5, .name = "VOLUME", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_VOLUME, .holdHandler = FRONTPANEL_BUTTONHANDLER_VOLUME}, //SB2
|
||||
{.port = 1, .channel = 5, .name = "BANDMAP", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BANDMAP, .holdHandler = FRONTPANEL_BUTTONHANDLER_BANDMAP}, //SB3
|
||||
{.port = 1, .channel = 5, .name = "MUTE", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MUTE, .holdHandler = FRONTPANEL_BUTTONHANDLER_MUTE}, //SB4
|
||||
{.port = 1, .channel = 6, .name = "LOCK", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_LOCK, .holdHandler = FRONTPANEL_BUTTONHANDLER_LOCK}, //SB5
|
||||
{.port = 1, .channel = 6, .name = "WPM", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_WPM, .holdHandler = FRONTPANEL_BUTTONHANDLER_WPM}, //SB4
|
||||
},
|
||||
{
|
||||
{.port = 1, .channel = 5, .name = "BAND-", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB2
|
||||
{.port = 1, .channel = 5, .name = "BAND+", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_P}, //SB3
|
||||
{.port = 1, .channel = 5, .name = "MODE-", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_N}, //SB4
|
||||
{.port = 1, .channel = 6, .name = "MODE+", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB5
|
||||
{.port = 1, .channel = 6, .name = "KEYER", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_KEYER, .holdHandler = FRONTPANEL_BUTTONHANDLER_KEYER}, //SB5
|
||||
},
|
||||
{
|
||||
{.port = 1, .channel = 5, .name = "BW-", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_BW_N}, //SB2
|
||||
{.port = 1, .channel = 5, .name = "BW+", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BW_P}, //SB3
|
||||
{.port = 1, .channel = 5, .name = "PWR-", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PWR_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_PWR_N}, //SB4
|
||||
{.port = 1, .channel = 6, .name = "PWR+", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PWR_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_PWR_P}, //SB5
|
||||
{.port = 1, .channel = 6, .name = "ZOOM", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P}, //SB2
|
||||
},
|
||||
{
|
||||
{.port = 1, .channel = 5, .name = "MODE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB6
|
||||
{.port = 1, .channel = 5, .name = "BAND", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB1
|
||||
{.port = 1, .channel = 5, .name = "PRE", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PRE, .holdHandler = FRONTPANEL_BUTTONHANDLER_PRE}, //SB2
|
||||
{.port = 1, .channel = 6, .name = "A/B", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AsB, .holdHandler = FRONTPANEL_BUTTONHANDLER_ArB}, //SB5
|
||||
{.port = 1, .channel = 6, .name = "POWER", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER, .holdHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER}, //SB2
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
PERIPH_FrontPanel_Button* PERIPH_FrontPanel_BottomScroll_Buttons_Active = PERIPH_FrontPanel_BottomScroll_Buttons[0];
|
||||
int8_t PERIPH_FrontPanel_BottomScroll_index = 0;
|
||||
|
@ -178,8 +237,6 @@ void FRONTPANEL_ENCODER_checkRotate(void)
|
|||
|
||||
void FRONTPANEL_ENCODER2_checkRotate(void)
|
||||
{
|
||||
static int8_t enc2_slowler = 0;
|
||||
#define enc2_slowler_val 2
|
||||
uint8_t ENCODER2_DTVal = HAL_GPIO_ReadPin(ENC2_DT_GPIO_Port, ENC2_DT_Pin);
|
||||
uint8_t ENCODER2_CLKVal = HAL_GPIO_ReadPin(ENC2_CLK_GPIO_Port, ENC2_CLK_Pin);
|
||||
|
||||
|
@ -189,24 +246,12 @@ void FRONTPANEL_ENCODER2_checkRotate(void)
|
|||
if (!CALIBRATE.ENCODER_ON_FALLING || ENCODER2_CLKVal == 0)
|
||||
{
|
||||
if (ENCODER2_DTVal != ENCODER2_CLKVal)
|
||||
{
|
||||
// If pin A changed first - clockwise rotation
|
||||
enc2_slowler--;
|
||||
if(enc2_slowler <= -enc2_slowler_val)
|
||||
{
|
||||
FRONTPANEL_ENCODER2_Rotated(CALIBRATE.ENCODER2_INVERT ? 1 : -1);
|
||||
enc2_slowler = 0;
|
||||
}
|
||||
{ // If pin A changed first - clockwise rotation
|
||||
FRONTPANEL_ENCODER2_Rotated(CALIBRATE.ENCODER2_INVERT ? 1 : -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// otherwise B changed its state first - counterclockwise rotation
|
||||
enc2_slowler++;
|
||||
if(enc2_slowler >= enc2_slowler_val)
|
||||
{
|
||||
FRONTPANEL_ENCODER2_Rotated(CALIBRATE.ENCODER2_INVERT ? -1 : 1);
|
||||
enc2_slowler = 0;
|
||||
}
|
||||
{ // otherwise B changed its state first - counterclockwise rotation
|
||||
FRONTPANEL_ENCODER2_Rotated(CALIBRATE.ENCODER2_INVERT ? -1 : 1);
|
||||
}
|
||||
}
|
||||
ENCODER2_AValDeb = HAL_GetTick();
|
||||
|
|
|
@ -354,6 +354,23 @@ float32_t getMaxTXAmplitudeOnFreq(uint32_t freq)
|
|||
|
||||
return (float32_t)CALIBRATE.rf_out_power_40m / 100.0f * (float32_t)MAX_TX_AMPLITUDE;
|
||||
}
|
||||
//###########################################################################################################################
|
||||
//uint16_t getf_calibrate(uint16_t freq)
|
||||
//{
|
||||
//
|
||||
// switch (freq)
|
||||
// {
|
||||
// case CALIBRATE.freq_correctur_160:
|
||||
// break;
|
||||
// case CALIBRATE.freq_correctur_80:
|
||||
// break;
|
||||
// case CALIBRATE.freq_correctur_40:
|
||||
// break;
|
||||
//
|
||||
// }
|
||||
|
||||
//}
|
||||
//###########################################################################################################################
|
||||
|
||||
float32_t generateSin(float32_t amplitude, uint32_t index, uint32_t samplerate, uint32_t freq)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef Functions_h
|
||||
#define Functions_h
|
||||
|
||||
__asm(".global __use_no_heap\n\t");
|
||||
|
||||
#include "stm32f4xx_hal.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -134,6 +136,7 @@ extern float32_t rate2dbP(float32_t i);
|
|||
extern float32_t volume2rate(float32_t i);
|
||||
extern void shiftTextLeft(char *string, uint_fast16_t shiftLength);
|
||||
extern float32_t getMaxTXAmplitudeOnFreq(uint32_t freq);
|
||||
//extern uint16_t getf_calibrate(uint16_t freq);
|
||||
extern float32_t generateSin(float32_t amplitude, uint32_t index, uint32_t samplerate, uint32_t freq);
|
||||
extern int32_t convertToSPIBigEndian(int32_t in);
|
||||
extern uint8_t rev8(uint8_t data);
|
||||
|
|
|
@ -30,6 +30,7 @@ static uint16_t LCD_last_showed_freq_mhz = 9999;
|
|||
static uint16_t LCD_last_showed_freq_khz = 9999;
|
||||
static uint16_t LCD_last_showed_freq_hz = 9999;
|
||||
|
||||
//extern TRX_freq_correctur;
|
||||
static float32_t LCD_last_s_meter = 1.0f;
|
||||
static uint32_t Time;
|
||||
static uint8_t Hours;
|
||||
|
|
|
@ -638,46 +638,6 @@ static void MX_TIM3_Init(void)
|
|||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
//static void MX_TIM4_Init(void)
|
||||
//{
|
||||
|
||||
// /* USER CODE BEGIN TIM4_Init 0 */
|
||||
|
||||
// /* USER CODE END TIM4_Init 0 */
|
||||
|
||||
// TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||
// TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||
|
||||
// /* USER CODE BEGIN TIM4_Init 1 */
|
||||
|
||||
// /* USER CODE END TIM4_Init 1 */
|
||||
// htim4.Instance = TIM4;
|
||||
// htim4.Init.Prescaler = 4199;
|
||||
// htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
// htim4.Init.Period = 199;
|
||||
// htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
// htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
// if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
// sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||
// if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
// sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
|
||||
// sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||
// if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
// /* USER CODE BEGIN TIM4_Init 2 */
|
||||
|
||||
// /* USER CODE END TIM4_Init 2 */
|
||||
|
||||
//}
|
||||
|
||||
static void MX_TIM4_Init(void) //LCD PWM
|
||||
{
|
||||
|
||||
|
@ -693,7 +653,7 @@ static void MX_TIM4_Init(void) //LCD PWM
|
|||
|
||||
/* USER CODE END TIM3_Init 1 */
|
||||
htim4.Instance = TIM4;
|
||||
htim4.Init.Prescaler = 64-1;
|
||||
htim4.Init.Prescaler = 32-1;
|
||||
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim4.Init.Period = 500-1;
|
||||
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
|
|
|
@ -76,8 +76,8 @@ void RF_UNIT_ProcessSensors(void)
|
|||
else
|
||||
backward = 0.001f;
|
||||
|
||||
TRX_VLT_forward = TRX_VLT_forward + (forward - TRX_VLT_forward) / 2;
|
||||
TRX_VLT_backward = TRX_VLT_backward + (backward - TRX_VLT_backward) / 2;
|
||||
TRX_VLT_forward = 0.99f * TRX_VLT_forward + 0.01f * forward;
|
||||
TRX_VLT_backward = 0.99f * TRX_VLT_backward + 0.01f * backward;
|
||||
TRX_SWR = (TRX_VLT_forward + TRX_VLT_backward) / (TRX_VLT_forward - TRX_VLT_backward);
|
||||
|
||||
if (TRX_VLT_backward > TRX_VLT_forward)
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#define LAY_TOPBUTTONS_Y1 1
|
||||
#define LAY_TOPBUTTONS_Y2 50
|
||||
#define LAY_TOPBUTTONS_WIDTH 62
|
||||
#define LAY_TOPBUTTONS_HEIGHT 40
|
||||
#define LAY_TOPBUTTONS_HEIGHT 20
|
||||
#define LAY_TOPBUTTONS_TB_MARGIN 2
|
||||
#define LAY_TOPBUTTONS_LR_MARGIN 2
|
||||
#define LAY_TOPBUTTONS_PRE_X (uint16_t)(LAY_TOPBUTTONS_X1 + LAY_TOPBUTTONS_LR_MARGIN)
|
||||
|
|
|
@ -45,6 +45,7 @@ static void EEPROM_PowerUp(void);
|
|||
static void EEPROM_WaitWrite(void);
|
||||
static uint8_t calculateCSUM(void);
|
||||
static uint8_t calculateCSUM_EEPROM(void);
|
||||
//static uint16_t freq_correctur = 0;
|
||||
|
||||
const char *MODE_DESCR[TRX_MODE_COUNT] = {
|
||||
"LSB",
|
||||
|
@ -188,12 +189,12 @@ void LoadSettings(bool clear)
|
|||
TRX.Locked = false; // Lock control
|
||||
TRX.CLAR = false; // Split frequency mode (receive one VFO, transmit another)
|
||||
TRX.TWO_SIGNAL_TUNE = false; // Two-signal generator in TUNE mode (1 + 2kHz)
|
||||
TRX.IF_Gain = 60; // IF gain, dB (before all processing and AGC)
|
||||
TRX.IF_Gain = 40; // IF gain, dB (before all processing and AGC)
|
||||
TRX.CW_KEYER = true; // Automatic key
|
||||
TRX.CW_KEYER_WPM = 30; // Automatic key speed
|
||||
TRX.Debug_Console = false; // Debug output to DEBUG / UART port
|
||||
TRX.FFT_Color = 1; // FFT display color
|
||||
TRX.FFT_Grid = 1; // FFT grid style
|
||||
TRX.FFT_Grid = 3; // FFT grid style
|
||||
TRX.ShiftEnabled = false; // activate the SHIFT mode
|
||||
TRX.SHIFT_INTERVAL = 5000; // Detune range with the SHIFT knob (5000 = -5000hz / + 5000hz)
|
||||
TRX.DNR_SNR_THRESHOLD = 50; // Digital noise reduction level
|
||||
|
@ -201,7 +202,7 @@ void LoadSettings(bool clear)
|
|||
TRX.DNR_MINIMAL = 99; // DNR averaging when searching for minimum magnitude
|
||||
TRX.FRQ_STEP = 10; // frequency tuning step by the main encoder
|
||||
TRX.FRQ_FAST_STEP = 100; // frequency tuning step by the main encoder in FAST mode
|
||||
TRX.AGC_GAIN_TARGET = -35; // Maximum (target) AGC gain
|
||||
TRX.AGC_GAIN_TARGET = -25; // Maximum (target) AGC gain
|
||||
TRX.MIC_GAIN = 3; // Microphone gain
|
||||
TRX.RX_EQ_LOW = 0; // Receiver Equalizer (Low)
|
||||
TRX.RX_EQ_MID = 0; // Receiver EQ (mids)
|
||||
|
@ -210,7 +211,7 @@ void LoadSettings(bool clear)
|
|||
TRX.MIC_EQ_MID = 0; // Mic Equalizer (Mids)
|
||||
TRX.MIC_EQ_HIG = 0; // Mic EQ (high)
|
||||
TRX.Beeper = true; //Keyboard beeper
|
||||
TRX.FFT_Background = true; //FFT gradient background
|
||||
TRX.FFT_Background = false; //FFT gradient background
|
||||
TRX.FFT_Compressor = true; //Compress FFT Peaks
|
||||
TRX.Encoder_Accelerate = true; //Accelerate Encoder on fast rate
|
||||
strcpy(TRX.CALLSIGN, "HamRad"); // Callsign
|
||||
|
@ -265,7 +266,7 @@ void LoadCalibration(bool clear)
|
|||
CALIBRATE.flash_id = CALIB_VERSION; // code for checking the firmware in the eeprom, if it does not match, we use the default
|
||||
|
||||
CALIBRATE.ENCODER_INVERT = false; // invert left-right rotation of the main encoder
|
||||
CALIBRATE.ENCODER2_INVERT = true; // invert left-right rotation of the optional encoder
|
||||
CALIBRATE.ENCODER2_INVERT = false; // invert left-right rotation of the optional encoder
|
||||
CALIBRATE.ENCODER_DEBOUNCE = 0; // time to eliminate contact bounce at the main encoder, ms
|
||||
CALIBRATE.ENCODER2_DEBOUNCE = 50; // time to eliminate contact bounce at the additional encoder, ms
|
||||
CALIBRATE.ENCODER_SLOW_RATE = 25; // slow down the encoder for high resolutions
|
||||
|
@ -282,15 +283,18 @@ void LoadCalibration(bool clear)
|
|||
CALIBRATE.rf_out_power_17m = 22; //17m
|
||||
CALIBRATE.rf_out_power_15m = 22; //15m
|
||||
CALIBRATE.rf_out_power_12m = 22; //12m
|
||||
CALIBRATE.rf_out_power_10m = 22; //10m
|
||||
CALIBRATE.rf_out_power_10m = 22; //10m
|
||||
|
||||
CALIBRATE.freq_correctur = 0;
|
||||
// CALIBRATE.freq_correctur_80 = 0;
|
||||
// CALIBRATE.freq_correctur_40 = 0;
|
||||
CALIBRATE.rf_out_power_lf = 40; // <2mhz
|
||||
CALIBRATE.rf_out_power_hf_low = 45; // <5mhz
|
||||
CALIBRATE.rf_out_power_hf = 26; // <30mhz
|
||||
CALIBRATE.rf_out_power_hf_high = 80; // >30mhz
|
||||
CALIBRATE.smeter_calibration = 0; // S-Meter calibration, set when calibrating the transceiver to S9
|
||||
CALIBRATE.smeter_calibration = -10; // S-Meter calibration, set when calibrating the transceiver to S9
|
||||
CALIBRATE.swr_trans_rate = 11.0f; //SWR Transormator rate
|
||||
CALIBRATE.volt_cal_rate = 10.0f; //VOLTAGE
|
||||
CALIBRATE.volt_cal_rate = 11.0f; //VOLTAGE
|
||||
|
||||
CALIBRATE.ENDBit = 100;
|
||||
sendToDebug_strln("[OK] Loaded default calibrate settings");
|
||||
|
|
|
@ -7,24 +7,26 @@
|
|||
#include "functions.h"
|
||||
#include "bands.h"
|
||||
|
||||
#define SETT_VERSION 100 // Settings config version
|
||||
#define SETT_VERSION 101 // Settings config version
|
||||
#define CALIB_VERSION 100 // Calibration config version
|
||||
#define ADC_CLOCK 64320000 // ADC generator frequency
|
||||
#define DAC_CLOCK 160800000 // DAC generator frequency
|
||||
//#define ADC_CLOCK 64320000 // ADC generator frequency
|
||||
//#define DAC_CLOCK 160800000 // DAC generator frequency
|
||||
#define ADC_CLOCK 61440000 // ADC generator frequency
|
||||
#define DAC_CLOCK 153600000 // DAC generator frequency
|
||||
#define MAX_RX_FREQ_HZ 750000000 // Maximum receive frequency (from the ADC datasheet)
|
||||
#define MAX_TX_FREQ_HZ (DAC_CLOCK / 2) // Maximum transmission frequency
|
||||
#define TRX_SAMPLERATE 48000 // audio stream sampling rate during processing
|
||||
#define MAX_TX_AMPLITUDE 1.0f // Maximum amplitude when transmitting to FPGA
|
||||
#define AGC_MAX_GAIN 30.0f // Maximum gain in AGC, dB
|
||||
#define AGC_MAX_GAIN 10.0f // Maximum gain in AGC, dB
|
||||
#define AGC_CLIPPING 6.0f // Limit over target in AGC, dB
|
||||
#define TUNE_POWER 100 // % of the power selected in the settings when starting TUNE (100 - full)
|
||||
#define TX_AGC_MAXGAIN 5.0f // Maximum microphone gain during compression
|
||||
#define TX_AGC_NOISEGATE 0.00001f // Minimum signal level for amplification (below - noise, cut off)
|
||||
#define AUTOGAIN_TARGET_AMPLITUDE 20000.0f // maximum amplitude, upon reaching which the autocorrector of the input circuits terminates, and in case of overflow it reduces the gain
|
||||
#define AUTOGAIN_MAX_AMPLITUDE 30000.0f // maximum amplitude, upon reaching which the autocorrector of the input circuits terminates, and in case of overflow it reduces the gain
|
||||
#define AUTOGAIN_CORRECTOR_WAITSTEP 5 // waiting for the averaging of the results when the auto-corrector of the input circuits is running
|
||||
#define AUTOGAIN_MAX_AMPLITUDE 30000.0f // maximum amplitude, upon reaching which the autocorrector of the input circuits terminates, and in case of overflow it reduces the gain
|
||||
#define AUTOGAIN_CORRECTOR_WAITSTEP 5 // waiting for the averaging of the results when the auto-corrector of the input circuits is running
|
||||
#define KEY_HOLD_TIME 500 // time of long pressing of the keyboard button for triggering, ms
|
||||
#define MAX_RF_POWER 7.0f // Maximum power (for meter scale)
|
||||
#define MAX_RF_POWER 50.0f // Maximum power (for meter scale)
|
||||
#define SHOW_LOGO true // Show logo on boot (from images.h)
|
||||
#define POWERDOWN_TIMEOUT 1000 // time of pressing the shutdown button, for operation, ms
|
||||
#define USB_RESTART_TIMEOUT 5000 // time after which USB restart occurs if there are no packets
|
||||
|
@ -32,6 +34,8 @@
|
|||
#define ENCODER_MIN_RATE_ACCELERATION 1.2f //encoder enable rounding if lower than value
|
||||
#define TRX_MAX_SWR 5 //maximum SWR to enable protect (NOT IN TUNE MODE!)
|
||||
|
||||
#define BUTTONS_R7KBI true //Author board buttons
|
||||
|
||||
// select LCD, comment on others
|
||||
//#define LCD_ILI9481 true
|
||||
//#define LCD_HX8357B true
|
||||
|
@ -46,6 +50,7 @@
|
|||
#define SPI_EEPROM_PRESCALER SPI_BAUDRATEPRESCALER_8
|
||||
|
||||
#define CODEC_BITS_FULL_SCALE 65536 // maximum signal amplitude in the bus // powf (2, FPGA_BUS_BITS)
|
||||
#define ADC_FULL_SCALE 4095
|
||||
#define FLOAT_FULL_SCALE_POW 4
|
||||
#define USB_DEBUG_ENABLED true // allow using USB as a console
|
||||
#define SWD_DEBUG_ENABLED false // enable SWD as a console
|
||||
|
@ -53,6 +58,8 @@
|
|||
#define ADC_INPUT_IMPEDANCE 200.0f //50ohm -> 1:4 trans
|
||||
#define ADC_RANGE 1.0f
|
||||
#define ADC_DRIVER_GAIN_DB 20.0f //on 14mhz
|
||||
#define AUTOGAINER_TAGET (ADC_FULL_SCALE / 3)
|
||||
#define AUTOGAINER_HYSTERESIS (ADC_FULL_SCALE / 10)
|
||||
|
||||
#define MAX_CALLSIGN_LENGTH 16
|
||||
|
||||
|
@ -198,6 +205,7 @@ extern struct TRX_CALIBRATE
|
|||
uint8_t TXCICFIR_GAINER_val;
|
||||
uint8_t DAC_GAINER_val;
|
||||
uint8_t rf_out_power_lf;
|
||||
|
||||
uint8_t rf_out_power_hf_low;
|
||||
uint8_t rf_out_power_hf;
|
||||
uint8_t rf_out_power_hf_high;
|
||||
|
@ -205,6 +213,9 @@ extern struct TRX_CALIBRATE
|
|||
int16_t smeter_calibration;
|
||||
float32_t swr_trans_rate;
|
||||
float32_t volt_cal_rate;
|
||||
int16_t freq_correctur;
|
||||
// int16_t freq_correctur_80;
|
||||
// int16_t freq_correctur_40;
|
||||
uint8_t rf_out_power_160m;
|
||||
uint8_t rf_out_power_80m;
|
||||
uint8_t rf_out_power_40m;
|
||||
|
|
|
@ -114,6 +114,7 @@ static void SYSMENU_HANDL_CALIB_RF_GAIN_17M(int8_t direction);
|
|||
static void SYSMENU_HANDL_CALIB_RF_GAIN_15M(int8_t direction);
|
||||
static void SYSMENU_HANDL_CALIB_RF_GAIN_12M(int8_t direction);
|
||||
static void SYSMENU_HANDL_CALIB_RF_GAIN_10M(int8_t direction);
|
||||
static void SYSMENU_HANDL_CALIB_FREQUENCY(int8_t direction);
|
||||
|
||||
static void SYSMENU_HANDL_TRXMENU(int8_t direction);
|
||||
static void SYSMENU_HANDL_AUDIOMENU(int8_t direction);
|
||||
|
@ -246,6 +247,7 @@ static const struct sysmenu_item_handler sysmenu_calibration_handlers[] =
|
|||
{"S METER", SYSMENU_INT16, (uint32_t *)&CALIBRATE.smeter_calibration, SYSMENU_HANDL_CALIB_S_METER},
|
||||
{"SWR TRANS RATE", SYSMENU_FLOAT32, (uint32_t *)&CALIBRATE.swr_trans_rate, SYSMENU_HANDL_CALIB_SWR_TRANS_RATE},
|
||||
{"VOLT CALIBR", SYSMENU_FLOAT32, (uint32_t *)&CALIBRATE.volt_cal_rate, SYSMENU_HANDL_CALIB_VOLT},
|
||||
{"F-correctur", SYSMENU_INT16, (uint32_t *)&CALIBRATE.freq_correctur, SYSMENU_HANDL_CALIB_FREQUENCY},
|
||||
{"RF GAIN 160m", SYSMENU_UINT8, (uint32_t *)&CALIBRATE.rf_out_power_160m, SYSMENU_HANDL_CALIB_RF_GAIN_160M},
|
||||
{"RF GAIN 80m", SYSMENU_UINT8, (uint32_t *)&CALIBRATE.rf_out_power_80m, SYSMENU_HANDL_CALIB_RF_GAIN_80M},
|
||||
{"RF GAIN 40m", SYSMENU_UINT8, (uint32_t *)&CALIBRATE.rf_out_power_40m, SYSMENU_HANDL_CALIB_RF_GAIN_40M},
|
||||
|
@ -1917,7 +1919,19 @@ static void SYSMENU_HANDL_CALIB_VOLT(int8_t direction)
|
|||
if (CALIBRATE.volt_cal_rate > 50.0f)
|
||||
CALIBRATE.volt_cal_rate = 50.0f;
|
||||
}
|
||||
//F-CALIBR
|
||||
//###########################################################################################################
|
||||
static void SYSMENU_HANDL_CALIB_FREQUENCY(int8_t direction)
|
||||
{
|
||||
CALIBRATE.freq_correctur += direction;
|
||||
if (CALIBRATE.freq_correctur < -500)
|
||||
CALIBRATE.freq_correctur = -500;
|
||||
if (CALIBRATE.freq_correctur > 500)
|
||||
CALIBRATE.freq_correctur = 500;
|
||||
TRX_setFrequency(CurrentVFO()->Freq, CurrentVFO());
|
||||
}
|
||||
|
||||
//##########################################################################################################
|
||||
//SERVICES
|
||||
void SYSMENU_HANDL_SERVICESMENU(int8_t direction)
|
||||
{
|
||||
|
|
|
@ -209,8 +209,8 @@ void TRX_setFrequency(uint32_t _freq, VFO *vfo)
|
|||
//get fpga freq phrase
|
||||
VFO *current_vfo = CurrentVFO();
|
||||
VFO *secondary_vfo = SecondaryVFO();
|
||||
TRX_freq_phrase = getRXPhraseFromFrequency((int32_t)current_vfo->Freq + TRX_SHIFT);
|
||||
TRX_freq_phrase_tx = getTXPhraseFromFrequency((int32_t)current_vfo->Freq + TRX_SHIFT);
|
||||
TRX_freq_phrase = getRXPhraseFromFrequency((int32_t)current_vfo->Freq + TRX_SHIFT + CALIBRATE.freq_correctur);
|
||||
TRX_freq_phrase_tx = getTXPhraseFromFrequency((int32_t)current_vfo->Freq + TRX_SHIFT + CALIBRATE.freq_correctur);
|
||||
if (!TRX_on_TX())
|
||||
{
|
||||
switch (current_vfo->Mode)
|
||||
|
@ -281,138 +281,47 @@ void TRX_setMode(uint_fast8_t _mode, VFO *vfo)
|
|||
|
||||
void TRX_DoAutoGain(void)
|
||||
{
|
||||
#define SKIP_CYCLES_DOWNSTAGE 10 //skip cycles on stage downgrade
|
||||
static uint8_t skip_cycles = 0;
|
||||
|
||||
uint8_t skip_cycles = 0;
|
||||
if (skip_cycles > 0)
|
||||
{
|
||||
skip_cycles--;
|
||||
return;
|
||||
}
|
||||
|
||||
//Process AutoGain feature
|
||||
if (TRX.AutoGain && !TRX_on_TX())
|
||||
{
|
||||
int32_t max_amplitude = abs(TRX_ADC_MAXAMPLITUDE);
|
||||
if(abs(TRX_ADC_MINAMPLITUDE) > max_amplitude)
|
||||
max_amplitude = abs(TRX_ADC_MINAMPLITUDE);
|
||||
|
||||
switch (TRX_AutoGain_Stage)
|
||||
if (!TRX.ATT)
|
||||
{
|
||||
case 0: // stage 1 - ATT
|
||||
TRX.ADC_Driver = false;
|
||||
TRX.ATT = true;
|
||||
FPGA_NeedSendParams = true;
|
||||
LCD_UpdateQuery.TopButtons = true;
|
||||
autogain_wait_reaction = 0;
|
||||
if(skip_cycles == 0)
|
||||
{
|
||||
sendToDebug_strln("AUTOGAIN BPF + ATT");
|
||||
TRX_AutoGain_Stage++;
|
||||
}
|
||||
else
|
||||
skip_cycles--;
|
||||
break;
|
||||
case 1: // changed the state, process the results
|
||||
if ((max_amplitude * db2rateV(TRX.ATT_DB)) <= AUTOGAIN_TARGET_AMPLITUDE) // if we can turn off ATT - go to the next stage (+ 12dB)
|
||||
autogain_wait_reaction++;
|
||||
else
|
||||
autogain_wait_reaction = 0;
|
||||
if (autogain_wait_reaction >= AUTOGAIN_CORRECTOR_WAITSTEP)
|
||||
{
|
||||
TRX_AutoGain_Stage++;
|
||||
autogain_wait_reaction = 0;
|
||||
}
|
||||
break;
|
||||
case 2: // stage 2 - NONE
|
||||
TRX.ATT = false;
|
||||
TRX.ADC_Driver = false;
|
||||
FPGA_NeedSendParams = true;
|
||||
LCD_UpdateQuery.TopButtons = true;
|
||||
autogain_wait_reaction = 0;
|
||||
if(skip_cycles == 0)
|
||||
{
|
||||
sendToDebug_strln("AUTOGAIN BPF");
|
||||
TRX_AutoGain_Stage++;
|
||||
}
|
||||
else
|
||||
skip_cycles--;
|
||||
break;
|
||||
case 3: // changed the state, process the results
|
||||
if (max_amplitude > AUTOGAIN_MAX_AMPLITUDE || TRX_ADC_OTR)
|
||||
{
|
||||
TRX_AutoGain_Stage -= 3; // too much gain, go back one step
|
||||
skip_cycles = SKIP_CYCLES_DOWNSTAGE;
|
||||
}
|
||||
if ((max_amplitude * db2rateV(ADC_DRIVER_GAIN_DB) * db2rateV(-TRX.ATT_DB)) <= AUTOGAIN_TARGET_AMPLITUDE) // if we can turn off ATT - go to the next stage (+ 12dB)
|
||||
autogain_wait_reaction++;
|
||||
else
|
||||
{
|
||||
autogain_wait_reaction = 0;
|
||||
}
|
||||
if (autogain_wait_reaction >= AUTOGAIN_CORRECTOR_WAITSTEP)
|
||||
{
|
||||
TRX_AutoGain_Stage++;
|
||||
autogain_wait_reaction = 0;
|
||||
}
|
||||
break;
|
||||
case 5: // stage 4 - BPF + DRIVER + ATT
|
||||
TRX.ATT = false;
|
||||
TRX.ADC_Driver = true;
|
||||
FPGA_NeedSendParams = true;
|
||||
LCD_UpdateQuery.TopButtons = true;
|
||||
autogain_wait_reaction = 0;
|
||||
if(skip_cycles == 0)
|
||||
{
|
||||
sendToDebug_strln("AUTOGAIN BPF + DRIVER + ATT");
|
||||
TRX_AutoGain_Stage++;
|
||||
}
|
||||
else
|
||||
skip_cycles--;
|
||||
break;
|
||||
case 6: // changed the state, process the results
|
||||
if (max_amplitude > AUTOGAIN_MAX_AMPLITUDE || TRX_ADC_OTR)
|
||||
{
|
||||
TRX_AutoGain_Stage -= 3; // too much gain, go back one step
|
||||
skip_cycles = SKIP_CYCLES_DOWNSTAGE;
|
||||
}
|
||||
if ((max_amplitude * db2rateV(TRX.ATT_DB)) <= AUTOGAIN_TARGET_AMPLITUDE) // if we can turn off ATT - go to the next stage (+ 12dB)
|
||||
autogain_wait_reaction++;
|
||||
else
|
||||
autogain_wait_reaction = 0;
|
||||
if (autogain_wait_reaction >= AUTOGAIN_CORRECTOR_WAITSTEP)
|
||||
{
|
||||
TRX_AutoGain_Stage++;
|
||||
autogain_wait_reaction = 0;
|
||||
}
|
||||
break;
|
||||
case 7: // stage 5 - BPF + DRIVER
|
||||
TRX.ATT = false;
|
||||
TRX.ADC_Driver = true;
|
||||
FPGA_NeedSendParams = true;
|
||||
LCD_UpdateQuery.TopButtons = true;
|
||||
autogain_wait_reaction = 0;
|
||||
if(skip_cycles == 0)
|
||||
{
|
||||
sendToDebug_strln("AUTOGAIN BPF + DRIVER");
|
||||
TRX_AutoGain_Stage++;
|
||||
}
|
||||
else
|
||||
skip_cycles--;
|
||||
break;
|
||||
case 9: // changed the state, process the results
|
||||
if (max_amplitude > AUTOGAIN_MAX_AMPLITUDE || TRX_ADC_OTR)
|
||||
{
|
||||
TRX_AutoGain_Stage -= 3; // too much gain, go back one step
|
||||
skip_cycles = SKIP_CYCLES_DOWNSTAGE;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
TRX_AutoGain_Stage = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
|
||||
if (band > 0)
|
||||
|
||||
int32_t max_amplitude = abs(TRX_ADC_MAXAMPLITUDE);
|
||||
if (abs(TRX_ADC_MINAMPLITUDE) > max_amplitude)
|
||||
max_amplitude = abs(TRX_ADC_MINAMPLITUDE);
|
||||
//sendToDebug_int32(max_amplitude,false);
|
||||
float32_t new_att_val = TRX.ATT_DB;
|
||||
if (max_amplitude > (AUTOGAINER_TAGET + AUTOGAINER_HYSTERESIS) && new_att_val < 31.5f)
|
||||
new_att_val += 0.5f;
|
||||
else if (max_amplitude < (AUTOGAINER_TAGET - AUTOGAINER_HYSTERESIS) && new_att_val > 1.0f)
|
||||
new_att_val -= 0.5f;
|
||||
|
||||
if (new_att_val == 0.0f && max_amplitude < (AUTOGAINER_TAGET - AUTOGAINER_HYSTERESIS) && !TRX.ADC_Driver)
|
||||
{
|
||||
TRX.BANDS_SAVED_SETTINGS[band].ATT = TRX.ATT;
|
||||
TRX.ADC_Driver = true;
|
||||
LCD_UpdateQuery.TopButtons = true;
|
||||
skip_cycles = 5;
|
||||
}
|
||||
|
||||
if (new_att_val != TRX.ATT_DB)
|
||||
{
|
||||
TRX.ATT_DB = new_att_val;
|
||||
LCD_UpdateQuery.TopButtons = true;
|
||||
//save settings
|
||||
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
|
||||
TRX.BANDS_SAVED_SETTINGS[band].ATT_DB = TRX.ATT_DB;
|
||||
TRX.BANDS_SAVED_SETTINGS[band].ADC_Driver = TRX.ADC_Driver;
|
||||
TRX.BANDS_SAVED_SETTINGS[band].AutoGain_Stage = TRX_AutoGain_Stage;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -544,11 +544,14 @@ static uint8_t USBD_UA3REO_Init(USBD_HandleTypeDef *pdev)
|
|||
pdev->ep_in[DEBUG_CMD_EP & 0xFU].is_used = 1U;
|
||||
pdev->ep_in[CAT_CMD_EP & 0xFU].is_used = 1U;
|
||||
|
||||
pdev->pClassDataDEBUG = USBD_malloc(sizeof(USBD_DEBUG_HandleTypeDef));
|
||||
static USBD_DEBUG_HandleTypeDef debug_class;
|
||||
pdev->pClassDataDEBUG = &debug_class;
|
||||
memset(pdev->pClassDataDEBUG,0,sizeof(USBD_DEBUG_HandleTypeDef));
|
||||
pdev->pClassDataCAT = USBD_malloc(sizeof(USBD_CAT_HandleTypeDef));
|
||||
static USBD_CAT_HandleTypeDef cat_class;
|
||||
pdev->pClassDataCAT = &cat_class;
|
||||
memset(pdev->pClassDataCAT,0,sizeof(USBD_CAT_HandleTypeDef));
|
||||
pdev->pClassDataAUDIO = USBD_malloc(sizeof(USBD_AUDIO_HandleTypeDef));
|
||||
static USBD_AUDIO_HandleTypeDef audio_class;
|
||||
pdev->pClassDataAUDIO = &audio_class;
|
||||
memset(pdev->pClassDataAUDIO,0,sizeof(USBD_AUDIO_HandleTypeDef));
|
||||
|
||||
if (pdev->pClassDataDEBUG == NULL)
|
||||
|
@ -644,20 +647,20 @@ static uint8_t USBD_UA3REO_DeInit(USBD_HandleTypeDef *pdev)
|
|||
if (pdev->pClassDataDEBUG != NULL)
|
||||
{
|
||||
((USBD_DEBUG_ItfTypeDef *)pdev->pUserDataDEBUG)->DeInit();
|
||||
USBD_free(pdev->pClassDataDEBUG);
|
||||
pdev->pClassDataDEBUG = NULL;
|
||||
//USBD_free(pdev->pClassDataDEBUG);
|
||||
//pdev->pClassDataDEBUG = NULL;
|
||||
}
|
||||
if (pdev->pClassDataCAT != NULL)
|
||||
{
|
||||
((USBD_CAT_ItfTypeDef *)pdev->pUserDataCAT)->DeInit();
|
||||
USBD_free(pdev->pClassDataCAT);
|
||||
pdev->pClassDataCAT = NULL;
|
||||
//USBD_free(pdev->pClassDataCAT);
|
||||
//pdev->pClassDataCAT = NULL;
|
||||
}
|
||||
if (pdev->pClassDataAUDIO != NULL)
|
||||
{
|
||||
((USBD_AUDIO_ItfTypeDef *)pdev->pUserDataAUDIO)->DeInit();
|
||||
USBD_free(pdev->pClassDataAUDIO);
|
||||
pdev->pClassDataAUDIO = NULL;
|
||||
//USBD_free(pdev->pClassDataAUDIO);
|
||||
//pdev->pClassDataAUDIO = NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
#define USBD_VID 1155
|
||||
#define USBD_LANGID_STRING 1033
|
||||
#define USBD_MANUFACTURER_STRING "UA3REO"
|
||||
#define USBD_PID_FS 0xf002
|
||||
#define USBD_PID_FS 0xf001
|
||||
#define USBD_PRODUCT_STRING_FS "WOLF-Lite Transceiver"
|
||||
#define USBD_CONFIGURATION_STRING_FS "WOLF-Lite Transceiver Config"
|
||||
#define USBD_INTERFACE1_STRING_FS "WOLF-Lite Transceiver Debug/Key Port"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
:start
|
||||
"c:\Program Files\PuTTY\plink.exe" -serial COM6 -sercfg 115200,8,1,n,D
|
||||
"c:\Program Files\PuTTY\plink.exe" -serial COM5 -sercfg 115200,8,1,n,D
|
||||
GOTO start
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
|
||||
/*
|
||||
* Auto generated Run-Time-Environment Configuration File
|
||||
* *** Do not modify ! ***
|
||||
*
|
||||
* Project: 'WOLF-Lite'
|
||||
* Target: 'WOLF-Lite'
|
||||
*/
|
||||
|
||||
#ifndef RTE_COMPONENTS_H
|
||||
#define RTE_COMPONENTS_H
|
||||
|
||||
|
||||
/*
|
||||
* Define the Device Header File:
|
||||
*/
|
||||
#define CMSIS_device_header "stm32f4xx.h"
|
||||
|
||||
|
||||
|
||||
#endif /* RTE_COMPONENTS_H */
|
||||
|
||||
/*
|
||||
* Auto generated Run-Time-Environment Configuration File
|
||||
* *** Do not modify ! ***
|
||||
*
|
||||
* Project: 'WOLF-Lite'
|
||||
* Target: 'WOLF-Lite'
|
||||
*/
|
||||
|
||||
#ifndef RTE_COMPONENTS_H
|
||||
#define RTE_COMPONENTS_H
|
||||
|
||||
|
||||
/*
|
||||
* Define the Device Header File:
|
||||
*/
|
||||
#define CMSIS_device_header "stm32f4xx.h"
|
||||
|
||||
|
||||
|
||||
#endif /* RTE_COMPONENTS_H */
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<TargetName>WOLF-Lite</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<pCCUsed>6150000::V6.15::ARMCLANG</pCCUsed>
|
||||
<pCCUsed>6160000::V6.16::ARMCLANG</pCCUsed>
|
||||
<uAC6>1</uAC6>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
|
|
|
@ -41,7 +41,7 @@ __initial_sp
|
|||
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||
; </h>
|
||||
|
||||
Heap_Size EQU 0x1F00
|
||||
Heap_Size EQU 0x0000
|
||||
|
||||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||||
__heap_base
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
6.160389e+02,-1.254326e+03,2.073709e+03,-2.985762e+03,3.644892e+03,-3.211168e+03,3.367669e+00,8.934959e+03,-2.840443e+04,6.565076e+04,-1.311246e+05,2.391202e+05,-4.086516e+05,6.639102e+05,-1.035224e+06,1.559083e+06,-2.279355e+06,3.246689e+06,-4.520654e+06,6.168546e+06,-8.270048e+06,1.091595e+07,-1.421878e+07,1.831292e+07,-2.337827e+07,2.964384e+07,-3.743402e+07,4.715361e+07,-5.927014e+07,7.373269e+07,-8.732875e+07,7.814946e+07,7.814946e+07,-8.732875e+07,7.373269e+07,-5.927014e+07,4.715361e+07,-3.743402e+07,2.964384e+07,-2.337827e+07,1.831292e+07,-1.421878e+07,1.091595e+07,-8.270048e+06,6.168546e+06,-4.520654e+06,3.246689e+06,-2.279355e+06,1.559083e+06,-1.035224e+06,6.639102e+05,-4.086516e+05,2.391202e+05,-1.311246e+05,6.565076e+04,-2.840443e+04,8.934959e+03,3.367669e+00,-3.211168e+03,3.644892e+03,-2.985762e+03,2.073709e+03,-1.254326e+03,6.160389e+02
|
|
@ -0,0 +1 @@
|
|||
6.161497e+02,-1.254535e+03,2.074031e+03,-2.986189e+03,3.645372e+03,-3.211556e+03,3.366267e+00,8.935861e+03,-2.840701e+04,6.565611e+04,-1.311341e+05,2.391355e+05,-4.086745e+05,6.639421e+05,-1.035267e+06,1.559136e+06,-2.279417e+06,3.246759e+06,-4.520725e+06,6.168611e+06,-8.270094e+06,1.091596e+07,-1.421874e+07,1.831280e+07,-2.337804e+07,2.964346e+07,-3.743345e+07,4.715280e+07,-5.926902e+07,7.373120e+07,-8.732690e+07,7.814774e+07,7.814774e+07,-8.732690e+07,7.373120e+07,-5.926902e+07,4.715280e+07,-3.743345e+07,2.964346e+07,-2.337804e+07,1.831280e+07,-1.421874e+07,1.091596e+07,-8.270094e+06,6.168611e+06,-4.520725e+06,3.246759e+06,-2.279417e+06,1.559136e+06,-1.035267e+06,6.639421e+05,-4.086745e+05,2.391355e+05,-1.311341e+05,6.565611e+04,-2.840701e+04,8.935861e+03,3.366267e+00,-3.211556e+03,3.645372e+03,-2.986189e+03,2.074031e+03,-1.254535e+03,6.161497e+02
|
Ładowanie…
Reference in New Issue