From 067cb6f098537482ed76b398b52978a1cd30a026 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Tue, 4 Mar 2014 09:56:42 +0100 Subject: [PATCH] OP-1246 made updating of RadioComBridgeStats thread safe --- flight/modules/RadioComBridge/RadioComBridge.c | 6 ++---- flight/modules/Telemetry/telemetry.c | 6 ++---- flight/uavtalk/inc/uavtalk.h | 4 ++-- flight/uavtalk/uavtalk.c | 14 ++++++++++++-- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/flight/modules/RadioComBridge/RadioComBridge.c b/flight/modules/RadioComBridge/RadioComBridge.c index 3aa6297b9..7e10557ea 100644 --- a/flight/modules/RadioComBridge/RadioComBridge.c +++ b/flight/modules/RadioComBridge/RadioComBridge.c @@ -289,12 +289,10 @@ static void updateRadioComBridgeStats() RadioComBridgeStatsData radioComBridgeStats; // Get telemetry stats - UAVTalkGetStats(data->telemUAVTalkCon, &telemetryUAVTalkStats); - UAVTalkResetStats(data->telemUAVTalkCon); + UAVTalkGetStats(data->telemUAVTalkCon, &telemetryUAVTalkStats, true); // Get radio stats - UAVTalkGetStats(data->radioUAVTalkCon, &radioUAVTalkStats); - UAVTalkResetStats(data->radioUAVTalkCon); + UAVTalkGetStats(data->radioUAVTalkCon, &radioUAVTalkStats, true); // Get stats object data RadioComBridgeStatsGet(&radioComBridgeStats); diff --git a/flight/modules/Telemetry/telemetry.c b/flight/modules/Telemetry/telemetry.c index b07bb85a5..7a6844e8b 100644 --- a/flight/modules/Telemetry/telemetry.c +++ b/flight/modules/Telemetry/telemetry.c @@ -542,12 +542,10 @@ static void updateTelemetryStats() uint32_t timeNow; // Get stats - UAVTalkGetStats(uavTalkCon, &utalkStats); + UAVTalkGetStats(uavTalkCon, &utalkStats, true); #ifdef PIOS_INCLUDE_RFM22B - UAVTalkAddStats(radioUavTalkCon, &utalkStats); - UAVTalkResetStats(radioUavTalkCon); + UAVTalkAddStats(radioUavTalkCon, &utalkStats, true); #endif - UAVTalkResetStats(uavTalkCon); // Get object data FlightTelemetryStatsGet(&flightStats); diff --git a/flight/uavtalk/inc/uavtalk.h b/flight/uavtalk/inc/uavtalk.h index e54231735..9dc92187c 100644 --- a/flight/uavtalk/inc/uavtalk.h +++ b/flight/uavtalk/inc/uavtalk.h @@ -61,8 +61,8 @@ UAVTalkRxState UAVTalkProcessInputStream(UAVTalkConnection connection, uint8_t r UAVTalkRxState UAVTalkProcessInputStreamQuiet(UAVTalkConnection connection, uint8_t rxbyte); UAVTalkRxState UAVTalkRelayPacket(UAVTalkConnection inConnectionHandle, UAVTalkConnection outConnectionHandle); int32_t UAVTalkReceiveObject(UAVTalkConnection connectionHandle); -void UAVTalkGetStats(UAVTalkConnection connection, UAVTalkStats *stats); -void UAVTalkAddStats(UAVTalkConnection connection, UAVTalkStats *stats); +void UAVTalkGetStats(UAVTalkConnection connection, UAVTalkStats *stats, bool reset); +void UAVTalkAddStats(UAVTalkConnection connection, UAVTalkStats *stats, bool reset); void UAVTalkResetStats(UAVTalkConnection connection); void UAVTalkGetLastTimestamp(UAVTalkConnection connection, uint16_t *timestamp); uint32_t UAVTalkGetPacketObjId(UAVTalkConnection connection); diff --git a/flight/uavtalk/uavtalk.c b/flight/uavtalk/uavtalk.c index 0f9dd3d0e..47c668461 100644 --- a/flight/uavtalk/uavtalk.c +++ b/flight/uavtalk/uavtalk.c @@ -133,7 +133,7 @@ UAVTalkOutputStream UAVTalkGetOutputStream(UAVTalkConnection connectionHandle) * \param[in] connection UAVTalkConnection to be used * @param[out] statsOut Statistics counters */ -void UAVTalkGetStats(UAVTalkConnection connectionHandle, UAVTalkStats *statsOut) +void UAVTalkGetStats(UAVTalkConnection connectionHandle, UAVTalkStats *statsOut, bool reset) { UAVTalkConnectionData *connection; @@ -145,6 +145,11 @@ void UAVTalkGetStats(UAVTalkConnection connectionHandle, UAVTalkStats *statsOut) // Copy stats memcpy(statsOut, &connection->stats, sizeof(UAVTalkStats)); + if (reset) { + // Clear stats + memset(&connection->stats, 0, sizeof(UAVTalkStats)); + } + // Release lock xSemaphoreGiveRecursive(connection->lock); } @@ -154,7 +159,7 @@ void UAVTalkGetStats(UAVTalkConnection connectionHandle, UAVTalkStats *statsOut) * \param[in] connection UAVTalkConnection to be used * @param[out] statsOut Statistics counters */ -void UAVTalkAddStats(UAVTalkConnection connectionHandle, UAVTalkStats *statsOut) +void UAVTalkAddStats(UAVTalkConnection connectionHandle, UAVTalkStats *statsOut, bool reset) { UAVTalkConnectionData *connection; @@ -175,6 +180,11 @@ void UAVTalkAddStats(UAVTalkConnection connectionHandle, UAVTalkStats *statsOut) statsOut->rxSyncErrors += connection->stats.rxSyncErrors; statsOut->rxCrcErrors += connection->stats.rxCrcErrors; + if (reset) { + // Clear stats + memset(&connection->stats, 0, sizeof(UAVTalkStats)); + } + // Release lock xSemaphoreGiveRecursive(connection->lock); }