|  | @@ -78,6 +78,7 @@ const char *MegaTecCMD[] = {
 | 
	
		
			
				|  |  |      "QS\r",
 | 
	
		
			
				|  |  |      "M\r",
 | 
	
		
			
				|  |  |      "PDA\r",
 | 
	
		
			
				|  |  | +    "QMOD\r",
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  extern bool flUpdateLog;
 | 
	
	
		
			
				|  | @@ -95,6 +96,7 @@ void init_UPS_value(void)
 | 
	
		
			
				|  |  |      UPS.work_time = 0;
 | 
	
		
			
				|  |  |      UPS.akb_work_time = 0;
 | 
	
		
			
				|  |  |      UPS.Status = 0;
 | 
	
		
			
				|  |  | +    UPS.Mode = 0;
 | 
	
		
			
				|  |  |      UPS.Alarm = 0;
 | 
	
		
			
				|  |  |      UPS.cnt_err_ups = 0;
 | 
	
		
			
				|  |  |      UPS.Flag_Present = false;
 | 
	
	
		
			
				|  | @@ -704,6 +706,25 @@ void ups_buzzer_cntrl_response(char *data)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void ups_mode_response(char *data)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    char value[20];
 | 
	
		
			
				|  |  | +    uint8_t len = 0;
 | 
	
		
			
				|  |  | +    DBG printf("ups_serialresponse: %s\r\n", data);
 | 
	
		
			
				|  |  | +    if (data[0] != '(') {
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    DBG printf("ups_serial_parser_start\r\n");
 | 
	
		
			
				|  |  | +    UPS.Present = true;
 | 
	
		
			
				|  |  | +    UPS.Flag_Present = true;
 | 
	
		
			
				|  |  | +    UPS.cnt_err_ups = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    data++;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    DBG printf("UPS ups_mode_parser_start: %s\r\n", data);
 | 
	
		
			
				|  |  | +    UPS.Mode = data[0]; 
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      switch (command) {
 | 
	
	
		
			
				|  | @@ -743,6 +764,9 @@ void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
 | 
	
		
			
				|  |  |          case ups_buzzer_cntrl:
 | 
	
		
			
				|  |  |              ups_buzzer_cntrl_response(ups_pdu.data);
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  | +        case ups_mode_req:
 | 
	
		
			
				|  |  | +            ups_mode_response(ups_pdu.data);
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  |          default:
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -750,10 +774,12 @@ void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  int ups_metac_service_pdu(cmdMegaTecEnums_t command)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    uint8_t UPS_Status_prev;
 | 
	
		
			
				|  |  |      if (UPS.Present) {
 | 
	
		
			
				|  |  |          while (!megatec_send) {
 | 
	
		
			
				|  |  |              vTaskDelay(50);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        UPS_Status_prev = UPS.Status;
 | 
	
		
			
				|  |  |          memset(ups_pdu.data, 0, UPS_PDU_MAX_LEN);
 | 
	
		
			
				|  |  |          megatec_send = false;
 | 
	
		
			
				|  |  |          if (sSettings.UPS_Setting.type_ups == ups_offline && command == ups_shutdown) {
 | 
	
	
		
			
				|  | @@ -771,17 +797,71 @@ int ups_metac_service_pdu(cmdMegaTecEnums_t command)
 | 
	
		
			
				|  |  |                  return 0;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        memset(ups_pdu.data, 0, UPS_PDU_MAX_LEN);
 | 
	
		
			
				|  |  | +        megatec_send = false;
 | 
	
		
			
				|  |  | +        UPS.Flag_Present = false;
 | 
	
		
			
				|  |  | +        send_MegaTec_cmd(ups_status_req);
 | 
	
		
			
				|  |  | +        if (ups_megatec_rx_pdu()) {
 | 
	
		
			
				|  |  | +            ups_megatec_process_pdu(ups_status_req);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        megatec_send = true;
 | 
	
		
			
				|  |  | +        if (command == ups_shutdown) {
 | 
	
		
			
				|  |  | +            if ((((UPS.Status >> 1) & 0x01) != ((UPS_Status_prev >> 1) & 0x01))
 | 
	
		
			
				|  |  | +             && ((UPS.Status >> 1) & 0x01)) {
 | 
	
		
			
				|  |  | +                return 1;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else if (command == ups_cancel_shut_down) {
 | 
	
		
			
				|  |  | +            if ((((UPS.Status >> 1) & 0x01) != ((UPS_Status_prev >> 1) & 0x01))
 | 
	
		
			
				|  |  | +             && !((UPS.Status >> 1) & 0x01)) {
 | 
	
		
			
				|  |  | +                return 1;
 | 
	
		
			
				|  |  | +            }           
 | 
	
		
			
				|  |  | +        }  else if (command == ups_cancel_test) {
 | 
	
		
			
				|  |  | +            if ((((UPS.Status >> 2) & 0x01) != ((UPS_Status_prev >> 2) & 0x01))
 | 
	
		
			
				|  |  | +             && !((UPS.Status >> 2) & 0x01)) {
 | 
	
		
			
				|  |  | +                return 1;
 | 
	
		
			
				|  |  | +            }           
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            if  ((((UPS.Status >> 2) & 0x01) != ((UPS_Status_prev >> 2) & 0x01))
 | 
	
		
			
				|  |  | +             && ((UPS.Status >> 2) & 0x01)) {
 | 
	
		
			
				|  |  | +                return 1;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          megatec_send = true;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      return -1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void kstar_mode(void)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    if((UPS.Status >> 4) & 0x01) {
 | 
	
		
			
				|  |  | +        UPS.Mode = 'F';
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    } 
 | 
	
		
			
				|  |  | +    if(!((UPS.Status >> 4) & 0x01) && UPS.VAC_out == 0) {
 | 
	
		
			
				|  |  | +        UPS.Mode = 'D';
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if(((UPS.Status >> 5) & 0x01) && UPS.VAC_out > 120 && UPS.VAC_in != 0) {
 | 
	
		
			
				|  |  | +        UPS.Mode = 'Y';
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if(((UPS.Status >> 7) & 0x01) && UPS.VAC_out > 190) {
 | 
	
		
			
				|  |  | +        UPS.Mode = 'B';
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +     if(!((UPS.Status >> 7) & 0x01) && UPS.VAC_out > 190) {
 | 
	
		
			
				|  |  | +        UPS.Mode = 'L';
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // TODO ����������� ���������
 | 
	
		
			
				|  |  |  //void request_task(void)
 | 
	
		
			
				|  |  |  void request_task(void *params)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      uint8_t kestar_req[3] = { ups_status_req, ups_remain_time_reg, ups_info};
 | 
	
		
			
				|  |  | -    uint8_t voltronic_req[6] = {ups_status_req, ups_akb_info, ups_model_req, ups_version_req, ups_version2_req, ups_serial_req};//
 | 
	
		
			
				|  |  | +    uint8_t voltronic_req[6] = {ups_status_req, ups_akb_info, ups_model_req, ups_version_req, ups_version2_req, ups_serial_req, ups_mode_req};//
 | 
	
		
			
				|  |  |      uint8_t num_req = 0;
 | 
	
		
			
				|  |  |      uint8_t *req;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -800,6 +880,7 @@ void request_task(void *params)
 | 
	
		
			
				|  |  |                      UPS.SOC = 0;
 | 
	
		
			
				|  |  |                      UPS.work_time = 0;
 | 
	
		
			
				|  |  |                      UPS.Status = 0;
 | 
	
		
			
				|  |  | +                    UPS.Mode = 0;
 | 
	
		
			
				|  |  |                      UPS.Alarm = 0;
 | 
	
		
			
				|  |  |                      UPS.Present = false;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -864,6 +945,10 @@ void request_task(void *params)
 | 
	
		
			
				|  |  |                  megatec_send = true;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        if(sSettings.UPS_Setting.type_ups == ups_kestar 
 | 
	
		
			
				|  |  | +            || sSettings.UPS_Setting.type_ups == ups_offline) {
 | 
	
		
			
				|  |  | +                kstar_mode();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |