package main import ( "embed" "flag" "io/fs" "log" "net/http" "imuslab.com/remdeskvm/remdeskd/mod/remdesaux" "imuslab.com/remdeskvm/remdeskd/mod/remdeshid" "imuslab.com/remdeskvm/remdeskd/mod/usbcapture" ) const defaultDevMode = true var ( developent = flag.Bool("dev", defaultDevMode, "Enable development mode with local static files") mode = flag.String("mode", "usbkvm", "Mode of operation: kvm or capture") usbKVMDeviceName = flag.String("usbhid", "/dev/ttyUSB0", "USB KVM device file path") usbAuxilaryDeviceName = flag.String("auxmcu", "/dev/ttyACM0", "USB Auxiliary MCU device file path") usbKVMBaudRate = flag.Int("baudrate", 115200, "USB KVM baud rate") usbAuxBaudRate = flag.Int("auxbaudrate", 115200, "USB Auxiliary MCU baud rate") captureDeviceName = flag.String("capture", "/dev/video0", "Video capture device file path") /* Internal Modules */ usbKVM *remdeshid.Controller auxMCU *remdesaux.AuxMcu videoCapture *usbcapture.Instance ) /* Web Server Static Files */ //go:embed www var embeddedFiles embed.FS var webfs http.FileSystem func init() { // Initiate the web server static files if *developent { webfs = http.Dir("./www") } else { // Embed the ./www folder and trim the prefix subFS, err := fs.Sub(embeddedFiles, "www") if err != nil { log.Fatal(err) } webfs = http.FS(subFS) } } func main() { flag.Parse() // Initiate the HID controller usbKVM = remdeshid.NewHIDController(&remdeshid.Config{ PortName: *usbKVMDeviceName, BaudRate: *usbKVMBaudRate, ScrollSensitivity: 0x01, // Set mouse scroll sensitivity }) switch *mode { case "cfgchip": err := SetupHIDCommunication() if err != nil { log.Fatal(err) } case "debug": result, err := discoverUsbKvmSubtree() if err != nil { log.Fatal(err) } for i, dev := range result { log.Printf("Device %d:\n", i) log.Printf(" - USB KVM Device: %s\n", dev.USBKVMDevicePath) log.Printf(" - Aux MCU Device: %s\n", dev.AuxMCUDevicePath) for _, cap := range dev.CaptureDevicePaths { log.Printf(" - Capture Device: %s\n", cap) } for _, snd := range dev.AlsaDevicePaths { log.Printf(" - ALSA Device: %s\n", snd) } } case "usbkvm": err := startUsbKvmMode() if err != nil { log.Fatal(err) } case "list-audio-devices": log.Println("Starting in List Audio Devices mode...") //Get the audio devices path, err := usbcapture.FindHDMICapturePCMPath() if err != nil { log.Fatalf("Failed to find HDMI capture PCM path: %v", err) } log.Printf("Found HDMI capture PCM path: %s\n", path) //List all audio capture devices captureDevs, err := usbcapture.ListCaptureDevices() if err != nil { log.Fatalf("Failed to list capture devices: %v", err) } log.Println("Available audio capture devices:") for _, dev := range captureDevs { log.Printf(" - %s\n", dev) } default: log.Fatalf("Unknown mode: %s. Supported modes are: usbkvm, capture", *mode) } }