forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-04-26 07f9ac2234bbc367d7203f094233867f360671f5
Function/VALVE/valve_control.c
@@ -1,291 +1,105 @@
#include "valve_control.h"
#include "gpio.h"
#include "uart.h"
#include "lcd.h"
#include "gprs.h"
#include "low_pwr_test.h"
#include "tim.h"
#include "system_log.h"
#include "check_out.h"
#include "master_slave_inter.h"
#include "system_mem_para.h"
VALVE_WORK_TYPE op_cl_valve_log_flag_g = VWT_NONE; // ¿ª/¹Ø·§ÈÕÖ¾±ê־루ÓÃÓÚÅжÏÊÇ·ñÐèÒªÈÕÖ¾´æ´¢²¢´¢´æ£©
SYS_ALARM_VALVE_T op_cl_valve_cause_id = AV_NORMAL; // ¿ª¹Ø·§Ô­ÒòID£¨ÓÃÓÚÏÔʾ/¹Ø·§Ô­ÒòID´æ´¢£©
FlagStatus valve_signal_complete_g = RESET; // ¿ª¹Ø·§µ½Î»ÐźÅ
/*¹Ø·§×ÖĬÈÏÖµ*/
TYPE_CHECK_SIZE(VALVE_CTL_BYTES_T,22);//ºË²é½á¹¹Ìå´óС
VALVE_CTL_BYTES_T __attribute__ ((aligned (2))) valve_ctl_bytes_g = {
    {1, 1, 1, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0},
    {0, 0, 1, 0, 1, 0},
    {1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
    {0},
    {0},
    {0},
    {0},
    {0, 0, 0, 0, 1, 1, 1, 1},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
    {0},
};
static const VALVE_CLOSE_FUNC_TABLE_DRV_T  valve_close_tab_func[] = {
    {V_GPRS_CMD_CL, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_1},
    {AV_FLOW_DIRECTION, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_1},
    /*{Íâµç±ä»¯¹Ø·§, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_1},*/
      {AV_UNCAP_1, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_1},
    {AV_VALVE_ERR, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_1, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_2, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_3, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_4, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_BALANCE_5, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_2},
    {AV_SET_CUMULATE, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_3},
    {AV_NO_USE_GAS, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_3},
    {AV_NO_GPRS, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_3},
    /* {ÐÅÓüƷÑ, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_3},*/
    {AV_LITH_LOW, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_LITH_UNDER, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_LITH_REMOVE, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_ALKA_LOW, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_ALKA_UNDER, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_ALKA_REMOVE, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    {AV_GPRS_FAIL, 12, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_4},
    /* {ȫΪSV101µÄ²ÎÊý, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_5},*/
    {AV_TEMP_UP, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_TEMP_UP_UP, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_TEMP_DOWN, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_TEMP_DOWN_DOWN, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_PRESS_UP, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_PRESS_UP_UP, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_PRESS_DOWN, 12, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_PRESS_DOWN_DOWN, 14, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_6},
    {AV_TEMP_ERR, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
    {AV_PRESS_ERR, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
    {AV_CPU_TEMP_UP, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
    {AV_CPU_TEMP_DOWN, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
      {AV_CPU_TEMP_DRASTIC_CHANGE, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_7},
    {AV_FLOW_VEL_ERR, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_TOF_DIFF_ERR, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_SOUND_VEL_ERR, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_SNR_ERR, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_SIG_UP, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_SIG_TH_ERR, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_GAIN_ERR, 12, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_UT_LOSE, 14, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_8},
    {AV_INPUT_WATER_ERR, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_9},
      {AV_MEDIA_ERR, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_9},
    {AV_DISMANTLE, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_9},
    {AV_MEASURE_ERR, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_9},
    {AV_LEAKAGE, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_LCD_UP, 2, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_LCD_TEMP_LOW, 4, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_FLOW_UP_1, 6, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_FLOW_UP_2, 8, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_FLOW_UP_3, 10, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_CONSTANT_TINY_FLOW, 12, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_CONSTANT_FLOW, 14, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_10},
    {AV_CL_HAVE_FLOW, 0, (uint16_t *)&valve_ctl_bytes_g.valve_ctr_11},
};
void Valve_IO_Init(void)
void Motor_AB_GPIO_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   InputtIO( VALVE_FORCED_OPEN_PORT, VALVE_FORCED_OPEN_PIN, IN_NORMAL);
   OutputIO( VALVE_CMD_A_PORT, VALVE_CMD_A_PIN, OUT_PUSHPULL);
   OutputIO( VALVE_CMD_B_PORT, VALVE_CMD_B_PIN, OUT_PUSHPULL);
   OutputIO( VALVE_CMD_C_PORT, VALVE_CMD_C_PIN, OUT_PUSHPULL);
   OutputIO(Motor_A_PORT,Motor_A_PIN,OUT_PUSHPULL);
   OutputIO(Motor_B_PORT,Motor_B_PIN,OUT_PUSHPULL);
}
void Motor_OP_CL_GPIO_Init(void)
{
   InputtIO(Motor_OP_PORT,Motor_OP_PIN,IN_NORMAL);
   InputtIO(Motor_CL_PORT,Motor_CL_PIN,IN_NORMAL);
}
void Motor_OP_CL_GPIO_Init_sleep_mode(void)
{
   CloseIO(Motor_OP_PORT,Motor_OP_PIN);
   CloseIO(Motor_CL_PORT,Motor_CL_PIN);
}
void ValveMotorOpenRun(void)
{
   Motor_AB_GPIO_Init();
   Motor_A_HIGH;
   Motor_B_HIGH;
}
void ValveMotorCloseRun(void)
{
   Motor_AB_GPIO_Init();
   Motor_A_LOW;
   Motor_B_LOW;
}
void ValveMotorStop(void)
{
   Motor_AB_GPIO_Init();
   Motor_A_LOW;
   Motor_B_HIGH;
}
VALVE_STATUS   Read_OP_CL_VALVE_Status(u16 delay_time_ms)
{
   uint8_t Open_status,Close_status;
   Motor_OP_CL_GPIO_Init();
   if((delay_time_ms > 0)&&(delay_time_ms <101 ))  //´Ë´¦´ý¶¨£¬Ä¿Ç°²»ÐèÒªÑÓ³Ù£¬ÑÓ³Ùʱ¼ä¸ø0¾ÍÐÐ
   {
      delay_ms(delay_time_ms);
   }
   Open_status = Motor_OP_IO_READ;
   Close_status = Motor_CL_IO_READ;
   if((Open_status==(uint8_t)Bit_RESET)&&(Close_status==(uint8_t)Bit_SET))
   {
      return VALVE_OP;
   }else if((Open_status==(uint8_t)Bit_SET)&&(Close_status==(uint8_t)Bit_RESET))
   {
      return VALVE_CL;
   }else if((Open_status==(uint8_t)Bit_SET)&&(Close_status==(uint8_t)Bit_SET))
   {
      return VALVE_ERROR;
   }else
   {
      return VALVE_ERROR;
   }
   
   VALVE_SLEEP;
   VALVE_PWR_OFF;
}
#define VALVE_SWITCHING_G6_G10   1750U
#define VALVE_SWITCHING_G16_G25   2300U
void Valve_OpenCloseTimeInit(void)
{
   if(check_cal_g.device_type == G6 || check_cal_g.device_type == G10)
      BsTimer_Init(12000,VALVE_SWITCHING_G6_G10); // 1Khz = 1ms
   else
      BsTimer_Init(12000,VALVE_SWITCHING_G16_G25); // 1Khz = 1ms
   BSTIM_EGR_UG_Setable(ENABLE); //ʹÄÜUG¼Ä´æÆ÷ÓÃÓÚ¸üÐÂARRºÍPSC
   BSTIM_ISR_UIF_Clr();
}
// ¿ª·§
SYS_ALARM_VALVE_T Valve_Open(SYS_ALARM_VALVE_T op_cl_cause_id)
{
  if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CL) // ·§ÃŹØ
  {
      Valve_Awaken_Init();
      ValveCtl_BsTimer_Clk_Init();
    /*¹©µç£¬¿ª·§*/
      SYS_BST_EN;
    VALVE_PWR_ON;
    VALVE_OPEN;
      BSTIM_CR1_CEN_Setable(ENABLE);//Æô¶¯¶¨Ê±Æ÷TIM
    __VALVE_WORK_TYPE_SET(VWT_OPEN);
    __SYS_STATUS_BYTES_STATUS(valve_state, VALVE_OPENING, AV_NORMAL);
#ifdef RS232_PRINTF
    printf("---> ¿ª·§ÖР<---\r\n");
#endif
      op_cl_valve_cause_id = op_cl_cause_id;
  }
   return AV_NORMAL;
}
// ¹Ø·§
SYS_ALARM_VALVE_T Valve_Close(SYS_ALARM_VALVE_T op_cl_cause_id)
void  ValveRunParaInit(void)
{
  if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_OP) // ·§ÃÅ¿ª
  {
      Valve_Awaken_Init();
      ValveCtl_BsTimer_Clk_Init();
    /*¹©µç£¬¹Ø·§*/
      SYS_BST_EN;
    VALVE_PWR_ON;
    VALVE_CLOSE;
      BSTIM_CR1_CEN_Setable(ENABLE);//Æô¶¯¶¨Ê±Æ÷TIM
    if (__SYS_STATUS_BYTES_GET(valve_lock) == SET)
      __VALVE_WORK_TYPE_SET(VWT_FORCED_CLOSE);
    else
      __VALVE_WORK_TYPE_SET(VWT_NORMAL_CLOSE);
    __SYS_STATUS_BYTES_STATUS(valve_state, VALVE_CLOSING, AV_NORMAL);
#ifdef RS232_PRINTF
    printf("---> ¹Ø·§ÖР<---\r\n");
#endif
#if GPRS_PROTOCOL_SELECT
        gprs_protocol_head_tail_g.gprs_protocol_normal_data_head.valve_close_reason = op_cl_valve_cause_id = op_cl_cause_id; // ¸³ÓèÔ¶´«¹Ø·§Ô­ÒòID
#else
        op_cl_valve_cause_id = op_cl_cause_id;     // ¸³ÓèÔ¶´«¹Ø·§Ô­ÒòID
#endif
   VALVE_STATUS   valve_status;
   switch (save_valve_para_g.valve_status)
   {
      
  }
   return AV_NORMAL;
   }
}
/*ÅжϿª¹Ø·§µ½Î»*/
void Valve_StateSet(void)
void   valveCtrlPro(void) //?
{
  if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CLOSING || __SYS_STATUS_BYTES_GET(valve_state) == VALVE_OPENING)
  {
      IWDT_Clr();
    if (valve_signal_complete_g) // Óе½Î»ÐźÅ
    {
      valve_signal_complete_g = RESET;
         if(zero_drift_valve_flag == 0)
            __SYS_ALARM_BYTES_SET(valve_change,SET);
         else
            zero_drift_valve_flag = 0;
      if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CLOSING) // ¸Ä±ä״̬±ê־λ
        __SYS_STATUS_BYTES_STATUS(valve_state, VALVE_CL, AV_NORMAL);
      else if (__SYS_STATUS_BYTES_GET(valve_state) == VALVE_OPENING)
        __SYS_STATUS_BYTES_STATUS(valve_state, VALVE_OP, AV_NORMAL);
#ifdef RS232_PRINTF
      printf("---> ¿ª/¹Ø·§Íê³É <---\r\n");
#endif
    }
#ifdef RS232_PRINTF
    printf("PE2 = %d,PE3 = %d,PE4 = %d\r\n", GPIO_ReadOutputDataBit(VALVE_CMD_A_PORT, VALVE_CMD_A_PIN),
           GPIO_ReadOutputDataBit(VALVE_CMD_B_PORT, VALVE_CMD_B_PIN),
           GPIO_ReadOutputDataBit(VALVE_CMD_C_PORT, VALVE_CMD_C_PIN));
#endif
  }
}
/*¿ª·§µÄÌØÊâÌõ¼þÅжÏ*/
uint8_t Valve_Open_SpecialJudge(__IO SYS_STATUS_T *state_bytes_p)
{
  /*Ïê¼û¡¶·§ºÍÈ¼Æø±íµÄ״̬×Ö¡¢±¨¾¯×ֵȹ²Óù¦ÄܵÄÊáÀí¡·*/
  uint8_t power_temp_press_status = state_bytes_p->lith_under | state_bytes_p->lith_low | state_bytes_p->lith_remove |
                                    state_bytes_p->alka_under | state_bytes_p->alka_low | state_bytes_p->alka_remove |
                                    state_bytes_p->temp_down | state_bytes_p->temp_down_down | state_bytes_p->temp_up | state_bytes_p->temp_up_up |
                                    state_bytes_p->press_down | state_bytes_p->press_down_down | state_bytes_p->press_up | state_bytes_p->press_up_up;
  return !power_temp_press_status;
}
void Valve_Process(SYS_ALARM_VALVE_T * pOp_cl_cause)
{
  if (LargeCurrent_LimitingProcess() & 1)
  {
    /*Èç¹ûÐèÒª¹Ø·§*/
    if (*pOp_cl_cause != V_KEY_OP && *pOp_cl_cause != AV_NORMAL)
      {
         uint8_t valve_ctl_temp = 0;
         // °´¼ü¹Ø·§
         if (*pOp_cl_cause == V_KEY_CL)
         {
#ifdef RS232_PRINTF
            printf("¾¯¸æÐԹط§\r\n");
#endif
            *pOp_cl_cause = Valve_Close(*pOp_cl_cause);
         }
         else
         {
            // ¹Ø·§×ÖÅжϹط§
            for (uint8_t i = 0; i < VALVE_CLOSE_FUNC_TABLE_NUM; i++)
            {
               // ²é±í
               if (valve_close_tab_func[i].valve_close_flag == *pOp_cl_cause && valve_close_tab_func[i].valve_close_byte != NULL)
               {
                  valve_ctl_temp = (*valve_close_tab_func[i].valve_close_byte >> valve_close_tab_func[i].offset_bit) & 0x0003;
                  if (valve_ctl_temp & 0x01) // ÐèÒª¹Ø·§
                  {
                     if (valve_ctl_temp & 0x02) // Ç¿ÖÆÐԹط§
                     {
                        //ÒѾ­Óо¯¸æÐԹط§ºóÓÖ²úÉúÁËÇ¿ÖÆÐԹط§£¬ÐèÒª¸Ä±ä¹Ø·§ID£¬ÓÃÓÚ¸üÖ±¹ÛµÄÏÔʾ
                        if(__SYS_STATUS_BYTES_GET(valve_state) == VALVE_CL && __SYS_STATUS_BYTES_GET(valve_lock) == RESET)
                        {
                           __VALVE_WORK_TYPE_SET(VWT_LOCK);
                           op_cl_valve_cause_id = *pOp_cl_cause;
                        }
                        __SYS_STATUS_BYTES_STATUS(valve_lock, SET, AV_NORMAL); // ÉÏËø
#ifdef RS232_PRINTF
                        printf("Ç¿ÖÆÐԹط§\r\n");
#endif
                     }
                     else // ¾¯¸æÐԹط§
                     {
#ifdef RS232_PRINTF
                        printf("¾¯¸æÐԹط§\r\n");
#endif
                     }
                     *pOp_cl_cause = Valve_Close(*pOp_cl_cause);
                  }
                  else
                     *pOp_cl_cause = AV_NORMAL;
                  break;
               }
            }
         }
      }
      else if (*pOp_cl_cause == V_KEY_OP) // ¿ª·§
      {
         //¼ì¶¨Ä£Ê½ÏÂÇ¿ÖÆÐԹط§£¬×Ô¶¯¿ª·§ºó£¬ÐèÒª°ÑËø±ê־Ҳȥ³ý
         if(__SYS_STATUS_BYTES_GET(valve_lock) == SET && sys_display_para_g.sys_and_display_mode == CALIB_MODE)
            __SYS_STATUS_BYTES_STATUS(valve_lock, RESET, AV_NORMAL);
      // ÅжÏijЩ״̬ÊÇ·ñ»Ö¸´Õý³££¨×´Ì¬×ÖÅжϣ©or ¼ì¶¨Ä£Ê½
//      if (Valve_Open_SpecialJudge(&sys_admin_g.sys_admin.state_bytes) || (sys_display_para_g.sys_and_display_mode == CALIB_MODE))
//      {
         *pOp_cl_cause = Valve_Open(*pOp_cl_cause);
//      }
      }
  }
   Valve_StateSet();
}