00001
00002
00003
00004
00005
00006
00007
00008 #include "Hierarchical_State_Machine.h"
00009 #include "Unit_Messages.h"
00010 #include "assert.h"
00011
00016
00017 void Hierarchical_State_Machine::On_Message(const Message *p_Message)
00018 {
00019 switch (p_Message->GetType())
00020 {
00021 case Message::FAULT_TRIGGER:
00022 p_Current_State->On_Fault_Trigger(*this, p_Message);
00023 break;
00024
00025 case Message::SWITCHOVER:
00026 p_Current_State->On_Switchover(*this, p_Message);
00027 break;
00028
00029 case Message::DIAGNOSTICS_PASSED:
00030 p_Current_State->On_Diagnostics_Passed(*this, p_Message);
00031 break;
00032
00033 case Message::DIAGNOSTICS_FAILED:
00034 p_Current_State->On_Diagnostics_Failed(*this, p_Message);
00035 break;
00036
00037 case Message::OPERATOR_INSERVICE:
00038 p_Current_State->On_Operator_Inservice(*this, p_Message);
00039 break;
00040
00041 default:
00042 assert(false);
00043 break;
00044 }
00045 }
00046
00055
00056 void Hierarchical_State_Machine::Inservice::On_Fault_Trigger(Hierarchical_State_Machine &u, const Message *p_Message)
00057 {
00058 u.Next_State(u.Suspect_State);
00059 u.Send_Diagnostics_Request();
00060 u.Raise_Alarm(LOSS_OF_REDUNDANCY);
00061 }
00062
00070
00071 void Hierarchical_State_Machine::Inservice::On_Switchover(Hierarchical_State_Machine &u, const Message *p_Message)
00072 {
00073 u.Perform_Switchover();
00074 u.Check_Mate_Status();
00075 u.Send_Switchover_Response();
00076 }
00077
00088
00089 void Hierarchical_State_Machine::Active::On_Fault_Trigger(Hierarchical_State_Machine &u, const Message *p_Message)
00090 {
00091 u.Perform_Switchover();
00092 Inservice::On_Fault_Trigger(u, p_Message);
00093 }
00094
00100
00101 void Hierarchical_State_Machine::Active::On_Switchover(Hierarchical_State_Machine &u, const Message *p_Message)
00102 {
00103 Inservice::On_Switchover(u, p_Message);
00104 u.Next_State(u.Standby_State);
00105 }
00106
00112
00113 void Hierarchical_State_Machine::Standby::On_Switchover(Hierarchical_State_Machine &u, const Message *p_Message)
00114 {
00115 Inservice::On_Switchover(u, p_Message);
00116 u.Next_State(u.Active_State);
00117 }
00118
00127
00128 void Hierarchical_State_Machine::Out_Of_Service::On_Operator_Inservice(Hierarchical_State_Machine &u, const Message *p_Message)
00129 {
00130
00131
00132 u.Send_Diagnostics_Request();
00133 u.Send_Operator_Inservice_Response();
00134 u.Next_State(u.Suspect_State);
00135 }
00136
00142
00143 void Hierarchical_State_Machine::Suspect::On_Diagnostics_Failed(Hierarchical_State_Machine &u, const Message *p_Message)
00144 {
00145 u.Send_Diagnostics_Failure_Report();
00146 u.Next_State(u.Failed_State);
00147 }
00148
00155
00156 void Hierarchical_State_Machine::Suspect::On_Diagnostics_Passed(Hierarchical_State_Machine &u, const Message *p_Message)
00157 {
00158 u.Send_Diagnostics_Pass_Report();
00159 u.Clear_Alarm(LOSS_OF_REDUNDANCY);
00160 u.Next_State(u.Standby_State);
00161 }
00162
00167
00168 void Hierarchical_State_Machine::Suspect::On_Operator_Inservice(Hierarchical_State_Machine &u, const Message *p_Message)
00169 {
00170 u.Abort_Diagnostics();
00171 Out_Of_Service::On_Operator_Inservice(u, p_Message);
00172 }