#include "gprs.h"
|
#include "sundry.h"
|
#include "main.h"
|
#include "uart.h"
|
#include "stdlib.h"
|
#include "billing.h"
|
#include "administrator.h"
|
#include "lcd.h"
|
#include "system_log.h"
|
#include "low_pwr_test.h"
|
#include "power_manage.h"
|
#include "gpio.h"
|
#include "bootloader_iap.h"
|
|
GPRS_SOFT_PARA_T gprs_soft_para_g = {GPRS_IDLE, GPRS_MEANS_NONE};
|
/*gprsÍøÂç²ÎÊýĬÈÏÖµ*/
|
TYPE_CHECK_SIZE(GPRS_NETWORK_CFG_PARA_T, 213); // ºË²é½á¹¹Ìå´óС
|
GPRS_NETWORK_CFG_PARA_T gprs_network_cfg_para_g = {
|
.gprs_ip_1[0] = 120,
|
.gprs_ip_1[1] = 77,
|
.gprs_ip_1[2] = 85,
|
.gprs_ip_1[3] = 236,
|
.gprs_port_1 = 9692,
|
.gprs_link_type_1 = GLT_TCP,
|
.gprs_ip_2[0] = 39,
|
.gprs_ip_2[1] = 108,
|
.gprs_ip_2[2] = 81,
|
.gprs_ip_2[3] = 105,
|
.gprs_port_2 = 9898,
|
.gprs_link_type_2 = GLT_TCP,
|
.save_data_period_min_time = 60,
|
.gprs_interval_type = GIM_PERIOD,
|
.gprs_send_period_min_time = 1440,
|
.gprs_reference_time_bcd[0] = 0,
|
.gprs_reference_time_bcd[1] = 0x10,
|
.gprs_timed_number = 1,
|
.gprs_timing_time_bcd[0][0] = 0,
|
.gprs_timing_time_bcd[0][1] = 0x10,
|
.gprs_restart_send_interval_min_time = GPRS_RECONNECTION_INTERVAL_TIME,
|
.gprs_restart_number = 0,
|
.gprs_timeout = GPRS_TIMEOUT,
|
.aes128_secret_key[0] = {8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0},
|
};
|
|
static const GPRS_FUNC_TABLE_DRV_T gprs_tab_func[] = {
|
{GPRS_IDLE, Gprs_IDLE_Process},
|
{GPRS_OPEN_PWR, Gprs_Open_PWR_Process},
|
{GPRS_OPEN_MODULE, Gprs_Open_Module_Process},
|
{GPRS_LOGIN, Gprs_LoginProcess},
|
{GPRS_SEND_DATA, Gprs_SendDataProcess},
|
{GPRS_RECV_DATA, Gprs_RecvDataProcess},
|
{GPRS_SEND_ALARM, Gprs_SendAlarmProcess},
|
{GPRS_CLOSE_PWR, Gprs_Close_PWR_Process},
|
{GPRS_CLOSE_MODULE, Gprs_Close_Module_Process},
|
{GPRS_RESTART, Gprs_RestartProcess},
|
};
|
|
void Gprs_IO_Init(void)
|
{
|
CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
|
OutputIO(GPRS_PWR_PORT, GPRS_PWR_PIN, OUT_PUSHPULL);
|
OutputIO(GPRS_SWITCH_PORT, GPRS_SWITCH_PIN, OUT_PUSHPULL);
|
GPRS_SWITCH_H;
|
GPRS_PWR_OFF;
|
}
|
|
GPRS_STATUS Gprs_IDLE_Process(void)
|
{
|
return GPRS_IDLE;
|
}
|
|
/**/
|
GPRS_STATUS Gprs_Open_PWR_Process(void)
|
{
|
Gprs_GPIO_Uart5_Clk_Init();
|
/*ÏÈ¿ªµçÔ´£¬ÔÙ¿ªÄ£×é*/
|
if (GPIO_ReadOutputDataBit(GPRS_PWR_PORT, GPRS_PWR_PIN) == Bit_RESET) // µçÔ´¹Ø±Õ
|
{
|
// gprs_test_g.gprs_start_cnt++;
|
GPRS_PWR_ON; // µçÔ´¿ªÆô
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 1);
|
__SYS_DELAY_SEC_TIME_SET_(gprs_timeout_para, gprs_network_cfg_para_g.gprs_timeout);
|
return GPRS_OPEN_MODULE;
|
}
|
return GPRS_CLOSE_PWR;
|
}
|
|
GPRS_STATUS Gprs_Open_Module_Process(void)
|
{
|
/* ____________
|
*PWR ___/
|
* __ ____
|
*SWITCH ___/ |____|
|
* | |
|
* | |
|
* T1 T2 ¿ª¹Øµçƽ³ÖÐøÊ±¼ä T1:30ms T2:0.5~1S
|
*/
|
if (GPIO_ReadOutputDataBit(GPRS_SWITCH_PORT, GPRS_SWITCH_PIN) == Bit_RESET) // Ä£¿éÒý½ÅÀµÍ
|
{
|
if (sys_delay_sec_para_g.gprs_delay_para.delay_flag)
|
{
|
sys_delay_sec_para_g.gprs_delay_para.delay_flag = RESET;
|
GPRS_SWITCH_L;
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 1);
|
}
|
}
|
else if (GPIO_ReadOutputDataBit(GPRS_SWITCH_PORT, GPRS_SWITCH_PIN) == Bit_SET) // Ä£¿éÒý½ÅÀ¸ß
|
{
|
if (sys_delay_sec_para_g.gprs_delay_para.delay_flag)
|
{
|
sys_delay_sec_para_g.gprs_delay_para.delay_flag = RESET;
|
GPRS_SWITCH_H; // Ä£¿é¿ªÆô
|
#if NB_OR_4G_FLAG
|
gprs_module_para_g.gprs_module_state = LOGIN_CMD_CMEE_NB; // ÉèÖõǼµÚÒ»¸öÄ£¿éÃüÁî
|
#else
|
gprs_module_para_g.gprs_module_state = LOGIN_CMD_CMEE; // ÉèÖõǼµÚÒ»¸öÄ£¿éÃüÁî
|
#endif
|
#if GPRS_PROTOCOL_SELECT
|
/*¼ÆËã·¢ËÍÌõÊýºÍ×ÜÖ¡Êý*/
|
gprs_protocol_head_tail_g.gprs_protocol_head.frame_sum = Gprs_Protocol_GetSendDataNum_FrameSum(&gprs_save_send_para_g);
|
#endif
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, GPRS_BOOT_INIT_TIME); // Ä£¿é¿ªÆôºóÐèBootºÍInitʱ¼ä10S
|
return GPRS_LOGIN;
|
}
|
}
|
return GPRS_OPEN_MODULE;
|
}
|
|
GPRS_STATUS Gprs_LoginProcess(void)
|
{
|
/*µ±ÑÓʱʱ¼äµ½»òÎÞÐèÑÓʱʱ½øÈë*/
|
if (sys_delay_sec_para_g.gprs_delay_para.delay_flag || (!sys_delay_sec_para_g.gprs_delay_para.delay_time))
|
{
|
sys_delay_sec_para_g.gprs_delay_para.delay_flag = RESET;
|
#if GPRS_PROTOCOL_SELECT
|
Gprs_Module_SendLogin(gprs_module_para_g.gprs_module_state,
|
gprs_network_cfg_para_g.gprs_ip_1, gprs_network_cfg_para_g.gprs_port_1);
|
#else
|
Gprs_Module_SendLogin(gprs_module_para_g.gprs_module_state,
|
gprs_network_cfg_para_g.gprs_ip_2, gprs_network_cfg_para_g.gprs_port_2);
|
#endif
|
return GPRS_RECV_DATA;
|
}
|
return GPRS_LOGIN;
|
}
|
|
static uint8_t temp_send_buffer[1024] = {0};
|
GPRS_STATUS Gprs_SendDataProcess(void)
|
{
|
uint8_t cr[1] = {0x0D};
|
static uint16_t send_data_length = 0;
|
#if NB_OR_4G_FLAG
|
uint8_t temp_buff[25];
|
GPRS_PROTOCOL_SEND_BUFFER_T *soft_buffer = NULL;
|
/*¹¹ÔìÊý¾Ý·¢Ëͳ¤¶È*/
|
send_data_length = Gprs_Protocol_DataLength(gprs_protocol_para_g.gprs_protocol_type, &gprs_protocol_encrypt_para_g);
|
/*ÐÒéÊý¾ÝÖ¡ÅäÖÃ*/
|
Gprs_Protocol_SendDataConfig(gprs_protocol_para_g.gprs_protocol_type, temp_send_buffer, &gprs_protocol_head_tail_g);
|
/*NBµÄATÖ¸ÁîÔ¤ÏÈ·ÅÈëbuffÖÐ*/
|
sprintf((char *)temp_buff, "%s,%d,", AT_SSEND_NB, send_data_length);
|
uint8_t at_len = strlen((char *)temp_buff);
|
if ((soft_buffer = (GPRS_PROTOCOL_SEND_BUFFER_T *)malloc(sizeof(GPRS_PROTOCOL_SEND_BUFFER_T) + 2 * send_data_length + at_len)) != NULL)
|
{
|
/*ATÖ¸Áî²»ÄܺÍÊý¾Ý·Ö¿ª·¢ËÍ£¬²»È»»áµ¼ÖÂNB·¢ËÍ´íλµÄÇé¿ö£¬ÒªÍ¬Ê±·¢ËÍ*/
|
/*ATÖ¸ÁîbuffºÍÊý¾Ýbuff½øÐÐÕûºÏ*/
|
memcpy(soft_buffer->send_buffer, temp_buff, at_len);
|
Hex_2_Ascii(temp_send_buffer, &soft_buffer->send_buffer[at_len], send_data_length); // NBÐèÒª·¢ËÍASCII
|
/*·¢ËÍÐÒéÊý¾Ý*/
|
HAL_UART_Transmit(&huart3, soft_buffer->send_buffer, at_len + 2 * send_data_length, 1000);
|
HAL_UART_Transmit(&huart3, cr, 1, 10);
|
free(soft_buffer);
|
soft_buffer = NULL;
|
}
|
#else
|
// GPRS_PROTOCOL_SEND_BUFFER_T *soft_buffer = NULL;
|
// if ((soft_buffer = (GPRS_PROTOCOL_SEND_BUFFER_T *)malloc(sizeof(GPRS_PROTOCOL_SEND_BUFFER_T) + send_data_length)) != NULL)
|
// {
|
/*¸æËßÄ£×éÒª·¢ËÍÊý¾Ý²¢ÉèÖ÷¢ËÍÊý¾Ý³¤¶È*/
|
if (gprs_resend_data_flag_g == 0)
|
{
|
/*¹¹ÔìÊý¾Ý·¢Ëͳ¤¶È*/
|
send_data_length = Gprs_Protocol_DataLength(gprs_protocol_para_g.gprs_protocol_type, &gprs_protocol_encrypt_para_g);
|
__GPRS_MODULE_SEND_LENGTH__(send_data_length);
|
}
|
/*·¢ËÍÐÒéÊý¾Ý*/
|
else if (gprs_resend_data_flag_g == 1)
|
{
|
gprs_resend_data_flag_g = 0;
|
/*ÐÒéÊý¾ÝÖ¡ÅäÖÃ*/
|
Gprs_Protocol_SendDataConfig(gprs_protocol_para_g.gprs_protocol_type, temp_send_buffer, &gprs_protocol_head_tail_g);
|
GPRS_SEND_NORMAL(temp_send_buffer, send_data_length);
|
GPRS_SEND_NORMAL(cr, 1);
|
memset(temp_send_buffer, 0, sizeof(temp_send_buffer));
|
}
|
// free(soft_buffer);
|
// soft_buffer = NULL;
|
// }
|
#endif
|
return GPRS_RECV_DATA;
|
}
|
GPRS_STATUS Gprs_RecvDataProcess(void)
|
{
|
uint8_t *rec_ptr = NULL;
|
uint16_t recv_valid_data_length = 0; // ½ÓÊÕµÄÓÐЧÊý¾Ý³¤¶È
|
Gprs_Uart1_Rx_DMA_CH5_Check();
|
/*µÇ¼½ÓÊÕ*/
|
if (gprs_module_para_g.gprs_module_state != SEND_CMD_ZIPSENDRAW)
|
{
|
Gprs_Module_RecvLogin(&gprs_module_para_g, &gprs_protocol_head_tail_g.gprs_protocol_normal_data_head);
|
if (gprs_module_para_g.gprs_module_state == SEND_CMD_ZIPSENDRAW)
|
{
|
gprs_protocol_para_g.gprs_protocol_type = PROTOCOL_NORMAL_SEND_CMD; // ÐÒé·¢ËÍÃüÁî
|
have_gprs_send_flag = SUCCESS_0;
|
return GPRS_SEND_DATA;
|
}
|
return GPRS_LOGIN;
|
}
|
else /*·¢ËͽÓÊÕ*/
|
{
|
/*Ä£×é½ÓÊÕÊý¾Ý´¦Àí*/
|
uint8_t gprs_module_recv_flag = Gprs_Module_RecvDataProcess(&recv_valid_data_length, &rec_ptr, &gprs_module_para_g);
|
if (gprs_module_recv_flag == 1)
|
{
|
#if NB_OR_4G_FLAG
|
Ascii_2_Hex(rec_ptr, rec_ptr, (2 * recv_valid_data_length)); // ¸ñʽת»¯
|
#endif
|
gprs_protocol_para_g.gprs_protocol_type = Gprs_Protocol_RecvDataConfig(rec_ptr, recv_valid_data_length); // ÐÒéÊý¾Ý½âÎö
|
memset(gprs_module_para_g.gprs_recv_buf, 0, sizeof(gprs_module_para_g.gprs_recv_buf));
|
if (gprs_protocol_para_g.gprs_protocol_type == PROTOCOL_END_STATUS || gprs_protocol_para_g.gprs_protocol_type == PROTOCOL_UNKOWN_STATUS)
|
{
|
__SYS_STATUS_BYTES_STATUS(gprs_status, RESET, AV_GPRS_FAIL);
|
__SYS_DELAY_SEC_TIME_SET_(gprs_timeout_para, 0); // ³¬Ê±Ê±¼äÇåÁ㣬²»²úÉú³¬Ê±flag
|
return GPRS_CLOSE_MODULE;
|
}
|
else
|
{
|
__SYS_DELAY_SEC_TIME_SET_(gprs_timeout_para, gprs_network_cfg_para_g.gprs_timeout); // ½ÓÊÕµ½·þÎñÆ÷·µ»ØÊý¾ÝÖØÖó¬Ê±Ê±¼ä
|
return GPRS_SEND_DATA;
|
}
|
}
|
else if (gprs_module_recv_flag == 3)
|
return GPRS_SEND_DATA;
|
}
|
return GPRS_RECV_DATA;
|
}
|
GPRS_STATUS Gprs_SendAlarmProcess(void)
|
{
|
return GPRS_LOGIN;
|
}
|
|
GPRS_STATUS Gprs_Close_Module_Process(void)
|
{
|
/* ________________
|
*PWR
|
* ____ _____
|
*SWITCH |_____|
|
* | |
|
* | |
|
* T1 T2 ¿ª¹Øµçƽ³ÖÐøÊ±¼ä T1:3S T2 > 22ms
|
*/
|
if (GPIO_ReadOutputDataBit(GPRS_SWITCH_PORT, GPRS_SWITCH_PIN) == Bit_RESET) // Ä£¿éÒý½ÅÀµÍ
|
{
|
GPRS_SWITCH_L;
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 4);
|
}
|
else if (GPIO_ReadOutputDataBit(GPRS_SWITCH_PORT, GPRS_SWITCH_PIN) == Bit_SET) // Ä£¿éÒý½ÅÀ¸ß
|
{
|
if (sys_delay_sec_para_g.gprs_delay_para.delay_flag)
|
{
|
sys_delay_sec_para_g.gprs_delay_para.delay_flag = RESET;
|
GPRS_SWITCH_H; // Ä£¿é¹Ø±Õ
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 1);
|
return GPRS_CLOSE_PWR;
|
}
|
}
|
return GPRS_CLOSE_MODULE;
|
}
|
|
static uint8_t gprs_timeout_alarm_flag = 0;
|
GPRS_STATUS Gprs_Close_PWR_Process(void)
|
{
|
/*ÏȹØÄ£×飬ÔٹصçÔ´*/
|
if (GPIO_ReadOutputDataBit(GPRS_PWR_PORT, GPRS_PWR_PIN) == Bit_SET) // µçÔ´¿ªÆô
|
{
|
if (sys_delay_sec_para_g.gprs_delay_para.delay_flag)
|
{
|
sys_delay_sec_para_g.gprs_delay_para.delay_flag = RESET;
|
GPRS_PWR_OFF; // µçÔ´¹Ø±Õ
|
OTA_UpdataResetHandler();
|
// if(sys_show_state_bytes_id_g == A_RESTART)
|
// sys_clear_state_bytes_id_g = A_RESTART;
|
if (restart_alarm_flag)
|
{
|
restart_alarm_flag = 0;
|
Alarm_List_Node_Deleted(&pList_head, A_RESTART); // ¸´Î»±¨¾¯ÏÔʾÇå³ý
|
}
|
if (gprs_timeout_alarm_flag) // ³¬Ê±Ö±½Ó²úÉú±¨¾¯Éϱ¨£¬´ËʱԶ´«×´Ì¬»¹Î´¿ÕÏе¼Ö²»ÄÜÖØ±¨£¬ËùÒÔÌõ¼þ·ÅÔÚÕâÀï
|
__SYS_STATUS_ALARM_BYTES_SET(gprs_status);
|
return GPRS_IDLE;
|
}
|
return GPRS_CLOSE_PWR;
|
}
|
return GPRS_IDLE;
|
}
|
static uint16_t gprs_restart_interval_time_g = 0;
|
GPRS_STATUS Gprs_RestartProcess(void)
|
{
|
if (!(--gprs_restart_interval_time_g))
|
{
|
// Gprs_GPIO_Usart3_Clk_Init();
|
pwr_vol_g.alka_flag = AMS_GPRS_BEFORE;
|
return GPRS_IDLE;
|
}
|
return GPRS_RESTART;
|
}
|
|
void Gprs_IntervalHandler(GPRS_SEND_MEANS *pGprs_send_means, GPRS_NETWORK_CFG_PARA_T *gprs_net_para_p, __IO RTC_TimeDateTypeDef *calendar_p)
|
{
|
if (calendar_p->Second == 0x07)
|
{
|
uint16_t ref_time_m = 0;
|
switch (gprs_net_para_p->gprs_interval_type)
|
{
|
case GIM_PERIOD:
|
ref_time_m = BCD_2_HEX_U8(gprs_net_para_p->gprs_reference_time_bcd[0]) * 60 + BCD_2_HEX_U8(gprs_net_para_p->gprs_reference_time_bcd[1]);
|
if (Func_PeriodStartHandler(ref_time_m, gprs_net_para_p->gprs_send_period_min_time,
|
&period_para_g.gprs_send_period.period_flag, &period_para_g.gprs_send_period.last_time_m, calendar_p))
|
*pGprs_send_means = GPRS_MEANS_RTC_PERIOD;
|
break;
|
case GIM_TIMED:
|
for (uint8_t i = 0; i < gprs_net_para_p->gprs_timed_number; i++)
|
{
|
if (calendar_p->Hour == gprs_net_para_p->gprs_timing_time_bcd[i][0] &&
|
calendar_p->Minute == gprs_net_para_p->gprs_timing_time_bcd[i][1])
|
*pGprs_send_means = GPRS_MEANS_RTC_TIMED;
|
}
|
break;
|
case GIM_PERIOD_TIMED:
|
ref_time_m = BCD_2_HEX_U8(gprs_net_para_p->gprs_reference_time_bcd[0]) * 60 + BCD_2_HEX_U8(gprs_net_para_p->gprs_reference_time_bcd[1]);
|
if (Func_PeriodStartHandler(ref_time_m, gprs_net_para_p->gprs_send_period_min_time,
|
&period_para_g.gprs_send_period.period_flag, &period_para_g.gprs_send_period.last_time_m, calendar_p))
|
*pGprs_send_means = GPRS_MEANS_RTC_PERIOD;
|
for (uint8_t i = 0; i < gprs_net_para_p->gprs_timed_number; i++)
|
{
|
if (calendar_p->Hour == gprs_net_para_p->gprs_timing_time_bcd[i][0] &&
|
calendar_p->Minute == gprs_net_para_p->gprs_timing_time_bcd[i][1])
|
*pGprs_send_means = GPRS_MEANS_RTC_TIMED;
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
}
|
|
void Gprs_StartJudge(GPRS_SOFT_PARA_T *gprs_soft_para_p_p)
|
{
|
/*·¢Ëͼä¸ô´¦Àí*/
|
Gprs_IntervalHandler(&gprs_soft_para_p_p->gprs_send_type_flag, &gprs_network_cfg_para_g, &calendar_g);
|
if (gprs_soft_para_p_p->gprs_send_type_flag) // Æô¶¯Ô¶´«Ìõ¼þ£ºÊ±¼äµ½£¨¼ä¸ô/¶¨Ê±Ê±¼ä£© °´¼ü ±¨¾¯ ¸´Î»
|
{
|
/*GPRSÖØÁ¬µ¹Ê±ÆÚ¼ä²úÉúÁËʱ¼äµ½/°´¼ü/ÆäËû±¨¾¯£¬Ö±½ÓÆô¶¯GPRS*/
|
if (gprs_soft_para_p_p->gprs_state == GPRS_IDLE || gprs_soft_para_p_p->gprs_state == GPRS_RESTART)
|
{
|
#if GPRS_PROTOCOL_SELECT
|
gprs_protocol_head_tail_g.gprs_protocol_normal_data_head.sys_send_type = gprs_soft_para_p_p->gprs_send_type_flag;
|
#else
|
gprs_protocol_head_tail_g.gprs_protocol_normal_data_head.sys_send_type = gprs_soft_para_p_p->gprs_send_type_flag;
|
#endif
|
/*ͨѶʧ°Ü -> ״̬/±¨¾¯×ÖÖÃλ -> ¿ªÆôÔ¶´«±¨¾¯/ÖØÁ¬*/
|
if (gprs_timeout_alarm_flag && gprs_soft_para_p_p->gprs_send_type_flag == GPRS_MEANS_AGAIN)
|
{
|
gprs_restart_interval_time_g = gprs_network_cfg_para_g.gprs_restart_send_interval_min_time * 60; // ÖØÁ¬¼ä¸ôʱ¼ä
|
gprs_soft_para_p_p->gprs_state = GPRS_RESTART;
|
}
|
else
|
pwr_vol_g.alka_flag = AMS_GPRS_BEFORE;
|
gprs_timeout_alarm_flag = 0;
|
}
|
gprs_soft_para_p_p->gprs_send_type_flag = GPRS_MEANS_NONE;
|
}
|
if (__SYS_DELAY_SEC_FLAG_GET(gprs_timeout_para) == SET) // ³¬Ê±
|
{
|
// gprs_test_g.gprs_time_cnt++;
|
gprs_timeout_alarm_flag = 1; // ÓÃÓÚͨѶʧ°ÜÖØÁ¬
|
__SYS_DELAY_SEC_FLAG_CLEAR_(gprs_timeout_para);
|
gprs_soft_para_p_p->gprs_state = GPRS_CLOSE_MODULE;
|
}
|
}
|
|
void Gprs_Process(GPRS_SOFT_PARA_T *gprs_soft_para_p)
|
{
|
/*·¢ËÍ¿ªÆôÅжÏ*/
|
Gprs_StartJudge(gprs_soft_para_p);
|
if (gprs_soft_para_p->gprs_state && (LargeCurrent_LimitingProcess() & 2)) // ·§¿ÕÏвÅÄܽøÈë
|
{
|
for (uint8_t i = 0; i < GPRS_FUNC_TABLE_NUM; i++)
|
{
|
// ²é±í
|
if (gprs_tab_func[i].gprs_func_table == gprs_soft_para_p->gprs_state && gprs_tab_func[i].GprsFuncHandler != NULL)
|
{
|
gprs_soft_para_p->gprs_state = gprs_tab_func[i].GprsFuncHandler();
|
break;
|
}
|
}
|
}
|
}
|