#include #include #include "data.hpp" #include "serial.hpp" #include "eeprom.hpp" #include "scheduler.hpp" #include "indicator.hpp" #include "buttons.hpp" #include "dac.hpp" using namespace data; static Mode mode = Mode::none; static void flash_data() { uint32_t at = 0; uint16_t count; char buffer[eeprom::PAGE_SIZE]; do { count = serial::read(buffer, eeprom::PAGE_SIZE); eeprom::page_write(at, buffer); at += eeprom::PAGE_SIZE; } while(count == eeprom::PAGE_SIZE); while(serial::is_connected()) { serial::read(buffer, eeprom::PAGE_SIZE); } } void data::update() { static int last = 2; int now = serial::is_connected() ? 1 : 0; 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; scheduler::state = scheduler::State::end; break; case Mode::local: eeprom::jump(0); scheduler::state = scheduler::State::play; scheduler::reset(); break; case Mode::stream: scheduler::state = scheduler::State::play; scheduler::reset(); break; } } else { mode = Mode::local; eeprom::jump(0); 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; } 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; } }