OpenModem/main.c

111 lines
2.5 KiB
C
Raw Normal View History

2014-12-03 00:10:06 +00:00
#include <stdbool.h>
#include <avr/io.h>
2019-01-27 19:25:11 +00:00
#include <avr/wdt.h>
2019-01-29 15:41:27 +00:00
#include <avr/pgmspace.h>
2019-02-08 12:18:49 +00:00
#include <util/atomic.h>
2019-01-29 15:41:27 +00:00
#include <stdio.h>
2019-01-27 19:25:11 +00:00
#include <string.h>
#include <stdlib.h>
2014-12-03 00:10:06 +00:00
#include "device.h"
#include "hardware/VREF.h"
2014-12-03 00:10:06 +00:00
#include "hardware/AFSK.h"
#include "hardware/Serial.h"
2019-01-12 14:12:51 +00:00
#include "hardware/LED.h"
2019-01-29 15:41:27 +00:00
#include "hardware/UserIO.h"
2019-01-27 19:25:11 +00:00
#include "hardware/SD.h"
2019-02-04 21:30:52 +00:00
#include "hardware/Crypto.h"
2019-01-29 15:41:27 +00:00
#include "hardware/Bluetooth.h"
2019-02-04 16:02:19 +00:00
#include "hardware/GPS.h"
2014-12-03 00:10:06 +00:00
#include "protocol/AX25.h"
#include "protocol/KISS.h"
2019-02-08 12:18:49 +00:00
#include "util/Config.h"
#include "util/time.h"
#include "util/FIFO.h"
2014-12-03 00:10:06 +00:00
2019-01-27 19:25:11 +00:00
uint8_t boot_vector = 0x00;
uint8_t OPTIBOOT_MCUSR __attribute__ ((section(".noinit")));
void resetFlagsInit(void) __attribute__ ((naked)) __attribute__ ((used)) __attribute__ ((section (".init0")));
void resetFlagsInit(void) {
__asm__ __volatile__ ("sts %0, r2\n" : "=m" (OPTIBOOT_MCUSR) :);
}
2014-12-03 00:10:06 +00:00
Serial serial;
Afsk modem;
AX25Ctx AX25;
static void ax25_callback(struct AX25Ctx *ctx) {
kiss_messageCallback(ctx);
}
2014-12-03 00:10:06 +00:00
2019-01-12 14:12:51 +00:00
void system_check(void) {
2019-02-08 12:18:49 +00:00
// Check boot vector
2019-01-27 19:25:11 +00:00
if (OPTIBOOT_MCUSR & (1<<PORF)) {
boot_vector = START_FROM_POWERON;
} else if (OPTIBOOT_MCUSR & (1<<BORF)) {
boot_vector = START_FROM_BROWNOUT;
} else if (OPTIBOOT_MCUSR & (1<<WDRF)) {
boot_vector = START_FROM_BOOTLOADER;
} else {
2019-01-29 15:41:27 +00:00
printf(PSTR("Error, indeterminate boot vector %d\r\n"), OPTIBOOT_MCUSR);
printf(PSTR("System start has been halted\r\n"));
2019-01-27 19:25:11 +00:00
while (true) {
LED_TX_ON();
LED_COM_ON();
}
}
2019-02-08 12:18:49 +00:00
// If encryption was previously enabled, require
// it to be initialised to start system.
if (config_crypto_lock) {
if (!crypto_wait()) {
// If initialising crypto times out,
// halt system and display error signal
LED_indicate_error_crypto();
}
}
2019-11-08 15:36:01 +00:00
// TODO: Check GPS_REQUIRED and BLUETOOTH_REQUIRED
// here before giving green light.
2019-02-08 12:18:49 +00:00
// Give the green light if everything checks out
2019-01-12 14:12:51 +00:00
LED_STATUS_ON();
}
2014-12-03 00:10:06 +00:00
void init(void) {
2019-02-08 12:18:49 +00:00
2014-12-04 14:22:25 +00:00
sei();
2014-12-18 22:45:36 +00:00
2014-12-18 23:15:56 +00:00
serial_init(&serial);
stdout = &serial.uart0;
stdin = &serial.uart0;
2019-02-08 12:18:49 +00:00
config_init();
VREF_init();
2019-01-12 14:12:51 +00:00
LED_init();
AFSK_init(&modem);
ax25_init(&AX25, &modem, &modem.fd, ax25_callback);
kiss_init(&AX25, &modem, &serial);
2019-01-27 19:25:11 +00:00
sd_init();
2019-01-29 15:41:27 +00:00
bluetooth_init();
2019-02-04 16:02:19 +00:00
gps_init(&serial);
2019-01-29 15:41:27 +00:00
usrio_init();
2019-01-12 14:12:51 +00:00
system_check();
2014-12-03 00:10:06 +00:00
}
2019-01-12 15:30:26 +00:00
2014-12-03 00:10:06 +00:00
int main (void) {
init();
while (true) {
ax25_poll(&AX25);
2019-01-08 19:56:58 +00:00
kiss_poll();
kiss_csma();
2019-01-29 15:41:27 +00:00
sd_jobs();
2019-02-04 16:02:19 +00:00
gps_poll();
}
2014-12-03 00:10:06 +00:00
return(0);
}