2 ******************************************************************************
3 * @addtogroup OpenPilotSystem OpenPilot System
5 * @addtogroup OpenPilotLibraries OpenPilot System Libraries
6 * @brief OpenPilot System libraries are available to all OP modules.
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
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"
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
43 static xSemaphoreHandle lock
;
44 static volatile uint16_t lastAlarmChange
[SYSTEMALARMS_ALARM_NUMELEM
] = { 0 }; // this deliberately overflows every 2^16 milliseconds to save memory
47 static int32_t hasSeverity(SystemAlarmsAlarmOptions severity
);
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
59 // AlarmsDefaultAll();
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
) {
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
);
93 xSemaphoreGiveRecursive(lock
);
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
,
110 SystemAlarmsData alarms
;
112 // Check that this is a valid alarm
113 if (alarm
>= SYSTEMALARMS_EXTENDEDALARMSTATUS_NUMELEM
) {
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
);
134 xSemaphoreGiveRecursive(lock
);
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
) {
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
);
170 void AlarmsDefaultAll()
172 for (uint32_t n
= 0; n
< SYSTEMALARMS_ALARM_NUMELEM
; ++n
) {
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);
187 return AlarmsSet(alarm
, SYSTEMALARMS_ALARM_OK
);
194 void AlarmsClearAll()
196 for (uint32_t n
= 0; n
< SYSTEMALARMS_ALARM_NUMELEM
; ++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
;
239 xSemaphoreTakeRecursive(lock
, portMAX_DELAY
);
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
);
252 // If this point is reached then no alarms found
253 xSemaphoreGiveRecursive(lock
);
257 * Get the highest alarm severity
260 SystemAlarmsAlarmOptions
AlarmsGetHighestSeverity()
262 SystemAlarmsAlarmData alarmsData
;
263 SystemAlarmsAlarmOptions highest
= SYSTEMALARMS_ALARM_UNINITIALISED
;
266 xSemaphoreTakeRecursive(lock
, portMAX_DELAY
);
269 SystemAlarmsAlarmGet(&alarmsData
);
271 // Go through alarms and find the highest severity
273 while (n
< SYSTEMALARMS_ALARM_NUMELEM
&& highest
!= SYSTEMALARMS_ALARM_CRITICAL
) {
274 if (SystemAlarmsAlarmToArray(alarmsData
)[n
] > highest
) {
275 highest
= SystemAlarmsAlarmToArray(alarmsData
)[n
];
280 xSemaphoreGiveRecursive(lock
);