123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- package remdesaux
- /*
- RemdesAux - Auxiliary MCU Control for RemdeskVM
- This module provides functions to interact with the auxiliary MCU (CH552G)
- used in RemdeskVM for managing USB switching and power/reset button simulation.
- */
- import (
- "bufio"
- "strings"
- "sync"
- "time"
- "github.com/tarm/serial"
- )
- type USB_mass_storage_side int
- const (
- USB_MASS_STORAGE_KVM USB_mass_storage_side = iota
- USB_MASS_STORAGE_REMOTE
- )
- type AuxMcu struct {
- usb_mass_storage_side USB_mass_storage_side
- port *serial.Port
- reader *bufio.Reader
- mu sync.Mutex
- }
- // NewAuxOutbandController initializes a new AuxMcu instance
- func NewAuxOutbandController(portName string, baudRate int) (*AuxMcu, error) {
- c := &serial.Config{
- Name: portName,
- Baud: baudRate,
- ReadTimeout: time.Second * 2,
- }
- port, err := serial.OpenPort(c)
- if err != nil {
- return nil, err
- }
- return &AuxMcu{
- usb_mass_storage_side: USB_MASS_STORAGE_KVM, //Default to KVM side, defined in MCU firmware
- port: port,
- reader: bufio.NewReader(port),
- }, nil
- }
- func (c *AuxMcu) Close() error {
- c.mu.Lock()
- defer c.mu.Unlock()
- if c.port != nil {
- return c.port.Close()
- }
- return nil
- }
- // sendCommand writes a single byte command to the serial port
- func (c *AuxMcu) sendCommand(cmd byte) error {
- c.mu.Lock()
- defer c.mu.Unlock()
- _, err := c.port.Write([]byte{cmd})
- return err
- }
- // SwitchUSBToKVM switches USB mass storage to KVM side
- func (c *AuxMcu) SwitchUSBToKVM() error {
- c.usb_mass_storage_side = USB_MASS_STORAGE_KVM
- return c.sendCommand('m')
- }
- // SwitchUSBToRemote switches USB mass storage to remote computer
- func (c *AuxMcu) SwitchUSBToRemote() error {
- c.usb_mass_storage_side = USB_MASS_STORAGE_REMOTE
- return c.sendCommand('n')
- }
- // PressPowerButton simulates pressing the power button
- func (c *AuxMcu) PressPowerButton() error {
- return c.sendCommand('p')
- }
- // ReleasePowerButton simulates releasing the power button
- func (c *AuxMcu) ReleasePowerButton() error {
- return c.sendCommand('s')
- }
- // PressResetButton simulates pressing the reset button
- func (c *AuxMcu) PressResetButton() error {
- return c.sendCommand('r')
- }
- // ReleaseResetButton simulates releasing the reset button
- func (c *AuxMcu) ReleaseResetButton() error {
- return c.sendCommand('d')
- }
- // GetUUID requests the device UUID and returns it as a string
- func (c *AuxMcu) GetUUID() (string, error) {
- if err := c.sendCommand('u'); err != nil {
- return "", err
- }
- line, err := c.reader.ReadString('\n')
- if err != nil {
- return "", err
- }
- line = strings.TrimSpace(line)
- return line, nil
- }
- func (c *AuxMcu) GetUSBMassStorageSide() USB_mass_storage_side {
- c.mu.Lock()
- defer c.mu.Unlock()
- return c.usb_mass_storage_side
- }
|