#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() { char buff[128]; unsigned count; unsigned at = 0; unsigned max_len = eeprom::length(); for(;;) { unsigned count = sizeof(buff); unsigned end = at + count; if(end <= at) { break; } if(end >= max_len) { unsigned l = end - max_len; if(count < l) { break; } count -= l; } count = serial::read(buff, count); eeprom::write(at, buff, count); at += count; if(count != sizeof(buff)) { break; } } while(serial::read(buff, sizeof(buff) == sizeof(buff))) { } } 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; }