mirror of
https://github.com/bettercap/bettercap.git
synced 2024-11-08 06:30:13 -08:00
61 lines
1.2 KiB
Go
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
|
|
}
|