fix: plot only if sweep completed

pull/51/head
TT 6 years ago
parent a9c197f1f5
commit 516319b354

130
main.c

@ -38,7 +38,7 @@ static void apply_error_term(void);
static void apply_error_term_at(int i);
static void cal_interpolate(int s);
void sweep(void);
bool sweep(bool break_on_operation);
static MUTEX_DECL(mutex);
@ -48,11 +48,9 @@ static MUTEX_DECL(mutex);
int32_t frequency_offset = 5000;
int32_t frequency = 10000000;
int8_t drive_strength = DRIVE_STRENGTH_AUTO;
int8_t frequency_updated = FALSE;
int8_t sweep_enabled = TRUE;
int8_t cal_auto_interpolate = TRUE;
uint16_t redraw_request = 0; // contains REDRAW_XXX flags
int8_t stop_the_world = FALSE;
int16_t vbat = 0;
@ -63,32 +61,37 @@ static THD_FUNCTION(Thread1, arg)
chRegSetThreadName("sweep");
while (1) {
if (stop_the_world) {
__WFI();
continue;
}
bool completed = false;
if (sweep_enabled) {
chMtxLock(&mutex);
sweep();
completed = sweep(true);
chMtxUnlock(&mutex);
} else {
__WFI();
ui_process();
}
if (vbat != -1) {
{
chMtxLock(&mutex);
ui_process();
if (vbat != -1) {
adc_stop(ADC1);
vbat = adc_vbat_read(ADC1);
touch_start_watchdog();
draw_battery_status();
}
}
/* calculate trace coordinates and plot only if scan completed */
if (completed) {
plot_into_index(measured);
redraw_request |= REDRAW_CELLS;
}
/* calculate trace coordinates */
plot_into_index(measured);
/* plot trace and other indications as raster */
draw_all(completed); // flush markmap only if scan completed to prevent remaining traces
/* plot trace as raster */
draw_all();
chMtxUnlock(&mutex);
}
}
}
@ -220,6 +223,7 @@ static void cmd_resume(BaseSequentialStream *chp, int argc, char *argv[])
(void)argc;
(void)argv;
resume_sweep();
update_frequencies();
}
static void cmd_reset(BaseSequentialStream *chp, int argc, char *argv[])
@ -461,13 +465,15 @@ static void cmd_data(BaseSequentialStream *chp, int argc, char *argv[])
if (sel == 0 || sel == 1) {
chMtxLock(&mutex);
for (i = 0; i < sweep_points; i++) {
chprintf(chp, "%f %f\r\n", measured[sel][i][0], measured[sel][i][1]);
if (frequencies[i] != 0)
chprintf(chp, "%f %f\r\n", measured[sel][i][0], measured[sel][i][1]);
}
chMtxUnlock(&mutex);
} else if (sel >= 2 && sel < 7) {
chMtxLock(&mutex);
for (i = 0; i < sweep_points; i++) {
chprintf(chp, "%f %f\r\n", cal_data[sel-2][i][0], cal_data[sel-2][i][1]);
if (frequencies[i] != 0)
chprintf(chp, "%f %f\r\n", cal_data[sel-2][i][0], cal_data[sel-2][i][1]);
}
chMtxUnlock(&mutex);
} else {
@ -505,10 +511,7 @@ static void cmd_capture(BaseSequentialStream *chp, int argc, char *argv[])
(void)argc;
(void)argv;
// pause sweep
stop_the_world = TRUE;
chThdSleepMilliseconds(1000);
chMtxLock(&mutex);
// use uint16_t spi_buffer[1024] (defined in ili9341) for read buffer
uint16_t *buf = &spi_buffer[0];
@ -531,7 +534,7 @@ static void cmd_capture(BaseSequentialStream *chp, int argc, char *argv[])
}
//*/
stop_the_world = FALSE;
chMtxUnlock(&mutex);
}
#if 0
@ -632,48 +635,13 @@ ensure_edit_config(void)
cal_status = 0;
}
#if 0
static void cmd_scan(BaseSequentialStream *chp, int argc, char *argv[])
{
float gamma[2];
int i;
int32_t freq, step;
int delay;
(void)argc;
(void)argv;
pause_sweep();
chMtxLock(&mutex);
freq = frequency0;
step = (frequency1 - frequency0) / (sweep_points-1);
set_frequency(freq);
delay = 4;
for (i = 0; i < sweep_points; i++) {
freq = freq + step;
wait_dsp(delay);
delay = set_frequency(freq);
palClearPad(GPIOC, GPIOC_LED);
calculate_gamma(gamma);
palSetPad(GPIOC, GPIOC_LED);
chprintf(chp, "%d %d\r\n", gamma[0], gamma[1]);
}
chMtxUnlock(&mutex);
}
#endif
// main loop for measurement
void sweep(void)
bool sweep(bool break_on_operation)
{
int i;
int delay;
rewind:
frequency_updated = FALSE;
//delay = 3;
for (i = 0; i < sweep_points; i++) {
delay = set_frequency(frequencies[i]);
int delay = set_frequency(frequencies[i]);
tlv320aic3204_select_in3(); // CH0:REFLECT
wait_dsp(delay);
@ -698,15 +666,13 @@ void sweep(void)
if (electrical_delay != 0)
apply_edelay_at(i);
ui_process();
if (redraw_request)
break; // return to redraw screen asap.
if (frequency_updated)
goto rewind;
// back to toplevel to handle ui operation
if (operation_requested && break_on_operation)
return false;
}
transform_domain();
return true;
}
static void
@ -741,32 +707,37 @@ update_marker_index(void)
}
void
update_frequencies(void)
set_frequencies(uint32_t start, uint32_t stop, int16_t points)
{
int i;
int32_t span;
int32_t start;
uint32_t span = (stop - start) / 1000; /* prevents overflow because of maximum of int32_t(2.147e+9) */
for (i = 0; i < points; i++)
frequencies[i] = start + span * i / (points - 1) * 1000;
for (; i < sweep_points; i++)
frequencies[i] = 0;
}
void
update_frequencies(void)
{
uint32_t start, stop;
if (frequency1 > 0) {
start = frequency0;
span = (frequency1 - frequency0)/100;
stop = frequency1;
} else {
int center = frequency0;
span = -frequency1;
int32_t center = frequency0;
int32_t span = -frequency1;
start = center - span/2;
span /= 100;
stop = center + span/2;
}
for (i = 0; i < sweep_points; i++)
frequencies[i] = start + span * i / (sweep_points - 1) * 100;
set_frequencies(start, stop, sweep_points);
update_marker_index();
frequency_updated = TRUE;
// set grid layout
update_grid();
}
void
freq_mode_startstop(void)
{
@ -1722,7 +1693,8 @@ static void cmd_frequencies(BaseSequentialStream *chp, int argc, char *argv[])
(void)argc;
(void)argv;
for (i = 0; i < sweep_points; i++) {
chprintf(chp, "%d\r\n", frequencies[i]);
if (frequencies[i] != 0)
chprintf(chp, "%d\r\n", frequencies[i]);
}
}

