Files
beeon/app/cmd/cli/cli.go
Mike Trudeau 2d168f4a3a migrate
2026-02-13 20:33:17 +00:00

209 lines
5.1 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"os"
"strings"
"microjelly.com/beeon/app/pkg/device"
"microjelly.com/beeon/app/pkg/device/keycodes"
"microjelly.com/beeon/app/pkg/device/report3"
)
var (
appVersion string = "1.01"
vendorID uint16 = 0x16d0
productID uint16 = 0x09fa
)
func main() {
var (
action string = "none"
serialNumber string = ""
inState string = ""
newState report3.State = report3.StateUnset
inRate string = ""
newRate report3.Rate = report3.RateUnset
newMode report3.Mode = report3.ModeUnset
inMouseMode string = ""
newMouseMode report3.MouseMode = report3.MouseModeUnset
inKeyCode uint = 256
newKeyCode keycodes.KeyCode = keycodes.KeyUnset
)
debugFlag := flag.Bool("debug", false, "enable debug logging")
listFlag := flag.Bool("list", false, "list connected devices")
readFlag := flag.Bool("read", false, "read device config")
flag.StringVar(&serialNumber, "serial", "", "target specific device by serial_number")
flag.StringVar(&inState, "state", "", "change device state <idle|active>")
flag.StringVar(&inRate, "rate", "", "change device rate <extra-slow|slow|normal|fast>")
flag.StringVar(&inMouseMode, "mouse", "", "change to mouse mode and set mode <circle|random>")
flag.UintVar(&inKeyCode, "keyboard", 256, "change to keyboard mode and set keycod")
flag.Parse()
if *debugFlag {
device.SetLogLevel(device.LogDebug)
}
if *listFlag {
action = "list"
} else if *readFlag {
action = "read"
}
log.Printf("beeon-cli core:%s usb:%t", device.Version(), device.UsbSupported())
if serialNumber != "" {
log.Printf("serial:%s", serialNumber)
}
if action == "list" {
devs, err := device.Enumerate(vendorID, productID)
if err != nil {
panic(err)
}
for i, _dev := range devs {
log.Printf("[%d] %s:v%s:%s:%s",
i,
_dev.Serial,
fmt.Sprintf("%d.%02d", (_dev.Version&0xff00)>>8, (_dev.Version&0x00ff)),
_dev.Manufacturer,
_dev.Product,
)
}
os.Exit(0)
}
if action == "read" {
r3, err := device.ReadReport3(vendorID, productID, serialNumber)
if err != nil {
log.Printf(err.Error())
os.Exit(1)
}
log.Printf("%+v", r3)
}
if inMouseMode != "" {
switch strings.ToLower(inMouseMode) {
case "circle":
newMouseMode = report3.MouseModeCircle
newMode = report3.ModeMouse
action = "write"
case "random":
newMouseMode = report3.MouseModeRandom
newMode = report3.ModeMouse
action = "write"
default:
log.Printf("invalid mouse-mode %s", inMouseMode)
}
}
if inKeyCode != 256 && action == "none" {
newKeyCode = keycodes.KeyCode(inKeyCode)
newMode = report3.ModeKeyboard
action = "write"
}
if inState != "" {
switch strings.ToLower(inState) {
case "idle":
newState = report3.StateIdle
action = "write"
case "active":
newState = report3.StateActive
action = "write"
default:
log.Printf("invalid state %s", inState)
}
}
if inRate != "" {
switch strings.ToLower(inRate) {
case "extra-slow":
newRate = report3.RateExtraSlow
action = "write"
case "slow":
newRate = report3.RateSlow
action = "write"
case "normal":
newRate = report3.RateNormal
action = "write"
case "fast":
newRate = report3.RateFast
action = "write"
default:
log.Printf("invalid rate %s", inRate)
}
}
if action == "none" {
flag.PrintDefaults()
os.Exit(1)
}
if action == "write" {
hasChange := false
whatChanged := []string{}
r3, err := device.ReadReport3(vendorID, productID, serialNumber)
if err != nil {
log.Printf(err.Error())
os.Exit(1)
}
if (newMode != report3.ModeUnset) && (r3.Mode != newMode) {
whatChanged = append(whatChanged, fmt.Sprintf("Mode(%s>%s)", r3.Mode, newMode))
r3.Mode = newMode
hasChange = true
} else {
r3.Mode = report3.ModeUnset
}
if newKeyCode != keycodes.KeyUnset && (newKeyCode != r3.KeyCode) {
whatChanged = append(whatChanged, fmt.Sprintf("KeyCode(%s>%s)", r3.KeyCode, newKeyCode))
r3.KeyCode = newKeyCode
hasChange = true
} else {
r3.KeyCode = keycodes.KeyUnset
}
if newMouseMode != report3.MouseModeUnset && (newMouseMode != r3.MouseMode) {
whatChanged = append(whatChanged, fmt.Sprintf("MouseMode(%s>%s)", r3.MouseMode, newMouseMode))
r3.MouseMode = newMouseMode
hasChange = true
} else {
r3.MouseMode = report3.MouseModeUnset
}
if newState != report3.StateUnset && (newState != r3.State) {
whatChanged = append(whatChanged, fmt.Sprintf("State(%s>%s)", r3.State, newState))
r3.State = newState
hasChange = true
} else {
r3.State = report3.StateUnset
}
if newRate != report3.RateUnset && (newRate != r3.Rate) {
whatChanged = append(whatChanged, fmt.Sprintf("Rate(%s>%s)", r3.Rate, newRate))
r3.Rate = newRate
hasChange = true
} else {
r3.Rate = report3.RateUnset
}
if hasChange {
err := device.WriteReport3(vendorID, productID, serialNumber, r3.Bytes())
if err != nil {
log.Printf(err.Error())
os.Exit(1)
}
log.Printf("changes made {%s}", strings.Join(whatChanged, "; "))
} else {
log.Printf("no changes")
}
}
}