M1M3 Support System
Loading...
Searching...
No Matches
SafetyController.h
1/*
2 * This file is part of LSST M1M3 support system package.
3 *
4 * Developed for the Vera C. Rubin Telescope and Site System.
5 * This product includes software developed by the LSST Project
6 * (https://www.lsst.org).
7 * See the COPYRIGHT file at the top-level directory of this distribution
8 * for details of code ownership.
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
24#ifndef SAFETYCONTROLLER_H_
25#define SAFETYCONTROLLER_H_
26
27#include <list>
28
29#include <spdlog/spdlog.h>
30
31#include <SAL_MTM1M3C.h>
32
33#include <FaultCodes.h>
34#include <SafetyControllerSettings.h>
35#include <StateTypes.h>
36
37namespace LSST {
38namespace M1M3 {
39namespace SS {
40
50class SafetyController {
51public:
52 SafetyController(SafetyControllerSettings *safetyControllerSettings);
53
54 void clearErrorCode();
55
56 void airControllerNotifyCommandOutputMismatch(bool conditionFlag, bool commanded, bool sensed);
57 void airControllerNotifyCommandSensorMismatch(bool conditionFlag);
58
59 void displacementNotifySensorReportsInvalidCommand(bool conditionFlag);
60 void displacementNotifySensorReportsCommunicationTimeoutError(bool conditionFlag);
61 void displacementNotifySensorReportsDataLengthError(bool conditionFlag);
62 void displacementNotifySensorReportsNumberOfParametersError(bool conditionFlag);
63 void displacementNotifySensorReportsParameterError(bool conditionFlag);
64 void displacementNotifySensorReportsCommunicationError(bool conditionFlag);
65 void displacementNotifySensorReportsIDNumberError(bool conditionFlag);
66 void displacementNotifySensorReportsExpansionLineError(bool conditionFlag);
67 void displacementNotifySensorReportsWriteControlError(bool conditionFlag);
68 void displacementNotifyResponseTimeoutError(bool conditionFlag);
69 void displacementNotifyInvalidLength(bool conditionFlag);
70 void displacementNotifyInvalidResponse(bool conditionFlag);
71 void displacementNotifyUnknownCommand(bool conditionFlag);
72 void displacementNotifyUnknownProblem(bool conditionFlag);
73
74 void inclinometerNotifyResponseTimeout(bool conditionFlag);
75 void inclinometerNotifyInvalidCRC(bool conditionFlag);
76 void inclinometerNotifyUnknownAddress(bool conditionFlag);
77 void inclinometerNotifyUnknownFunction(bool conditionFlag);
78 void inclinometerNotifyInvalidLength(bool conditionFlag);
79 void inclinometerNotifySensorReportsIllegalDataAddress(bool conditionFlag);
80 void inclinometerNotifySensorReportsIllegalFunction(bool conditionFlag);
81 void inclinometerNotifyUnknownProblem(bool conditionFlag);
82
83 void interlockNotifyHeartbeatStateOutputMismatch(bool conditionFlag);
84 void interlockNotifyAuxPowerNetworksOff(bool conditionFlag);
85 void interlockNotifyThermalEquipmentOff(bool conditionFlag);
86 void interlockNotifyAirSupplyOff(bool conditionFlag);
87 void interlockNotifyCabinetDoorOpen(bool conditionFlag);
88 void interlockNotifyTMAMotionStop(bool conditionFlag);
89 void interlockNotifyGISHeartbeatLost(bool conditionFlag);
90
91 void forceControllerNotifySafetyLimit(bool conditionFlag);
92 void forceControllerNotifyXMomentLimit(bool conditionFlag, std::string failed);
93 void forceControllerNotifyYMomentLimit(bool conditionFlag, std::string failed);
94 void forceControllerNotifyZMomentLimit(bool conditionFlag, std::string failed);
95 void forceControllerNotifyNearNeighborCheck(bool conditionFlag, std::string failed, float nominalZ,
96 float nominalZWarning);
97 void forceControllerNotifyMagnitudeLimit(bool conditionFlag, float globalForce);
98 void forceControllerNotifyFarNeighborCheck(bool conditionFlag, std::string failed);
99 void forceControllerNotifyElevationForceClipping(bool conditionFlag);
100 void forceControllerNotifyAzimuthForceClipping(bool conditionFlag);
101 void forceControllerNotifyThermalForceClipping(bool conditionFlag);
102 void forceControllerNotifyBalanceForceClipping(bool conditionFlag);
103 void forceControllerNotifyAccelerationForceClipping(bool conditionFlag);
104 void forceControllerNotifyActiveOpticNetForceCheck(bool conditionFlag);
105 void forceControllerNotifyActiveOpticForceClipping(bool conditionFlag);
106 void forceControllerNotifyStaticForceClipping(bool conditionFlag);
107 void forceControllerNotifyOffsetForceClipping(bool conditionFlag);
108 void forceControllerNotifyVelocityForceClipping(bool conditionFlag);
109 void forceControllerNotifyForceClipping(bool conditionFlag);
110 void forceControllerNotifyMeasuredXForceLimit(int actuatorId, float xForce, bool conditionFlag);
111 void forceControllerNotifyMeasuredYForceLimit(int actuatorId, float yForce, bool conditionFlag);
112 void forceControllerNotifyMeasuredZForceLimit(int actuatorId, float zForce, bool conditionFlag);
113
114 void positionControllerNotifyLimitLow(int hp, bool conditionFlag);
115 void positionControllerNotifyLimitHigh(int hp, bool conditionFlag);
116 void positionControllerNotifyUnstable(int hp, int32_t unstableCount, int32_t deltaEncoder);
117 void positionControllerHighTension(int hp, float weightSupportedPercent);
118
119 void cellLightNotifyOutputMismatch(bool conditionFlag, bool commanded, bool sensed);
120 void cellLightNotifySensorMismatch(bool conditionFlag, bool commanded, bool sensed);
121
122 void powerControllerNotifyPowerNetworkAOutputMismatch(bool conditionFlag);
123 void powerControllerNotifyPowerNetworkBOutputMismatch(bool conditionFlag);
124 void powerControllerNotifyPowerNetworkCOutputMismatch(bool conditionFlag);
125 void powerControllerNotifyPowerNetworkDOutputMismatch(bool conditionFlag);
126 void powerControllerNotifyAuxPowerNetworkAOutputMismatch(bool conditionFlag);
127 void powerControllerNotifyAuxPowerNetworkBOutputMismatch(bool conditionFlag);
128 void powerControllerNotifyAuxPowerNetworkCOutputMismatch(bool conditionFlag);
129 void powerControllerNotifyAuxPowerNetworkDOutputMismatch(bool conditionFlag);
130
131 void raiseOperationTimeout(bool conditionFlag);
132
133 void lowerOperationTimeout(bool conditionFlag);
134
135 void ilcCommunicationTimeout(bool conditionFlag);
136 void modbusIRQTimeout(uint32_t timeout, uint32_t irqs);
137
138 void forceActuatorFollowingError(int actuatorId, int actuatorDataIndex, bool countingWarning,
139 bool immediateFault);
140
141 void hardpointActuatorBreakawayFault(int actuatorDataIndex, bool conditionFlag);
142
150 void hardpointActuatorMeasuredForce(int actuatorDataIndex, bool warningFlag, bool faultFlag);
151
160 void hardpointActuatorAirPressure(int actuatorDataIndex, int conditionFlag, float airPressure);
161
162 void hardpointActuatorFollowingError(int hp, double fePercent);
163
164 void tmaAzimuthTimeout(double currentTimeout);
165 void tmaElevationTimeout(double currentTimeout);
166 void tmaInclinometerDeviation(double currentDeviation);
167
168 void userPanic();
169
180 States::Type checkSafety(States::Type preferredNextState);
181
182private:
183 template <typename... Args>
184 void _updateOverride(FaultCodes::Type faultCode, bool enabledFlag, bool conditionFlag,
185 std::string errorReport, Args &&...args) {
186 bool faultConditionExists = enabledFlag && conditionFlag;
187 if (faultConditionExists && _errorCodeData->errorCode == FaultCodes::NoFault) {
188 _errorCodeData->errorCode = faultCode;
189 _errorCodeData->errorReport = fmt::format(errorReport, args...);
190 }
191 }
192
193 void _clearError();
194
195 SafetyControllerSettings *_safetyControllerSettings;
196
197 MTM1M3_logevent_errorCodeC *_errorCodeData;
198
199 std::list<int> _ilcCommunicationTimeoutData;
200 std::list<int> _forceActuatorFollowingErrorData[FA_COUNT];
201 std::list<int> _hardpointActuatorMeasuredForceData[HP_COUNT];
202 std::list<int> _hardpointActuatorAirPressureData[HP_COUNT];
203 bool _hardpointLimitLowTriggered[HP_COUNT];
204 bool _hardpointLimitHighTriggered[HP_COUNT];
205 bool _hardpointMeasuredForceWarning[HP_COUNT];
206 int _hardpointFeViolations[HP_COUNT];
207};
208
209} /* namespace SS */
210} /* namespace M1M3 */
211} /* namespace LSST */
212
213#endif /* SAFETYCONTROLLER_H_ */
Safety controller class.
Definition SafetyControllerSettings.h:51
States::Type checkSafety(States::Type preferredNextState)
Check if mirror safety rules are fulfilled.
Definition SafetyController.cpp:676
void hardpointActuatorAirPressure(int actuatorDataIndex, int conditionFlag, float airPressure)
Checks hardpoint breakway air pressure.
Definition SafetyController.cpp:613
void hardpointActuatorMeasuredForce(int actuatorDataIndex, bool warningFlag, bool faultFlag)
Triggers hardpoint measured force warning and faults.
Definition SafetyController.cpp:586
Type
Definition FaultCodes.h:47