/* meow_ipc.h — MeowOS IPC 协议定义(FRAMEWORK_DESIGN §1 / MEOWOS_API.md §1)。 * * 客户端(meow_ipc 测试钩子)与守护进程(meow_launcherd)共用一份,杜绝两端漂移。 * 传输:AF_UNIX SOCK_STREAM,路径默认 /usr/data/meow_ipc.sock(可被 --ipc-sock / * MEOW_IPC_SOCK 覆盖,供 qemu sim)。 * 帧格式:定长头(16B) + 变长负载,**全部小端 LE**(mipsel 原生)。 * * struct ipc_hdr { LE 字节序 * uint32_t magic; = 0x4D4F5701 == 'MEOW'|1 * uint16_t version; = 1 * uint16_t type; = msg_type * uint32_t req_id; = 请求id,响应回显 * uint32_t len; = payload 字节数 * }; * * 本阶段(D · M0+M1+M2+M3+M4 前置)通讯子集:MSG_HELLO/ACK/ERR + MSG_ACT_DECLARE/QUERY/RESULT + * MSG_ACT_FOCUS/BACK + MSG_NOTIFY/PROGRESS/QUERY/DISMISS* + MSG_NAV(导航栈上报/退出) * + MSG_META/MSG_PLAYCTL(媒体会话,阶段 D 附录 B)。 * picker(0x0070/0x0071)仅预留协议位,本批不实现。 */ #ifndef MEOW_IPC_H #define MEOW_IPC_H #include #include #define MEOW_IPC_MAGIC 0x4D4F5701u #define MEOW_IPC_VERSION 1u #define MEOW_IPC_PATH "/usr/data/meow_ipc.sock" #define MEOW_IPC_SOCK_LEN 108 /* sockaddr_un.sun_path */ #define MEOW_IPC_MAX 4096u /* 单帧负载上限 */ #define MEOW_IPC_HDR_LEN 16u /* 列表编码上限(count 个 NUL 字符串时,distinct 工作缓冲上限) */ #define MEOW_IPC_CARGO 1024u /* 守护进程入队拷贝上限(可小于 MEOW_IPC_MAX) */ /* ---- 消息类型(FRAMEWORK_DESIGN §1 表)---- */ enum { MSG_NONE = 0x0000, MSG_HELLO = 0x0001, /* ↑ 声明 app_id/版本/能力 */ MSG_ACK = 0x0002, /* ↓ 握手/应答 */ MSG_ERR = 0x0003, /* ↓ 错误码 */ MSG_REGISTER = 0x0010, /* ↑ 注册后台服务(保持连接) */ MSG_SERVICE_OK = 0x0011, /* ↓ 服务登记成功 */ MSG_SERVICE_STOP = 0x0012, /* ↑ 请求停止服务 */ MSG_NOTIFY = 0x0020, /* ↑ 推送/更新通知 */ MSG_NOTIFY_ACK = 0x0021, /* ↓ 落库结果 */ MSG_NOTIFY_DISMISS = 0x0022, /* ↑ 撤下通知 */ MSG_NOTIFY_LIST = 0x0023, /* ↓ 下发通知清单(重同步) */ MSG_NOTIFY_PROGRESS = 0x0024,/* ↑ 实时更新通知进度(仅改内存活跃槽,不落盘) */ MSG_NOTIFY_QUERY = 0x0025, /* ↑ 查询内存活跃通知集(MeowPanel 实时化前置) */ MSG_NOTIFY_DISMISS_ALL = 0x0026,/* ↑ 一键清除(保留 ongoing/media/progress 进行中,同通知中心 UI) */ MSG_NOTIFY_QUERY_RESULT = 0x0027, /* ↓ 活跃通知集序列化文本(JSON,字段同 TF 归档) */ MSG_NOTIF_OPEN = 0x0028, /* ↑ App 前台顶部下滑 → 请求 launcher 展开通知中心叠加会话(§10.5) */ MSG_NOTIF_CLOSE = 0x0029, /* ↑ App 告知结束/退出 → launcher 收尾兜底(可选用途,§10.5) */ MSG_ACT_DECLARE = 0x0030, /* ↑ (重)声明路由表 */ MSG_ACT_QUERY = 0x0031, /* ↑ 解析 activity 链路 */ MSG_ACT_RESULT = 0x0032, /* ↓ 返回链路 */ MSG_ACT_FOCUS = 0x0033, /* ↑ 上报当前顶层 activity(keep_awake 判定,M2.17) */ MSG_ACT_BACK = 0x0034, /* ↑ 上报回到根/无 activity(清 keep_awake,M2.17) */ MSG_NAV = 0x0040, /* ↑ 上报导航/请求退出 */ MSG_SHOW_ACTIVITY= 0x0041, /* ↓ 令前端应用显示某屏 */ MSG_PERF_QUERY = 0x0050, /* ↑ 性能/系统聚合查询(专项服务 meow_svc_perf) */ MSG_PERF_RESULT = 0x0051, /* ↓ 聚合 JSON(perf/system 子集) */ MSG_POWER_ACTION = 0x0060, /* ↑ 电源/系统动作信号(专项服务 meow_svc_power) */ MSG_POWER_STATUS = 0x0061, /* ↓ 动作受理/结果 + 状态文本 */ /* ---- picker:带返回值的跨 App 调用(M3 延伸,AMSD_DESIGN §6.2 二期已落地)---- * 语义:App A 经 MSG_PICKER_CALL 请求 App B 弹一个 selector 并返回所选值(如文件选择器)。 * amsd 为路由/决策者:它查 picker 表(app.json `picker.=`)决定 handler App, * 经 MSG_AMS_START(扩载荷含 picker 上下文)拉起 handler;handler 结果经 MSG_PICKER_RESULT * 回传,launcher 转发 amsd 记录。属「跨 App 带返回值」调用。负载结构见下方 * m_picker_call_t / m_picker_result_t。 */ MSG_PICKER_CALL = 0x0070, /* ↑ 请求跨 App picker 调用(发起方 A → 持有方 B;→launcher→amsd) */ MSG_PICKER_RESULT = 0x0071, /* ↑ picker 返回值(候选结果回 A;→launcher→amsd) */ MSG_META = 0x0072, /* ↑ 媒体会话上报元数据/进度/状态(阶段 D 附录 B) */ MSG_PLAYCTL = 0x0073, /* ↓ 播放控制下发/↑ 控制器转发到最近活跃媒体会话 */ /* ---- amsd 控制(AMSD_DESIGN §4.2):amsd→launcher,申请拉起/终止某 App ---- * 语义:amsd 为「启动/终止」决策者 → launcher(执行器)执行。payload 见下。 */ MSG_AMS_START = 0x00A0, /* → 请求 launcher 拉起某 App(pkg + 可选 activity) */ MSG_AMS_KILL = 0x00A1, /* → 请求 launcher 终止某 App(SIGTERM 语义) */ /* ---- audiod 独占音频服务(devdocs/plan/AUDIOD_DESIGN.md §2):0x00C0-0x00CA ---- * 语义:App 只经 SDK 客户端 API(meow_ui_audio.c)喂 PCM,audiod 独占 hw:0,0。 * 独占+抢占(后开赢);软混音已否决(MIPS32 软 SRC 伤音质,留混音器接口位)。 */ MSG_AUDIO_OPEN = 0x00C0, /* ↑ 开流(m_audio_open;client 原生 rate/ch/fmt/flags) */ MSG_AUDIO_OPEN_ACK = 0x00C1, /* ↓ 授权(stream_id + grant_rate/ch/fmt + err;grant=客户端应产出的格式) */ MSG_AUDIO_WRITE = 0x00C2, /* ↑ PCM 字节流(按 grant 格式交织;单帧 ≤4096B,多帧连续发,无回执) */ MSG_AUDIO_PAUSE = 0x00C3, /* ↑ 暂停(u32 stream_id) */ MSG_AUDIO_RESUME = 0x00C4, /* ↑ 恢复(u32 stream_id) */ MSG_AUDIO_STOP = 0x00C5, /* ↑ 停止并关流(u32 stream_id) */ MSG_AUDIO_PREEMPTED= 0x00C6, /* ↓ 被抢占通知(m_audio_preempted;旧流被后开流赶走,App 收 UI 提示) */ MSG_AUDIO_QUERY = 0x00C7, /* ↑ 状态快照查询(空负载) */ MSG_AUDIO_STATE = 0x00C8, /* ↓ 状态快照文本(NUL 结尾;当前流/参数/帧数/underrun/路由/音量) */ MSG_AUDIO_ROUTE = 0x00C9, /* ↑ 手动路由(u32 port:0=auto 2=3.5 3=4.4;调试/面板用) */ MSG_AUDIO_VOLUME = 0x00CA, /* ↑ 音量(i32 pct:-1=查询 0-100=设置;v1 透传写 DAC numid=1/2) */ /* ---- meow_powermgr 功耗管理服务(devdocs/plan/POWER_MANAGER_DESIGN.md §6.1):0x00D0-0x00D7 ---- * 语义:功耗维度的查看/分析/管理(svc_power 管动作、svc_perf 管性能,powermgr 管功耗)。 * 独立 socket /usr/data/meow_pm.sock(--sock/MEOW_PM_SOCK 覆盖)。鉴权分级同 svc_power: * QUERY/HISTORY/EVENTS=读级任意调用者;POLICY_SET=动作级(期 3 落地时接 SO_PEERCRED 同源代码)。 */ MSG_PM_QUERY = 0x00D0, /* ↑ 功耗聚合查询(m_pm_query_t{subset}:PM_SUBSET_* 位;0=全部) */ MSG_PM_RESULT = 0x00D1, /* ↓ 聚合 JSON(电池深加工/功耗估算/分解/策略,形状对齐 §3/§4.1) */ /* 0x00D2 MSG_PM_POLICY_GET / 0x00D3 MSG_PM_POLICY_SET —— 期 3(profile/低电阈值读改,SET 动作级鉴权) * 0x00D4 MSG_PM_HISTORY(u32 hours)/ 0x00D5 MSG_PM_HISTORY_RESULT(统计 JSON)—— 期 2 * 0x00D6 MSG_PM_EVENTS / 0x00D7 MSG_PM_EVENTS_RESULT(异常耗电事件清单)—— 期 2 */ MSG_SYS = 0x00F0 /* ↓ 系统事件(守护关闭/服务死亡/播放器状态) */ }; /* ---- 返回码(MEOWOS_API.md §1,与 HTTP 层一致)---- */ enum { MEOW_OK = 0, MEOW_ERR_INVAL = -1, MEOW_ERR_NOENT = -2, MEOW_ERR_EXISTS = -3, MEOW_ERR_PERM = -4, MEOW_ERR_IO = -5, MEOW_ERR_NOMEM = -6, MEOW_ERR_NOTINIT = -7, MEOW_ERR_BUSY = -8, MEOW_ERR_TIMEOUT = -9, MEOW_ERR_NODEV = -10, MEOW_ERR_INTERNAL = -255 }; /* ---- HELLO flags(附录 A 声明式权限)---- */ #define MF_BACKGROUND 0x00000001u /* 可后台常驻 */ #define MF_PLAYBACK 0x00000002u /* 后台音频/播放 */ /* ---- MSG_META flags(元数据有效位)---- */ #define MF_ART 0x00000004u /* 封面/专辑图已提供 */ #define MF_LYRIC 0x00000008u /* 歌词已提供 */ #define MF_COVER 0x00000010u /* artwork 为可用路径/槽位 */ /* ---- 标识/长度 ---- */ #define MEOW_APP_ID_MAX 32 #define MEOW_ACT_MAX 64 #define MEOW_CHAIN_MAX 160 /* ---- 负载结构(全部 LE;mipsel 原生对齐,字段 4 字节对齐)---- */ /* MSG_HELLO ↑:应用声明 */ typedef struct m_hello { char app_id[MEOW_APP_ID_MAX]; uint32_t version; uint32_t flags; uint32_t caps; /* 预留能力位 */ } m_hello_t; /* 44 B */ /* MSG_ACK ↓:握手/应答 */ typedef struct m_ack { uint32_t code; /* 0=MEOW_OK */ uint32_t status; /* 附加(如已注册 app 数) */ } m_ack_t; /* 8 B */ /* MSG_ERR ↓:错误码 + 短消息 */ typedef struct m_err { uint32_t code; uint16_t msg_len; char msg[64]; } m_err_t; /* MSG_ACT_QUERY ↑:解析某 app 的 activity 链路 */ typedef struct m_act_query { char app_id[MEOW_APP_ID_MAX]; char activity[MEOW_ACT_MAX]; } m_act_query_t; /* 96 B */ /* MSG_ACT_FOCUS ↑:上报当前顶层 activity(keep_awake 判定,M2.17) */ typedef struct m_act_focus { char app_id[MEOW_APP_ID_MAX]; char activity[MEOW_ACT_MAX]; } m_act_focus_t; /* 96 B */ /* MSG_ACT_RESULT ↓:返回链路(root..target),depth=链路逻辑深度 */ typedef struct m_act_result { uint32_t depth; uint32_t code; /* MEOW_OK / MEOW_ERR_NOENT(act 未注册) */ uint16_t chain_len; /* chain 有效字节 */ uint16_t pad; char chain[MEOW_CHAIN_MAX]; } m_act_result_t; /* 172 B */ /* MSG_ACT_DECLARE ↑:运行时声明路由表。app_id + count 个 NUL 结尾字符串, * 每串形如 "="(如 "nowplaying=home;search;nowplaying")。 * 守护进程并集覆盖静态 app.json 路由。 */ typedef struct m_act_declare { char app_id[MEOW_APP_ID_MAX]; uint16_t count; uint16_t pad; char entries[MEOW_IPC_CARGO - MEOW_APP_ID_MAX - 4]; } m_act_declare_t; /* MSG_NAV nav_type 取值(FRAMEWORK_DESIGN §3 导航栈) */ enum { MEOW_NAV_REPORT = 0, /* 应用内逐屏回退/前进:上报当前栈深 + 顶层 activity */ MEOW_NAV_EXIT = 1 }; /* 应用在根屏按返回 → 请求启动器终止应用、回主屏 */ /* MSG_NAV ↑:上报导航/请求退出(M3 导航栈;launcher 主循环单写者消费)。 * - REPORT:应用弹/推自己的屏后上报;depth=当前逻辑深度(1..16),current=当前顶层 activity_id; * - EXIT :应用在根屏再按返回;depth 置 0,current 可空。 * launcher 据此维护每应用 nav_stack(≤16 深),并在 EXIT 时终止前台应用会话。 */ typedef struct m_nav { char app_id[MEOW_APP_ID_MAX]; uint32_t nav_type; /* MEOW_NAV_REPORT / MEOW_NAV_EXIT */ uint32_t depth; /* REPORT: 1..16;EXIT: 0 */ char current[MEOW_ACT_MAX]; /* REPORT: 当前顶层 activity_id;EXIT: 可空 */ } m_nav_t; /* MSG_META ↑:媒体会话实时上报(阶段 D 附录 B;FRAMEWORK_DESIGN 附录 B 的 m_meta 微调落实)。 * 声明 MF_PLAYBACK 的 App 首次上报 → 注册为媒体源;后续更新(含 1s 级进度)。字段全 LE 定长。 * - state:0=停止 1=播放 2=暂停 3=缓冲。 * - flags:MF_ART/MF_LYRIC/MF_COVER(可多;声明哪类元数据有效)。 * - artwork/lyric:封面/歌词源(本地路径或 MeowOS 存储槽位);空=无(mf 位同时清)。 * - app_id:上报源头(与 HELLO 的 app_id 一致),launcher 据此归并同一会话。 * 边界:防越界(128 长度由 meow_ipc 双方同源 + 接收侧截断;payload < MEOW_IPC_CARGO)。 */ typedef struct m_meta { char title[128]; char artist[128]; char album[128]; uint32_t pos_ms; /* 当前播放位置 */ uint32_t dur_ms; /* 总时长 */ uint32_t state; /* 0=停止 1=播放 2=暂停 3=缓冲 */ uint32_t flags; /* MF_ART / MF_LYRIC / MF_COVER */ char artwork[192]; /* 封面: 本地路径或 MeowOS 存储槽位 */ char lyric[192]; /* 歌词: 路径或文本槽位 */ char app_id[MEOW_APP_ID_MAX]; } m_meta_t; /* 128+128+128+16+192+192+32 = 828 B */ /* MSG_PLAYCTL ↓(launcher→App)/↑(控制器→launcher 转发到最近活跃媒体会话):播放控制。 * cmd:1=播放 2=暂停 3=上一首 4=下一首 5=seek 6=播放/暂停切换(toggle,源侧按当前态翻转);其余保留。 * seek_ms:cmd=5 时目标位置(ms);其余置 0。 * 语义:通知中心卡片/播放页按钮、物理媒体键 → meow_media_playctl(cmd,seek_ms) 经 * 「最近活跃媒体会话」的连接 fd 下发;宿主验证经 meow_ipc playctl 发到 launcher 转发。 * 物理播放/暂停键(164)在 SDK 侧恒映射 cmd=6(不再本地判 state:走自有 IPC 线程的源 * 不经 SDK meta 上报,SDK 侧 state 可能恒 0);launcher 透传 cmd 不改写。 */ typedef struct m_playctl { uint32_t cmd; /* 1=播放 2=暂停 3=上一首 4=下一首 5=seek 6=播放/暂停toggle */ int64_t seek_ms; /* cmd=5: 目标位置 ms;否则 0 */ } m_playctl_t; /* 4 (+4 pad) + 8 = 16 B(mipsel int64 8 对齐) */ /* MSG_NOTIFY ↑:推送/更新通知(freedesktop 对齐 + MeowOS 扩展;定长 LE)。 * - summary/body/app_icon/expire_timeout 直通 freedesktop 字段;app_icon 即 SDK `icon` * (icon name 或 path;映射为空串时 launcher 用该 app 默认图标回退); * - target_activity/progress 为 MeowOS 专有(存储层映射为 hints 的 * meow.target_activity / meow.progress); * - urgency 为 MeowOS 扩展(0-3,缺省 NORMAL;旧调用置 0=旧 pad 位); * - actions[]/hints{} v1 走定长空串(M2b D-Bus 桥再填);media/ongoing 标记。 * 宿主:NOTIFICATION_SYSTEM.md §2/§4 + FRAMEWORK_DESIGN §4/附C。 */ typedef struct m_notify { char app_id[MEOW_APP_ID_MAX]; /* 来源应用;系统事件="system" */ char category[24]; /* 通知类型(媒体通知="media") */ char summary[64]; char body[96]; char app_icon[48]; /* SDK icon;空=launcher 按 app_id 回退 app 图标 */ char target_activity[MEOW_ACT_MAX]; /* MeowOS:点击跳转目标 activity */ uint32_t replaces_id; /* 0=新建;>0=替换已存在通知 */ uint32_t expire_timeout; /* ms;0xFFFFFFFF=ONGOING 常驻 */ int32_t progress; /* MeowOS:0-100;<0=无 */ uint8_t media; /* 1=媒体通知 */ uint8_t ongoing; /* 1=常驻通知 */ uint8_t urgency; /* 0-3(低/普通/高/紧急);越界由 SDK 钳位缺省 NORMAL;旧调用置 0=旧 pad 位 → LOW/静默 */ uint8_t pad; } m_notify_t; /* 定长 LE;尾部 4 字节(media/ongoing/urgency/pad)与旧版 pad 等宽 */ /* MSG_NOTIFY_PROGRESS ↑:实时更新一条已存在通知的进度(仅改 launcher 内存活跃槽, * 不落盘——TF 快照只在创建/结束(100% 或 dismiss)写)。 */ typedef struct m_notify_progress { uint32_t nid; /* launcher 分配的通知 id(MSG_NOTIFY_ACK.status) */ int32_t progress; /* 0-100;<0=清除进度条 */ } m_notify_progress_t; /* 8 B */ /* MSG_NOTIFY_QUERY_RESULT ↓:活跃通知集序列化文本(JSON 数组;NUL 结尾)。 * 字段与 TF 归档一致:id/app_id/category/summary/body/urgency/ts/progress/ongoing/media/ * target_activity(+app_icon)。payload 定长 LE,整个结构 < MEOW_IPC_MAX。 */ typedef struct m_notify_query_result { uint32_t code; /* MEOW_OK / MEOW_ERR_* */ uint16_t text_len; /* text 有效字节(不含 NUL) */ uint16_t pad; char text[MEOW_IPC_MAX - 12]; /* 序列化 JSON 数组 */ } m_notify_query_result_t; /* 4096 B */ /* ================= App 前台划出通知中心(FRAMEWORK_DESIGN §10.5) = */ /* MSG_NOTIF_OPEN ↑(App→launcher):App 进程内顶部下滑(MEOW_EV_NOTIF_PULL),请求 launcher * 展开通知中心叠加会话。App 只检测+上报、**不渲染系统 UI**(MEOW_APP_SDK §6.1 ③)。 * 负载字段全 LE 定长。 */ typedef struct m_notif_open { char app_id[MEOW_APP_ID_MAX]; /* 32 */ uint32_t event_seq; /* App 侧事件序号(防重放/去抖,可选;0=填充默认) */ uint16_t origin_x; /* 手势按下原点 X(防御性校验:应≈顶部,best-effort 可 0) */ uint16_t origin_y; /* 手势按下原点 Y(launcher 复核是否在顶部热区) */ uint16_t hotzone; /* 上报时 SDK 的热区高(28 或 4,见 meow_ui_statusbar_hotzone) */ uint8_t flags; /* 预留:位0=App 声明 fullscreen */ uint8_t pad; } m_notif_open_t; /* 32+4+2+2+2+1+1 = 44 B(LE,4 字节对齐) */ /* MSG_NOTIF_CLOSE ↑(App→launcher,可选用途):App 告知结束/退出,launcher 收尾兜底 * (清 active 标记/SIGCONT 兜底)。非可靠链路:launcher 主要靠 waitpid/kill(pid,0) 自感知。 */ typedef struct m_notif_close { char app_id[MEOW_APP_ID_MAX]; /* 32 */ uint32_t reason; /* 0=App 主动退出;1=App 请求关闭通知中心;2=App 崩溃 */ } m_notif_close_t; /* 32+4 = 36 B */ /* ================= 专项服务 IPC(SYSTEM_FRAMEWORK_SERVICES §2.2/§2.3)= */ /* ---- MSG_PERF_QUERY 子集位(0=全部)---- */ #define PERF_SUBSET_PERF (1u << 0) /* cpu/mem/uptime/temp/storage/tfcard */ #define PERF_SUBSET_SYSTEM (1u << 1) /* system(version/hostname/kernel/arch) */ /* MSG_PERF_QUERY ↑:性能/系统聚合查询(服务端 meow_svc_perf) */ typedef struct m_perf_query { uint32_t subset; /* 0=全部;PERF_SUBSET_* 组合 */ } m_perf_query_t; /* 4 B */ /* MSG_PERF_RESULT ↓:聚合 JSON(payload 为 NUL 结尾 JSON 文本) */ typedef struct m_perf_result { uint32_t code; /* MEOW_OK / MEOW_ERR_* */ uint32_t subset; /* 回显请求 subset */ uint16_t json_len; /* json 有效字节(不含 NUL) */ uint16_t pad; char json[MEOW_IPC_MAX - 12]; /* 聚合 JSON(.data 形状,§2.2) */ } m_perf_result_t; /* ---- POWER_* 动作枚举(m_power_action_t.cmd;与 CLI §2.4 同源)---- */ enum { POWER_SHUTDOWN = 0, /* 关机 */ POWER_REBOOT = 1, /* 重启回 MeowOS(强制写 boot_default=0) */ POWER_UPGRADE = 2, /* 写 mtd5=ota:kernel2 进升级模式 */ POWER_BACK_HIBY = 3, /* 写 boot_default=1 + reboot(回 HiBy) */ POWER_SET_DEFAULT_MEOW = 4, /* 只写 boot_default=0,不重启 */ POWER_SET_DEFAULT_HIBY = 5, /* 只写 boot_default=1,不重启 */ POWER_STATUS = 6, /* 综合状态查询 */ POWER_BATTERY = 7, /* 电池查询 */ POWER_REBOOT_REASON = 8, /* 上次重启原因 */ POWER_UPGRADE_STATUS = 9, /* 升级标志(mtd5=ota:kernel2?) */ POWER_SCREEN = 10, /* 屏幕电源:flag 0=off/1=on/2=timeout(秒取 arg) */ POWER_DAC = 11 /* DAC:flag 0=off/1=on/2=status */ }; /* MSG_POWER_ACTION ↑:电源/系统动作信号(服务端 meow_svc_power) */ typedef struct m_power_action { uint32_t cmd; /* POWER_* 枚举 */ uint32_t flag; /* 随 cmd;POWER_SCREEN/DAC 用 */ char arg[32]; /* 可选文本参数(如 screen timeout 秒数字符串) */ } m_power_action_t; /* 40 B */ /* MSG_POWER_STATUS ↓:动作受理/结果 + 状态文本(CLI/IPC 展示) */ typedef struct m_power_status { uint32_t code; /* MEOW_OK / MEOW_ERR_PERM / MEOW_ERR_INVAL / MEOW_ERR_NODEV */ uint32_t cmd; /* 回显 cmd */ uint16_t msg_len; /* msg 有效字节(不含 NUL) */ uint16_t pad; char msg[96]; /* 结果/状态文本 */ } m_power_status_t; /* ---- meow_powermgr 功耗管理(POWER_MANAGER_DESIGN §6.1;服务端 meow_powermgr)---- */ /* MSG_PM_QUERY 子集位(0=全部) */ #define PM_SUBSET_BATTERY (1u << 0) /* 电池深加工:state/pct/mv/health/续航估算 */ #define PM_SUBSET_ESTIMATE (1u << 1) /* 当前功耗估算:est_mw + confidence(estimated/derived) */ #define PM_SUBSET_BREAKDOWN (1u << 2) /* 功耗分解:各子系统分量(§3.2 经验模型,系数待标定) */ #define PM_SUBSET_POLICY (1u << 3) /* 策略档位快照(期 3;期 1 恒 null) */ /* MSG_PM_QUERY ↑:功耗聚合查询 */ typedef struct m_pm_query { uint32_t subset; /* 0=全部;PM_SUBSET_* 组合 */ } m_pm_query_t; /* 4 B */ /* MSG_PM_RESULT ↓:聚合 JSON(payload 为 NUL 结尾 JSON 文本,同 m_perf_result_t 口径) */ typedef struct m_pm_result { uint32_t code; /* MEOW_OK / MEOW_ERR_* */ uint32_t subset; /* 回显请求 subset */ uint16_t json_len; /* json 有效字节(不含 NUL) */ uint16_t pad; char json[MEOW_IPC_MAX - 12]; /* 聚合 JSON(§3/§4.1 形状) */ } m_pm_result_t; /* ---- amsd 控制(AMSD_DESIGN §4.2)---- */ /* MSG_AMS_START →:请求 launcher 拉起某 App。app_id=包名(权威);activity 空=裸启动 * (launcher launch_app),非空=resolve_chain+launch_activity。 * picker 上下文(二期):picker=1 时本次启动为「picker handler 调用」——launcher 注入 env * MEOW_PICKER_ACTION/MEOW_PICKER_REQ_ID/MEOW_PICKER_CALLER 到子进程;handler App 据此进入 * picker 模式,选完后经 MSG_PICKER_RESULT 回传。 */ typedef struct m_ams_start { char app_id[MEOW_APP_ID_MAX]; /* 32 */ char activity[MEOW_ACT_MAX]; /* 64;空=裸启动 */ uint32_t picker; /* 1=带 picker 上下文(注入 MEOW_PICKER_*) */ uint32_t picker_req_id; /* picker 请求号(回显到结果) */ char picker_action[24]; /* picker action(如 "pick_file");picker=0 忽略 */ char picker_caller[MEOW_APP_ID_MAX]; /* 32:发起方 app_id(""=系统/CLI) */ } m_ams_start_t; /* 160 B */ /* MSG_AMS_KILL →:请求 launcher 终止某 App(SIGTERM 语义,执行器=launcher)。 */ typedef struct m_ams_kill { char app_id[MEOW_APP_ID_MAX]; /* 32 */ } m_ams_kill_t; /* 32 B */ /* ---- picker 负载(二期)---- */ /* MSG_PICKER_CALL ↑:发起跨 App picker 调用(App A → launcher → amsd 路由;或 amsd 内部)。 * caller=发起方 app_id(""=系统/CLI);req_id=调用方自填(结果/PICKER_RESULT 回显); * action=要调用的 picker 类型(如 "pick_file");hint=初始目录等提示(空=缺省)。 */ typedef struct m_picker_call { char caller[MEOW_APP_ID_MAX]; /* 32 */ uint32_t req_id; /* 调用方请求号 */ char action[24]; /* picker action */ char hint[128]; /* 提示(初始目录等);空=缺省 */ uint32_t flags; /* 预留 */ } m_picker_call_t; /* 192 B */ /* MSG_PICKER_RESULT ↑:picker 返回值(handler App → launcher → amsd)。caller/req_id/action * 回显调用方;code=MEOW_OK/MEOW_ERR_*;value=返回项(路径/文本;空=用户取消)。 */ typedef struct m_picker_result { char caller[MEOW_APP_ID_MAX]; /* 32:回显发起方(""=系统/CLI) */ uint32_t req_id; /* 回显请求号 */ char action[24]; /* 回显 action */ uint32_t code; /* MEOW_OK / MEOW_ERR_* */ char value[256]; /* 返回项(路径/文本);空=cancel */ } m_picker_result_t; /* 320 B */ /* ================= audiod 独占音频服务(AUDIOD_DESIGN.md) = */ /* PCM 格式枚举(客户端原生 fmt 与 grant_fmt 共用):1=S16_LE 2=S24_LE 3=S32_LE 4=FLOAT_LE。 * v1 实装 S16/S32(S16 直通 + S32 升位);S24 按 32-in-32 处理;FLOAT v1 拒绝。 */ enum { AUDIO_FMT_S16 = 1, AUDIO_FMT_S24 = 2, AUDIO_FMT_S32 = 3, AUDIO_FMT_FLOAT = 4 }; /* MSG_AUDIO_OPEN ↑:请求开流(App 原生声源参数)。grant_*(ACK)回 audiod 实际授权给客户端的 * 产出格式(率/声道/位深)——客户端必须按 grant 格式产出 PCM(SDK meow_ui_audio 负责归一: * mono→stereo 复制 / S16↔S32 定值升降位)。ch>2 或 FLOAT → ERR_INVAL。 */ typedef struct m_audio_open { char app_id[MEOW_APP_ID_MAX]; /* 32 */ uint32_t rate; /* 原生采样率(应用源,如 44100/48000) */ uint16_t ch; /* 原生声道数(1=mono 2=stereo) */ uint16_t fmt; /* 原生格式(AUDIO_FMT_*) */ uint32_t flags; /* 预留(0) */ } m_audio_open_t; /* 32+4+2+2+4 = 44 B */ /* MSG_AUDIO_OPEN_ACK ↓:授权结果。err=MEOW_OK 才有效(stream_id>0 且 grant_* 为实际授权值); * err<0 时 stream_id=0、grant_* 视为无效(客户端 open 返回负错误码)。 */ typedef struct m_audio_open_ack { uint32_t stream_id; /* 授权流 id(>0) */ uint32_t grant_rate; /* 客户端应产出的采样率(=客户端 rate,无 SRC) */ uint16_t grant_ch; /* 客户端应产出的声道数(DAC 双声道 → 通常 2) */ uint16_t grant_fmt; /* 客户端应产出的格式(AUDIO_FMT_*,=硬件最优) */ int32_t err; /* MEOW_OK / MEOW_ERR_INVAL / MEOW_ERR_NODEV / MEOW_ERR_BUSY 等 */ } m_audio_open_ack_t; /* 4+4+2+2+4 = 16 B */ /* MSG_AUDIO_PAUSE/RESUME/STOP ↑:流控制(按 stream_id 定位)。 */ typedef struct m_audio_stream { uint32_t stream_id; } m_audio_stream_t; /* 4 B */ /* MSG_AUDIO_PREEMPTED ↓:被抢占通知(后开流赢;旧流收此消息,App 应暂停 UI/提示)。 * 旧流仍可读但 PCM 被丢弃(draining),直到客户端 CLOSE/断开。 */ typedef struct m_audio_preempted { uint32_t stream_id; /* 被抢占的流 id */ char by_app[MEOW_APP_ID_MAX]; /* 32:抢占者 app_id */ } m_audio_preempted_t; /* 4+32 = 36 B */ /* MSG_AUDIO_ROUTE ↑:手动切换输出路由(调试/面板用)。port:0=auto(跟随插孔) 2=3.5 3=4.4。 */ typedef struct m_audio_route { uint32_t port; /* 0=auto 2=3.5 3=4.4 */ } m_audio_route_t; /* 4 B */ /* MSG_AUDIO_VOLUME ↑:音量查询/设置。pct<0(-1)=查询当前音量;0-100=设置(写 DAC numid=1/2 * + 持久化 settings.conf `audio.volume`,与 watchdog/launcher 同源同键)。 */ typedef struct m_audio_volume { int32_t pct; /* -1=查询;0-100=设置 */ } m_audio_volume_t; /* 4 B */ #endif /* MEOW_IPC_H */