140 lines
3.0 KiB
C++
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");
|
|
}
|
|
|