main.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "os"
  6. "github.com/spf13/cobra"
  7. "netdome.biz/paul/impact-80/internal/device"
  8. )
  9. // version is set at build time via -ldflags.
  10. var version = "dev"
  11. var (
  12. targetDevice string
  13. targetZone string
  14. )
  15. func newRootCommand() *cobra.Command {
  16. cmd := &cobra.Command{
  17. Use: "qmk-rgb-tool",
  18. Short: "QMK RGB CLI — control QMK keyboard lighting",
  19. SilenceErrors: true,
  20. SilenceUsage: true,
  21. }
  22. cmd.PersistentFlags().StringVar(&targetDevice, "device", "", "HID device path to use")
  23. cmd.PersistentFlags().StringVar(&targetZone, "zone", "", "RGB lighting zone (logo, backlight, side)")
  24. cmd.PersistentPreRunE = func(*cobra.Command, []string) error {
  25. _, err := selectedZones()
  26. return err
  27. }
  28. return cmd
  29. }
  30. var rootCmd = newRootCommand()
  31. func Execute() {
  32. if err := rootCmd.Execute(); err != nil {
  33. fmt.Fprintf(os.Stderr, "Error: %v\n", err)
  34. os.Exit(1)
  35. }
  36. }
  37. func main() {
  38. Execute()
  39. }
  40. var keyboardCmd = &cobra.Command{
  41. Use: "keyboard",
  42. Short: "Keyboard management commands",
  43. }
  44. var keyboardInfoCmd = &cobra.Command{
  45. Use: "info",
  46. Short: "Discover connected QMK keyboards",
  47. Long: "Scan for connected QMK keyboards (both supported and unknown) and print device info as JSON.",
  48. Run: func(cmd *cobra.Command, args []string) {
  49. keyboards, err := device.LoadKeyboards()
  50. if err != nil {
  51. fmt.Fprintf(os.Stderr, "Error: %v\n", err)
  52. os.Exit(1)
  53. }
  54. devices, err := device.DiscoverAllQMK(keyboards)
  55. if err != nil {
  56. fmt.Fprintf(os.Stderr, "Error: %v\n", err)
  57. os.Exit(1)
  58. }
  59. if len(devices) == 0 {
  60. fmt.Println(`{"devices":[],"unknown":[],"total":0}`)
  61. return
  62. }
  63. var known []device.UnknownDevice
  64. var unknown []device.UnknownDevice
  65. for _, d := range devices {
  66. if d.Supported {
  67. known = append(known, d)
  68. } else {
  69. unknown = append(unknown, d)
  70. }
  71. }
  72. type Info struct {
  73. Devices []device.UnknownDevice `json:"devices"`
  74. Unknown []device.UnknownDevice `json:"unknown"`
  75. Total int `json:"total"`
  76. }
  77. out := Info{Devices: devices, Unknown: unknown, Total: len(devices)}
  78. data, _ := json.MarshalIndent(out, "", " ")
  79. fmt.Println(string(data))
  80. },
  81. }
  82. func init() {
  83. rootCmd.AddCommand(keyboardCmd)
  84. keyboardCmd.AddCommand(keyboardInfoCmd)
  85. rootCmd.AddCommand(NewEnableCmd())
  86. rootCmd.AddCommand(NewDisableCmd())
  87. rootCmd.AddCommand(NewInfoCmd())
  88. rootCmd.AddCommand(NewEffectCmd())
  89. rootCmd.AddCommand(NewBrightnessCmd())
  90. rootCmd.AddCommand(NewSpeedCmd())
  91. rootCmd.AddCommand(NewColorCmd())
  92. rootCmd.AddCommand(NewModeCmd())
  93. rootCmd.AddCommand(NewProfileSaveCmd())
  94. rootCmd.AddCommand(NewProfileLoadCmd())
  95. rootCmd.AddCommand(NewProfileListCmd())
  96. rootCmd.AddCommand(NewProfileDeleteCmd())
  97. rootCmd.Version = version
  98. rootCmd.SetVersionTemplate(" qmk-rgb-tool {{.Version}}\n")
  99. }