project_config.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. /**
  2. * ===================================================
  3. * project_config.h — 全局可调配置集中管理
  4. * ===================================================
  5. *
  6. * 本文件汇集 APP 内所有可修改的硬件、时序、阈值参数。
  7. * 修改任何参数后重新编译即可生效,无需逐文件查找。
  8. *
  9. * 使用 #ifndef 守卫允许编译选项(-D)或上游头文件覆盖。
  10. *
  11. * 本文件不包含:
  12. * - 内存/缓冲大小 (memory_pool_c.h 自行管理)
  13. * - BLE 连接参数 (peripheral.c 自行管理)
  14. * - NRF 寄存器地址/位定义 (sir24drv.h 芯片手册常量)
  15. * - GATT UUID (gattprofile.h Profile 定义)
  16. * - GPIO 引脚映射 (pindef.h 硬件绑定)
  17. *
  18. * 编码: GBK (与项目保持一致)
  19. */
  20. #ifndef PROJECT_CONFIG_H
  21. #define PROJECT_CONFIG_H
  22. #include "hal_gpio_port.h" /* PA()/PB() 引脚编码, SPI/RF 引脚定义为 hal_pin_t */
  23. #include "pindef.h" /* RF 构建变体 (INIT_ADDR/SI24R1_CH) + 跳频池 (HOP_POOL/HOP_POOL_SIZE)
  24. * 已迁至 pindef.h, 便于按设备集中调整。本 include 让原有
  25. * 依赖 project_config.h 提供 these 宏的文件透明拿到。 */
  26. /* ==================== 1. RF 构建变体 ==================== */
  27. /* INIT_ADDR / SI24R1_CH 已移至 pindef.h (build 脚本按设备重写, #ifndef 守卫)。
  28. * 此处不再重复定义, 见 pindef.h "RF 构建变体" 段。 */
  29. /* ==================== 2. 跳频参数 ==================== */
  30. /* 【重要】中控与从机两端必须完全一致,否则无法通信。
  31. * 修改后两端同步重新编译部署。
  32. * HOP_POOL / HOP_POOL_SIZE 已移至 pindef.h; 以下为跳频算法时序/信用参数。 */
  33. #ifndef HOP_SLOT_MS
  34. #define HOP_SLOT_MS 32 /* 跳频时隙 (ms),与中控 MODE_TICK_MS 对齐 */
  35. #endif
  36. #ifndef HOP_RX_TIMEOUT_MS
  37. #define HOP_RX_TIMEOUT_MS 320 /* 失步阈值 (ms),作为 HOP_CREDIT_MAX 导出基准 */
  38. #endif
  39. #define HOP_CREDIT_MAX (HOP_RX_TIMEOUT_MS / HOP_SLOT_MS) /* 信用桶满额 (=10) */
  40. #ifndef HOP_CREDIT_RX_GAIN
  41. #define HOP_CREDIT_RX_GAIN 2 /* 每 slot 收包信用增益 */
  42. #endif
  43. #ifndef HOP_RX_SELF_HEAL_MS
  44. #define HOP_RX_SELF_HEAL_MS 10000 /* 硬件自愈超时 (ms): 连续无包此时间后软复位 SI24R1 */
  45. #endif
  46. /* SipHash-2-4 共享密钥 (16 字节)
  47. * 两端必须完全一致,否则 MAC 校验失败→灯光包全部丢弃。
  48. * 当前为占位测试密钥,正式部署前替换。 */
  49. #ifndef HOP_KEY_BYTE_0
  50. #define HOP_KEY_INIT { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, \
  51. 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }
  52. #endif
  53. /* ==================== 3. 灯光相位同步 ==================== */
  54. /* 丢包兜底:从机 RTC 外推 phase 保持动画连续,直到重新收包或 RF 超时。 */
  55. /* 相位模式值:与中控 MODE_VALUE_* 一致 */
  56. #ifndef RF_PHASE_MODE_CONST
  57. #define RF_PHASE_MODE_CONST 0u
  58. #endif
  59. #ifndef RF_PHASE_MODE_BLINK
  60. #define RF_PHASE_MODE_BLINK 2u
  61. #endif
  62. #ifndef RF_PHASE_MODE_GRADIENT
  63. #define RF_PHASE_MODE_GRADIENT 3u
  64. #endif
  65. #ifndef RF_PHASE_FALLBACK_MS
  66. #define RF_PHASE_FALLBACK_MS 80u /* 丢包超过此毫秒数后才启用相位外推 */
  67. #endif
  68. /* 相位软同步参数 */
  69. #ifndef PHASE_SOFT_ALPHA_N
  70. #define PHASE_SOFT_ALPHA_N 77 /* alpha 分子, α≈0.3 */
  71. #endif
  72. #ifndef PHASE_SOFT_ALPHA_D
  73. #define PHASE_SOFT_ALPHA_D 256 /* alpha 分母 (>>8 免除法) */
  74. #endif
  75. #ifndef PHASE_SOFT_LIMIT
  76. #define PHASE_SOFT_LIMIT 8192 /* 单次校正限幅,防丢包大跳 */
  77. #endif
  78. /* 相位外推启用延迟:距上次收包超过此毫秒数才从每包亮度切换到 RTC 外推 */
  79. #ifndef RF_PHASE_EXTRAPOLATE_DT_MS
  80. #define RF_PHASE_EXTRAPOLATE_DT_MS 100u
  81. #endif
  82. /* 默认 blink_period_units:老固件不发该字节时的兜底值,退化为慢闪速率 */
  83. #ifndef DEFAULT_BLINK_PERIOD_UNITS
  84. #define DEFAULT_BLINK_PERIOD_UNITS 20
  85. #endif
  86. /* ==================== 4. TMOS / 时序任务间隔 ==================== */
  87. /* TMOS 时基: 1 tick = 1/32768 s ≈ 0.0305 ms. 以下为 tick 数。 */
  88. /* PERIODIC 渲染任务重排间隔: 16*1 = 16 ticks ≈ 10ms */
  89. #ifndef RF_PERIODIC_RETICK
  90. #define RF_PERIODIC_RETICK (16*1)
  91. #endif
  92. /* 渲染采样间隔:16ms, <= BURST 半周期 32ms/2 (奈奎斯特) */
  93. #ifndef RENDER_SAMPLE_TICK
  94. #define RENDER_SAMPLE_TICK MS_TO_RTC(16)
  95. #endif
  96. /* RF 超时计数上限: 16ms×3000≈48s 无中控包 → g_rf_is_on=false */
  97. #ifndef RF_TIMEOUT_COUNT
  98. #define RF_TIMEOUT_COUNT 3000
  99. #endif
  100. /* 按键轮询 */
  101. #ifndef KEY_POLL_INIT_TICK
  102. #define KEY_POLL_INIT_TICK (16*50) /* 按键事件后加速轮询 */
  103. #endif
  104. #ifndef KEY_POLL_CONT_TICK
  105. #define KEY_POLL_CONT_TICK (16*10) /* 常规轮询间隔 */
  106. #endif
  107. /* 近距离感应/群控状态检查 (SELF_LIGHT_EVT) */
  108. #ifndef SELF_LIGHT_PERIOD_TICK
  109. #define SELF_LIGHT_PERIOD_TICK 1600 /* ≈50ms */
  110. #endif
  111. /* 节能 (ECO) 任务 */
  112. #ifndef OPENVOICE_SHORT_TICK
  113. #define OPENVOICE_SHORT_TICK (1600*2) /* ≈100ms, 过渡阶段 */
  114. #endif
  115. #ifndef OPENVOICE_NORMAL_TICK
  116. #define OPENVOICE_NORMAL_TICK 1600 /* ≈50ms, 正常阶段 */
  117. #endif
  118. #ifndef OPENVOICE_LONG_TICK
  119. #define OPENVOICE_LONG_TICK (1600*3600) /* ≈180s, 长间隔阶段 */
  120. #endif
  121. /* 系统定时器 */
  122. #ifndef SYSTICK_INTERVAL
  123. #define SYSTICK_INTERVAL 1000
  124. #endif
  125. /* 看门狗周期: FREQ_SYS / WDT_PERIOD_DIV */
  126. #ifndef WDT_PERIOD_DIV
  127. #define WDT_PERIOD_DIV 10 /* 100ms */
  128. #endif
  129. /* ==================== 5. LED PWM / 亮度控制 ==================== */
  130. #ifndef PWM_CLOCK_DIVX
  131. #define PWM_CLOCK_DIVX 2 /* PWM 时钟分频 */
  132. #endif
  133. #ifndef PWM_LED_ECHO_INIT
  134. #define PWM_LED_ECHO_INIT 9500 /* 初始 PWM 回显 (95.00%) */
  135. #endif
  136. #ifndef BRIGHTNESS_SCALE_DEN
  137. #define BRIGHTNESS_SCALE_DEN 10000 /* 亮度缩放分母 */
  138. #endif
  139. #ifndef BRIGHTNESS_MIN_THRESHOLD
  140. #define BRIGHTNESS_MIN_THRESHOLD 10 /* 低于此值直接关断 LED */
  141. #endif
  142. #ifndef BRIGHTNESS_FULL_THRESHOLD
  143. #define BRIGHTNESS_FULL_THRESHOLD 0xf0 /* 高于此值视为满亮 */
  144. #endif
  145. /* LED 各模式最大计数值 */
  146. #ifndef MAX_SLOW
  147. #define MAX_SLOW 8
  148. #endif
  149. #ifndef MAX_FAST
  150. #define MAX_FAST 4
  151. #endif
  152. #ifndef MAX_FLASH
  153. #define MAX_FLASH 2
  154. #endif
  155. #ifndef MAX_GLOW
  156. #define MAX_GLOW 160
  157. #endif
  158. #ifndef MAX_PARIR
  159. #define MAX_PARIR 300
  160. #endif
  161. /* 呼吸灯间隔 (RTC tick) */
  162. #ifndef GLOW_INTERVAL_TICK
  163. #define GLOW_INTERVAL_TICK 100
  164. #endif
  165. /* 闪烁模式分频: led_flash_tick() 每 N 次 tick 执行一次 */
  166. #ifndef FLASH_MODE_DIVIDER
  167. #define FLASH_MODE_DIVIDER 6
  168. #endif
  169. /* ==================== 6. 声音检测 ==================== */
  170. /* 声控触发方式(二选一, 由 SOUND_TRIG_MODE 切换):
  171. * SOUND_TRIG_POLL 轮询采样 —— 每 SOUND_CHECK_INTERVAL_MS 读一次 GPIO, 去抖后触发
  172. * (默认, 与重构前行为一致)
  173. * SOUND_TRIG_IRQ GPIOB 下降沿中断 —— ISR 直接装载保持计数, 更省主循环
  174. * 两种方式共用 sound_hold 倒计时与点灯逻辑, 点灯时长均为
  175. * SOUND_ACTIVE_DURATION × SOUND_CHECK_INTERVAL_MS。 */
  176. #define SOUND_TRIG_POLL 1
  177. #define SOUND_TRIG_IRQ 0
  178. #ifndef SOUND_TRIG_MODE
  179. #define SOUND_TRIG_MODE SOUND_TRIG_POLL
  180. #endif
  181. #ifndef SOUND_DEBOUNCE_COUNT
  182. #define SOUND_DEBOUNCE_COUNT 2 /* 去抖动连续采样次数 */
  183. #endif
  184. #ifndef SOUND_ACTIVE_DURATION
  185. #define SOUND_ACTIVE_DURATION 10 /* 检测到声音后 LED 保持亮起的轮次 */
  186. #endif
  187. #ifndef SOUND_CHECK_INTERVAL_MS
  188. #define SOUND_CHECK_INTERVAL_MS 2 /* 声音检测间隔 (ms) */
  189. #endif
  190. /* ==================== 7. 按键 / 电源管理 ==================== */
  191. /* 操作模式 */
  192. #ifndef OPMODE_UNKNOWN
  193. #define OPMODE_UNKNOWN 0
  194. #endif
  195. #ifndef OPMODE_NORMAL
  196. #define OPMODE_NORMAL 1
  197. #endif
  198. #ifndef OPMODE_BLE
  199. #define OPMODE_BLE 7
  200. #endif
  201. #ifndef OPMODE_PAIRE
  202. #define OPMODE_PAIRE 8
  203. #endif
  204. #ifndef OPMODE_SHUTDOWN
  205. #define OPMODE_SHUTDOWN 9
  206. #endif
  207. /* 模式存储 Flash 地址 */
  208. #ifndef MODE_ADDR
  209. #define MODE_ADDR 0x1000
  210. #endif
  211. /* 长按阈值: poll 周期计数, ~3s */
  212. #ifndef KEY_LONG_PRESS_THRESHOLD
  213. #define KEY_LONG_PRESS_THRESHOLD 20
  214. #endif
  215. /* 按键序列超时: RTC 周期, 释放后此时间内再次按下视为连续 */
  216. #ifndef KEY_SEQUENCE_TIMEOUT
  217. #define KEY_SEQUENCE_TIMEOUT 12000
  218. #endif
  219. /* 自动关机空闲计数 */
  220. #ifndef AUTO_SHUTDOWN_COUNT
  221. #define AUTO_SHUTDOWN_COUNT 150
  222. #endif
  223. /* 开机防抖: 上电后此时长内长按不触发关机 */
  224. #ifndef STARTUP_GUARD_MS
  225. #define STARTUP_GUARD_MS 10
  226. #endif
  227. /* ==================== 8. SI24R1 模式/配置值 ==================== */
  228. /* CONFIG 寄存器 (详见 sir24drv.h 位定义) */
  229. #ifndef CONFIG_TX_MODE
  230. #define CONFIG_TX_MODE 0x0e /* TX 模式 CONFIG 值 */
  231. #endif
  232. #ifndef CONFIG_RX_MODE
  233. #define CONFIG_RX_MODE 0x0f /* RX 模式 CONFIG 值 */
  234. #endif
  235. /* RF_SETUP 寄存器初始化值 (250K_1Mbps + LNA_HCURR + PWR_0DB) */
  236. #ifndef RF_SETUP_INIT_VALUE
  237. #define RF_SETUP_INIT_VALUE 0x26
  238. #endif
  239. /* TX 重试超时 */
  240. #ifndef TX_RETRY_TIMEOUT_MS
  241. #define TX_RETRY_TIMEOUT_MS 500
  242. #endif
  243. /* 自动重传 */
  244. #ifndef AUTO_RETRANSMIT_COUNT
  245. #define AUTO_RETRANSMIT_COUNT 15
  246. #endif
  247. #ifndef AUTO_RETRANSMIT_DELAY
  248. #define AUTO_RETRANSMIT_DELAY ARD_4000US
  249. #endif
  250. /* 固定包长 (动态包关闭时) */
  251. #ifndef FIXED_PACKET_LEN
  252. #define FIXED_PACKET_LEN 32
  253. #endif
  254. /* SI24R1 默认模式 (init 后) */
  255. #ifndef SI24_DEFAULT_MODE
  256. #define SI24_DEFAULT_MODE 8
  257. #endif
  258. /* ==================== 9. SI24R1 位bang SPI 引脚 ==================== */
  259. /* SI24R1 使用 GPIO 模拟 SPI 时序 (非硬件 SPI0 外设)。
  260. *
  261. * SI24R1_SPI_USE_PORTB = 0: PA12(CSN) PA13(SCK) PA14(MOSI) PA15(MISO)
  262. * PA11(CE) PA5(IRQ) — 默认,无需 remap
  263. * SI24R1_SPI_USE_PORTB = 1: 开启 SPI0 引脚重映射到 PB12-PB15,
  264. * CE/IRQ 也切到 PB 对应引脚。
  265. *
  266. * 注意: CE 和 IRQ 是普通 GPIO,不随 SPI0 remap 自动切换,需手动指定 PB 引脚。
  267. * 切换端口后需调用 SI24R1_SPI_REMAP_INIT() 执行 GPIOPinRemap。 */
  268. #ifndef SI24R1_SPI_USE_PORTB
  269. #define SI24R1_SPI_USE_PORTB 0 /* 0=Port A (默认), 1=Port B (开 remap) */
  270. #endif
  271. #if SI24R1_SPI_USE_PORTB
  272. /* ---- Port B (开启 GPIOPinRemap ENABLE, RB_PIN_SPI0 后) ---- */
  273. #ifndef SPI_CLK_GPIO_PIN
  274. #define SPI_CLK_GPIO_PIN PB(GPIO_Pin_13)
  275. #endif
  276. #ifndef SPI_MISO_GPIO_PIN
  277. #define SPI_MISO_GPIO_PIN PB(GPIO_Pin_15)
  278. #endif
  279. #ifndef SPI_MOSI_GPIO_PIN
  280. #define SPI_MOSI_GPIO_PIN PB(GPIO_Pin_14)
  281. #endif
  282. #ifndef SPI_NSS_GPIO_PIN
  283. #define SPI_NSS_GPIO_PIN PB(GPIO_Pin_12)
  284. #endif
  285. /* CE 和 IRQ 是普通 GPIO,不在 SPI0 remap 范围内,按需改引脚 */
  286. #ifndef RF24L01_CE_GPIO_PIN
  287. #define RF24L01_CE_GPIO_PIN PB(GPIO_Pin_11)
  288. #endif
  289. #ifndef RF24L01_IRQ_GPIO_PIN
  290. #define RF24L01_IRQ_GPIO_PIN PB(GPIO_Pin_5)
  291. #endif
  292. /* 初始化时调用此宏执行硬件重映射 */
  293. #define SI24R1_SPI_REMAP_INIT() GPIOPinRemap(ENABLE, RB_PIN_SPI0)
  294. #else
  295. /* ---- Port A (默认, 无需 remap) ---- */
  296. #ifndef SPI_CLK_GPIO_PIN
  297. #define SPI_CLK_GPIO_PIN PA(GPIO_Pin_13)
  298. #endif
  299. #ifndef SPI_MISO_GPIO_PIN
  300. #define SPI_MISO_GPIO_PIN PA(GPIO_Pin_15)
  301. #endif
  302. #ifndef SPI_MOSI_GPIO_PIN
  303. #define SPI_MOSI_GPIO_PIN PA(GPIO_Pin_14)
  304. #endif
  305. #ifndef SPI_NSS_GPIO_PIN
  306. #define SPI_NSS_GPIO_PIN PA(GPIO_Pin_12)
  307. #endif
  308. #ifndef RF24L01_CE_GPIO_PIN
  309. #define RF24L01_CE_GPIO_PIN PA(GPIO_Pin_11)
  310. #endif
  311. #ifndef RF24L01_IRQ_GPIO_PIN
  312. #define RF24L01_IRQ_GPIO_PIN PA(GPIO_Pin_5)
  313. #endif
  314. #define SI24R1_SPI_REMAP_INIT() /* 无需操作 */
  315. #endif
  316. /* ==================== 10. GPIO 操作 (已迁移至 hal_gpio_port.h) ==================== */
  317. /* 旧的 GPIO_PIN_*(port, pin, ...) 派发宏已移除。
  318. * 引脚现为 hal_pin_t 单值 (PA()/PB() 构造, 见 pindef.h / 本文件第 9 节),
  319. * 操作统一调用 hal_gpio_port.h 的内联函数:
  320. * hal_gpio_mode_cfg(pin, mode) / hal_gpio_set_high(pin) / hal_gpio_set_low(pin)
  321. * hal_gpio_read(pin) / hal_gpio_it_mode_cfg(pin, mode)
  322. * GPIO 中断订阅/退订见 hal_irq.h。 */
  323. /* ==================== 11. 协议封包类型标识 ==================== */
  324. /* 无线/蓝牙包首字节 */
  325. #ifndef PKT_TYPE_CENTRAL_CTRL
  326. #define PKT_TYPE_CENTRAL_CTRL 0xaa /* 中控广播包 */
  327. #endif
  328. #ifndef PKT_TYPE_PAIR_DATA
  329. #define PKT_TYPE_PAIR_DATA 0x56 /* 配对/群控数据包 */
  330. #endif
  331. #ifndef PKT_TYPE_FLASH_WRITE
  332. #define PKT_TYPE_FLASH_WRITE 0x57 /* 闪存写入 (BLE) */
  333. #endif
  334. #ifndef PKT_TYPE_RESET
  335. #define PKT_TYPE_RESET 0x58 /* 复位 (BLE) */
  336. #endif
  337. #ifndef PKT_TYPE_BLE_LIGHT_CTRL
  338. #define PKT_TYPE_BLE_LIGHT_CTRL 0x60 /* BLE 灯光控制 */
  339. #endif
  340. #ifndef PKT_TYPE_INFO_RESP
  341. #define PKT_TYPE_INFO_RESP 0x61 /* 信息响应 (BLE) */
  342. #endif
  343. #ifndef PKT_TYPE_OTA
  344. #define PKT_TYPE_OTA 0x62 /* OTA 跳转 (BLE, +magic) */
  345. #endif
  346. #ifndef PKT_TYPE_RELOAD_COLORDB
  347. #define PKT_TYPE_RELOAD_COLORDB 0x63 /* 重载颜色数据库 (BLE) */
  348. #endif
  349. #ifndef PKT_TYPE_SET_COLOR_MODE
  350. #define PKT_TYPE_SET_COLOR_MODE 0x64 /* 设置颜色模式 (BLE) */
  351. #endif
  352. /* ==================== 12. 颜色数据库 ==================== */
  353. #ifndef COLORDB_FILE_MAGIC
  354. #define COLORDB_FILE_MAGIC 0x59 /* 颜色数据库文件头魔数 */
  355. #endif
  356. #ifndef COLORDB_MAX_FRAMES_NOINDEX
  357. #define COLORDB_MAX_FRAMES_NOINDEX 1024 /* 无索引时最大帧数 */
  358. #endif
  359. #ifndef COLORDB_CACHE_SIZE
  360. #define COLORDB_CACHE_SIZE 8 /* 颜色数据库缓存条目数 */
  361. #endif
  362. #ifndef COLORDB_REPEAT_MARKER
  363. #define COLORDB_REPEAT_MARKER 0xEF /* 颜色数据库重复标记 */
  364. #endif
  365. /* ==================== 13. 命令/协议通用 ==================== */
  366. #ifndef CMDLEN
  367. #define CMDLEN 240 /* 单条命令最大长度 */
  368. #endif
  369. /* 命令行表/跟随路径初始容量 */
  370. #ifndef CMD_LIST_INIT_CAPACITY
  371. #define CMD_LIST_INIT_CAPACITY 8
  372. #endif
  373. #ifndef FOLLOW_PATH_INIT_CAPACITY
  374. #define FOLLOW_PATH_INIT_CAPACITY 4
  375. #endif
  376. /* 模式值 (亮度/颜色模式,与 ledx COLORMODE 对齐) */
  377. #ifndef MODE_CONST
  378. #define MODE_CONST 0 /* 常亮 */
  379. #endif
  380. #ifndef MODE_BREATH
  381. #define MODE_BREATH 1 /* 呼吸 */
  382. #endif
  383. #ifndef MODE_BLINK_VAL
  384. #define MODE_BLINK_VAL 2 /* 闪烁 */
  385. #endif
  386. #endif /* PROJECT_CONFIG_H */