diff --git a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch index c6c6350..7f8b913 100644 --- a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch +++ b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch @@ -58,6 +58,6 @@ - + diff --git a/include/station_config_test_igate.h b/include/station_config_test_igate.h new file mode 100644 index 0000000..095e259 --- /dev/null +++ b/include/station_config_test_igate.h @@ -0,0 +1,338 @@ +/* + * config.h + * + * Created on: 03.07.2017 + * Author: mateusz + */ + +#ifndef STATION_CONFIG_H_ +#define STATION_CONFIG_H_ + +//#define _POWERSAVE_NORMAL +//#define _POWERSAVE_AGGRESIVE +//!< --------------------------- +//!< MODES OF OPERATION + +#define _METEO // Enable meteo station + +#define _DIGI // Enable WIDE1-1 digipeater +#define _DIGI_VISCOUS +//#define _DIGI_ONLY_789 // Limit digipeater to handle only -7, -8 and -9 SSIDs + +#define _GSM // only for ParaMETEO +//#define _GSM_KEEP_MODEM_ALWAYS_ON + +#define _WX_DOUBLE_TRANSMIT + +//!< MODES OF OPERATION +//!< --------------------------- + +/** + * Enable support for Victron VE.Direct protocol. This is independent from wx sensor configuration + */ +//#define _VICTRON + +//!< --------------------------- +//!< WEATHER/METEO CONFIGURATION + +/** + * Three defines below enables or disabled listed communication drivers. Enabling any of then doesn't means + * that these are used as a data source automatically. That shall be set in 'DATA SOURCES CONFIG' section. + */ + +//#define _UMB_MASTER +//#define _DAVIS_SERIAL +#define _MODBUS_RTU // use Modbus RTU slave devices as a external meteo data source. For more configuration + // (slave ids, registers...) please look into MODBUS RTU CONFIGURATION section of this file + +#define _INTERNAL_AS_BACKUP // if defined ParaTNC will switch to internal sensors in case of + // the communication with UMB/Dallas Serial/Modbus external sensors will hang up + + +//#define _DALLAS_AS_TELEM // Use Dallas one-wire thermometer as a 5th telemetry channel + // May be used even if _METEO is not enabled +#define _DALLAS_SPLIT_PIN // Must be enabled for all ParaTNC hardware revisions + +/******** INTERNAL SENSORS CONFIGURATION *****************/ + +//#define _ANEMOMETER_TX20 // Use TX20 as an internal anemometer +#define _ANEMOMETER_ANALOGUE // Use analogue/mechanical (like Davis 6410) as an internal anemometr +#define _ANEMOMETER_PULSES_IN_10SEC_PER_ONE_MS_OF_WINDSPEED 10 + +#define _SENSOR_MS5611 +//#define _SENSOR_BME280 +/******** INTERNAL SENSORS CONFIGURATION *****************/ + + +/******** UMB MASTER CONFIGURATION *****************/ +#define _UMB_SLAVE_ID 1 +#define _UMB_SLAVE_CLASS 8 +#define _UMB_CHANNEL_WINDSPEED 460 +#define _UMB_CHANNEL_WINDGUSTS 440 +#define _UMB_CHANNEL_WINDDIRECTION 580 +#define _UMB_CHANNEL_TEMPERATURE 100 +#define _UMB_CHANNEL_QFE 300 +/******** UMB MASTER CONFIGURATION *****************/ + + +/*************** DATA SOURCES CONFIG ***********************/ +#define _TEMPERATURE_INTERNAL +//#define _TEMPERATURE_UMB +//#define _TEMPERATURE_RTU +//#define _TEMPERATURE_DAVIS +// +#define _PRESSURE_INTERNAL +//#define _PRESSURE_UMB +//#define _PRESSURE_RTU +//#define _PRESSURE_DAVIS +// +//#define _HUMIDITY_INTERNAL +//#define _HUMIDITY_UMB +#define _HUMIDITY_RTU +//#define _HUMIDITY_DAVIS +// +// +#define _WIND_INTERNAL +//#define _WIND_UMB +//#define _WIND_RTU +//#define _WIND_FULL_RTU +//#define _WIND_DAVIS +/*************** DATA SOURCES CONFIG ***********************/ + +//!< WEATHER/METEO CONFIGURATION +//!< --------------------------- + + +//!< ------------------------------------- +//!< BASIC CONFIG - CALLSIGN, LOCATION etc + +//#define _MUTE_RF // TODO: Not yet implemented - This will make station RXonly and disable all data transmission +//#define _MUTE_OWN // TODO: Not yet implemented - This will disable all self-generated packets (wx, telemetry, beacon) + // and switch device to "pure" kiss TNC operation. Packets from PC will be transmitted normally. + +// Coordines should be in APRS decimal format DDDMM.SS for Longitude and DDMM.SS for latitude +#define _CALL "SP8EBC" +#define _SSID 0 +#define _LAT 4948.81 +#define _LATNS 'N' +#define _LON 01903.50 +#define _LONWE 'E' +#define _COMMENT "testing" + +// You can use only one of these below defines to choose symbol. Meteo data are are always transmitted with blue WX symbol +//#define _SYMBOL_DIGI // uncomment if you want digi symbol(green star with D inside) +//#define _SYMBOL_WIDE1_DIGI // uncomment if you want 'little' digi symbol (green star with digit 1 overlaid) +//#define _SYMBOL_HOUSE // uncomment if you want house symbol +//#define _SYMBOL_RXIGATE // uncomment if you want rxigate symbol (black diamond with R) +#define _SYMBOL_IGATE // uncomment if you want igate symol (black diamond with I) +//#define _SYMBOL_SAILBOAT + +// Or you can keep commented all symbol defines and choose custom one based on data from APRS symbols table +//#define _SYMBOL_F '/' +//#define _SYMBOL_S '#' + +// Uncomment one of these two defines to choose what path You want. If you uncommend both of them or +// if you keep both commended path will be completely disabled. CALL-S>AKLPRZ:data +//#define _WIDE1_PATH // CALL-S>AKLPRZ,WIDE1-1:data +//#define _WIDE21_PATH // CALL-S>AKLPRZ,WIDE2-1:data + +// Comment this to disable beacon auto sending during startup (this can be risky if RF feedback occur) +#define _BCN_ON_STARTUP + +#define _WX_INTERVAL 5 // WX packet interval in minutes +#define _BCN_INTERVAL 124 // Own beacon interval in minutes + +#define _PTT_PUSHPULL // Uncomment this if you want PTT line to work as Push-pull instead of Open Drain +#define _SERIAL_BAUDRATE 9600 + +#define _DIGI_VISCOUS_DEALY 2 + +// Transmitting delay +#define _DELAY_BASE 19 // * 50ms. For example setting 10 gives 500msec delay. Maximum value is 20 +//#define _RANDOM_DELAY // adds random delay TO fixed time set by _DELAY_BASE. This additional time can be + // from 100ms up to 1 sec in 100ms steps. Values are drawn from samples going from ADC + // so it is better to use Unsquelched output in radio to provide much more randomness +//After waiting time declared above ParaTNC will check DCD (Data Carrier Detect) flag, which works as some +//kind of semaphore. If radio channel is not occupied by any other transmission TX will be keyed up immediately, +//otherwise software will wait for clear conditions. + +//!< BASIC CONFIG - CALLSIGN, LOCATION etc +//!< ------------------------------------- + +// Few IMPORTANT hints about setting transmit delay properly. +// +// Transmit delay is key parameter to maintain RF network free from packet losses and collisions. If your station will be +// installed on tall object, without any other digi's close to it, you can set _DELAY_BASE to very low value and disable +// _RANDOM_DELAY. If you wanna rather auxiliary station, witch should only fill gap in RF coverage in small area, then +// _DELAY_BASE parameter should be not less than 12 (600msec), the smallest range the higher _DELAY_BASE should be. +// Additionally for gapfillers (auxiliary stations) _RANDOM_DELAY schould be enabled. +// +// This delay will ensure that while other station will be transmitting repeated packets from mobile, Yours will keep +// always quiet and won't jam RF network. This greatly improve DCD based access to channel. Various controllers uses +// various lenght of preamble, some of them produce signal which might be impossible to decode by ParaTNC, so DCD +// is only one part of effective multiaccess to medium. + +//!< ------- +//!< BUTTONS + +#define _BUTTON_ONE_LEFT BUTTON_FUNCTION_SEND_BEACON +#define _BUTTON_TWO_RIGHT BUTTON_FUNCION_RESET_GSM_GPRS + +//!< BUTTONS +//!< ------- + +//!< ------------------------ +//!< MODBUS RTU CONFIGURATION + +// scaling coefficients are used as follows +// +// A * x ^ 2 + B * x + C +// real value = --------------------------- +// D +// +// because of that D cannot be set to zero +// +// scaling for temperature shall be set to get *10 temperature +// as an output of getter / 123 -> 12.3 oC +#define _RTU_SLAVE_SPEED 9600u +#define _RTU_SLAVE_PARITY 0 +#define _RTU_SLAVE_STOP_BITS 2 + +#define _RTU_SLAVE_ID_1 0x01 +#define _RTU_SLAVE_FUNC_1 0x03 +#define _RTU_SLAVE_ADDR_1 0x00 +#define _RTU_SLAVE_LENGHT_1 0x01 +#define _RTU_SLAVE_SCALING_A_1 0 +#define _RTU_SLAVE_SCALING_B_1 1 +#define _RTU_SLAVE_SCALING_C_1 0 +#define _RTU_SLAVE_SCALING_D_1 1 + +#define _RTU_SLAVE_ID_2 0x01 +#define _RTU_SLAVE_FUNC_2 0x03 +#define _RTU_SLAVE_ADDR_2 0x01 +//#define _RTU_SLAVE_LENGHT_2 0x01 +#define _RTU_SLAVE_SCALING_A_2 0 +#define _RTU_SLAVE_SCALING_B_2 1 +#define _RTU_SLAVE_SCALING_C_2 0 +#define _RTU_SLAVE_SCALING_D_2 1 + +#define _RTU_SLAVE_ID_3 0x01 +#define _RTU_SLAVE_FUNC_3 0x03 +#define _RTU_SLAVE_ADDR_3 0x02 +//#define _RTU_SLAVE_LENGHT_3 0x01 +#define _RTU_SLAVE_SCALING_A_3 0 +#define _RTU_SLAVE_SCALING_B_3 1 +#define _RTU_SLAVE_SCALING_C_3 0 +#define _RTU_SLAVE_SCALING_D_3 1 + +#define _RTU_SLAVE_ID_4 0x01 +#define _RTU_SLAVE_FUNC_4 0x03 +#define _RTU_SLAVE_ADDR_4 0x03 +//#define _RTU_SLAVE_LENGHT_4 0x01 +#define _RTU_SLAVE_SCALING_A_4 0 +#define _RTU_SLAVE_SCALING_B_4 1 +#define _RTU_SLAVE_SCALING_C_4 0 +#define _RTU_SLAVE_SCALING_D_4 1 + +#define _RTU_SLAVE_ID_5 0x00 +#define _RTU_SLAVE_FUNC_5 0x00 +#define _RTU_SLAVE_ADDR_5 0x03 +//#define _RTU_SLAVE_LENGHT_4 0x01 +#define _RTU_SLAVE_SCALING_A_5 0 +#define _RTU_SLAVE_SCALING_B_5 1 +#define _RTU_SLAVE_SCALING_C_5 0 +#define _RTU_SLAVE_SCALING_D_5 1 + + +#define _RTU_SLAVE_ID_6 0x00 +#define _RTU_SLAVE_FUNC_6 0x00 +#define _RTU_SLAVE_ADDR_6 0x00 +//#define _RTU_SLAVE_LENGHT_4 0x01 +#define _RTU_SLAVE_SCALING_A_6 0 +#define _RTU_SLAVE_SCALING_B_6 1 +#define _RTU_SLAVE_SCALING_C_6 0 +#define _RTU_SLAVE_SCALING_D_6 1 + +#define _RTU_SLAVE_TEMPERATURE_SOURCE 1 +#define _RTU_SLAVE_HUMIDITY_SOURCE 2 +//#define _RTU_SLAVE_PRESSURE_SOURCE 3 +//#define _RTU_SLAVE_WIND_DIRECTION_SORUCE 4 +//#define _RTU_SLAVE_WIND_SPEED_SOURCE 4 + +//!< MODBUS RTU CONFIGURATION +//!< ------------------------ + +//!< ----------------------- +//!< GSM and APRS-IS and API + +#define _GSM_APN_NAME "internet\0" +#define _GSM_APN_USER "internet\0" +#define _GSM_APN_PASS "internet\0" + +//#define _GSM_API_ENABLE +#define _GSM_API_BASE_URL "http://157.25.103.93:22910/" +#define _GSM_API_STATION_NAME "bielsko" + +#define _GSM_APRSIS_ENABLE +#define _GSM_APRSIS_PASSCODE 23220 +#define _GSM_APRSIS_PORT 14580 +#define _GSM_APRSIS_ADDRES "euro.aprs2.net\0" +//#define _GSM_APRSIS_ADDRES "78.88.56.14\0" + + +//!< GSM and APRS-IS and API +//!< ----------------------- + +//#define ENG1 ENGINEERING1_EARLY_TX_ASSERT | ENGINEERING1_PWRCYCLE_GSM_ON_NOCOMM +#define ENG1 ENGINEERING1_INH_WX_PWR_HNDL +//#define ENG2 ENGINEERING2_POWER_CYCLE_R + +// Do not touch this +#if defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) +#define _SYMBOL_F '/' +#define _SYMBOL_S '#' +#elif !defined (_SYMBOL_DIGI) && defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) +#define _SYMBOL_F '1' +#define _SYMBOL_S '#' +#elif !defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) +#define _SYMBOL_F '/' +#define _SYMBOL_S '-' +#elif !defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) +#define _SYMBOL_F 'I' +#define _SYMBOL_S '&' +#elif !defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + defined (_SYMBOL_IGATE) +#define _SYMBOL_F 'R' +#define _SYMBOL_S '&' +#elif !defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) && defined(_SYMBOL_SAILBOAT) +#define _SYMBOL_F '/' +#define _SYMBOL_S 'Y' +#elif !defined (_SYMBOL_F) && !defined (_SYMBOL_S) +#error "Missing symbol configuration in station_config.h" +#elif defined (_SYMBOL_F) && defined (_SYMBOL_S) +#else +#error "Wrong symbol configuration in station_config.h" +#endif +//#if defined (_METEO) && !defined (_DIGI) +//#define _DIGI +//#endif + + +#if defined(_ANEMOMETER_TX20) && defined(_ANEMOMETER_ANALOGUE) +#error "You cannot use two anemometers at once!!!" +#endif + +#if defined(_MOBUS_RTU) && defined(_DAVIS_SERIAL) +#error "You cannot use modbus RTU devices and Davis weather station at once!!!" +#endif + +#if !defined(_ANEMOMETER_TX20) && !defined(_ANEMOMETER_ANALOGUE) && !defined(_UMB_MASTER) && defined(_METEO) +#define _ANEMOMETER_TX20 +#endif + +#endif /* STATION_CONFIG_H_ */ diff --git a/src/main.c b/src/main.c index f845ff4..8427547 100644 --- a/src/main.c +++ b/src/main.c @@ -209,10 +209,10 @@ main_usart_mode_t main_usart1_kiss_mode = USART_MODE_UNDEF; //! operation mode of USART2 (RS485) main_usart_mode_t main_usart2_wx_mode = USART_MODE_UNDEF; -//! +//! function configuration for left button on ParaMETEO configuration_button_function_t main_button_one_left; -//! +//! function configuration for right button on ParaMETEO configuration_button_function_t main_button_two_right; //! a pointer to KISS context @@ -282,7 +282,11 @@ volatile int i = 0; #endif #if defined(PARAMETEO) +//!< Trigger some reinitnialization after waking up from deep sleep uint8_t main_woken_up = 0; + +//!< Triggers additional check if ADC has properly reinitialized and conversion is working +uint8_t main_check_adc = 0; #endif char after_tx_lock; @@ -1149,15 +1153,17 @@ int main(int argc, char* argv[]){ ax25_new_msg_rx_flag = 0; main_ax25.dcd = false; - DA_Init(); + //DA_Init(); ADCStartConfig(); DACStartConfig(); AFSK_Init(&main_afsk); ax25_init(&main_ax25, &main_afsk, 0, message_callback, 0); - TimerConfig(); + //TimerConfig(); main_woken_up = 0; + main_check_adc = 1; + main_set_monitor(1); } #endif @@ -1214,9 +1220,6 @@ int main(int argc, char* argv[]){ gsm_sim800_tx_done_event_handler(main_gsm_srl_ctx_ptr, &main_gsm_state); } -// gsm_sim800_engineering_enable(main_gsm_srl_ctx_ptr, &main_gsm_state); -// gsm_sim800_engineering_request_data(main_gsm_srl_ctx_ptr, &main_gsm_state); - //gsm_sim800_engineering_disable(main_gsm_srl_ctx_ptr, &main_gsm_state); } #endif @@ -1542,6 +1545,12 @@ int main(int argc, char* argv[]){ } #ifdef PARAMETEO + if (main_check_adc == 1) { + AD_Restart(); + + main_check_adc = 0; + } + // inhibit any power save switching when modem transmits data if (!main_afsk.sending && main_woken_up == 0) { pwr_save_pooling_handler(main_config_data_mode, main_config_data_basic, packet_tx_get_minutes_to_next_wx(), rte_main_average_battery_voltage); diff --git a/system/include/aprs/adc.h b/system/include/aprs/adc.h index 2362fb9..9dd9a69 100644 --- a/system/include/aprs/adc.h +++ b/system/include/aprs/adc.h @@ -11,7 +11,7 @@ extern "C" /*******************************************************************************************************/ /*********************************************************************************************************************/ -void AD_Init(Afsk *af); +void AD_Restart(void); /*********************************************************************************************************************/ /*********************************************************************************************************************/ diff --git a/system/src/aprs/adc.c b/system/src/aprs/adc.c index 75dc699..0e42299 100644 --- a/system/src/aprs/adc.c +++ b/system/src/aprs/adc.c @@ -13,50 +13,26 @@ #include #include -#define ADC1_DR_Address ((uint32_t)0x4001244C) - - Afsk *adc_afsk; -volatile uint16_t ADCValue[16]; - uint16_t max_value; uint32_t samplecount; - - - /*********************************************************************************************************************/ -void AD_Init(Afsk *af) { +void AD_Restart(void) { /*********************************************************************************************************************/ -// GPIO_InitTypeDef GPIO_InitStructure; -// NVIC_InitTypeDef NVIC_InitStructure; -// -// //Dolacz zegar do GPIOA, ADC1 -// RCC->APB2ENR |= RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1; -// RCC_ADCCLKConfig(RCC_PCLK2_Div6); -// -// //Dolacz zegar do DMA1 -// RCC->AHBENR |= RCC_AHBPeriph_DMA1; -// -// //Konfiguracja portu -// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; -// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; -// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; -// GPIO_Init(GPIOA, &GPIO_InitStructure); -// -// AD_Reset(); -// -// adc_afsk = af; -// -// //Przerwania DMA1 Kanal1 -// NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; -// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; -// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; -// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; -// NVIC_Init(&NVIC_InitStructure); + // check if conversion is done or not + if ((ADC1->ISR & ADC_ISR_EOC) == 0) { + // stop adc conversion + ADC1->CR |= ADC_CR_ADSTP; + // wait for conversion to shutdown + while((ADC1->ISR & ADC_CR_ADSTART) == ADC_CR_ADSTART); + + // start ADC back again + ADC1->CR |= ADC_CR_ADSTART; + } }