Files
esdi/peripheral/device.go
T

114 lines
2.2 KiB
Go

package peripheral
import (
comm "esdi/peripheral/communication"
pack "esdi/peripheral/communication/packets"
"esdi/peripheral/devices"
"esdi/peripheral/types"
"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
}
// Send the identification command
cmd := comm.CmdRequestID
var response pack.IdentificationPacket
err = p.WT.SendCommand(cmd, []byte{0x06, 0x07, 0x08, 0x09}, &response)
if err != nil {
return err
}
// copy the data
p.Merge(&response)
p.ToConnectedIdling()
return nil
}
func (p *PeripheralDevice) SendCommand(cmd types.Command, payload []byte) error {
// fmt.Fprintf(os.Stderr, "Send command: %+v\n", cmd)
// fmt.Fprintf(os.Stderr, "With payload: %+v\n", payload)
var ack pack.AckPacket
err := p.WT.SendCommand(cmd, payload, &ack)
if err != nil {
return err
}
// if ack.AckByte == 0x06 {
// fmt.Fprintf(os.Stderr, "Succesfully received ack")
// }
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()
}