build_logitech.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package hid
  2. import (
  3. "github.com/bettercap/bettercap/network"
  4. )
  5. const (
  6. ltFrameDelay = 12
  7. )
  8. var (
  9. helloData = []byte{0x00, 0x4F, 0x00, 0x04, 0xB0, 0x10, 0x00, 0x00, 0x00, 0xED}
  10. keepAliveData = []byte{0x00, 0x40, 0x04, 0xB0, 0x0C}
  11. )
  12. type LogitechBuilder struct {
  13. }
  14. func (b LogitechBuilder) frameFor(cmd *Command) []byte {
  15. data := []byte{0, 0xC1, cmd.Mode, cmd.HID, 0, 0, 0, 0, 0, 0}
  16. sz := len(data)
  17. last := sz - 1
  18. sum := byte(0xff)
  19. for i := 0; i < last; i++ {
  20. sum = (sum - data[i]) & 0xff
  21. }
  22. sum = (sum + 1) & 0xff
  23. data[last] = sum
  24. return data
  25. }
  26. func (b LogitechBuilder) BuildFrames(dev *network.HIDDevice, commands []*Command) error {
  27. last := len(commands) - 1
  28. for i, cmd := range commands {
  29. if i == 0 {
  30. cmd.AddFrame(helloData, ltFrameDelay)
  31. }
  32. next := (*Command)(nil)
  33. if i < last {
  34. next = commands[i+1]
  35. }
  36. if cmd.IsHID() {
  37. cmd.AddFrame(b.frameFor(cmd), ltFrameDelay)
  38. cmd.AddFrame(keepAliveData, 0)
  39. if next == nil || cmd.HID == next.HID || next.IsSleep() {
  40. cmd.AddFrame(b.frameFor(&Command{}), 0)
  41. }
  42. } else if cmd.IsSleep() {
  43. for i, num := 0, cmd.Sleep/10; i < num; i++ {
  44. cmd.AddFrame(keepAliveData, 10)
  45. }
  46. }
  47. }
  48. return nil
  49. }