diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
index a4303a4..fe6ec0c 100644
--- a/.settings/language.settings.xml
+++ b/.settings/language.settings.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/NANOVNA_STM32_F072/board.h b/NANOVNA_STM32_F072/board.h
index 863367b..b0a3c1a 100644
--- a/NANOVNA_STM32_F072/board.h
+++ b/NANOVNA_STM32_F072/board.h
@@ -122,7 +122,7 @@
* PA13 - SWDIO (alternate 0).
* PA14 - SWCLK (alternate 0).
*/
-#define VAL_GPIOA_MODER (PIN_MODE_INPUT(0U) | \
+#define VAL_GPIOA_MODER (PIN_MODE_ANALOG(0U) | \
PIN_MODE_INPUT(1U) | \
PIN_MODE_INPUT(2U) | \
PIN_MODE_INPUT(3U) | \
@@ -131,8 +131,8 @@
PIN_MODE_ANALOG(GPIOA_XP) | \
PIN_MODE_ANALOG(GPIOA_YP) | \
PIN_MODE_ALTERNATE(GPIOA_MCO) | \
- PIN_MODE_INPUT(9U) | \
- PIN_MODE_OUTPUT(GPIOA_USB_DISC) | \
+ PIN_MODE_ANALOG(9U) | \
+ PIN_MODE_ANALOG(GPIOA_USB_DISC) | \
PIN_MODE_INPUT(GPIOA_USB_DM) | \
PIN_MODE_INPUT(GPIOA_USB_DP) | \
PIN_MODE_ALTERNATE(GPIOA_JTMS) | \
@@ -163,14 +163,14 @@
PIN_OSPEED_2M(6) | \
PIN_OSPEED_2M(7) | \
PIN_OSPEED_100M(GPIOA_MCO) | \
- PIN_OSPEED_100M(9) | \
- PIN_OSPEED_100M(10) | \
+ PIN_OSPEED_2M(9) | \
+ PIN_OSPEED_2M(10) | \
PIN_OSPEED_100M(GPIOA_USB_DM) | \
PIN_OSPEED_100M(GPIOA_USB_DP) | \
PIN_OSPEED_100M(GPIOA_JTMS) | \
PIN_OSPEED_100M(GPIOA_JTCK) | \
PIN_OSPEED_100M(GPIOA_LCD_RESET))
-#define VAL_GPIOA_PUPDR ( PIN_PUPDR_PULLDOWN(0) | \
+#define VAL_GPIOA_PUPDR ( PIN_PUPDR_FLOATING(0) | \
PIN_PUPDR_PULLDOWN(1) | \
PIN_PUPDR_PULLDOWN(2) | \
PIN_PUPDR_PULLDOWN(3) | \
@@ -179,8 +179,8 @@
PIN_PUPDR_FLOATING(6) | \
PIN_PUPDR_FLOATING(7) | \
PIN_PUPDR_PULLUP(GPIOA_MCO) | \
- PIN_PUPDR_PULLUP(9) | \
- PIN_PUPDR_PULLUP(GPIOA_USB_DISC) | \
+ PIN_PUPDR_FLOATING(9) | \
+ PIN_PUPDR_FLOATING(GPIOA_USB_DISC) | \
PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
PIN_PUPDR_PULLDOWN(GPIOA_JTMS) | \
diff --git a/adc.c b/adc.c
index 8ecbc8f..24989d2 100644
--- a/adc.c
+++ b/adc.c
@@ -179,3 +179,59 @@ OSAL_IRQ_HANDLER(STM32_ADC2_HANDLER)
OSAL_IRQ_EPILOGUE();
}
+
+#if 1
+uint16_t adc_multi_read(uint32_t chsel, uint16_t *result, uint32_t count)
+{
+ /* ADC setup */
+ VNA_ADC->ISR = VNA_ADC->ISR;
+ VNA_ADC->IER = 0;
+ VNA_ADC->TR = ADC_TR(0, 0);
+ VNA_ADC->SMPR = ADC_SMPR_SMP_1P5;
+ VNA_ADC->CFGR1 = ADC_CFGR1_RES_12BIT;
+ VNA_ADC->CHSELR = chsel;
+
+
+// palSetPadMode(GPIOA, 10, PAL_MODE_OUTPUT_PUSHPULL);
+
+ do{
+#if 0
+ if (count < 145)
+ palSetPad(GPIOA, 10);
+ else
+ palClearPad(GPIOA, 10);
+#endif
+ VNA_ADC->CR |= ADC_CR_ADSTART; // ADC conversion start.
+// while (VNA_ADC->CR & ADC_CR_ADSTART)
+ while(!(VNA_ADC->ISR & ADC_ISR_EOC));
+ ;
+ *(result++) =VNA_ADC->DR;
+ }while(--count);
+ return count;
+}
+
+int16_t adc_buf_read(uint32_t chsel, uint16_t *result, uint32_t count)
+{
+
+ adc_stop();
+
+#if 0
+ // drive high to low on Y line (coordinates from left to right)
+ palSetPad(GPIOB, GPIOB_YN);
+ palClearPad(GPIOA, GPIOA_YP);
+ // Set Y line as output
+ palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_OUTPUT_PUSHPULL);
+ palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_OUTPUT_PUSHPULL);
+ // Set X line as input
+ palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_INPUT); // Hi-z mode
+ palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_INPUT_ANALOG); // <- ADC_TOUCH_X channel
+ uint16_t res = adc_multi_read(ADC_TOUCH_X, result, count);
+#else
+// palSetPadMode(GPIOA, 9, PAL_MODE_INPUT_ANALOG);
+ uint16_t res = adc_multi_read(chsel, result, count); // ADC_CHSELR_CHSEL9
+#endif
+ touch_start_watchdog();
+ return res;
+}
+
+#endif
diff --git a/main.c b/main.c
index 5cc7034..9408802 100644
--- a/main.c
+++ b/main.c
@@ -2365,6 +2365,7 @@ static const VNAShellCommand commands[] =
{ "o", cmd_o, 0 },
{ "d", cmd_d, 0 },
{ "f", cmd_f, 0 },
+// { "g", cmd_g, 0 },
#ifdef __ULTRA_SA__
{ "x", cmd_x, 0 },
#endif
@@ -2636,20 +2637,52 @@ int main(void)
chThdSleepMilliseconds(500);
+#if 0
+ palSetPadMode(GPIOA, 9, PAL_MODE_INPUT_ANALOG);
+ palSetPadMode(GPIOA, 10, PAL_MODE_OUTPUT_PUSHPULL);
+ int s;
+
+ adc_stop();
+
+ // drive high to low on Y line (coordinates from left to right)
+ palSetPad(GPIOB, GPIOB_YN);
+ palClearPad(GPIOA, GPIOA_YP);
+ // Set Y line as output
+ palSetPadMode(GPIOB, GPIOB_YN, PAL_MODE_OUTPUT_PUSHPULL);
+ palSetPadMode(GPIOA, GPIOA_YP, PAL_MODE_OUTPUT_PUSHPULL);
+ // Set X line as input
+ palSetPadMode(GPIOB, GPIOB_XN, PAL_MODE_INPUT); // Hi-z mode
+ palSetPadMode(GPIOA, GPIOA_XP, PAL_MODE_INPUT_ANALOG); // <- ADC_TOUCH_X channel
+
+
+ while (1) {
+// palSetPad(GPIOA, 10);
+// shell_printf("%d\n\r", adc_single_read(ADC_CHSELR_CHSEL9));
+// palClearPad(GPIOA, 10);
+ shell_printf("%d\n\r", adc_single_read(ADC_TOUCH_X));
+ }
+#endif
+
+
#if 0
/*
* UART initialize
*/
uartStart(&UARTD1, &uart_cfg_1);
-
+again:
uartStartSend(&UARTD1, 1, "H");
+ uint8_t buf[10];
uartStartReceive(&UARTD1, 1, buf);
+goto again;
#endif
#if 0
+ again:
+
palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(1)); // USART1 TX.
palSetPadMode(GPIOA,10, PAL_MODE_ALTERNATE(1)); // USART1 RX.
+
uint8_t buf[10];
sdStart(&SD1,&default_config);
osalThreadSleepMilliseconds(10);
@@ -2666,7 +2699,7 @@ int main(void)
sdReadTimeout(&SD1,buf,10,TIME_IMMEDIATE);
sdReadTimeout(&SD1,buf,10, 10);
int i = sdReadTimeout(&SD1,buf,10,TIME_IMMEDIATE);
-
+goto again;
#endif
#ifdef __ULTRA_SA__
ADF4351_Setup();
diff --git a/mcuconf.h b/mcuconf.h
index 9520c1c..39f8156 100644
--- a/mcuconf.h
+++ b/mcuconf.h
@@ -193,7 +193,7 @@
/*
* SERIAL driver system settings.
*/
-#define STM32_SERIAL_USE_USART1 TRUE
+#define STM32_SERIAL_USE_USART1 FALSE
#define STM32_SERIAL_USE_USART2 FALSE
#define STM32_SERIAL_USART1_PRIORITY 3
#define STM32_SERIAL_USART2_PRIORITY 3
diff --git a/sa_cmd.c b/sa_cmd.c
index f885280..9282362 100644
--- a/sa_cmd.c
+++ b/sa_cmd.c
@@ -399,6 +399,23 @@ VNA_SHELL_FUNCTION(cmd_d)
dirty = true;
}
+#if 0
+extern int16_t adc_buf_read(uint16_t *result, uint32_t count);
+
+VNA_SHELL_FUNCTION(cmd_g)
+{
+ (void) argc;
+ (void) argv;
+ int32_t a = my_atoi(argv[0]);
+ systime_t start_of_read = chVTGetSystemTimeX();
+ adc_buf_read(spi_buffer, 256);
+ systime_t time_of_read = chVTGetSystemTimeX() - start_of_read;
+ shell_printf("Time: %d\r\n", time_of_read);
+ for (int i=0;i<20;i++)
+ shell_printf("[%d] = %d\r\n", (int)i, (int)(spi_buffer[i]));
+}
+#endif
+
VNA_SHELL_FUNCTION(cmd_a)
{
diff --git a/sa_core.c b/sa_core.c
index f365098..c81a83b 100644
--- a/sa_core.c
+++ b/sa_core.c
@@ -20,6 +20,10 @@
#include "SI4432.h" // comment out for simulation
#include "stdlib.h"
+#pragma GCC push_options
+#pragma GCC optimize ("Og")
+
+
//#define __DEBUG_AGC__ If set the AGC value will be shown in the stored trace and FAST_SWEEP rmmode will be disabled
#ifdef __DEBUG_AGC__
#ifdef __FAST_SWEEP__
@@ -487,6 +491,7 @@ void set_actual_power(float o) // Set peak level to known value
config.low_level_offset = new_offset;
#endif
}
+ config_save();
// dirty = true; // No HW update required, only status panel refresh
}
@@ -760,9 +765,13 @@ void set_trigger(int trigger)
{
if (trigger == T_UP || trigger == T_DOWN){
setting.trigger_direction = trigger;
- } else {
+ } else if (trigger == T_DONE) {
+ pause_sweep(); // Trigger once so pause after this sweep has completed!!!!!!!
+ redraw_request |= REDRAW_CAL_STATUS; // Show status change setting.trigger = trigger;
setting.trigger = trigger;
+ } else {
sweep_mode = SWEEP_ENABLE;
+ setting.trigger = trigger;
}
redraw_request|=REDRAW_TRIGGER | REDRAW_CAL_STATUS;
//dirty = true; // No HW update required, only status panel refresh
@@ -1685,8 +1694,9 @@ pureRSSI_t perform(bool break_on_operation, int i, uint32_t f, int tracking)
SI4432_Fill(MODE_SELECT(setting.mode), 1); // fast mode possible to pre-fill RSSI buffer
}
#endif
- if (setting.trigger == T_SINGLE)
- pause_sweep(); // Trigger once so pause after this sweep has completed!!!!!!!
+ if (setting.trigger == T_SINGLE) {
+ set_trigger(T_DONE);
+ }
start_of_sweep_timestamp = chVTGetSystemTimeX();
}
else
@@ -1892,8 +1902,9 @@ sweep_again: // stay in sweep loop when output mo
if (actual_t[max_index[0]] < setting.trigger_level) {
goto again; // not yet, sweep again
} else {
- if (setting.trigger == T_SINGLE)
- pause_sweep(); // Stop scanning after completing this sweep if above trigger
+ if (setting.trigger == T_SINGLE) {
+ set_trigger(T_DONE);
+ }
}
// scandirty = true; // To show trigger happened
}
@@ -2123,7 +2134,45 @@ sweep_again: // stay in sweep loop when output mo
min_level = temp_min_level;
}
// } while (MODE_OUTPUT(setting.mode) && setting.modulation != MO_NONE); // Never exit sweep loop while in output mode with modulation
-
+#if 0 // Read ADC
+ extern int fix_fft(short fr[], short fi[], short m, short inverse);
+ extern int16_t adc_buf_read(uint32_t chsel, uint16_t *result, uint32_t count);
+ trace[TRACE_STORED].enabled = true;
+ adc_buf_read(ADC_CHSELR_CHSEL4, spi_buffer, 290);
+#if 1 // Perform FFT on input
+ int32_t zero = 0;
+ for (int i=0;i<256;i++) {
+ zero += spi_buffer[i];
+ }
+ zero = zero >> 8;
+ int16_t *rfft = (int16_t *)&spi_buffer[0];
+ int16_t *ifft = (int16_t *)&spi_buffer[512];
+ for (int i=0;i<256;i++) {
+ rfft[i] = spi_buffer[i] - zero;
+ ifft[i] = rfft[i]; // Imaginary part equal to real part
+ rfft[511 - i] = rfft[i]; // Mirror real
+ ifft[511 - i] = -rfft[i]; // Conjugate mirror for imaginary part
+ }
+ fix_fft(rfft,ifft, 9,false);
+#endif
+ for (int i=0;i<256;i++) { // Concert to
+#if 1 // Linear
+ stored_t[i] = (((int16_t *)spi_buffer)[i]/44.0) - 80.0;
+#else
+ float r = rfft[i]; // Log
+ if (r < 0)
+ r = -r;
+ float im = ifft[i];
+ if (im < 0)
+ im = -im;
+ if (r == 0)
+ r = 1;
+ if (im==0)
+ im = 1;
+ stored_t[i] = (log10(r) * 2.0 + log10(im) * 2.0)/2.0 - 80.0;
+#endif
+ }
+#endif
//---------------- in Linearity measurement the attenuation has to be adapted ------------------
@@ -2382,7 +2431,12 @@ void draw_cal_status(void)
ili9341_set_foreground(color);
y += YSTEP + YSTEP/2 ;
ili9341_drawstring("PAUSED", x, y);
-
+ }
+ if (setting.trigger == T_SINGLE || setting.trigger == T_NORMAL ) {
+ color = BRIGHT_COLOR_GREEN;
+ ili9341_set_foreground(color);
+ y += YSTEP + YSTEP/2 ;
+ ili9341_drawstring("ARMED", x, y);
}
// if (setting.mode == M_LOW) {
@@ -3283,5 +3337,305 @@ quit:
reset_settings(M_LOW);
#endif
}
+#pragma GCC pop_options
+
+
+#if 0 // fixed point FFT
+
+/* fix_fft.c - Fixed-point in-place Fast Fourier Transform */
+/*
+ All data are fixed-point short integers, in which -32768
+ to +32768 represent -1.0 to +1.0 respectively. Integer
+ arithmetic is used for speed, instead of the more natural
+ floating-point.
+
+ For the forward FFT (time -> freq), fixed scaling is
+ performed to prevent arithmetic overflow, and to map a 0dB
+ sine/cosine wave (i.e. amplitude = 32767) to two -6dB freq
+ coefficients. The return value is always 0.
+
+ For the inverse FFT (freq -> time), fixed scaling cannot be
+ done, as two 0dB coefficients would sum to a peak amplitude
+ of 64K, overflowing the 32k range of the fixed-point integers.
+ Thus, the fix_fft() routine performs variable scaling, and
+ returns a value which is the number of bits LEFT by which
+ the output must be shifted to get the actual amplitude
+ (i.e. if fix_fft() returns 3, each value of fr[] and fi[]
+ must be multiplied by 8 (2**3) for proper scaling.
+ Clearly, this cannot be done within fixed-point short
+ integers. In practice, if the result is to be used as a
+ filter, the scale_shift can usually be ignored, as the
+ result will be approximately correctly normalized as is.
+
+ Written by: Tom Roberts 11/8/89
+ Made portable: Malcolm Slaney 12/15/94 malcolm@interval.com
+ Enhanced: Dimitrios P. Bouras 14 Jun 2006 dbouras@ieee.org
+*/
+
+#define N_WAVE 1024 /* full length of Sinewave[] */
+#define LOG2_N_WAVE 10 /* log2(N_WAVE) */
+
+/*
+ Henceforth "short" implies 16-bit word. If this is not
+ the case in your architecture, please replace "short"
+ with a type definition which *is* a 16-bit word.
+*/
+
+/*
+ Since we only use 3/4 of N_WAVE, we define only
+ this many samples, in order to conserve data space.
+*/
+short Sinewave[N_WAVE-N_WAVE/4] = {
+ 0, 201, 402, 603, 804, 1005, 1206, 1406,
+ 1607, 1808, 2009, 2209, 2410, 2610, 2811, 3011,
+ 3211, 3411, 3611, 3811, 4011, 4210, 4409, 4608,
+ 4807, 5006, 5205, 5403, 5601, 5799, 5997, 6195,
+ 6392, 6589, 6786, 6982, 7179, 7375, 7571, 7766,
+ 7961, 8156, 8351, 8545, 8739, 8932, 9126, 9319,
+ 9511, 9703, 9895, 10087, 10278, 10469, 10659, 10849,
+ 11038, 11227, 11416, 11604, 11792, 11980, 12166, 12353,
+ 12539, 12724, 12909, 13094, 13278, 13462, 13645, 13827,
+ 14009, 14191, 14372, 14552, 14732, 14911, 15090, 15268,
+ 15446, 15623, 15799, 15975, 16150, 16325, 16499, 16672,
+ 16845, 17017, 17189, 17360, 17530, 17699, 17868, 18036,
+ 18204, 18371, 18537, 18702, 18867, 19031, 19194, 19357,
+ 19519, 19680, 19840, 20000, 20159, 20317, 20474, 20631,
+ 20787, 20942, 21096, 21249, 21402, 21554, 21705, 21855,
+ 22004, 22153, 22301, 22448, 22594, 22739, 22883, 23027,
+ 23169, 23311, 23452, 23592, 23731, 23869, 24006, 24143,
+ 24278, 24413, 24546, 24679, 24811, 24942, 25072, 25201,
+ 25329, 25456, 25582, 25707, 25831, 25954, 26077, 26198,
+ 26318, 26437, 26556, 26673, 26789, 26905, 27019, 27132,
+ 27244, 27355, 27466, 27575, 27683, 27790, 27896, 28001,
+ 28105, 28208, 28309, 28410, 28510, 28608, 28706, 28802,
+ 28897, 28992, 29085, 29177, 29268, 29358, 29446, 29534,
+ 29621, 29706, 29790, 29873, 29955, 30036, 30116, 30195,
+ 30272, 30349, 30424, 30498, 30571, 30643, 30713, 30783,
+ 30851, 30918, 30984, 31049, 31113, 31175, 31236, 31297,
+ 31356, 31413, 31470, 31525, 31580, 31633, 31684, 31735,
+ 31785, 31833, 31880, 31926, 31970, 32014, 32056, 32097,
+ 32137, 32176, 32213, 32249, 32284, 32318, 32350, 32382,
+ 32412, 32441, 32468, 32495, 32520, 32544, 32567, 32588,
+ 32609, 32628, 32646, 32662, 32678, 32692, 32705, 32717,
+ 32727, 32736, 32744, 32751, 32757, 32761, 32764, 32766,
+ 32767, 32766, 32764, 32761, 32757, 32751, 32744, 32736,
+ 32727, 32717, 32705, 32692, 32678, 32662, 32646, 32628,
+ 32609, 32588, 32567, 32544, 32520, 32495, 32468, 32441,
+ 32412, 32382, 32350, 32318, 32284, 32249, 32213, 32176,
+ 32137, 32097, 32056, 32014, 31970, 31926, 31880, 31833,
+ 31785, 31735, 31684, 31633, 31580, 31525, 31470, 31413,
+ 31356, 31297, 31236, 31175, 31113, 31049, 30984, 30918,
+ 30851, 30783, 30713, 30643, 30571, 30498, 30424, 30349,
+ 30272, 30195, 30116, 30036, 29955, 29873, 29790, 29706,
+ 29621, 29534, 29446, 29358, 29268, 29177, 29085, 28992,
+ 28897, 28802, 28706, 28608, 28510, 28410, 28309, 28208,
+ 28105, 28001, 27896, 27790, 27683, 27575, 27466, 27355,
+ 27244, 27132, 27019, 26905, 26789, 26673, 26556, 26437,
+ 26318, 26198, 26077, 25954, 25831, 25707, 25582, 25456,
+ 25329, 25201, 25072, 24942, 24811, 24679, 24546, 24413,
+ 24278, 24143, 24006, 23869, 23731, 23592, 23452, 23311,
+ 23169, 23027, 22883, 22739, 22594, 22448, 22301, 22153,
+ 22004, 21855, 21705, 21554, 21402, 21249, 21096, 20942,
+ 20787, 20631, 20474, 20317, 20159, 20000, 19840, 19680,
+ 19519, 19357, 19194, 19031, 18867, 18702, 18537, 18371,
+ 18204, 18036, 17868, 17699, 17530, 17360, 17189, 17017,
+ 16845, 16672, 16499, 16325, 16150, 15975, 15799, 15623,
+ 15446, 15268, 15090, 14911, 14732, 14552, 14372, 14191,
+ 14009, 13827, 13645, 13462, 13278, 13094, 12909, 12724,
+ 12539, 12353, 12166, 11980, 11792, 11604, 11416, 11227,
+ 11038, 10849, 10659, 10469, 10278, 10087, 9895, 9703,
+ 9511, 9319, 9126, 8932, 8739, 8545, 8351, 8156,
+ 7961, 7766, 7571, 7375, 7179, 6982, 6786, 6589,
+ 6392, 6195, 5997, 5799, 5601, 5403, 5205, 5006,
+ 4807, 4608, 4409, 4210, 4011, 3811, 3611, 3411,
+ 3211, 3011, 2811, 2610, 2410, 2209, 2009, 1808,
+ 1607, 1406, 1206, 1005, 804, 603, 402, 201,
+ 0, -201, -402, -603, -804, -1005, -1206, -1406,
+ -1607, -1808, -2009, -2209, -2410, -2610, -2811, -3011,
+ -3211, -3411, -3611, -3811, -4011, -4210, -4409, -4608,
+ -4807, -5006, -5205, -5403, -5601, -5799, -5997, -6195,
+ -6392, -6589, -6786, -6982, -7179, -7375, -7571, -7766,
+ -7961, -8156, -8351, -8545, -8739, -8932, -9126, -9319,
+ -9511, -9703, -9895, -10087, -10278, -10469, -10659, -10849,
+ -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353,
+ -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827,
+ -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268,
+ -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672,
+ -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036,
+ -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357,
+ -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631,
+ -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855,
+ -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027,
+ -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143,
+ -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201,
+ -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198,
+ -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132,
+ -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001,
+ -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802,
+ -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534,
+ -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195,
+ -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783,
+ -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297,
+ -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735,
+ -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097,
+ -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382,
+ -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588,
+ -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717,
+ -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766,
+};
+
+/*
+ FIX_MPY() - fixed-point multiplication & scaling.
+ Substitute inline assembly for hardware-specific
+ optimization suited to a particluar DSP processor.
+ Scaling ensures that result remains 16-bit.
+*/
+inline short FIX_MPY(short a, short b)
+{
+ /* shift right one less bit (i.e. 15-1) */
+ int c = ((int)a * (int)b) >> 14;
+ /* last bit shifted out = rounding-bit */
+ b = c & 0x01;
+ /* last shift + rounding bit */
+ a = (c >> 1) + b;
+ return a;
+}
+/*
+ fix_fft() - perform forward/inverse fast Fourier transform.
+ fr[n],fi[n] are real and imaginary arrays, both INPUT AND
+ RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to
+ 0 for forward transform (FFT), or 1 for iFFT.
+*/
+int fix_fft(short fr[], short fi[], short m, short inverse)
+{
+ int mr, nn, i, j, l, k, istep, n, scale, shift;
+ short qr, qi, tr, ti, wr, wi;
+
+ n = 1 << m;
+
+ /* max FFT size = N_WAVE */
+ if (n > N_WAVE)
+ return -1;
+
+ mr = 0;
+ nn = n - 1;
+ scale = 0;
+
+ /* decimation in time - re-order data */
+ for (m=1; m<=nn; ++m) {
+ l = n;
+ do {
+ l >>= 1;
+ } while (mr+l > nn);
+ mr = (mr & (l-1)) + l;
+
+ if (mr <= m)
+ continue;
+ tr = fr[m];
+ fr[m] = fr[mr];
+ fr[mr] = tr;
+ ti = fi[m];
+ fi[m] = fi[mr];
+ fi[mr] = ti;
+ }
+ l = 1;
+ k = LOG2_N_WAVE-1;
+ while (l < n) {
+ if (inverse) {
+ /* variable scaling, depending upon data */
+ shift = 0;
+ for (i=0; i 16383 || m > 16383) {
+ shift = 1;
+ break;
+ }
+ }
+ if (shift)
+ ++scale;
+ } else {
+ /*
+ fixed scaling, for proper normalization --
+ there will be log2(n) passes, so this results
+ in an overall factor of 1/n, distributed to
+ maximize arithmetic accuracy.
+ */
+ shift = 1;
+ }
+ /*
+ it may not be obvious, but the shift will be
+ performed on each data point exactly once,
+ during this pass.
+ */
+ istep = l << 1;
+ for (m=0; m>= 1;
+ wi >>= 1;
+ }
+ for (i=m; i>= 1;
+ qi >>= 1;
+ }
+ fr[j] = qr - tr;
+ fi[j] = qi - ti;
+ fr[i] = qr + tr;
+ fi[i] = qi + ti;
+ }
+ }
+ --k;
+ l = istep;
+ }
+ return scale;
+}
+
+/*
+ fix_fftr() - forward/inverse FFT on array of real numbers.
+ Real FFT/iFFT using half-size complex FFT by distributing
+ even/odd samples into real/imaginary arrays respectively.
+ In order to save data space (i.e. to avoid two arrays, one
+ for real, one for imaginary samples), we proceed in the
+ following two steps: a) samples are rearranged in the real
+ array so that all even samples are in places 0-(N/2-1) and
+ all imaginary samples in places (N/2)-(N-1), and b) fix_fft
+ is called with fr and fi pointing to index 0 and index N/2
+ respectively in the original array. The above guarantees
+ that fix_fft "sees" consecutive real samples as alternating
+ real and imaginary samples in the complex array.
+*/
+int fix_fftr(short f[], int m, int inverse)
+{
+ int i, N = 1<<(m-1), scale = 0;
+ short tt, *fr=f, *fi=&f[N];
+
+ if (inverse)
+ scale = fix_fft(fi, fr, m-1, inverse);
+ for (i=1; i
#include
+#include
uistat_t uistat = {
digit: 6,
@@ -1803,16 +1804,64 @@ draw_menu_buttons(const menuitem_t *menu)
ili9341_fill(LCD_WIDTH-MENU_BUTTON_WIDTH, y, MENU_BUTTON_WIDTH, MENU_BUTTON_HEIGHT, DEFAULT_BG_COLOR);
}
+static systime_t prev_touch_time = 0;
+static int prev_touch_button = -1;
+
+
static void
menu_select_touch(int i)
{
selection = i;
draw_menu();
+#if 1 // drag values
+ const menuitem_t *menu = menu_stack[menu_current_level];
+
+ if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD){
+ int touch_x, touch_y;
+ touch_position(&touch_x, &touch_y);
+ systime_t dt = 0;
+ while (touch_check() != EVT_TOUCH_RELEASED) {
+ systime_t ticks = chVTGetSystemTimeX();
+ if (prev_touch_button != i) { // new button, initialize
+ prev_touch_time = ticks;
+ prev_touch_button = i;
+ }
+ dt = ticks - prev_touch_time;
+
+ if (dt > BUTTON_DOWN_LONG_TICKS) {
+ int v = menu[i].data;
+ int old_keypad_mode = keypad_mode;
+ keypad_mode = v;
+ fetch_numeric_target();
+ float m = 1.0;
+ if (touch_x < LCD_WIDTH/2 - 10) {
+ m = 1/pow(10, ((LCD_WIDTH/2 - 10) - touch_x)/1000.0);
+ } else if (touch_x > LCD_WIDTH/2 + 10) {
+ m = pow(10, (touch_x - (LCD_WIDTH/2 + 10))/1000.0);
+ }
+ uistat.value *= m;
+ set_numeric_value();
+// selection = -1;
+ draw_menu();
+ keypad_mode = old_keypad_mode;
+ return;
+ }
+ }
+ if (dt > BUTTON_DOWN_LONG_TICKS) {
+ selection = -1;
+ draw_menu();
+ return;
+ }
+ prev_touch_button = -1;
+ } else
+#endif
+
touch_wait_release();
selection = -1;
menu_invoke(i);
}
+
static void
menu_apply_touch(void)
{
@@ -1829,14 +1878,18 @@ menu_apply_touch(void)
continue;
}
int active_button_start;
- if (menu[i].type & MT_FORM)
+ if (menu[i].type & MT_FORM) {
active_button_start = (LCD_WIDTH - MENU_FORM_WIDTH)/2;
- else
+// active_button_stop = LCD_WIDTH - active_button_start;
+ } else {
active_button_start = LCD_WIDTH - MENU_BUTTON_WIDTH;
-
- if (y < touch_y && touch_y < y+MENU_BUTTON_HEIGHT && active_button_start < touch_x) {
- menu_select_touch(i);
- return;
+// active_button_stop = LCD_WIDTH;
+ }
+ if (y < touch_y && touch_y < y+MENU_BUTTON_HEIGHT) {
+ if (touch_x > active_button_start) {
+ menu_select_touch(i);
+ return;
+ }
}
y += MENU_BUTTON_HEIGHT;
}
diff --git a/ui_sa.c b/ui_sa.c
index c3e70dd..666c713 100644
--- a/ui_sa.c
+++ b/ui_sa.c
@@ -1040,10 +1040,12 @@ static UI_FUNCTION_ADV_CALLBACK(menu_trigger_acb)
b->icon = setting.trigger == data ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP;
return;
}
- set_trigger(data);
+ if (data != T_DONE) {
+ set_trigger(data);
// menu_move_back();
- ui_mode_normal();
- completed = true;
+ ui_mode_normal();
+ completed = true;
+ }
}
#if 0
@@ -1566,7 +1568,7 @@ static const menuitem_t menu_measure[] = {
static const menuitem_t menu_calibrate[] =
{
- { MT_FORM | MT_TITLE, 0, "Connect IN and OUT", NULL},
+ { MT_FORM | MT_TITLE, 0, "Connect HIGH and LOW", NULL},
{ MT_FORM | MT_CALLBACK, 0, "CALIBRATE", menu_calibrate_cb},
{ MT_FORM | MT_CALLBACK, 0, "RESET CALBRATION", menu_calibrate_cb},
{ MT_FORM | MT_CANCEL, 0, S_LARROW" BACK", NULL },
@@ -1616,6 +1618,7 @@ static const menuitem_t menu_trigger[] = {
{ MT_ADV_CALLBACK, T_AUTO, "AUTO", menu_trigger_acb},
{ MT_ADV_CALLBACK, T_NORMAL, "NORMAL", menu_trigger_acb},
{ MT_ADV_CALLBACK, T_SINGLE, "SINGLE", menu_trigger_acb},
+// { MT_ADV_CALLBACK, T_DONE, "READY", menu_trigger_acb},
{ MT_KEYPAD, KM_TRIGGER, "TRIGGER\nLEVEL", NULL},
{ MT_ADV_CALLBACK, T_UP, "UP\nEDGE", menu_trigger_acb},
{ MT_ADV_CALLBACK, T_DOWN, "DOWN\nEDGE", menu_trigger_acb},