rgb.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package rgb
  2. import (
  3. "fmt"
  4. "strconv"
  5. "github.com/spf13/cobra"
  6. intdevice "github.com/wobkey/rgb/internal/device"
  7. "github.com/wobkey/rgb/internal/via"
  8. )
  9. var targetDevice string
  10. func OpenDevice() (*via.Protocol, intdevice.Keyboard, error) {
  11. keyboards, err := intdevice.LoadKeyboards()
  12. if err != nil {
  13. return nil, intdevice.Keyboard{}, fmt.Errorf("load keyboards: %w", err)
  14. }
  15. devices, err := intdevice.Discover(keyboards)
  16. if err != nil {
  17. return nil, intdevice.Keyboard{}, fmt.Errorf("discover: %w", err)
  18. }
  19. if len(devices) == 0 {
  20. return nil, intdevice.Keyboard{}, fmt.Errorf("no VIA-compatible keyboard found")
  21. }
  22. var dev intdevice.Device
  23. if targetDevice != "" {
  24. for _, d := range devices {
  25. if d.Path == targetDevice {
  26. dev = d
  27. break
  28. }
  29. }
  30. if dev.Path == "" {
  31. return nil, intdevice.Keyboard{}, fmt.Errorf("device %s not found", targetDevice)
  32. }
  33. } else if len(devices) == 1 {
  34. dev = devices[0]
  35. } else {
  36. return nil, intdevice.Keyboard{}, fmt.Errorf("multiple devices found, use --device to specify")
  37. }
  38. proto, err := via.New(dev)
  39. if err != nil {
  40. return nil, intdevice.Keyboard{}, fmt.Errorf("open protocol: %w", err)
  41. }
  42. return proto, dev.Keyboard, nil
  43. }
  44. func ParseUint8(s string) (uint8, error) {
  45. v, err := strconv.ParseUint(s, 10, 8)
  46. if err != nil {
  47. return 0, fmt.Errorf("invalid value: %w", err)
  48. }
  49. return uint8(v), nil
  50. }
  51. func Init() *cobra.Command {
  52. cmd := &cobra.Command{
  53. Use: "rgb",
  54. Short: "RGB lighting commands",
  55. }
  56. cmd.Flags().StringVar(&targetDevice, "device", "", "HID device path to use")
  57. return cmd
  58. }