实现 IN / LEFT / RIGHT 三指令状态机:IN 在任何界面都进入摄像头识别入库模式;识别成功后自动新增记录并跳转到该食材的信息卡片;信息页中 LEFT/RIGHT 循环浏览历史入库记录;再次收到 IN 立即退出浏览并重新进入摄像头识别。 就定三个串口指令:
IN // 中间键:进入/重新进入识别入库 LEFT // 左键:查看上一条入库记录 RIGHT // 右键:查看下一条入库记录
系统只保留两个主要状态:
STATE_CAMERA STATE_RECORD
流程就是:
上电 ↓ 待机/首页
收到 IN ↓ STATE_CAMERA 打开摄像头 LCD显示实时画面 提示:请将食材放入识别区域 ↓ 识别稳定 ↓ food = tomato confidence = 96% ↓ 生成入库记录 ↓ STATE_RECORD ↓ LCD自动显示:
[西红柿图片] 西红柿 入库时间:09-19 12:35 已存放:0天 3 / 6
进入 STATE_RECORD 后:
LEFT ↓ index-- ↓ 显示上一条食材
RIGHT ↓ index++ ↓ 显示下一条食材
然后不管你当前正在看哪条:
收到 IN ↓ 立即退出记录浏览 ↓ STATE_CAMERA ↓ 重新打开摄像头开始识别
这点非常好,因为用户完全不用“返回主页再入库”,中间键永远就是:
我要扫一个新的食材。
我建议边界再定死一点:
CAMERA状态: IN → 重新开始一次识别 LEFT → 忽略 RIGHT → 忽略
RECORD状态: IN → CAMERA LEFT → 上一条 RIGHT → 下一条
如果浏览到最左边,再按 LEFT,我推荐循环到最后一个;最右边按 RIGHT,循环回第一个:
1 / 6 LEFT ↓ 6 / 6
6 / 6 RIGHT ↓ 1 / 6
这样操作比“到边界不能动”更顺。
内部其实只需要:
enum UiState { STATE_CAMERA, STATE_RECORD };
int current_index; int record_count;
识别成功:
add_food_record(...); current_index = record_count - 1; state = STATE_RECORD; show_record(current_index);
左键:
current_index = (current_index - 1 + record_count) % record_count;
右键:
current_index = (current_index + 1) % record_count;
IN:
state = STATE_CAMERA; start_camera();