tone-generator/data.cpp

85 lines
1.4 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() {
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;
delay(10);
} while(count == eeprom::PAGE_SIZE);
while(serial::is_connected()) {
serial::get();
}
}
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;
}