mirror of
https://github.com/ttrftech/NanoVNA.git
synced 2025-12-06 03:31:59 +01:00
Cleanup and optimize code Add comments, fix definitions Fix rounding errors Fix band 1 stability mcuconf.h Set I2C bus clock to SYSCLK (more fast) Apply 400kHz bus I2C clock timings for 8MHz and 48Mhz clock main.c Remove and reset some variables Add separate sweep for calibration (allow calibrate if sweep paused) Increase main thread stack (need for run calibrate, possibly need execute some commands in sweep threads for reduce stack usage)
491 lines
13 KiB
C
491 lines
13 KiB
C
/*
|
|
* Copyright (c) 2014-2015, TAKAHASHI Tomohiro (TTRFTECH) edy555@gmail.com
|
|
* All rights reserved.
|
|
*
|
|
* This is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3, or (at your option)
|
|
* any later version.
|
|
*
|
|
* The software is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with GNU Radio; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
#include "ch.h"
|
|
|
|
// Need enable HAL_USE_SPI in halconf.h
|
|
#define __USE_DISPLAY_DMA__
|
|
|
|
/*
|
|
* main.c
|
|
*/
|
|
#define START_MIN 50000
|
|
#define STOP_MAX 2700000000U
|
|
|
|
#define POINTS_COUNT 101
|
|
extern float measured[2][POINTS_COUNT][2];
|
|
|
|
#define CAL_LOAD 0
|
|
#define CAL_OPEN 1
|
|
#define CAL_SHORT 2
|
|
#define CAL_THRU 3
|
|
#define CAL_ISOLN 4
|
|
|
|
#define CALSTAT_LOAD (1<<0)
|
|
#define CALSTAT_OPEN (1<<1)
|
|
#define CALSTAT_SHORT (1<<2)
|
|
#define CALSTAT_THRU (1<<3)
|
|
#define CALSTAT_ISOLN (1<<4)
|
|
#define CALSTAT_ES (1<<5)
|
|
#define CALSTAT_ER (1<<6)
|
|
#define CALSTAT_ET (1<<7)
|
|
#define CALSTAT_ED CALSTAT_LOAD
|
|
#define CALSTAT_EX CALSTAT_ISOLN
|
|
#define CALSTAT_APPLY (1<<8)
|
|
#define CALSTAT_INTERPOLATED (1<<9)
|
|
|
|
#define ETERM_ED 0 /* error term directivity */
|
|
#define ETERM_ES 1 /* error term source match */
|
|
#define ETERM_ER 2 /* error term refrection tracking */
|
|
#define ETERM_ET 3 /* error term transmission tracking */
|
|
#define ETERM_EX 4 /* error term isolation */
|
|
|
|
#define DOMAIN_MODE (1<<0)
|
|
#define DOMAIN_FREQ (0<<0)
|
|
#define DOMAIN_TIME (1<<0)
|
|
#define TD_FUNC (0b11<<1)
|
|
#define TD_FUNC_BANDPASS (0b00<<1)
|
|
#define TD_FUNC_LOWPASS_IMPULSE (0b01<<1)
|
|
#define TD_FUNC_LOWPASS_STEP (0b10<<1)
|
|
#define TD_WINDOW (0b11<<3)
|
|
#define TD_WINDOW_NORMAL (0b00<<3)
|
|
#define TD_WINDOW_MINIMUM (0b01<<3)
|
|
#define TD_WINDOW_MAXIMUM (0b10<<3)
|
|
|
|
#define FFT_SIZE 256
|
|
|
|
void cal_collect(int type);
|
|
void cal_done(void);
|
|
|
|
#define MAX_FREQ_TYPE 5
|
|
enum stimulus_type {
|
|
ST_START=0, ST_STOP, ST_CENTER, ST_SPAN, ST_CW
|
|
};
|
|
|
|
void set_sweep_frequency(int type, uint32_t frequency);
|
|
uint32_t get_sweep_frequency(int type);
|
|
|
|
double my_atof(const char *p);
|
|
|
|
void toggle_sweep(void);
|
|
void loadDefaultProps(void);
|
|
|
|
#define SWEEP_MODE_ENABLED 0x01
|
|
#define SWEEP_MODE_RUN_ONCE 0x02
|
|
extern volatile int8_t sweep_mode;
|
|
|
|
/*
|
|
* dsp.c
|
|
*/
|
|
// 5ms @ 48kHz
|
|
#define AUDIO_BUFFER_LEN 96
|
|
|
|
extern int16_t rx_buffer[];
|
|
|
|
#define STATE_LEN 32
|
|
#define SAMPLE_LEN 48
|
|
|
|
#ifdef ENABLED_DUMP
|
|
extern int16_t ref_buf[];
|
|
extern int16_t samp_buf[];
|
|
#endif
|
|
|
|
void dsp_process(int16_t *src, size_t len);
|
|
void reset_dsp_accumerator(void);
|
|
void calculate_gamma(float *gamma);
|
|
void fetch_amplitude(float *gamma);
|
|
void fetch_amplitude_ref(float *gamma);
|
|
|
|
/*
|
|
* tlv320aic3204.c
|
|
*/
|
|
|
|
extern void tlv320aic3204_init(void);
|
|
extern void tlv320aic3204_set_gain(int lgain, int rgain);
|
|
extern void tlv320aic3204_select(int channel);
|
|
|
|
/*
|
|
* plot.c
|
|
*/
|
|
|
|
// Offset of plot area
|
|
#define OFFSETX 10
|
|
#define OFFSETY 0
|
|
|
|
// WIDTH better be n*(POINTS_COUNT-1)
|
|
#define WIDTH 300
|
|
// HEIGHT = 8*GRIDY
|
|
#define HEIGHT 232
|
|
|
|
//#define NGRIDY 10
|
|
#define NGRIDY 8
|
|
|
|
#define FREQUENCIES_XPOS1 OFFSETX
|
|
#define FREQUENCIES_XPOS2 200
|
|
#define FREQUENCIES_YPOS (240-7)
|
|
|
|
// GRIDX calculated depends from frequency span
|
|
//#define GRIDY 29
|
|
#define GRIDY (HEIGHT / NGRIDY)
|
|
|
|
//
|
|
#define CELLOFFSETX 5
|
|
#define AREA_WIDTH_NORMAL (CELLOFFSETX + WIDTH + 1 + 4)
|
|
#define AREA_HEIGHT_NORMAL ( HEIGHT + 1)
|
|
|
|
// Smith/polar chart
|
|
#define P_CENTER_X (CELLOFFSETX + WIDTH/2)
|
|
#define P_CENTER_Y (HEIGHT/2)
|
|
#define P_RADIUS (HEIGHT/2)
|
|
|
|
extern int16_t area_width;
|
|
extern int16_t area_height;
|
|
|
|
// font
|
|
extern const uint8_t x5x7_bits [];
|
|
#define FONT_GET_DATA(ch) (&x5x7_bits[ch*7])
|
|
#define FONT_GET_WIDTH(ch) (8-(x5x7_bits[ch*7]&7))
|
|
#define FONT_MAX_WIDTH 7
|
|
#define FONT_GET_HEIGHT 7
|
|
|
|
extern const uint16_t numfont16x22[];
|
|
#define NUM_FONT_GET_DATA(ch) (&numfont16x22[ch*22])
|
|
#define NUM_FONT_GET_WIDTH 16
|
|
#define NUM_FONT_GET_HEIGHT 22
|
|
|
|
#define S_DELTA "\004"
|
|
#define S_DEGREE "\037"
|
|
#define S_SARROW "\030"
|
|
#define S_INFINITY "\031"
|
|
#define S_LARROW "\032"
|
|
#define S_RARROW "\033"
|
|
#define S_PI "\034"
|
|
#define S_MICRO "\035"
|
|
#define S_OHM "\036"
|
|
// trace
|
|
|
|
#define TRACES_MAX 4
|
|
|
|
#define MAX_TRACE_TYPE 12
|
|
enum trace_type {
|
|
TRC_LOGMAG=0, TRC_PHASE, TRC_DELAY, TRC_SMITH, TRC_POLAR, TRC_LINEAR, TRC_SWR, TRC_REAL, TRC_IMAG, TRC_R, TRC_X, TRC_OFF
|
|
};
|
|
// Mask for define rectangular plot
|
|
#define RECTANGULAR_GRID_MASK ((1<<TRC_LOGMAG)|(1<<TRC_PHASE)|(1<<TRC_DELAY)|(1<<TRC_LINEAR)|(1<<TRC_SWR)|(1<<TRC_REAL)|(1<<TRC_IMAG)|(1<<TRC_R)|(1<<TRC_X))
|
|
|
|
// LOGMAG: SCALE, REFPOS, REFVAL
|
|
// PHASE: SCALE, REFPOS, REFVAL
|
|
// DELAY: SCALE, REFPOS, REFVAL
|
|
// SMITH: SCALE, <REFPOS>, <REFVAL>
|
|
// LINMAG: SCALE, REFPOS, REFVAL
|
|
// SWR: SCALE, REFPOS, REFVAL
|
|
|
|
// Electrical Delay
|
|
// Phase
|
|
|
|
typedef struct trace {
|
|
uint8_t enabled;
|
|
uint8_t type;
|
|
uint8_t channel;
|
|
uint8_t reserved;
|
|
float scale;
|
|
float refpos;
|
|
} trace_t;
|
|
|
|
typedef struct config {
|
|
int32_t magic;
|
|
uint16_t dac_value;
|
|
uint16_t grid_color;
|
|
uint16_t menu_normal_color;
|
|
uint16_t menu_active_color;
|
|
uint16_t trace_color[TRACES_MAX];
|
|
int16_t touch_cal[4];
|
|
int8_t reserved_1;
|
|
uint32_t harmonic_freq_threshold;
|
|
|
|
uint8_t _reserved[24];
|
|
uint32_t checksum;
|
|
} config_t;
|
|
|
|
extern config_t config;
|
|
|
|
#define DRIVE_STRENGTH_AUTO (-1)
|
|
#define FREQ_HARMONICS (config.harmonic_freq_threshold)
|
|
#define IS_HARMONIC_MODE(f) ((f) > FREQ_HARMONICS)
|
|
|
|
//extern trace_t trace[TRACES_MAX];
|
|
|
|
void set_trace_type(int t, int type);
|
|
void set_trace_channel(int t, int channel);
|
|
void set_trace_scale(int t, float scale);
|
|
void set_trace_refpos(int t, float refpos);
|
|
float get_trace_scale(int t);
|
|
float get_trace_refpos(int t);
|
|
const char *get_trace_typename(int t);
|
|
void draw_battery_status(void);
|
|
|
|
void set_electrical_delay(float picoseconds);
|
|
float get_electrical_delay(void);
|
|
float groupdelay_from_array(int i, float array[POINTS_COUNT][2]);
|
|
|
|
// marker
|
|
|
|
#define MARKERS_MAX 4
|
|
|
|
typedef struct marker {
|
|
int8_t enabled;
|
|
int16_t index;
|
|
uint32_t frequency;
|
|
} marker_t;
|
|
|
|
extern int8_t previous_marker;
|
|
extern int8_t marker_tracking;
|
|
|
|
void plot_init(void);
|
|
void update_grid(void);
|
|
void request_to_redraw_grid(void);
|
|
void redraw_frame(void);
|
|
//void redraw_all(void);
|
|
void request_to_draw_cells_behind_menu(void);
|
|
void request_to_draw_cells_behind_numeric_input(void);
|
|
void redraw_marker(int marker, int update_info);
|
|
void plot_into_index(float measured[2][POINTS_COUNT][2]);
|
|
void force_set_markmap(void);
|
|
void draw_frequencies(void);
|
|
void draw_all(bool flush);
|
|
|
|
void draw_cal_status(void);
|
|
|
|
//void markmap_all_markers(void);
|
|
|
|
void marker_position(int m, int t, int *x, int *y);
|
|
int search_nearest_index(int x, int y, int t);
|
|
void set_marker_search(int mode);
|
|
int marker_search(void);
|
|
int marker_search_left(int from);
|
|
int marker_search_right(int from);
|
|
|
|
// _request flag for update screen
|
|
#define REDRAW_CELLS (1<<0)
|
|
#define REDRAW_FREQUENCY (1<<1)
|
|
#define REDRAW_CAL_STATUS (1<<2)
|
|
#define REDRAW_MARKER (1<<3)
|
|
extern volatile uint8_t redraw_request;
|
|
|
|
extern int16_t vbat;
|
|
|
|
/*
|
|
* ili9341.c
|
|
*/
|
|
// SPI bus revert byte order
|
|
//gggBBBbb RRRrrGGG
|
|
#define RGB565(r,g,b) ( (((g)&0x1c)<<11) | (((b)&0xf8)<<5) | ((r)&0xf8) | (((g)&0xe0)>>5) )
|
|
#define RGBHEX(hex) ( (((hex)&0x001c00)<<3) | (((hex)&0x0000f8)<<5) | (((hex)&0xf80000)>>16) | (((hex)&0x00e000)>>13) )
|
|
|
|
// Define size of screen buffer in pixels (one pixel 16bit size)
|
|
#define SPI_BUFFER_SIZE 2048
|
|
|
|
#define DEFAULT_FG_COLOR RGB565(255,255,255)
|
|
#define DEFAULT_BG_COLOR RGB565( 0, 0, 0)
|
|
#define DEFAULT_GRID_COLOR RGB565(128,128,128)
|
|
#define DEFAULT_MENU_COLOR RGB565(255,255,255)
|
|
#define DEFAULT_MENU_TEXT_COLOR RGB565( 0, 0, 0)
|
|
#define DEFAULT_MENU_ACTIVE_COLOR RGB565(180,255,180)
|
|
#define DEFAULT_TRACE_1_COLOR RGB565(255,255, 0)
|
|
#define DEFAULT_TRACE_2_COLOR RGB565( 0,255,255)
|
|
#define DEFAULT_TRACE_3_COLOR RGB565( 0,255, 0)
|
|
#define DEFAULT_TRACE_4_COLOR RGB565(255, 0,255)
|
|
#define DEFAULT_NORMAL_BAT_COLOR RGB565( 31,227, 0)
|
|
#define DEFAULT_LOW_BAT_COLOR RGB565(255, 0, 0)
|
|
#define DEFAULT_SPEC_INPUT_COLOR RGB565(128,255,128);
|
|
|
|
extern uint16_t foreground_color;
|
|
extern uint16_t background_color;
|
|
|
|
extern uint16_t spi_buffer[SPI_BUFFER_SIZE];
|
|
|
|
void ili9341_init(void);
|
|
//void ili9341_setRotation(uint8_t r);
|
|
void ili9341_test(int mode);
|
|
void ili9341_bulk(int x, int y, int w, int h);
|
|
void ili9341_fill(int x, int y, int w, int h, int color);
|
|
void setForegroundColor(uint16_t fg);
|
|
void setBackgroundColor(uint16_t fg);
|
|
void clearScreen(void);
|
|
void blit8BitWidthBitmap(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *bitmap);
|
|
void blit16BitWidthBitmap(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t *bitmap);
|
|
void ili9341_drawchar(uint8_t ch, int x, int y);
|
|
void ili9341_drawstring(const char *str, int x, int y);
|
|
void ili9341_drawstringV(const char *str, int x, int y);
|
|
int ili9341_drawchar_size(uint8_t ch, int x, int y, uint8_t size);
|
|
void ili9341_drawstring_size(const char *str, int x, int y, uint8_t size);
|
|
void ili9341_drawfont(uint8_t ch, int x, int y);
|
|
void ili9341_read_memory(int x, int y, int w, int h, int len, uint16_t* out);
|
|
void ili9341_line(int x0, int y0, int x1, int y1);
|
|
void show_version(void);
|
|
void show_logo(void);
|
|
|
|
/*
|
|
* flash.c
|
|
*/
|
|
#define SAVEAREA_MAX 5
|
|
// Begin addr 0x08018000
|
|
#define SAVE_CONFIG_AREA_SIZE 0x00008000
|
|
// config save area
|
|
#define SAVE_CONFIG_ADDR 0x08018000
|
|
// properties_t save area
|
|
#define SAVE_PROP_CONFIG_0_ADDR 0x08018800
|
|
#define SAVE_PROP_CONFIG_1_ADDR 0x0801a000
|
|
#define SAVE_PROP_CONFIG_2_ADDR 0x0801b800
|
|
#define SAVE_PROP_CONFIG_3_ADDR 0x0801d000
|
|
#define SAVE_PROP_CONFIG_4_ADDR 0x0801e800
|
|
|
|
typedef struct properties {
|
|
uint32_t magic;
|
|
uint32_t _frequency0;
|
|
uint32_t _frequency1;
|
|
uint16_t _sweep_points;
|
|
uint16_t _cal_status;
|
|
|
|
uint32_t _frequencies[POINTS_COUNT];
|
|
float _cal_data[5][POINTS_COUNT][2];
|
|
float _electrical_delay; // picoseconds
|
|
|
|
trace_t _trace[TRACES_MAX];
|
|
marker_t _markers[MARKERS_MAX];
|
|
|
|
float _velocity_factor; // %
|
|
int8_t _active_marker;
|
|
uint8_t _domain_mode; /* 0bxxxxxffm : where ff: TD_FUNC m: DOMAIN_MODE */
|
|
uint8_t _marker_smith_format;
|
|
uint8_t _reserved[50];
|
|
uint32_t checksum;
|
|
} properties_t;
|
|
|
|
//sizeof(properties_t) == 0x1200
|
|
|
|
#define CONFIG_MAGIC 0x434f4e45 /* 'CONF' */
|
|
|
|
extern int16_t lastsaveid;
|
|
extern properties_t *active_props;
|
|
extern properties_t current_props;
|
|
|
|
#define frequency0 current_props._frequency0
|
|
#define frequency1 current_props._frequency1
|
|
#define sweep_points current_props._sweep_points
|
|
#define cal_status current_props._cal_status
|
|
#define frequencies current_props._frequencies
|
|
#define cal_data active_props->_cal_data
|
|
#define electrical_delay current_props._electrical_delay
|
|
|
|
#define trace current_props._trace
|
|
#define markers current_props._markers
|
|
#define active_marker current_props._active_marker
|
|
#define domain_mode current_props._domain_mode
|
|
#define velocity_factor current_props._velocity_factor
|
|
#define marker_smith_format current_props._marker_smith_format
|
|
|
|
#define FREQ_IS_STARTSTOP() (frequency0 < frequency1)
|
|
#define FREQ_IS_CENTERSPAN() (frequency0 > frequency1)
|
|
#define FREQ_IS_CW() (frequency0 == frequency1)
|
|
#define FREQ_START() (frequency0)
|
|
#define FREQ_STOP() (frequency1)
|
|
#define FREQ_CENTER() (frequency0/2 + frequency1/2)
|
|
#define FREQ_SPAN() (frequency0 - frequency1)
|
|
|
|
int caldata_save(int id);
|
|
int caldata_recall(int id);
|
|
const properties_t *caldata_ref(int id);
|
|
|
|
int config_save(void);
|
|
int config_recall(void);
|
|
|
|
void clear_all_config_prop_data(void);
|
|
|
|
/*
|
|
* ui.c
|
|
*/
|
|
extern void ui_init(void);
|
|
extern void ui_process(void);
|
|
|
|
// Irq operation process set
|
|
#define OP_NONE 0x00
|
|
#define OP_LEVER 0x01
|
|
#define OP_TOUCH 0x02
|
|
//#define OP_FREQCHANGE 0x04
|
|
extern volatile uint8_t operation_requested;
|
|
|
|
// lever_mode
|
|
enum lever_mode {
|
|
LM_MARKER, LM_SEARCH, LM_CENTER, LM_SPAN, LM_EDELAY
|
|
};
|
|
|
|
// marker smith value format
|
|
enum marker_smithvalue {
|
|
MS_LIN, MS_LOG, MS_REIM, MS_RX, MS_RLC
|
|
};
|
|
|
|
typedef struct uistat {
|
|
int8_t digit; /* 0~5 */
|
|
int8_t digit_mode;
|
|
int8_t current_trace; /* 0..3 */
|
|
uint32_t value; // for editing at numeric input area
|
|
// uint32_t previous_value;
|
|
uint8_t lever_mode;
|
|
uint8_t marker_delta;
|
|
uint8_t marker_tracking;
|
|
} uistat_t;
|
|
|
|
extern uistat_t uistat;
|
|
void ui_init(void);
|
|
void ui_show(void);
|
|
void ui_hide(void);
|
|
|
|
void touch_start_watchdog(void);
|
|
void touch_position(int *x, int *y);
|
|
void handle_touch_interrupt(void);
|
|
|
|
#define TOUCH_THRESHOLD 2000
|
|
|
|
void touch_cal_exec(void);
|
|
void touch_draw_test(void);
|
|
void enter_dfu(void);
|
|
|
|
/*
|
|
* adc.c
|
|
*/
|
|
|
|
void adc_init(void);
|
|
uint16_t adc_single_read(ADC_TypeDef *adc, uint32_t chsel);
|
|
void adc_start_analog_watchdogd(ADC_TypeDef *adc, uint32_t chsel);
|
|
void adc_stop(ADC_TypeDef *adc);
|
|
void adc_interrupt(ADC_TypeDef *adc);
|
|
int16_t adc_vbat_read(ADC_TypeDef *adc);
|
|
|
|
/*
|
|
* misclinous
|
|
*/
|
|
int plot_printf(char *str, int, const char *fmt, ...);
|
|
#define PULSE do { palClearPad(GPIOC, GPIOC_LED); palSetPad(GPIOC, GPIOC_LED);} while(0)
|
|
|
|
// Speed profile definition
|
|
#define START_PROFILE systime_t time = chVTGetSystemTimeX();
|
|
#define STOP_PROFILE {char string_buf[12];plot_printf(string_buf, sizeof string_buf, "T:%06d", chVTGetSystemTimeX() - time);ili9341_drawstringV(string_buf, 1, 60);}
|
|
/*EOF*/
|