LP-295: uncrustify
[librepilot.git] / flight / libraries / alarms.c
blobdb555ad8ed06a7b837a9dc2e022f7e0809a57a77
1 /**
2 ******************************************************************************
3 * @addtogroup OpenPilotSystem OpenPilot System
4 * @{
5 * @addtogroup OpenPilotLibraries OpenPilot System Libraries
6 * @brief OpenPilot System libraries are available to all OP modules.
7 * @{
8 * @file alarms.c
9 * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
10 * @brief Library for setting and clearing system alarms
11 * @see The GNU Public License (GPL) Version 3
13 *****************************************************************************/
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 3 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
22 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23 * for more details.
25 * You should have received a copy of the GNU General Public License along
26 * with this program; if not, write to the Free Software Foundation, Inc.,
27 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include <openpilot.h>
31 #include "inc/alarms.h"
33 // Private constants
34 #ifndef PIOS_ALARM_GRACETIME
35 // alarm cannot be turned off for at least 1000 milliseconds
36 // to prevent event system overload through flapping alarms
37 #define PIOS_ALARM_GRACETIME 1000
38 #endif // PIOS_ALARM_GRACETIME
40 // Private types
42 // Private variables
43 static xSemaphoreHandle lock;
44 static volatile uint16_t lastAlarmChange[SYSTEMALARMS_ALARM_NUMELEM] = { 0 }; // this deliberately overflows every 2^16 milliseconds to save memory
46 // Private functions
47 static int32_t hasSeverity(SystemAlarmsAlarmOptions severity);
49 /**
50 * Initialize the alarms library
52 int32_t AlarmsInitialize(void)
54 SystemAlarmsInitialize();
56 lock = xSemaphoreCreateRecursiveMutex();
57 // do not change the default states of the alarms, let the init code generated by the uavobjectgenerator handle that
58 // AlarmsClearAll();
59 // AlarmsDefaultAll();
60 return 0;
63 /**
64 * Set an alarm
65 * @param alarm The system alarm to be modified
66 * @param severity The alarm severity
67 * @return 0 if success, -1 if an error
69 int32_t AlarmsSet(SystemAlarmsAlarmElem alarm, SystemAlarmsAlarmOptions severity)
71 SystemAlarmsAlarmData alarms;
73 // Check that this is a valid alarm
74 if (alarm >= SYSTEMALARMS_ALARM_NUMELEM) {
75 return -1;
78 // Lock
79 xSemaphoreTakeRecursive(lock, portMAX_DELAY);
81 // Read alarm and update its severity only if it was changed
82 SystemAlarmsAlarmGet(&alarms);
83 uint16_t flightTime = (uint16_t)xTaskGetTickCount() * (uint16_t)portTICK_RATE_MS; // this deliberately overflows every 2^16 milliseconds to save memory
84 if (((uint16_t)(flightTime - lastAlarmChange[alarm]) > PIOS_ALARM_GRACETIME &&
85 SystemAlarmsAlarmToArray(alarms)[alarm] != severity)
86 || SystemAlarmsAlarmToArray(alarms)[alarm] < severity) {
87 SystemAlarmsAlarmToArray(alarms)[alarm] = severity;
88 lastAlarmChange[alarm] = flightTime;
89 SystemAlarmsAlarmSet(&alarms);
92 // Release lock
93 xSemaphoreGiveRecursive(lock);
94 return 0;
97 /**
98 * Set an Extended Alarm
99 * @param alarm The system alarm to be modified
100 * @param severity The alarm severity
101 * @param status The Extended alarm status field
102 * @param subStatus The Extended alarm substatus field
103 * @return 0 if success, -1 if an error
105 int32_t ExtendedAlarmsSet(SystemAlarmsAlarmElem alarm,
106 SystemAlarmsAlarmOptions severity,
107 SystemAlarmsExtendedAlarmStatusOptions status,
108 uint8_t subStatus)
110 SystemAlarmsData alarms;
112 // Check that this is a valid alarm
113 if (alarm >= SYSTEMALARMS_EXTENDEDALARMSTATUS_NUMELEM) {
114 return -1;
117 // Lock
118 xSemaphoreTakeRecursive(lock, portMAX_DELAY);
120 // Read alarm and update its severity only if it was changed
121 SystemAlarmsGet(&alarms);
122 uint16_t flightTime = (uint16_t)xTaskGetTickCount() * (uint16_t)portTICK_RATE_MS; // this deliberately overflows every 2^16 milliseconds to save memory
123 if (((uint16_t)(flightTime - lastAlarmChange[alarm]) > PIOS_ALARM_GRACETIME &&
124 SystemAlarmsAlarmToArray(alarms.Alarm)[alarm] != severity)
125 || SystemAlarmsAlarmToArray(alarms.Alarm)[alarm] < severity) {
126 SystemAlarmsExtendedAlarmStatusToArray(alarms.ExtendedAlarmStatus)[alarm] = status;
127 SystemAlarmsExtendedAlarmSubStatusToArray(alarms.ExtendedAlarmSubStatus)[alarm] = subStatus;
128 SystemAlarmsAlarmToArray(alarms.Alarm)[alarm] = severity;
129 lastAlarmChange[alarm] = flightTime;
130 SystemAlarmsSet(&alarms);
133 // Release lock
134 xSemaphoreGiveRecursive(lock);
135 return 0;
139 * Get an alarm
140 * @param alarm The system alarm to be read
141 * @return Alarm severity
143 SystemAlarmsAlarmOptions AlarmsGet(SystemAlarmsAlarmElem alarm)
145 SystemAlarmsAlarmData alarms;
147 // Check that this is a valid alarm
148 if (alarm >= SYSTEMALARMS_ALARM_NUMELEM) {
149 return 0;
152 // Read alarm
153 SystemAlarmsAlarmGet(&alarms);
154 return SystemAlarmsAlarmToArray(alarms)[alarm];
158 * Set an alarm to it's default value
159 * @param alarm The system alarm to be modified
160 * @return 0 if success, -1 if an error
162 int32_t AlarmsDefault(SystemAlarmsAlarmElem alarm)
164 return AlarmsSet(alarm, SYSTEMALARMS_ALARM_DEFAULT);
168 * Default all alarms
170 void AlarmsDefaultAll()
172 for (uint32_t n = 0; n < SYSTEMALARMS_ALARM_NUMELEM; ++n) {
173 AlarmsDefault(n);
178 * Clear an alarm
179 * @param alarm The system alarm to be modified
180 * @return 0 if success, -1 if an error
182 int32_t AlarmsClear(SystemAlarmsAlarmElem alarm)
184 if (alarm < SYSTEMALARMS_EXTENDEDALARMSTATUS_NUMELEM) {
185 return ExtendedAlarmsSet(alarm, SYSTEMALARMS_ALARM_OK, SYSTEMALARMS_EXTENDEDALARMSTATUS_NONE, 0);
186 } else {
187 return AlarmsSet(alarm, SYSTEMALARMS_ALARM_OK);
192 * Clear all alarms
194 void AlarmsClearAll()
196 for (uint32_t n = 0; n < SYSTEMALARMS_ALARM_NUMELEM; ++n) {
197 AlarmsClear(n);
202 * Check if there are any alarms with the given or higher severity
203 * @return 0 if no alarms are found, 1 if at least one alarm is found
205 int32_t AlarmsHasWarnings()
207 return hasSeverity(SYSTEMALARMS_ALARM_WARNING);
211 * Check if there are any alarms with error or higher severity
212 * @return 0 if no alarms are found, 1 if at least one alarm is found
214 int32_t AlarmsHasErrors()
216 return hasSeverity(SYSTEMALARMS_ALARM_ERROR);
221 * Check if there are any alarms with critical or higher severity
222 * @return 0 if no alarms are found, 1 if at least one alarm is found
224 int32_t AlarmsHasCritical()
226 return hasSeverity(SYSTEMALARMS_ALARM_CRITICAL);
231 * Check if there are any alarms with the given or higher severity
232 * @return 0 if no alarms are found, 1 if at least one alarm is found
234 static int32_t hasSeverity(SystemAlarmsAlarmOptions severity)
236 SystemAlarmsAlarmData alarms;
238 // Lock
239 xSemaphoreTakeRecursive(lock, portMAX_DELAY);
241 // Read alarms
242 SystemAlarmsAlarmGet(&alarms);
244 // Go through alarms and check if any are of the given severity or higher
245 for (uint32_t n = 0; n < SYSTEMALARMS_ALARM_NUMELEM; ++n) {
246 if (SystemAlarmsAlarmToArray(alarms)[n] >= severity) {
247 xSemaphoreGiveRecursive(lock);
248 return 1;
252 // If this point is reached then no alarms found
253 xSemaphoreGiveRecursive(lock);
254 return 0;
257 * Get the highest alarm severity
258 * @return
260 SystemAlarmsAlarmOptions AlarmsGetHighestSeverity()
262 SystemAlarmsAlarmData alarmsData;
263 SystemAlarmsAlarmOptions highest = SYSTEMALARMS_ALARM_UNINITIALISED;
265 // Lock
266 xSemaphoreTakeRecursive(lock, portMAX_DELAY);
268 // Read alarms
269 SystemAlarmsAlarmGet(&alarmsData);
271 // Go through alarms and find the highest severity
272 uint32_t n = 0;
273 while (n < SYSTEMALARMS_ALARM_NUMELEM && highest != SYSTEMALARMS_ALARM_CRITICAL) {
274 if (SystemAlarmsAlarmToArray(alarmsData)[n] > highest) {
275 highest = SystemAlarmsAlarmToArray(alarmsData)[n];
277 n++;
280 xSemaphoreGiveRecursive(lock);
281 return highest;
285 * @}
286 * @}