tone-generator/commands.cpp

140 lines
3.0 KiB
C++

#include <Arduino.h>
#include "util.hpp"
#include "commands.hpp"
#include "serial.hpp"
#include "tones.hpp"
#include "scheduler.hpp"
#include "eeprom.hpp"
static void help() {
Serial.println("OK help");
Serial.println(" s: set :s,index,freq,amplitude,");
Serial.println(" c: clear :c,index,");
Serial.println(" g: get :g,index,");
Serial.println(" w: write :w,[v|s|c,...]...;,");
Serial.println(" o: option v,amplitude,us_per_tick,");
Serial.println(" s: set s,timestamp,index,freq,");
Serial.println(" c: clear v,timestamp,index,");
Serial.println(" p: play :p,");
Serial.println(" q: stop :q,");
Serial.println(" r: reset :r,");
Serial.println(" e: eeprom :e,");
Serial.println(" h: help :h,");
}
static bool get() {
int index = serial::read_int();
if(index < 0 || index >= size(tones::all)) {
return true;
}
if(index >= tones::active) {
tones::active = index + 1;
}
Serial.print("OK ");
Serial.print(index);
Serial.print(',');
Serial.print(tones::all[index].frequency);
Serial.print(',');
Serial.print(tones::all[index].amplitude);
Serial.print(',');
Serial.println();
return false;
}
static bool write() {
scheduler::clear();
for(;;) {
serial::read_until();
switch(serial::buffer[0]) {
case 'o': {
float amplitude = serial::read_float();
uint32_t us_per_tick = serial::read_long();
scheduler::add_config(amplitude, us_per_tick);
break;
}
case 's': {
uint32_t ts = serial::read_long();
uint8_t index = serial::read_int();
uint16_t freq = serial::read_int();
scheduler::add_set(ts, index, freq);
break;
}
case 'c': {
uint32_t ts = serial::read_long();
uint8_t index = serial::read_int();
scheduler::add_clear(ts, index);
break;
}
case ';':
return false;
default:
return true;
}
Serial.println();
}
scheduler::finalize();
}
static const char HEXC[] = "0123456789abcdef";
void commands::process() {
serial::read_until();
switch(serial::buffer[0]) {
case 'w':
if(write()) break;
Serial.println("OK");
return;
case 's': {
uint8_t index = serial::read_int();
uint16_t freq = serial::read_int();
float amp = serial::read_float();
tones::set(index, freq, amp);
Serial.println("OK");
return;
}
case 'c':
tones::clear(serial::read_int());
Serial.println("OK");
return;
case 'g':
if(get()) break;
return;
case 'p':
scheduler::running = false;
scheduler::do_next();
Serial.println("OK");
return;
case 'q':
scheduler::running = false;
Serial.println("OK");
return;
case 'e':
eeprom::jump(0);
Serial.println("OK serial");
for(int i = 0; i < 1024; i+=16) {
Serial.print(i);
Serial.print('\t');
eeprom::read(serial::buffer, 16);
for(int j = 0; j < 16; j++) {
Serial.print(HEXC[(serial::buffer[j] >> 4) & 0x0f]);
Serial.print(HEXC[serial::buffer[j] & 0x0f]);
}
Serial.println();
}
case 'r':
tones::clear_all();
Serial.println("OK");
return;
case 'h':
help();
return;
}
Serial.println("ERROR");
}