SP8EBC-ParaTNC/src/wx_pwr_switch.c

177 wiersze
3.7 KiB
C

/*
* pwr_switch.c
*
* Created on: Aug 31, 2021
* Author: mateusz
*/
#include <wx_pwr_switch.h>
#include "station_config.h"
#include "main.h"
#include "rte_wx.h"
#include "wx_handler.h"
#include "io.h"
#include "pwr_save.h"
#include "delay.h"
#ifdef STM32F10X_MD_VL
#include <stm32f10x.h>
#endif
#ifdef STM32L471xx
#include <stm32l4xx.h>
#include <stm32l4xx_ll_gpio.h>
#endif
/**
* This power state applies only to ParaTNC or ParaMETEO with powersaving disabled. Otherwise
* swithig on / off is handled by pwr_save.c
*/
wx_pwr_state_t wx_pwr_state;
#define REGISTER RTC->BKP0R
#define WX_WATCHDOG_PERIOD (SYSTICK_TICKS_PER_SECONDS * SYSTICK_TICKS_PERIOD * 90)
#define WX_WATCHDOG_RESET_DURATION (SYSTICK_TICKS_PER_SECONDS * SYSTICK_TICKS_PERIOD * 3)
void wx_pwr_switch_case_under_reset_parameteo() {
if (pwr_save_get_inhibit_pwr_switch_periodic() == 1)
return;
io___cntrl_vbat_s_enable();
wx_force_i2c_sensor_reset = 1;
wx_pwr_state = WX_PWR_ON;
}
void wx_pwr_switch_case_under_reset_paratnc() {
// Turn on the +5V_ISOL (VDD_SW) voltage
io_5v_isol_sw_enable();
#ifdef PWR_SWITCH_BOTH
io_12v_sw_enable();
wx_force_i2c_sensor_reset = 1;
#endif
wx_pwr_state = WX_PWR_ON;
}
void wx_pwr_switch_case_off_parameteo() {
if (pwr_save_get_inhibit_pwr_switch_periodic() == 1)
return;
// Turn on the +5V_ISOL (VDD_SW) voltage
io___cntrl_vbat_s_enable();
wx_force_i2c_sensor_reset = 1;
wx_pwr_state = WX_PWR_ON;
}
void wx_pwr_switch_case_off_paratnc() {
#if (defined STM32F10X_MD_VL)
// Turn on the +12V_SW voltage
GPIO_SetBits(GPIOA, GPIO_Pin_6);
#endif
delay_fixed(100);
// Turn on the +5V_ISOL (VDD_SW) voltage
//GPIO_SetBits(GPIOB, GPIO_Pin_8);
io_5v_isol_sw_enable();
}
void wx_pwr_switch_init(void) {
}
void wx_pwr_switch_periodic_handle(void) {
// do a last valid measuremenets timestamps only if power is currently applied
if (wx_pwr_state == WX_PWR_ON) {
// the value of 0xFFFFFFFF is a magic word which disables the check for this parameter
if (wx_last_good_temperature_time != 0xFFFFFFFF &&
master_time - wx_last_good_temperature_time >= WX_WATCHDOG_PERIOD)
{
wx_pwr_state = WX_PWR_UNDER_RESET;
}
// as the weather station could be configured not to perform wind measurements at all
if (wx_last_good_wind_time != 0xFFFFFFFF &&
master_time - wx_last_good_wind_time >= WX_WATCHDOG_PERIOD)
{
wx_pwr_state = WX_PWR_UNDER_RESET;
rte_wx_wind_qf = AN_WIND_QF_DEGRADED;
}
if (wx_pwr_state == WX_PWR_UNDER_RESET) {
// if timeout watchod expired there is a time to reset the supply voltage
wx_pwr_state = WX_PWR_UNDER_RESET;
#if (defined STM32F10X_MD_VL)
// pull the output down to switch the relay and disable +5V_ISOL (VDD_SW)
io_5v_isol_sw_disable();
#ifdef PWR_SWITCH_BOTH
io_12v_sw_disable();
#endif
#endif
#if (defined STM32L471xx)
io___cntrl_vbat_s_disable();
io___cntrl_vbat_m_disable();
#endif
// setting the last_good timers to current value to prevent reset loop
wx_last_good_temperature_time = master_time;
wx_last_good_wind_time = master_time;
return;
}
}
// service actual supply state
switch (wx_pwr_state) {
case WX_PWR_OFF:
// one second delay
delay_fixed(2000);
#if (defined STM32F10X_MD_VL)
wx_pwr_switch_case_off_paratnc();
#endif
#if (defined STM32L471xx)
wx_pwr_switch_case_off_parameteo();
#endif
// power is off after power-up and needs to be powered on
wx_pwr_state = WX_PWR_ON;
break;
case WX_PWR_ON:
break;
case WX_PWR_UNDER_RESET:
#if (defined STM32F10X_MD_VL)
wx_pwr_switch_case_under_reset_paratnc();
#endif
#if (defined STM32L471xx)
wx_pwr_switch_case_under_reset_parameteo();
#endif
break;
case WX_PWR_DISABLED:
break;
}
}