tone-generator/scheduler.cpp

112 lines
2.0 KiB
C++

#include <Arduino.h>
#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);
}