Get build building

This commit is contained in:
Adam Novak 2022-02-13 20:20:21 -05:00
parent c46ec5778d
commit d01a4b293f
6 changed files with 223 additions and 121 deletions

View file

@ -1,4 +1,6 @@
#include <EEPROM.h>
#if LIBRARY_TYPE == LIBRARY_ARDUINO
#include <EEPROM.h>
#endif
#include <stddef.h>
#include "Config.h"
#include "LoRa.h"
@ -6,6 +8,81 @@
#include "Framing.h"
#include "MD5.h"
#if LIBRARY_TYPE == LIBRARY_C
#include <time.h>
// We need a delay()
void delay(int ms) {
struct timespec interval;
interval.tv_sec = ms / 1000;
interval.tv_nsec = (ms % 1000) * 1000 * 1000;
// TODO: handle signals interrupting sleep
nanosleep(&interval, NULL);
}
// And millis()
struct timespec millis_base;
uint32_t millis() {
// Time since first call is close enough.
static bool base_set(false);
if (!base_set) {
if (clock_gettime(CLOCK_MONOTONIC, &millis_base)) {
exit(1);
}
base_set = true;
}
struct timespec now;
if (clock_gettime(CLOCK_MONOTONIC, &now)) {
exit(1);
}
return (now.tv_sec - millis_base.tv_sec) * 1000 + (now.tv_nsec - millis_base.tv_nsec)/(1000*1000);
}
// We also need a Serial
class SerialClass {
public:
const char* fifoPath = "rnode_socket";
void begin(int baud) {
int status = mkfifo(fifoPath, 0666);
if (status) {
perror("Making fifo failed");
exit(1);
}
// TODO: Need a bidirectional thing here: openpty???
_fd = open(fifoPath, O_RDWR);
if (_fd < 0) {
perror("could not open fifo");
exit(1);
}
}
// Be truthy if connected
operator bool() {
return _fd > 0;
}
void write(int b) {
ssize_t written = ::write(_fd,
}
void write(const char* data) {
throw std::runtime_error("Unimplemented");
}
bool available() {
throw std::runtime_error("Unimplemented");
}
uint8_t read() {
throw std::runtime_error("Unimplemented");
}
protected:
int _fd = -1;
};
SerialClass Serial;
// And random(below);
int random(int below) {
return rand() % below;
}
#endif
#if MCU_VARIANT == MCU_ESP32
#include "soc/rtc_wdt.h"
#define ISR_VECT IRAM_ATTR
@ -68,7 +145,15 @@ uint8_t boot_vector = 0x00;
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
#endif
#endif
#elif MCU_VARIANT == MCU_LINUX
#if BOARD_MODEL == BOARD_SPIDEV
// No LEDs on this board. SPI only.
void led_rx_on() { }
void led_rx_off() { }
void led_tx_on() { }
void led_tx_off() { }
#endif
#endif
void hard_reset(void) {
@ -79,23 +164,27 @@ void hard_reset(void) {
}
#elif MCU_VARIANT == MCU_ESP32
ESP.restart();
#elif MCU_VARIANT == MCU_LINUX
// TODO: re-exec ourselves?
// For now just quit.
exit(0);
#endif
}
void led_indicate_error(int cycles) {
bool forever = (cycles == 0) ? true : false;
cycles = forever ? 1 : cycles;
while(cycles > 0) {
digitalWrite(pin_led_rx, HIGH);
digitalWrite(pin_led_tx, LOW);
delay(100);
digitalWrite(pin_led_rx, LOW);
digitalWrite(pin_led_tx, HIGH);
delay(100);
if (!forever) cycles--;
}
led_rx_off();
while(cycles > 0) {
led_rx_on();
led_tx_off();
delay(100);
led_rx_off();
led_tx_on();
delay(100);
if (!forever) cycles--;
}
led_rx_off();
led_tx_off();
}
void led_indicate_boot_error() {
@ -112,7 +201,7 @@ void led_indicate_boot_error() {
void led_indicate_warning(int cycles) {
bool forever = (cycles == 0) ? true : false;
cycles = forever ? 1 : cycles;
digitalWrite(pin_led_tx, HIGH);
led_tx_on();
while(cycles > 0) {
led_tx_off();
delay(100);
@ -123,7 +212,7 @@ void led_indicate_warning(int cycles) {
led_tx_off();
}
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560 || MCU_VARIANT == MCU_LINUX
void led_indicate_info(int cycles) {
bool forever = (cycles == 0) ? true : false;
cycles = forever ? 1 : cycles;
@ -179,8 +268,9 @@ void led_indicate_warning(int cycles) {
#endif
#endif
unsigned long led_standby_ticks = 0;
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560 || MCU_VARIANT == MCU_ESP32
unsigned long led_standby_ticks = 0;
#endif
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560
uint8_t led_standby_min = 1;
uint8_t led_standby_max = 40;
@ -196,8 +286,10 @@ unsigned long led_standby_ticks = 0;
unsigned long led_standby_wait = 1768;
unsigned long led_notready_wait = 150;
#endif
uint8_t led_standby_value = led_standby_min;
int8_t led_standby_direction = 0;
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560 || MCU_VARIANT == MCU_ESP32
uint8_t led_standby_value = led_standby_min;
int8_t led_standby_direction = 0;
#endif
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560
void led_indicate_standby() {
@ -243,6 +335,9 @@ int8_t led_standby_direction = 0;
#endif
}
}
#elif MCU_VARIANT == MCU_LINUX
// No LEDs available.
void led_indicate_standby() {}
#endif
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560
@ -289,6 +384,9 @@ int8_t led_standby_direction = 0;
#endif
}
}
#elif MCU_VARIANT == MCU_LINUX
// No LEDs available.
void led_indicate_not_ready() {}
#endif
void escapedSerialWrite(uint8_t byte) {
@ -551,8 +649,16 @@ void promisc_disable() {
promisc = false;
}
uint8_t eeprom_read(uint8_t addr) {
#if MCU_VARIANT == MCU_LINUX
return 0;
#else
return EEPROM.read(eeprom_addr(addr));
#endif
}
bool eeprom_info_locked() {
uint8_t lock_byte = EEPROM.read(eeprom_addr(ADDR_INFO_LOCK));
uint8_t lock_byte = eeprom_read(ADDR_INFO_LOCK);
if (lock_byte == INFO_LOCK_BYTE) {
return true;
} else {
@ -560,34 +666,6 @@ bool eeprom_info_locked() {
}
}
void eeprom_dump_info() {
for (int addr = ADDR_PRODUCT; addr <= ADDR_INFO_LOCK; addr++) {
uint8_t byte = EEPROM.read(eeprom_addr(addr));
escapedSerialWrite(byte);
}
}
void eeprom_dump_config() {
for (int addr = ADDR_CONF_SF; addr <= ADDR_CONF_OK; addr++) {
uint8_t byte = EEPROM.read(eeprom_addr(addr));
escapedSerialWrite(byte);
}
}
void eeprom_dump_all() {
for (int addr = 0; addr < EEPROM_RESERVED; addr++) {
uint8_t byte = EEPROM.read(eeprom_addr(addr));
escapedSerialWrite(byte);
}
}
void kiss_dump_eeprom() {
Serial.write(FEND);
Serial.write(CMD_ROM_READ);
eeprom_dump_all();
Serial.write(FEND);
}
void eeprom_update(int mapped_addr, uint8_t byte) {
#if MCU_VARIANT == MCU_1284P || MCU_VARIANT == MCU_2560
EEPROM.update(mapped_addr, byte);
@ -597,7 +675,6 @@ void eeprom_update(int mapped_addr, uint8_t byte) {
EEPROM.commit();
}
#endif
}
void eeprom_write(uint8_t addr, uint8_t byte) {
@ -615,16 +692,36 @@ void eeprom_erase() {
hard_reset();
}
bool eeprom_lock_set() {
if (EEPROM.read(eeprom_addr(ADDR_INFO_LOCK)) == INFO_LOCK_BYTE) {
return true;
} else {
return false;
void eeprom_dump_info() {
for (int addr = ADDR_PRODUCT; addr <= ADDR_INFO_LOCK; addr++) {
uint8_t byte = eeprom_read(addr);
escapedSerialWrite(byte);
}
}
void eeprom_dump_config() {
for (int addr = ADDR_CONF_SF; addr <= ADDR_CONF_OK; addr++) {
uint8_t byte = eeprom_read(addr);
escapedSerialWrite(byte);
}
}
void eeprom_dump_all() {
for (int addr = 0; addr < EEPROM_RESERVED; addr++) {
uint8_t byte = eeprom_read(addr);
escapedSerialWrite(byte);
}
}
void kiss_dump_eeprom() {
Serial.write(FEND);
Serial.write(CMD_ROM_READ);
eeprom_dump_all();
Serial.write(FEND);
}
bool eeprom_product_valid() {
uint8_t rval = EEPROM.read(eeprom_addr(ADDR_PRODUCT));
uint8_t rval = eeprom_read(ADDR_PRODUCT);
#if PLATFORM == PLATFORM_AVR
if (rval == PRODUCT_RNODE || rval == PRODUCT_HMBRW) {
@ -640,7 +737,7 @@ bool eeprom_product_valid() {
}
bool eeprom_model_valid() {
model = EEPROM.read(eeprom_addr(ADDR_MODEL));
model = eeprom_read(ADDR_MODEL);
#if BOARD_MODEL == BOARD_RNODE
if (model == MODEL_A4 || model == MODEL_A9) {
#elif BOARD_MODEL == BOARD_HMBRW
@ -665,7 +762,7 @@ bool eeprom_model_valid() {
}
bool eeprom_hwrev_valid() {
hwrev = EEPROM.read(eeprom_addr(ADDR_HW_REV));
hwrev = eeprom_read(ADDR_HW_REV);
if (hwrev != 0x00 && hwrev != 0xFF) {
return true;
} else {
@ -676,14 +773,14 @@ bool eeprom_hwrev_valid() {
bool eeprom_checksum_valid() {
char *data = (char*)malloc(CHECKSUMMED_SIZE);
for (uint8_t i = 0; i < CHECKSUMMED_SIZE; i++) {
char byte = EEPROM.read(eeprom_addr(i));
char byte = eeprom_read(i);
data[i] = byte;
}
unsigned char *hash = MD5::make_hash(data, CHECKSUMMED_SIZE);
bool checksum_valid = true;
for (uint8_t i = 0; i < 16; i++) {
uint8_t stored_chk_byte = EEPROM.read(eeprom_addr(ADDR_CHKSUM+i));
uint8_t stored_chk_byte = eeprom_read(ADDR_CHKSUM+i);
uint8_t calced_chk_byte = (uint8_t)hash[i];
if (stored_chk_byte != calced_chk_byte) {
checksum_valid = false;
@ -696,7 +793,7 @@ bool eeprom_checksum_valid() {
}
bool eeprom_have_conf() {
if (EEPROM.read(eeprom_addr(ADDR_CONF_OK)) == CONF_OK_BYTE) {
if (eeprom_read(ADDR_CONF_OK) == CONF_OK_BYTE) {
return true;
} else {
return false;
@ -705,11 +802,11 @@ bool eeprom_have_conf() {
void eeprom_conf_load() {
if (eeprom_have_conf()) {
lora_sf = EEPROM.read(eeprom_addr(ADDR_CONF_SF));
lora_cr = EEPROM.read(eeprom_addr(ADDR_CONF_CR));
lora_txp = EEPROM.read(eeprom_addr(ADDR_CONF_TXP));
lora_freq = (uint32_t)EEPROM.read(eeprom_addr(ADDR_CONF_FREQ)+0x00) << 24 | (uint32_t)EEPROM.read(eeprom_addr(ADDR_CONF_FREQ)+0x01) << 16 | (uint32_t)EEPROM.read(eeprom_addr(ADDR_CONF_FREQ)+0x02) << 8 | (uint32_t)EEPROM.read(eeprom_addr(ADDR_CONF_FREQ)+0x03);
lora_bw = (uint32_t)EEPROM.read(eeprom_addr(ADDR_CONF_BW)+0x00) << 24 | (uint32_t)EEPROM.read(eeprom_addr(ADDR_CONF_BW)+0x01) << 16 | (uint32_t)EEPROM.read(eeprom_addr(ADDR_CONF_BW)+0x02) << 8 | (uint32_t)EEPROM.read(eeprom_addr(ADDR_CONF_BW)+0x03);
lora_sf = eeprom_read(ADDR_CONF_SF);
lora_cr = eeprom_read(ADDR_CONF_CR);
lora_txp = eeprom_read(ADDR_CONF_TXP);
lora_freq = (uint32_t)eeprom_read(ADDR_CONF_FREQ+0x00) << 24 | (uint32_t)eeprom_read(ADDR_CONF_FREQ+0x01) << 16 | (uint32_t)eeprom_read(ADDR_CONF_FREQ+0x02) << 8 | (uint32_t)eeprom_read(ADDR_CONF_FREQ+0x03);
lora_bw = (uint32_t)eeprom_read(ADDR_CONF_BW+0x00) << 24 | (uint32_t)eeprom_read(ADDR_CONF_BW+0x01) << 16 | (uint32_t)eeprom_read(ADDR_CONF_BW+0x02) << 8 | (uint32_t)eeprom_read(ADDR_CONF_BW+0x03);
}
}
@ -784,7 +881,7 @@ inline void fifo_flush(FIFOBuffer *f) {
f->head = f->tail;
}
#if MCU_VARIANT != MCU_ESP32
#if SERIAL_EVENTS == SERIAL_INTERRUPT
static inline bool fifo_isempty_locked(const FIFOBuffer *f) {
bool result;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
@ -866,7 +963,7 @@ inline void fifo16_flush(FIFOBuffer16 *f) {
f->head = f->tail;
}
#if MCU_VARIANT != MCU_ESP32
#if SERIAL_EVENTS == SERIAL_INTERRUPT
static inline bool fifo16_isempty_locked(const FIFOBuffer16 *f) {
bool result;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {