// Entry() is part of the interface State. // It would be called on state entry. func (self *CodeState) Entry(sm hsm.HSM, event hsm.Event) hsm.State { Logln(self.ID(), "- Entry") hsm.AssertEqual(event.Type(), hsm.EventEntry) hsm.AssertTrue(self.entryCount >= self.initCount) self.entryCount++ return nil }
// Handle() is part of the interface State. // It would be called with input events. // Please refer to the state chart for all state transfers and // actions round them. func (self *CodeState) Handle(sm hsm.HSM, event hsm.Event) hsm.State { Logln(self.ID(), "- Handle") switch event.Type() { case EventSlash: // Trigger a state transfer. The target state is slash state. sm.QTranOnEvent(StateSlashID, event) // Return nil to tell the state machine that this event is completely // handled. No need to propagrate it to our super state. return nil case EventChar: e, ok := event.(*CCommentCharEvent) hsm.AssertTrue(ok) commentHSM, ok := sm.(*CCommentHSM) hsm.AssertTrue(ok) commentHSM.ProcessCodeChar(e.Char()) return nil } // Return super state to tell the state machine that this event is // not completely handled. Please propagrate it to our super state. return self.Super() }
// Init() is part of the interface State. // It would be called on state initialization. func (self *CodeState) Init(sm hsm.HSM, event hsm.Event) hsm.State { Logln(self.ID(), "- Init") hsm.AssertEqual(event.Type(), hsm.EventInit) hsm.AssertTrue(self.entryCount >= self.initCount) self.initCount++ // Return super state in Init() to tell state machine that // this state doesn't has state needed to be initialized. // If QInit() is called(there is a state/sub-state needed to be // initialized), then return nil. // QTran() is not suitable to call in Init(), only QInit() could // be used. return self.Super() }
func (self *SlashState) Handle(sm hsm.HSM, event hsm.Event) hsm.State { Logln(self.ID(), "- Handle") switch event.Type() { case EventChar: fallthrough case EventSlash: e, ok := event.(CCommentEvent) hsm.AssertTrue(ok) commentHSM, ok := sm.(*CCommentHSM) hsm.AssertTrue(ok) // Record a slash char and e.Char() before calling QTran() to // trigger a state transfer, since both Entry and Exit of this state // are not good places for these codes. commentHSM.ProcessCodeChar('/') commentHSM.ProcessCodeChar(e.Char()) sm.QTran(StateCodeID) return nil case EventStar: sm.QTran(StateCommentID) return nil } return self.Super() }
func (self *S11State) Handle(sm hsm.HSM, event hsm.Event) hsm.State { Logln(self.ID(), "- Handle e =", PrintEvent(event.Type())) switch event.Type() { case EventG: sm.QTran(StateS211ID) return nil case EventH: annotatedHSM, ok := sm.(*AnnotatedHSM) hsm.AssertTrue(ok) if annotatedHSM.GetFoo() { annotatedHSM.SetFoo(false) return nil } } return self.Super() }