#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();
|
}
|