diff --git a/APP/peripheral.c b/APP/peripheral.c index cf051e4..76f18e6 100644 --- a/APP/peripheral.c +++ b/APP/peripheral.c @@ -443,7 +443,7 @@ static void Peripheral_ProcessGAPMsg(gapRoleEvent_t *pEvent) LED_ALARM_Flag++; if(LED_ALARM_Flag > 2) { - LED_ALARM_OPEN; + LED_VALVE_OPEN; DelayMs(5); LED_ALARM_Flag = 0; } diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index 177cc55..6145475 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -110,8 +110,8 @@ int main(void) BSP_VBAT_Init(); logDebug("VBAT init ok\n"); - // BSP_Ml307r_Init(); - // logDebug("BSP_M1307r ok\n"); + BSP_Ml307r_Init(); + logDebug("BSP_M1307r ok\n"); ShowRestartReason(); IWDG_Init(5000); diff --git a/bsp/inc/bsp_valve.h b/bsp/inc/bsp_valve.h index bf05616..0e6a712 100644 --- a/bsp/inc/bsp_valve.h +++ b/bsp/inc/bsp_valve.h @@ -15,7 +15,6 @@ extern tmosTaskID vavle_task_id; - #define VAVLE_RX_DATA_EVT (0x0001 << 0) #define VAVLE_TX_DATA_EVT (0x0001 << 1) @@ -131,6 +130,8 @@ typedef struct __attribute__((packed)) } TsTimerCloseState; extern TsTimerCloseState gTimerCloseState; +extern TeFrameCmd gValveCloseReason; +extern TeFrameCmd gValveOpenReason; uint8_t CheckSum(const uint8_t *data, size_t len); diff --git a/bsp/src/bsp_bmp390.c b/bsp/src/bsp_bmp390.c index 97cb2cf..277339d 100644 --- a/bsp/src/bsp_bmp390.c +++ b/bsp/src/bsp_bmp390.c @@ -433,12 +433,12 @@ void Lower_IO_Deinit(void) GPIOB_ModeCfg(USIM_DECT_PIN, GPIO_ModeIN_PD); // motor - // GPIOA_ResetBits(COIL_ADC); - // GPIOA_ModeCfg(COIL_ADC, GPIO_ModeIN_PD); + GPIOA_ResetBits(COIL_ADC); + GPIOA_ModeCfg(COIL_ADC, GPIO_ModeIN_PD); // IN1 + ; IN2 + - // GPIOB_SetBits(COIL_A); - // GPIOB_SetBits(COIL_B); - // GPIOB_ModeCfg(COIL_A | COIL_B, GPIO_ModeIN_PD); + GPIOB_SetBits(COIL_A); + GPIOB_SetBits(COIL_B); + GPIOB_ModeCfg(COIL_A | COIL_B, GPIO_ModeIN_PD); // UART3 // GPIOB_ModeCfg(GPIO_Pin_21 | GPIO_Pin_20, GPIO_ModeIN_PD); @@ -957,16 +957,16 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) stopAutoCloseTimer(); } // 欠压检测 - else if (ValveRawData.in_press <= ValveInfo.low_press) - { - BSP_VALVE_Close(kValveCmdUnderPressure); // 使用欠压关阀原因 + // else if (ValveRawData.in_press <= ValveInfo.low_press) + // { + // BSP_VALVE_Close(kValveCmdUnderPressure); // 使用欠压关阀原因 - fault_state = 2; - // 欠压关阀时停止延时关阀功能 - stopAutoCloseTimer(); - logError("******************************"); - logError("欠压关阀"); - } + // fault_state = 2; + // // 欠压关阀时停止延时关阀功能 + // stopAutoCloseTimer(); + // logError("******************************"); + // logError("欠压关阀"); + // } #if 1 // 1、过流自动关闭: // 进气端压力2kpa时,额定流量调到0.9 @@ -1093,19 +1093,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events) tmos_start_task(check_task_id, CHECK_EVT_START, MS1_TO_SYSTEM_TIME(200)); // 100 return (events ^ CHECK_EVT_START); } - if (events & MOTOR_STOP_EVT) - { - VALVE_STOP(); - - logDebug("motor STOP"); - // DelayMs(1500); - // if(fault_state == 4) - // { - // IotFlag_t.Valve_Close_flag = 1; - // Iot_Send_Data(); - // } - return (events ^ MOTOR_STOP_EVT); - } // 延时关阀检测事件处理 if (events & AUTO_CLOSE_CHECK_EVT) diff --git a/bsp/src/bsp_ml307r.c b/bsp/src/bsp_ml307r.c index e046c55..edce85d 100644 --- a/bsp/src/bsp_ml307r.c +++ b/bsp/src/bsp_ml307r.c @@ -12,6 +12,8 @@ #include "time.h" #include #include "cJSON.h" +#include "bsp_valve.h" +#include "bsp_adc.h" #undef LOG_ENABLE #define LOG_ENABLE 1 @@ -95,7 +97,7 @@ static uint8_t state = 0; #define CPIN_RETRY_INTERVAL_TIME (20*1000UL) #define CONNECT_RETRY_INTERVAL_TIME (20*1000UL) #define SEND_RETRY_INTERVAL_TIME (30*1000UL) -#define STOP_TASK_INTERVAL_TIME (15*1000UL) +#define STOP_TASK_INTERVAL_TIME (10*1000UL) #define LOOP_INTERVAL_TIME (30*1000UL) #define GETINFO_INTERVAL_TIME (20*1000UL) @@ -135,32 +137,32 @@ void Send_CallBack(MultiTimer* timer, void* userData) 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; -} +// //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ʱص void StopTask_CallBack(MultiTimer* timer, void* userData) { logDebug("BSP_Ml307_Power_Off\r\n"); - IotFlag_t.Loop_count_flag = 0; - if(IotFlag_t.PowerOn_error_flag == 1) - { + // IotFlag_t.Loop_count_flag = 0; + // if(IotFlag_t.PowerOn_error_flag == 1) + // { IotFlag_t.PowerOn_error_flag = 0; - tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT); - PFIC_DisableIRQ(UART1_IRQn); - BSP_RequestSleep(); - }else{ + // 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; } @@ -521,7 +523,7 @@ static int BSP_Module_Connect_CtWing_Handle(at_env_t *e) { case 0: logDebug("create device...\r\n"); - e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",42519,,1"); // 8.135.10.183,32994 + 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; @@ -570,55 +572,41 @@ typedef enum { DEVICE_STATUS_LOW_BATTERY // ͵״̬ } device_status_t; -// JSON -static cJSON* Create_Base_Json(void) -{ - cJSON *root = cJSON_CreateObject(); - if (root == NULL) { - logDebug("JSONʧ\r\n"); - return NULL; - } +// JSONС +#define JSON_BUFFER_SIZE 512 - // 豸Ϣ - cJSON *device = cJSON_CreateObject(); - if (device == NULL) { - cJSON_Delete(root); - return NULL; - } - - // 豸Ϣ - cJSON_AddStringToObject(device, "id", "SCV001"); - - // ȡǰʱ - char time_str[20]; - sprintf(time_str, "%04d-%02d-%02d %02d:%02d:%02d", - Network_Time_t.tm_year, Network_Time_t.tm_mon, Network_Time_t.tm_mday, - Network_Time_t.tm_hour, Network_Time_t.tm_min, Network_Time_t.tm_sec); - cJSON_AddStringToObject(device, "time", time_str); - - // 豸Ϣӵ - cJSON_AddItemToObject(root, "device", device); - - // ӱ׼Ϣ - cJSON *standards = cJSON_CreateObject(); - if (standards) { - char iot_id[32]; - sprintf(iot_id, "IoT-SCV-%s", Module_Info_t.imei); - cJSON_AddStringToObject(standards, "iotId", iot_id); - cJSON_AddItemToObject(root, "standards", standards); - } - - return root; -} +// 4Gϱݽṹ +typedef struct { + char json_buffer[JSON_BUFFER_SIZE]; // JSONַ + uint16_t length; // JSONַ +} Ts4GJsonData; -// ϢJSON -static void Add_Network_Info(cJSON *root) +/** + * @brief 4GģϱJSON + * + * @param p4GData JSONݽṹָ + * @param cmd ͣͱһ + * @return uint8_t 0ʾɹ + */ +uint8_t BSP_4G_Generate_JsonData(Ts4GJsonData *p4GData, TeFrameCmd cmd) { - if (root == NULL) return; - - cJSON *network = cJSON_CreateObject(); - if (network == NULL) return; + // JSON + memset(p4GData->json_buffer, 0, JSON_BUFFER_SIZE); + // ȡ + TsValveData ValveData; + + // ䷧ݣϱͬ + ValveData.switch_status = gValveData.switch_status; + ValveData.temp = ValveRawData.atom_temp; + ValveData.in_pressure = ValveRawData.in_press_raw; + ValveData.out_pressure = ValveRawData.out_press_raw; + ValveData.atm_pressure = ValveRawData.atom_press; + ValveData.type = kZbf; + ValveData.bat = BSP_ReadVbat(); + ValveData.humi = 50; + ValveData.rssi = gValveData.rssi; + // źǿȣ򵥴Ϊ0-5ֵ int signal_strength = 0; long rssi = strtol(Service_Info_t.rssi, NULL, 16); @@ -627,144 +615,73 @@ static void Add_Network_Info(cJSON *root) else if (rssi > -110) signal_strength = 3; else if (rssi > -120) signal_strength = 2; else if (rssi > -130) signal_strength = 1; - - // - float sinr = strtol(Service_Info_t.last_sinr, NULL, 16) / 10.0f; - - cJSON_AddNumberToObject(network, "sinr", sinr); - cJSON_AddNumberToObject(network, "signal", signal_strength); - cJSON_AddItemToObject(root, "network", network); + + // JSONַ + p4GData->length = snprintf(p4GData->json_buffer, JSON_BUFFER_SIZE, + "{" + "\"cmd\":%d," + "\"data\":{" + "\"switch_status\":%d," + "\"temp\":%d," + "\"in_pressure\":%d," + "\"out_pressure\":%d," + "\"atm_pressure\":%d," + "\"type\":%d," + "\"bat\":%d," + "\"humi\":%d," + "\"rssi\":%d," + "\"signal\":%d" + "}" + "}", + cmd, + ValveData.switch_status, + ValveData.temp, + ValveData.in_pressure, + ValveData.out_pressure, + ValveData.atm_pressure, + ValveData.type, + ValveData.bat, + ValveData.humi, + ValveData.rssi, + signal_strength + ); + + // ӡJSONϢ + logDebug("4G JSON (cmd=%d):\r\n%s", cmd, p4GData->json_buffer); + + return 0; } -// ӳ״̬ϢJSON -static void Add_Normal_Status(cJSON *root) +/** + * @brief 4GģӦJSON + * + * @param p4GData JSONݽṹָ + * @param responseCmd Ӧ + * @param result Ӧ0ɹ0ʧ + * @return uint8_t 0ʾɹ + */ +uint8_t BSP_4G_Generate_Response(Ts4GJsonData *p4GData, TeFrameCmd responseCmd, uint8_t result) { - if (root == NULL) return; + p4GData->length = snprintf(p4GData->json_buffer, JSON_BUFFER_SIZE, + "{" + "\"cmd\":%d," + "\"data\":{" + "\"response_cmd\":%d," + "\"result\":%d" + "}" + "}", + kCmdData, // ʹΪӦ + responseCmd, + result + ); + + logDebug("4GӦJSON:\r\n%s", p4GData->json_buffer); - // ״̬Ϣ - cJSON_AddStringToObject(root, "status", "normal"); - - // ӼϢ - cJSON *monitor = cJSON_CreateObject(); - if (monitor) { - // Ӵݣѹֵ - float pressure = 0.75; // ʾֵӦӴȡ - cJSON_AddNumberToObject(monitor, "pressure", pressure); - cJSON_AddBoolToObject(monitor, "lowVoltage", false); - cJSON_AddItemToObject(root, "monitor", monitor); - } -} - -// ӹر״̬ϢJSON -static void Add_Closed_Status(cJSON *root) -{ - if (root == NULL) return; - - // ״̬Ϣ - cJSON_AddStringToObject(root, "status", "closed"); - - // ӼϢ - cJSON *monitor = cJSON_CreateObject(); - if (monitor) { - float pressure = 0.0; // ŹرʱѹΪ0 - cJSON_AddNumberToObject(monitor, "pressure", pressure); - cJSON_AddBoolToObject(monitor, "lowVoltage", false); - cJSON_AddItemToObject(root, "monitor", monitor); - } -} - -// ӹ״̬ϢJSON -static void Add_Fault_Status(cJSON *root) -{ - if (root == NULL) return; - - // ״̬Ϣ - cJSON_AddStringToObject(root, "status", "fault"); - - // ӹϢ - cJSON *fault = cJSON_CreateObject(); - if (fault) { - cJSON_AddBoolToObject(fault, "lowBattery", false); - cJSON_AddNumberToObject(fault, "code", 1); // ϴ - cJSON_AddItemToObject(root, "fault", fault); - } - - // ӼϢ - cJSON *monitor = cJSON_CreateObject(); - if (monitor) { - float pressure = 0.8; // ʾֵ - cJSON_AddNumberToObject(monitor, "pressure", pressure); - cJSON_AddBoolToObject(monitor, "lowVoltage", false); - cJSON_AddItemToObject(root, "monitor", monitor); - } -} - -// ӵ͵״̬ϢJSON -static void Add_Low_Battery_Status(cJSON *root) -{ - if (root == NULL) return; - - // ״̬Ϣ - cJSON_AddStringToObject(root, "status", "warning"); - - // ӹϢ - cJSON *fault = cJSON_CreateObject(); - if (fault) { - cJSON_AddBoolToObject(fault, "lowBattery", true); - cJSON_AddNumberToObject(fault, "code", 2); // ͵ - cJSON_AddItemToObject(root, "fault", fault); - } - - // ӼϢ - cJSON *monitor = cJSON_CreateObject(); - if (monitor) { - float pressure = 0.78; // ʾֵ - cJSON_AddNumberToObject(monitor, "pressure", pressure); - cJSON_AddBoolToObject(monitor, "lowVoltage", true); - cJSON_AddItemToObject(root, "monitor", monitor); - } -} - -// 豸״̬JSON -static char* Build_Status_Json(device_status_t status) -{ - // JSONṹ - cJSON *root = Create_Base_Json(); - if (root == NULL) { - return NULL; - } - - // ״̬ӲͬϢ - switch (status) { - case DEVICE_STATUS_NORMAL: - Add_Normal_Status(root); - break; - case DEVICE_STATUS_CLOSED: - Add_Closed_Status(root); - break; - case DEVICE_STATUS_FAULT: - Add_Fault_Status(root); - break; - case DEVICE_STATUS_LOW_BATTERY: - Add_Low_Battery_Status(root); - break; - default: - Add_Normal_Status(root); - break; - } - - // Ϣ - Add_Network_Info(root); - - // JSONתΪַ - char *json_string = cJSON_PrintUnformatted(root); - - // ͷJSON - cJSON_Delete(root); - - return json_string; + return 0; } +// ȫJSONݽṹ +Ts4GJsonData g4GJsonData; char *json_data; static int SendMessage(at_env_t *e) @@ -773,7 +690,7 @@ static int SendMessage(at_env_t *e) { case 0: logDebug("SendMessage start!\r\n"); - e->println(e, "AT+MIPSEND=0,%d,\"%s\"",strlen(json_data),json_data); + e->println(e, "AT+MIPSEND=0,%d,\"%s\"", strlen(json_data), json_data); e->reset_timer(e); e->state++; break; @@ -782,6 +699,9 @@ static int SendMessage(at_env_t *e) { logDebug("SendMessage end!\r\n"); IotFlag_t.send_complete_flag = 1; + // ɺͷjson_dataڴ + tmos_msg_deallocate((uint8_t *)json_data); + json_data = NULL; e->finish(e, AT_RESP_OK); } if (e->is_timeout(e, 5000)) @@ -791,6 +711,9 @@ static int SendMessage(at_env_t *e) { logDebug("SendMessage error!\r\n"); IotFlag_t.send_complete_flag = 1; + // ʧҲҪͷjson_dataڴ + tmos_msg_deallocate((uint8_t *)json_data); + json_data = NULL; e->finish(e, AT_RESP_ERROR); } } @@ -807,34 +730,29 @@ static void BSP_SendMessage(void) void BSP_ML307_SendMessage(void) { - // ϵͳ״̬ȷ豸״̬ - device_status_t device_status; - - // // ʵϵͳ״̬ж߼޸ - // if (fault_state) { - // device_status = DEVICE_STATUS_FAULT; - // } else { - // // ״̬ص - // // Ӹ״̬߼ - // device_status = DEVICE_STATUS_NORMAL; - // } + // ϵͳ״̬ȷ + TeFrameCmd cmd = kCmdData; // ĬΪ - - if(IotFlag_t.Valve_Close_flag) + if (gValveData.switch_status == kClosed) { - IotFlag_t.Valve_Close_flag = 0; - device_status = DEVICE_STATUS_CLOSED; + cmd = gValveCloseReason; + }else + { + cmd = gValveOpenReason; } + + // JSON + BSP_4G_Generate_JsonData(&g4GJsonData, cmd); - - // JSON - json_data = Build_Status_Json(device_status); + // ڴ沢JSONַ + json_data = (char *)tmos_msg_allocate(g4GJsonData.length + 1); if (json_data != NULL) { - logDebug("json_data len %d\r\n",strlen(json_data)); + strcpy(json_data, g4GJsonData.json_buffer); + logDebug("json_data len %d\r\n", strlen(json_data)); BSP_SendMessage(); } else { - logDebug("Build_Status_Json error!\n"); + logDebug("JSONڴʧ!\n"); IotFlag_t.send_error_flag = 1; } } @@ -922,7 +840,7 @@ static int Module_Restart_Work(at_env_t *e) e->reset_timer(e); e->state++; } - if (e->is_timeout(e, 5000)) + if (e->is_timeout(e, 1500)) { e->state--; if (++e->i > 3) @@ -986,7 +904,7 @@ static int simcom_init(at_env_t *e) logDebug("simcom CPIN READY!\r\n"); e->finish(e, AT_RESP_OK); } - if (e->is_timeout(e, 5000)) + if (e->is_timeout(e, 3000)) { e->state--; if (++e->i > 3) @@ -1142,26 +1060,30 @@ static void BSP_Iot_Loop(void) logDebug("send_complete_into_stop\r\n"); IotFlag_t.send_complete_flag = 0; state = 0; - tmos_msg_deallocate((uint8_t *)json_data); + // ָǷΪNULLͷţظͷ + if(json_data != NULL) { + tmos_msg_deallocate((uint8_t *)json_data); + json_data = NULL; + } MultiTimerStart(&Multi_StopTask_t, STOP_TASK_INTERVAL_TIME, StopTask_CallBack, NULL); //ر }else { - if (IotFlag_t.Loop_count_flag > 2) - { - logDebug("Loop_count_flag_end %d\r\n",IotFlag_t.Loop_count_flag); + // if (IotFlag_t.Loop_count_flag > 2) + // { + // logDebug("Loop_count_flag_end %d\r\n",IotFlag_t.Loop_count_flag); state = 0; IotFlag_t.Iot_Retry_flag = 0; IotFlag_t.module_init_flag = 0; MultiTimerStart(&Multi_StopTask_t, STOP_TASK_INTERVAL_TIME, StopTask_CallBack, NULL); - } - if((IotFlag_t.Iot_Retry_flag == 0)&&(IotFlag_t.Loop_count_flag < 3)) - { - logDebug("error_into_loop\r\n"); - logDebug("Loop_count_flag %d\r\n",IotFlag_t.Loop_count_flag); - BSP_Ml307_Power_Off(); //ػ - MultiTimerStart(&Multi_Loop_t, LOOP_INTERVAL_TIME, Loop_CallBack, NULL); - IotFlag_t.Iot_Retry_flag = 1; - } + // } + // if((IotFlag_t.Iot_Retry_flag == 0)&&(IotFlag_t.Loop_count_flag < 3)) + // { + // logDebug("error_into_loop\r\n"); + // logDebug("Loop_count_flag %d\r\n",IotFlag_t.Loop_count_flag); + // BSP_Ml307_Power_Off(); //ػ + // MultiTimerStart(&Multi_Loop_t, LOOP_INTERVAL_TIME, Loop_CallBack, NULL); + // IotFlag_t.Iot_Retry_flag = 1; + // } } break; } diff --git a/bsp/src/bsp_valve.c b/bsp/src/bsp_valve.c index ac07883..719a217 100644 --- a/bsp/src/bsp_valve.c +++ b/bsp/src/bsp_valve.c @@ -20,6 +20,7 @@ #include "bsp_led.h" #include "bsp_bmp390.h" #include "bsp_tim.h" +#include "bsp_ml307r.h" #undef LOG_ENABLE #define LOG_ENABLE 1 @@ -30,8 +31,8 @@ TsValveData gValveData = {0}; TsRawFrameData RelyData; TsTimerCloseState gTimerCloseState = {0}; -static TeFrameCmd gValveCloseReason = kCmdCloseVavle; // 默认为普通关阀命令 -static TeFrameCmd gValveOpenReason = kCmdOpenVavle; // 默认为普通开阀命令 +TeFrameCmd gValveCloseReason = kCmdCloseVavle; // 默认为普通关阀命令 +TeFrameCmd gValveOpenReason = kCmdOpenVavle; // 默认为普通开阀命令 tmosTaskID vavle_task_id = INVALID_TASK_ID; @@ -325,6 +326,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀 logDebug("VAVLE_CLOSE_START_EVT"); BSP_BlockSleep(); + BSP_MOTOR_Init(); LED_VALVE_CLOSE; // DelayUs(200); @@ -365,6 +367,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀 BSP_RequestSleep(); logDebug("VAVLE_CLOSE_END_EVT"); + Iot_Send_Data(); return (events ^ VAVLE_CLOSE_END_EVT); } @@ -373,6 +376,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀 logDebug("VAVLE_OPEN_START_EVT"); BSP_BlockSleep(); + BSP_MOTOR_Init(); LED_VALVE_OPEN; // DelayUs(200); @@ -416,6 +420,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀 tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT); BSP_RequestSleep(); + Iot_Send_Data(); // 启动微泄漏检测 startMicroLeakDetection();