1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package remdeshid
- import (
- "encoding/json"
- "fmt"
- "log"
- "net/http"
- "time"
- "github.com/gorilla/websocket"
- )
- type HIDCommand struct {
- EventType string `json:"t"`
- EventSubType string `json:"s"`
- Data string `json:"d"`
- PosX int `json:"x"` //Only used for mouse events
- PosY int `json:"y"` //Only used for mouse events
- }
- // HIDWebSocketHandler is a handler for the HID WebSocket connection
- var upgrader = websocket.Upgrader{
- ReadBufferSize: 1024,
- WriteBufferSize: 1024,
- CheckOrigin: func(r *http.Request) bool {
- return true
- },
- }
- func (c *Controller) HIDWebSocketHandler(w http.ResponseWriter, r *http.Request) {
- conn, err := upgrader.Upgrade(w, r, nil)
- if err != nil {
- log.Println("Failed to upgrade to websocket:", err)
- return
- }
- defer conn.Close()
- for {
- _, message, err := conn.ReadMessage()
- if err != nil {
- log.Println("Error reading message:", err)
- break
- }
- log.Printf("Received: %s", message)
- //Try parsing the message as a HIDCommand
- var hidCmd HIDCommand
- if err := json.Unmarshal(message, &hidCmd); err != nil {
- log.Println("Error parsing message:", err)
- continue
- }
- //Send the command to the HID controller
- bytes, err := ConvHIDCommandToBytes(hidCmd)
- if err != nil {
- errmsg := map[string]string{"error": err.Error()}
- if err := conn.WriteJSON(errmsg); err != nil {
- log.Println("Error writing message:", err)
- }
- continue
- }
- if bytes[0] == OPR_TYPE_MOUSE_SCROLL {
- currentTime := time.Now().UnixMilli()
- //Sending scroll too fast will cause the HID controller to glitch
- if currentTime-c.lastScrollTime < 20 {
- log.Println("Ignoring scroll event due to rate limiting")
- continue
- }
- c.lastScrollTime = currentTime
- }
- fmt.Println("Sending bytes:", bytes)
- //Write the bytes to the serial port
- if err := c.Send(bytes); err != nil {
- errmsg := map[string]string{"error": err.Error()}
- if err := conn.WriteJSON(errmsg); err != nil {
- log.Println("Error writing message:", err)
- }
- continue
- }
- if err := conn.WriteMessage(websocket.TextMessage, []byte("ok")); err != nil {
- log.Println("Error writing message:", err)
- continue
- }
- }
- }
|