@ -236,7 +236,7 @@ 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 force_set_markmap(void);
void draw_all(void);
void draw_all(bool flush);
void draw_cal_status(void);

@ -1248,7 +1248,7 @@ draw_cell(int m, int n)
}
void
draw_all_cells(void)
draw_all_cells(bool flush_markmap)
{
int m, n;
for (m = 0; m < (area_width+CELLWIDTH-1) / CELLWIDTH; m++)
@ -1257,17 +1257,19 @@ draw_all_cells(void)
draw_cell(m, n);
}
// keep current map for update
swap_markmap();
// clear map for next plotting
clear_markmap();
if (flush_markmap) {
// keep current map for update
swap_markmap();
// clear map for next plotting
clear_markmap();
}
}
void
draw_all(void)
draw_all(bool flush)
{
draw_all_cells();
if (redraw_request & REDRAW_CELLS)
draw_all_cells(flush);
if (redraw_request & REDRAW_FREQUENCY)
draw_frequencies();
if (redraw_request & REDRAW_CAL_STATUS)
@ -1285,7 +1287,7 @@ redraw_marker(int marker, int update_info)
if (update_info)
markmap[current_mappage][0] = 0xffff;
draw_all_cells();
draw_all_cells(TRUE);
}
void

Loading…
Cancel
Save

Powered by TurnKey Linux.