|
|
如题,不知有无大佬可以帮忙看看什么问题,实在是找不到原因,内存监控看下来空闲还非常多 或者需要确认其他部分我再添上来:
MQTT回调部分:
[C] 纯文本查看 复制代码 static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
ESP_LOGD(MQTT_TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", base, event_id);
esp_mqtt_event_handle_t event = event_data;
esp_mqtt_client_handle_t client = event->client;
switch ((esp_mqtt_event_id_t)event_id)
{
case MQTT_EVENT_CONNECTED:
ESP_LOGI(MQTT_TAG, "MQTT_EVENT_CONNECTED");
esp_mqtt_client_subscribe(client, "E/ERR", 0);
esp_mqtt_client_subscribe(client, "E/DEL", 0);
break;
case MQTT_EVENT_DISCONNECTED:
ESP_LOGI(MQTT_TAG, "MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
ESP_LOGI(MQTT_TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_UNSUBSCRIBED:
ESP_LOGI(MQTT_TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_PUBLISHED:
ESP_LOGI(MQTT_TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_DATA:
ESP_LOGI(MQTT_TAG, "MQTT_EVENT_DATA");
char topic[128] = {0};
int topic_len = event->topic_len;
if (topic_len > sizeof(topic) - 1)
{
topic_len = sizeof(topic) - 1;
}
strncpy(topic, event->topic, topic_len);
topic[topic_len] = '\0';
ESP_LOGI(MQTT_TAG, "Received from topic: %s", topic);
if (strcmp(topic, "E/ERR") == 0)
{
cJSON *msg_recv = cJSON_Parse(event->data);
if (msg_recv == NULL)
{
ESP_LOGE("MQTT_Json", "Json error");
return;
}
const char *id = cJSON_GetStringValue(cJSON_GetObjectItem(msg_recv, "clientID"));
if (strcmp(id, WATCH_ID) != 0)
{
ESP_LOGI("MQTT_Filter", "ID mismatch (expected:%s, actual:%s)", WATCH_ID, id);
cJSON_Delete(msg_recv);
return;
}
int msg_id_val = cJSON_GetNumberValue(cJSON_GetObjectItem(msg_recv, "msg_id"));
const char *deviceno_val = cJSON_GetStringValue(cJSON_GetObjectItem(msg_recv, "deviceno"));
const char *content_val = cJSON_GetStringValue(cJSON_GetObjectItem(msg_recv, "content"));
const char *color_val = cJSON_GetStringValue(cJSON_GetObjectItem(msg_recv, "color"));
int priority_val = cJSON_GetNumberValue(cJSON_GetObjectItem(msg_recv, "priority"));
panel_add_obj_args_t *args = (panel_add_obj_args_t *)calloc(1, sizeof(*args));
if (!args)
{
return;
}
args->msg_id = msg_id_val;
args->priority = priority_val;
if (deviceno_val)
{
args->deviceno = strdup(deviceno_val);
}
else
{
args->deviceno = strdup("");
}
if (content_val)
{
args->content = strdup(content_val);
}
else
{
args->content = strdup("");
}
if (color_val)
{
args->color = strdup(color_val);
}
else
{
args->color = strdup("");
}
if (!args->deviceno || !args->content || !args->color)
{
if (args->deviceno)
free(args->deviceno);
if (args->content)
free(args->content);
if (args->color)
free(args->color);
free(args);
return;
}
cJSON_Delete(msg_recv);
if (lv_async_call(panel_add_obj_async_cb, args) != LV_RES_OK)
{
free(args->deviceno);
free(args->content);
free(args->color);
free(args);
}
}
else if (strcmp(topic, "E/DEL") == 0)
{
cJSON *msg_recv = cJSON_Parse(event->data);
if (msg_recv == NULL)
{
ESP_LOGE("MQTT_Json", "Json error");
return;
}
int msg_id_val = cJSON_GetNumberValue(cJSON_GetObjectItem(msg_recv, "msg_id"));
cJSON_Delete(msg_recv);
panel_del_args_t *args = (panel_del_args_t *)malloc(sizeof(panel_del_args_t));
if (!args)
return;
args->msg_id = msg_id_val;
if (lv_async_call(panel_del_obj_async_cb, args) != LV_RES_OK)
{
free(args);
}
}
break;
case MQTT_EVENT_ERROR:
ESP_LOGI(MQTT_TAG, "MQTT_EVENT_ERROR");
if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT)
{
log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err);
log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err);
log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno);
ESP_LOGI(MQTT_TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno));
}
break;
default:
ESP_LOGI(MQTT_TAG, "Other event id:%d", event->event_id);
break;
}
}
异步回调:
[C] 纯文本查看 复制代码 static void panel_add_obj_async_cb(void *user_data)
{
panel_add_obj_args_t *args = (panel_add_obj_args_t *)user_data;
panel_add_obj(args->msg_id,
args->deviceno,
args->content,
args->color,
args->priority);
if (args->deviceno)
free(args->deviceno);
if (args->content)
free(args->content);
if (args->color)
free(args->color);
free(args);
}
static void panel_del_obj_async_cb(void *user_data)
{
if (!user_data)
return;
panel_del_args_t *args = (panel_del_args_t *)user_data;
panel_del_obj(args->msg_id);
free(args);
}
实际操作LVGL部分:
[C] 纯文本查看 复制代码 void panel_add_obj(int msg_id, const char *deviceno, const char *content, const char *color, int priority)
{
Button_Data *Data = new Button_Data();
Data->msg_id = msg_id;
strlcpy(Data->color, color, sizeof(Data->color));
Data->priority = priority;
strlcpy(Data->deviceno, deviceno, sizeof(Data->deviceno));
strlcpy(Data->content, content, sizeof(Data->content));
char buffer[256];
snprintf(buffer, sizeof(buffer), "%s\n%s", deviceno, content);
if (strcmp(color, "red") == 0)
{
lv_label_set_text(lv_obj_get_child(msg_objR, 0), buffer);
lv_obj_set_user_data(msg_objR, Data);
if (lv_obj_has_flag(msg_objR, LV_OBJ_FLAG_HIDDEN))
{
lv_obj_clear_flag(msg_objR, LV_OBJ_FLAG_HIDDEN);
}
}
else if (strcmp(color, "orange") == 0)
{
lv_label_set_text(lv_obj_get_child(msg_objY, 0), buffer);
lv_obj_set_user_data(msg_objY, Data);
if (lv_obj_has_flag(msg_objY, LV_OBJ_FLAG_HIDDEN))
{
lv_obj_clear_flag(msg_objY, LV_OBJ_FLAG_HIDDEN);
}
}
}
void panel_del_obj(int msg_id)
{
uint32_t cnt = lv_obj_get_child_cnt(msg_panel);
for (uint32_t i = 0; i < cnt; i++)
{
lv_obj_t *msg_obj = lv_obj_get_child(msg_panel, i);
if (!msg_obj)
continue;
Button_Data *Data = (Button_Data *)lv_obj_get_user_data(msg_obj);
if (!Data)
{
ESP_LOGW("PANEL", "Found obj with NULL user_data");
continue;
}
if (Data->msg_id == msg_id)
{
lv_obj_add_flag(msg_obj, LV_OBJ_FLAG_HIDDEN);
return;
}
}
}
|
|