#include #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"); }