diff --git a/applications/data/DATA_comm.c b/applications/data/DATA_comm.c index f1993f2..6696f53 100644 --- a/applications/data/DATA_comm.c +++ b/applications/data/DATA_comm.c @@ -30,6 +30,7 @@ struct rt_messagequeue *response_mq; // Proc → UART char cjson_falg=0;//是否解析cjson char *json_buffer=NULL;// +char select_data[1024] = {0}; /** * 截取两个指定子串之间的内容 * @param src 源字符串 @@ -377,7 +378,8 @@ void pasre_DAT(const char *api, const char *json_str) } else if (strcmp(api, "SC822") == 0) { - printf("Processing:SC822\n"); + db_send_select(DB_CMD_SELECT, "SELECT * FROM WorkOrderSet LIMIT 10;", 500,select_data); + cJSON_AddItemToObject(dat,"ERR",cJSON_CreateString(select_data)); } else if (strcmp(api, "SC827") == 0) { diff --git a/applications/data/SC828_DATA_table.c b/applications/data/SC828_DATA_table.c index 6e44801..eba805a 100644 --- a/applications/data/SC828_DATA_table.c +++ b/applications/data/SC828_DATA_table.c @@ -383,7 +383,7 @@ void table_thread_entry(void *parameter) { while (1) { - rt_thread_delay(1000); + rt_thread_delay(500); //Ai输入 MTT = get_ai_value(4001)/10.0f; diff --git a/applications/data/SC828_DATA_table.h b/applications/data/SC828_DATA_table.h index f1ad698..19e93ec 100644 --- a/applications/data/SC828_DATA_table.h +++ b/applications/data/SC828_DATA_table.h @@ -20,7 +20,50 @@ typedef struct { } IO_State_AIO; typedef struct { - int pin; // PLCID + char Dyelot[32]; // 单号 + int ReDye; + char *ProgramName; // 工艺 + int lock; + int State; + char *Remark; // +} WorkOrder_DATA; + +typedef struct { + char Dyelot[32]; // 单号 + int ReDye; + char *Mode; + char StepID[4]; + char *StepName; + char *ParameterName; + double P1; + double P2; + double P3; + double P4; + double P5; + int P6; + int P7; + int P8; + int P9; + int P10; + double P1_S1; + double P2_S1; + double P3_S1; + double P4_S1; + double P5_S1; + double P1_S2; + double P2_S2; + double P3_S2; + double P4_S2; + double P5_S2; + double P1_S3; + double P2_S3; + double P3_S3; + double P4_S3; + double P5_S3; +} Step_DATA; + +typedef struct { + int pin; // ID rt_int32_t current_data; // 当前状态 str_id_t name; // 名称(可选,用于调试) } IO_State_DATA; diff --git a/applications/data/Variable.c b/applications/data/Variable.c index 9f22193..5c92550 100644 --- a/applications/data/Variable.c +++ b/applications/data/Variable.c @@ -28,8 +28,8 @@ rt_bool_t MACHINE_CALL = 0; rt_bool_t MACHINE_USER = 0; // 字符串变量(RAM 中可修改) -char Work[25]="SC----------"; -char Dye[25]; +char Work[32]="SC----------"; +char Dye[32]; char Process[50]; char Message[40]; char Step[60]; diff --git a/applications/data/Variable.h b/applications/data/Variable.h index 976bb31..eb6e636 100644 --- a/applications/data/Variable.h +++ b/applications/data/Variable.h @@ -29,8 +29,8 @@ extern rt_bool_t MACHINE_CALL; extern rt_bool_t MACHINE_USER; // ===== 字符串 ===== -extern char Work[25]; -extern char Dye[25]; +extern char Work[32]; +extern char Dye[32]; extern char Process[50]; extern char Message[40]; extern char Step[60]; diff --git a/applications/sql/DB_SQLite.c b/applications/sql/DB_SQLite.c index b117331..e9382c3 100644 --- a/applications/sql/DB_SQLite.c +++ b/applications/sql/DB_SQLite.c @@ -18,6 +18,7 @@ #define DB_NAME "/sddisk/SC828.db" int db_HelperInit; rt_mq_t db_mq = RT_NULL; // +struct db_command cmd; #define DBG_TAG "dat_sql" #define DBG_LVL DBG_LOG @@ -96,62 +97,80 @@ static void return_disabled(struct db_command *cmd) { * @brief SELECT 查询回调函数 */ static int callback(void *result_str, int argc, char **argv, char **azColName) { - char *str = (char *)result_str; - int len = rt_strlen(str); - for (int i = 0; i < argc; i++) { - rt_snprintf(str + len, MAX_RESULT_LEN - len, "%s=%s|", - azColName[i], argv[i] ? argv[i] : "NULL"); - len = rt_strlen(str); + //char *buf = (char *)result_str; + int written = rt_strlen(result_str); // 当前已写入长度(假设 buf 是 \0 结尾的) + int remaining = MAX_RESULT_LEN - written - 1; // -1 留给最终 \0 + + if (remaining <= 0) { + return 0; // 缓冲区已满,不再写入 + } + + for (int i = 0; i < argc && remaining > 0; i++) { + const char *val = argv[i] ? argv[i] : "NULL"; + // 预估所需长度(保守估计) + int needed = rt_strlen(azColName[i]) + rt_strlen(val) + 2; // + "=...\0" 至少 2 字节(= 和 |) + + if (needed > remaining) { + break; // 空间不足,停止 + } + + int n = rt_snprintf(result_str + written, remaining + 1, "%s=%s|", azColName[i], val); + if (n < 0 || n > remaining) { + break; // 写入失败或超限 + } + + written += n; + remaining -= n; } + //buf[MAX_RESULT_LEN - 1] = '\0'; // 强制终止,防止意外 return 0; } /** * @brief 执行具体 SQL 操作 */ -static void handle_db_command(struct db_command *cmd) { +static void handle_db_command(struct db_command *cmd_dat) { char *err_msg = 0; int rc; - switch (cmd->type) + switch (cmd_dat->type) { case DB_CMD_INSERT: case DB_CMD_DELETE: case DB_CMD_UPDATE: case DB_CMD_EXEC: - rc = sqlite3_exec(g_db, cmd->sql, 0, 0, &err_msg); + rc = sqlite3_exec(g_db, cmd_dat->sql, 0, 0, &err_msg); if (rc != SQLITE_OK) { - cmd->result_code = rc; - rt_strncpy(cmd->result, err_msg, MAX_RESULT_LEN - 1); + cmd_dat->result_code = rc; + rt_strncpy(cmd_dat->result, err_msg, MAX_RESULT_LEN - 1); sqlite3_free(err_msg); } else { - cmd->result_code = 0; - rt_strncpy(cmd->result, "OK", MAX_RESULT_LEN - 1); + cmd_dat->result_code = 0; + rt_strncpy(cmd_dat->result, "OK", MAX_RESULT_LEN - 1); } break; case DB_CMD_SELECT: - cmd->result[0] = '\0'; - rc = sqlite3_exec(g_db, cmd->sql, callback, cmd->result, &err_msg); + cmd_dat->result[0] = '\0'; + rc = sqlite3_exec(g_db, cmd_dat->sql, callback, cmd_dat->result, &err_msg); if (rc != SQLITE_OK) { - cmd->result_code = rc; - rt_strncpy(cmd->result, err_msg, MAX_RESULT_LEN - 1); + cmd_dat->result_code = rc; + rt_strncpy(cmd_dat->result, err_msg, MAX_RESULT_LEN - 1); sqlite3_free(err_msg); } else { - cmd->result_code = 0; - if (cmd->result[0] == '\0') - rt_strncpy(cmd->result, "No data", MAX_RESULT_LEN - 1); + cmd_dat->result_code = 0; + if (cmd_dat->result[0] == '\0')rt_strncpy(cmd_dat->result, "No data", MAX_RESULT_LEN - 1); } break; case DB_CMD_EXIT: - rt_strncpy(cmd->result, "Exit", MAX_RESULT_LEN - 1); - cmd->result_code = 0; + rt_strncpy(cmd_dat->result, "Exit", MAX_RESULT_LEN - 1); + cmd_dat->result_code = 0; break; default: - cmd->result_code = -1; - rt_strncpy(cmd->result, "Invalid command", MAX_RESULT_LEN - 1); + cmd_dat->result_code = -1; + rt_strncpy(cmd_dat->result, "Invalid command", MAX_RESULT_LEN - 1); break; } } @@ -257,7 +276,7 @@ void db_sqlite_init_full(void) * @brief 数据库处理线程入口函数 */ static void db_sqlite(void *parameter) { - struct db_command cmd; + // struct db_command cmd; rt_tick_t max_wait_ticks = rt_tick_from_millisecond(DB_MAX_WAITING_MS); // 检查并初始化数据库文件 @@ -357,9 +376,9 @@ static void db_sqlite(void *parameter) { rt_mutex_release(state_mutex); //执行命令 handle_db_command(&cmd); - //返回结果 - if (cmd.reply_sem != RT_NULL) { + if (cmd.reply_sem != RT_NULL) + { rt_sem_release(cmd.reply_sem); } @@ -402,7 +421,7 @@ rt_err_t db_send_command(enum db_cmd_type type, const char* sql, rt_int32_t time return -RT_EINVAL; } - struct db_command cmd; + //struct db_command cmd; rt_sem_t sem = rt_sem_create("db_rep", 0, RT_IPC_FLAG_FIFO); if (sem == RT_NULL) { return -RT_ENOMEM; @@ -437,6 +456,53 @@ rt_err_t db_send_command(enum db_cmd_type type, const char* sql, rt_int32_t time return result; } +rt_err_t db_send_select(enum db_cmd_type type, const char* sql, rt_int32_t timeout_ms, char *result_out) +{ + if (!sql || !db_mq) { + return -RT_EINVAL; + } + + // struct db_command cmd; + rt_sem_t sem = rt_sem_create("db_rep", 0, RT_IPC_FLAG_FIFO); + if (sem == RT_NULL) { + return -RT_ENOMEM; + } + + // 初始化命令结构体 + rt_memset(&cmd, 0, sizeof(cmd)); + cmd.type = type; + rt_strncpy(cmd.sql, sql, MAX_SQL_LEN - 1); + cmd.reply_sem = sem; + cmd.send_tick = rt_tick_get(); + + // 发送命令到数据库线程队列 + if (rt_mq_send(db_mq, &cmd, sizeof(cmd)) != RT_EOK) { + rt_sem_delete(sem); + return -RT_ERROR; + } + + // 计算等待 tick + rt_int32_t wait_ticks; + if (timeout_ms == RT_WAITING_FOREVER) { + wait_ticks = RT_WAITING_FOREVER; + } else if (timeout_ms <= 0) { + wait_ticks = 0; + } else { + wait_ticks = rt_tick_from_millisecond(timeout_ms); + } + + // 等待数据库线程处理完成 + rt_err_t result = rt_sem_take(sem, wait_ticks); + + // 如果调用者提供了 result_out 缓冲区,且是 SELECT 或需要结果,则拷贝 + if (result == RT_EOK) { + rt_strncpy(result_out, cmd.result, MAX_RESULT_LEN - 1); + result_out[MAX_RESULT_LEN - 1] = '\0'; + } + rt_sem_delete(sem); + return result; +} + extern struct rt_memheap sram_DTCMRAM; static struct rt_thread dat_sqlite_thread; static void *dat_sqlite_stack __attribute__((aligned(4)))= RT_NULL ; diff --git a/applications/sql/DB_SQLite.h b/applications/sql/DB_SQLite.h index 3d8794b..bd4315b 100644 --- a/applications/sql/DB_SQLite.h +++ b/applications/sql/DB_SQLite.h @@ -116,6 +116,7 @@ void close_db_immediately(void); * @return RT_EOK 成功,RT_ETIMEOUT 超时,RT_ERROR 失败 */ rt_err_t db_send_command(enum db_cmd_type type, const char* sql, rt_int32_t timeout_ms); +rt_err_t db_send_select(enum db_cmd_type type, const char* sql, rt_int32_t timeout_ms, char *result_out); #ifdef __cplusplus } diff --git a/drivers/ltdc.c b/drivers/ltdc.c index 55ddbf9..697a806 100644 --- a/drivers/ltdc.c +++ b/drivers/ltdc.c @@ -458,7 +458,7 @@ int ltdc_init(void) lcdltdc.pwidth = 1024; lcdltdc.pheight = 600; lcdltdc.hsw = 20; lcdltdc.hbp = 160; lcdltdc.hfp = 160; lcdltdc.vsw = 3; lcdltdc.vbp = 23; lcdltdc.vfp = 12; - ltdc_clk_set(128, 32, 8); + ltdc_clk_set(128, 32, 7); } else if (lcdid == 0X7018) {