00001
00002 class Message;
00009
00010
00011
00031
00032 class Hierarchical_State_Machine
00033 {
00037
00038 class Unit_State
00039 {
00040 public:
00041
00043 virtual void On_Switchover(Hierarchical_State_Machine &u, const Message *p_Message) {}
00044
00046 virtual void On_Fault_Trigger(Hierarchical_State_Machine &u, const Message *p_Message) {}
00047
00049 virtual void On_Diagnostics_Failed(Hierarchical_State_Machine &u, const Message *p_Message) {}
00050
00052 virtual void On_Diagnostics_Passed(Hierarchical_State_Machine &u, const Message *p_Message) {}
00053
00055 virtual void On_Operator_Inservice(Hierarchical_State_Machine &u, const Message *p_Message) {}
00056 };
00057 friend Unit_State;
00058
00059
00062
00063 class Inservice : public Unit_State
00064 {
00065 public:
00066 void On_Switchover(Hierarchical_State_Machine &u, const Message *p_Message);
00067 void On_Fault_Trigger(Hierarchical_State_Machine &u, const Message *p_Message);
00068 };
00069 friend Inservice;
00070
00075
00076 class Active : public Inservice
00077 {
00078 public:
00079 void On_Switchover(Hierarchical_State_Machine &u, const Message *p_Message);
00080 void On_Fault_Trigger(Hierarchical_State_Machine &u, const Message *p_Message);
00081 };
00082 friend Active;
00083
00088
00089 class Standby : public Inservice
00090 {
00091 public:
00092 void On_Switchover(Hierarchical_State_Machine &u, const Message *p_Message);
00093 };
00094 friend Standby;
00095
00098
00099 class Out_Of_Service : public Unit_State
00100 {
00101 public:
00102 void On_Operator_Inservice(Hierarchical_State_Machine &u, const Message *p_Message);
00103 };
00104 friend Out_Of_Service;
00105
00109 class Suspect : public Out_Of_Service
00110 {
00111 public:
00112 void On_Diagnostics_Failed(Hierarchical_State_Machine &u, const Message *p_Message);
00113 void On_Diagnostics_Passed(Hierarchical_State_Machine &u, const Message *p_Message);
00114 void On_Operator_Inservice(Hierarchical_State_Machine &u, const Message *p_Message);
00115 };
00116 friend Suspect;
00117
00121 class Failed : public Out_Of_Service
00122 {
00123 public:
00124
00125 };
00126 friend Failed;
00127
00128 private:
00130 static Active Active_State;
00131
00133 static Standby Standby_State;
00134
00136 static Suspect Suspect_State;
00137
00139 static Failed Failed_State;
00140
00141 void Next_State(Unit_State &r_State);
00142
00143
00144
00145
00146 virtual void Send_Diagnostics_Request();
00147 virtual void Raise_Alarm(int reason);
00148 virtual void Clear_Alarm(int reason);
00149 virtual void Perform_Switchover();
00150
00151 virtual void Send_Switchover_Response();
00152 virtual void Send_Operator_Inservice_Response();
00153 virtual void Send_Diagnostics_Failure_Report();
00154 virtual void Send_Diagnostics_Pass_Report();
00155 virtual void Abort_Diagnostics();
00156 virtual void Check_Mate_Status();
00157
00159 Unit_State *p_Current_State;
00160
00161 public:
00162 void On_Message(const Message *p_Message);
00163 };
00164
00168
00169 void Hierarchical_State_Machine::Next_State(Unit_State &r_State)
00170 {
00171 p_Current_State = &r_State;
00172 }
00173
00174