按键 + “打开应用” + 目标应用
选择要使用的按键和想打开的应用,例如计算器或备忘录。
把功能做小,把流程跑全。依靠 AI,让实体按键多出一个“打开应用”的动作(Host Action),并把测试、构建、烧录与真机结果逐层分开。
最终结果很具体:在 EasyInput App 里给一个按键选择“打开应用”并同步;以后按下这个按键,电脑就打开已经选好的目标应用。接下来的所有操作,都只是在保证这条链路可靠成立。
先不要从代码和术语开始。从 App 里设置按键,到电脑最终打开应用,其实是一条连续的软件协同链路。第一次把对应关系保存好以后,后面的每次按键都会从这条链路中间继续向下走。
顺着蓝色连线从上往下看:App 和固件会用同一个 UUID 认出同一个动作,但它们各自保存的信息不同。
选择要使用的按键和想打开的应用,例如计算器或备忘录。
它像这次动作的专属识别码,不是目标应用自己的编号,也不需要手动输入。
格式示例:123e4567-e89b-12d3-a456-426614174000
UUID → 目标应用应用名称和安装位置留在电脑端。App 以后收到这个 UUID,就知道要打开哪个应用。
UUID固件只需要记住这个按键对应哪个 UUID,不需要知道应用名称和安装位置。
从这里开始: 下面 5 步会在每次按键时发生
按键只负责产生一次按下动作。
固件从已经保存的按键配置里找到 UUID。
有线或无线发送相同内容;双连接时不能重复发送。
App 用电脑本地保存的对应关系找到目标应用。
真正执行“打开应用”的是电脑端 App。
下一次按键,再从“按下按键”继续
按键时到底发送什么?发送内容的关键部分只有 UUID。它不会再次带上按键名称或按键属性,也不会带上目标应用的名称和安装位置。
开发板开机后,固件一直在运行。本次 Host Action v1 接入就在当前固件项目中完成。
全称是 Universally Unique Identifier,中文可理解为“通用唯一标识符”。在这里,它让 App 和固件认出同一个动作,不是目标应用自己的编号。
编号放在哪里、一次发送多长、按下和松开时分别做什么,都已经约好,不能让 AI 临时换一种写法。
软件协同,就是两个程序各自负责一部分,再按共同约好的规则交换信息。Host Action v1 已经确定;固件发送的编号、长度或时机只要有一项不同,即使代码检查通过、固件也成功写进开发板,两端仍然无法正确配合。
后面的深色区域是给 AI 的完整执行要求,不需要逐字理解。提示词只固定三类不能猜的内容:Host Action v1、开发板安全、写入授权;路径、文件名、测试数量、构建目录、工具安装位置和 App 小版本由 AI 先读取当前环境再决定。版本号显示不同不等于失败,只有工程声明不兼容、必需入口缺失或真实验证失败才停下。每段提示词下方的“为什么要这样要求 AI”不会一起复制。
先让 AI 只读固件项目,确认哪些地方不能动,再检查修改前的代码能否正常通过电脑检查并生成固件。
先确认 AI 打开的就是当前固件项目,也确认原项目本来能正常工作。这样后面出现问题时,才知道是不是这次修改造成的。
把目标、边界、决定、问题和结果留在项目里,换一个 AI 对话也能从这里继续。
本次在这个固件项目中完成 Host Action v1 接入。代码检查、修改和生成固件都从这里进行。
核对板型、按键、电源和写入安全边界,防止 AI 把通用经验误用到当前开发板。
检查开发环境、生成固件、识别目标开发板,并在得到确认后完成写入。
开始前先看清
固件项目固件是开发板开机后运行的程序。这里的代码、说明和电脑检查都放在同一个项目文件夹里,它是本次固件侧开发对象。
不能随便改的硬件按键接在哪里、怎样供电、程序写在哪里、电脑怎样识别这块板,都已经由当前开发板决定。第一步先让 AI 把这些边界说清楚。
把下面的提示词复制给 AI。这一步只让它查看固件项目,确认按键代码在哪里,以及当前开发板哪些地方不能随意改。
AI 先认清了项目和开发板,后面才不会把其他 ESP32 板子的做法误用到这块板上。
如果 AI 已经开始改代码、跑到其他项目,或没有说清哪些硬件不能动,先不往下做,重新执行本步。
开始前先看清
修改前的正常起点(基线)先证明原项目本来能够正常通过检查。后面再出错时,才知道问题是不是这次修改造成的。
电脑检查与生成固件电脑侧逻辑检查(宿主测试)先检查代码规则;生成固件(构建)再把代码变成可以写入开发板的文件。两项通过都不代表已经写进开发板。
让 AI 对原项目运行一次电脑侧逻辑检查,再生成一次固件。此时仍然不改代码,也不写入开发板。
先证明源码和环境原本正常,后续才能判断新失败是否由这次修改引起。
AI 返回本轮实际发现的测试总数,并确认清单中的项目全部通过;固件生成成功;检查过程没有修改代码。测试总数以当前 Git 基线的真实清单为准,不为了匹配页面凑固定数字。
只要有检查未通过、固件无法生成,或验证过程改了代码,就先停下来查原因,不进入新功能修改。
开始前先看清
一次按键的动作路径按键被按下后,固件先找到这个键对应的动作,再生成一条内部消息,最后选择有线或无线连接发给电脑。这里先让 AI 找出这条已经存在的路径。
让 AI 选一个现在已经能用的按键动作,从按下开始,一直找到它通过有线或无线发到电脑的路。
新动作必须接入已有流程;跳过理解直接新增并行路径,最容易破坏原功能或造成双发。
AI 用一条清楚的箭头链说明:按下按键 → 找到这个键的动作 → 生成内部消息 → 选择有线或无线 → 发到电脑,并给出对应的代码位置。
如果 AI 只说了一堆名词,却没有说清路径和代码位置,就先让它继续查找,不开始修改。
App 已经按页面开头的固定格式接收动作,所以这里先让 AI 记住同一份格式,再在电脑上完成动作逻辑,暂时不碰真实开发板。
开始前先看清
打开应用动作(Host Action)这是开发板发给电脑的一次动作请求。EasyInput App 收到后,才会真正打开已经选好的应用。
UUID(动作的唯一标识)与固定消息格式(协议)App 会为动作自动生成 UUID。固件只按已经约好的格式保存和发送 UUID,不需要知道应用路径,也不能让 AI 临时改写格式。
AI 会这样读取 · 不用背
host_action:<UUID>
host_action动作类型:告诉固件“这不是复制或输入文字,而是一个应用动作”。
:分隔符:把左边的动作类型和右边的 UUID 分开。
<UUID>占位符:宿主测试可以使用固定示例,真机验收使用 EasyInput App 同步的实际 UUID;尖括号只是说明位置,不要照着输入。
整句意思:配置层保存一个应用动作,它的编号是右边这个 UUID。真正发送给 App 时会去掉 host_action: 前缀,只发送 UUID。
把页面开头的固定消息格式一起交给 AI,让它与当前固件项目核对,再记进项目。这一步只做核对和记录,不改代码。
EasyInput App 已经按这个格式接收动作,而这里又不能改 App。因此固件必须遵守同一格式,AI 不能现场另造一套。
AI 确认页面开头的固定格式与当前项目没有冲突,已经把它记进项目,并明确说本步没有修改代码。具体编号和字段由 AI 逐项核对,不需要人背诵。
如果 AI 说固定格式与项目有冲突,先保留它给出的位置和原因,不进入修改。如果它已经改了代码,或只给方案却没有留下项目记录,也重新执行本步。
开始前先看清
先在电脑上检查动作逻辑这一阶段只检查 UUID 是否有效、按下时会产生什么消息,不连接有线、无线或真实开发板。这样出错时更容易找到原因。
把提示词复制给 AI,让它先核对上一步记下的固定格式,再在电脑上实现并检查打开应用动作。这时不连接真实开发板。
先测纯逻辑,失败只会落在格式、解析、事件或消息这一小块;如果一开始同时接入传输和硬件,错误范围会变得很大。
如果固定格式没有读到、UUID 检查未通过,或 AI 已经提前改了有线、无线代码,先停在这一步,不用临时加新规则来凑出通过结果。
开始前先看清
八个实体键固件里把八个主要按键写成 KEY1 到 KEY8。这里要确认每一个键都能使用打开应用动作,而不是只让示例按键生效。
按下发送,松开不重复一次完整按键动作包含按下和松开。打开应用只在按下时发送一次,同时还要确认复制、粘贴等原有动作没有被破坏。
AI 会这样读取 · 不用背
"press": "host_action:123e4567-e89b-12d3-a456-426614174000"
"press"配置名称:指定“按键被按下时”要执行什么。
:把配置名称和配置内容分开;双引号与冒号都是这行配置需要保留的符号。
"host_action:…"配置内容:动作类型后面接 UUID。这里的固定编号只用于验证固件会不会正确解析,不能直接代表某个本机应用。
整句意思:这个按键被按下时,发送一次编号为该 UUID 的应用动作。
让 AI 确认八个实体键都能选择打开应用动作,按下只执行一次,松开不重复;同时重新检查复制、粘贴等原有动作。
只测一个键,不能代表八个键都能用。新动作加进去后,原有动作也必须保持正常。
只验证一个键、配置进入 Keymap 后丢失 host_action: 前缀、松开又产生第二个动作、旧按键回归失败,或把测试 UUID 写进生产配置,都不算完成。如果通用解析本来已经覆盖八个键,用完整测试证据确认即可,不强迫 AI 改生产代码。
有线和无线都能把动作送到电脑,但两种连接同时存在时,一次按键仍然只能执行一次。固件还要告诉 App:这个动作已经可用。
说明电脑上可验证的代码逻辑符合当前测试。
说明源码能生成可写入开发板的固件文件。
说明固件文件已经写入目标开发板。
说明真实按键、通道与 App 共同完成了目标动作。
开始前先看清
有线连接与无线连接USB 是有线连接,BLE 是低功耗蓝牙无线连接。两种连接都发送同一个 UUID;同时连接时,同一次按键也只能发送一次。
继续使用现有发送路径固件项目已经有把消息送到电脑的路径。这一步让 AI 把新动作接进去,不重新设计连接方式,也不要求理解内部的队列、路由或 GATT。
AI 会核对这三个值 · 不用背
Report ID 0x11 · kind 0x05 · UUID 36 bytes
0x110x 表示十六进制写法;这里是报告类型的固定编号,只需准确核对,不要求换算。
0x05应用动作的固定类别编号。0x04 已经用于状态响应,不能拿来表示 Host Action。
36 bytes标准 UUID 的 36 个英文字符会占 36 字节;数据区不带 host_action: 前缀。
整句意思:发送一条编号为 0x11 的报告,里面装的是 0x05 类应用动作和 36 字节 UUID。63 字节是现有消息容器,Host Action 的有效数据仍然只有这 36 字节。
让 AI 把已经通过电脑检查的动作,接进项目现有的有线和无线发送路径。两条路发送的内容必须完全一样。
复用既有消息通道可以减少新协议面;同时必须沿用工程原本的 USB/BLE 选择逻辑,避免双连接双发。
如果有线和无线各写了一套动作内容,或两种连接同时存在时可能执行两次,就先停下修正。如果 AI 把电脑检查说成真机成功,也不进入下一步。
开始前先看清
支持标记(能力声明)固件会给 App 一份功能清单。这里增加一个“已经支持打开应用动作”的标记,让 App 知道这个功能可以使用。
无线状态消息的大小上限新增标记以后,固件发给 App 的状态消息仍不能超过原有的 512 字节空间。具体怎样压缩和计算交给 AI,不能为塞进新字段随意删除原有内容。
AI 会这样读取 · 不用背
"host_action_v1": true
"host_action_v1"功能名称;v1 表示这套消息约定的第 1 版。
:把左边的功能名称和右边的支持状态分开;双引号与冒号需要保留。
true布尔值,也就是只有“是/否”的开关值;这里表示“支持”。它不是带引号的普通文字。
整句意思:固件告诉 App:“我支持第 1 版 Host Action。”
让 AI 在固件的功能清单中加入“已支持打开应用动作”的标记,再检查加完后的无线状态消息是否还放得下。
App 需要先知道固件已经支持这个动作,才能正确开放功能。新标记还不能挤掉原有的电源和扬声器状态。
过程中可能先看到“消息太大”的失败,原提示词已经告诉 AI 怎样收紧可选内容,让它继续修复并重跑即可。如果最终仍超过 512 字节,或原有的电源、扬声器信息被删掉,就停在这里,不自己另编新格式,也不只改检查来制造通过。
开始前先看清
当前清单全部通过测试总数以本轮 CTest 实际发现的清单为准。只有发现数、执行数和通过数一致,才能说明全部电脑检查通过;它仍不代表开发板已经写入新固件。
生成的固件文件AI 会把代码变成可以写入开发板的文件,并检查文件大小和警告。文件成功生成以后,下一步仍要先核对改动范围。
让 AI 用当前代码重新运行全部电脑检查,再重新生成固件。不使用前面步骤留下的旧结果或旧文件。
局部测试只证明局部逻辑;完整测试与构建要确认新增功能没有破坏工程其余部分,并能生成固件。
AI 列出的测试发现数、执行数和通过数完全一致,失败数为 0;固件生成成功,并给出新固件的位置和大小。此时只能说“代码通过并产生了固件”,还不能说真机功能已经成功。
测试清单对不上、发现数/执行数/通过数不一致、存在失败,或固件生成失败,就先查明原因。不跳过检查凑数字,也不改工具版本来掩盖问题。
先检查 AI 到底改了什么,再确认眼前连接的就是目标开发板。写入后亲手检查有线、无线、重复执行和原有按键功能。
开始前先看清
改动清单(diff)它会把 AI 实际增加、删除和修改的内容列出来。这一步要确认所有变化都与打开应用动作有关,没有碰硬件连接、设备身份或其他无关功能。
通过/有问题/还不能确认工程记录可能写成 PASS、FAIL、UNKNOWN。只有每一项都有证据确认通过,才可以进入写入开发板;任何有问题或还不能确认的项目都先停下。
让 AI 列出从开始到现在所有新增、删除和修改的文件,并检查会影响构建、烧录或提交的 Git 忽略内容,逐项说明来源和用途。这一步只检查改动,不再修改代码。
代码检查通过,不代表 AI 只改了该改的地方。写入开发板前,要让真实改动、会影响结果的生成内容和实际构建配置互相对上;与构建、烧录和提交无关的缓存不需要逐个清点。
所有 Git 变化都被列出并归类;会影响构建、烧录或提交的 ignored 内容也有来源证据。托管依赖、实际构建配置和锁定文件互相吻合,硬件、存储布局、设备身份和无关功能都确认未改。AI 最后明确说“可以进入写入确认”,但此时还没有写入开发板。
真实改动或会影响构建、烧录、提交的生成内容说不清,或硬件和设备身份有变化,都不写入开发板。先保留清单和问题位置,再决定怎样修正。
开始前先看清
先确认目标板,再写入写入会覆盖开发板里当前运行的固件。AI 必须先显示连接位置、芯片和设备编号,等人确认是目标板以后才能继续。
连接失败时才短按 BOOT工具无法自动连接时,只能让开发板保持开机,短按并松开一次 BOOT。正常开机后看不到串口,不一定代表启动失败;下一步还会从 App、有线设备或无线连接继续确认。
让开发板保持开机,用可传数据的 USB 线连接电脑,再把提示词复制给 AI。AI 会先显示它识别到的开发板和准备写入的固件,然后停下等你确认。
写入会覆盖开发板现在的固件,所以必须先确认“是这块板、是这个文件”,再由人明确授权。写完后看不到下载用的连接口,也不一定代表失败。
确认烧录到 XXXX 后,AI 才开始写入,并明确显示写入和校验成功。目标板不确定、固件不是最新检查过的文件,或你还没有输入完整确认句时,都不能写入。自动连接失败时,只在开机状态短按并松开一次 BOOT;还是失败就停止,不连续重试。
开始前先看清
只保留一种连接来检查先只接有线,再只接无线,各按一次。这样能分别确认两条连接都正常;两条同时连接时,还要确认同一次按键不会执行两次。
App 明确显示配置已经保存“配置已发送”只表示内容离开了 App。只有 App 明确确认开发板已经保存同一份配置,才开始按键检查;具体消息编号和内容指纹交给 AI 核对。
“开发板已连接”只证明连接可用,不代表 App 已经知道这个键要打开哪个应用。只有 App 保存好对应关系,并明确确认开发板已收到,才能开始按键检查。
开始七项检查前:开发板已正常连接,当前只运行一个官网正式 App 实例;无论小版本号是多少,动作列表都能选择“打开应用”,App 也明确显示开发板已经保存配置。下面七项要分别记录结果,不用一项成功代表全部通过。
开发板看不到时,先停在连接检查,不重新写入。App 来源不明、没有“打开应用”,或同时开着两个实例时,先把 App 环境理清。App 一直没有确认开发板已保存时,只重连并重试一次;仍然失败就保留现场。不手写 UUID,也不从头盲目重写固件。
Vibe Coding 不是把判断交给 AI,
而是让 AI 缩短抵达第一条真机证据的距离。