112 lines
2.2 KiB
Go
112 lines
2.2 KiB
Go
// Package peripheral will handle communicating with peripherals
|
|
package peripheral
|
|
|
|
import (
|
|
"esdi/peripheral/devices"
|
|
"fmt"
|
|
"path/filepath"
|
|
)
|
|
|
|
type PeripheralType string
|
|
|
|
const (
|
|
DisplayPeripheral PeripheralType = "display"
|
|
)
|
|
|
|
type PeripheralDeviceClerk struct {
|
|
// mu sync.RWMutex
|
|
Devices map[uint8]*PeripheralDevice
|
|
}
|
|
|
|
func NewPeripheralDeviceClerk() *PeripheralDeviceClerk {
|
|
return &PeripheralDeviceClerk{
|
|
Devices: make(map[uint8]*PeripheralDevice),
|
|
}
|
|
}
|
|
|
|
func (clerk *PeripheralDeviceClerk) listPorts() ([]string, error) {
|
|
ttyUSBs, err := filepath.Glob("/dev/ttyUSB*")
|
|
if err != nil {
|
|
return []string{}, err
|
|
}
|
|
|
|
return ttyUSBs, nil
|
|
}
|
|
|
|
func (clerk *PeripheralDeviceClerk) addDevice(dev *PeripheralDevice) {
|
|
clerk.Devices[dev.ID] = dev
|
|
}
|
|
|
|
func (clerk *PeripheralDeviceClerk) FindDeviceAPI(ID uint8) *devices.Device {
|
|
for _, d := range devices.DeviceMap {
|
|
if d.ID == ID {
|
|
return &d
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (clerk *PeripheralDeviceClerk) FindDevices() error {
|
|
ports, err := clerk.listPorts()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, p := range ports {
|
|
newDevice := NewPeripheralDevice(p)
|
|
|
|
err := newDevice.Probe()
|
|
if err != nil {
|
|
fmt.Println(p, err.Error())
|
|
continue
|
|
}
|
|
|
|
// Look for the device on our device list - we need its API
|
|
newDevice.DeviceAPI = clerk.FindDeviceAPI(newDevice.ID)
|
|
if newDevice.DeviceAPI == nil {
|
|
fmt.Printf("Failed to acquire API for device: [%2d] %s\n",
|
|
newDevice.ID, newDevice.Name)
|
|
}
|
|
|
|
clerk.addDevice(newDevice)
|
|
fmt.Println(p, string(newDevice.Name[:]))
|
|
}
|
|
|
|
// go clerk.clerkBackgroundJob()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (clerk *PeripheralDeviceClerk) ListDevices() error {
|
|
for _, d := range clerk.Devices {
|
|
fmt.Printf("[%2d] %s\n", d.ID, d.Name)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (clerk *PeripheralDeviceClerk) ListDeviceAPI(ID uint8) error {
|
|
if _, ok := clerk.Devices[ID]; !ok {
|
|
return fmt.Errorf("device with ID %d not found", ID)
|
|
}
|
|
|
|
for _, f := range clerk.Devices[ID].DeviceAPI.API {
|
|
fmt.Printf("%s\t%s\n", f.Name, f.Desc)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// func (c *PeripheralDeviceClerk) clerkBackgroundJob() {
|
|
// for {
|
|
// c.mu.RLock()
|
|
// for _, d := range c.Devices {
|
|
// // Check the state of the device
|
|
// if d.CommState == CommIdle {
|
|
// }
|
|
// }
|
|
// c.mu.Unlock()
|
|
// }
|
|
// }
|