/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2025-10-20 Administrator the first version */ /* DATA_comm.c */ #include #include "cjson.h" #include #include #include #include "string.h" #include "data_comm.h" #include "language.h" #include "Variable.h" #include "SC828_DATA_table.h" rt_mq_t proc_mq; void proc_thread_entry(void *parameter) { struct proc_request *req; while (1) { // 接收请求指针 if (rt_mq_recv(proc_mq, &req, sizeof(req), RT_WAITING_FOREVER) == RT_EOK) { if (!req) continue; rt_kprintf("Processing: %.*s\n", req->input_len, req->input); rt_kprintf("Processing: %d\n", req->input_len); rt_kprintf("Processing: %s\n", req->input); memcpy(DATA_api,req->input,5); //DATA_api[5]="\0"; rt_kprintf("DATA_api: %s\n", DATA_api); extract_between(req->input, "[", "]", machine_ID, sizeof(machine_ID)); rt_kprintf("machine_ID: %s\n", machine_ID); // 示例处理:回显 req->output_len = rt_snprintf(req->output, sizeof(req->output), "Echo: %.*s", req->input_len, req->input); // 通知 UART 线程可以发送了 if (req->sem) { rt_sem_release(req->sem); } } } } // 变量 char *json_buffer=NULL; uint8_t cjson_falg=0;//是否解析cjson /** * 截取两个指定子串之间的内容 * @param src 源字符串 * @param start 起始子串 * @param end 结束子串 * @param buf 目标缓冲区 * @param buf_len 缓冲区大小 * @return 成功返回 0,失败返回 -1 */ int extract_between(const char *src, const char *start, const char *end, char *buf, size_t buf_len) { const char *p1, *p2; size_t len; p1 = strstr(src, start); if (!p1) return -1; p1 += strlen(start); // 跳过起始子串 p2 = strstr(p1, end); if (!p2) return -1; len = p2 - p1; if (len >= buf_len) len = buf_len - 1; memcpy(buf, p1, len); buf[len] = '\0'; return 0; } // 提取字符串并安全拷贝 #define GET_STRING(dst, obj, key, size) do { \ cJSON* _item = cJSON_GetObjectItem(obj, key); \ if (cJSON_IsString(_item) && _item->valuestring != NULL) { \ strncpy(dst, _item->valuestring, (size) - 1); \ (dst)[(size) - 1] = '\0'; \ } \ } while(0) // 提取浮点数 #define GET_FLOAT_VAR(var, obj, key, default_val) do { \ cJSON* _item = cJSON_GetObjectItem(obj, key); \ (var) = cJSON_IsNumber(_item) ? (float)_item->valuedouble : (default_val); \ } while(0) // 提取整数(int 类型) #define GET_INT_VAR(var, obj, key, default_val) do { \ cJSON* _item = cJSON_GetObjectItem(obj, key); \ (var) = cJSON_IsNumber(_item) ? (int)_item->valueint : (default_val); \ } while(0) // ===== cJSON分析 ===== void pasre_DAT(const char *api, const char *json_str) { cJSON *root=cJSON_Parse(json_str); cJSON *dat=cJSON_CreateObject(); if(json_buffer){ free(json_buffer); json_buffer=NULL; } if(strlen(json_str)>4){ cjson_falg=1; //判断json解析是否成功 if(!root) { printf("JSON parse error :%s\n",cJSON_GetErrorPtr()); cJSON_Delete(root); // return "JSON parse error\n"; }} if (strcmp(api, "SC800") == 0) { // 处理 SC800 cJSON_AddItemToObject(dat,"Name",cJSON_CreateString(machine_name)); cJSON_AddItemToObject(dat,"Station",cJSON_CreateString(machine_ID)); cJSON_AddItemToObject(dat,"SYSKEY",cJSON_CreateString(machine_ID)); cJSON_AddItemToObject(dat,"Groups",cJSON_CreateString(machine_ID)); } else if (strcmp(api, "SC810") == 0) { //工单明细 // === 解析整数变量 StepN === GET_INT_VAR(StepN, root, "StepN", 0); // 字符串赋值 GET_STRING(Work, root, "Work", sizeof(Work)); GET_STRING(Dye, root, "Dye", sizeof(Dye)); GET_STRING(StepID, root, "StepID", sizeof(StepID)); GET_STRING(SIDS1, root, "SIDS1", sizeof(SIDS1)); GET_STRING(SIDS2, root, "SIDS2", sizeof(SIDS2)); GET_STRING(SIDS3, root, "SIDS3", sizeof(SIDS3)); // 浮点数赋值 GET_FLOAT_VAR(P1, root, "P1", 0.0f); GET_FLOAT_VAR(P2, root, "P2", 0.0f); GET_FLOAT_VAR(P3, root, "P3", 0.0f); GET_FLOAT_VAR(P4, root, "P4", 0.0f); GET_FLOAT_VAR(P5, root, "P5", 0.0f); GET_FLOAT_VAR(P1S1, root, "P1S1", 0.0f); GET_FLOAT_VAR(P2S1, root, "P2S1", 0.0f); GET_FLOAT_VAR(P3S1, root, "P3S1", 0.0f); GET_FLOAT_VAR(P4S1, root, "P4S1", 0.0f); GET_FLOAT_VAR(P5S1, root, "P5S1", 0.0f); GET_FLOAT_VAR(P1S2, root, "P1S2", 0.0f); GET_FLOAT_VAR(P2S2, root, "P2S2", 0.0f); GET_FLOAT_VAR(P3S2, root, "P3S2", 0.0f); GET_FLOAT_VAR(P4S2, root, "P4S2", 0.0f); GET_FLOAT_VAR(P5S2, root, "P5S2", 0.0f); GET_FLOAT_VAR(P1S3, root, "P1S3", 0.0f); GET_FLOAT_VAR(P2S3, root, "P2S3", 0.0f); GET_FLOAT_VAR(P3S3, root, "P3S3", 0.0f); GET_FLOAT_VAR(P4S3, root, "P4S3", 0.0f); GET_FLOAT_VAR(P5S3, root, "P5S3", 0.0f); cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work)); cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye)); } else if (strcmp(api, "SC811") == 0) { printf("Processing:SC811\n"); } else if (strcmp(api, "SC812") == 0) { printf("Processing:SC812\n"); } else if (strcmp(api, "SC813") == 0) { printf("Processing:SC813\n"); } else if (strcmp(api, "SC820") == 0) { printf("Processing:SC820\n"); } else if (strcmp(api, "SC821") == 0) { printf("Processing:SC821\n"); } else if (strcmp(api, "SC822") == 0) { printf("Processing:SC822\n"); } else if (strcmp(api, "SC827") == 0) { printf("Processing:SC827\n"); } else if (strcmp(api, "SC828") == 0) { printf("Processing:SC828\n"); } else if (strcmp(api, "SC829") == 0) { printf("Processing:SC829\n"); } else if (strcmp(api, "SC830") == 0) { //当前信息 cJSON_AddItemToObject(dat,"ERR",cJSON_CreateBool(MACHINE_ERR)); cJSON_AddItemToObject(dat,"LOCK",cJSON_CreateBool(MACHINE_LOCK)); cJSON_AddItemToObject(dat,"Status",cJSON_CreateString(Message)); cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work)); cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye)); cJSON_AddItemToObject(dat,"Process",cJSON_CreateString(Process)); cJSON_AddItemToObject(dat,"Step",cJSON_CreateString(Step)); cJSON_AddItemToObject(dat,"User",cJSON_CreateBool(MACHINE_USER)); cJSON_AddItemToObject(dat,"InfoS",cJSON_CreateNumber(UserInfoStart)); cJSON_AddItemToObject(dat,"Info",cJSON_CreateString(Info)); cJSON_AddItemToObject(dat,"RUN",cJSON_CreateNumber(RUN)); cJSON_AddItemToObject(dat,"STEPID",cJSON_CreateNumber(STEPID)); cJSON_AddItemToObject(dat,"CALL",cJSON_CreateBool(MACHINE_CALL)); cJSON_AddItemToObject(dat,"MST",cJSON_CreateNumber(MST)); cJSON_AddItemToObject(dat,"MTT",cJSON_CreateNumber(MTT)); cJSON_AddItemToObject(dat,"MTL",cJSON_CreateNumber(MTL)); cJSON_AddItemToObject(dat,"MTH",cJSON_CreateNumber(MTH)); cJSON_AddItemToObject(dat,"MUT",cJSON_CreateNumber(MUT)); cJSON_AddItemToObject(dat,"STTA",cJSON_CreateNumber(STTA)); cJSON_AddItemToObject(dat,"STLA",cJSON_CreateNumber(STLA)); cJSON_AddItemToObject(dat,"STTB",cJSON_CreateNumber(STTB)); cJSON_AddItemToObject(dat,"STLB",cJSON_CreateNumber(STLB)); cJSON_AddItemToObject(dat,"STTC",cJSON_CreateNumber(STTC)); cJSON_AddItemToObject(dat,"STLC",cJSON_CreateNumber(STLC)); } else if (strcmp(api, "SC831") == 0) { //当前步骤信息 cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work)); cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye)); } else if (strcmp(api, "SC832") == 0) { //当前细节信息 cJSON_AddItemToObject(dat,"Pump",cJSON_CreateNumber(Pump));//泵 cJSON_AddItemToObject(dat,"TC",cJSON_CreateNumber(TC));//温度比例 cJSON_AddItemToObject(dat,"Fan",cJSON_CreateNumber(Fan));//风机 cJSON_AddItemToObject(dat,"Pull",cJSON_CreateNumber(Pull));//提布 cJSON_AddItemToObject(dat,"Swing",cJSON_CreateNumber(Swing));//摆布 cJSON_AddItemToObject(dat,"STA",cJSON_CreateNumber(STA));//料1 cJSON_AddItemToObject(dat,"STB",cJSON_CreateNumber(STB));//料2 cJSON_AddItemToObject(dat,"STC",cJSON_CreateNumber(STC));//料3 } else if (strcmp(api, "SC833") == 0) { //当前领料单信息 cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work)); cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye)); } else if (strcmp(api, "SC851") == 0) { //创建数组 cJSON *Dev = cJSON_CreateArray(); // for (int i = 0; i < DIO_TABLE_SIZE; i++) { cJSON* item = cJSON_CreateObject(); // 添加 IO 编号 cJSON_AddItemToObject(item, "P", cJSON_CreateNumber(dio_table[i].pin)); // 添加默认值 cJSON_AddItemToObject(item, "D", cJSON_CreateNumber(dio_table[i].current_state)); // 添加枚举名称(字符串形式) //cJSON_AddStringToObject(item, "str_enum_name", lang_get_str(dio_table[i].name)); // 将当前项添加到数组中 cJSON_AddItemToArray(Dev, item); } cJSON_AddItemToObject(dat,"DIO",Dev); } else if (strcmp(api, "SC852") == 0) { //创建数组 cJSON *Dev = cJSON_CreateArray(); for (int i = 0; i < AIO_TABLE_SIZE; i++) { cJSON* item = cJSON_CreateObject(); // 添加 IO 编号 cJSON_AddNumberToObject(item, "P", aio_table[i].pin); // 添加默认值 cJSON_AddNumberToObject(item, "A", aio_table[i].current_Value); // 将当前项添加到数组中 cJSON_AddItemToArray(Dev, item); } cJSON_AddItemToObject(dat,"A",Dev); } else if (strcmp(api, "SC853") == 0) { //创建数组 cJSON *Dev = cJSON_CreateArray(); for (int i = 0; i < DATA_TABLE_SIZE; i++) { cJSON* item = cJSON_CreateObject(); // 添加 IO 编号 cJSON_AddNumberToObject(item, "P", data_table[i].pin); // 添加默认值 cJSON_AddNumberToObject(item, "M", data_table[i].current_data); // 将当前项添加到数组中 cJSON_AddItemToArray(Dev, item); } cJSON_AddItemToObject(dat,"M",Dev); } else if (strcmp(api, "SC854") == 0) { printf("Processing:SC854\n"); } else if (strcmp(api, "SC855") == 0) { printf("Processing:SC855\n"); } else if (strcmp(api, "SC859") == 0) { printf("Processing:SC859\n"); } else if (strcmp(api, "SC861") == 0) { printf("Processing:SC861\n"); } else if (strcmp(api, "SC862") == 0) { printf("Processing:SC862\n"); } else {} //printf(dat); json_buffer=cJSON_PrintUnformatted(dat); cJSON_Delete(root); cJSON_Delete(dat); // return json_buffer; } int data_comm_init(void) { proc_mq = rt_mq_create("proc_mq", sizeof(struct proc_request*), 5, RT_IPC_FLAG_FIFO); if (proc_mq == RT_NULL) { rt_kprintf("Failed to create message queue!\n"); return -1; } rt_thread_t tid = rt_thread_create("data_comm", proc_thread_entry, RT_NULL, 1024*16, 20, 10); if (tid != RT_NULL) { rt_thread_startup(tid); } return 0; } //INIT_COMPONENT_EXPORT(data_comm_init);