103 lines
2.1 KiB
C++
103 lines
2.1 KiB
C++
|
|
||
|
#include <Arduino.h>
|
||
|
#include "util.hpp"
|
||
|
#include "commands.hpp"
|
||
|
#include "serial.hpp"
|
||
|
#include "tones.hpp"
|
||
|
#include "scheduler.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(" v: volume v,level,");
|
||
|
Serial.println(" s: set s,timestamp,index,freq,");
|
||
|
Serial.println(" c: clear v,timestamp,index,");
|
||
|
Serial.println(" p: play :p,");
|
||
|
Serial.println(" r: reset :r,");
|
||
|
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 'v':
|
||
|
scheduler::add_volume(serial::read_float());
|
||
|
break;
|
||
|
case 's':
|
||
|
scheduler::add_set(serial::read_int(), serial::read_int(), serial::read_int());
|
||
|
break;
|
||
|
case 'c':
|
||
|
scheduler::add_clear(serial::read_int(), serial::read_int());
|
||
|
break;
|
||
|
case ';':
|
||
|
return false;
|
||
|
default:
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
scheduler::finalize();
|
||
|
}
|
||
|
|
||
|
void commands::process() {
|
||
|
serial::read_until();
|
||
|
switch(serial::buffer[0]) {
|
||
|
case 'w':
|
||
|
if(write()) break;
|
||
|
Serial.println("OK");
|
||
|
return;
|
||
|
case 's':
|
||
|
tones::set(serial::read_int(), serial::read_int(), serial::read_int());
|
||
|
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");
|
||
|
break;
|
||
|
case 'r':
|
||
|
tones::clear_all();
|
||
|
Serial.println("OK");
|
||
|
return;
|
||
|
case 'h':
|
||
|
help();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Serial.println("ERROR");
|
||
|
}
|
||
|
|