main.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package main
  2. import (
  3. "embed"
  4. "flag"
  5. "io/fs"
  6. "log"
  7. "net/http"
  8. "os"
  9. "os/signal"
  10. "syscall"
  11. "imuslab.com/remdeskvm/remdeskd/mod/remdeshid"
  12. "imuslab.com/remdeskvm/remdeskd/mod/usbcapture"
  13. )
  14. const development = true
  15. var (
  16. usbKVMDeviceName = flag.String("usbkvm", "/dev/ttyACM0", "USB KVM device file path")
  17. usbKVMBaudRate = flag.Int("baudrate", 115200, "USB KVM baud rate")
  18. captureDeviceName = flag.String("capture", "/dev/video0", "Video capture device file path")
  19. usbKVM *remdeshid.Controller
  20. videoCapture *usbcapture.Instance
  21. )
  22. /* Web Server Static Files */
  23. //go:embed www
  24. var embeddedFiles embed.FS
  25. var webfs http.FileSystem
  26. func init() {
  27. // Initiate the web server static files
  28. if development {
  29. webfs = http.Dir("./www")
  30. } else {
  31. // Embed the ./www folder and trim the prefix
  32. subFS, err := fs.Sub(embeddedFiles, "www")
  33. if err != nil {
  34. log.Fatal(err)
  35. }
  36. webfs = http.FS(subFS)
  37. }
  38. }
  39. func main() {
  40. flag.Parse()
  41. // Initiate the HID controller
  42. usbKVM = remdeshid.NewHIDController(&remdeshid.Config{
  43. PortName: *usbKVMDeviceName,
  44. BaudRate: *usbKVMBaudRate,
  45. ScrollSensitivity: 0x01, // Set mouse scroll sensitivity
  46. })
  47. //Start the HID controller
  48. err := usbKVM.Connect()
  49. if err != nil {
  50. log.Fatal(err)
  51. }
  52. // Initiate the video capture device
  53. videoCapture, err = usbcapture.NewInstance(&usbcapture.Config{
  54. DeviceName: *captureDeviceName,
  55. })
  56. if err != nil {
  57. log.Fatalf("Failed to create video capture instance: %v", err)
  58. }
  59. //Get device information for debug
  60. usbcapture.PrintV4L2FormatInfo(*captureDeviceName)
  61. //Start the video capture device
  62. err = videoCapture.StartVideoCapture(&usbcapture.CaptureResolution{
  63. Width: 1920,
  64. Height: 1080,
  65. FPS: 10,
  66. })
  67. if err != nil {
  68. log.Fatal(err)
  69. }
  70. // Handle program exit to close the HID controller
  71. c := make(chan os.Signal, 1)
  72. signal.Notify(c, os.Interrupt, syscall.SIGTERM)
  73. go func() {
  74. <-c
  75. log.Println("Shutting down usbKVM...")
  76. //usbKVM.Close() //To fix close stuck layer
  77. log.Println("Shutting down capture device...")
  78. videoCapture.Close()
  79. os.Exit(0)
  80. }()
  81. // Start the web server
  82. http.Handle("/", http.FileServer(webfs))
  83. http.HandleFunc("/hid", usbKVM.HIDWebSocketHandler)
  84. http.HandleFunc("/stream", videoCapture.ServeVideoStream)
  85. addr := ":9000"
  86. log.Printf("Serving on http://localhost%s\n", addr)
  87. log.Fatal(http.ListenAndServe(addr, nil))
  88. }