This commit is contained in:
2026-02-09 00:25:07 +08:00
commit 85ed0946c8
12 changed files with 756 additions and 0 deletions

120
utils/color.go Normal file
View File

@@ -0,0 +1,120 @@
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("设置双色呼吸失败")
}
}