1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-17 13:25:20 +03:00

[Horus] Fixes #3775 (#4544)

* [Horus] Fixes #3775

Quick fix ... comments welcome :)

* Better hash function for strings

* One comment, one!

* One comment, one!
This commit is contained in:
Bertrand Songis 2017-03-04 10:14:38 +01:00 committed by GitHub
parent 883ab9a937
commit 481df9ee3d
3 changed files with 22 additions and 10 deletions

View file

@ -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> modelBitmapWidget("ModelBmp", NULL);

View file

@ -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<size; i++) {
hash = ((hash << 5) + hash) + data[i]; /* hash * 33 + c */
}
return hash;
}
#endif

View file

@ -897,7 +897,7 @@ void checkModelIdUnique(uint8_t index, uint8_t module);
#endif
#if defined(CPUARM)
uint32_t hash(const void * ptr, uint32_t size);
inline int divRoundClosest(const int n, const int d)
{
if (d == 0)