#include #include #include "data.hpp" #include "serial.hpp" #include "eeprom.hpp" #include "scheduler.hpp" #include "indicator.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; 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; break; case Mode::local: eeprom::jump(0); scheduler::reset(); break; case Mode::stream: scheduler::reset(); break; } } else { mode = Mode::local; eeprom::jump(0); 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; }