rgb.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 (
  10. targetDevice string
  11. targetZone string
  12. )
  13. func OpenDevice() (*via.Protocol, intdevice.Keyboard, error) {
  14. if _, err := selectedZones(); err != nil {
  15. return nil, intdevice.Keyboard{}, err
  16. }
  17. keyboards, err := intdevice.LoadKeyboards()
  18. if err != nil {
  19. return nil, intdevice.Keyboard{}, fmt.Errorf("load keyboards: %w", err)
  20. }
  21. devices, err := intdevice.Discover(keyboards)
  22. if err != nil {
  23. return nil, intdevice.Keyboard{}, fmt.Errorf("discover: %w", err)
  24. }
  25. if len(devices) == 0 {
  26. return nil, intdevice.Keyboard{}, fmt.Errorf("no VIA-compatible keyboard found")
  27. }
  28. var dev intdevice.Device
  29. if targetDevice != "" {
  30. for _, d := range devices {
  31. if d.Path == targetDevice {
  32. dev = d
  33. break
  34. }
  35. }
  36. if dev.Path == "" {
  37. return nil, intdevice.Keyboard{}, fmt.Errorf("device %s not found", targetDevice)
  38. }
  39. } else if len(devices) == 1 {
  40. dev = devices[0]
  41. } else {
  42. return nil, intdevice.Keyboard{}, fmt.Errorf("multiple devices found, use --device to specify")
  43. }
  44. proto, err := via.New(dev)
  45. if err != nil {
  46. return nil, intdevice.Keyboard{}, fmt.Errorf("open protocol: %w", err)
  47. }
  48. return proto, dev.Keyboard, nil
  49. }
  50. func lightingEnabled(mode, brightness uint8) bool {
  51. return mode != 0 && brightness > 0
  52. }
  53. func ParseUint8(s string) (uint8, error) {
  54. v, err := strconv.ParseUint(s, 10, 8)
  55. if err != nil {
  56. return 0, fmt.Errorf("invalid value: %w", err)
  57. }
  58. return uint8(v), nil
  59. }
  60. func Init() *cobra.Command {
  61. cmd := &cobra.Command{
  62. Use: "rgb",
  63. Short: "RGB lighting commands",
  64. }
  65. cmd.PersistentFlags().StringVar(&targetDevice, "device", "", "HID device path to use")
  66. cmd.PersistentFlags().StringVar(&targetZone, "zone", "", "RGB lighting zone")
  67. return cmd
  68. }