121 lines
3.9 KiB
Go
121 lines
3.9 KiB
Go
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("设置双色呼吸失败")
|
||
}
|
||
}
|