mirror of
https://github.com/sipeed/NanoKVM.git
synced 2026-09-11 00:22:56 -05:00
Add an MCP Streamable HTTP server with token authentication, screenshot capture, keyboard, and mouse tools. Introduce shared control-mode and input-control coordination so MCP, PicoClaw, and local HID paths serialize ownership safely. Integrate PicoClaw gateway/runtime control handoff with PID-managed startup and focused unit coverage.
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package hid
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type reportWriter interface {
|
|
WriteKeyboardReport([]byte) error
|
|
WriteRelativeMouseReport([]byte) error
|
|
WriteAbsoluteMouseReport([]byte) error
|
|
}
|
|
|
|
func ReleaseAllHIDState() error {
|
|
return releaseAllHIDState(GetHid())
|
|
}
|
|
|
|
func ReleaseAllHIDStateBestEffort() error {
|
|
return releaseAllHIDStateBestEffort(GetHid())
|
|
}
|
|
|
|
func releaseAllHIDStateBestEffort(writer reportWriter) error {
|
|
if err := releaseAllHIDState(writer); err != nil {
|
|
log.Warnf("failed to release HID state during control switch: %v", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func releaseAllHIDState(writer reportWriter) error {
|
|
if writer == nil {
|
|
return fmt.Errorf("HID writer is unavailable")
|
|
}
|
|
|
|
var errs []error
|
|
if err := writer.WriteKeyboardReport(keyboardReleaseReport()); err != nil {
|
|
errs = append(errs, fmt.Errorf("release keyboard: %w", err))
|
|
}
|
|
if err := writer.WriteRelativeMouseReport(relativeMouseReleaseReport()); err != nil {
|
|
errs = append(errs, fmt.Errorf("release relative mouse: %w", err))
|
|
}
|
|
if err := writer.WriteAbsoluteMouseReport(absoluteMouseReleaseReport(nil)); err != nil {
|
|
errs = append(errs, fmt.Errorf("release absolute mouse: %w", err))
|
|
}
|
|
|
|
return errors.Join(errs...)
|
|
}
|