tone-generator/data.cpp

102 lines
1.7 KiB
C++

#include <Arduino.h>
#include <avr/pgmspace.h>
#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;
}