314 lines
7.3 KiB
C
314 lines
7.3 KiB
C
|
#include "Driver.h"
|
|||
|
uint8_t device_status[13] = {0}; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬Ϊ0
|
|||
|
static uint8_t led1_status = 0; // LED1 ״̬<D7B4><CCAC>־λ<D6BE><CEBB>0 <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>1 <20><>ʾ<EFBFBD><CABE>
|
|||
|
uint8_t biaozhi=0;
|
|||
|
|
|||
|
//ˮ<>õ<EFBFBD>ˮ<EFBFBD><CBAE>
|
|||
|
uint32_t pump_flow = 0; // 5<><35><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
uint8_t pump_running = 0; // ˮ<><CBAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|||
|
uint32_t last_upload_time = 0; // <20>ϴ<EFBFBD><CFB4>ϴ<EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
uint32_t flow_to_upload = 0; // <20><>Ҫ<EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
uint8_t flow_need_upload = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>־λ
|
|||
|
|
|||
|
//״̬<D7B4>ϴ<EFBFBD>
|
|||
|
Device_Fault_t device_fault = {0}; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|||
|
void LED1_Control(uint8_t state)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD> LED ״̬
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
|
|||
|
|
|||
|
// <20><><EFBFBD>±<EFBFBD>־λ
|
|||
|
led1_status = state; // <20><><EFBFBD>±<EFBFBD>־λΪ<CEBB><CEAA>ǰ״̬
|
|||
|
|
|||
|
// <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>ǰ״̬
|
|||
|
// printf("LED1: %s\n", state ? "ON" : "OFF");
|
|||
|
}
|
|||
|
//ˮ<><CBAE><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD>
|
|||
|
// <20><>֪ˮ<D6AA><CBAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿСʱ1200<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>
|
|||
|
// ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 1200<30><30>/60<36><30><EFBFBD><EFBFBD> = 20<32><30>/<2F><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
// ˮ<>ÿ<EFBFBD><C3BF>ƺ<EFBFBD><C6BA><EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//static uint32_t total_flow = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
void Control_WaterPump(uint8_t state)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if(state) // ˮ<><CBAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_SET);
|
|||
|
|
|||
|
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
// printf("ˮ<><CBAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - GPIOG_PIN1<4E><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ\r\n");
|
|||
|
}
|
|||
|
else // ˮ<><CBAE>ֹͣ
|
|||
|
{
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_RESET);
|
|||
|
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
// printf("ˮ<><CBAE>ֹͣ - GPIOG_PIN1<4E><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ\r\n");
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
|
|||
|
void Control_Fan1(uint8_t state)
|
|||
|
{
|
|||
|
if(state)
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_2, GPIO_PIN_SET);
|
|||
|
else
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_2, GPIO_PIN_RESET);
|
|||
|
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
|
|||
|
void Control_Fan2(uint8_t state)
|
|||
|
{
|
|||
|
if(state)
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_3, GPIO_PIN_SET);
|
|||
|
else
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_3, GPIO_PIN_RESET);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void Ozone_Control(uint8_t state)
|
|||
|
{
|
|||
|
if(state)
|
|||
|
{
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_SET); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// printf("<22><><EFBFBD><EFBFBD><EFBFBD>ѿ<EFBFBD><D1BF><EFBFBD>\n");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_RESET); // <20>رճ<D8B1><D5B3><EFBFBD>
|
|||
|
// printf("<22><><EFBFBD><EFBFBD><EFBFBD>ѹر<D1B9>\n");
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void Control_Heater(uint8_t state)
|
|||
|
{
|
|||
|
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
|
|||
|
// printf("<22><><EFBFBD><EFBFBD>Ĥ: %s\n", state ? "<22><><EFBFBD><EFBFBD>" : "<22>ر<EFBFBD>");
|
|||
|
}
|
|||
|
// <20><> Driver.c <20><><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><D7BF>ƺ<EFBFBD><C6BA><EFBFBD>
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ƣ<EFBFBD>PE2<45><32>
|
|||
|
void Control_Plate1(uint8_t state)
|
|||
|
{
|
|||
|
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
|
|||
|
device_status[9] = state; // <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>1״̬
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ƣ<EFBFBD>PE3<45><33>
|
|||
|
void Control_Plate2(uint8_t state)
|
|||
|
{
|
|||
|
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
|
|||
|
device_status[10] = state; // <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>2״̬
|
|||
|
}
|
|||
|
void Control_Phosphorus(uint8_t state)
|
|||
|
{
|
|||
|
if(state)
|
|||
|
{
|
|||
|
// ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Control_Plate1(1);
|
|||
|
Control_Plate2(1);
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// ͬʱ<CDAC>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Control_Plate1(0);
|
|||
|
Control_Plate2(0);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>
|
|||
|
uint8_t Read_Phosphorus_Status(void)
|
|||
|
{
|
|||
|
return (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_2) || HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3));
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>ӻ<EFBFBD>ȡ״̬<D7B4>ĺ<EFBFBD><C4BA><EFBFBD>
|
|||
|
uint8_t Read_LED1_Status(void)
|
|||
|
{
|
|||
|
return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_13);
|
|||
|
}
|
|||
|
|
|||
|
uint8_t Read_WaterPump_Status(void)
|
|||
|
{
|
|||
|
return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_1);
|
|||
|
}
|
|||
|
|
|||
|
uint8_t Read_Fan1_Status(void)
|
|||
|
{
|
|||
|
return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_2);
|
|||
|
}
|
|||
|
|
|||
|
uint8_t Read_Fan2_Status(void)
|
|||
|
{
|
|||
|
return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_3);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// Read_FloatBall<6C><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>
|
|||
|
uint8_t Read_FloatBall(void)
|
|||
|
{
|
|||
|
return (uint8_t)HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5);
|
|||
|
}
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬
|
|||
|
uint8_t Ozone_GetState(void)
|
|||
|
{
|
|||
|
return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_6);
|
|||
|
}
|
|||
|
|
|||
|
uint8_t Read_Heater_Status(void)
|
|||
|
{
|
|||
|
return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_9);
|
|||
|
}
|
|||
|
uint8_t Read_MainPower(void)
|
|||
|
{
|
|||
|
return HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_2); // <20><><EFBFBD><EFBFBD> 0 <20><> 1
|
|||
|
}
|
|||
|
//
|
|||
|
uint8_t Read_Dredge_Status(void)
|
|||
|
{
|
|||
|
return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_4);
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
// <20>ܿ<EFBFBD><DCBF>ؿ<EFBFBD><D8BF>ƺ<EFBFBD><C6BA><EFBFBD>
|
|||
|
void Control_All_Devices(CmdState_t cmd)
|
|||
|
{
|
|||
|
if (cmd == CMD_ON) // <20><><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرձ<D8B1>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
|||
|
force_pump_off = 0;
|
|||
|
force_fan_off = 0;
|
|||
|
|
|||
|
// <20><>ǿ<EFBFBD><C7BF><EFBFBD>л<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰģʽ
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>л<EFBFBD>ģʽ<C4A3><CABD>Ӧ<EFBFBD><D3A6>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
}
|
|||
|
else if (cmd == CMD_OFF) // <20>ػ<EFBFBD>
|
|||
|
{
|
|||
|
// <20><><EFBFBD>浱ǰģʽ
|
|||
|
WorkMode current_mode_backup = current_mode;
|
|||
|
|
|||
|
// <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Control_WaterPump(0);
|
|||
|
Control_Fan1(0);
|
|||
|
Control_Fan2(0);
|
|||
|
Control_Heater(0);
|
|||
|
Ozone_Control(0);
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرձ<D8B1>־
|
|||
|
force_pump_off = 1;
|
|||
|
force_fan_off = 1;
|
|||
|
|
|||
|
// <20><><EFBFBD>ֵ<EFBFBD>ǰģʽ<C4A3><CABD><EFBFBD><EFBFBD>
|
|||
|
current_mode = current_mode_backup;
|
|||
|
}
|
|||
|
}
|
|||
|
void Update_All_Status(void)
|
|||
|
{
|
|||
|
device_status[0] = led1_status; // LED1״̬
|
|||
|
device_status[1] = Read_WaterPump_Status(); // ˮ<><CBAE>״̬
|
|||
|
device_status[2] = Read_Fan1_Status(); // <20><><EFBFBD><EFBFBD>1״̬
|
|||
|
device_status[3] = Read_Fan2_Status(); // <20><><EFBFBD><EFBFBD>2״̬
|
|||
|
device_status[4] = Ozone_GetState(); // <20><><EFBFBD><EFBFBD>״̬
|
|||
|
device_status[5] = Read_FloatBall(); // <20><><EFBFBD><EFBFBD>״̬
|
|||
|
device_status[7] = Read_Heater_Status(); // <20><><EFBFBD><EFBFBD>״̬
|
|||
|
device_status[8] = Read_MainPower(); // <20>е<EFBFBD>״̬
|
|||
|
device_status[9] = Read_Phosphorus_Status(); //<2F><><EFBFBD><EFBFBD>״̬
|
|||
|
device_status[10] =Read_Dredge_Status(); //<2F><><EFBFBD><EFBFBD>״̬
|
|||
|
// device_status[11] = flow_to_upload;
|
|||
|
}
|
|||
|
|
|||
|
// ˮ<>ù<EFBFBD><C3B9>ϼ<EFBFBD><CFBC>⺯<EFBFBD><E2BAAF>
|
|||
|
// <20><>ȷ<EFBFBD>ļ<EFBFBD><C4BC>⺯<EFBFBD><E2BAAF>
|
|||
|
void Check_Pump_Fault(void)
|
|||
|
{
|
|||
|
static uint32_t check_timer = 0;
|
|||
|
uint8_t actual_status = Read_WaterPump_Status(); // <20><>ȡʵ<C8A1><CAB5>״̬
|
|||
|
|
|||
|
// <20>ȽϿ<C8BD><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>״̬
|
|||
|
if(1 != actual_status) // <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬(1)<29><>һ<EFBFBD><D2BB>
|
|||
|
{
|
|||
|
check_timer++;
|
|||
|
if(check_timer >= 10) // 10<31><30><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
device_fault.pump_fault = 1; // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// printf("ˮ<>ù<EFBFBD><C3B9>ϣ<EFBFBD>\r\n");
|
|||
|
}
|
|||
|
}
|
|||
|
else // ״̬һ<CCAC>£<EFBFBD><C2A3><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
check_timer = 0; // <20><><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
device_fault.pump_fault = 0; // 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// printf("ˮ<><CBAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>
|
|||
|
void Check_Fan1_Fault(void)
|
|||
|
{
|
|||
|
static uint32_t check_timer = 0;
|
|||
|
static uint8_t last_status = 0;
|
|||
|
|
|||
|
uint8_t current_status = Read_Fan1_Status(); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>1<EFBFBD><31>ǰ״̬
|
|||
|
|
|||
|
if(current_status != last_status)
|
|||
|
{
|
|||
|
check_timer++;
|
|||
|
if(check_timer >= 10) // 10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣<EFBFBD><ECB3A3><EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
device_fault.fan1_fault = 1;
|
|||
|
// printf("<22><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ϣ<EFBFBD>\r\n");
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
check_timer = 0;
|
|||
|
device_fault.fan1_fault = 0;
|
|||
|
}
|
|||
|
|
|||
|
last_status = current_status;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>
|
|||
|
void Check_Fan2_Fault(void)
|
|||
|
{
|
|||
|
static uint32_t check_timer = 0;
|
|||
|
static uint8_t last_status = 0;
|
|||
|
|
|||
|
uint8_t current_status = Read_Fan2_Status(); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>2<EFBFBD><32>ǰ״̬
|
|||
|
|
|||
|
if(current_status != last_status)
|
|||
|
{
|
|||
|
check_timer++;
|
|||
|
if(check_timer >= 10) // 10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣<EFBFBD><ECB3A3><EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
device_fault.fan2_fault = 1;
|
|||
|
// printf("<22><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ϣ<EFBFBD>\r\n");
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
check_timer = 0;
|
|||
|
device_fault.fan2_fault = 0;
|
|||
|
}
|
|||
|
|
|||
|
last_status = current_status;
|
|||
|
}
|
|||
|
|
|||
|
|