diff --git a/mw/has_task_msg_manager/has_task_msg.h b/mw/has_task_msg_manager/has_task_msg.h index 13f6a56..d149092 100644 --- a/mw/has_task_msg_manager/has_task_msg.h +++ b/mw/has_task_msg_manager/has_task_msg.h @@ -19,8 +19,8 @@ typedef enum { /* 模块 和 订阅数量一定要写,完全不加入表中的模块,或订阅数量为0的模块无法接收消息 */ #define SUBSCIBE_INFO \ { \ - {GUI, 2, {ACM, VOICE}}, \ - {SENSOR, 1, {ACM}}, \ + {GUI, 4, {ACM, SENSOR, WIFI, VOICE}}, \ + {SENSOR, 1, {GUI}}, \ {ACM, 1, {WIFI}}, \ {WIFI, 0}, \ {VOICE, 3, {ACM, VOICE, GUI}}, \ diff --git a/mw/has_task_msg_manager/msg_example.c b/mw/has_task_msg_manager/msg_example.c new file mode 100644 index 0000000..f4e729b --- /dev/null +++ b/mw/has_task_msg_manager/msg_example.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include +#include + +#include "has_task_msg.h" + +/* -------------------------- gui.c -------------------------- */ +int gui_handle_cb(unsigned char module_id, const unsigned char *buf, unsigned int len) +{ + switch (module_id) + { + case GUI: // 允许自己给自己发消息 + printf("GUI 正在处理模块 %d 的消息 消息长度:%d 数据[0]:%x\n", module_id, len, buf[0]); + break; + case SENSOR: + printf("GUI 正在处理模块 %d 的消息 消息长度:%d 数据[0]:%x\n", module_id, len, buf[0]); + break; + case ACM: + printf("GUI 正在处理模块 %d 的消息 消息长度:%d 数据[0]:%x\n", module_id, len, buf[0]); + break; + case WIFI: + printf("GUI 正在处理模块 %d 的消息 消息长度:%d 数据[0]:%x\n", module_id, len, buf[0]); + break; + case VOICE: + printf("GUI 正在处理模块 %d 的消息 消息长度:%d 数据[0]:%x\n", module_id, len, buf[0]); + break; + + default: + break; + } +} +void *gui_function(void *arg) +{ + uint8_t gui_publish_buffer1[5] = {1, 2, 3, 4, 5}; // GUI发布的数据1 + uint8_t gui_publish_buffer2[5] = {2, 7, 8, 9, 10}; // GUI发布的数据2 + uint8_t gui_publish_buffer3[5] = {3, 12, 13, 14, 15}; // GUI发布的数据3 + + has_msg_publish(GUI, gui_publish_buffer1, sizeof(gui_publish_buffer1)); // GUI发布消息 + has_msg_publish(GUI, gui_publish_buffer2, sizeof(gui_publish_buffer2)); // GUI发布第二条消息 + has_msg_publish(GUI, gui_publish_buffer3, sizeof(gui_publish_buffer3)); // GUI发布第三条消息 + while (1) + { + usleep(500 * 1000); + has_msg_handle(GUI, gui_handle_cb); // 处理一条GUI收到的消息,先入先出 + } +} + +/* -------------------------- sensor.c -------------------------- */ +int sensor_handle_cb(unsigned char module_id, const unsigned char *buf, unsigned int len) +{ + printf("SENSOR 正在处理模块 %d 的消息 消息长度:%d 数据[0]:%x\n", module_id, len, buf[0]); +} +void *sensor_function(void *arg) +{ + const has_module_ID_e moude_ID = SENSOR; + uint8_t sensor_publish_buffer1[5] = {1, 4, 3, 2, 1}; // SENSOR发布的数据 + uint8_t sensor_publish_buffer2[5] = {2, 9, 8, 7, 6}; // SENSOR发布的数据 + + has_msg_publish(moude_ID, sensor_publish_buffer1, sizeof(sensor_publish_buffer1)); // SENSOR发布消息 + has_msg_publish(moude_ID, sensor_publish_buffer2, sizeof(sensor_publish_buffer2)); // SENSOR发布第二条消息 + while (1) + { + usleep(500 * 1000); + has_msg_handle(moude_ID, sensor_handle_cb); // 处理一条SENSOR收到的消息,先入先出 + has_msg_handle_latest(moude_ID, sensor_handle_cb); // 处理一条SENSOR最新收到的消息 + if (has_msg_is_message_empty(moude_ID) != 0) // 判断是否还有消息未处理 + { + printf("模块:%d 还有%d条消息待处理\n", moude_ID, has_msg_get_message_number(moude_ID)); + } + has_msg_handle_by_module(moude_ID, sensor_handle_cb, GUI); // 处理一条SENSOR收到来自GUI的消息,先入先出,不处理其他模块发布的消息 + has_msg_delete_all_message(moude_ID); // 删除SENSOR收到但还未处理的所有消息 + } +} + +int main(int argc, char const *argv[]) +{ + pthread_t threads1; + pthread_t threads2; + + int result; + has_module_ID_e moude_ID; // 每个模块有属于自己的ID号 + + printf("hello\n"); + has_msg_init(); // 消息初始化 + + /* -------------------------- gui -------------------------- */ + result = pthread_create(&threads1, NULL, gui_function, NULL); + if (result != 0) + { + perror("创建线程失败"); + return EXIT_FAILURE; + } + /* ---------------------------------------------------- */ + + /* -------------------------- sensor -------------------------- */ + result = pthread_create(&threads2, NULL, sensor_function, NULL); + if (result != 0) + { + perror("创建线程失败"); + return EXIT_FAILURE; + } + /* ---------------------------------------------------- */ + + while (1) + { + sleep(5); + } + + return EXIT_SUCCESS; +}