main.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package main
  2. import (
  3. "embed"
  4. "flag"
  5. "io/fs"
  6. "log"
  7. "net/http"
  8. "imuslab.com/remdeskvm/remdeskd/mod/remdesaux"
  9. "imuslab.com/remdeskvm/remdeskd/mod/remdeshid"
  10. "imuslab.com/remdeskvm/remdeskd/mod/usbcapture"
  11. )
  12. const defaultDevMode = true
  13. var (
  14. developent = flag.Bool("dev", defaultDevMode, "Enable development mode with local static files")
  15. mode = flag.String("mode", "usbkvm", "Mode of operation: kvm or capture")
  16. usbKVMDeviceName = flag.String("usbhid", "/dev/ttyUSB0", "USB KVM device file path")
  17. usbAuxilaryDeviceName = flag.String("auxmcu", "/dev/ttyACM0", "USB Auxiliary MCU device file path")
  18. usbKVMBaudRate = flag.Int("baudrate", 115200, "USB KVM baud rate")
  19. usbAuxBaudRate = flag.Int("auxbaudrate", 115200, "USB Auxiliary MCU baud rate")
  20. captureDeviceName = flag.String("capture", "/dev/video0", "Video capture device file path")
  21. /* Internal Modules */
  22. usbKVM *remdeshid.Controller
  23. auxMCU *remdesaux.AuxMcu
  24. videoCapture *usbcapture.Instance
  25. )
  26. /* Web Server Static Files */
  27. //go:embed www
  28. var embeddedFiles embed.FS
  29. var webfs http.FileSystem
  30. func init() {
  31. // Initiate the web server static files
  32. if *developent {
  33. webfs = http.Dir("./www")
  34. } else {
  35. // Embed the ./www folder and trim the prefix
  36. subFS, err := fs.Sub(embeddedFiles, "www")
  37. if err != nil {
  38. log.Fatal(err)
  39. }
  40. webfs = http.FS(subFS)
  41. }
  42. }
  43. func main() {
  44. flag.Parse()
  45. // Initiate the HID controller
  46. usbKVM = remdeshid.NewHIDController(&remdeshid.Config{
  47. PortName: *usbKVMDeviceName,
  48. BaudRate: *usbKVMBaudRate,
  49. ScrollSensitivity: 0x01, // Set mouse scroll sensitivity
  50. })
  51. switch *mode {
  52. case "cfgchip":
  53. err := SetupHIDCommunication()
  54. if err != nil {
  55. log.Fatal(err)
  56. }
  57. case "debug":
  58. result, err := discoverUsbKvmSubtree()
  59. if err != nil {
  60. log.Fatal(err)
  61. }
  62. for i, dev := range result {
  63. log.Printf("Device %d:\n", i)
  64. log.Printf(" - USB KVM Device: %s\n", dev.USBKVMDevicePath)
  65. log.Printf(" - Aux MCU Device: %s\n", dev.AuxMCUDevicePath)
  66. for _, cap := range dev.CaptureDevicePaths {
  67. log.Printf(" - Capture Device: %s\n", cap)
  68. }
  69. for _, snd := range dev.AlsaDevicePaths {
  70. log.Printf(" - ALSA Device: %s\n", snd)
  71. }
  72. }
  73. case "usbkvm":
  74. err := startUsbKvmMode()
  75. if err != nil {
  76. log.Fatal(err)
  77. }
  78. case "list-audio-devices":
  79. log.Println("Starting in List Audio Devices mode...")
  80. //Get the audio devices
  81. path, err := usbcapture.FindHDMICapturePCMPath()
  82. if err != nil {
  83. log.Fatalf("Failed to find HDMI capture PCM path: %v", err)
  84. }
  85. log.Printf("Found HDMI capture PCM path: %s\n", path)
  86. //List all audio capture devices
  87. captureDevs, err := usbcapture.ListCaptureDevices()
  88. if err != nil {
  89. log.Fatalf("Failed to list capture devices: %v", err)
  90. }
  91. log.Println("Available audio capture devices:")
  92. for _, dev := range captureDevs {
  93. log.Printf(" - %s\n", dev)
  94. }
  95. default:
  96. log.Fatalf("Unknown mode: %s. Supported modes are: usbkvm, capture", *mode)
  97. }
  98. }