diff --git a/src/config.c b/src/config.c index 78d21e3..a66dbac 100644 --- a/src/config.c +++ b/src/config.c @@ -56,10 +56,10 @@ volatile bool system_initialized = false; * Maximum length: 64 characters. */ char *cw_message_templates[] = { -// "$cs $loc6 $altm $gs km/h $tiC", + "vvv de $cs solar rs41 $loc8 $altm $gs kmh sk", // "$cs $loc6", // "$alt m", -// "$gs km/h $ti C", +// "$gs kmh $ti C", NULL }; @@ -78,7 +78,7 @@ char *pip_message_templates[] = { * Note that many hardware APRS receivers show a limited number of APRS comment characters, such as 43 or 67 chars. */ char *aprs_comment_templates[] = { -// " B$bu $teC $hu% $prmb $hh:$mm:$ss @ $tow ms - " APRS_COMMENT, + " $ $altm $gskm/h $bvmV $clvel dir:$he - " APRS_COMMENT, // " B$bu $teC $hu% $prmb - " APRS_COMMENT, // " B$bu $loc12 $hh:$mm:$ss - " APRS_COMMENT, // " $loc12 - " APRS_COMMENT, diff --git a/src/config.h b/src/config.h index 4feb566..174ce68 100644 --- a/src/config.h +++ b/src/config.h @@ -6,15 +6,14 @@ // NOTE: DFM-17 radiosondes require a GPS lock (and clear visibility to the sky) to calibrate its internal oscillator. // DFM-17 transmissions, especially APRS, may not decode correctly because of incorrect timing before the internal oscillator has been calibrated. -// Define radiosonde type. Remove the "//" comment to select either RS41 or DFM17. -//#define RS41 -//#define DFM17 +// Define radiosonde type. +// This clone supports only RS41 - DO NOT TRY TO USES DFM17 !!!!!!!!! +// ------------------------------------------------------------------ +#define RS41 +// ------------------------------------------------------------------ -#if !defined(RS41) && !defined(DFM17) -#error "No hardware type specified. Please define RS41 or DFM17." -#endif -#if defined(RS41) && defined(DFM17) -#error "Please define either RS41 or DFM17." +#if !defined(RS41) +#error "Please define ONLY RS41. Support DFM17 is not fully implemented yet" #endif @@ -29,7 +28,7 @@ */ // Set the tracker amateur radio call sign here -#define CALLSIGN "MYCALL" +#define CALLSIGN "yourCall" // Disabling LEDs will save power // Red LED: Lit during initialization and transmit. @@ -43,12 +42,14 @@ #define ALLOW_POWER_OFF false // Number of character pairs to include in locator -#define LOCATOR_PAIR_COUNT_FULL 6 // max. 6 (12 characters WWL) +#define LOCATOR_PAIR_COUNT_FULL 12 // max. 6 (12 characters WWL) // Delay after transmission for modes that do not use time synchronization. Zero delay allows continuous transmit mode for Horus V1 and V2. #define RADIO_POST_TRANSMIT_DELAY_MS 1000 // Threshold for time-synchronized modes regarding how far from scheduled transmission time the transmission is still allowed +// best Results for 4FSK : 2500 +// if value here is to high, TX send packets more than once #define RADIO_TIME_SYNC_THRESHOLD_MS 2000 // Number of leap seconds to add to the raw GPS time reported by the GPS chip (see https://timetoolsltd.com/gps/what-is-gps-time/ for more info) @@ -59,10 +60,16 @@ #define GPS_REQUIRE_3D_FIX true // Enable this setting to make a cold start on the CPU if GPS-Fix missing longer then GPS_REBOOT_MISSING_GPS_FIX_SECONDS -#define GPS_REBOOT_MISSING_GPS_FIX_ENABLE false +#define GPS_REBOOT_MISSING_GPS_FIX_ENABLE true // If enabled above, define threschold how long a missing GPS-Fix before cold start (dont hold it to short) -#define GPS_REBOOT_MISSING_GPS_FIX_SECONDS 200 +// 5 Minutes no GPS Signal than REBOOT +#define GPS_REBOOT_MISSING_GPS_FIX_SECONDS 300 + +// Enable this setting to watch TX and make a cold start on the CPU if no transmission occured after TX_LOST_FOR_SECONDS +// TX hangs up longer then 10 min, then REBOOT +#define RADIO_TX_LOST_CHECK_ENABLE true +#define RADIO_TX_LOST_FOR_SECONDS 600 // Enable power-saving features of the GPS chip to save power. // This option should be safe to enable, as it enters a selective power saving mode. @@ -72,7 +79,7 @@ // Based on measurements Mark VK5QI, enabling this reduces power consumption by about 30-40 mA (~50%) to around 30-50 mA, // where the consumption is 70-90 mA when power saving is not enabled and any radio transmitters are idle. // See the README for details about power consumption. -#define GPS_POWER_SAVING_ENABLE false +#define GPS_POWER_SAVING_ENABLE true // Enable NMEA output from GPS via external serial port. This disables use of I²C bus (Si5351 and sensors) because the pins are shared. #define GPS_NMEA_OUTPUT_VIA_SERIAL_PORT_ENABLE false @@ -152,13 +159,13 @@ #define RADIO_SI4032_TX_CW false #define RADIO_SI4032_TX_CW_COUNT 1 #define RADIO_SI4032_TX_PIP false -#define RADIO_SI4032_TX_PIP_COUNT 6 -#define RADIO_SI4032_TX_APRS true +#define RADIO_SI4032_TX_PIP_COUNT 1 +#define RADIO_SI4032_TX_APRS false #define RADIO_SI4032_TX_APRS_COUNT 2 #define RADIO_SI4032_TX_HORUS_V1 false #define RADIO_SI4032_TX_HORUS_V1_COUNT 1 #define RADIO_SI4032_TX_HORUS_V2 true -#define RADIO_SI4032_TX_HORUS_V2_COUNT 6 +#define RADIO_SI4032_TX_HORUS_V2_COUNT 1 // Continuous transmit mode can be enabled for *either* Horus V1 or V2, but not both. This disables all other transmission modes. // The continuous mode transmits Horus 4FSK preamble between transmissions @@ -167,15 +174,17 @@ #define RADIO_SI4032_TX_HORUS_V2_CONTINUOUS false // Transmit frequencies for the Si4032 transmitter modes -#define RADIO_SI4032_TX_FREQUENCY_CW 432500000 -#define RADIO_SI4032_TX_FREQUENCY_PIP 432500000 +#define RADIO_SI4032_TX_FREQUENCY_CW 432051000 +#define RADIO_SI4032_TX_FREQUENCY_PIP 434713000 #define RADIO_SI4032_TX_FREQUENCY_APRS_1200 432500000 // Use a frequency offset to place FSK tones slightly above the defined frequency for SSB reception -#define RADIO_SI4032_TX_FREQUENCY_HORUS_V1 432501000 -#define RADIO_SI4032_TX_FREQUENCY_HORUS_V2 432501000 +#define RADIO_SI4032_TX_FREQUENCY_HORUS_V1 434714000 +#define RADIO_SI4032_TX_FREQUENCY_HORUS_V2 434714000 // Use a rotating alternate 2nd frequency for HORUS_V2 (not continously) #define RADIO_SI4032_TX_FREQUENCY2_HORUS_V2_ACTIV false -#define RADIO_SI4032_TX_FREQUENCY2_HORUS_V2 437600000 +#define RADIO_SI4032_TX_FREQUENCY2_HORUS_V2 437600500 +#define RADIO_SI4032_TX_FREQUENCY2_HORUS_V1_ACTIV false +#define RADIO_SI4032_TX_FREQUENCY2_HORUS_V1 437600500 /** @@ -192,11 +201,11 @@ #define RADIO_SI4063_TX_CW_COUNT 1 #define RADIO_SI4063_TX_PIP false #define RADIO_SI4063_TX_PIP_COUNT 6 -#define RADIO_SI4063_TX_APRS true -#define RADIO_SI4063_TX_APRS_COUNT 2 +#define RADIO_SI4063_TX_APRS false +#define RADIO_SI4063_TX_APRS_COUNT 1 #define RADIO_SI4063_TX_HORUS_V1 false #define RADIO_SI4063_TX_HORUS_V1_COUNT 1 -#define RADIO_SI4063_TX_HORUS_V2 true +#define RADIO_SI4063_TX_HORUS_V2 false #define RADIO_SI4063_TX_HORUS_V2_COUNT 6 // Continuous transmit mode can be enabled for *either* Horus V1 or V2, but not both. This disables all other transmission modes. @@ -223,14 +232,14 @@ // Which modes to transmit using an externally connected Si5351 chip in the I²C bus // The COUNT settings define the number of times that each type of transmission is repeated -#define RADIO_SI5351_TX_CW true +#define RADIO_SI5351_TX_CW false #define RADIO_SI5351_TX_CW_COUNT 1 #define RADIO_SI5351_TX_PIP false #define RADIO_SI5351_TX_PIP_COUNT 6 #define RADIO_SI5351_TX_HORUS_V1 false #define RADIO_SI5351_TX_HORUS_V1_COUNT 1 -#define RADIO_SI5351_TX_HORUS_V2 true -#define RADIO_SI5351_TX_HORUS_V2_COUNT 4 +#define RADIO_SI5351_TX_HORUS_V2 false +#define RADIO_SI5351_TX_HORUS_V2_COUNT 1 #define RADIO_SI5351_TX_JT9 false #define RADIO_SI5351_TX_JT9_COUNT 1 #define RADIO_SI5351_TX_JT65 false @@ -245,14 +254,14 @@ #define RADIO_SI5351_TX_FT8_COUNT 1 // Transmit frequencies for the Si5351 transmitter modes -#define RADIO_SI5351_TX_FREQUENCY_CW 3595000UL +#define RADIO_SI5351_TX_FREQUENCY_CW 14105000UL #define RADIO_SI5351_TX_FREQUENCY_PIP 3595000UL #define RADIO_SI5351_TX_FREQUENCY_HORUS_V1 3608000UL -#define RADIO_SI5351_TX_FREQUENCY_HORUS_V2 3608000UL +#define RADIO_SI5351_TX_FREQUENCY_HORUS_V2 3605000UL #define RADIO_SI5351_TX_FREQUENCY_JT9 14085000UL // Was: 14078700UL #define RADIO_SI5351_TX_FREQUENCY_JT65 14085000UL // Was: 14078300UL #define RADIO_SI5351_TX_FREQUENCY_JT4 14085000UL // Was: 14078500UL -#define RADIO_SI5351_TX_FREQUENCY_WSPR 14085000UL // Was: 14097200UL +#define RADIO_SI5351_TX_FREQUENCY_WSPR 14097200UL // Was: 14097200UL #define RADIO_SI5351_TX_FREQUENCY_FSQ 3608350UL // Was: 7105350UL // Base freq is 1350 Hz higher than dial freq in USB #define RADIO_SI5351_TX_FREQUENCY_FT8 14085000UL // Was: 14075000UL @@ -284,18 +293,18 @@ // See APRS symbol table documentation in: http://www.aprs.org/symbols/symbolsX.txt #define APRS_SYMBOL_TABLE '/' // '/' denotes primary and '\\' denotes alternate APRS symbol table #define APRS_SYMBOL 'O' -#define APRS_COMMENT "RS41ng radiosonde firmware test" +#define APRS_COMMENT " RS41" #define APRS_RELAYS "WIDE1-1,WIDE2-1" #define APRS_DESTINATION "APZ41N" -#define APRS_DESTINATION_SSID '0' +#define APRS_DESTINATION_SSID 'B' // Generate an APRS weather report instead of a position report. This will override the APRS symbol with the weather station symbol. #define APRS_WEATHER_REPORT_ENABLE false // Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync. // See the README file for more detailed documentation about time sync and its offset setting -#define APRS_TIME_SYNC_SECONDS 0 +#define APRS_TIME_SYNC_SECONDS 60 // Delay transmission for an N second offset, counting from the scheduled time set with TIME_SYNC_SECONDS. -#define APRS_TIME_SYNC_OFFSET_SECONDS 0 +#define APRS_TIME_SYNC_OFFSET_SECONDS 53 /** * Common Horus 4FSK mode settings @@ -341,42 +350,42 @@ // Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync. // See the README file for more detailed documentation about time sync and its offset setting -#define HORUS_V2_TIME_SYNC_SECONDS 0 +#define HORUS_V2_TIME_SYNC_SECONDS 60 // Delay transmission for an N second offset, counting from the scheduled time set with TIME_SYNC_SECONDS. -#define HORUS_V2_TIME_SYNC_OFFSET_SECONDS 0 +#define HORUS_V2_TIME_SYNC_OFFSET_SECONDS 15 /** * CW settings */ // CW speed in WPM, range 5 - 40 -#define CW_SPEED_WPM 20 +#define CW_SPEED_WPM 30 // Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync. // See the README file for more detailed documentation about time sync and its offset setting -#define CW_TIME_SYNC_SECONDS 0 +#define CW_TIME_SYNC_SECONDS 60 // Delay transmission for an N second offset, counting from the scheduled time set with TIME_SYNC_SECONDS. -#define CW_TIME_SYNC_OFFSET_SECONDS 0 +#define CW_TIME_SYNC_OFFSET_SECONDS 25 /** * Pip settings (short beep generated using CW to indicate presence of the transmitter) */ // Pip speed is defined as CW WPM, range 5 - 40 -#define PIP_SPEED_WPM 18 +#define PIP_SPEED_WPM 27 // Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync. // See the README file for more detailed documentation about time sync and its offset setting -#define PIP_TIME_SYNC_SECONDS 0 +#define PIP_TIME_SYNC_SECONDS 60 // Delay transmission for an N second offset, counting from the scheduled time set with TIME_SYNC_SECONDS. -#define PIP_TIME_SYNC_OFFSET_SECONDS 0 +#define PIP_TIME_SYNC_OFFSET_SECONDS 43 /** * WSPR settings */ #define WSPR_CALLSIGN CALLSIGN -#define WSPR_LOCATOR_FIXED_ENABLED false -#define WSPR_LOCATOR_FIXED "AA00" +#define WSPR_LOCATOR_FIXED_ENABLED true +#define WSPR_LOCATOR_FIXED "JN49" #define WSPR_DBM 10 // Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync. diff --git a/src/drivers/ubxg6010/ubxg6010.c b/src/drivers/ubxg6010/ubxg6010.c index 678e959..9255f08 100644 --- a/src/drivers/ubxg6010/ubxg6010.c +++ b/src/drivers/ubxg6010/ubxg6010.c @@ -1,3 +1,4 @@ + #include #include "hal/system.h" @@ -801,7 +802,6 @@ void ubxg6010_handle_incoming_byte(uint8_t data) static uint8_t buffer_pos = 0; static uint8_t incoming_packet_buffer[sizeof(uBloxPacket) + sizeof(uBloxChecksum)]; static uBloxPacket *incoming_packet = (uBloxPacket *) incoming_packet_buffer; - if (!sync_ubx && (sync_nmea < 3)) { if (!buffer_pos && data == 0xB5) { buffer_pos = 1; @@ -820,6 +820,7 @@ void ubxg6010_handle_incoming_byte(uint8_t data) ubxg6010_handle_nmea_output(data); } else { ((uint8_t *) incoming_packet)[buffer_pos] = data; + if ((buffer_pos >= sizeof(uBloxHeader) - 1) && (buffer_pos - 1 == (incoming_packet->header.payloadSize + sizeof(uBloxHeader) + sizeof(uBloxChecksum)))) { ubxg6010_handle_packet((uBloxPacket *) incoming_packet); diff --git a/src/hal/gpio.h b/src/hal/gpio.h new file mode 100644 index 0000000..0bd00b7 --- /dev/null +++ b/src/hal/gpio.h @@ -0,0 +1,104 @@ +#ifndef __GPIO_H +#define __GPIO_H + +#include +#include + +#include "config.h" + + +// GPIO definitions for devices we use + +#if defined (RS41) + +#define BANK_SHUTDOWN GPIOA +#define PIN_SHUTDOWN GPIO_Pin_12 + +#define BANK_VOLTAGE GPIOA +#define PIN_VOLTAGE GPIO_Pin_5 +#define ADC_VOLTAGE ADC1 +#define CHANNEL_VOLTAGE ADC_Channel_5 + +#define BANK_BUTTON GPIOA +#define PIN_BUTTON GPIO_Pin_6 +#define ADC_BUTTON ADC1 +#define CHANNEL_BUTTON ADC_Channel_6 + +#define BANK_RED_LED GPIOB +#define PIN_RED_LED GPIO_Pin_8 + +#define BANK_GREEN_LED GPIOB +#define PIN_GREEN_LED GPIO_Pin_7 + +#define BANK_MOSI GPIOB +#define PIN_MOSI GPIO_Pin_15 +#define BANK_SCK GPIOB +#define PIN_SCK GPIO_Pin_13 +#define BANK_MISO GPIOB +#define PIN_MISO GPIO_Pin_14 +#define APBPERIPHERAL_SPI RCC_APB1Periph_SPI2 +#define PERIPHERAL_SPI SPI2 +#define RCC_SPIPeriphClockCmd RCC_APB1PeriphClockCmd + +#define PIN_USART_TX GPIO_Pin_9 +#define BANK_USART_TX GPIOA +#define PIN_USART_RX GPIO_Pin_10 +#define BANK_USART_RX GPIOA +#define USART_IRQ USART1_IRQn +#define USART_IT USART1 +#define APBPERIPHERAL_USART RCC_APB2Periph_USART1 +#define USART_IRQ_HANDLER USART1_IRQHandler + +#elif defined (DFM17) + +#define BANK_SHUTDOWN GPIOC +#define PIN_SHUTDOWN GPIO_Pin_0 + +#define BANK_VOLTAGE GPIOA // Needs confirmation +#define PIN_VOLTAGE GPIO_Pin_0 // Needs confirmation +#define ADC_VOLTAGE ADC1 // Needs confirmation +#define CHANNEL_VOLTAGE ADC_Channel_0 // Needs confirmation + +#define BANK_BUTTON GPIOC +#define PIN_BUTTON GPIO_Pin_8 +// No ADC available on the GPIOC, so we have to use digital reads/writes for the button + +#define BANK_RED_LED GPIOB +#define PIN_RED_LED GPIO_Pin_12 + +#define BANK_GREEN_LED GPIOC +#define PIN_GREEN_LED GPIO_Pin_6 + +#define BANK_YELLOW_LED GPIOC +#define PIN_YELLOW_LED GPIO_Pin_7 + +#define BANK_MOSI GPIOA +#define PIN_MOSI GPIO_Pin_7 +#define BANK_SCK GPIOA +#define PIN_SCK GPIO_Pin_5 +#define BANK_MISO GPIOA +#define PIN_MISO GPIO_Pin_6 +#define APBPERIPHERAL_SPI RCC_APB2Periph_SPI1 +#define PERIPHERAL_SPI SPI1 +#define RCC_SPIPeriphClockCmd RCC_APB2PeriphClockCmd + +#define PIN_USART_TX GPIO_Pin_2 +#define BANK_USART_TX GPIOA +#define PIN_USART_RX GPIO_Pin_3 +#define BANK_USART_RX GPIOA +#define USART_IRQ USART2_IRQn +#define USART_IT USART2 +#define APBPERIPHERAL_USART RCC_APB1Periph_USART2 +#define USART_IRQ_HANDLER USART2_IRQHandler + +#else +Compiler error. You must define RS41 or DFM17. +#endif // RS41 or DFM17 + +// Hardware Sanity Check + +#if defined (RS41) && defined (DFM17) +Compiler error. You must define RS41 or DFM17 but not both. +#endif + +#endif // __GPIO_H diff --git a/src/hal/system.c b/src/hal/system.c index 9cd26cb..35b745c 100644 --- a/src/hal/system.c +++ b/src/hal/system.c @@ -11,6 +11,7 @@ #include "system.h" #include "delay.h" #include "log.h" +#include "hal/gpio.h" #include "hal/cmsis/core_cm3.h" // for NVIC_SystemReset #define BUTTON_PRESS_LONG_COUNT SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND diff --git a/src/main.c b/src/main.c index cf8b6de..3d7fa38 100644 --- a/src/main.c +++ b/src/main.c @@ -15,6 +15,8 @@ #include "config.h" #include "log.h" + + uint32_t counter = 0; bool led_state = true; uint32_t noFixCounter = 0; @@ -27,7 +29,7 @@ void handle_timer_tick() { if (inuse_handle_timer_tick) { return; } else { - inuse_handle_timer_tick = true; + inuse_handle_timer_tick = true; } if (!system_initialized) { inuse_handle_timer_tick = false; @@ -37,6 +39,7 @@ void handle_timer_tick() counter = (counter + 1) % SYSTEM_SCHEDULER_TIMER_TICKS_PER_SECOND; if (counter == 0) { + // WATCHDOG - Check, if lost GPX-Fix for longer then GPS_REBOOT_MISSING_GPS_FIX_SECONDS ubxg6010_get_current_gps_data(¤t_gps_data); if (GPS_REBOOT_MISSING_GPS_FIX_ENABLE) { if (!GPS_HAS_FIX(current_gps_data)) { @@ -52,11 +55,25 @@ void handle_timer_tick() // request cold boot on the STM32 processor inuse_handle_timer_tick = false; + //log_info("** GPS LOST - REBOOT ** \n"); + //delay_ms(1000); nvic_cold_start(); return; } } } else { noFixCounter = 0; } + // WATCHDOG - Check, if no TX after longer then RADIO_TX_LOST_FOR_SECONDS + if (RADIO_TX_LOST_CHECK_ENABLE) { + + if (radio_Inc_tx_watchdog_counter() >= RADIO_TX_LOST_FOR_SECONDS) { + radio_reset_tx_watchdog_counter(); + // request cold boot on the STM32 processor + inuse_handle_timer_tick = false; + //log_info("** TX LOST - REBOOT ** \n"); + nvic_cold_start(); + return; + } + } else { radio_reset_tx_watchdog_counter(); } } if (leds_enabled) { @@ -185,6 +202,7 @@ int main(void) log_info("Si5351 init\n"); success = si5351_handler_init(); if (success) { + log_info("Si5351 OK\n"); break; } log_error("Si5351 init failed, retrying..."); diff --git a/src/radio.c b/src/radio.c index 4008c61..169999f 100644 --- a/src/radio.c +++ b/src/radio.c @@ -12,6 +12,7 @@ #include "codecs/mfsk/mfsk.h" #include "codecs/jtencode/jtencode.h" #include "drivers/ubxg6010/ubxg6010.h" +#include "radio.h" #include "radio_internal.h" #include "radio_si4032.h" #include "radio_si5351.h" @@ -319,7 +320,10 @@ static volatile uint32_t radio_post_transmit_delay_counter = 0; static volatile uint32_t radio_next_symbol_counter = 0; static radio_transmit_entry *radio_start_transmit_entry = NULL; -static uint8_t radio_alternate_frequency = 1; +static uint32_t radio_alternate_frequency_v1 = 1; +static uint32_t radio_alternate_frequency_v2 = 1; +static uint32_t radio_tx_watchdog_counter = 0; + static uint32_t radio_previous_time_sync_scheduled = 0; @@ -404,12 +408,21 @@ static bool radio_start_transmit(radio_transmit_entry *entry) radio_shared_state.radio_symbol_count_loop = 0; telemetry_collect(¤t_telemetry_data); +#ifdef SEMIHOSTING_ENABLE + log_info("radio_start_transmit template\n"); +#endif if (entry->messages != NULL && entry->message_count > 0) { +#ifdef SEMIHOSTING_ENABLE + log_info("radio_start_transmit template\n"); +#endif template_replace(radio_current_payload_message, sizeof(radio_current_payload_message), entry->messages[entry->current_message_index], ¤t_telemetry_data); } else { - radio_current_payload_message[0] = '\0'; +#ifdef SEMIHOSTING_ENABLE + log_info("radio_start_transmit no template filled\n"); +#endif + radio_current_payload_message[0] = '\0'; } radio_current_payload_length = entry->payload_encoder->encode( @@ -418,14 +431,14 @@ static bool radio_start_transmit(radio_transmit_entry *entry) log_info("Full payload length: %d\n", radio_current_payload_length); + #ifdef SEMIHOSTING_ENABLE log_info("Payload: "); log_bytes_hex(radio_current_payload_length, (char *) radio_current_payload); log_info("\n "); - log_bytes(radio_current_payload_length, (char *) radio_current_payload); - log_info("\n"); - log_info("Battery: %d mV\n", current_telemetry_data.battery_voltage_millivolts); - +// log_bytes(radio_current_payload_length, (char *) radio_current_payload); +// log_info("\n"); +// log_info("Battery: %d mV\n", current_telemetry_data.battery_voltage_millivolts); #endif // USART interrupts may interfere with transmission timing @@ -467,7 +480,8 @@ static bool radio_start_transmit(radio_transmit_entry *entry) break; case RADIO_DATA_MODE_HORUS_V2: // GPS should not disturb the timing of Horus modes - enable_gps_during_transmit = true; +// WOHA - Temp false + enable_gps_during_transmit = false; mfsk_encoder_new(&entry->fsk_encoder, MFSK_4, entry->symbol_rate, HORUS_V2_TONE_SPACING_HZ_SI5351 * 100); radio_shared_state.radio_current_symbol_rate = entry->fsk_encoder_api->get_symbol_rate(&entry->fsk_encoder); @@ -666,15 +680,26 @@ static void radio_next_transmit_entry() if (radio_current_transmit_entry->enabled) { if (radio_current_transmit_entry->data_mode == RADIO_DATA_MODE_HORUS_V2) { if (RADIO_SI4032_TX_FREQUENCY2_HORUS_V2_ACTIV) { - if (radio_alternate_frequency == 0) { - radio_alternate_frequency = 1; + if (radio_alternate_frequency_v2 == 0) { + radio_alternate_frequency_v2 = 1; radio_current_transmit_entry->frequency = RADIO_SI4032_TX_FREQUENCY2_HORUS_V2; } else { - radio_alternate_frequency = 0; + radio_alternate_frequency_v2 = 0; radio_current_transmit_entry->frequency = RADIO_SI4032_TX_FREQUENCY_HORUS_V2; } } } + if (radio_current_transmit_entry->data_mode == RADIO_DATA_MODE_HORUS_V1) { + if (RADIO_SI4032_TX_FREQUENCY2_HORUS_V1_ACTIV) { + if (radio_alternate_frequency_v1 == 0) { + radio_alternate_frequency_v1 = 1; + radio_current_transmit_entry->frequency = RADIO_SI4032_TX_FREQUENCY2_HORUS_V1; + } else { + radio_alternate_frequency_v1 = 0; + radio_current_transmit_entry->frequency = RADIO_SI4032_TX_FREQUENCY_HORUS_V1; + } + } + } } } while (!radio_current_transmit_entry->enabled); } @@ -724,7 +749,7 @@ bool radio_handle_time_sync() ubxg6010_get_current_gps_data(&gps); if (!gps.updated) { - // The GPS data has not been updated yet + // The GPS data has not been updated yet return false; } @@ -759,21 +784,23 @@ bool radio_handle_time_sync() bool is_scheduled_time = time_sync_period_millis < RADIO_TIME_SYNC_THRESHOLD_MS; - log_debug("Time with offset: %lu, sync period: %lu, scheduled: %d\n", time_with_offset_millis, time_sync_period_millis, is_scheduled_time); +// log_info("---- Time with offset: %lu, sync period: %lu, scheduled: %d\n", time_with_offset_millis, time_sync_period_millis, is_scheduled_time); if (!is_scheduled_time) { - log_info("Time: %lu, GPS fix: %d - Waiting for time sync at every %d seconds with offset of %d\n", time_millis, +/* + log_info("Time: %lu, GPS fix: %d - SyncWait every %d sec+offset %d\n", time_millis, gps.fix, radio_current_transmit_entry->time_sync_seconds, radio_current_transmit_entry->time_sync_seconds_offset); +*/ return false; } - - log_info("Time: %lu, GPS fix: %d, sync period: %lu - Scheduling transmit at %d seconds with offset of %d\n", +/* + log_info("Time: %lu, GPS fix: %d, sync period: %lu - Schedule TX at %d sec+offset %d\n", time_millis, gps.fix, time_sync_period_millis, radio_current_transmit_entry->time_sync_seconds, radio_current_transmit_entry->time_sync_seconds_offset); - +*/ radio_previous_time_sync_scheduled = time_millis; return true; @@ -793,10 +820,13 @@ void radio_handle_main_loop() } radio_reset_transmit_delay_counter(); radio_start_transmit_entry = radio_current_transmit_entry; +// log_info("main_loop: oben\n"); } else if (!radio_shared_state.radio_transmission_active && radio_post_transmit_delay_counter == 0) { +// log_info("main_loop: unten\n"); + #if defined(SEMIHOSTING_ENABLE) && defined(LOGGING_ENABLE) telemetry_collect(¤t_telemetry_data); - log_info("Battery: %d mV\n", current_telemetry_data.battery_voltage_millivolts); + log_info("Battery: %d mV.\n", current_telemetry_data.battery_voltage_millivolts); log_info("Internal temperature: %ld C\n", current_telemetry_data.internal_temperature_celsius_100 / 100); log_info("Time: %02d:%02d:%02d\n", current_telemetry_data.gps.hours, current_telemetry_data.gps.minutes, @@ -819,12 +849,13 @@ void radio_handle_main_loop() bool first_symbol = false; if (radio_start_transmit_entry != NULL) { - log_info("Start transmit\n"); + log_info("Start TX\n"); bool success = radio_start_transmit(radio_start_transmit_entry); start_tick = system_get_tick(); radio_start_transmit_entry = NULL; if (!success) { + log_info("main_loop: Fehler radio_start_transmit\n"); radio_next_transmit_entry(); return; } @@ -858,6 +889,10 @@ void radio_handle_main_loop() radio_next_transmit_entry(); log_info("TX stop\n"); + + // Watchdog: TX counter reset + radio_reset_tx_watchdog_counter(); +/* log_info("Symbol count (interrupt): %ld\n", radio_shared_state.radio_symbol_count_interrupt); log_info("Symbol count (loop): %ld\n", radio_shared_state.radio_symbol_count_loop); log_info("Total ticks: %ld\n", end_tick - start_tick); @@ -865,9 +900,22 @@ void radio_handle_main_loop() log_info("Symbol rate: %ld\n", radio_shared_state.radio_current_symbol_rate); log_info("Symbol delay: %ld\n", radio_shared_state.radio_current_symbol_delay_ms_100); log_info("Tone spacing: %ld\n", radio_shared_state.radio_current_tone_spacing_hz_100); +*/ } } + +void radio_reset_tx_watchdog_counter () +{ + radio_tx_watchdog_counter = 0; +} + +uint32_t radio_Inc_tx_watchdog_counter () +{ + radio_tx_watchdog_counter++; + return radio_tx_watchdog_counter; +} + void radio_init() { uint8_t count; diff --git a/src/radio.h b/src/radio.h index f2e5ab3..0629c82 100644 --- a/src/radio.h +++ b/src/radio.h @@ -6,4 +6,7 @@ void radio_handle_timer_tick(); void radio_handle_data_timer_tick(); void radio_handle_main_loop(); +void radio_reset_tx_watchdog_counter (); +uint32_t radio_Inc_tx_watchdog_counter (); + #endif