package devices import ( "fmt" "log" "go.bug.st/serial" ) type Coin int func (c Coin) Value() int { return int(c) } func (c Coin) String() string { switch c { case Quarter: return "Quarter (25c)" case Dime: return "Dime (10c)" case Nickel: return "Nickel (5c)" case Penny: return "Penny (1c)" default: return fmt.Sprintf("Unknown Coin (%d)", c) } } const ( Quarter Coin = 25 Dime Coin = 10 Nickel Coin = 5 Penny Coin = 1 ) type CoinAcceptor interface { Start() error Close() error Coins() <-chan Coin } type DG600F struct { PortName string BaudRate int coins chan Coin port serial.Port } func (c *DG600F) Start() error { mode := &serial.Mode{ BaudRate: c.BaudRate, DataBits: 8, Parity: serial.EvenParity, StopBits: serial.TwoStopBits, } port, err := serial.Open(c.PortName, mode) if err != nil { return err } c.port = port c.coins = make(chan Coin, 10) log.Println("Coin acceptor started") go c.listen() return nil } func (c *DG600F) listen() { for { data := make([]byte, 1) _, err := c.port.Read(data) if err != nil { log.Println("Error reading from port:", err) return } if data[0] == 0x00 { continue } c.coins <- Coin(data[0]) } } func (c *DG600F) Close() error { return c.port.Close() } func (c *DG600F) Coins() <-chan Coin { return c.coins }