添加项目文件。
This commit is contained in:
139
CODE_READING_ORDER.md
Normal file
139
CODE_READING_ORDER.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# 代码阅读顺序
|
||||
|
||||
这份顺序不是按“文件名排序”,而是按“学生最容易建立整体理解”的顺序排的。
|
||||
|
||||
## 第一轮:先看最上层界面怎么把链路串起来
|
||||
|
||||
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 怎么打开”
|
||||
Reference in New Issue
Block a user