2020-08-26 19:57:35 +00:00
|
|
|
#include "hal/system.h"
|
|
|
|
#include "hal/i2c.h"
|
|
|
|
#include "hal/spi.h"
|
|
|
|
#include "hal/usart_gps.h"
|
2021-11-11 16:15:52 +00:00
|
|
|
#include "hal/usart_ext.h"
|
2020-08-26 19:57:35 +00:00
|
|
|
#include "hal/delay.h"
|
2021-08-11 20:24:30 +00:00
|
|
|
#include "hal/datatimer.h"
|
2020-08-26 19:57:35 +00:00
|
|
|
#include "drivers/ubxg6010/ubxg6010.h"
|
|
|
|
#include "drivers/si4032/si4032.h"
|
2022-09-05 06:36:53 +00:00
|
|
|
#include "drivers/pulse_counter/pulse_counter.h"
|
2020-08-26 19:57:35 +00:00
|
|
|
#include "bmp280_handler.h"
|
2023-04-11 14:12:30 +00:00
|
|
|
#include "radsens_handler.h"
|
2020-08-26 19:57:35 +00:00
|
|
|
#include "si5351_handler.h"
|
|
|
|
#include "radio.h"
|
|
|
|
#include "config.h"
|
|
|
|
#include "log.h"
|
|
|
|
|
|
|
|
uint32_t counter = 0;
|
|
|
|
bool led_state = true;
|
|
|
|
|
2020-09-01 19:56:34 +00:00
|
|
|
gps_data current_gps_data;
|
|
|
|
|
2020-08-26 19:57:35 +00:00
|
|
|
void handle_timer_tick()
|
|
|
|
{
|
|
|
|
if (!system_initialized) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
radio_handle_timer_tick();
|
|
|
|
|
2020-09-01 19:56:34 +00:00
|
|
|
counter = (counter + 1) % SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND;
|
2020-08-26 19:57:35 +00:00
|
|
|
if (counter == 0) {
|
2020-09-01 19:56:34 +00:00
|
|
|
ubxg6010_get_current_gps_data(¤t_gps_data);
|
|
|
|
}
|
|
|
|
|
2020-09-10 19:57:41 +00:00
|
|
|
if (leds_enabled) {
|
|
|
|
// Blink fast until GPS fix is acquired
|
2022-09-05 06:36:53 +00:00
|
|
|
if (counter % (SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND / 4) == 0) {
|
2022-02-27 13:45:10 +00:00
|
|
|
if (GPS_HAS_FIX(current_gps_data)) {
|
2020-09-10 19:57:41 +00:00
|
|
|
if (counter == 0) {
|
|
|
|
led_state = !led_state;
|
2022-02-27 13:45:10 +00:00
|
|
|
set_green_led(led_state);
|
2020-09-10 19:57:41 +00:00
|
|
|
}
|
|
|
|
} else {
|
2020-09-01 19:56:34 +00:00
|
|
|
led_state = !led_state;
|
2022-02-27 13:45:10 +00:00
|
|
|
set_green_led(led_state);
|
2020-09-01 19:56:34 +00:00
|
|
|
}
|
|
|
|
}
|
2020-08-26 19:57:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-27 13:45:10 +00:00
|
|
|
void set_green_led(bool enabled)
|
|
|
|
{
|
|
|
|
if ((LEDS_DISABLE_ALTITUDE_METERS > 0) && (current_gps_data.altitude_mm / 1000 > LEDS_DISABLE_ALTITUDE_METERS)) {
|
|
|
|
enabled = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
system_set_green_led(enabled);
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_red_led(bool enabled)
|
|
|
|
{
|
|
|
|
if ((LEDS_DISABLE_ALTITUDE_METERS > 0) && (current_gps_data.altitude_mm / 1000 > LEDS_DISABLE_ALTITUDE_METERS)) {
|
|
|
|
enabled = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
system_set_red_led(enabled);
|
|
|
|
}
|
|
|
|
|
2020-08-26 19:57:35 +00:00
|
|
|
int main(void)
|
|
|
|
{
|
2020-09-01 19:56:34 +00:00
|
|
|
bool success;
|
2021-08-11 20:24:30 +00:00
|
|
|
|
|
|
|
// Set up interrupt handlers
|
2020-08-26 19:57:35 +00:00
|
|
|
system_handle_timer_tick = handle_timer_tick;
|
2021-08-11 20:24:30 +00:00
|
|
|
system_handle_data_timer_tick = radio_handle_data_timer_tick;
|
2020-08-26 19:57:35 +00:00
|
|
|
usart_gps_handle_incoming_byte = ubxg6010_handle_incoming_byte;
|
|
|
|
|
|
|
|
log_info("System init\n");
|
|
|
|
system_init();
|
|
|
|
|
2022-02-27 13:45:10 +00:00
|
|
|
set_green_led(false);
|
|
|
|
set_red_led(true);
|
2020-08-26 19:57:35 +00:00
|
|
|
|
2021-11-11 16:15:52 +00:00
|
|
|
if (gps_nmea_output_enabled) {
|
|
|
|
log_info("External USART init\n");
|
|
|
|
usart_ext_init(EXTERNAL_SERIAL_PORT_BAUD_RATE);
|
2022-09-05 06:36:53 +00:00
|
|
|
} else if (pulse_counter_enabled) {
|
|
|
|
log_info("Pulse counter init\n");
|
|
|
|
pulse_counter_init(PULSE_COUNTER_PIN_MODE, PULSE_COUNTER_INTERRUPT_EDGE);
|
2021-11-11 16:15:52 +00:00
|
|
|
} else {
|
2022-06-16 15:53:54 +00:00
|
|
|
log_info("I2C init: clock speed %d kHz\n", I2C_BUS_CLOCK_SPEED / 1000);
|
|
|
|
i2c_init(I2C_BUS_CLOCK_SPEED);
|
2021-11-11 16:15:52 +00:00
|
|
|
}
|
2022-09-05 06:36:53 +00:00
|
|
|
|
2020-08-26 19:57:35 +00:00
|
|
|
log_info("SPI init\n");
|
|
|
|
spi_init();
|
|
|
|
|
2022-09-05 06:36:53 +00:00
|
|
|
gps_init:
|
2020-08-26 19:57:35 +00:00
|
|
|
log_info("GPS init\n");
|
2020-09-01 19:56:34 +00:00
|
|
|
success = ubxg6010_init();
|
|
|
|
if (!success) {
|
2020-09-03 19:12:43 +00:00
|
|
|
log_error("GPS initialization failed, retrying...\n");
|
|
|
|
delay_ms(1000);
|
2020-09-01 19:56:34 +00:00
|
|
|
goto gps_init;
|
|
|
|
}
|
|
|
|
|
2020-08-26 19:57:35 +00:00
|
|
|
log_info("Si4032 init\n");
|
|
|
|
si4032_init();
|
|
|
|
|
|
|
|
if (bmp280_enabled) {
|
2022-02-27 13:45:10 +00:00
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
log_info("BMP280 init\n");
|
|
|
|
success = bmp280_handler_init();
|
|
|
|
if (success) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
log_error("BMP280 init failed, retrying...");
|
2023-04-11 14:12:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (radsens_enabled) {
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
log_info("RadSens init\n");
|
|
|
|
success = radsens_handler_init();
|
|
|
|
if (success) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
log_error("RadSens init failed, retrying...");
|
2022-02-27 13:45:10 +00:00
|
|
|
}
|
2020-08-26 19:57:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (si5351_enabled) {
|
2022-02-27 13:45:10 +00:00
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
log_info("Si5351 init\n");
|
|
|
|
success = si5351_handler_init();
|
|
|
|
if (success) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
log_error("Si5351 init failed, retrying...");
|
|
|
|
}
|
2020-08-26 19:57:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
log_info("Radio module init\n");
|
|
|
|
radio_init();
|
|
|
|
|
|
|
|
delay_ms(100);
|
|
|
|
|
|
|
|
log_info("System initialized!\n");
|
|
|
|
|
2020-09-10 19:57:41 +00:00
|
|
|
if (leds_enabled) {
|
2022-02-27 13:45:10 +00:00
|
|
|
set_green_led(true);
|
|
|
|
set_red_led(false);
|
2020-09-10 19:57:41 +00:00
|
|
|
} else {
|
2022-02-27 13:45:10 +00:00
|
|
|
set_green_led(false);
|
|
|
|
set_red_led(false);
|
2020-09-10 19:57:41 +00:00
|
|
|
}
|
2020-08-26 19:57:35 +00:00
|
|
|
|
|
|
|
system_initialized = true;
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
radio_handle_main_loop();
|
|
|
|
//NVIC_SystemLPConfig(NVIC_LP_SEVONPEND, DISABLE);
|
|
|
|
//__WFI();
|
|
|
|
}
|
|
|
|
}
|
2022-11-21 21:56:32 +00:00
|
|
|
|
2022-11-22 08:41:23 +00:00
|
|
|
// The following definition is a workaround to allow compilation and linking to succeed after some recent changes in GCC (at least in Fedora Linux).
|
|
|
|
// See discussion in: https://github.com/mikaelnousiainen/RS41ng/issues/23
|
2022-11-21 21:56:32 +00:00
|
|
|
void* __dso_handle;
|