From f4663b98e4652eba1c49b9781c71f41c1e781ac4 Mon Sep 17 00:00:00 2001 From: James Cotton Date: Sat, 10 Mar 2012 17:02:38 -0600 Subject: [PATCH] When the event system or object manager has an error store the object ID in the SystemStats. --- flight/Modules/System/systemmod.c | 12 +++++++++++- flight/UAVObjects/eventdispatcher.c | 1 + flight/UAVObjects/inc/eventdispatcher.h | 1 + flight/UAVObjects/inc/uavobjectmanager.h | 5 ++++- flight/UAVObjects/uavobjectmanager.c | 6 ++++-- shared/uavobjectdefinition/systemstats.xml | 3 +++ 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/flight/Modules/System/systemmod.c b/flight/Modules/System/systemmod.c index 0198fb490..bf3ae7b01 100644 --- a/flight/Modules/System/systemmod.c +++ b/flight/Modules/System/systemmod.c @@ -457,11 +457,21 @@ static void updateSystemAlarms() EventGetStats(&evStats); UAVObjClearStats(); EventClearStats(); - if (objStats.eventErrors > 0 || evStats.eventErrors > 0) { + if (objStats.eventCallbackErrors > 0 || objStats.eventQueueErrors > 0 || evStats.eventErrors > 0) { AlarmsSet(SYSTEMALARMS_ALARM_EVENTSYSTEM, SYSTEMALARMS_ALARM_WARNING); } else { AlarmsClear(SYSTEMALARMS_ALARM_EVENTSYSTEM); } + + if (objStats.lastCallbackErrorID || objStats.lastQueueErrorID || evStats.lastErrorID) { + SystemStatsData sysStats; + SystemStatsGet(&sysStats); + sysStats.EventSystemWarningID = evStats.lastErrorID; + sysStats.ObjectManagerCallbackID = objStats.lastCallbackErrorID; + sysStats.ObjectManagerQueueID = objStats.lastQueueErrorID; + SystemStatsSet(&sysStats); + } + } /** diff --git a/flight/UAVObjects/eventdispatcher.c b/flight/UAVObjects/eventdispatcher.c index 53a6e039d..61a31c258 100644 --- a/flight/UAVObjects/eventdispatcher.c +++ b/flight/UAVObjects/eventdispatcher.c @@ -350,6 +350,7 @@ static int32_t processPeriodicUpdates() { if ( xQueueSend(objEntry->evInfo.queue, &objEntry->evInfo.ev, 0) != pdTRUE ) // do not block if queue is full { + stats.lastErrorID = UAVObjGetID(objEntry->evInfo.ev.obj); ++stats.eventErrors; } } diff --git a/flight/UAVObjects/inc/eventdispatcher.h b/flight/UAVObjects/inc/eventdispatcher.h index 9e378b65a..e1fc7970f 100644 --- a/flight/UAVObjects/inc/eventdispatcher.h +++ b/flight/UAVObjects/inc/eventdispatcher.h @@ -31,6 +31,7 @@ * Event dispatcher statistics */ typedef struct { + uint32_t lastErrorID; uint32_t eventErrors; } EventStats; diff --git a/flight/UAVObjects/inc/uavobjectmanager.h b/flight/UAVObjects/inc/uavobjectmanager.h index ac5d34b5c..7045cac97 100644 --- a/flight/UAVObjects/inc/uavobjectmanager.h +++ b/flight/UAVObjects/inc/uavobjectmanager.h @@ -120,7 +120,10 @@ typedef void (*UAVObjInitializeCallback)(UAVObjHandle obj, uint16_t instId); * Event manager statistics */ typedef struct { - uint32_t eventErrors; + uint32_t eventQueueErrors; + uint32_t eventCallbackErrors; + uint32_t lastCallbackErrorID; + uint32_t lastQueueErrorID; } UAVObjStats; int32_t UAVObjInitialize(); diff --git a/flight/UAVObjects/uavobjectmanager.c b/flight/UAVObjects/uavobjectmanager.c index 7d30bee7b..860beedca 100644 --- a/flight/UAVObjects/uavobjectmanager.c +++ b/flight/UAVObjects/uavobjectmanager.c @@ -1441,14 +1441,16 @@ static int32_t sendEvent(ObjectList * obj, uint16_t instId, if (eventEntry->queue != 0) { if (xQueueSend(eventEntry->queue, &msg, 0) != pdTRUE) // will not block { - ++stats.eventErrors; + stats.lastQueueErrorID = UAVObjGetID(obj); + ++stats.eventQueueErrors; } } // Invoke callback (from event task) if a valid one is registered if (eventEntry->cb != 0) { if (EventCallbackDispatch(&msg, eventEntry->cb) != pdTRUE) // invoke callback from the event task, will not block { - ++stats.eventErrors; + ++stats.eventCallbackErrors; + stats.lastCallbackErrorID = UAVObjGetID(obj); } } } diff --git a/shared/uavobjectdefinition/systemstats.xml b/shared/uavobjectdefinition/systemstats.xml index 3e6bc1547..c11453d20 100644 --- a/shared/uavobjectdefinition/systemstats.xml +++ b/shared/uavobjectdefinition/systemstats.xml @@ -6,6 +6,9 @@ + + +