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

168 lines
4.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},
//{"熄灭", 0x00, 0x00, 0x00},
}
// PRESET_MULTI_COLORS 预设颜色
var PRESET_MULTI_COLORS = []struct {
Name string
Color1 []byte
Color2 []byte
}{
// 霓虹紫蓝 (非常电竞范)
{"霓虹紫蓝",
[]byte{0xFF, 0x00, 0xFF}, // 紫色 (Magenta)
[]byte{0x00, 0xFF, 0xFF}, // 青蓝色 (Cyan)
},
// 冰火 (经典红蓝对比)
{"冰火",
[]byte{0xFF, 0x00, 0x00}, // 纯红
[]byte{0x00, 0x00, 0xFF}, // 纯蓝
},
// 赛博朋克 (经典配色)
{"赛博粉黄",
[]byte{0xFF, 0x00, 0x7F}, // 玫粉色
[]byte{0xFF, 0xD7, 0x00}, // 金黄色
},
// 森林气息 (柔和过渡)
{"森翠",
[]byte{0x00, 0xFF, 0x00}, // 绿色
[]byte{0x00, 0xFF, 0x7F}, // 春绿
},
// 晚霞 (暖色调)
{"晚霞",
[]byte{0xFF, 0x45, 0x00}, // 橙红
[]byte{0xFF, 0x14, 0x93}, // 深粉
},
// 黑客帝国 (极简)
{"矩阵",
[]byte{0x00, 0xFF, 0x00}, // 翠绿
[]byte{0x00, 0x33, 0x00}, // 暗绿 (深邃感)
},
//{"熄灭", 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(subMode byte, rgb1 []byte, rgb2 []byte, speed byte) {
// 1. 定义呼吸子模式
//subMode := byte(0x02) // 0x02 为双色切换呼吸
//rgb1 := []byte{0xFF, 0x00, 0x00} // 颜色1: 红色
//rgb2 := []byte{0x00, 0x00, 0xFF} // 颜色2: 蓝色
//speed := byte(0x01) // 速度: 1(快) - 3(慢), 200可能过大建议先用1测试
//fmt.Println(subMode)
// 2. 构造参数包 (总长 8 字节)
// 结构: [SubMode, R1, G1, B1, R2, G2, B2, Speed]
breathingParams := append([]byte{subMode}, append(rgb1, append(rgb2, speed)...)...)
fmt.Println(breathingParams)
// 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("设置双色呼吸失败")
}
}