#include #include "timing.hpp" #include "scheduler.hpp" #include "eeprom.hpp" #include "entry.hpp" #include "tones.hpp" #include "util.hpp" static float amplitude = 0.25; static float ts_last = 0; struct { uint8_t index; uint16_t frequency; float amplitude; } next; void scheduler::do_next() { if(running) { tones::set(next.index, next.frequency, next.amplitude); } else { eeprom::jump(0); running = true; } entry::Type type; eeprom::read(type); switch(type) { case entry::Type::VOLUME: { eeprom::read(amplitude); break; } case entry::Type::SET: { entry::Set e; eeprom::read(e); next = {e.index, e.frequency, amplitude}; break; } case entry::Type::CLEAR: { entry::Clear e; eeprom::read(e); next = {e.index, 0, 0}; break; } case entry::Type::SET_TS: { entry::SetTS e; eeprom::read(e); timestamp = e.timestamp; next = {e.index, e.frequency, amplitude}; break; } case entry::Type::CLEAR_TS: { entry::ClearTS e; eeprom::read(e); timestamp = e.timestamp; next = {e.index, 0, 0}; break; } default: { running = false; break; } } } void scheduler::clear() { eeprom::jump(0); ts_last = 0; } void scheduler::add_set(uint32_t ts, uint8_t index, uint16_t freq) { if(index >= size(tones::all)) { return; } if(ts <= ts_last) { entry::Set e {index, freq}; eeprom::write(entry::Type::SET); eeprom::write(e); } else { entry::SetTS e {index, freq, ts}; eeprom::write(entry::Type::SET_TS); eeprom::write(e); } } void scheduler::add_clear(uint32_t ts, uint8_t index) { if(index >= size(tones::all)) { return; } if(ts <= ts_last) { entry::Clear e {index}; eeprom::write(entry::Type::CLEAR); eeprom::write(e); } else { entry::ClearTS e {index, ts}; eeprom::write(entry::Type::CLEAR_TS); eeprom::write(e); } } void scheduler::add_volume(float volume) { eeprom::write(entry::Type::VOLUME); eeprom::write(volume); } void scheduler::finalize() { eeprom::write(entry::Type::STOP); }