| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271 | /********************************* (C) РОТЕК *********************************** * @module  ups_monitor * @file    ups_monitor.c * @version 1.0.0 * @date    XX.XX.XXXX * $brief   Template ******************************************************************************* * @history     Version  Author         Comment * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release. ******************************************************************************* */   #include "stm32f4xx.h"#include "ups_monitor.h"#include "parameters.h"#include "settings_api.h"#include "megatec.h"#include "led.h"#include "log.h"#include "rtc.h"#include "hal.h"#include "FreeRTOS.h"#include "task.h"#include "trap_api.h"#include "snmp_api.h"#include <stdbool.h>bool flCriticalAlarm = false;bool flNonCriticalAlarm = false;bool flLedAlarm = false;/**  * @brief  Общая структура настроек  */extern SETTINGS_t sSettings;extern bool flUpdateLog;/**  * @brief  Задача мониторинга параметров UPS  */void UPS_Monitor(void *params){	vTaskDelay(5000);  for (;;)  {		flCriticalAlarm = false;	  flNonCriticalAlarm = false;    flLedAlarm = false;#define XMONITOR(monitor_func, present) if (present) { monitor_func(); }        MONITOR_TABLE#undef XMONITOR#ifdef LED_ALARM      if(flLedAlarm){    	  if (UPS.Present)    		  LED_On(LED_ALARM);    	  else    		  LED_Toggle(LED_ALARM);      }      else{    	  LED_Off(LED_ALARM);      }#endif    vTaskDelay(1000);  }}#ifdef DINS_ENABLE/**  * @brief  Мониторинг бита DI0 state  */void UPS_DI0Monitor(void){#ifdef DIN_MONITOR  static bool isValueRecv = false;  static uint8_t DI0OldState[INPUTS_TOTAL_COUNT];  uint8_t DI0StateCurrent;  for(uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) {    DI0StateCurrent = get_state_din_outs((DIN1+i)) ^ sSettings.sDINs[i].din_type_act;    UPS.Alarm = (UPS.Alarm & ~(1 << (4 + i))) | (DI0StateCurrent << (4 + i));      if (!isValueRecv) {      DI0OldState[i] = DI0StateCurrent;      if (DI0StateCurrent){        log_event_data((LOG_ALARM_DIO + i), "Авария");        SNMP_SendUserTrap(DI0_ALARM + 2*i);        flUpdateLog = true;      }      else{        log_event_data((LOG_ALARM_DIO + i), "Норма");        SNMP_SendUserTrap(DI0_NORM + 2*i);        flUpdateLog = true;      }      if (i == (INPUTS_TOTAL_COUNT - 1)) {        isValueRecv = true;        break;      }       continue;    }    if (DI0StateCurrent) {      flLedAlarm = true;    }          // Значение параметра изменилось    if (DI0StateCurrent != DI0OldState[i])    {      if (!DI0StateCurrent){        log_event_data((LOG_ALARM_DIO + i), "Норма");        SNMP_SendUserTrap((DI0_NORM + 2*i));        flUpdateLog = true;      }      else{        log_event_data((LOG_ALARM_DIO + i), "Авария");        SNMP_SendUserTrap(DI0_ALARM + 2*i);        flUpdateLog = true;      }    }    DI0OldState[i] = DI0StateCurrent;  }#endif}#endif#ifdef  DOUTS_ENABLE void relay_setup_log(uint8_t *curr_source, ro_type_source_t src_act_ro, uint8_t state_relay){	uint8_t i = 0;	for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){		if(curr_source[i] == src_act_ro){			  SetROInt(state_relay, i);			  SNMP_SendUserTrap((DO0_TOGGLED+i));			  if(state_relay){				  flUpdateLog = true;#if	defined RELAY_NC				  log_event_data((LOG_DO0_STATE + i), "Разомкнуто");#else				  log_event_data((LOG_DO0_STATE + i), "Замкнуто");#endif			  }			  else{				  flUpdateLog = true;#if	defined RELAY_NC				  log_event_data((LOG_DO0_STATE + i), "Замкнуто");#else				  log_event_data((LOG_DO0_STATE + i), "Разомкнуто");#endif			  }		}	}}void relay_setup_log_change(uint8_t *curr_source, uint8_t *prev_source, ro_type_source_t src_act_ro){	uint8_t i = 0;	for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){		if(curr_source[i] != prev_source[i] && (prev_source[i] == src_act_ro || curr_source[i] == src_act_ro)){#if	defined RELAY_NC			if(curr_source[i] != src_act_ro){				flUpdateLog = true;				 SetROInt(0, i);				 SNMP_SendUserTrap((DO0_TOGGLED+i));				 log_event_data((LOG_DO0_STATE + i), "Замкнуто");			  }			  else{				  flUpdateLog = true;				  SetROInt(1, i);				  SNMP_SendUserTrap((DO0_TOGGLED+i));				  log_event_data((LOG_DO0_STATE + i), "Разомкнуто");			  }#else			  if(curr_source[i] != src_act_ro){				  flUpdateLog = true;				  SetROInt(0, i);				  SNMP_SendUserTrap((DO0_TOGGLED+i));				  log_event_data((LOG_DO0_STATE + i), "Разомкнуто");			  }			  else{				  flUpdateLog = true;				  SetROInt(1, i);				 SNMP_SendUserTrap((DO0_TOGGLED+i));				  log_event_data((LOG_DO0_STATE + i), "Замкнуто");			  }#endif		}	}}#endif#ifdef TYPE_CRITICAL_ALARM_MONITOR/**  * @brief  Мониторинг бита CriticalAlarm  */void UPS_CriticalAlarmMonitor(void){  static bool isValueRecv = false;  static uint8_t CriticalAlarmOldState = 0;  uint8_t CriticalAlarmCurrent;  uint8_t i = 0;  static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)	  CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;  CriticalAlarmCurrent = flCriticalAlarm;  if (!isValueRecv) {	isValueRecv = true;	CriticalAlarmOldState = CriticalAlarmCurrent;	for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)		OldROtype_Sourse[i] = CurrROtype_Sourse[i];	if(CriticalAlarmCurrent){	  relay_setup_log(CurrROtype_Sourse, CRITICAL, 1);	}	else{		relay_setup_log(CurrROtype_Sourse, CRITICAL, 0);	}	return;  }  // Значение параметра изменилось  if (CriticalAlarmCurrent != CriticalAlarmOldState)  {	  if(CriticalAlarmCurrent){		  relay_setup_log(CurrROtype_Sourse, CRITICAL, 1);	  }	  else{		  relay_setup_log(CurrROtype_Sourse, CRITICAL, 0);	  }  }  else  {	  if(CriticalAlarmCurrent)		  relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CRITICAL);  }	for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){	  OldROtype_Sourse[i] = CurrROtype_Sourse[i];	}  CriticalAlarmOldState = CriticalAlarmCurrent;}/**  * @brief  Мониторинг бита NonCriticalAlarm  */void UPS_NonCriticalAlarmMonitor(void){  static bool isValueRecv = false;  static uint8_t NonCriticalAlarmOldState = 0;  uint8_t NonCriticalAlarmCurrent;  uint8_t i = 0;  static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)	  CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;  NonCriticalAlarmCurrent = flNonCriticalAlarm;  if (!isValueRecv) {	isValueRecv = true;	NonCriticalAlarmOldState = NonCriticalAlarmCurrent;	 for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)		 OldROtype_Sourse[i] = CurrROtype_Sourse[i];	  if(NonCriticalAlarmCurrent)		  relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 1);	  else		  relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 0);	return;  }  // Значение параметра изменилось  if (NonCriticalAlarmCurrent != NonCriticalAlarmOldState)  {	  if(NonCriticalAlarmCurrent){		  relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 1);	  }	  else{		  relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 0);	  }  }  else  {	  if(NonCriticalAlarmCurrent)		  relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, NON_CRITICAL);  }  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){  	  OldROtype_Sourse[i] = CurrROtype_Sourse[i];  }  NonCriticalAlarmOldState = NonCriticalAlarmCurrent;}#endif/**  * @brief  Мониторинг бита Test in progress  */void UPS_TestFinishMonitor(void){#ifdef TEST_AKB_FINISH_MONITOR  static uint8_t TestFinishState = 0;  uint8_t TestFinishStateCurrent;  char log_string[50];  TestFinishStateCurrent = (UPS.Status >> 2) & 0x01;  // Значение параметра изменилось  if (TestFinishStateCurrent != TestFinishState)  {    if (!TestFinishStateCurrent){      log_event_data(LOG_TEST_UPS, "Завершен");      flUpdateLog = true;    } else {      memset(log_string, 0, sizeof(log_string));      switch (get_act_source()) {        case WEB_ACT:            strcpy(log_string, name_login);            break;        case SNMP_ACT:        case OTHER_ACT:            strcpy(log_string, "Администратор");            break;#ifdef CLI_ENABLE        case CLI_ACT:            strcpy(log_string, "Администратор");            break;#endif        default:            break;      }      strcat(log_string, " (Запущен)");      log_event_data(LOG_TEST_UPS, log_string);      flUpdateLog = true;    }  }  TestFinishState = TestFinishStateCurrent;#endif}/**  * @brief  Мониторинг бита LainFail  */void UPS_LineFailMonitor(void){#ifdef LINE_FAIL_MONITOR  static bool isValueRecv = false;  static uint8_t lineFailOldState = 0;  uint8_t lineFailCurrent;#if defined HARDWARE_BT6707  uint8_t i = 0;  static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)	  CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;#endif  lineFailCurrent = (UPS.Status >> 7) & 0x01;    if (!isValueRecv) {    isValueRecv = true;    lineFailOldState = lineFailCurrent;    if (lineFailCurrent){    	log_event_data(LOG_ALARM_LINE, "Авария");          SNMP_SendUserTrap(LINE_ALARM);          flUpdateLog = true;#if	defined HARDWARE_BT6707    	relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);#endif    }    else{#if	defined HARDWARE_BT6707      relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0);#endif      log_event_data(LOG_ALARM_LINE, "Норма");      SNMP_SendUserTrap(LINE_NORM);      flUpdateLog = true;    }    return;  }  if (lineFailCurrent){    flCriticalAlarm = true;    flLedAlarm = true;  }	    // Значение параметра изменилось  if (lineFailCurrent != lineFailOldState)  {    if (lineFailCurrent){#if	defined HARDWARE_BT6707    	relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);#endif    	log_event_data(LOG_ALARM_LINE, "Авария");    	SNMP_SendUserTrap(LINE_ALARM);#ifdef AKB_CHANGE_MONITOR      if(UPS.Alarm & 0x40) {        log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");    	  SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);      }   #endif    	flUpdateLog = true;    }    else{#if	defined HARDWARE_BT6707      relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0);#endif      log_event_data(LOG_ALARM_LINE, "Норма");      SNMP_SendUserTrap(LINE_NORM);      flUpdateLog = true;    }  }#if defined HARDWARE_BT6707  else{	  if (lineFailCurrent)		  relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, AC_PRESENT);  }  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){	  OldROtype_Sourse[i] = CurrROtype_Sourse[i];  }#endif  lineFailOldState = lineFailCurrent;#endif}#ifdef VAC_OUT_MONITOR/**  * @brief  Мониторинг аварии выходного напряжения по нижней границе  */void UPS_VACoutputLowRangeMonitor(void){  static uint8_t stateCurrentVACoutput = HYST_IDLE;  uint8_t VACoutputCurrent;#if	defined HARDWARE_BT6707  uint8_t i = 0;  static bool isValueRecv = false;  static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){	  CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;	  if(!isValueRecv)		  OldROtype_Sourse[i] = CurrROtype_Sourse[i];  }#endif  VACoutputCurrent = UPS.VAC_out;  /* Отслеживается переход через нижнию границу */  if (VACoutputCurrent < sSettings.sAlarmManager.ac_output_range.low)  {      if (stateCurrentVACoutput == HYST_IDLE)	    {          UPS.Alarm |= (1 << 7);          stateCurrentVACoutput = HYST_DOWN;#if	defined HARDWARE_BT6707          relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 1);#endif	        log_event_data(LOG_ALARM_VAC_LOW_OUTPUT, "Авария");	  // Отправка трапа о завышении	//  SNMP_SendUserTrap(POWER_ALARM);	        flUpdateLog = true;	    } else {#if	defined HARDWARE_BT6707    	    relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, DC_PRESENT);#endif      }  }  /* Отслеживается нормализация */  else if (VACoutputCurrent > (sSettings.sAlarmManager.ac_output_range.low + sSettings.sAlarmManager.ac_output_range.hyst))  {      if (stateCurrentVACoutput == HYST_DOWN)	    {          UPS.Alarm &= 0xffffff7f;    	    stateCurrentVACoutput = HYST_IDLE;#if	defined HARDWARE_BT6707	        relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 0);#endif	        log_event_data(LOG_ALARM_VAC_LOW_OUTPUT, "Норма");	  // Отправка трапа о нормализации	 // SNMP_SendUserTrap(POWER_NORM);	        flUpdateLog = true;	    }  }   if (UPS.Alarm & 0x80) {    flLedAlarm = true;  }#if	defined HARDWARE_BT6707  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){  	  OldROtype_Sourse[i] = CurrROtype_Sourse[i];    }#endif}/**  * @brief  Мониторинг аварии выходного напряжения по верхней границе  */void UPS_VACoutputHighRangeMonitor(void){  static uint8_t stateCurrentVACoutput = HYST_IDLE;  uint8_t VACoutputCurrent;#if	defined HARDWARE_BT6707  uint8_t i = 0;  static bool isValueRecv = false;  static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){	  CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;	  if(!isValueRecv)		  OldROtype_Sourse[i] = CurrROtype_Sourse[i];  }#endif  VACoutputCurrent = UPS.VAC_out;  /* Отслеживается переход через верхнюю границу */  if (VACoutputCurrent > sSettings.sAlarmManager.ac_output_range.high)  {      if (stateCurrentVACoutput == HYST_IDLE) {          UPS.Alarm |= (1 << 7);          stateCurrentVACoutput = HYST_UP;#if	defined HARDWARE_BT6707          relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 1);#endif	        log_event_data(LOG_ALARM_VAC_HIGH_OUTPUT, "Авария");	  // Отправка трапа о завышении	//  SNMP_SendUserTrap(POWER_ALARM);	        flUpdateLog = true;	    } else {#if	defined HARDWARE_BT6707    	    relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, DC_PRESENT);#endif      }  }  /* Отслеживается нормализация */  else if (VACoutputCurrent < (sSettings.sAlarmManager.ac_output_range.high - sSettings.sAlarmManager.ac_output_range.hyst))  {      if (stateCurrentVACoutput == HYST_UP) {          UPS.Alarm &= 0xffffff7f;    	    stateCurrentVACoutput = HYST_IDLE;#if	defined HARDWARE_BT6707	        relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 0);#endif	        log_event_data(LOG_ALARM_VAC_HIGH_OUTPUT, "Норма");	  // Отправка трапа о нормализации	 // SNMP_SendUserTrap(POWER_NORM);	        flUpdateLog = true;	    }  }  if (UPS.Alarm & 0x80) {    flLedAlarm = true;  }#if	defined HARDWARE_BT6707  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){  	  OldROtype_Sourse[i] = CurrROtype_Sourse[i];    }#endif}#endif/**  * @brief  Мониторинг бита LowBat    */void UPS_LowBatMonitor(void){#ifdef LOW_BAT_MONITOR  static bool isValueRecv = false;  static uint8_t lowBatOldState = 0;  static bool flag_alarm_time = false;  uint8_t lowBatCurrent;#if defined HARDWARE_BT6707  uint8_t i = 0;  static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)	  CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;#endif  if((UPS.Status >> 7) & 0x01)	  lowBatCurrent = (UPS.Status >> 6) & 0x01;  else	  lowBatCurrent = 0;    if (!isValueRecv) {    isValueRecv = true;    lowBatOldState = lowBatCurrent;    if (lowBatCurrent){    	log_event_data(LOG_ALARM_LOW_BAT, "Авария");          SNMP_SendUserTrap(LOW_BAT_ALARM);          flUpdateLog = true;#if defined HARDWARE_BT6707      relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);#endif    }    else{	  SNMP_SendUserTrap(LOW_BAT_NORM);	  log_event_data(LOG_ALARM_LOW_BAT, "Норма");	  flUpdateLog = true;#if defined HARDWARE_BT6707	  relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);#endif	}    return;  }  // Значение параметра изменилось  if (lowBatCurrent != lowBatOldState)  {	if(flag_alarm_time){		flag_alarm_time = false;		if (lowBatCurrent){		  SNMP_SendUserTrap(LOW_BAT_ALARM);		  log_event_data(LOG_ALARM_LOW_BAT, "Авария");		  flUpdateLog = true;#ifdef HARDWARE_BT6707		  relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);#endif		}		else{		  SNMP_SendUserTrap(LOW_BAT_NORM);		  log_event_data(LOG_ALARM_LOW_BAT, "Норма");		  flUpdateLog = true;#if defined HARDWARE_BT6707		  relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);#endif		}	}	else{		flag_alarm_time = true;	}  }#if defined HARDWARE_BT6707  else{	  flag_alarm_time = false;	  if (lowBatCurrent)		  relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CHARGE_AKB);  }  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){	  OldROtype_Sourse[i] = CurrROtype_Sourse[i];  }#endif    if(!flag_alarm_time){	  if (lowBatCurrent){		  flNonCriticalAlarm = true;      flLedAlarm = true;	  }	  lowBatOldState = lowBatCurrent;  }  else{	  if (lowBatOldState){		  flNonCriticalAlarm = true;      flLedAlarm = true;	  }  }#endif}/**  * @brief  Мониторинг нагрузки   */void UPS_PowerMonitor(void){#ifdef LOAD_MONITOR  float load;  static uint8_t stateCurrent = HYST_IDLE;      load = UPS.Load;  /* Отслеживается переход через верхнюю границу */  if (load > sSettings.sAlarmManager.load_range.high)  {	  UPS.Alarm = (UPS.Alarm & 0xfffffffe) | (1 << 0);    if (stateCurrent == HYST_IDLE)	{#ifdef LED_RED_MINOR      LED_On(LED_RED_MINOR);#endif#ifdef LED_GREEN_MINOR      LED_On(LED_GREEN_MINOR);#endif	  stateCurrent = HYST_UP;      	  log_event_data(LOG_ALARM_POWER, "Авария");	  // Отправка трапа о завышении 	  SNMP_SendUserTrap(POWER_ALARM);	  flUpdateLog = true;	}  }  /* Отслеживается нормализация */  else if (load < (sSettings.sAlarmManager.load_range.high - sSettings.sAlarmManager.load_range.hyst))  {	UPS.Alarm = (UPS.Alarm & 0xfffffffe);  if (stateCurrent == HYST_UP)	{#ifdef 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);	  flUpdateLog = true;	}  }  if (UPS.Alarm & 0x00000001) {    flCriticalAlarm = true;    flLedAlarm = true;  }#endif}#ifdef SENSOR_TEMP_MONITOR/**  * @brief  Мониторинг аварии датчика температуры  */void sensorTemperatureMonitor(void){  float temperature;  static uint8_t type_sensor[MAX_T_SENSORS];  static uint8_t alarm[MAX_T_SENSORS];   static uint8_t start_monitor = 0;  if (start_monitor == 0) {    start_monitor = 1;    for(uint8_t i = 0; i < MAX_T_SENSORS; i ++){      type_sensor[i] = sSettings.sTempControl[i].type_sensor;    }  }   for(uint8_t i = 0; i < MAX_T_SENSORS; i ++){    if (alarm[i] && sSettings.sTempControl[i].type_sensor != type_sensor[i]) {      alarm[i] = 0;      if (type_sensor[i] == TS_AKB) {        log_event_data(LOG_ALARM_SENSOR_AKB, "Норма");        flUpdateLog = true;      } else if (type_sensor[i] == TS_CABINET) {        log_event_data(LOG_ALARM_SENSOR_CABINET, "Норма");        flUpdateLog = true;      }    }    if (sSettings.sTempControl[i].type_sensor == TS_AKB) {      GetInternalTempInt(&temperature);      if(temperature == 85) {        if(!alarm[i]) {          log_event_data(LOG_ALARM_SENSOR_AKB, "Авария");          flUpdateLog = true;          flLedAlarm = true;          alarm[i] = 1;        }      } else {        if(alarm[i]) {          log_event_data(LOG_ALARM_SENSOR_AKB, "Норма");          flUpdateLog = true;          alarm[i] = 0;        }      }    } else if (sSettings.sTempControl[i].type_sensor == TS_CABINET) {      GetTempCaseInt(&temperature);      if(temperature == 85) {        if(!alarm[i]) {          log_event_data(LOG_ALARM_SENSOR_CABINET, "Авария");          flUpdateLog = true;          flLedAlarm = true;          alarm[i] = 1;        }      } else {        if(alarm[i]) {          log_event_data(LOG_ALARM_SENSOR_CABINET, "Норма");          flUpdateLog = true;          alarm[i] = 0;        }      }    }    type_sensor[i] = sSettings.sTempControl[i].type_sensor;  }}#endif#ifdef TEMP_AKB_MONITOR/**  * @brief  Мониторинг температуры по верхней границе  */void UPS_TemperatureHighRangeMonitor(void){  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);      flUpdateLog = true;    }    return;  } else {    if (stateCurrent == HYST_IDLE) {      UPS.Alarm = (UPS.Alarm & 0xfffffffd);    }  }  /* Отслеживается переход через верхнюю границу */  if (temperature > sSettings.sAlarmManager.Temprature_range.high)  {    if (stateCurrent == HYST_IDLE)	  {	    stateCurrent = HYST_UP;      UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);	  log_event_data(LOG_ALARM_HIGH_TEMP, "Авария");	  // Отправка трапа о завышении 	  SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_ALARM);	  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);	    log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");	  // Отправка трапа о нормализации 	    SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);	    flUpdateLog = true;	  }  }  if (UPS.Alarm & 0x00000002) {    flCriticalAlarm = true;    flLedAlarm = true;  }}/**  * @brief  Мониторинг температуры по нижней границе  */void UPS_TemperatureLowRangeMonitor(void){  float temperature;  static uint8_t stateCurrent = HYST_IDLE;  GetInternalTempInt(&temperature);  if(temperature == 85) {    UPS.Alarm = (UPS.Alarm & 0xfffffeff) | (1 << 8);    if (stateCurrent == HYST_DOWN) {      stateCurrent = HYST_IDLE;      log_event_data(LOG_ALARM_LOW_TEMP, "Норма");      // Отправка трапа о нормализации	    SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_NORM);      flUpdateLog = true;    }    return;  } else {    if (stateCurrent == HYST_IDLE) {      UPS.Alarm = (UPS.Alarm & 0xfffffeff);    }  }  /* Отслеживается переход через нипжнюю границу */  if (temperature < sSettings.sAlarmManager.Temprature_range.low)  {    if (stateCurrent == HYST_IDLE)	{	  stateCurrent = HYST_DOWN;    UPS.Alarm = (UPS.Alarm & 0xfffffeff) | (1 << 8);	  log_event_data(LOG_ALARM_LOW_TEMP, "Авария");	  // Отправка трапа о занижении	  SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_ALARM);	  flUpdateLog = true;	}  }  /* Отслеживается нормализация */  else if (temperature > (sSettings.sAlarmManager.Temprature_range.low + sSettings.sAlarmManager.Temprature_range.hyst))  {    if (stateCurrent == HYST_DOWN)	{	  stateCurrent = HYST_IDLE;    UPS.Alarm = (UPS.Alarm & 0xfffffeff);	  log_event_data(LOG_ALARM_LOW_TEMP, "Норма");	  // Отправка трапа о нормализации	  SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_NORM);	  flUpdateLog = true;	}  }  if (UPS.Alarm & 0x00000100) {    flCriticalAlarm = true;    flLedAlarm = true;  }}#endif#ifdef TEMP_CABINET_MONITOR/**  * @brief  Мониторинг температуры шкафа по верхней границе  */void Cabinet_TemperatureHighRangeMonitor(void){  float temperature;  static uint8_t stateCurrent = HYST_IDLE;      GetTempCaseInt(&temperature);  if(temperature == 85) {    UPS.Alarm = (UPS.Alarm & 0xfffffdff) | (1 << 9);    if (stateCurrent == HYST_UP) {      stateCurrent = HYST_IDLE;      log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Норма");      // Отправка трапа о нормализации	    SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_NORM);      flUpdateLog = true;    }    return;  } else {    if (stateCurrent == HYST_IDLE) {      UPS.Alarm = (UPS.Alarm & 0xfffffdff);    }  }  /* Отслеживается переход через верхнюю границу */  if (temperature > sSettings.sAlarmManager.Temprature_cabinet_range.high)  {	    if (stateCurrent == HYST_IDLE)	  {      UPS.Alarm = (UPS.Alarm & 0xfffffdff) | (1 << 9);	    stateCurrent = HYST_UP;      	  log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Авария");	  // Отправка трапа о завышении 	  SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_ALARM);	  flUpdateLog = true;	}  }  /* Отслеживается нормализация */  else if (temperature < (sSettings.sAlarmManager.Temprature_cabinet_range.high - sSettings.sAlarmManager.Temprature_cabinet_range.hyst))  {    if (stateCurrent == HYST_UP)	  {      UPS.Alarm = (UPS.Alarm & 0xfffffdff);	    stateCurrent = HYST_IDLE;      	  log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Норма");	  // Отправка трапа о нормализации 	  SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_NORM);	  flUpdateLog = true;	}  }  if (UPS.Alarm & 0x00000200) {    flLedAlarm = true;  }}/**  * @brief  Мониторинг температуры шкафа по нижней границе  */void Cabinet_TemperatureLowRangeMonitor(void){  float temperature;  static uint8_t stateCurrent = HYST_IDLE;  GetTempCaseInt(&temperature);  if(temperature == 85) {    UPS.Alarm = (UPS.Alarm & 0xfffffbff) | (1 << 10);    if (stateCurrent == HYST_DOWN) {      stateCurrent = HYST_IDLE;      log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Норма");      // Отправка трапа о нормализации	    SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_NORM);      flUpdateLog = true;    }    return;  } else {    if (stateCurrent == HYST_IDLE) {      UPS.Alarm = (UPS.Alarm & 0xfffffbff);    }  }  /* Отслеживается переход через нипжнюю границу */  if (temperature < sSettings.sAlarmManager.Temprature_cabinet_range.low)  {    if (stateCurrent == HYST_IDLE)	  {	    stateCurrent = HYST_DOWN;      UPS.Alarm = (UPS.Alarm & 0xfffffbff) | (1 << 10);	  log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Авария");	  // Отправка трапа о занижении	  SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_ALARM);	  flUpdateLog = true;	}  }  /* Отслеживается нормализация */  else if (temperature > (sSettings.sAlarmManager.Temprature_cabinet_range.low + sSettings.sAlarmManager.Temprature_cabinet_range.hyst))  {    if (stateCurrent == HYST_DOWN)	  {      UPS.Alarm = (UPS.Alarm & 0xfffffbff);	    stateCurrent = HYST_IDLE;	  log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Норма");	  // Отправка трапа о нормализации	  SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_NORM);	  flUpdateLog = true;	}  }  if (UPS.Alarm & 0x00000400) {    flLedAlarm = true;  }}#endif/**  * @brief  Мониторинг параметра upsParams.connect  */void UPS_ConnectMonitor(void){#ifdef UPS_CONNECT_MONITOR  static bool isValueRecv = false;  static uint8_t connectOldState = 0;  uint8_t connectCurrent;    connectCurrent = UPS.Present;    UPS.Alarm = (UPS.Alarm & 0xfffffffb) | ((connectCurrent^1) << 2);  if (!isValueRecv) {    isValueRecv = true;    connectOldState = connectCurrent;    if (!connectCurrent){    	log_event_data(LOG_ALARM_UPS, "Авария");    	SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);    }    else{    	log_event_data(LOG_ALARM_UPS, "Норма");		SNMP_SendUserTrap(CONNECT_MONITOR_NORM);		flUpdateLog = true;    }    return;  }  if (!connectCurrent){    flCriticalAlarm = true;    flLedAlarm = true;  }  // Значение параметра изменилось  if (connectCurrent != connectOldState)  {    if (connectCurrent){      log_event_data(LOG_ALARM_UPS, "Норма");      SNMP_SendUserTrap(CONNECT_MONITOR_NORM);      flUpdateLog = true;    }    else{      log_event_data(LOG_ALARM_UPS, "Авария");      SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);    }  }    connectOldState = connectCurrent;#endif}/**  * @brief  Мониторинг параметра upsParams.connect  */void UPS_BatteryConnectMonitor(void){#ifdef BAT_CONNECT_MONITOR  static bool isValueRecv = false;  static bool flag_alarm_time = false;  static uint8_t AKBconnectOldState = 0;  uint8_t AKBconnectCurrent;#if defined HARDWARE_BT6707  uint8_t i = 0;  static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)	  CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;#endif  if(((UPS.Status >> 7) & 0x01) == 0)	  AKBconnectCurrent = (UPS.Status >> 6) & 0x01;  else{	  AKBconnectCurrent = 0;  }  UPS.Alarm = (UPS.Alarm & 0xfffffff7) | (AKBconnectCurrent << 3);  if (!isValueRecv) {    isValueRecv = true;    AKBconnectOldState = AKBconnectCurrent;    if (AKBconnectCurrent){      log_event_data(LOG_ALARM_AKB, "Авария");	  SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);	  flUpdateLog = true;#if defined HARDWARE_BT6707      relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);#endif    }    else{    	log_event_data(LOG_ALARM_AKB, "Норма");		  SNMP_SendUserTrap(BATTERY_CONNECT_NORM);		  flUpdateLog = true;#if	defined HARDWARE_BT6707		  relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);#endif    }    return;  }  // Значение параметра изменилось  if (AKBconnectCurrent != AKBconnectOldState)  {	if(flag_alarm_time){		flag_alarm_time = false;		if (!AKBconnectCurrent){		  log_event_data(LOG_ALARM_AKB, "Норма");		  SNMP_SendUserTrap(BATTERY_CONNECT_NORM);		  flUpdateLog = true;#if defined HARDWARE_BT6707		  relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);#endif		}		else{		  log_event_data(LOG_ALARM_AKB, "Авария");		  SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);		  flUpdateLog = true;#if defined HARDWARE_BT6707		  relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);#endif		}	}	else{		flag_alarm_time = true;	}  }#if defined HARDWARE_BT6707  else{	  flag_alarm_time = false;	  if (AKBconnectCurrent)		  relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, OFF_AKB);  }  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){	  OldROtype_Sourse[i] = CurrROtype_Sourse[i];  }#endif  if(!flag_alarm_time){	  if (AKBconnectCurrent){      flCriticalAlarm = true;      flLedAlarm = true;	  }	  AKBconnectOldState = AKBconnectCurrent;  }  else{	  if (AKBconnectOldState){      flCriticalAlarm = true;      flLedAlarm = true;	  }  }#endif}#ifdef AKB_CHANGE_MONITOR/**  * @brief  Мониторинг параметра замены АКБ  */void AKB_Change_Monitor(void){  uint32_t data_change = sSettings.UPS_Setting.set_data + (31536000*sSettings.UPS_Setting.life_time);  TM_RTC_t tmp_data;  static bool isValueRecv = false;  static uint8_t status_change_akb = 0;  uint8_t curr_status_change_akb = 0;    TM_RTC_GetDateTime(&tmp_data, TM_RTC_Format_BIN);    if (tmp_data.unix >= data_change) {    UPS.Alarm |= (1 << 6);    curr_status_change_akb = 1;    flCriticalAlarm = true;    flLedAlarm = true;  }  else {    UPS.Alarm &= 0xffffffbf;    curr_status_change_akb = 0;  }  if (!isValueRecv) {    isValueRecv = true;    status_change_akb = curr_status_change_akb;    if (curr_status_change_akb){    	log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");    	SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);    	flUpdateLog = true;    }    else{    	log_event_data(LOG_ALARM_CHANGE_AKB, "Норма");      SNMP_SendUserTrap(BATTERY_CHANGE_MORM);      flUpdateLog = true;    }    return;  }  // Значение параметра изменилось  if (status_change_akb != curr_status_change_akb)  {    if (curr_status_change_akb){      log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");    	SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);      flUpdateLog = true;    } else {      log_event_data(LOG_ALARM_CHANGE_AKB, "Норма");      SNMP_SendUserTrap(BATTERY_CHANGE_MORM);      flUpdateLog = true;    }  }  status_change_akb = curr_status_change_akb;}#endif/********************************* (C) РОТЕК **********************************/
 |