package main import ( "fmt" "time" "gobot.io/x/gobot" "gobot.io/x/gobot/platforms/sphero" ) type conway struct { alive bool age int contacts int cell *sphero.SpheroDriver } func main() { master := gobot.NewMaster() spheros := []string{ "/dev/rfcomm0", "/dev/rfcomm1", "/dev/rfcomm2", } for _, port := range spheros { spheroAdaptor := sphero.NewAdaptor(port) cell := sphero.NewSpheroDriver(spheroAdaptor) cell.SetName("Sphero" + port) work := func() { conway := new(conway) conway.cell = cell conway.birth() cell.On(sphero.Collision, func(data interface{}) { conway.contact() }) gobot.Every(3*time.Second, func() { if conway.alive { conway.movement() } }) gobot.Every(10*time.Second, func() { if conway.alive { conway.birthday() } }) } robot := gobot.NewRobot("conway", []gobot.Connection{spheroAdaptor}, []gobot.Device{cell}, work, ) master.AddRobot(robot) } master.Start() } func (c *conway) resetContacts() { c.contacts = 0 } func (c *conway) contact() { c.contacts++ } func (c *conway) rebirth() { fmt.Println("Welcome back", c.cell.Name(), "!") c.life() } func (c *conway) birth() { c.resetContacts() c.age = 0 c.life() c.movement() } func (c *conway) life() { c.cell.SetRGB(0, 255, 0) c.alive = true } func (c *conway) death() { fmt.Println(c.cell.Name(), "died :(") c.alive = false c.cell.SetRGB(255, 0, 0) c.cell.Stop() } func (c *conway) enoughContacts() bool { if c.contacts >= 2 && c.contacts < 7 { return true } return false } func (c *conway) birthday() { c.age++ fmt.Println("Happy birthday", c.cell.Name(), "you are", c.age, "and had", c.contacts, "contacts.") if c.enoughContacts() { if !c.alive { c.rebirth() } } else { c.death() } c.resetContacts() } func (c *conway) movement() { if c.alive { c.cell.Roll(100, uint16(gobot.Rand(360))) } }