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 ") flag.StringVar(&inRate, "rate", "", "change device rate ") flag.StringVar(&inMouseMode, "mouse", "", "change to mouse mode and set mode ") 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") } } }