zoom/firmware/mode_debug.c

167 lines
2.7 KiB
C

#include "config.h"
#include "adc.h"
#include "dac.h"
#include "uart.h"
#include "timer.h"
#include <stdio.h>
#include <math.h>
#include "calibrate.h"
#include "util.h"
#include "led.h"
#include "mode.h"
static uint16_t dac = DAC_MID;
void sweep(void)
{
int32_t d;
int16_t a;
#define SWEEP ((DAC_HIGH - DAC_LOW) * (int32_t)2000 / 65535)
/* sweep range */
for (d = (int32_t)dac - SWEEP; d < (int32_t)dac + SWEEP; d++) {
if (d < DAC_LOW) {
uart1_put_dec(DAC_LOW);
uart1_put_string(" 0\r\n");
continue;
}
if (d > DAC_HIGH) {
uart1_put_dec(DAC_HIGH);
uart1_put_string(" 0\r\n");
continue;
}
dac_write(d);
msleep(1);
a = adc_get();
uart1_put_dec(d);
uart1_put(' ');
uart1_put_dec(a);
uart1_crlf();
}
}
void run_debug(void)
{
int16_t adc;
int32_t v;
char buf[4];
uart1_init(115200);
led_pattern(0b10101010);
uart1_put_string("Zoom NILM Debug\r\n");
while (1) {
dac = dac & DAC_HIGH; // mask off invalid bits
dac_write(dac);
uart1_put_hex16(dac);
uart1_put(' ');
uart1_put_dec(dac_get_actual_16bit(dac));
uart1_put(' ');
uart1_put(' ');
adc = adc_get();
uart1_put_hex16(adc);
uart1_put(' ');
uart1_put_dec(adc);
uart1_crlf();
switch (uart1_get()) {
// small step
case '[':
dac--;
break;
case ']':
dac++;
break;
// medium step
case '-':
dac -= 16;
break;
case '+':
case '=':
dac += 16;
break;
// big step
case ',':
case '<':
dac -= 1024;
break;
case '.':
case '>':
dac += 1024;
break;
// set DAC to midpoint
case '0':
dac = DAC_MID;
break;
// set DAC to specified hex value
case 'v':
case 'V':
buf[0] = uart1_get();
buf[1] = uart1_get();
buf[2] = uart1_get();
buf[3] = uart1_get();
v = hex_to_u16(buf);
if (v < 0)
uart1_put_string("bad value\r\n");
else
dac = v;
break;
// maintain ADC input at zero
case 'z':
case 'Z':
uart1_put_string("zeroing input...\r\n");
while (!uart1_can_get())
dac = seek(dac, 1024);
uart1_get();
break;
// test seeking
case '1':
uart1_put_string("seek 512\r\n");
dac = seek(dac, 512);
break;
case '2':
uart1_put_string("seek 1536\r\n");
dac = seek(dac, 1536);
break;
// run calibration
case 'c':
case 'C':
uart1_put_string("calibrating...\r\n");
dac = do_calibrate();
uart1_put_string("new g_scale ");
uart1_put_float(g_scale);
uart1_crlf();
break;
// sweep DAC
case 's':
case 'S':
uart1_put_string("sweep around ");
uart1_put_dec(dac);
uart1_crlf();
sweep();
break;
// dump raw ADC value
case 'r':
case 'R':
while(!uart1_can_get()) {
uart1_put_hex16(adc_get_raw());
uart1_crlf();
}
uart1_get();
break;
}
}
}