Files
Microtransactions64-server/devices/coin_acceptor.go
2025-11-27 22:14:23 -07:00

97 lines
1.3 KiB
Go

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
}