feat(device): 添加USB设备通信支持和程序参数优化
- 在AndroidManifest.xml中添加USB Host权限和设备过滤器配置 - 新增设备控制国际化词条包括速度档位、吹气时间等 - 重构数据库结构将速度相关字段统一为档位数值存储 - 添加通用KV存储方法用于settings表数据读写 - 优化首页导航实现tab间跳转和状态保持功能 - 更新程序详情页面布局和参数表单界面 - 移除模拟运行器相关测试代码 - 添加USB串口通信依赖包usb_serial
This commit is contained in:
@@ -20,7 +20,7 @@ class DatabaseService {
|
||||
|
||||
return await openDatabase(
|
||||
path,
|
||||
version: 2,
|
||||
version: 3,
|
||||
onCreate: _onCreate,
|
||||
onUpgrade: _onUpgrade,
|
||||
);
|
||||
@@ -34,7 +34,9 @@ class DatabaseService {
|
||||
code TEXT NOT NULL UNIQUE,
|
||||
name TEXT NOT NULL,
|
||||
created_at TEXT NOT NULL,
|
||||
status INTEGER DEFAULT 1
|
||||
status INTEGER DEFAULT 1,
|
||||
temperature INTEGER DEFAULT 50,
|
||||
airflow_time INTEGER DEFAULT 60
|
||||
)
|
||||
''');
|
||||
|
||||
@@ -49,10 +51,8 @@ class DatabaseService {
|
||||
mix_time INTEGER DEFAULT 0,
|
||||
magnet_time INTEGER DEFAULT 0,
|
||||
volume INTEGER DEFAULT 0,
|
||||
mix_speed TEXT DEFAULT '中速',
|
||||
blow_speed TEXT DEFAULT '中速',
|
||||
blow_time INTEGER DEFAULT 0,
|
||||
needle_speed INTEGER DEFAULT 5,
|
||||
speed INTEGER DEFAULT 5,
|
||||
FOREIGN KEY (program_id) REFERENCES programs(id) ON DELETE CASCADE
|
||||
)
|
||||
''');
|
||||
@@ -82,6 +82,15 @@ class DatabaseService {
|
||||
// 初始化默认密码
|
||||
await db.insert('settings', {'key': 'password', 'value': '123456'});
|
||||
}
|
||||
if (oldVersion < 3) {
|
||||
// v3: 重构字段
|
||||
// programs 增加 temperature, airflow_time
|
||||
await db.execute('ALTER TABLE programs ADD COLUMN temperature INTEGER DEFAULT 50');
|
||||
await db.execute('ALTER TABLE programs ADD COLUMN airflow_time INTEGER DEFAULT 60');
|
||||
// steps 删除 mix_speed, blow_speed, needle_speed;增加 speed
|
||||
// sqflite 不支持 DROP COLUMN,旧字段保留但不再使用
|
||||
await db.execute('ALTER TABLE steps ADD COLUMN speed INTEGER DEFAULT 5');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> close() async {
|
||||
@@ -91,6 +100,30 @@ class DatabaseService {
|
||||
}
|
||||
}
|
||||
|
||||
/// 通用 KV 读:读取 settings 表中 [key] 对应的 value;不存在返回 null
|
||||
Future<String?> readSetting(String key) async {
|
||||
final db = await database;
|
||||
final rows = await db.query(
|
||||
'settings',
|
||||
columns: ['value'],
|
||||
where: 'key = ?',
|
||||
whereArgs: [key],
|
||||
limit: 1,
|
||||
);
|
||||
if (rows.isEmpty) return null;
|
||||
return rows.first['value'] as String?;
|
||||
}
|
||||
|
||||
/// 通用 KV 写:以 INSERT OR REPLACE 写入 settings 表
|
||||
Future<void> writeSetting(String key, String value) async {
|
||||
final db = await database;
|
||||
await db.insert(
|
||||
'settings',
|
||||
{'key': key, 'value': value},
|
||||
conflictAlgorithm: ConflictAlgorithm.replace,
|
||||
);
|
||||
}
|
||||
|
||||
/// 初始化测试数据(仅调试模式使用)
|
||||
Future<void> initTestData() async {
|
||||
final db = await database;
|
||||
@@ -103,11 +136,11 @@ class DatabaseService {
|
||||
|
||||
// 插入测试程序并添加步骤
|
||||
final testPrograms = [
|
||||
{'code': 'P001', 'name': '标准检测程序', 'created_at': '2026-05-19', 'status': 1},
|
||||
{'code': 'P002', 'name': '快速检测程序', 'created_at': '2026-05-18', 'status': 1},
|
||||
{'code': 'P003', 'name': '深度检测程序', 'created_at': '2026-05-17', 'status': 1},
|
||||
{'code': 'P004', 'name': '样本预处理程序', 'created_at': '2026-05-16', 'status': 0},
|
||||
{'code': 'P005', 'name': '磁珠分离程序', 'created_at': '2026-05-15', 'status': 1},
|
||||
{'code': 'P001', 'name': '标准检测程序', 'created_at': '2026-05-19', 'status': 1, 'temperature': 50, 'airflow_time': 60},
|
||||
{'code': 'P002', 'name': '快速检测程序', 'created_at': '2026-05-18', 'status': 1, 'temperature': 45, 'airflow_time': 30},
|
||||
{'code': 'P003', 'name': '深度检测程序', 'created_at': '2026-05-17', 'status': 1, 'temperature': 60, 'airflow_time': 90},
|
||||
{'code': 'P004', 'name': '样本预处理程序', 'created_at': '2026-05-16', 'status': 0, 'temperature': 50, 'airflow_time': 60},
|
||||
{'code': 'P005', 'name': '磁珠分离程序', 'created_at': '2026-05-15', 'status': 1, 'temperature': 55, 'airflow_time': 60},
|
||||
];
|
||||
|
||||
for (final program in testPrograms) {
|
||||
@@ -123,10 +156,8 @@ class DatabaseService {
|
||||
'mix_time': 60,
|
||||
'magnet_time': 0,
|
||||
'volume': 100,
|
||||
'mix_speed': '中速',
|
||||
'blow_speed': '中速',
|
||||
'blow_time': 0,
|
||||
'needle_speed': 5,
|
||||
'speed': 5,
|
||||
},
|
||||
{
|
||||
'program_id': programId,
|
||||
@@ -136,10 +167,8 @@ class DatabaseService {
|
||||
'mix_time': 0,
|
||||
'magnet_time': 30,
|
||||
'volume': 0,
|
||||
'mix_speed': '中速',
|
||||
'blow_speed': '中速',
|
||||
'blow_time': 0,
|
||||
'needle_speed': 5,
|
||||
'speed': 5,
|
||||
},
|
||||
{
|
||||
'program_id': programId,
|
||||
@@ -149,10 +178,8 @@ class DatabaseService {
|
||||
'mix_time': 0,
|
||||
'magnet_time': 0,
|
||||
'volume': 0,
|
||||
'mix_speed': '中速',
|
||||
'blow_speed': '高速',
|
||||
'blow_time': 10,
|
||||
'needle_speed': 8,
|
||||
'speed': 8,
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ class AppLocalizations {
|
||||
String get running => _localizedValues[locale.languageCode]?['running'] ?? '运行中';
|
||||
String get idle => _localizedValues[locale.languageCode]?['idle'] ?? '未运行';
|
||||
String get lighting => _localizedValues[locale.languageCode]?['lighting'] ?? '照明';
|
||||
String get deviceControl => _localizedValues[locale.languageCode]?['deviceControl'] ?? '设备控制';
|
||||
|
||||
// 程序管理
|
||||
String get programs => _localizedValues[locale.languageCode]?['programs'] ?? '程序管理';
|
||||
@@ -33,13 +34,13 @@ class AppLocalizations {
|
||||
String get selectedProgram => _localizedValues[locale.languageCode]?['selectedProgram'] ?? '当前选中程序';
|
||||
String get selectedProgramLabel => _localizedValues[locale.languageCode]?['selectedProgramLabel'] ?? '当前选中';
|
||||
String get availablePrograms => _localizedValues[locale.languageCode]?['availablePrograms'] ?? '可用程序';
|
||||
String get ceramicNotInstalled => _localizedValues[locale.languageCode]?['ceramicNotInstalled'] ?? '瓷套棒: 未安装 — 禁止启动';
|
||||
String get ceramicInstalled => _localizedValues[locale.languageCode]?['ceramicInstalled'] ?? '瓷套棒: 已安装';
|
||||
String get runningMonitor => _localizedValues[locale.languageCode]?['runningMonitor'] ?? '运行状态监控';
|
||||
String get currentHole => _localizedValues[locale.languageCode]?['currentHole'] ?? '当前孔位';
|
||||
String get stepParams => _localizedValues[locale.languageCode]?['stepParams'] ?? '步骤参数';
|
||||
String get speed => _localizedValues[locale.languageCode]?['speed'] ?? '转速';
|
||||
String get speed => _localizedValues[locale.languageCode]?['speed'] ?? '速度';
|
||||
String get speedLevel => _localizedValues[locale.languageCode]?['speedLevel'] ?? '档';
|
||||
String get temperature => _localizedValues[locale.languageCode]?['temperature'] ?? '温度';
|
||||
String get airflowTime => _localizedValues[locale.languageCode]?['airflowTime'] ?? '吹气时间';
|
||||
String get duration => _localizedValues[locale.languageCode]?['duration'] ?? '持续时间';
|
||||
String get sampleVolume => _localizedValues[locale.languageCode]?['sampleVolume'] ?? '样品体积';
|
||||
String get pleaseSelectProgram => _localizedValues[locale.languageCode]?['pleaseSelectProgram'] ?? '请选择要运行的程序';
|
||||
@@ -54,6 +55,7 @@ class AppLocalizations {
|
||||
String get remainingTime => _localizedValues[locale.languageCode]?['remainingTime'] ?? '剩余时间';
|
||||
String get progress => _localizedValues[locale.languageCode]?['progress'] ?? '进度';
|
||||
String get ceramicSleeveConfirm => _localizedValues[locale.languageCode]?['ceramicSleeveConfirm'] ?? '运行前请确认已安装瓷套棒';
|
||||
String get ceramicSleeveConfirmMessage => _localizedValues[locale.languageCode]?['ceramicSleeveConfirmMessage'] ?? '请确认已放置瓷套棒后再启动程序。';
|
||||
String get paused => _localizedValues[locale.languageCode]?['paused'] ?? '已暂停';
|
||||
String get stopConfirm => _localizedValues[locale.languageCode]?['stopConfirm'] ?? '确定要停止当前运行的程序吗?';
|
||||
String get currentProgram => _localizedValues[locale.languageCode]?['currentProgram'] ?? '当前程序';
|
||||
@@ -68,15 +70,7 @@ class AppLocalizations {
|
||||
String get mixTime => _localizedValues[locale.languageCode]?['mixTime'] ?? '混合时间';
|
||||
String get magnetTime => _localizedValues[locale.languageCode]?['magnetTime'] ?? '吸磁时间';
|
||||
String get volume => _localizedValues[locale.languageCode]?['volume'] ?? '容积';
|
||||
String get mixSpeed => _localizedValues[locale.languageCode]?['mixSpeed'] ?? '混合速度';
|
||||
String get blowSpeed => _localizedValues[locale.languageCode]?['blowSpeed'] ?? '吹气速度';
|
||||
String get blowTime => _localizedValues[locale.languageCode]?['blowTime'] ?? '吹气时间';
|
||||
String get needleSpeed => _localizedValues[locale.languageCode]?['needleSpeed'] ?? '下针速度';
|
||||
|
||||
// 速度选项
|
||||
String get lowSpeed => _localizedValues[locale.languageCode]?['lowSpeed'] ?? '低速';
|
||||
String get mediumSpeed => _localizedValues[locale.languageCode]?['mediumSpeed'] ?? '中速';
|
||||
String get highSpeed => _localizedValues[locale.languageCode]?['highSpeed'] ?? '高速';
|
||||
|
||||
// 设置
|
||||
String get settings => _localizedValues[locale.languageCode]?['settings'] ?? '系统设置';
|
||||
@@ -140,6 +134,7 @@ class AppLocalizations {
|
||||
'running': '运行中',
|
||||
'idle': '未运行',
|
||||
'lighting': '照明',
|
||||
'deviceControl': '设备控制',
|
||||
'programs': '程序管理',
|
||||
'programList': '程序列表',
|
||||
'programName': '程序名称',
|
||||
@@ -153,13 +148,13 @@ class AppLocalizations {
|
||||
'selectedProgram': '当前选中程序',
|
||||
'selectedProgramLabel': '当前选中',
|
||||
'availablePrograms': '可用程序',
|
||||
'ceramicNotInstalled': '瓷套棒: 未安装 — 禁止启动',
|
||||
'ceramicInstalled': '瓷套棒: 已安装',
|
||||
'runningMonitor': '运行状态监控',
|
||||
'currentHole': '当前孔位',
|
||||
'stepParams': '步骤参数',
|
||||
'speed': '转速',
|
||||
'speed': '速度',
|
||||
'speedLevel': '档',
|
||||
'temperature': '温度',
|
||||
'airflowTime': '吹气时间',
|
||||
'duration': '持续时间',
|
||||
'sampleVolume': '样品体积',
|
||||
'pleaseSelectProgram': '请选择要运行的程序',
|
||||
@@ -172,6 +167,7 @@ class AppLocalizations {
|
||||
'remainingTime': '剩余时间',
|
||||
'progress': '进度',
|
||||
'ceramicSleeveConfirm': '运行前请确认已安装瓷套棒',
|
||||
'ceramicSleeveConfirmMessage': '请确认已放置瓷套棒后再启动程序。',
|
||||
'paused': '已暂停',
|
||||
'stopConfirm': '确定要停止当前运行的程序吗?',
|
||||
'currentProgram': '当前程序',
|
||||
@@ -184,13 +180,7 @@ class AppLocalizations {
|
||||
'mixTime': '混合时间',
|
||||
'magnetTime': '吸磁时间',
|
||||
'volume': '容积',
|
||||
'mixSpeed': '混合速度',
|
||||
'blowSpeed': '吹气速度',
|
||||
'blowTime': '吹气时间',
|
||||
'needleSpeed': '下针速度',
|
||||
'lowSpeed': '低速',
|
||||
'mediumSpeed': '中速',
|
||||
'highSpeed': '高速',
|
||||
'settings': '系统设置',
|
||||
'language': '语言设置',
|
||||
'password': '密码修改',
|
||||
@@ -245,6 +235,7 @@ class AppLocalizations {
|
||||
'running': 'Running',
|
||||
'idle': 'Idle',
|
||||
'lighting': 'Lighting',
|
||||
'deviceControl': 'Device Control',
|
||||
'programs': 'Programs',
|
||||
'programList': 'Program List',
|
||||
'programName': 'Program Name',
|
||||
@@ -258,13 +249,13 @@ class AppLocalizations {
|
||||
'selectedProgram': 'Selected Program',
|
||||
'selectedProgramLabel': 'Selected',
|
||||
'availablePrograms': 'Available Programs',
|
||||
'ceramicNotInstalled': 'Ceramic sleeve: Not installed — Cannot start',
|
||||
'ceramicInstalled': 'Ceramic sleeve: Installed',
|
||||
'runningMonitor': 'Running Status Monitor',
|
||||
'currentHole': 'Current Position',
|
||||
'stepParams': 'Step Parameters',
|
||||
'speed': 'Speed',
|
||||
'speedLevel': 'level',
|
||||
'temperature': 'Temperature',
|
||||
'airflowTime': 'Airflow Time',
|
||||
'duration': 'Duration',
|
||||
'sampleVolume': 'Sample Volume',
|
||||
'pleaseSelectProgram': 'Please select a program',
|
||||
@@ -277,6 +268,7 @@ class AppLocalizations {
|
||||
'remainingTime': 'Remaining',
|
||||
'progress': 'Progress',
|
||||
'ceramicSleeveConfirm': 'Please confirm ceramic sleeve is installed',
|
||||
'ceramicSleeveConfirmMessage': 'Please make sure the ceramic sleeve is in place before starting the program.',
|
||||
'paused': 'Paused',
|
||||
'stopConfirm': 'Are you sure to stop the running program?',
|
||||
'currentProgram': 'Current Program',
|
||||
@@ -289,13 +281,7 @@ class AppLocalizations {
|
||||
'mixTime': 'Mix Time',
|
||||
'magnetTime': 'Magnet Time',
|
||||
'volume': 'Volume',
|
||||
'mixSpeed': 'Mix Speed',
|
||||
'blowSpeed': 'Blow Speed',
|
||||
'blowTime': 'Blow Time',
|
||||
'needleSpeed': 'Needle Speed',
|
||||
'lowSpeed': 'Low',
|
||||
'mediumSpeed': 'Medium',
|
||||
'highSpeed': 'High',
|
||||
'settings': 'Settings',
|
||||
'language': 'Language',
|
||||
'password': 'Password',
|
||||
|
||||
@@ -15,7 +15,12 @@ final goRouterProvider = Provider<GoRouter>((ref) {
|
||||
GoRoute(
|
||||
path: '/',
|
||||
name: 'home',
|
||||
builder: (context, state) => const HomePage(),
|
||||
builder: (context, state) {
|
||||
// 支持 ?tab=N 查询参数,用于从其他页面跳回首页并切换到指定 tab
|
||||
final tabParam = state.uri.queryParameters['tab'];
|
||||
final initialTab = int.tryParse(tabParam ?? '') ?? 0;
|
||||
return HomePage(initialTab: initialTab);
|
||||
},
|
||||
),
|
||||
GoRoute(
|
||||
path: '/programs',
|
||||
|
||||
Reference in New Issue
Block a user