Files
0417_QT_code/CODE_READING_ORDER.md

140 lines
5.7 KiB
Markdown
Raw Normal View History

2026-03-26 10:45:29 +08:00
# 代码阅读顺序
这份顺序不是按“文件名排序”,而是按“学生最容易建立整体理解”的顺序排的。
## 第一轮:先看最上层界面怎么把链路串起来
1. [main.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/main.cpp)
先看程序从哪里启动,主题在哪里设置,主窗口是哪个类。
2. [APP/APP_UIWindow.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_UIWindow.h)
先看主窗口成员和函数声明建立“APP 层到底做什么”的总印象。
3. [APP/APP_UIWindow.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_UIWindow.cpp)
重点看这几个函数:
- `App_Func_InitWindow()`
- `App_Func_InitUi()`
- `App_Func_InitConnect()`
- `App_Func_InitLogic()`
- `App_Func_OnPollTimer()`
- `App_Func_RefreshDebugView()`
这一轮的目标是先搞清楚:
- 主窗口什么时候创建
- 调试窗口什么时候插入
- 定时轮询什么时候启动
- UI 是怎么调用 LGC 的
## 第二轮:看调试开关和调试界面
4. [DEBUG/Debug_Config.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DEBUG/Debug_Config.h)
看总开关宏 `APP_ENABLE_DEBUG_WINDOW`
5. [DEBUG/Debug_Panel.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DEBUG/Debug_Panel.h)
6. [DEBUG/Debug_Panel.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DEBUG/Debug_Panel.cpp)
看调试窗口只负责“显示”,不负责“解析”。
这一轮的目标是搞清楚:
- 为什么调试功能可以整体开关
- 为什么 UI 层只显示文本,不做协议解析
## 第三轮:看 APP 层自己的纯界面数据
7. [APP/APP_KeypadModel.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_KeypadModel.h)
8. [APP/APP_KeypadModel.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_KeypadModel.cpp)
这是界面按键布局数据,不是 HID 协议。
9. [APP/APP_Theme.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_Theme.h)
10. [APP/APP_Theme.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/APP/APP_Theme.cpp)
这是界面主题,不是协议,也不是设备层。
这一轮的目标是明确:
- APP 层有哪些东西只是“画界面”
- 哪些东西绝对不能混进 DRI / LGC
## 第四轮:看 MID 层,建立协议常量和公共结构认知
11. [MID/Mid_Def.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/MID/Mid_Def.h)
12. [MID/Mid_Def.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/MID/Mid_Def.cpp)
这一轮一定要记住:
- 当前有 3 个主链 report`0x01 / 0x03 / 0x04`
- `0x04``FF00 / 0002`
- `0x04` 固定结构是 `[report_id | modifier | usage_bitmap(29)]`
- MID 只放“大家共用的固定定义”,不放设备打开逻辑,也不放协议语义判断
## 第五轮:看 LGC 总控,理解“谁调用谁”
13. [LOGIC/Lgc_Core.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Core.h)
14. [LOGIC/Lgc_Core.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Core.cpp)
重点看:
- `Lgc_Core_Func_Start()`
- `Lgc_Core_Func_RefreshDevice()`
- `Lgc_Core_Func_Poll()`
这一轮要看懂:
- LGC 怎么分别驱动 `Dri_NkroRaw / Dri_Consumer / Dri_Vendor`
- 收到原始包以后,怎么分流给不同解析函数
- 最后为什么 UI 只拿到整理好的文本
## 第六轮:看三个 report 的协议解析
15. [LOGIC/Lgc_Vendor.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Vendor.h)
16. [LOGIC/Lgc_Vendor.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Vendor.cpp)
这一组最重要,先精读。
17. [LOGIC/Lgc_Nkro.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Nkro.h)
18. [LOGIC/Lgc_Nkro.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Nkro.cpp)
19. [LOGIC/Lgc_Consumer.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Consumer.h)
20. [LOGIC/Lgc_Consumer.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/LOGIC/Lgc_Consumer.cpp)
这一轮的目标:
- 彻底看懂 `0x04` 的完整解析流程
- 再回头看 `0x01``0x03`
## 第七轮:最后看 DRI理解“原始包从哪来”
21. [DRI/Dri_Vendor.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_Vendor.h)
22. [DRI/Dri_Vendor.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_Vendor.cpp)
先看 vendor因为当前调试最关键。
23. [DRI/Dri_NkroRaw.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_NkroRaw.h)
24. [DRI/Dri_NkroRaw.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_NkroRaw.cpp)
25. [DRI/Dri_Consumer.h](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_Consumer.h)
26. [DRI/Dri_Consumer.cpp](C:/Users/shuto/Desktop/C++/test_1/20260320_new_keyboard/DRI/Dri_Consumer.cpp)
这一轮要明确:
- DRI 只负责枚举、打开、读写
- DRI 不判断业务语义
- DRI 不解释 `report id 0x04` 代表什么
## 一个最推荐的实际阅读路径
如果你这次只想先吃透“调试抓包 + 0x04 解析”这一条线,最推荐按下面顺序读:
1. `main.cpp`
2. `APP/APP_UIWindow.h`
3. `APP/APP_UIWindow.cpp`
4. `DEBUG/Debug_Config.h`
5. `DEBUG/Debug_Panel.h`
6. `DEBUG/Debug_Panel.cpp`
7. `LOGIC/Lgc_Core.h`
8. `LOGIC/Lgc_Core.cpp`
9. `LOGIC/Lgc_Vendor.h`
10. `LOGIC/Lgc_Vendor.cpp`
11. `MID/Mid_Def.h`
12. `MID/Mid_Def.cpp`
13. `DRI/Dri_Vendor.h`
14. `DRI/Dri_Vendor.cpp`
这个顺序最符合教学。
原因很简单:
- 先知道“程序怎么串起来”
- 再知道“调试窗口怎么显示”
- 再知道“逻辑层怎么分流”
- 再知道“0x04 怎么解析”
- 最后才看“Windows HID 怎么打开”