func (sys *CFSMs) chanToMachine(ch Role, T string, m *cfsm.CFSM) { q0 := m.NewState() qEnd := m.NewState() for _, machine := range sys.Roles { q1 := m.NewState() // q0 -- Recv --> q1 tr0 := cfsm.NewRecv(machine, T) tr0.SetNext(q1) q0.AddTransition(tr0) // q1 -- Send --> q0 for _, machine2 := range sys.Roles { if machine.ID != machine2.ID { tr1 := cfsm.NewSend(machine2, T) tr1.SetNext(q0) q1.AddTransition(tr1) } } // q0 -- STOP --> qEnd (same qEnd) tr2 := cfsm.NewRecv(machine, STOP) tr2.SetNext(qEnd) qEnd.AddTransition(tr2) // qEnd -- STOP --> qEnd for _, machine2 := range sys.Roles { if machine.ID != machine2.ID { tr3 := cfsm.NewSend(machine2, STOP) tr3.SetNext(qEnd) qEnd.AddTransition(tr3) } } } m.Start = q0 }
func (sys *CFSMs) rootToMachine(role Role, root Node, m *cfsm.CFSM) { q0 := m.NewState() sys.nodeToMachine(role, root, q0, m) m.Start = q0 }