exfat支持修复。添加uart框架中控485端口功能完成
This commit is contained in:
1 parent
43f2057b44
commit
fd04893625
17 files changed
+1269
-648
No files matched your search
@@ -101,42 +101,44 @@ void pasre_DAT(const char *api, const char *json_str)
|
||||
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, "SC811") == 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));
|
||||
cJSON_AddItemToObject(dat,"StepN",cJSON_CreateNumber(StepN));
|
||||
}
|
||||
else if (strcmp(api, "SC812") == 0) {
|
||||
printf("Processing:SC812\n");
|
||||
@@ -295,18 +297,22 @@ void proc_thread_entry(void *parameter)
|
||||
if (!req) continue;
|
||||
memcpy(DATA_api,req->input,5);
|
||||
extract_between(req->input, "[", "]", machine_ID, sizeof(machine_ID));
|
||||
|
||||
|
||||
char *p=strstr(req->input,"]");
|
||||
if(!p){cjson_falg=0;}
|
||||
else {
|
||||
p += strlen("]");
|
||||
}
|
||||
|
||||
//处理指令分析
|
||||
pasre_DAT(DATA_api,p);
|
||||
// 回复
|
||||
int16_t total_len = strlen(machine_ID) + strlen(json_buffer) + 8;
|
||||
char t_buffer[total_len];
|
||||
snprintf(t_buffer,total_len,"%s[%s]%s",DATA_api,machine_ID,json_buffer);
|
||||
snprintf(t_buffer,total_len,"%s[%s]%s\n",DATA_api,machine_ID,json_buffer);
|
||||
req->output_len = rt_snprintf(req->output, sizeof(req->output),t_buffer);
|
||||
|
||||
// 通知 UART 线程可以发送了
|
||||
if (req->sem)
|
||||
{
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#define APPLICATIONS_DATA_COMM_H_
|
||||
|
||||
// 最大输入/输出长度
|
||||
#define MAX_INPUT_LEN 1024
|
||||
#define MAX_INPUT_LEN 512
|
||||
#define MAX_OUTPUT_LEN 1024*3
|
||||
|
||||
// 请求结构体
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#define SAMPLE_UART_NAME "uart2"
|
||||
#define DMA_RX_BUF_SIZE 512
|
||||
#define RINGBUF_SIZE 4096
|
||||
#define RINGBUF_SIZE 1024
|
||||
|
||||
static rt_device_t serial;
|
||||
|
||||
@@ -74,21 +74,14 @@ void uart_thread_entry(void *parameter)
|
||||
{
|
||||
// 处理接收到的数据(提取完整行)
|
||||
while ((len = get_line(input, sizeof(input))) > 0)
|
||||
{ // 调试:打印每个字节
|
||||
/* rt_kprintf("Len=%d, Data: ", len);
|
||||
for (int i = 0; i < len; i++) {
|
||||
rt_kprintf("[%02X '%c'] ", input[i],
|
||||
(input[i] >= 32 && input[i] < 127) ? input[i] : '.');
|
||||
}
|
||||
rt_kprintf("\n");
|
||||
|
||||
rt_kprintf("Received: [%.*s]\n", len, input);*/
|
||||
{
|
||||
// 动态分配请求结构体(见之前完整代码)
|
||||
struct proc_request *req = rt_malloc(sizeof(struct proc_request));
|
||||
if (!req) continue;
|
||||
|
||||
rt_strncpy(req->input, input, sizeof(req->input));
|
||||
req->input_len = len;
|
||||
//req->input[len]='\0';
|
||||
|
||||
req->sem = rt_malloc(sizeof(struct rt_semaphore));
|
||||
if (!req->sem) {
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2025-10-25 Administrator the first version
|
||||
*/
|
||||
# include <rtthread.h>
|
||||
# include <rtdevice.h>
|
||||
# include <board.h>
|
||||
# include <stdio.h>
|
||||
#include "uart_framework.h"
|
||||
#include "data_comm.h"
|
||||
|
||||
#define LOG_TAG "uart.rx"
|
||||
#define LOG_LVL LOG_LVL_DBG
|
||||
//#include <ulog.h>
|
||||
|
||||
#define UART_NAME "uart2"
|
||||
#define UART_BAUD_RATE BAUD_RATE_115200
|
||||
|
||||
#define RS485RD GET_PIN(A,10)
|
||||
#define RS485_RX() rt_pin_write(RS485RD, 0)
|
||||
#define RS485_TX() rt_pin_write(RS485RD, 1)
|
||||
|
||||
#define RECV_BUF_SIZE (512)
|
||||
#define FRAME_TIMEOUT_MS 20
|
||||
#define SEND_INTERVAL_MS 0
|
||||
#define REQUEST_TIMEOUT_MS 250
|
||||
|
||||
static uart_framework_t uf = RT_NULL;
|
||||
|
||||
static void rs485_set_tx(void)
|
||||
{
|
||||
RS485_TX();
|
||||
rt_thread_mdelay(1);
|
||||
}
|
||||
|
||||
static void rs485_set_rx(void)
|
||||
{
|
||||
rt_thread_mdelay(1);
|
||||
RS485_RX();
|
||||
}
|
||||
|
||||
static void rs485_gpio_init(void)
|
||||
{
|
||||
rt_pin_mode(RS485RD, PIN_MODE_OUTPUT);
|
||||
rs485_set_rx();
|
||||
}
|
||||
|
||||
static rt_err_t uart_rs485_init(void)
|
||||
{
|
||||
rt_device_t serial_device = rt_device_find(UART_NAME);
|
||||
if (serial_device == RT_NULL)
|
||||
{
|
||||
rt_kprintf("not find the serial device:%s!", UART_NAME);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
/* 修改串口配置 */
|
||||
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
|
||||
config.baud_rate = UART_BAUD_RATE;
|
||||
config.bufsz = RECV_BUF_SIZE; // 接收缓冲区大小
|
||||
rt_device_control(serial_device, RT_DEVICE_CTRL_CONFIG, &config);
|
||||
|
||||
rs485_gpio_init();
|
||||
struct uart_framework_cfg cfg = { .uart_name = UART_NAME, .max_frame_size = RECV_BUF_SIZE, .frame_interval_ms =
|
||||
FRAME_TIMEOUT_MS, .send_interval_ms = SEND_INTERVAL_MS, .rs485_txd = rs485_set_tx, .rs485_rxd = rs485_set_rx };
|
||||
//如果不是485,则配置rs485_txd和rs485_rxd为RT_NULL
|
||||
|
||||
uf = uart_framework_create(&cfg);
|
||||
if (uf == RT_NULL)
|
||||
{
|
||||
rt_kprintf("SCCM link create failed on %s\n", UART_NAME);
|
||||
return -RT_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("SCCM link create success on %s!\n", UART_NAME);
|
||||
return RT_EOK;
|
||||
}
|
||||
}
|
||||
|
||||
static rt_err_t frame_handler(rt_uint8_t *data, rt_size_t size)
|
||||
{
|
||||
//解析数据
|
||||
rt_err_t res;
|
||||
struct proc_request *req = rt_malloc(sizeof(struct proc_request));
|
||||
if (!req){ return RT_ERROR;}
|
||||
rt_strncpy(req->input, (const char *)data, sizeof(req->input));
|
||||
req->input_len = size;
|
||||
req->sem = rt_malloc(sizeof(struct rt_semaphore));
|
||||
|
||||
if (!req->sem) {
|
||||
rt_free(req);
|
||||
return RT_ERROR;
|
||||
}
|
||||
|
||||
rt_sem_init(req->sem, "uart_resp", 0, RT_IPC_FLAG_FIFO);
|
||||
|
||||
// 发送到处理线程
|
||||
if (rt_mq_send(proc_mq, &req, sizeof(req)) == RT_EOK)
|
||||
{
|
||||
// 等待处理完成
|
||||
if (rt_sem_take(req->sem, RT_WAITING_FOREVER) == RT_EOK)
|
||||
{
|
||||
res= uart_framework_send(uf, (rt_uint8_t *)req->output, req->output_len);
|
||||
}
|
||||
}
|
||||
// 清理
|
||||
rt_sem_detach(req->sem); // 或 rt_sem_delete
|
||||
rt_free(req->sem);
|
||||
rt_free(req);
|
||||
|
||||
//这里直接返回接收到的数据
|
||||
// rt_uint8_t *frame_data = data;
|
||||
// rt_uint16_t frame_len = size;
|
||||
// rt_kprintf("rx_buf", 16, frame_data, frame_len);
|
||||
// rt_err_t res = uart_framework_send(uf, frame_data, frame_len);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void rs485_rx_handler(void *params)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
if(uart_framework_receive(uf, RT_WAITING_FOREVER, RT_NULL, RT_NULL, 0) == RT_EOK)
|
||||
{
|
||||
frame_handler(uf->rx_buf, uf->rx_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int app_uart_rs485_startup(void)
|
||||
{
|
||||
rt_err_t rst;
|
||||
rst = uart_rs485_init();
|
||||
if (rst != RT_EOK)
|
||||
return rst;
|
||||
|
||||
rt_thread_t t = rt_thread_create("rs485rx", rs485_rx_handler, RT_NULL, 1024 * 4, 12, 20);
|
||||
if (t == RT_NULL)
|
||||
return -RT_ENOMEM;
|
||||
|
||||
rst = rt_thread_startup(t);
|
||||
|
||||
return rst;
|
||||
}
|
||||
//INIT_APP_EXPORT(app_uart_rs485_startup);
|
||||
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2025-10-25 Administrator the first version
|
||||
*/
|
||||
#ifndef APPLICATIONS_DATA_UART_RS485_H_
|
||||
#define APPLICATIONS_DATA_UART_RS485_H_
|
||||
|
||||
int app_uart_rs485_startup(void);
|
||||
|
||||
#endif /* APPLICATIONS_DATA_UART_RS485_H_ */
|
||||
+250
-16
@@ -10,25 +10,262 @@
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include <board.h>
|
||||
#include <dfs_posix.h>
|
||||
#include "DB_SQLite.h"
|
||||
|
||||
#include "sqlite3.h"
|
||||
#include <dbhelper.h>
|
||||
#define DB_NAME "/rt.db"
|
||||
#define DB_NAME "/SC828.db"
|
||||
int db_HelperInit;
|
||||
sqlite3 **db;
|
||||
|
||||
static const char *sql_upgrade_workorder_steps =
|
||||
"CREATE TABLE WorkorderSteps ("
|
||||
"WorkOrder VARCHAR,"
|
||||
"DYELOT VARCHAR,"
|
||||
"ProgramID VARCHAR,"
|
||||
"Program VARCHAR,"
|
||||
"ReDye INT DEFAULT (0),"
|
||||
"Mode VARCHAR,"
|
||||
"Step INT,"
|
||||
"StepID VARCHAR,"
|
||||
"StepName VARCHAR,"
|
||||
"ParameterName VARCHAR,"
|
||||
"Parameter1 DOUBLE,"
|
||||
"Parameter2 DOUBLE,"
|
||||
"Parameter3 DOUBLE,"
|
||||
"Parameter4 DOUBLE,"
|
||||
"Parameter5 DOUBLE,"
|
||||
"Parameter6 INT,"
|
||||
"Parameter7 INT,"
|
||||
"Parameter8 INT,"
|
||||
"Parameter9 INT,"
|
||||
"Parameter10 INT,"
|
||||
"Remark VARCHAR,"
|
||||
"StepTime INT,"
|
||||
"StepID_S1 VARCHAR,"
|
||||
"StepID_S2 VARCHAR,"
|
||||
"StepID_S3 VARCHAR,"
|
||||
"StepName_S1 VARCHAR,"
|
||||
"StepName_S2 VARCHAR,"
|
||||
"StepName_S3 VARCHAR,"
|
||||
"Parameter1_S1 DOUBLE,"
|
||||
"Parameter1_S2 DOUBLE,"
|
||||
"Parameter1_S3 DOUBLE,"
|
||||
"Parameter2_S1 DOUBLE,"
|
||||
"Parameter2_S2 DOUBLE,"
|
||||
"Parameter2_S3 DOUBLE,"
|
||||
"Parameter3_S1 DOUBLE,"
|
||||
"Parameter3_S2 DOUBLE,"
|
||||
"Parameter3_S3 DOUBLE,"
|
||||
"Parameter4_S1 DOUBLE,"
|
||||
"Parameter4_S2 DOUBLE,"
|
||||
"Parameter4_S3 DOUBLE,"
|
||||
"Parameter5_S1 DOUBLE,"
|
||||
"Parameter5_S2 DOUBLE,"
|
||||
"Parameter5_S3 DOUBLE"
|
||||
"); ";
|
||||
|
||||
static const char *sql_upgrade_workorder_set =
|
||||
"CREATE TABLE WorkOrderSet ("
|
||||
"WorkOrder VARCHAR,"
|
||||
"ReDye INT DEFAULT (0),"
|
||||
"PumpSpeed INT,"
|
||||
"Blower INT,"
|
||||
"Swing INT,"
|
||||
"ClothWheel INT,"
|
||||
"Nozzle INT"
|
||||
"); ";
|
||||
|
||||
static const char *sql_upgrade_workorder =
|
||||
"CREATE TABLE WorkOrder ("
|
||||
"WorkOrder VARCHAR,"
|
||||
"Dyelot VARCHAR,"
|
||||
"ReDye INT DEFAULT (0),"
|
||||
"ProgramName VARCHAR,"
|
||||
"StartTime DATETIME,"
|
||||
"EndTime DATETIME,"
|
||||
"Time TEXT,"
|
||||
"lock INT,"
|
||||
"State INT,"
|
||||
"ProgramID VARCHAR,"
|
||||
"Machines VARCHAR,"
|
||||
"color VARCHAR,"
|
||||
"ColorNumber VARCHAR,"
|
||||
"Client VARCHAR,"
|
||||
"ClothWeight VARCHAR,"
|
||||
"ClothSpecies VARCHAR,"
|
||||
"BathRatio VARCHAR,"
|
||||
"Total VARCHAR,"
|
||||
"USER VARCHAR,"
|
||||
"ColorName VARCHAR,"
|
||||
"Remark TEXT"
|
||||
"); ";
|
||||
|
||||
static const char *sql_upgrade_run_table =
|
||||
// "PRAGMA foreign_keys = OFF; "
|
||||
// "BEGIN TRANSACTION; "
|
||||
// "CREATE TABLE sqlitestudio_temp_table AS SELECT * FROM RUN; "
|
||||
// "DROP TABLE RUN; "
|
||||
"CREATE TABLE RUN ("
|
||||
"WorkOrder VARCHAR,"
|
||||
"DYELOT VARCHAR,"
|
||||
"ReDye INT DEFAULT (0),"
|
||||
"RUN INT,"
|
||||
"Mode VARCHAR,"
|
||||
"ProgramID VARCHAR,"
|
||||
"Program VARCHAR,"
|
||||
"StepID VARCHAR,"
|
||||
"Step INT,"
|
||||
"StepName VARCHAR,"
|
||||
"ParameterName VARCHAR,"
|
||||
"Parameter1 DOUBLE,"
|
||||
"Parameter2 DOUBLE,"
|
||||
"Parameter3 DOUBLE,"
|
||||
"Parameter4 DOUBLE,"
|
||||
"Parameter5 DOUBLE,"
|
||||
"Parameter6 INT,"
|
||||
"Parameter7 INT,"
|
||||
"Parameter8 INT,"
|
||||
"Parameter9 INT,"
|
||||
"Parameter10 INT,"
|
||||
"Remark VARCHAR,"
|
||||
"StepTime INT,"
|
||||
"StepID_S1 VARCHAR,"
|
||||
"StepID_S2 VARCHAR,"
|
||||
"StepID_S3 VARCHAR,"
|
||||
"StepName_S1 VARCHAR,"
|
||||
"StepName_S2 VARCHAR,"
|
||||
"StepName_S3 VARCHAR,"
|
||||
"Parameter1_S1 DOUBLE,"
|
||||
"Parameter1_S2 DOUBLE,"
|
||||
"Parameter1_S3 DOUBLE,"
|
||||
"Parameter2_S1 DOUBLE,"
|
||||
"Parameter2_S2 DOUBLE,"
|
||||
"Parameter2_S3 DOUBLE,"
|
||||
"Parameter3_S1 DOUBLE,"
|
||||
"Parameter3_S2 DOUBLE,"
|
||||
"Parameter3_S3 DOUBLE,"
|
||||
"Parameter4_S1 DOUBLE,"
|
||||
"Parameter4_S2 DOUBLE,"
|
||||
"Parameter4_S3 DOUBLE,"
|
||||
"Parameter5_S1 DOUBLE,"
|
||||
"Parameter5_S2 DOUBLE,"
|
||||
"Parameter5_S3 DOUBLE"
|
||||
");";
|
||||
|
||||
static const char *sql_upgrade_dyelot_table =
|
||||
"CREATE TABLE Dyelot ("
|
||||
"WorkOrder VARCHAR,"
|
||||
"Dyelot VARCHAR,"
|
||||
"ReDye INT,"
|
||||
"Machine VARCHAR,"
|
||||
"Step INT,"
|
||||
"Tank INT,"
|
||||
"State INT,"
|
||||
"ProductCode VARCHAR,"
|
||||
"ProductName VARCHAR,"
|
||||
"ProductType INT,"
|
||||
"Grams FLOAT,"
|
||||
"Amount FLOAT,"
|
||||
"CALL_TIME VARCHAR,"
|
||||
"DispenseEndTime VARCHAR,"
|
||||
"Type INT"
|
||||
"); ";
|
||||
|
||||
static const char *sql_upgrade_iolog_table =
|
||||
// "CREATE TABLE sqlitestudio_temp_table AS SELECT * FROM IOLog; "
|
||||
// "DROP TABLE IOLog; "
|
||||
"CREATE TABLE IOLog ("
|
||||
"ID varchar(32),"
|
||||
"IOName varchar(32),"
|
||||
"type varchar(32),"
|
||||
"Value DOUBLE DEFAULT (0),"
|
||||
"DIO BOOLEAN,"
|
||||
"AIO INTEGER DEFAULT (0),"
|
||||
"PLC varchar(32)"
|
||||
"); ";
|
||||
|
||||
static const char *sql_upgrade_chart_table =
|
||||
"CREATE TABLE Chart ("
|
||||
"WorkOrder varchar(32),"
|
||||
"DYELOT varchar(32),"
|
||||
"ReDye INTEGER ,"
|
||||
"Name varchar(32),"
|
||||
"Time varchar(32),"
|
||||
"MTT DOUBLE DEFAULT (0),"
|
||||
"MTL DOUBLE DEFAULT (0),"
|
||||
"STTA DOUBLE DEFAULT (0),"
|
||||
"STLA DOUBLE DEFAULT (0),"
|
||||
"STTB DOUBLE DEFAULT (0),"
|
||||
"STLB DOUBLE DEFAULT (0),"
|
||||
"STTC DOUBLE DEFAULT (0),"
|
||||
"STLC DOUBLE DEFAULT (0),"
|
||||
"MTH DOUBLE DEFAULT (0),"
|
||||
"MST DOUBLE DEFAULT (0),"
|
||||
"MSL DOUBLE DEFAULT (0),"
|
||||
"MUT DOUBLE DEFAULT (0)"
|
||||
"); ";
|
||||
|
||||
void db_sqlite(void *parameter)
|
||||
{
|
||||
int db_HelperInit;
|
||||
int db_;
|
||||
|
||||
db_HelperInit = db_helper_init();
|
||||
|
||||
if(db_HelperInit =RT_EOK){
|
||||
rt_kprintf("HelperInit database\n");
|
||||
}else {
|
||||
// db_ = db_create_database("CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);");
|
||||
// if(db_=0){rt_kprintf("database ok\n");}else{rt_kprintf("database no\n");}
|
||||
if (access(DB_NAME, F_OK) == 0)
|
||||
{
|
||||
rt_kprintf("DB open\n");
|
||||
if (db_connect(DB_NAME) == RT_EOK){
|
||||
if(db_table_is_exist("WorkorderSteps")<=0){
|
||||
if(db_create_database(sql_upgrade_workorder_steps)==0)
|
||||
{rt_kprintf("WorkorderSteps Created successfully \n");}else{rt_kprintf("WorkorderSteps Creation failed \n");}
|
||||
}
|
||||
if(db_table_is_exist("WorkOrderSet")<=0){
|
||||
if(db_create_database(sql_upgrade_workorder_set)==0)
|
||||
{rt_kprintf("WorkOrderSet Created successfully \n");}else{rt_kprintf("WorkOrderSet Creation failed \n");}
|
||||
}
|
||||
if(db_table_is_exist("WorkOrder")<=0){
|
||||
if(db_create_database(sql_upgrade_workorder)==0)
|
||||
{rt_kprintf("WorkOrder Created successfully \n");}else{rt_kprintf("WorkOrder Creation failed \n");}
|
||||
}
|
||||
if(db_table_is_exist("RUN")<=0){
|
||||
if(db_create_database(sql_upgrade_run_table)==0)
|
||||
{rt_kprintf("RUN Created successfully \n");}else{rt_kprintf("RUN Creation failed \n");}
|
||||
}
|
||||
if(db_table_is_exist("Dyelot")<=0){
|
||||
if(db_create_database(sql_upgrade_dyelot_table)==0)
|
||||
{rt_kprintf("Dyelot Created successfully \n");}else{rt_kprintf("Dyelot Creation failed \n");}
|
||||
}
|
||||
if(db_table_is_exist("IOLog")<=0){
|
||||
if(db_create_database(sql_upgrade_iolog_table)==0)
|
||||
{rt_kprintf("IOLog Created successfully \n");}else{rt_kprintf("IOLog Creation failed \n");}
|
||||
}
|
||||
if(db_table_is_exist("Chart")<=0){
|
||||
if(db_create_database(sql_upgrade_chart_table)==0)
|
||||
{rt_kprintf("Chart Created successfully \n");}else{rt_kprintf("Chart Creation failed \n");}
|
||||
}
|
||||
}else{
|
||||
rt_kprintf("DB open failed \n");
|
||||
}
|
||||
|
||||
}else{
|
||||
rt_kprintf("DB open failed \n");
|
||||
sqlite3_open(DB_NAME, db);
|
||||
//创建表
|
||||
db_create_database(sql_upgrade_workorder_steps);
|
||||
db_create_database(sql_upgrade_workorder_set);
|
||||
db_create_database(sql_upgrade_workorder);
|
||||
db_create_database(sql_upgrade_run_table);
|
||||
db_create_database(sql_upgrade_dyelot_table);
|
||||
db_create_database(sql_upgrade_iolog_table);
|
||||
db_create_database(sql_upgrade_chart_table);
|
||||
}
|
||||
|
||||
|
||||
// db_HelperInit = db_helper_init();
|
||||
// if(db_HelperInit =RT_EOK){
|
||||
// rt_kprintf("HelperInit database\n");
|
||||
// }else {
|
||||
// sqlite3_open(DB_NAME, db);
|
||||
// db_ = db_create_database("CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);");
|
||||
// if(db_=0){rt_kprintf("database ok\n");}else{rt_kprintf("database no\n");}
|
||||
// }
|
||||
/* int fd = 0;
|
||||
const char *dbname = db_get_name();
|
||||
fd = open(dbname, O_RDONLY);
|
||||
@@ -36,15 +273,12 @@ void db_sqlite(void *parameter)
|
||||
rt_kprintf("%s exist\r\n", dbname);
|
||||
else
|
||||
rt_kprintf("%s not exist\r\n");
|
||||
|
||||
|
||||
const char *sql = "CREATE TABLE IF NOT EXISTS student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);";
|
||||
rt_kprintf("sql cmd: %s\r\n\r\n", sql);
|
||||
int ret = db_create_database(sql);
|
||||
rt_kprintf("sql ret: %d\r\n", ret);*/
|
||||
|
||||
// sqlite3_os_init();
|
||||
|
||||
/* int rc = db_connect("/rt.db");
|
||||
if (rc <0) {
|
||||
const char *sql = "CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(32) NOT NULL,score INT NOT NULL);";
|
||||
@@ -57,7 +291,7 @@ void thread_DB_SQLite(void)
|
||||
{
|
||||
/* 初始化线程 1,名称是 thread1,入口是 thread1_entry*/
|
||||
rt_thread_t tid;
|
||||
tid = rt_thread_create("db_sqlite", db_sqlite, RT_NULL, 1024*32, 3, 10);
|
||||
tid = rt_thread_create("db_sqlite", db_sqlite, RT_NULL, 1024*64, 3, 15);
|
||||
|
||||
if (tid != RT_NULL)
|
||||
{
|
||||
|
||||
+2
-4
@@ -16,7 +16,7 @@
|
||||
#include "RUN_LED.h"
|
||||
#include "DB_SQLite.h"
|
||||
#include "DATA_comm.h"
|
||||
#include "DATA_uart.h"
|
||||
#include "uart_rs485.h"
|
||||
|
||||
#define DBG_TAG "main"
|
||||
#define DBG_LVL DBG_LOG
|
||||
@@ -28,10 +28,8 @@ int main(void)
|
||||
rt_sem_take(mount_sem, rt_tick_from_millisecond(5000)); // 等待挂载完成,最多等待 5 秒
|
||||
thread_RUN_LED();//运行指示灯线程
|
||||
thread_DB_SQLite();
|
||||
|
||||
start_uart_thread();
|
||||
data_comm_init();
|
||||
|
||||
app_uart_rs485_startup();
|
||||
|
||||
|
||||
return RT_EOK;
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2025-10-22 Administrator the first version
|
||||
*/
|
||||
#include "dfs_fs.h"
|
||||
#include <rtdbg.h>
|
||||
#include <board.h>
|
||||
#include"drv_common.h"
|
||||
|
||||
#define DBG_TAG "sd_cd"
|
||||
#define DBG_LVL DBG_LOG
|
||||
#include <rtdbg.h>
|
||||
|
||||
// ==================== 配置参数 ====================
|
||||
#define SD_DEVICE_NAME "sd0"
|
||||
#define MOUNT_POINT "/"
|
||||
|
||||
// CD 引脚配置(根据你的 BSP 修改)
|
||||
#define CD_PIN GET_PIN(A, 0) // 示例:PA0,根据实际修改!
|
||||
|
||||
// 消息类型
|
||||
#define SD_EVENT_INSERTED 1
|
||||
#define SD_EVENT_REMOVED 2
|
||||
|
||||
// ===============================================
|
||||
static rt_mq_t sd_event_mq = RT_NULL;
|
||||
static rt_sem_t mount_sync_sem = RT_NULL;
|
||||
|
||||
/**
|
||||
* @brief CD 引脚中断回调
|
||||
*/
|
||||
void cd_pin_irq(void *param)
|
||||
{
|
||||
rt_uint8_t event;
|
||||
rt_base_t level = rt_hw_interrupt_disable();
|
||||
|
||||
// 读取当前电平
|
||||
int pin_level = rt_pin_read(CD_PIN);
|
||||
|
||||
if (pin_level == PIN_HIGH)
|
||||
{
|
||||
rt_kprintf("SD Card removed (CD high)\n");
|
||||
event = SD_EVENT_REMOVED;
|
||||
}
|
||||
else // PIN_LOW
|
||||
{
|
||||
rt_kprintf("SD Card inserted (CD low)\n");
|
||||
event = SD_EVENT_INSERTED;
|
||||
}
|
||||
|
||||
// 发送事件到消息队列
|
||||
if (sd_event_mq != RT_NULL)
|
||||
{
|
||||
rt_mq_send(sd_event_mq, &event, 1);
|
||||
}
|
||||
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化 CD 引脚为外部中断模式
|
||||
*/
|
||||
int cd_pin_init(void)
|
||||
{
|
||||
rt_pin_mode(CD_PIN, PIN_MODE_INPUT_PULLUP); // 内部上拉
|
||||
rt_pin_attach_irq(CD_PIN, PIN_IRQ_MODE_FALLING | PIN_IRQ_MODE_RISING, cd_pin_irq, RT_NULL);
|
||||
rt_pin_irq_enable(CD_PIN, ENABLE); // 使能中断
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 处理 SD 卡插拔事件的主线程
|
||||
*/
|
||||
void sd_card_event_thread(void *parameter)
|
||||
{
|
||||
uint8_t event;
|
||||
rt_bool_t mounted = RT_FALSE;
|
||||
|
||||
rt_kprintf("SD card event thread started...\n");
|
||||
|
||||
while (1)
|
||||
{
|
||||
// 等待事件
|
||||
if (rt_mq_recv(sd_event_mq, &event, 1, RT_WAITING_FOREVER) != RT_EOK)
|
||||
continue;
|
||||
|
||||
switch (event)
|
||||
{
|
||||
case SD_EVENT_INSERTED:
|
||||
if (!mounted)
|
||||
{
|
||||
rt_kprintf("Initializing and mounting SD card...\n");
|
||||
|
||||
// 等待设备 ready(可选)
|
||||
rt_thread_mdelay(100);
|
||||
|
||||
// 尝试挂载
|
||||
if (dfs_mount(SD_DEVICE_NAME, MOUNT_POINT, "elm", 0, 0) == RT_EOK)
|
||||
{
|
||||
rt_kprintf("SD card mounted to %s\n", MOUNT_POINT);
|
||||
mounted = RT_TRUE;
|
||||
|
||||
// 通知其他模块可以使用 SD 卡
|
||||
if (mount_sync_sem)
|
||||
rt_sem_release(mount_sync_sem);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("Failed to mount SD card\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SD_EVENT_REMOVED:
|
||||
if (mounted)
|
||||
{
|
||||
if (dfs_unmount(MOUNT_POINT) == 0)
|
||||
{
|
||||
rt_kprintf("SD card unmounted\n");
|
||||
mounted = RT_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("Unmount failed or not mounted\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 启动 SD 卡热插拔检测
|
||||
*/
|
||||
int stm32_sdcard_hotplug_init(void)
|
||||
{
|
||||
rt_thread_t tid;
|
||||
|
||||
// 创建事件消息队列
|
||||
sd_event_mq = rt_mq_create("sd_event", 1, 10, RT_IPC_FLAG_FIFO);
|
||||
if (sd_event_mq == RT_NULL)
|
||||
{
|
||||
rt_kprintf("Failed to create message queue for SD event!\n");
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
|
||||
// 创建同步信号量(可选,用于通知挂载完成)
|
||||
mount_sync_sem = rt_sem_create("sd_mount", 0, RT_IPC_FLAG_FIFO);
|
||||
|
||||
// 创建事件处理线程
|
||||
tid = rt_thread_create("sd_event",
|
||||
sd_card_event_thread,
|
||||
RT_NULL,
|
||||
2048,
|
||||
RT_THREAD_PRIORITY_MAX - 2,
|
||||
10);
|
||||
if (tid != RT_NULL)
|
||||
{
|
||||
rt_thread_startup(tid);
|
||||
LOG_I("SD event thread created\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("Failed to create SD event thread!\n");
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
//INIT_COMPONENT_EXPORT(cd_pin_init);
|
||||
//INIT_APP_EXPORT(stm32_sdcard_hotplug_init);
|
||||
Reference in new issue
Block a user