Files
esdi/peripheral/device.go
T

108 lines
1.9 KiB
Go

package peripheral
import (
comm "esdi/peripheral/communication"
pack "esdi/peripheral/communication/packets"
"esdi/peripheral/devices"
"time"
"github.com/tarm/serial"
)
type PeripheralDeviceState int
const (
StateDiscoveredStr = "discovered"
StateConnectedStr = "connected"
StateUnknownStr = "unknown"
)
const (
StateUnknown PeripheralDeviceState = iota
StateDiscovered
StateConnected
)
func (s PeripheralDeviceState) String() string {
switch s {
case StateDiscovered:
return StateDiscoveredStr
case StateConnected:
return StateConnectedStr
case StateUnknown:
fallthrough
default:
return StateUnknownStr
}
}
type PeripheralDevice struct {
State PeripheralDeviceState
CommState comm.CommState
ID uint8
Name string
WT *comm.WalkieTalkie
DeviceAPI *devices.Device
}
func NewPeripheralDevice(port string) *PeripheralDevice {
return &PeripheralDevice{
State: StateUnknown,
CommState: comm.CommOff,
WT: &comm.WalkieTalkie{
Cfg: &serial.Config{
Name: port,
Baud: 115200,
ReadTimeout: 500 * time.Millisecond,
},
},
}
}
func (p *PeripheralDevice) Probe() error {
err := p.WT.TurnOn()
if err != nil {
return err
}
// Papers, please!
_, err = p.WT.RequestIdentification()
if err != nil {
return err
}
// Verify the papers
var pkt pack.IdentificationPacket
err = pkt.Read(p.WT)
if err != nil {
// Throw the man in the gulag!
return err
}
// Acknowledge successful identification
_, err = p.WT.AknowledgeIdentification()
if err != nil {
return err
}
// copy the data
p.Merge(&pkt)
p.ToConnectedIdling()
return nil
}
func (p *PeripheralDevice) ToConnectedIdling() {
p.State = StateConnected
p.CommState = comm.CommIdle
}
func (p *PeripheralDevice) Merge(packet *pack.IdentificationPacket) {
p.Name = string(packet.Name[:])
p.ID = packet.DeviceID
}
func (p *PeripheralDevice) Disconnect() error {
return p.WT.TurnOff()
}