Files
MeowOS-For-R3P2/patch_v2/meow_launcherd/meow_ipc.h
T

323 lines
18 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 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 <stdint.h>
#include <stddef.h>
#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 延伸,只留协议位)----
* 语义:App A 经 MSG_PICKER_CALL 请求 App B 弹一个 selector 并返回所选值(如文件/音轨
* 选择器)。属「跨 App 带返回值」调用,与单向业务通知(MSG_NOTIFY)不同;负载/应答结构
* 待 M3 延伸阶段定义(m_picker_call_t / m_picker_result_t),此处仅固定消息号与方向。 */
MSG_PICKER_CALL = 0x0070, /* ↑ 请求跨 App picker 调用(发起方 A → 持有方 B) */
MSG_PICKER_RESULT = 0x0071, /* ↓ picker 返回值(候选结果回 A) */
MSG_META = 0x0072, /* ↑ 媒体会话上报元数据/进度/状态(阶段 D 附录 B) */
MSG_PLAYCTL = 0x0073, /* ↓ 播放控制下发/↑ 控制器转发到最近活跃媒体会话 */
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 结尾字符串,
* 每串形如 "<route_id>=<chain>"(如 "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;其余保留。
* seek_ms:cmd=5 时目标位置(ms);其余置 0。
* 语义:通知中心卡片/播放页按钮、物理媒体键 → meow_media_playctl(cmd,seek_ms) 经
* 「最近活跃媒体会话」的连接 fd 下发;宿主验证经 meow_ipc playctl 发到 launcher 转发。 */
typedef struct m_playctl {
uint32_t cmd; /* 1=播放 2=暂停 3=上一首 4=下一首 5=seek */
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;
#endif /* MEOW_IPC_H */