2024-08-26 13:02:17 +10:00
|
|
|
|
|
|
|
#include <Arduino.h>
|
|
|
|
#include <avr/pgmspace.h>
|
|
|
|
#include "data.hpp"
|
2024-08-28 13:10:57 +10:00
|
|
|
#include "serial.hpp"
|
|
|
|
#include "eeprom.hpp"
|
|
|
|
#include "scheduler.hpp"
|
|
|
|
#include "indicator.hpp"
|
|
|
|
#include "dac.hpp"
|
2024-08-26 13:02:17 +10:00
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
using namespace data;
|
2024-08-26 13:02:17 +10:00
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
static Mode mode = Mode::none;
|
2024-08-26 13:02:17 +10:00
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
static void flash_data() {
|
|
|
|
char buff[128];
|
|
|
|
unsigned count;
|
|
|
|
unsigned at = 0;
|
|
|
|
unsigned max_len = eeprom::length();
|
2024-08-26 13:02:17 +10:00
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
for(;;) {
|
|
|
|
unsigned count = sizeof(buff);
|
|
|
|
unsigned end = at + count;
|
2024-08-26 13:02:17 +10:00
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
if(end <= at) {
|
2024-08-26 13:02:17 +10:00
|
|
|
break;
|
|
|
|
}
|
2024-08-28 13:10:57 +10:00
|
|
|
if(end >= max_len) {
|
|
|
|
unsigned l = end - max_len;
|
|
|
|
if(count < l) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
count -= l;
|
|
|
|
}
|
2024-08-26 13:02:17 +10:00
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
count = serial::read(buff, count);
|
|
|
|
eeprom::write(at, buff, count);
|
|
|
|
at += count;
|
2024-08-26 13:02:17 +10:00
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
if(count != sizeof(buff)) {
|
|
|
|
break;
|
|
|
|
}
|
2024-08-26 13:02:17 +10:00
|
|
|
}
|
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
while(serial::read(buff, sizeof(buff) == sizeof(buff))) {
|
2024-08-26 13:02:17 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
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();
|
2024-08-26 13:02:17 +10:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-28 13:10:57 +10:00
|
|
|
unsigned data::read(char* data, unsigned len) {
|
|
|
|
unsigned count = 0;
|
2024-08-26 13:02:17 +10:00
|
|
|
switch(mode) {
|
|
|
|
case Mode::local:
|
2024-08-28 13:10:57 +10:00
|
|
|
eeprom::read(data, len);
|
|
|
|
count = len;
|
2024-08-26 13:02:17 +10:00
|
|
|
break;
|
2024-08-28 13:10:57 +10:00
|
|
|
case Mode::stream:
|
|
|
|
count = serial::read(data, len);
|
2024-08-26 13:02:17 +10:00
|
|
|
break;
|
|
|
|
}
|
2024-08-28 13:10:57 +10:00
|
|
|
for(unsigned i = count; i < len; i++) {
|
|
|
|
data[i] = 0;
|
|
|
|
}
|
|
|
|
return count;
|
2024-08-26 13:02:17 +10:00
|
|
|
}
|
|
|
|
|