Added attack and decay

master
erikkaashoek 5 years ago
parent 81a250d6ea
commit b8c04980a9

@ -23,7 +23,7 @@
#include <stdint.h> #include <stdint.h>
#include "nanovna.h" #include "nanovna.h"
#ifdef wFONT_GET_WIDTH
/* /*
* Check 1 byte of bitmap data for get width * Check 1 byte of bitmap data for get width
*/ */
@ -1714,3 +1714,4 @@ const uint8_t x10x14_bits[(127-wFONT_START_CHAR)*wFONT_GET_HEIGHT*2] =
_BMP16(0b0000000000000000), // | | _BMP16(0b0000000000000000), // | |
_BMP16(0b0000000000000000), // | | _BMP16(0b0000000000000000), // | |
}; };
#endif

@ -643,6 +643,7 @@ void ili9341_drawstring_7x13(const char *str, int x, int y)
void ili9341_drawstring_10x14(const char *str, int x, int y) void ili9341_drawstring_10x14(const char *str, int x, int y)
{ {
#ifdef wFONT_GET_DATA
int x_pos = x; int x_pos = x;
while (*str) { while (*str) {
uint8_t ch = *str++; uint8_t ch = *str++;
@ -654,6 +655,9 @@ void ili9341_drawstring_10x14(const char *str, int x, int y)
x += w; x += w;
} }
bit_align = 0; bit_align = 0;
#else
ili9341_drawstring_size(str, x, y, 2);
#endif
} }
void ili9341_drawstringV(const char *str, int x, int y) void ili9341_drawstringV(const char *str, int x, int y)

@ -83,7 +83,9 @@ static volatile vna_shellcmd_t shell_function = 0;
#define ENABLE_INFO_COMMAND #define ENABLE_INFO_COMMAND
// Enable color command, allow change config color for traces, grid, menu // Enable color command, allow change config color for traces, grid, menu
#define ENABLE_COLOR_COMMAND #define ENABLE_COLOR_COMMAND
#ifdef __USE_SERIAL_CONSOLE__
#define ENABLE_USART_COMMAND #define ENABLE_USART_COMMAND
#endif
#ifdef __VNA__ #ifdef __VNA__
static void apply_error_term_at(int i); static void apply_error_term_at(int i);
static void apply_edelay_at(int i); static void apply_edelay_at(int i);

