#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" 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) { 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); 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) { 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 } return AV_NORMAL; } /*ÅжϿª¹Ø·§µ½Î»*/ void Valve_StateSet(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(); }