tone-generator/data.cpp

110 lines
1.9 KiB
C++
Raw Normal View History

#include <Arduino.h>
#include <avr/pgmspace.h>
#include "data.hpp"
#include "serial.hpp"
#include "eeprom.hpp"
#include "scheduler.hpp"
#include "indicator.hpp"
2024-09-27 22:46:51 +10:00
#include "buttons.hpp"
#include "dac.hpp"
using namespace data;
static Mode mode = Mode::none;
static void flash_data() {
2024-08-31 01:53:25 +10:00
uint32_t at = 0;
uint16_t count;
char buffer[eeprom::PAGE_SIZE];
2024-08-31 01:53:25 +10:00
do {
count = serial::read(buffer, eeprom::PAGE_SIZE);
eeprom::page_write(at, buffer);
at += eeprom::PAGE_SIZE;
} while(count == eeprom::PAGE_SIZE);
2024-08-31 01:53:25 +10:00
while(serial::is_connected()) {
serial::read(buffer, eeprom::PAGE_SIZE);
}
}
void data::update() {
static int last = 2;
int now = serial::is_connected() ? 1 : 0;
2024-09-27 22:46:51 +10:00
buttons::update();
if(last == now) {
return;
}
dac::reset();
indicator::reset();
last = now;
if(now) {
while(serial::dev.available()) {
serial::get();
}
delay(10);
serial::write("\x19\xc1\x6c\x19\x5b\x6f\xd2\x44", 8);
mode = serial::get();
switch(mode) {
case Mode::flash:
flash_data();
mode = Mode::none;
2024-09-27 22:46:51 +10:00
scheduler::state = scheduler::State::end;
break;
case Mode::local:
eeprom::jump(0);
2024-09-27 22:46:51 +10:00
scheduler::state = scheduler::State::play;
scheduler::reset();
break;
case Mode::stream:
2024-09-27 22:46:51 +10:00
scheduler::state = scheduler::State::play;
scheduler::reset();
break;
}
2024-09-29 18:07:58 +10:00
} else {
mode = Mode::local;
eeprom::jump(0);
2024-09-27 22:46:51 +10:00
scheduler::state = scheduler::State::pause;
scheduler::reset();
}
}
unsigned data::read(char* data, unsigned len) {
unsigned count = 0;
switch(mode) {
case Mode::local:
eeprom::read(data, len);
count = len;
break;
case Mode::stream:
count = serial::read(data, len);
break;
}
for(unsigned i = count; i < len; i++) {
data[i] = 0;
}
return count;
}
2024-09-29 18:07:58 +10:00
bool data::jump(uint32_t addr) {
switch(mode) {
case Mode::local:
eeprom::jump(addr);
break;
default:
return false;
}
return true;
}
uint32_t data::get_addr() {
switch(mode) {
case Mode::local:
return eeprom::get_addr();
default:
return 0;
}
}