bettercap/modules/hid/build_logitech.go
2024-08-09 18:19:21 +02:00

61 lines
1.2 KiB
Go

package hid
import (
"github.com/bettercap/bettercap/v2/network"
)
const (
ltFrameDelay = 12
)
var (
helloData = []byte{0x00, 0x4F, 0x00, 0x04, 0xB0, 0x10, 0x00, 0x00, 0x00, 0xED}
keepAliveData = []byte{0x00, 0x40, 0x04, 0xB0, 0x0C}
)
type LogitechBuilder struct {
}
func (b LogitechBuilder) frameFor(cmd *Command) []byte {
data := []byte{0, 0xC1, cmd.Mode, cmd.HID, 0, 0, 0, 0, 0, 0}
sz := len(data)
last := sz - 1
sum := byte(0xff)
for i := 0; i < last; i++ {
sum = (sum - data[i]) & 0xff
}
sum = (sum + 1) & 0xff
data[last] = sum
return data
}
func (b LogitechBuilder) BuildFrames(dev *network.HIDDevice, commands []*Command) error {
last := len(commands) - 1
for i, cmd := range commands {
if i == 0 {
cmd.AddFrame(helloData, ltFrameDelay)
}
next := (*Command)(nil)
if i < last {
next = commands[i+1]
}
if cmd.IsHID() {
cmd.AddFrame(b.frameFor(cmd), ltFrameDelay)
cmd.AddFrame(keepAliveData, 0)
if next == nil || cmd.HID == next.HID || next.IsSleep() {
cmd.AddFrame(b.frameFor(&Command{}), 0)
}
} else if cmd.IsSleep() {
for i, num := 0, cmd.Sleep/10; i < num; i++ {
cmd.AddFrame(keepAliveData, 10)
}
}
}
return nil
}