rgb.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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 lightingEnabled(mode, brightness uint8) bool {
  45. return mode != 0 && brightness > 0
  46. }
  47. func ParseUint8(s string) (uint8, error) {
  48. v, err := strconv.ParseUint(s, 10, 8)
  49. if err != nil {
  50. return 0, fmt.Errorf("invalid value: %w", err)
  51. }
  52. return uint8(v), nil
  53. }
  54. func Init() *cobra.Command {
  55. cmd := &cobra.Command{
  56. Use: "rgb",
  57. Short: "RGB lighting commands",
  58. }
  59. cmd.PersistentFlags().StringVar(&targetDevice, "device", "", "HID device path to use")
  60. return cmd
  61. }