diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/includes/Core/fsm.h | 7 | ||||
-rw-r--r-- | src/common/src/Core/main.c | 10 | ||||
-rw-r--r-- | src/glutt-o-logique/analog_input.c | 2 | ||||
-rw-r--r-- | src/glutt-o-logique/main.c | 36 | ||||
-rw-r--r-- | src/glutt-o-logique/pio.c | 205 |
5 files changed, 157 insertions, 103 deletions
diff --git a/src/common/includes/Core/fsm.h b/src/common/includes/Core/fsm.h index e562241..f8a800c 100644 --- a/src/common/includes/Core/fsm.h +++ b/src/common/includes/Core/fsm.h @@ -78,8 +78,11 @@ struct fsm_input_signals_t { float humidity; // relative humidity, range [0-100] % int wind_generator_ok; // false if the generator is folded out of the wind int discrim_d; // FM discriminator says RX is too low in frequency - int tone_1750; // Detect 1750Hz tone - int sstv_mode; // The 1750Hz filter is disabled, permitting SSTV usage + int button_1750; // Front panel button 1750Hz + + /* Signals coming from FAX and 1750 detector */ + int fax_mode; // 1750Hz filter disabled for machine-generated modes + int det_1750; // 1750Hz detected /* Signals coming from CW and PSK generator */ int cw_psk31_done; // The CW and PSK generator has finished transmitting the message diff --git a/src/common/src/Core/main.c b/src/common/src/Core/main.c index aaa629b..18c25b2 100644 --- a/src/common/src/Core/main.c +++ b/src/common/src/Core/main.c @@ -501,7 +501,7 @@ static void exercise_fsm(void __attribute__ ((unused))*pvParameters) fsm_input.humidity = 0; fsm_input.temp = 15; fsm_input.swr_high = 0; - fsm_input.sstv_mode = 0; + fsm_input.fax_mode = 0; fsm_input.wind_generator_ok = 1; while (1) { @@ -513,10 +513,6 @@ static void exercise_fsm(void __attribute__ ((unused))*pvParameters) last_sq = fsm_input.sq; usart_debug("In SQ %d\r\n", last_sq); } - if (last_1750 != fsm_input.tone_1750) { - last_1750 = fsm_input.tone_1750; - usart_debug("In 1750 %d\r\n", last_1750); - } if (last_qrp != fsm_input.qrp) { last_qrp = fsm_input.qrp; usart_debug("In QRP %d\r\n", last_qrp); @@ -563,6 +559,10 @@ static void exercise_fsm(void __attribute__ ((unused))*pvParameters) leds_turn_on(LED_ORANGE); } +#warning "TODO: from tone detector" + fsm_input.det_1750 = 0; + fsm_input.fax_mode = 0; + fsm_input.swr_high = swr_error_flag; fsm_input.hour_is_even = hour_is_even; diff --git a/src/glutt-o-logique/analog_input.c b/src/glutt-o-logique/analog_input.c index 33bb662..5f0e700 100644 --- a/src/glutt-o-logique/analog_input.c +++ b/src/glutt-o-logique/analog_input.c @@ -37,6 +37,8 @@ // Measured on the board itself const float v_ref = 2.965f; +#warning "TODO: initialise ADC2 and use it for NF input" + void analog_init(void) { // Enable ADC and GPIOA clocks diff --git a/src/glutt-o-logique/main.c b/src/glutt-o-logique/main.c index 4341d54..5ff89bf 100644 --- a/src/glutt-o-logique/main.c +++ b/src/glutt-o-logique/main.c @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2016 Matthias P. Braendli, Maximilien Cuony + * Copyright (c) 2019 Matthias P. Braendli, Maximilien Cuony * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -23,7 +23,6 @@ */ #include "stm32f4xx_conf.h" -#include "leds.h" // This is a set of guards to make sure the FPU compile configuration // is correct @@ -47,39 +46,8 @@ # error "SOFTFP" #endif -void init(void); - -void init() +void init(void) { - /* Initialise the onboard peripherals - * Four LEDs and one push-button - */ - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); - - // Configure PD12, PD13, PD14 and PD15 in output pushpull mode - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = - GPIOD_BOARD_LED_GREEN | - GPIOD_BOARD_LED_ORANGE | - GPIOD_BOARD_LED_RED | - GPIOD_BOARD_LED_BLUE; - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOD, &GPIO_InitStructure); - - // Init PushButton - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - /* Setup Watchdog * The IWDG runs at 32kHz. With a prescaler of 32 -> 1kHz. * Counting to 2000 / 1000 = 2 seconds diff --git a/src/glutt-o-logique/pio.c b/src/glutt-o-logique/pio.c index b7420dc..e944671 100644 --- a/src/glutt-o-logique/pio.c +++ b/src/glutt-o-logique/pio.c @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2016 Matthias P. Braendli + * Copyright (c) 2019 Matthias P. Braendli * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,43 +24,66 @@ #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" +#include "stm32f4xx_conf.h" /* See pio.txt for PIO allocation details */ -/* On GPIO C */ -#define GPIO_PIN_QRP_n GPIO_Pin_1 -#define GPIO_PIN_TX GPIO_Pin_2 -#define GPIO_PIN_1750_n GPIO_Pin_4 -#define GPIO_PIN_MOD_OFF GPIO_Pin_5 -#define GPIO_PIN_SQ_n GPIO_Pin_6 -#define GPIO_PIN_U GPIO_Pin_8 -#define GPIO_PIN_QRP_out GPIO_Pin_9 -#define GPIO_PIN_D GPIO_Pin_11 -#define GPIO_PIN_REPLIE GPIO_Pin_13 -#define GPIO_PIN_FAX GPIO_Pin_14 -#define GPIO_PIN_GPS_EPPS GPIO_Pin_15 +#define GPIOA_PIN_DET_1750 GPIO_Pin_8 +#define GPIOA_PIN_PUSHBTN GPIO_Pin_0 + +#define GPIOC_PIN_SQ2 GPIO_Pin_0 +#define GPIOC_PIN_QRP_n GPIO_Pin_1 +#define GPIOC_PIN_TX GPIO_Pin_2 +#define GPIOC_PIN_1750_n GPIO_Pin_4 +#define GPIOC_PIN_MOD_OFF GPIO_Pin_5 +#define GPIOC_PIN_SQ_n GPIO_Pin_6 +#define GPIOC_PIN_U GPIO_Pin_8 +#define GPIOC_PIN_QRP_out GPIO_Pin_9 +#define GPIOC_PIN_D GPIO_Pin_11 +#define GPIOC_PIN_REPLIE GPIO_Pin_13 +#define GPIOC_PIN_FAX GPIO_Pin_14 +#define GPIOC_PIN_GPS_EPPS GPIO_Pin_15 + + +#define GPIOA_INPUT_PINS ( \ + GPIOA_PIN_PUSHBTN | \ + 0) +#define GPIOA_OUTPUT_PINS ( \ + GPIOA_PIN_DET_1750 | \ + 0) #define GPIOC_OUTPUT_PINS ( \ - GPIO_PIN_TX | \ - GPIO_PIN_MOD_OFF | \ - GPIO_PIN_QRP_out | \ - GPIO_PIN_GPS_EPPS | \ + GPIOC_PIN_TX | \ + GPIOC_PIN_MOD_OFF | \ + GPIOC_PIN_QRP_out | \ + GPIOC_PIN_GPS_EPPS | \ + GPIOC_PIN_FAX | \ + GPIOC_PIN_SQ2 | \ 0) #undef GPIOC_OPENDRAIN_PINS #undef GPIOC_INPUT_PU_PINS #define GPIOC_INPUT_PINS ( \ - GPIO_PIN_QRP_n | \ - GPIO_PIN_1750_n | \ - GPIO_PIN_SQ_n | \ - GPIO_PIN_U | \ - GPIO_PIN_D | \ - GPIO_PIN_REPLIE | \ - GPIO_PIN_FAX | \ + GPIOC_PIN_QRP_n | \ + GPIOC_PIN_1750_n | \ + GPIOC_PIN_SQ_n | \ + GPIOC_PIN_U | \ + GPIOC_PIN_D | \ + GPIOC_PIN_REPLIE | \ + GPIOC_PIN_FAX | \ 0 ) +#define GPIOD_OUTPUT_PINS ( \ + GPIOD_BOARD_LED_GREEN | \ + GPIOD_BOARD_LED_ORANGE | \ + GPIOD_BOARD_LED_RED | \ + GPIOD_BOARD_LED_BLUE | \ + 0 ) + +#include "leds.h" + #include "GPIO/pio.h" #include "Core/common.h" #include "FreeRTOS.h" @@ -72,19 +95,49 @@ void read_fsm_input_task(void *pvParameters); struct fsm_input_signals_t pio_signals; +static inline int all_equal(const uint8_t* v, uint8_t len) +{ + if (len < 2) { + return 1; + } + + for (uint8_t i = 1; i < len; i++) { + if (v[i] != v[0]) + return 0; + } + return 1; +} + +static inline int any_true(const uint8_t* v, uint8_t len) +{ + if (len < 2) { + return 1; + } + + for (uint8_t i = 0; i < len; i++) { + if (v[i]) + return 1; + } + return 0; +} /* Some signals need additional debouncing or delays, the following * variables are shift registers. */ -static uint8_t debounce_sq[3] = {0}; +#define DEBOUNCE_LEN_SQ 3 +static uint8_t debounce_sq[DEBOUNCE_LEN_SQ] = {0}; /* D and U have to stay on longer than SQ, otherwise the * letter selection can fail, and transmit a K when it should * send a D or U */ -static uint8_t debounce_discrim_d[6] = {0}; -static uint8_t debounce_discrim_u[6] = {0}; +#define DEBOUNCE_LEN_D_U 6 +static uint8_t debounce_discrim_d[DEBOUNCE_LEN_D_U] = {0}; +static uint8_t debounce_discrim_u[DEBOUNCE_LEN_D_U] = {0}; +/* This comes from the front panel button */ +#define DEBOUNCE_LEN_1750 3 +static uint8_t debounce_1750[DEBOUNCE_LEN_1750] = {0}; void pio_init() { @@ -92,8 +145,27 @@ void pio_init() // Init pio RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); + // For the onboard peripherals, 4x LEDs, 1 push-button: + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); + + // GPIO A + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Pin = GPIOA_INPUT_PINS; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Pin = GPIOA_OUTPUT_PINS; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + // GPIOC + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Pin = GPIOC_OUTPUT_PINS; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; @@ -118,14 +190,20 @@ void pio_init() GPIO_Init(GPIOC, &GPIO_InitStructure); #endif -#if defined(GPIOC_INPUT_PINS) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Pin = GPIOC_INPUT_PINS; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); -#endif + + // GPIO D + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Pin = GPIOD_OUTPUT_PINS; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_Init(GPIOD, &GPIO_InitStructure); xTaskCreate( read_fsm_input_task, @@ -145,50 +223,51 @@ void read_fsm_input_task(void __attribute__ ((unused))*pvParameters) { while (1) { pio_signals.qrp = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_QRP_n) ? 0 : 1; + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_QRP_n) ? 0 : 1; - pio_signals.tone_1750 = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_1750_n) ? 0 : 1; + for (int i = 0; i < DEBOUNCE_LEN_SQ-1; i++) { + debounce_sq[i] = debounce_sq[i+1]; + } - debounce_sq[0] = debounce_sq[1]; - debounce_sq[1] = debounce_sq[2]; - debounce_sq[2] = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_SQ_n) ? 0 : 1; + debounce_sq[DEBOUNCE_LEN_SQ-1] = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_SQ_n) ? 0 : 1; /* Only change the signal if its input has stabilised */ - if (debounce_sq[0] == debounce_sq[1] && - debounce_sq[1] == debounce_sq[2]) { + if (all_equal(debounce_sq, DEBOUNCE_LEN_SQ)) { pio_signals.sq = debounce_sq[0]; } /* The discrim U and D signals should be very sensitive: * if one toggles to 1, set to 1; reset to 0 only if all - * are at 0 + * are at 0. */ - for (int i = 0; i < 5; i++) { + for (int i = 0; i < DEBOUNCE_LEN_D_U-1; i++) { debounce_discrim_d[i] = debounce_discrim_d[i+1]; debounce_discrim_u[i] = debounce_discrim_u[i+1]; } - debounce_discrim_u[5] = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_U) ? 1 : 0; + debounce_discrim_u[DEBOUNCE_LEN_D_U-1] = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_U) ? 1 : 0; + pio_signals.discrim_u = any_true(debounce_discrim_u, DEBOUNCE_LEN_D_U); - pio_signals.discrim_u = - debounce_discrim_u[0] | debounce_discrim_u[1] | debounce_discrim_u[2] | - debounce_discrim_u[3] | debounce_discrim_u[4] | debounce_discrim_u[5]; + debounce_discrim_d[DEBOUNCE_LEN_D_U-1] = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_D) ? 1 : 0; + pio_signals.discrim_d = any_true(debounce_discrim_d, DEBOUNCE_LEN_D_U); - debounce_discrim_d[5] = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_D) ? 1 : 0; - pio_signals.discrim_d = - debounce_discrim_d[0] | debounce_discrim_d[1] | debounce_discrim_d[2] | - debounce_discrim_d[3] | debounce_discrim_d[4] | debounce_discrim_d[5]; + for (int i = 0; i < DEBOUNCE_LEN_1750-1; i++) { + debounce_1750[i] = debounce_1750[i+1]; + } - pio_signals.wind_generator_ok = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_REPLIE) ? 0 : 1; + debounce_1750[DEBOUNCE_LEN_1750-1] = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_1750_n) ? 0 : 1; - pio_signals.sstv_mode = - GPIO_ReadInputDataBit(GPIOC, GPIO_PIN_FAX) ? 1 : 0; + if (all_equal(debounce_1750, DEBOUNCE_LEN_1750)) { + pio_signals.button_1750 = debounce_1750[0]; + } + + pio_signals.wind_generator_ok = + GPIO_ReadInputDataBit(GPIOC, GPIOC_PIN_REPLIE) ? 0 : 1; vTaskDelay(pdMS_TO_TICKS(100)); } @@ -197,30 +276,30 @@ void read_fsm_input_task(void __attribute__ ((unused))*pvParameters) void pio_set_tx(int on) { if (on) { - GPIO_SetBits(GPIOC, GPIO_PIN_TX); + GPIO_SetBits(GPIOC, GPIOC_PIN_TX); } else { - GPIO_ResetBits(GPIOC, GPIO_PIN_TX); + GPIO_ResetBits(GPIOC, GPIOC_PIN_TX); } } void pio_set_qrp(int on) { if (on) { - GPIO_SetBits(GPIOC, GPIO_PIN_QRP_out); + GPIO_SetBits(GPIOC, GPIOC_PIN_QRP_out); } else { - GPIO_ResetBits(GPIOC, GPIO_PIN_QRP_out); + GPIO_ResetBits(GPIOC, GPIOC_PIN_QRP_out); } } void pio_set_mod_off(int mod_off) { if (mod_off) { - GPIO_SetBits(GPIOC, GPIO_PIN_MOD_OFF); + GPIO_SetBits(GPIOC, GPIOC_PIN_MOD_OFF); } else { - GPIO_ResetBits(GPIOC, GPIO_PIN_MOD_OFF); + GPIO_ResetBits(GPIOC, GPIOC_PIN_MOD_OFF); } } @@ -231,10 +310,12 @@ int pio_read_button() { void pio_set_gps_epps(int on) { if (on) { - GPIO_SetBits(GPIOC, GPIO_PIN_GPS_EPPS); + GPIO_SetBits(GPIOC, GPIOC_PIN_GPS_EPPS); } else { - GPIO_ResetBits(GPIOC, GPIO_PIN_GPS_EPPS); + GPIO_ResetBits(GPIOC, GPIOC_PIN_GPS_EPPS); } } +#warning "TODO: add output functions for SQ2, DET 1750 and FAX" + |