From 481df9ee3d4bc05cb35299da92dbfeb7939c5c5c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 4 Mar 2017 10:14:38 +0100 Subject: [PATCH] [Horus] Fixes #3775 (#4544) * [Horus] Fixes #3775 Quick fix ... comments welcome :) * Better hash function for strings * One comment, one! * One comment, one! --- radio/src/gui/480x272/widgets/modelbmp.cpp | 16 ++++++++-------- radio/src/maths.cpp | 14 +++++++++++++- radio/src/opentx.h | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/480x272/widgets/modelbmp.cpp b/radio/src/gui/480x272/widgets/modelbmp.cpp index 3d6222683..131d59b2b 100644 --- a/radio/src/gui/480x272/widgets/modelbmp.cpp +++ b/radio/src/gui/480x272/widgets/modelbmp.cpp @@ -25,9 +25,9 @@ class ModelBitmapWidget: public Widget public: ModelBitmapWidget(const WidgetFactory * factory, const Zone & zone, Widget::PersistentData * persistentData): Widget(factory, zone, persistentData), - buffer(NULL) + buffer(NULL), + deps_hash(0) { - memset(bitmapFilename, 255, sizeof(bitmapFilename)); } virtual ~ModelBitmapWidget() @@ -65,11 +65,12 @@ class ModelBitmapWidget: public Widget virtual void refresh() { - if (memcmp(bitmapFilename, g_model.header.bitmap, sizeof(g_model.header.bitmap)) != 0 || - memcmp(modelName, g_model.header.name, sizeof(g_model.header.name)) != 0) { + uint32_t new_hash = hash(g_model.header.bitmap, sizeof(g_model.header.bitmap)); + new_hash ^= hash(g_model.header.name, sizeof(g_model.header.name)); + new_hash ^= hash(g_eeGeneral.themeName, sizeof(g_eeGeneral.themeName)); + if (new_hash != deps_hash) { + deps_hash = new_hash; refreshBuffer(); - memcpy(bitmapFilename, g_model.header.bitmap, sizeof(g_model.header.bitmap)); - memcpy(modelName, g_model.header.name, sizeof(g_model.header.name)); } if (buffer) { @@ -78,9 +79,8 @@ class ModelBitmapWidget: public Widget } protected: - char bitmapFilename[sizeof(g_model.header.bitmap)]; - char modelName[sizeof(g_model.header.name)]; BitmapBuffer * buffer; + uint32_t deps_hash; }; BaseWidgetFactory modelBitmapWidget("ModelBmp", NULL); diff --git a/radio/src/maths.cpp b/radio/src/maths.cpp index 3be1fc558..01d228cb1 100644 --- a/radio/src/maths.cpp +++ b/radio/src/maths.cpp @@ -99,7 +99,6 @@ int8_t calcRESXto100(int16_t x) return (x*25) >> 8; } #endif - #if defined(HELI) || defined(FRSKY_HUB) || defined(CPUARM) uint16_t isqrt32(uint32_t n) { @@ -172,3 +171,16 @@ void getGpsDistance() telemetryData.hub.maxGpsDistance = telemetryData.hub.gpsDistance; } #endif + +#if defined(CPUARM) +// djb2 hash algorithm +uint32_t hash(const void * ptr, uint32_t size) +{ + const uint8_t * data = (const uint8_t *)ptr; + uint32_t hash = 5381; + for (uint32_t i=0; i