|  | @@ -864,22 +864,53 @@ void UPS_LowBatMonitor(void)
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static uint8_t UPS_LoadRangeAlarm(void)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +#ifdef LOAD_MONITOR
 | 
	
		
			
				|  |  | +  uint8_t flag = 0;
 | 
	
		
			
				|  |  | +  static uint8_t stateCurrent = HYST_IDLE;
 | 
	
		
			
				|  |  | +  float load = UPS.Load;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /* Отслеживается переход через верхнюю границу */
 | 
	
		
			
				|  |  | +  if (load > sSettings.sAlarmManager.load_range.high)
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +     if (stateCurrent == HYST_IDLE) {
 | 
	
		
			
				|  |  | +        stateCurrent = HYST_UP;
 | 
	
		
			
				|  |  | +        flag = 1;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +  } else  if (load < (sSettings.sAlarmManager.load_range.high - sSettings.sAlarmManager.load_range.hyst))
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +      if (stateCurrent == HYST_UP)
 | 
	
		
			
				|  |  | +	    {
 | 
	
		
			
				|  |  | +        stateCurrent = HYST_IDLE;
 | 
	
		
			
				|  |  | +        flag = 0;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    if (stateCurrent == HYST_UP) {
 | 
	
		
			
				|  |  | +      flag = 1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return flag;
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |    * @brief  Мониторинг нагрузки 
 | 
	
		
			
				|  |  |    */
 | 
	
		
			
				|  |  |  void UPS_PowerMonitor(void)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  #ifdef LOAD_MONITOR
 | 
	
		
			
				|  |  | -  float load;
 | 
	
		
			
				|  |  | -  static uint8_t stateCurrent = HYST_IDLE;
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -  load = UPS.Load;
 | 
	
		
			
				|  |  | +  uint8_t powerStatusCurrent;
 | 
	
		
			
				|  |  | +  static uint8_t powerStatusOld = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Отслеживается переход через верхнюю границу */
 | 
	
		
			
				|  |  | -  if (load > sSettings.sAlarmManager.load_range.high)
 | 
	
		
			
				|  |  | +  powerStatusCurrent = ((UPS.warn_status >> 4) & 0x01);
 | 
	
		
			
				|  |  | +  powerStatusCurrent |= UPS_LoadRangeAlarm();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (powerStatusCurrent)
 | 
	
		
			
				|  |  |    {
 | 
	
		
			
				|  |  |  	  UPS.Alarm = (UPS.Alarm & 0xfffffffe) | (1 << 0);
 | 
	
		
			
				|  |  | -    if (stateCurrent == HYST_IDLE)
 | 
	
		
			
				|  |  | +    if (powerStatusCurrent != powerStatusOld)
 | 
	
		
			
				|  |  |  	{
 | 
	
		
			
				|  |  |  #ifdef LED_RED_MINOR
 | 
	
		
			
				|  |  |        LED_On(LED_RED_MINOR);
 | 
	
	
		
			
				|  | @@ -887,37 +918,35 @@ void UPS_PowerMonitor(void)
 | 
	
		
			
				|  |  |  #ifdef LED_GREEN_MINOR
 | 
	
		
			
				|  |  |        LED_On(LED_GREEN_MINOR);
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  | -	  stateCurrent = HYST_UP;
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |  	  log_event_data(LOG_ALARM_POWER, "Авария");
 | 
	
		
			
				|  |  |  	  // Отправка трапа о завышении 
 | 
	
		
			
				|  |  |  	  SNMP_SendUserTrap(POWER_ALARM);
 | 
	
		
			
				|  |  | -	  syslog(SYSLOG_ERROR, "Авария нагрузки (%d%%)", load);
 | 
	
		
			
				|  |  | +	  syslog(SYSLOG_ERROR, "Авария нагрузки (%d%%)", UPS.Load);
 | 
	
		
			
				|  |  |  	  flUpdateLog = true;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    /* Отслеживается нормализация */
 | 
	
		
			
				|  |  | -  else if (load < (sSettings.sAlarmManager.load_range.high - sSettings.sAlarmManager.load_range.hyst))
 | 
	
		
			
				|  |  | -  {
 | 
	
		
			
				|  |  | -	UPS.Alarm = (UPS.Alarm & 0xfffffffe);
 | 
	
		
			
				|  |  | -  if (stateCurrent == HYST_UP)
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | +  else {
 | 
	
		
			
				|  |  | +    UPS.Alarm = (UPS.Alarm & 0xfffffffe);
 | 
	
		
			
				|  |  | +    if (powerStatusCurrent != powerStatusOld)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  |  #ifdef LED_RED_MINOR
 | 
	
		
			
				|  |  | -    	LED_Off(LED_RED_MINOR);
 | 
	
		
			
				|  |  | +        LED_Off(LED_RED_MINOR);
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  #ifdef LED_GREEN_MINOR
 | 
	
		
			
				|  |  | -    	LED_Off(LED_GREEN_MINOR);
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -	  stateCurrent = HYST_IDLE;
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | -	  log_event_data(LOG_ALARM_POWER, "Норма");
 | 
	
		
			
				|  |  | -	  // Отправка трапа о нормализации 
 | 
	
		
			
				|  |  | -	  SNMP_SendUserTrap(POWER_NORM);
 | 
	
		
			
				|  |  | -	  syslog(SYSLOG_NOTICE, "Авария нагрузки нормализовалась (%d%%)", load);
 | 
	
		
			
				|  |  | -	  flUpdateLog = true;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +        LED_Off(LED_GREEN_MINOR);
 | 
	
		
			
				|  |  | +#endif 
 | 
	
		
			
				|  |  | +      log_event_data(LOG_ALARM_POWER, "Норма");
 | 
	
		
			
				|  |  | +      // Отправка трапа о нормализации 
 | 
	
		
			
				|  |  | +      SNMP_SendUserTrap(POWER_NORM);
 | 
	
		
			
				|  |  | +      syslog(SYSLOG_NOTICE, "Авария нагрузки нормализовалась (%d%%)", UPS.Load);
 | 
	
		
			
				|  |  | +      flUpdateLog = true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  powerStatusOld = powerStatusCurrent;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if (UPS.Alarm & 0x00000001) {
 | 
	
		
			
				|  |  |      flCriticalAlarm = true;
 | 
	
		
			
				|  |  |      flLedAlarm = true;
 | 
	
	
		
			
				|  | @@ -994,55 +1023,73 @@ void sensorTemperatureMonitor(void)
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #ifdef TEMP_AKB_MONITOR
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | -  * @brief  Мониторинг температуры по верхней границе
 | 
	
		
			
				|  |  | -  */
 | 
	
		
			
				|  |  | -void UPS_TemperatureHighRangeMonitor(void)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static uint8_t UPS_TempHighRangeAlarm(void)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +  uint8_t flag = 0;
 | 
	
		
			
				|  |  |    float temperature;
 | 
	
		
			
				|  |  |    static uint8_t stateCurrent = HYST_IDLE;
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |    GetInternalTempInt(&temperature);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if(temperature == 85) {
 | 
	
		
			
				|  |  | -    UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);
 | 
	
		
			
				|  |  |      if (stateCurrent == HYST_UP) {
 | 
	
		
			
				|  |  |        stateCurrent = HYST_IDLE;
 | 
	
		
			
				|  |  | -      log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
 | 
	
		
			
				|  |  | -      // Отправка трапа о нормализации
 | 
	
		
			
				|  |  | -	    SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
 | 
	
		
			
				|  |  | -      syslog(SYSLOG_NOTICE, "Температура в норме (%0.1f C)", temperature);
 | 
	
		
			
				|  |  | -      flUpdateLog = true;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return;
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    if (stateCurrent == HYST_IDLE) {
 | 
	
		
			
				|  |  | -      UPS.Alarm = (UPS.Alarm & 0xfffffffd);
 | 
	
		
			
				|  |  | +      flag = 0;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    return flag;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Отслеживается переход через верхнюю границу */
 | 
	
		
			
				|  |  |    if (temperature > sSettings.sAlarmManager.Temprature_range.high)
 | 
	
		
			
				|  |  |    {
 | 
	
		
			
				|  |  | -    if (stateCurrent == HYST_IDLE)
 | 
	
		
			
				|  |  | -	  {
 | 
	
		
			
				|  |  | -	    stateCurrent = HYST_UP;
 | 
	
		
			
				|  |  | -      UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);
 | 
	
		
			
				|  |  | +     if (stateCurrent == HYST_IDLE) {
 | 
	
		
			
				|  |  | +        stateCurrent = HYST_UP;
 | 
	
		
			
				|  |  | +        flag = 1;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +  } else  if (temperature < (sSettings.sAlarmManager.Temprature_range.high - sSettings.sAlarmManager.Temprature_range.hyst))
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +      if (stateCurrent == HYST_UP)
 | 
	
		
			
				|  |  | +	    {
 | 
	
		
			
				|  |  | +        stateCurrent = HYST_IDLE;
 | 
	
		
			
				|  |  | +        flag = 0;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    if (stateCurrent == HYST_UP) {
 | 
	
		
			
				|  |  | +      flag = 1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return flag;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | +  * @brief  Мониторинг температуры по верхней границе
 | 
	
		
			
				|  |  | +  */
 | 
	
		
			
				|  |  | +void UPS_TemperatureHighRangeMonitor(void)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  float temperature;
 | 
	
		
			
				|  |  | +  uint8_t tempStatusCurrent;
 | 
	
		
			
				|  |  | +  static uint8_t tempStatusOld = 0;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +  GetInternalTempInt(&temperature);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	  log_event_data(LOG_ALARM_HIGH_TEMP, "Авария");
 | 
	
		
			
				|  |  | -	  // Отправка трапа о завышении 
 | 
	
		
			
				|  |  | -	  SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_ALARM);
 | 
	
		
			
				|  |  | -	  syslog(SYSLOG_ERROR, "Высокая температура (%0.1f C)", temperature);
 | 
	
		
			
				|  |  | -	  flUpdateLog = true;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +  tempStatusCurrent = ((UPS.warn_status >> 5) & 0x01);
 | 
	
		
			
				|  |  | +  tempStatusCurrent |= UPS_TempHighRangeAlarm();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (tempStatusCurrent)
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);
 | 
	
		
			
				|  |  | +    if (tempStatusCurrent != tempStatusOld) {
 | 
	
		
			
				|  |  | +      log_event_data(LOG_ALARM_HIGH_TEMP, "Авария");
 | 
	
		
			
				|  |  | +      // Отправка трапа о завышении 
 | 
	
		
			
				|  |  | +      SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_ALARM);
 | 
	
		
			
				|  |  | +      syslog(SYSLOG_ERROR, "Высокая температура (%0.1f C)", temperature);
 | 
	
		
			
				|  |  | +      flUpdateLog = true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    /* Отслеживается нормализация */
 | 
	
		
			
				|  |  | -  else if (temperature < (sSettings.sAlarmManager.Temprature_range.high - sSettings.sAlarmManager.Temprature_range.hyst))
 | 
	
		
			
				|  |  | -  {
 | 
	
		
			
				|  |  | -    if (stateCurrent == HYST_UP)
 | 
	
		
			
				|  |  | -	  {
 | 
	
		
			
				|  |  | -	    stateCurrent = HYST_IDLE;
 | 
	
		
			
				|  |  | -      UPS.Alarm = (UPS.Alarm & 0xfffffffd);
 | 
	
		
			
				|  |  | +  else {
 | 
	
		
			
				|  |  | +    UPS.Alarm = (UPS.Alarm & 0xfffffffd);
 | 
	
		
			
				|  |  | +    if (tempStatusCurrent != tempStatusOld) {
 | 
	
		
			
				|  |  |  	    log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
 | 
	
		
			
				|  |  |  	  // Отправка трапа о нормализации 
 | 
	
		
			
				|  |  |  	    SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
 | 
	
	
		
			
				|  | @@ -1050,6 +1097,7 @@ void UPS_TemperatureHighRangeMonitor(void)
 | 
	
		
			
				|  |  |  	    flUpdateLog = true;
 | 
	
		
			
				|  |  |  	  }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +  tempStatusOld = tempStatusCurrent;
 | 
	
		
			
				|  |  |    if (UPS.Alarm & 0x00000002) {
 | 
	
		
			
				|  |  |      flCriticalAlarm = true;
 | 
	
		
			
				|  |  |      flLedAlarm = true;
 |