diff --git a/Font5x7.c b/Font5x7.c index f072dc0..984fb2d 100644 --- a/Font5x7.c +++ b/Font5x7.c @@ -604,18 +604,18 @@ const uint16_t x5x7_bits [] = /* Character (0x1f): bbw=5, bbh=7, bbx=0, bby=-1, width=5 +----------------+ - | | - | | - | | - | * | + | ** | + |* * | + |* * | + | ** | | | | | | | +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0x2000, + 0x6000, + 0x9000, + 0x9000, + 0x6000, 0x0000, 0x0000, 0x0000, diff --git a/flash.c b/flash.c index 4ef99f9..0120250 100644 --- a/flash.c +++ b/flash.c @@ -81,17 +81,22 @@ caldata_save(int id) current_config.checksum = checksum(¤t_config, sizeof current_config); flash_unlock(); + + /* erase flash pages */ void *p = dst; void *tail = p + sizeof(config_t); while (p < tail) { flash_erase_page((uint32_t)p); p += FLASH_PAGESIZE; } + + /* write to flahs */ while(count-- > 0) { flash_program_half_word((uint32_t)dst, *src++); dst++; } + /* after saving data, make active configuration points to flash */ active = (config_t*)saveareas[id]; return 0; } @@ -111,8 +116,11 @@ caldata_recall(int id) if (checksum(src, sizeof(config_t)) != 0) return -1; - memcpy(dst, src, sizeof(config_t)); + /* active configuration points to save data on flash memory */ active = src; + /* duplicated saved data onto sram to be able to modify marker/trace */ + memcpy(dst, src, sizeof(config_t)); + return 0; } diff --git a/nanovna.h b/nanovna.h index f948b59..e72af06 100644 --- a/nanovna.h +++ b/nanovna.h @@ -70,22 +70,23 @@ void ili9341_drawstring_5x7(char *str, int x, int y, uint16_t fg, uint16_t bg); /* * plot.c */ - #define OFFSETX 15 #define OFFSETY 0 #define WIDTH 291 #define HEIGHT 233 +#define GRIDY 29 + extern int area_width; extern int area_height; -void plot_init(void); -void set_sweep(int32_t start, int stop); -void redraw(void); -void force_draw_cells(void); - -void redraw_marker(int marker, int update_info); +extern const uint16_t x5x7_bits []; +extern const uint32_t numfont20x24[][24]; +#define S_PI "\034" +#define S_MICRO "\035" +#define S_OHM "\036" +#define S_DEGREE "\037" #define TRACES_MAX 4 @@ -95,21 +96,28 @@ enum { extern const char *trc_type_name[]; +// LOGMAG: SCALE, REFPOS, REFVAL +// PHASE: SCALE, REFPOS, REFVAL +// DELAY: SCALE, REFPOS, REFVAL +// SMITH: SCALE, , +// LINMAG: SCALE, REFPOS, REFVAL +// SWR: SCALE, REFPOS, REFVAL + +// Electrical Delay +// Phase + typedef struct { int enabled; int type; int channel; float scale; + //float ref; uint16_t color; uint8_t polar; } trace_t; //extern trace_t trace[TRACES_MAX]; -extern float measured[2][101][2]; - -void trace_get_info(int t, char *buf, int len); - typedef struct { int enabled; //uint32_t frequency; @@ -119,6 +127,21 @@ typedef struct { //extern marker_t markers[4]; //extern int active_marker; +void plot_init(void); +void set_sweep(int32_t start, int stop); +void redraw(void); +void force_draw_cells(void); +void redraw_marker(int marker, int update_info); +void trace_get_info(int t, char *buf, int len); +void plot_into_index(float measured[2][101][2]); +void draw_cell_all(void); + + +/* + * main.c + */ +extern float measured[2][101][2]; + #define CAL_LOAD 0 #define CAL_OPEN 1 #define CAL_SHORT 2 @@ -144,20 +167,9 @@ typedef struct { #define ETERM_EX 4 /* error term isolation */ -void plot_into_index(float measured[2][101][2]); -void draw_cell_all(void); - -extern const uint16_t x5x7_bits []; -extern const uint32_t numfont20x24[][24]; - -#define CHAR_PI '\0x1c' -#define CHAR_MICRO '\0x1d' -#define CHAR_OHM '\0x1e' - /* * flash.c */ - #define SAVEAREA_MAX 5 typedef struct { @@ -193,16 +205,20 @@ extern config_t current_config; #define markers current_config._markers #define active_marker current_config._active_marker - int caldata_save(int id); int caldata_recall(int id); - - - - -#define PULSE do { palClearPad(GPIOC, GPIOC_LED); palSetPad(GPIOC, GPIOC_LED);} while(0) - +/* + * ui.c + */ void ui_init(void); void ui_show(void); void ui_hide(void); + + +/* + * misclinous + */ +#define PULSE do { palClearPad(GPIOC, GPIOC_LED); palSetPad(GPIOC, GPIOC_LED);} while(0) + +/*EOF*/ diff --git a/plot.c b/plot.c index 3bedc54..831bba4 100644 --- a/plot.c +++ b/plot.c @@ -164,7 +164,7 @@ rectangular_grid(int x, int y) //if (((x - grid_offset) % grid_width) == 0) if (x == 0 || x == (WIDTH-1)) return c; - if ((y % 29) == 0) + if ((y % GRIDY) == 0) return c; if ((((x + grid_offset) * 10) % grid_width) < 10) return c; @@ -187,7 +187,7 @@ int rectangular_grid_y(int y) { int c = grid_color; - if ((y % 29) == 0) + if ((y % GRIDY) == 0) return c; return 0; } @@ -304,22 +304,96 @@ trace_into_index(int x, int t, int i, float coeff[2]) } if (v < 0) v = 0; if (v > 8) v = 8; - y = v * 29; + y = v * GRIDY; return INDEX(x, y, i); } +int +string_value_with_prefix(char *buf, int len, float val, char unit) +{ + char prefix; + int n; + if (val < 1e-12) { + prefix = 'f'; + val *= 1e15; + } else if (val < 1e-9) { + prefix = 'p'; + val *= 1e12; + } else if (val < 1e-6) { + prefix = 'n'; + val *= 1e9; + } else if (val < 1e-3) { + prefix = S_MICRO[0]; + val *= 1e6; + } else if (val < 1) { + prefix = 'm'; + val *= 1e3; + } else if (val < 1e3) { + prefix = 0; + } else if (val < 1e6) { + prefix = 'k'; + val /= 1e3; + } else if (val < 1e9) { + prefix = 'M'; + val /= 1e6; + } else { + prefix = 'G'; + val /= 1e9; + } + + if (val < 10) { + n = chsnprintf(buf, len, "%.2f", val); + } else if (val < 100) { + n = chsnprintf(buf, len, "%.1f", val); + } else { + n = chsnprintf(buf, len, "%d", (int)val); + } + + if (prefix) + buf[n++] = prefix; + if (unit) + buf[n++] = unit; + buf[n] = '\0'; + return n; +} + + +#define PI2 6.283184 + void -trace_get_value_string(int t, char *buf, int len, float coeff[2]) +gamma2imp(char *buf, int len, const float coeff[2], uint32_t frequency) +{ + // z = (gamma+1)/(gamma-1) * z0 + float z0 = 50; + float d = z0 / ((1-coeff[0])*(1-coeff[0])+coeff[1]*coeff[1]); + float zr = ((1+coeff[0])*(1-coeff[0]) + coeff[1]*coeff[1]) * d; + float zi = 2*coeff[1] * d; + int n; + + n = string_value_with_prefix(buf, len, zr, S_OHM[0]); + buf[n++] = ' '; + + if (zi < 0) { + float c = -1 / (PI2 * frequency * zi); + string_value_with_prefix(buf+n, len-n, c, 'F'); + } else { + float l = zi / (PI2 * frequency); + string_value_with_prefix(buf+n, len-n, l, 'H'); + } +} + +void +trace_get_value_string(int t, char *buf, int len, float coeff[2], uint32_t frequency) { float v; switch (trace[t].type) { case TRC_LOGMAG: v = logmag(coeff); - chsnprintf(buf, len, "%.2f dB", v * 10); + chsnprintf(buf, len, "%.2fdB", v * 10); break; case TRC_PHASE: v = phase(coeff); - chsnprintf(buf, len, "%.2f deg", v * 90); + chsnprintf(buf, len, "%.2f" S_DEGREE, v * 90); break; case TRC_LINEAR: v = linear(coeff); @@ -330,6 +404,10 @@ trace_get_value_string(int t, char *buf, int len, float coeff[2]) chsnprintf(buf, len, "%.2f", v); break; case TRC_SMITH: + gamma2imp(buf, len, coeff, frequency); + break; + case TRC_ADMIT: + case TRC_POLAR: chsnprintf(buf, len, "%.2f %.2fj", coeff[0], coeff[1]); break; } @@ -341,21 +419,21 @@ trace_get_info(int t, char *buf, int len) const char *type = trc_type_name[trace[t].type]; switch (trace[t].type) { case TRC_LOGMAG: - chsnprintf(buf, len, "Ch%d %s %ddB/", + chsnprintf(buf, len, "CH%d %s %ddB/", trace[t].channel, type, (int)(trace[t].scale*10)); break; case TRC_PHASE: - chsnprintf(buf, len, "Ch%d %s %ddeg/", + chsnprintf(buf, len, "CH%d %s %d" S_DEGREE "/", trace[t].channel, type, (int)(trace[t].scale*90)); break; case TRC_SMITH: case TRC_ADMIT: case TRC_POLAR: - chsnprintf(buf, len, "Ch%d %s %.1fFS", + chsnprintf(buf, len, "CH%d %s %.1fFS", trace[t].channel, type, trace[t].scale); break; default: - chsnprintf(buf, len, "Ch%d %s %.1f/", + chsnprintf(buf, len, "CH%d %s %.1f/", trace[t].channel, type, trace[t].scale); break; } @@ -879,14 +957,14 @@ cell_draw_marker_info(int m, int n, int w, int h) for (t = 0; t < TRACES_MAX; t++) { if (!trace[t].enabled) continue; - int xpos = 1 + (j%2)*152; + int xpos = 1 + (j%2)*146; int ypos = 1 + (j/2)*7; xpos -= m * CELLWIDTH; ypos -= n * CELLHEIGHT; trace_get_info(t, buf, sizeof buf); cell_drawstring_5x7(w, h, buf, xpos, ypos, trace[t].color); xpos += 84; - trace_get_value_string(t, buf, sizeof buf, measured[trace[t].channel][idx]); + trace_get_value_string(t, buf, sizeof buf, measured[trace[t].channel][idx], frequencies[idx]); cell_drawstring_5x7(w, h, buf, xpos, ypos, trace[t].color); j++; }