112 lines
2.0 KiB
C++
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);
|
|
}
|
|
|