Files
Razer-led-mac/utils/color.go
2026-02-09 00:25:07 +08:00

121 lines
3.9 KiB
Go
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.
package utils
import "fmt"
// PRESET_COLORS 预设颜色
var PRESET_COLORS = []struct {
Name string
R, G, B byte
}{
{"红色", 0xFF, 0x00, 0x00},
{"绿色", 0x00, 0xFF, 0x00},
{"蓝色", 0x00, 0x00, 0xFF},
{"白色", 0xFF, 0xFF, 0xFF},
{"黄色", 0xFF, 0xFF, 0x00},
{"橙色", 0xFF, 0xA5, 0x00},
{"紫色", 0x80, 0x00, 0x80},
//{"熄灭", 0x00, 0x00, 0x00},
}
// 雷蛇绿 (标志性的 Razer Green)
//razerGreen := []byte{0x00, 0xFF, 0x00} // 或者稍微深一点的 0x44, 0xFF, 0x00
// 熄灭 (关闭灯光)
//off := []byte{0x00, 0x00, 0x00}
//// SetStaticColor 设置常亮颜色
//func (rd *RazerDevice) SetStaticColor(color []byte) {
// args := buildArguments(KBD_EFFECT_STATIC, KBD_BACKLIGHT_LED, color)
// // 3. 构建 90 字节报告 (Class 0x0F, ID 0x02)
// report, err := constructRazerReport(rd.TransactionID, KBD_CMD_CLASS, KBD_CMD_ID, KBD_DATA_SIZE, args)
// if err != nil {
// fmt.Println("报告构造失败:", err.Error())
// return
// }
// if rd.SendReportToDevice(report) {
// fmt.Println("设置常亮颜色成功")
// return
// }
// fmt.Println("设置常亮颜色失败")
//}
// SetStaticColor 设置常亮颜色
func (rd *RazerDevice) SetStaticColor(color []byte) {
// 关键修改:在颜色 [R, G, B] 前面补上开关位 0x01
// 这样 buildArguments 拼接后的第 6 位就是 0x01后面跟着 RGB
staticParams := append([]byte{0x01}, color...)
args := buildArguments(KBD_EFFECT_STATIC, KBD_BACKLIGHT_LED, staticParams)
// 3. 构建 90 字节报告 (注意KBD_DATA_SIZE 对于常亮通常是 9)
report, err := constructRazerReport(rd.TransactionID, KBD_CMD_CLASS, KBD_CMD_ID, KBD_DATA_SIZE, args)
if err != nil {
fmt.Println("报告构造失败:", err.Error())
return
}
if rd.SendReportToDevice(report) {
fmt.Println("设置常亮颜色成功")
return
}
fmt.Println("设置常亮颜色失败")
}
// SetOffLightsColor 设置常亮颜色
func (rd *RazerDevice) SetOffLightsColor(color []byte) {
// 关键修改:在颜色 [R, G, B] 前面补上开关位 0x01
// 这样 buildArguments 拼接后的第 6 位就是 0x01后面跟着 RGB
staticParams := append([]byte{0x01}, color...)
args := buildArguments(KBD_EFFECT_STATIC, KBD_BACKLIGHT_LED, staticParams)
// 3. 构建 90 字节报告 (注意KBD_DATA_SIZE 对于常亮通常是 9)
report, err := constructRazerReport(rd.TransactionID, KBD_CMD_CLASS, KBD_CMD_ID, KBD_DATA_SIZE, args)
if err != nil {
fmt.Println("报告构造失败:", err.Error())
return
}
if rd.SendReportToDevice(report) {
fmt.Println("设置常亮颜色成功")
return
}
fmt.Println("设置常亮颜色失败")
}
// SetBreathingColor 设置双色呼吸
func (rd *RazerDevice) SetBreathingColor() {
// 1. 定义呼吸子模式
subMode := byte(0x02) // 0x02 为双色切换呼吸
rgb1 := []byte{0xFF, 0x00, 0x00} // 颜色1: 红色
rgb2 := []byte{0x00, 0x00, 0xFF} // 颜色2: 蓝色
speed := byte(0x01) // 速度: 1(快) - 3(慢), 200可能过大建议先用1测试
// 2. 构造参数包 (总长 8 字节)
// 结构: [SubMode, R1, G1, B1, R2, G2, B2, Speed]
breathingParams := append([]byte{subMode}, append(rgb1, append(rgb2, speed)...)...)
// 3. 调用新版 buildArguments (内部不再强制加 0x01)
args := buildArguments(KBD_EFFECT_BREATHING, KBD_BACKLIGHT_LED, breathingParams)
// 4. 重要:计算正确的数据长度 (Data Size)
// 5字节(prefix) + 8字节(breathingParams) = 13字节
breathingDataSize := byte(13)
// 5. 构建 90 字节报告
// 注意:这里传入的是自定义的 breathingDataSize 而不是全局固定的 KBD_DATA_SIZE
report, err := constructRazerReport(rd.TransactionID, KBD_CMD_CLASS, KBD_CMD_ID, breathingDataSize, args)
if err != nil {
fmt.Println("报告构造失败:", err.Error())
return
}
// 6. 发送指令
if rd.SendReportToDevice(report) {
fmt.Println("设置双色呼吸成功")
} else {
fmt.Println("设置双色呼吸失败")
}
}