diff --git a/README.md b/README.md index fac7189..4c645c7 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ CHECK STORAGE ### 5. RGB 正常状态与告警引擎 -没有 active alert 时,RGB 默认全灭。`[led] normal_mode` 可改为自定义颜色常亮/闪烁,或 MCU 已确认的流水、呼吸、跑马、彩虹和炫彩效果。常亮与闪烁使用 0..255 的自定义 R/G/B;内置流水/呼吸使用 MCU 固定的红、绿、蓝、黄、紫、青、白七色和慢/中/快三档速度,跑马/彩虹/炫彩由 MCU 自行配色。内置效果只在模式切换时写一次寄存器,不循环刷 I²C。 +没有 active alert 时,RGB 默认全灭。`[led] normal_mode` 可改为自定义颜色常亮/闪烁,或 MCU 已确认的流水、呼吸、跑马、彩虹和炫彩效果。常亮与闪烁使用 0..255 的自定义 R/G/B;内置流水/呼吸使用 MCU 固定的红、绿、蓝、黄、紫、青、白七色和慢/中/快三档速度,跑马/彩虹/炫彩由 MCU 自行配色。内置效果只在模式切换时按 speed → color → effect 的实机校准顺序写一次寄存器,不循环刷 I²C。 任何 active alert 都会立即抢占正常效果。RGB 告警模式由当前 OLED 告警页决定;OLED 位于主页时则使用最高优先级 active owner。颜色表示故障对象:CPU负载、频率、throttling、温度与散热相关为红色,供电/欠压为橙色,内存为紫色,存储为白色,网络/Wi-Fi 为蓝色,服务/进程为青色。频率表示严重等级:默认 Warning 为1500ms亮/1500ms灭,Critical 为750ms亮/750ms灭,Emergency 为300ms亮/300ms灭。`[led]` 可分别配置六类对象的 R/G/B 值,以及三个严重等级的亮灯和灭灯时长,非法颜色值会限制到0..255,间隔最小为50ms。每次点亮使用 v3.2.0 已验证的完整 selector/R/G/B 写入顺序,只在亮/灭边沿写 MCU,不做高频软件 PWM。相邻页面 RGB mode 相同时不关闭、不重启节奏。动画不写循环日志,owner 变化记录 `DISPLAY_OWNER`,实际模式变化才记录 `RGB_MODE`。 diff --git a/SHA256SUMS b/SHA256SUMS index 25f1a20..a1163e8 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -1,6 +1,6 @@ -40154b1fabac7bdfc7e4a6cd1a88ffa42e6842ef1da625594d5d9e4b904e99b9 README.md +a182abe8c1f188b9e9b47fdc24802fedd6a569b462a85254185521fe68936a76 README.md 72c46162c33f9587c6ccb01ad53fbaaf4ecec8cd21014b909e87e8707e253e36 app/oled_font_5x7.bin -c3062ad1122c36a762bc3ca9d44ebcb5a6a5a37446a85fb68312de4fd8aa5db9 app/pigway_pi_control.py +d71d949643d31461f2e62ded3818e1a0f1711d1420756ad0cc32eb04cde0fad3 app/pigway_pi_control.py 3a13b4e8f9d306e77f82eba78b78fe9b1932488884d6f3f976754bfa94f0153d app/pigway_pi_control_api.py 75fa662ed21138a8e394de83e46281dab039433cc0d7a8f787e1a049f4b47ec8 config/pigway-pi-control.conf 1276369d600e9fd560d03e26146bcaeb40a353829978d1ebaa578d385b27af72 install.sh diff --git a/app/pigway_pi_control.py b/app/pigway_pi_control.py index d25b7d1..52d76fa 100755 --- a/app/pigway_pi_control.py +++ b/app/pigway_pi_control.py @@ -471,12 +471,11 @@ def rgb_normal_effect(mode): effect_name=mode.removeprefix("NORMAL_").lower() state=("effect",effect_name,NORMAL_EFFECT_SPEED,NORMAL_EFFECT_COLOR) if _last_rgb==state: return - # Seller protocol: close the previous RGB state, then set effect, speed and - # the limited built-in palette. Write this sequence once per mode change. - mcu(0x07,0x00); time.sleep(0.001) - mcu(0x04,RGB_EFFECTS[effect_name]); time.sleep(0.001) - mcu(0x05,NORMAL_EFFECT_SPEED); time.sleep(0.001) - mcu(0x06,RGB_EFFECT_COLORS[NORMAL_EFFECT_COLOR]) + # Hardware-calibrated order: speed and color are parameters; the final + # effect register write commits and starts the selected MCU animation. + mcu(0x05,NORMAL_EFFECT_SPEED); time.sleep(RGB_WRITE_DELAY_MS/1000.0) + mcu(0x06,RGB_EFFECT_COLORS[NORMAL_EFFECT_COLOR]); time.sleep(RGB_WRITE_DELAY_MS/1000.0) + mcu(0x04,RGB_EFFECTS[effect_name]) _last_rgb=state def render_home(cpu,temp,mem,disk):