Eliminate float attenuate value

master
erikkaashoek 5 years ago
parent 606ec95b5f
commit 0e022889e0

@ -747,8 +747,8 @@ typedef struct setting
// uint32_t _frequency0;
// uint32_t _frequency1;
int mode;
int _sweep_points;
float attenuate;
uint16_t _sweep_points;
int16_t attenuate_x2;
int auto_attenuation;
int atten_step;
uint32_t rbw_x10;

@ -517,6 +517,9 @@ draw_on_strut(int v0, int d, int color)
#define LOG_10_SQRT_50 ((float)0.84948500216800)
#define POW_30_20 ((float) 0.215443469)
#define POW_SQRT ((float)1.5234153789)
#define LOG_10_SQRT_50_x20_plus30 ((float)46.98970004336)
#define LOG_10_SQRT_50_x20_plus90 ((float)106.98970004336)
/*
* calculate log10f(abs(gamma))
*/
@ -535,11 +538,11 @@ value(const float v)
{
case U_DBMV:
// return v + 30.0 + 20.0*log10f(sqrt(50));
return v + 30.0 + 20.0*LOG_10_SQRT_50; //TODO convert constants to single float number as GCC compiler does runtime calculation
return v + LOG_10_SQRT_50_x20_plus30; // + 30.0 + 20.0*LOG_10_SQRT_50; //TODO convert constants to single float number as GCC compiler does runtime calculation
break;
case U_DBUV:
// return v + 90.0 + 20.0*log10f(sqrt(50.0)); //TODO convert constants to single float number as GCC compiler does runtime calculation
return v + 90.0 + 20.0*LOG_10_SQRT_50;
return v + LOG_10_SQRT_50_x20_plus90; // 90.0 + 20.0*LOG_10_SQRT_50;
break;
case U_VOLT:
// return pow(10, (v-30.0)/20.0) * sqrt((float)50.0);

@ -85,7 +85,7 @@ void reset_settings(int m)
setting.unit = U_DBM;
set_scale(10);
set_reflevel(-10);
setting.attenuate = 0;
setting.attenuate_x2 = 0;
setting.rbw_x10 = 0;
setting.average = 0;
setting.harmonic = 0;
@ -143,7 +143,7 @@ void reset_settings(int m)
case M_LOW:
set_sweep_frequency(ST_START, minFreq);
set_sweep_frequency(ST_STOP, maxFreq);
setting.attenuate = 30.0;
setting.attenuate_x2 = 60;
setting.auto_attenuation = true;
setting.sweep_time_us = 0;
break;
@ -151,7 +151,7 @@ void reset_settings(int m)
case M_ULTRA:
set_sweep_frequency(ST_START, minFreq);
set_sweep_frequency(ST_STOP, maxFreq);
setting.attenuate = 0;
setting.attenuate_x2 = 0;
setting.sweep_time_us = 0;
break;
#endif
@ -282,7 +282,7 @@ void set_measurement(int m)
for (int j = 0; j < setting._sweep_points; j++)
stored_t[j] = -150;
setting.linearity_step = 0;
setting.attenuate = 29.0;
setting.attenuate_x2 = 29*2;
setting.auto_attenuation = false;
}
#endif
@ -432,9 +432,9 @@ void set_auto_attenuation(void)
{
setting.auto_attenuation = true;
if (setting.mode == M_LOW) {
setting.attenuate = 30.0;
setting.attenuate_x2 = 60;
} else {
setting.attenuate = 0;
setting.attenuate_x2 = 0;
}
setting.atten_step = false;
dirty = true;
@ -447,18 +447,19 @@ void set_auto_reflevel(int v)
float get_attenuation(void)
{
float actual_attenuation = setting.attenuate_x2 / 2.0;
if (setting.mode == M_GENLOW) {
if (setting.atten_step)
return ( -(POWER_OFFSET + setting.attenuate - (setting.atten_step-1)*POWER_STEP + SWITCH_ATTENUATION));
return ( -(POWER_OFFSET + actual_attenuation - (setting.atten_step-1)*POWER_STEP + SWITCH_ATTENUATION));
else
return ( -POWER_OFFSET - setting.attenuate + (setting.rx_drive & 7) * 3);
return ( -POWER_OFFSET - actual_attenuation + (setting.rx_drive & 7) * 3);
} else if (setting.atten_step) {
if (setting.mode == M_LOW)
return setting.attenuate + RECEIVE_SWITCH_ATTENUATION;
return actual_attenuation + RECEIVE_SWITCH_ATTENUATION;
else
return setting.attenuate + SWITCH_ATTENUATION;
return actual_attenuation + SWITCH_ATTENUATION;
}
return(setting.attenuate);
return(actual_attenuation);
}
static pureRSSI_t get_signal_path_loss(void){
@ -531,9 +532,9 @@ void set_attenuation(float a) // Is used both in low output mode and high/
a=31.0;
if (setting.mode == M_HIGH) // No attenuator in high mode
a = 0;
if (setting.attenuate == a)
if (setting.attenuate_x2 == a*2)
return;
setting.attenuate = a;
setting.attenuate_x2 = a*2;
dirty = true;
}
@ -1019,7 +1020,7 @@ void apply_settings(void) // Ensure all settings in the setting structure
if (setting.mode == M_HIGH)
PE4302_Write_Byte(40); // Ensure defined input impedance of low port when using high input mode (power calibration)
else
PE4302_Write_Byte((int)(setting.attenuate * 2));
PE4302_Write_Byte((int)(setting.attenuate_x2));
#endif
if (setting.mode == M_LOW) {
@ -1725,7 +1726,7 @@ modulation_again:
// ----------------------------------------------------- modulation for output modes ---------------------------------------
if (MODE_OUTPUT(setting.mode)){
if (setting.modulation == MO_AM) { // AM modulation
int p = setting.attenuate * 2 + am_modulation[modulation_counter];
int p = setting.attenuate_x2 + am_modulation[modulation_counter];
if (p>63) p = 63;
else if (p< 0) p = 0;
#ifdef __PE4302__
@ -2353,17 +2354,17 @@ sweep_again: // stay in sweep loop when output mo
int changed = false;
int delta = 0;
int actual_max_level = (max_index[0] == 0 ? -100 :(int) (actual_t[max_index[0]] - get_attenuation()) ); // If no max found reduce attenuation
if (actual_max_level < AUTO_TARGET_LEVEL && setting.attenuate > 0) {
if (actual_max_level < AUTO_TARGET_LEVEL && setting.attenuate_x2 > 0) {
delta = - (AUTO_TARGET_LEVEL - actual_max_level);
} else if (actual_max_level > AUTO_TARGET_LEVEL && setting.attenuate < 30) {
} else if (actual_max_level > AUTO_TARGET_LEVEL && setting.attenuate_x2 < 60) {
delta = actual_max_level - AUTO_TARGET_LEVEL;
}
if ((chVTGetSystemTimeX() - sweep_elapsed > 10000 && delta != 0) || delta > 5 ) {
setting.attenuate += delta;
if (setting.attenuate < 0)
setting.attenuate= 0;
if (setting.attenuate > 30)
setting.attenuate = 30;
setting.attenuate_x2 += delta + delta;
if (setting.attenuate_x2 < 0)
setting.attenuate_x2= 0;
if (setting.attenuate_x2 > 60)
setting.attenuate_x2 = 60;
changed = true;
sweep_elapsed = chVTGetSystemTimeX();
}
@ -2638,7 +2639,7 @@ sweep_again: // stay in sweep loop when output mo
#ifdef __LINEARITY__
//---------------- in Linearity measurement the attenuation has to be adapted ------------------
if (setting.measurement == M_LINEARITY && setting.linearity_step < sweep_points) {
setting.attenuate = 29.0 - setting.linearity_step * 30.0 / (sweep_points);
setting.attenuate_x2 = (29.0 - setting.linearity_step * 30.0 / (sweep_points))*2.0;
dirty = true;
stored_t[setting.linearity_step] = peakLevel;
setting.linearity_step++;

Loading…
Cancel
Save

Powered by TurnKey Linux.