暂存 添加4G定时开阀功能
This commit is contained in:
parent
ef7ced3cad
commit
01f1c30aae
|
@ -139,22 +139,14 @@ typedef struct {
|
||||||
extern IotFlagStruct IotFlag_t;
|
extern IotFlagStruct IotFlag_t;
|
||||||
extern struct tm Network_Time_t;
|
extern struct tm Network_Time_t;
|
||||||
|
|
||||||
|
|
||||||
static void BSP_Ml307_Power_Off(void);
|
|
||||||
|
|
||||||
|
|
||||||
void BSP_Ml307r_Init(void);
|
void BSP_Ml307r_Init(void);
|
||||||
void Iot_Send_Data(TeFrameCmd cmd);
|
void Iot_Send_Data(TeFrameCmd cmd);
|
||||||
void Ml307r_Loop(void);
|
void Ml307r_Loop(void);
|
||||||
void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len);
|
|
||||||
void BSP_ML307_StartTimeoutTimer(void);
|
|
||||||
void BSP_ML307_SetActive(void);
|
|
||||||
void BSP_ML307_SendMessage(void);
|
void BSP_ML307_SendMessage(void);
|
||||||
static void BSP_Read_Module(void);
|
|
||||||
static void BSP_simcom_init(void);
|
static void BSP_simcom_init(void);
|
||||||
static void BSP_Get_Module_Info(void);
|
static void BSP_Get_Module_Info(void);
|
||||||
static void BSP_Module_Connect_CtWing(void);
|
|
||||||
static void BSP_SendMessage(void);
|
static void BSP_SendMessage(void);
|
||||||
|
static void BSP_Ml307_Power_Off(void);
|
||||||
uint8_t BSP_4G_Generate_Response(Ts4GJsonData *p4GData, uint32_t timestamp, TeFrameCmd responseCmd);
|
uint8_t BSP_4G_Generate_Response(Ts4GJsonData *p4GData, uint32_t timestamp, TeFrameCmd responseCmd);
|
||||||
|
|
||||||
// 状态上报请求结构体
|
// 状态上报请求结构体
|
||||||
|
|
|
@ -67,7 +67,7 @@ typedef enum
|
||||||
kValveCmdOpenWithStove, // 开灶开阀
|
kValveCmdOpenWithStove, // 开灶开阀
|
||||||
kValveCmdCloseWithStove, // 关灶关阀
|
kValveCmdCloseWithStove, // 关灶关阀
|
||||||
kValveCmdOverTemperature, // 超温关阀
|
kValveCmdOverTemperature, // 超温关阀
|
||||||
kValveCmdDelayClose, // 延时关阀
|
kValveCmdDelayClose, // 恒流超时关阀
|
||||||
kValveCmdManualClose, // 手动关阀
|
kValveCmdManualClose, // 手动关阀
|
||||||
KValveCmdTimeSet, // 设置定时关阀时间
|
KValveCmdTimeSet, // 设置定时关阀时间
|
||||||
kValveCmdTimeResp, // 设置定时关阀时间响应
|
kValveCmdTimeResp, // 设置定时关阀时间响应
|
||||||
|
@ -159,7 +159,7 @@ uint8_t BSP_VALVE_Open(TeFrameCmd open_reason);
|
||||||
uint8_t BSP_VALVE_Lock(TeFrameCmd lock_reason); // 锁定阀门
|
uint8_t BSP_VALVE_Lock(TeFrameCmd lock_reason); // 锁定阀门
|
||||||
uint8_t BSP_VALVE_Unlock(void); // 解锁阀门
|
uint8_t BSP_VALVE_Unlock(void); // 解锁阀门
|
||||||
uint8_t BSP_VALVE_CheckHazardCleared(void); // 检查隐患是否已排除
|
uint8_t BSP_VALVE_CheckHazardCleared(void); // 检查隐患是否已排除
|
||||||
static uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes);
|
uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes);
|
||||||
static uint8_t BSP_VALVE_CancelTimerClose(void);
|
static uint8_t BSP_VALVE_CancelTimerClose(void);
|
||||||
static uint32_t BSP_VALVE_GetRemainingMinutes(void);
|
static uint32_t BSP_VALVE_GetRemainingMinutes(void);
|
||||||
#endif // ! __BSP_VALVE_H__
|
#endif // ! __BSP_VALVE_H__
|
||||||
|
|
|
@ -136,32 +136,14 @@ void Send_CallBack(MultiTimer* timer, void* userData)
|
||||||
IotFlag_t.send_error_flag = 1;
|
IotFlag_t.send_error_flag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// //Loop回调
|
|
||||||
// void Loop_CallBack(MultiTimer* timer, void* userData)
|
|
||||||
// {
|
|
||||||
// state = 0;
|
|
||||||
// IotFlag_t.Loop_count_flag++;
|
|
||||||
// IotFlag_t.module_init_flag = 1;
|
|
||||||
// IotFlag_t.Iot_Retry_flag = 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
//StopTask超时回调
|
//StopTask超时回调
|
||||||
void StopTask_CallBack(MultiTimer* timer, void* userData)
|
void StopTask_CallBack(MultiTimer* timer, void* userData)
|
||||||
{
|
{
|
||||||
logDebug("BSP_Ml307_Power_Off\r\n");
|
logDebug("BSP_Ml307_Power_Off\r\n");
|
||||||
// IotFlag_t.Loop_count_flag = 0;
|
IotFlag_t.PowerOn_error_flag = 0;
|
||||||
// if(IotFlag_t.PowerOn_error_flag == 1)
|
tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
|
||||||
// {
|
PFIC_DisableIRQ(UART1_IRQn);
|
||||||
IotFlag_t.PowerOn_error_flag = 0;
|
BSP_RequestSleep();
|
||||||
// tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
|
|
||||||
// PFIC_DisableIRQ(UART1_IRQn);
|
|
||||||
// BSP_RequestSleep();
|
|
||||||
// }else{
|
|
||||||
// BSP_Ml307_Power_Off(); //关机
|
|
||||||
tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
|
|
||||||
PFIC_DisableIRQ(UART1_IRQn);
|
|
||||||
BSP_RequestSleep();
|
|
||||||
// }
|
|
||||||
IotFlag_t.Date_Sending_flag = 0;
|
IotFlag_t.Date_Sending_flag = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,13 +159,11 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
lwjson_token_t tokens[64];
|
lwjson_token_t tokens[64];
|
||||||
const lwjson_token_t* token;
|
const lwjson_token_t* token;
|
||||||
|
|
||||||
// 初始化lwjson
|
|
||||||
if (lwjson_init(&lwjson, tokens, LWJSON_ARRAYSIZE(tokens)) != lwjsonOK) {
|
if (lwjson_init(&lwjson, tokens, LWJSON_ARRAYSIZE(tokens)) != lwjsonOK) {
|
||||||
logDebug("lwjson init failed\r\n");
|
logDebug("lwjson init failed\r\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解析JSON字符串
|
|
||||||
if (lwjson_parse(&lwjson, json_str) != lwjsonOK) {
|
if (lwjson_parse(&lwjson, json_str) != lwjsonOK) {
|
||||||
logDebug("JSON parse failed\r\n");
|
logDebug("JSON parse failed\r\n");
|
||||||
lwjson_free(&lwjson);
|
lwjson_free(&lwjson);
|
||||||
|
@ -191,7 +171,6 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
}
|
}
|
||||||
logDebug("JSON parse success\r\n");
|
logDebug("JSON parse success\r\n");
|
||||||
|
|
||||||
// 解析设备序列号
|
|
||||||
token = lwjson_find(&lwjson, "sn");
|
token = lwjson_find(&lwjson, "sn");
|
||||||
if (token != NULL && token->type == LWJSON_TYPE_STRING) {
|
if (token != NULL && token->type == LWJSON_TYPE_STRING) {
|
||||||
char sn_str[32] = {0};
|
char sn_str[32] = {0};
|
||||||
|
@ -202,7 +181,6 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解析时间戳
|
|
||||||
uint32_t timestamp = 0;
|
uint32_t timestamp = 0;
|
||||||
token = lwjson_find(&lwjson, "time");
|
token = lwjson_find(&lwjson, "time");
|
||||||
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
||||||
|
@ -210,7 +188,6 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
logDebug("Timestamp: %u\r\n", timestamp);
|
logDebug("Timestamp: %u\r\n", timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解析类型
|
|
||||||
TeFrameCmd msg_cmd = kCmdCfg;
|
TeFrameCmd msg_cmd = kCmdCfg;
|
||||||
token = lwjson_find(&lwjson, "cmd");
|
token = lwjson_find(&lwjson, "cmd");
|
||||||
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
||||||
|
@ -218,7 +195,6 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
logDebug("Message cmd: %d\r\n", msg_cmd);
|
logDebug("Message cmd: %d\r\n", msg_cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据不同的命令类型解析特定数据
|
|
||||||
switch (msg_cmd) {
|
switch (msg_cmd) {
|
||||||
case kCmdCfg:
|
case kCmdCfg:
|
||||||
logDebug("Data response %d\r\n", msg_cmd);
|
logDebug("Data response %d\r\n", msg_cmd);
|
||||||
|
@ -230,7 +206,7 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
logDebug("Switch status: %d\r\n", switch_status);
|
logDebug("Switch status: %d\r\n", switch_status);
|
||||||
if (switch_status == 0) {
|
if (switch_status == 0) {
|
||||||
logDebug("Command: Close valve\r\n");
|
logDebug("Command: Close valve\r\n");
|
||||||
// BSP_VALVE_Close(); // 取消注释以执行实际操作
|
// BSP_VALVE_Close();
|
||||||
IotFlag_t.Valve_Close_flag = 1;
|
IotFlag_t.Valve_Close_flag = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -242,7 +218,7 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
logDebug("Switch status: %d\r\n", switch_status);
|
logDebug("Switch status: %d\r\n", switch_status);
|
||||||
if (switch_status == 1) {
|
if (switch_status == 1) {
|
||||||
logDebug("Command: Open valve\r\n");
|
logDebug("Command: Open valve\r\n");
|
||||||
// BSP_VALVE_Open(); // 取消注释以执行实际操作
|
// BSP_VALVE_Open();
|
||||||
IotFlag_t.Valve_Open_flag = 1;
|
IotFlag_t.Valve_Open_flag = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -252,6 +228,7 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
||||||
uint32_t timer_minutes = (uint32_t)token->u.num_int;
|
uint32_t timer_minutes = (uint32_t)token->u.num_int;
|
||||||
logDebug("Delay close time: %d minutes\r\n", timer_minutes);
|
logDebug("Delay close time: %d minutes\r\n", timer_minutes);
|
||||||
|
BSP_VALVE_SetTimerClose(timer_minutes);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kValveCmdOverPressure:
|
case kValveCmdOverPressure:
|
||||||
|
@ -259,7 +236,6 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
||||||
uint16_t over_press = (uint16_t)token->u.num_int;
|
uint16_t over_press = (uint16_t)token->u.num_int;
|
||||||
logDebug("Over pressure threshold: %d Pa\r\n", over_press);
|
logDebug("Over pressure threshold: %d Pa\r\n", over_press);
|
||||||
// 更新阀门超压阈值
|
|
||||||
ValveInfo.over_press = over_press;
|
ValveInfo.over_press = over_press;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -268,7 +244,6 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
||||||
uint16_t low_press = (uint16_t)token->u.num_int;
|
uint16_t low_press = (uint16_t)token->u.num_int;
|
||||||
logDebug("Low pressure threshold: %d Pa\r\n", low_press);
|
logDebug("Low pressure threshold: %d Pa\r\n", low_press);
|
||||||
// 更新阀门欠压阈值
|
|
||||||
ValveInfo.low_press = low_press;
|
ValveInfo.low_press = low_press;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -277,7 +252,6 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
||||||
uint32_t delay_close_time = (uint32_t)token->u.num_int;
|
uint32_t delay_close_time = (uint32_t)token->u.num_int;
|
||||||
logDebug("Delay close time: %d minutes\r\n", delay_close_time);
|
logDebug("Delay close time: %d minutes\r\n", delay_close_time);
|
||||||
// 更新阀门延时次数
|
|
||||||
ValveInfo.delay_close_count = delay_close_time/5;
|
ValveInfo.delay_close_count = delay_close_time/5;
|
||||||
logDebug("delay_close_count: %d \r\n", ValveInfo.delay_close_count);
|
logDebug("delay_close_count: %d \r\n", ValveInfo.delay_close_count);
|
||||||
}
|
}
|
||||||
|
@ -287,27 +261,20 @@ static int _parse_server_json_data(const char* json_str)
|
||||||
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
|
||||||
uint8_t over_temp = (uint8_t)token->u.num_int;
|
uint8_t over_temp = (uint8_t)token->u.num_int;
|
||||||
logDebug("Over temperature threshold: %d°C\r\n", over_temp);
|
logDebug("Over temperature threshold: %d°C\r\n", over_temp);
|
||||||
// 更新阀门超温阈值
|
|
||||||
ValveInfo.over_temp = over_temp;
|
ValveInfo.over_temp = over_temp;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// 处理其他命令类型
|
logDebug("Unhandled command: %d\r\n", msg_cmd);
|
||||||
logDebug("Unhandled command type: %d\r\n", msg_cmd);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (msg_cmd != kCmdCfg) {
|
if (msg_cmd != kCmdCfg) {
|
||||||
// 生成响应并发送
|
|
||||||
Ts4GJsonData responseData;
|
Ts4GJsonData responseData;
|
||||||
BSP_4G_Generate_Response(&responseData, timestamp, msg_cmd);
|
BSP_4G_Generate_Response(&responseData, timestamp, msg_cmd);
|
||||||
|
|
||||||
// 分配内存并复制JSON字符串
|
|
||||||
char* response_json = (char *)tmos_msg_allocate(responseData.length + 1);
|
char* response_json = (char *)tmos_msg_allocate(responseData.length + 1);
|
||||||
if (response_json != NULL) {
|
if (response_json != NULL) {
|
||||||
strcpy(response_json, responseData.json_buffer);
|
strcpy(response_json, responseData.json_buffer);
|
||||||
logDebug("Response JSON: %s\r\n", response_json);
|
logDebug("Response JSON: %s\r\n", response_json);
|
||||||
|
|
||||||
// 保存到全局变量以便发送
|
|
||||||
json_data = response_json;
|
json_data = response_json;
|
||||||
BSP_SendMessage();
|
BSP_SendMessage();
|
||||||
} else {
|
} else {
|
||||||
|
@ -813,7 +780,7 @@ static int MQTT_CfgConnSub(at_env_t *e)
|
||||||
e->reset_timer(e);
|
e->reset_timer(e);
|
||||||
e->state++;
|
e->state++;
|
||||||
}
|
}
|
||||||
if (e->is_timeout(e, 3000))
|
if (e->is_timeout(e, 6000))
|
||||||
{
|
{
|
||||||
e->state--;
|
e->state--;
|
||||||
if (++e->i > 3)
|
if (++e->i > 3)
|
||||||
|
@ -851,53 +818,6 @@ static void BSP_MQTT_CfgConnSub(void)
|
||||||
at_do_work(ml307r_obj, NULL, MQTT_CfgConnSub);
|
at_do_work(ml307r_obj, NULL, MQTT_CfgConnSub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief 创建设备
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
static int BSP_Module_Connect_CtWing_Handle(at_env_t *e)
|
|
||||||
{
|
|
||||||
switch (e->state)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
logDebug("create device...\r\n");
|
|
||||||
e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",46696,,1"); // 8.135.10.183,32994
|
|
||||||
e->reset_timer(e);
|
|
||||||
e->state++;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (e->contains(e, "CONNECT"))
|
|
||||||
{
|
|
||||||
IotFlag_t.Connect_success_flag = 1;
|
|
||||||
logDebug("create device complete\r\n");
|
|
||||||
e->finish(e, AT_RESP_OK);
|
|
||||||
}
|
|
||||||
else if (e->is_timeout(e, 5000))
|
|
||||||
{
|
|
||||||
e->state--;
|
|
||||||
if (++e->i > 3)
|
|
||||||
{
|
|
||||||
logDebug("create device error\r\n");
|
|
||||||
IotFlag_t.Connect_error_flag = 1;
|
|
||||||
e->finish(e, AT_RESP_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
//连接服务器
|
|
||||||
static void BSP_Module_Connect_CtWing(void)
|
|
||||||
{
|
|
||||||
BSP_MQTT_CfgConnSub();
|
|
||||||
// at_do_work(ml307r_obj, NULL, BSP_Module_Connect_CtWing_Handle);//创建设备
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//向服务器发送数据
|
//向服务器发送数据
|
||||||
void BSP_Module_Send_Data(uint8_t* data, uint8_t len)
|
void BSP_Module_Send_Data(uint8_t* data, uint8_t len)
|
||||||
{
|
{
|
||||||
|
@ -1030,13 +950,11 @@ uint8_t BSP_4G_Generate_Response(Ts4GJsonData *p4GData, uint32_t timestamp, TeFr
|
||||||
gValveData.switch_status
|
gValveData.switch_status
|
||||||
);
|
);
|
||||||
|
|
||||||
logDebug("4G响应JSON数据:\r\n%s", p4GData->json_buffer);
|
logDebug("4G Response JSON data:\r\n%s", p4GData->json_buffer);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int SendMessage(at_env_t *e)
|
static int SendMessage(at_env_t *e)
|
||||||
{
|
{
|
||||||
switch (e->state)
|
switch (e->state)
|
||||||
|
@ -1107,7 +1025,6 @@ void BSP_ML307_SendMessage(void)
|
||||||
// 生成JSON数据
|
// 生成JSON数据
|
||||||
BSP_4G_Generate_JsonData(&g4GJsonData, cmd);
|
BSP_4G_Generate_JsonData(&g4GJsonData, cmd);
|
||||||
|
|
||||||
// 分配内存并复制JSON字符串
|
|
||||||
json_data = (char *)tmos_msg_allocate(g4GJsonData.length + 1);
|
json_data = (char *)tmos_msg_allocate(g4GJsonData.length + 1);
|
||||||
|
|
||||||
if (json_data != NULL) {
|
if (json_data != NULL) {
|
||||||
|
@ -1410,7 +1327,7 @@ static void BSP_Iot_Loop(void)
|
||||||
{
|
{
|
||||||
IotFlag_t.ModInfo_success_flag = 0;
|
IotFlag_t.ModInfo_success_flag = 0;
|
||||||
MultiTimerStart(&Multi_Connect_t, CONNECT_RETRY_INTERVAL_TIME, Connect_CallBack, NULL);
|
MultiTimerStart(&Multi_Connect_t, CONNECT_RETRY_INTERVAL_TIME, Connect_CallBack, NULL);
|
||||||
BSP_Module_Connect_CtWing();
|
BSP_MQTT_CfgConnSub();
|
||||||
}
|
}
|
||||||
if (IotFlag_t.Connect_success_flag) // 连接成功
|
if (IotFlag_t.Connect_success_flag) // 连接成功
|
||||||
{
|
{
|
||||||
|
@ -1476,8 +1393,7 @@ static void BSP_Iot_Loop(void)
|
||||||
tmos_msg_deallocate((uint8_t *)json_data);
|
tmos_msg_deallocate((uint8_t *)json_data);
|
||||||
json_data = NULL;
|
json_data = NULL;
|
||||||
}
|
}
|
||||||
|
//TODO:ʹÓÃAT Command»úÖÆÓÅ»¯
|
||||||
// 检查队列中是否还有待发送的请求
|
|
||||||
if (lwrb_get_full(&iot_send_queue) >= sizeof(TsIotSendRequest)) {
|
if (lwrb_get_full(&iot_send_queue) >= sizeof(TsIotSendRequest)) {
|
||||||
logDebug("The queue has data to be sent, continue\r\n");
|
logDebug("The queue has data to be sent, continue\r\n");
|
||||||
IotFlag_t.Connect_success_flag = 1;
|
IotFlag_t.Connect_success_flag = 1;
|
||||||
|
|
|
@ -567,7 +567,7 @@ void BSP_VAVLE_Init(void) // 阀门初始化函数
|
||||||
gValveData.switch_status = kClosed; // 初始化阀门状态为关闭
|
gValveData.switch_status = kClosed; // 初始化阀门状态为关闭
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes)
|
uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes)
|
||||||
{
|
{
|
||||||
// 参数验证
|
// 参数验证
|
||||||
if (minutes == 0 || minutes > 1440) { // 1分钟到24小时
|
if (minutes == 0 || minutes > 1440) { // 1分钟到24小时
|
||||||
|
|
Loading…
Reference in New Issue