Hallo Jürgen!
Sehr schöne Arbeit! (auch wenn ich überhaupt kein Freund der Präprozessorlösung bin...)
Bislang habe ich nur einen Fehler gefunden, und zwar hier:
jueff hat geschrieben: Di 25. Nov 2025, 23:17
Die Änderung hatte auch Auswirkung auf das Verspeichern der Zustände...
Der Prototyp ist dieser:
#if _USE_STORE_STATUS // 19.05.20: Juergen
typedef void(*Callback_t) (uint8_t CallbackType,
uint8_t ValueId, uint8_t OldValue, uint8_t* NewValue);
#endif
Der Aufruf jener:
#if _USE_STORE_STATUS // 19.05.20: Juergen
void MobaLedLib_C::Do_Callback(uint8_t CallbackType, inch_t ValueId, uint8_t OldValue, uint8_t *NewValue)
<--- hier ist es noch richtig!!!
{
//Dprintf("Do_Callback CallbackType %d ValueId %i OldValue %i NewValue %i\n", CallbackType, ValueId, OldValue, *NewValue);
if (CallbackFunc!=NULL) CallbackFunc(CallbackType, ValueId, OldValue, NewValue);
<--- ab hier falsch
}
#endif
Denn es kommt hier heraus:
//------------------------------------------------------------------------------------------
void On_Callback(uint8_t CallbackType,
uint8_t ValueId, uint8_t OldValue, uint8_t *NewValue)
//------------------------------------------------------------------------------------------
{
if ( (CallbackType == CT_CHANNEL_CHANGED && ((OldValue > 0) != (*NewValue > 0)))
|| (CallbackType == CT_COUNTER_CHANGED && (OldValue != *NewValue))
|| CallbackType == CT_COUNTER_INITIAL)
{
#if defined(DEBUG_STORE_STATUS) && 1
if (CallbackType == CT_CHANNEL_CHANGED)
{ char s[80]; sprintf(s, "On_Value_Changed: channel %d changed from %d to %d", ValueId, OldValue, *NewValue); Serial.println(s); Serial.flush();} // Debug
else if (CallbackType == CT_COUNTER_CHANGED)
{ char s[80]; sprintf(s, "On_Value_Changed: counter %d changed from %d to %d", ValueId, OldValue, *NewValue); Serial.println(s); Serial.flush();} // Debug
#endif
ForAllStoreValues(CallbackType, ValueId, NewValue, Handle_Callback);
#if defined(DEBUG_STORE_STATUS) && 1
if (CallbackType == CT_COUNTER_INITIAL)
{
char s[80]; sprintf(s, "On_Counter_Init: counter %d set to %d", ValueId, *NewValue); Serial.println(s);
} // Debug
#endif
}
};
bzw. hier:
//-----------------------------------------------------------------------------------------------
void ForAllStoreValues(uint8_t ValueType,
uint8_t ValueId, uint8_t* Value, HandleValue_t handler)
//-----------------------------------------------------------------------------------------------
{
uint16_t EEPromAddr = EEPROM_START;
uint16_t tmp;
for (const uint8_t *p = (const uint8_t*)Store_Values, *e = p + sizeof(Store_Values); p < e; )
{
tmp = pgm_read_word_near(p); p += 2;
if (handler(ValueType, ValueId, Value, EEPromAddr, tmp>>8, tmp)) break;
EEPromAddr++;
}
}
Was passiert? "ValueID" ist (fast, bis auf den Einstieg) überall nur 8 Bit und beim Speichen von Zuständen von InCh's über 255 überpatcht man mit höheren Zuständen niedrigere.
Gruß, Eckhart