@ -42,6 +42,7 @@
#define __SCROLL__ #define __SCROLL__
#define __ICONS__ #define __ICONS__
#define __MEASURE__ #define __MEASURE__
//#define __LINEARITY__ // Not available
#define __SELFTEST__ #define __SELFTEST__
#define __CALIBRATE__ #define __CALIBRATE__
#define __FAST_SWEEP__ // Pre-fill SI4432 RSSI buffer to get fastest sweep in zero span mode #define __FAST_SWEEP__ // Pre-fill SI4432 RSSI buffer to get fastest sweep in zero span mode
@ -49,6 +50,9 @@
//#define __ULTRA__ // Add harmonics mode on low input. //#define __ULTRA__ // Add harmonics mode on low input.
#define __SPUR__ // Does spur reduction by shifting IF #define __SPUR__ // Does spur reduction by shifting IF
//#define __USE_SERIAL_CONSOLE__ // Enable serial I/O connection (need enable HAL_USE_SERIAL as TRUE in halconf.h) //#define __USE_SERIAL_CONSOLE__ // Enable serial I/O connection (need enable HAL_USE_SERIAL as TRUE in halconf.h)
#define __QUASI_PEAK__
#ifdef TINYSA3 #ifdef TINYSA3
#define DEFAULT_IF 433800000 #define DEFAULT_IF 433800000
#define DEFAULT_SPUR_IF 434000000 #define DEFAULT_SPUR_IF 434000000
@ -162,7 +166,7 @@ void toggle_mute(void);
void load_default_properties(void); void load_default_properties(void);
enum { enum {
AV_OFF, AV_MIN, AV_MAX_HOLD, AV_MAX_DECAY, AV_4, AV_16 AV_OFF, AV_MIN, AV_MAX_HOLD, AV_MAX_DECAY, AV_4, AV_16, AV_QUASI
}; };
enum { enum {
M_LOW, M_HIGH, M_GENLOW, M_GENHIGH, M_ULTRA M_LOW, M_HIGH, M_GENLOW, M_GENHIGH, M_ULTRA
@ -253,6 +257,7 @@ void toggle_AGC(void);
void redrawHisto(void); void redrawHisto(void);
void self_test(int); void self_test(int);
void set_decay(int); void set_decay(int);
void set_attack(int);
void set_noise(int); void set_noise(int);
void toggle_tracking_output(void); void toggle_tracking_output(void);
extern int32_t frequencyExtra; extern int32_t frequencyExtra;
@ -390,16 +395,20 @@ extern const uint8_t numfont16x22[];
#define bFONT_WIDTH 7 #define bFONT_WIDTH 7
#define bFONT_GET_HEIGHT 11 #define bFONT_GET_HEIGHT 11
#define bFONT_STR_HEIGHT 11 #define bFONT_STR_HEIGHT 11
#define bFONT_GET_DATA(ch) ( &x7x11b_bits[(ch-bFONT_START_CHAR)*bFONT_GET_HEIGHT]) #define bFONT_GET_DATA(ch) ( &x7x11b_bits[(ch-bFONT_START_CHAR)*bFONT_GET_HEIGHT])
#define bFONT_GET_WIDTH(ch) (8-(x7x11b_bits[(ch-bFONT_START_CHAR)*bFONT_GET_HEIGHT]&7)) #define bFONT_GET_WIDTH(ch) (8-(x7x11b_bits[(ch-bFONT_START_CHAR)*bFONT_GET_HEIGHT]&7))
#if 1 // Set to 0 to save 3kByte
#define wFONT_START_CHAR 0x17 #define wFONT_START_CHAR 0x17
#define wFONT_MAX_WIDTH 12 #define wFONT_MAX_WIDTH 12
#define wFONT_GET_HEIGHT 14 #define wFONT_GET_HEIGHT 14
#define wFONT_STR_HEIGHT 16 #define wFONT_STR_HEIGHT 16
#define wFONT_GET_DATA(ch) ( &x10x14_bits[(ch-wFONT_START_CHAR)*2*wFONT_GET_HEIGHT ]) #define wFONT_GET_DATA(ch) ( &x10x14_bits[(ch-wFONT_START_CHAR)*2*wFONT_GET_HEIGHT ])
#define wFONT_GET_WIDTH(ch) (14-(x10x14_bits[(ch-wFONT_START_CHAR)*2*wFONT_GET_HEIGHT+1]&0x7)) #define wFONT_GET_WIDTH(ch) (14-(x10x14_bits[(ch-wFONT_START_CHAR)*2*wFONT_GET_HEIGHT+1]&0x7))
#else
#define wFONT_MAX_WIDTH 12
#define wFONT_GET_HEIGHT 14
#endif
#define NUM_FONT_GET_WIDTH 16 #define NUM_FONT_GET_WIDTH 16
#define NUM_FONT_GET_HEIGHT 22 #define NUM_FONT_GET_HEIGHT 22
@ -749,6 +758,7 @@ typedef struct setting
int test; int test;
int harmonic; int harmonic;
int decay; int decay;
int attack;
int noise; int noise;
uint32_t vbw_x10; uint32_t vbw_x10;
int tracking_output; int tracking_output;

@ -1852,7 +1852,6 @@ cell_drawstring(char *str, int x, int y)
x += w; x += w;
} }
} }
void void
cell_drawstring_7x13(char *str, int x, int y) cell_drawstring_7x13(char *str, int x, int y)
{ {
@ -1871,6 +1870,7 @@ cell_drawstring_7x13(char *str, int x, int y)
void void
cell_drawstring_10x14(char *str, int x, int y) cell_drawstring_10x14(char *str, int x, int y)
{ {
#ifdef wFONT_GET_DATA
if (y <= -wFONT_GET_HEIGHT || y >= CELLHEIGHT) if (y <= -wFONT_GET_HEIGHT || y >= CELLHEIGHT)
return; return;
while (*str) { while (*str) {
@ -1881,9 +1881,12 @@ cell_drawstring_10x14(char *str, int x, int y)
cell_blit_bitmap(x, y, w <=8 ? 9 : w, wFONT_GET_HEIGHT, wFONT_GET_DATA(ch)); cell_blit_bitmap(x, y, w <=8 ? 9 : w, wFONT_GET_HEIGHT, wFONT_GET_DATA(ch));
x+=w; x+=w;
} }
#else
cell_drawstring_size(str, x, y, 2);
#endif
} }
#if 0 #ifndef wFONT_GET_DATA
static int static int
cell_drawchar_size(uint8_t ch, int x, int y, int size) cell_drawchar_size(uint8_t ch, int x, int y, int size)
{ {

@ -122,6 +122,7 @@ void reset_settings(int m)
setting.vbw_x10 = 0; setting.vbw_x10 = 0;
setting.auto_reflevel = true; // Must be after SetReflevel setting.auto_reflevel = true; // Must be after SetReflevel
setting.decay=20; setting.decay=20;
setting.attack=1;
setting.noise=5; setting.noise=5;
setting.below_IF = S_AUTO_OFF; setting.below_IF = S_AUTO_OFF;
setting.repeat = 1; setting.repeat = 1;
@ -226,12 +227,28 @@ void set_refer_output(int v)
void set_decay(int d) void set_decay(int d)
{ {
if (d < 0 || d > 200) if (d < 0 || d > 1000000)
return; return;
if (setting.frequency_step == 0) { // decay in ms
d = (float)d * 500.0 * (float)sweep_points / (float)setting.actual_sweep_time_us;
}
setting.decay = d; setting.decay = d;
dirty = true; dirty = true;
} }
#ifdef __QUASI_PEAK__
void set_attack(int d)
{
if (d < 0 || d > 20000)
return;
if (setting.frequency_step == 0 && d>0) { // decay in ms
d = (float)d * 500.0 * (float)sweep_points / (float)setting.actual_sweep_time_us;
}
setting.attack = d;
dirty = true;
}
#endif
void set_noise(int d) void set_noise(int d)
{ {
if (d < 2 || d > 50) if (d < 2 || d > 50)
@ -262,10 +279,10 @@ void set_10mhz(uint32_t f)
update_grid(); update_grid();
} }
void set_measurement(int m) void set_measurement(int m)
{ {
setting.measurement = m; setting.measurement = m;
#ifdef __LINEARITY__
if (m == M_LINEARITY) { if (m == M_LINEARITY) {
trace[TRACE_STORED].enabled = true; trace[TRACE_STORED].enabled = true;
for (int j = 0; j < setting._sweep_points; j++) for (int j = 0; j < setting._sweep_points; j++)
@ -274,8 +291,10 @@ void set_measurement(int m)
setting.attenuate = 29.0; setting.attenuate = 29.0;
setting.auto_attenuation = false; setting.auto_attenuation = false;
} }
#endif
dirty = true; dirty = true;
} }
void set_drive(int d) void set_drive(int d)
{ {
setting.drive = d; setting.drive = d;
@ -669,7 +688,11 @@ void set_offset_delay(int d) // override RSSI measurement delay
void set_average(int v) void set_average(int v)
{ {
setting.average = v; setting.average = v;
trace[TRACE_TEMP].enabled = (v != 0); trace[TRACE_TEMP].enabled = ((v != 0)
#ifdef __QUASI_PEAK__
&& (v != AV_QUASI)
#endif
);
//dirty = true; // No HW update required, only status panel refresh //dirty = true; // No HW update required, only status panel refresh
} }
@ -2082,16 +2105,16 @@ sweep_again: // stay in sweep loop when output mo
} }
#endif #endif
if (scandirty || setting.average == AV_OFF) { // Level calculations if (scandirty || setting.average == AV_OFF) { // Level calculations
actual_t[i] = RSSI;
age[i] = 0; age[i] = 0;
actual_t[i] = RSSI;
} else { } else {
switch(setting.average) { switch(setting.average) {
case AV_MIN: if (actual_t[i] > RSSI) actual_t[i] = RSSI; break; case AV_MIN: if (actual_t[i] > RSSI) actual_t[i] = RSSI; break;
case AV_MAX_HOLD: if (actual_t[i] < RSSI) actual_t[i] = RSSI; break; case AV_MAX_HOLD: if (actual_t[i] < RSSI) actual_t[i] = RSSI; break;
case AV_MAX_DECAY: case AV_MAX_DECAY:
if (actual_t[i] < RSSI) { if (actual_t[i] < RSSI) {
actual_t[i] = RSSI;
age[i] = 0; age[i] = 0;
actual_t[i] = RSSI;
} else { } else {
if (age[i] > setting.decay) if (age[i] > setting.decay)
actual_t[i] -= 0.5; actual_t[i] -= 0.5;
@ -2101,6 +2124,20 @@ sweep_again: // stay in sweep loop when output mo
break; break;
case AV_4: actual_t[i] = (actual_t[i]*3 + RSSI) / 4.0; break; case AV_4: actual_t[i] = (actual_t[i]*3 + RSSI) / 4.0; break;
case AV_16: actual_t[i] = (actual_t[i]*15 + RSSI) / 16.0; break; case AV_16: actual_t[i] = (actual_t[i]*15 + RSSI) / 16.0; break;
#ifdef __QUASI_PEAK__
case AV_QUASI:
{ static float old_RSSI = -150.0;
if (i == 0) old_RSSI = actual_t[sweep_points-1];
if (RSSI > old_RSSI && setting.attack > 1)
old_RSSI += (RSSI - old_RSSI)/setting.attack;
else if (RSSI < old_RSSI && setting.decay > 1)
old_RSSI += (RSSI - old_RSSI)/setting.decay;
else
old_RSSI = RSSI;
actual_t[i] = old_RSSI;
}
break;
#endif
} }
} }
@ -2554,16 +2591,15 @@ sweep_again: // stay in sweep loop when output mo
#endif #endif
#ifdef __LINEARITY__
//---------------- in Linearity measurement the attenuation has to be adapted ------------------ //---------------- in Linearity measurement the attenuation has to be adapted ------------------
if (setting.measurement == M_LINEARITY && setting.linearity_step < sweep_points) { if (setting.measurement == M_LINEARITY && setting.linearity_step < sweep_points) {
setting.attenuate = 29.0 - setting.linearity_step * 30.0 / (sweep_points); setting.attenuate = 29.0 - setting.linearity_step * 30.0 / (sweep_points);
dirty = true; dirty = true;
stored_t[setting.linearity_step] = peakLevel; stored_t[setting.linearity_step] = peakLevel;
setting.linearity_step++; setting.linearity_step++;
} }
#endif
// redraw_marker(peak_marker, FALSE); // redraw_marker(peak_marker, FALSE);
// STOP_PROFILE; // STOP_PROFILE;
#ifdef TINYSA3 #ifdef TINYSA3
@ -2716,7 +2752,7 @@ marker_search_right_min(int from)
// -------------------------- CAL STATUS --------------------------------------------- // -------------------------- CAL STATUS ---------------------------------------------
const char * const averageText[] = { "OFF", "MIN", "MAX", "MAXD", " A 4", "A 16"}; const char * const averageText[] = { "OFF", "MIN", "MAX", "MAXD", " A 4", "A 16","QUASI"};
const char * const dBText[] = { "1dB/", "2dB/", "5dB/", "10dB/", "20dB/"}; const char * const dBText[] = { "1dB/", "2dB/", "5dB/", "10dB/", "20dB/"};
const int refMHz[] = { 30, 15, 10, 4, 3, 2, 1 }; const int refMHz[] = { 30, 15, 10, 4, 3, 2, 1 };

@ -408,6 +408,7 @@ enum {
KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE, KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE,
KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY, KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY,
KM_FAST_SPEEDUP, KM_GRIDLINES, KM_MARKER, KM_MODULATION,KM_COR_AM,KM_COR_WFM, KM_COR_NFM, KM_FAST_SPEEDUP, KM_GRIDLINES, KM_MARKER, KM_MODULATION,KM_COR_AM,KM_COR_WFM, KM_COR_NFM,
KM_ATTACK,
KM_NONE // always at enum end KM_NONE // always at enum end
}; };
@ -428,7 +429,7 @@ static const struct {
{keypads_positive , "SAMPLE\nDELAY"}, // sample delay {keypads_positive , "SAMPLE\nDELAY"}, // sample delay
{keypads_positive , "DRIVE"}, // drive {keypads_positive , "DRIVE"}, // drive
{keypads_plusmin , "LEVEL"}, // KM_LOWOUTLEVEL {keypads_plusmin , "LEVEL"}, // KM_LOWOUTLEVEL
{keypads_positive , "SCANS"}, // KM_DECAY {keypads_positive , "DECAY"}, // KM_DECAY
{keypads_positive , "NOISE\nLEVEL"}, // KM_NOISE {keypads_positive , "NOISE\nLEVEL"}, // KM_NOISE
{keypads_freq , "FREQ"}, // KM_10MHz {keypads_freq , "FREQ"}, // KM_10MHz
{keypads_positive , "SAMPLE\nREPEAT"}, // KM_REPEA {keypads_positive , "SAMPLE\nREPEAT"}, // KM_REPEA
@ -444,6 +445,8 @@ static const struct {
{keypads_plusmin , "COR\nAM"}, // KM_COR_AM {keypads_plusmin , "COR\nAM"}, // KM_COR_AM
{keypads_plusmin , "COR\nWFM"}, // KM_COR_WFM {keypads_plusmin , "COR\nWFM"}, // KM_COR_WFM
{keypads_plusmin , "COR\nNFM"}, // KM_COR_NFM {keypads_plusmin , "COR\nNFM"}, // KM_COR_NFM
{keypads_positive , "ATTACK"}, // KM_ATTACK
}; };
// ===[MENU CALLBACKS]========================================================= // ===[MENU CALLBACKS]=========================================================
@ -832,7 +835,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb)
// SetAverage(4); // SetAverage(4);
break; break;
case M_PASS_BAND: // Stop band measurement case M_PASS_BAND: // pass band measurement
// reset_settings(setting.mode); // reset_settings(setting.mode);
markers[0].enabled = M_ENABLED; markers[0].enabled = M_ENABLED;
markers[0].mtype = M_REFERENCE | M_TRACKING; markers[0].mtype = M_REFERENCE | M_TRACKING;
@ -851,9 +854,11 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb)
// SetAverage(4); // SetAverage(4);
break; break;
#ifdef __LINEARITY__
case M_LINEARITY: case M_LINEARITY:
set_measurement(M_LINEARITY); set_measurement(M_LINEARITY);
break; break;
#endif
case M_AM: // AM case M_AM: // AM
reset_settings(setting.mode); reset_settings(setting.mode);
for (int i = 0; i< 3; i++) { for (int i = 0; i< 3; i++) {
@ -1457,6 +1462,9 @@ static const menuitem_t menu_average[] = {
{ MT_ADV_CALLBACK, 3, "MAX\nDECAY", menu_average_acb}, { MT_ADV_CALLBACK, 3, "MAX\nDECAY", menu_average_acb},
{ MT_ADV_CALLBACK, 4, "AVER 4", menu_average_acb}, { MT_ADV_CALLBACK, 4, "AVER 4", menu_average_acb},
{ MT_ADV_CALLBACK, 5, "AVER 16", menu_average_acb}, { MT_ADV_CALLBACK, 5, "AVER 16", menu_average_acb},
#ifdef __QUASI_PEAK__
{ MT_ADV_CALLBACK, 6, "QUASI\nPEAK", menu_average_acb},
#endif
{ MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_CANCEL, 0, S_LARROW" BACK", NULL },
{ MT_NONE, 0, NULL, NULL } // sentinel { MT_NONE, 0, NULL, NULL } // sentinel
}; };
@ -1682,8 +1690,12 @@ static const menuitem_t menu_settings2[] =
{ MT_ADV_CALLBACK, 0, "LNA", menu_settings_lna_acb}, { MT_ADV_CALLBACK, 0, "LNA", menu_settings_lna_acb},
{ MT_ADV_CALLBACK | MT_LOW, 0, "BPF", menu_settings_bpf_acb}, { MT_ADV_CALLBACK | MT_LOW, 0, "BPF", menu_settings_bpf_acb},
{ MT_ADV_CALLBACK | MT_LOW, 0, "BELOW IF", menu_settings_below_if_acb}, { MT_ADV_CALLBACK | MT_LOW, 0, "BELOW IF", menu_settings_below_if_acb},
{ MT_KEYPAD, KM_DECAY, "HOLD\nSWEEPS", "1..1000 sweeps"}, { MT_KEYPAD, KM_DECAY, "DECAY", "0..1000000ms or sweeps"},
#ifdef __QUASI_PEAK__
{ MT_KEYPAD, KM_ATTACK, "ATTACK", "0..100000ms"},
#else
{ MT_KEYPAD, KM_NOISE, "NOISE\nLEVEL", "2..20 dB"}, { MT_KEYPAD, KM_NOISE, "NOISE\nLEVEL", "2..20 dB"},
#endif
#ifdef __ULTRA__ #ifdef __ULTRA__
{ MT_SUBMENU,0, "HARMONIC", menu_harmonic}, { MT_SUBMENU,0, "HARMONIC", menu_harmonic},
#endif #endif
@ -2019,8 +2031,14 @@ static void fetch_numeric_target(void)
break; break;
case KM_DECAY: case KM_DECAY:
uistat.value = setting.decay; uistat.value = setting.decay;
plot_printf(uistat.text, sizeof uistat.text, "%3d", ((int32_t)uistat.value)); plot_printf(uistat.text, sizeof uistat.text, "%5d", ((int32_t)uistat.value));
break; break;
#ifdef __QUASI_PEAK__
case KM_ATTACK:
uistat.value = setting.attack;
plot_printf(uistat.text, sizeof uistat.text, "%5d", ((int32_t)uistat.value));
break;
#endif
case KM_NOISE: case KM_NOISE:
uistat.value = setting.noise; uistat.value = setting.noise;
plot_printf(uistat.text, sizeof uistat.text, "%3d", ((int32_t)uistat.value)); plot_printf(uistat.text, sizeof uistat.text, "%3d", ((int32_t)uistat.value));
@ -2133,6 +2151,11 @@ set_numeric_value(void)
case KM_DECAY: case KM_DECAY:
set_decay(uistat.value); set_decay(uistat.value);
break; break;
#ifdef __QUASI_PEAK__
case KM_ATTACK:
set_attack(uistat.value);
break;
#endif
case KM_NOISE: case KM_NOISE:
set_noise(uistat.value); set_noise(uistat.value);
break; break;

Loading…
Cancel
Save

Powered by TurnKey Linux.