ping pong mode for addChannel

This commit is contained in:
Tester23 2025-10-03 14:49:29 +02:00
parent d039226ded
commit e8ef72c891
3 changed files with 130 additions and 41 deletions

View File

@ -1643,55 +1643,53 @@ void CHANNEL_Set_Ex(int ch, int iVal, int iFlags, int ausemovingaverage) {
void CHANNEL_Set(int ch, int iVal, int iFlags) {
CHANNEL_Set_Ex(ch, iVal, iFlags, 0);
}
char *g_channelPingPongs = 0;
void CHANNEL_AddClamped(int ch, int iVal, int min, int max, int bWrapInsteadOfClamp) {
#if 0
int prevValue;
if (ch < 0 || ch >= CHANNEL_MAX) {
addLogAdv(LOG_ERROR, LOG_FEATURE_GENERAL, "CHANNEL_AddClamped: Channel index %i is out of range <0,%i)\n\r", ch, CHANNEL_MAX);
return;
}
prevValue = g_channelValues[ch];
g_channelValues[ch] = g_channelValues[ch] + iVal;
if (bWrapInsteadOfClamp) {
if (g_channelValues[ch] > max)
g_channelValues[ch] = min;
if (g_channelValues[ch] < min)
g_channelValues[ch] = max;
}
else {
if (g_channelValues[ch] > max)
g_channelValues[ch] = max;
if (g_channelValues[ch] < min)
g_channelValues[ch] = min;
}
addLogAdv(LOG_INFO, LOG_FEATURE_GENERAL, "CHANNEL_AddClamped channel %i has changed to %i\n\r", ch, g_channelValues[ch]);
Channel_OnChanged(ch, prevValue, 0);
#else
void CHANNEL_AddClamped(int ch, int iDelta, int min, int max, int bWrapInsteadOfClamp) {
// we want to support special channel indexes, so it's better to use GET/SET interface
// Special channel indexes are used to access things like dimmer, led colors, etc
iVal = CHANNEL_Get(ch) + iVal;
int newVal;;
if (bWrapInsteadOfClamp) {
if (iVal > max)
iVal = min;
if (iVal < min)
iVal = max;
if (bWrapInsteadOfClamp == 2) {
// ping-pong logic
if (g_channelPingPongs == 0) {
g_channelPingPongs = (char*)malloc(CHANNEL_MAX);
memset(g_channelPingPongs, 1, CHANNEL_MAX);
}
int prevVal = CHANNEL_Get(ch);
newVal = prevVal + iDelta * g_channelPingPongs[ch];
if (prevVal == min && newVal < min) {
g_channelPingPongs[ch] *= -1;
}
else if (prevVal == max && newVal > max) {
g_channelPingPongs[ch] *= -1;
}
newVal = prevVal + iDelta * g_channelPingPongs[ch];
if (newVal > max) {
newVal = max;
}
else if (newVal < min) {
newVal = min;
}
} else if (bWrapInsteadOfClamp) {
newVal = CHANNEL_Get(ch) + iDelta;
if (newVal > max)
newVal = min;
if (newVal < min)
newVal = max;
}
else {
if (iVal > max)
iVal = max;
if (iVal < min)
iVal = min;
newVal = CHANNEL_Get(ch) + iDelta;
if (newVal > max)
newVal = max;
if (newVal < min)
newVal = min;
}
addLogAdv(LOG_INFO, LOG_FEATURE_GENERAL, "CHANNEL_AddClamped channel %i has changed to %i\n\r", ch, iVal);
addLogAdv(LOG_INFO, LOG_FEATURE_GENERAL,
"CHANNEL_AddClamped channel %i has changed to %i\n\r", ch, newVal);
CHANNEL_Set(ch, iVal, 0);
#endif
CHANNEL_Set(ch, newVal, 0);
}
void CHANNEL_Add(int ch, int iVal) {
#if 0

View File

@ -249,7 +249,98 @@ void Test_Commands_Channels() {
SELFTEST_ASSERT_CHANNEL(10, -123);
// clamp test
CMD_ExecuteCommand("SetChannel 1 0", 0);
SELFTEST_ASSERT_CHANNEL(1, 0);
// [ChannelIndex][ValueToAdd][ClampMin][ClampMax][bWrapInsteadOfClamp]
CMD_ExecuteCommand("addChannel 1 10 0 100 0", 0);
SELFTEST_ASSERT_CHANNEL(1, 10);
CMD_ExecuteCommand("addChannel 1 10 0 100 0", 0);
SELFTEST_ASSERT_CHANNEL(1, 20);
CMD_ExecuteCommand("addChannel 1 80 0 100 0", 0);
SELFTEST_ASSERT_CHANNEL(1, 100);
CMD_ExecuteCommand("addChannel 1 80 0 100 0", 0);
SELFTEST_ASSERT_CHANNEL(1, 100);
CMD_ExecuteCommand("addChannel 1 80 0 100 0", 0);
SELFTEST_ASSERT_CHANNEL(1, 100);
CMD_ExecuteCommand("addChannel 1 -1 0 100 0", 0);
SELFTEST_ASSERT_CHANNEL(1, 99);
// wrap test
CMD_ExecuteCommand("addChannel 1 1 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 100);
CMD_ExecuteCommand("addChannel 1 1 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 0);
CMD_ExecuteCommand("addChannel 1 1 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 1);
CMD_ExecuteCommand("addChannel 1 1 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 2);
CMD_ExecuteCommand("addChannel 1 -1 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 1);
CMD_ExecuteCommand("addChannel 1 1 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 2);
CMD_ExecuteCommand("addChannel 1 2 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 4);
CMD_ExecuteCommand("addChannel 1 10 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 14);
CMD_ExecuteCommand("addChannel 1 80 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 94);
CMD_ExecuteCommand("addChannel 1 5 0 100 1", 0);
SELFTEST_ASSERT_CHANNEL(1, 99);
CMD_ExecuteCommand("addChannel 1 5 0 100 1", 0);
// TODO: stop at 100, then go to min?
SELFTEST_ASSERT_CHANNEL(1, 0);
// pingpongtest
SELFTEST_ASSERT_CHANNEL(1, 0);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 25);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 50);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 75);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 100);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 75);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 50);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 25);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 0);
CMD_ExecuteCommand("addChannel 1 25 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 25);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 49);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 73);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 97);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
// SPECIAL - STOP AT 100
SELFTEST_ASSERT_CHANNEL(1, 100);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 76);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 52);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 28);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 4);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 0);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 24);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 48);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 72);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 96);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
SELFTEST_ASSERT_CHANNEL(1, 100);
CMD_ExecuteCommand("addChannel 1 24 0 100 2", 0);
// cause error
//SELFTEST_ASSERT_CHANNEL(3, 666);
}

View File

@ -168,6 +168,7 @@ void SIM_ClearOBK(const char *flashPath) {
void Win_DoUnitTests() {
//SELFTEST_ASSERT_EXPRESSION("sqrt(4)", 2)
Test_Commands_Channels();
Test_Driver_TCL_AC();
@ -250,7 +251,6 @@ void Win_DoUnitTests() {
Test_LEDDriver();
Test_LFS();
Test_Scripting();
Test_Commands_Channels();
Test_Command_If();
Test_Tokenizer();
Test_Http();