diff --git a/src/cmnds/cmd_channels.c b/src/cmnds/cmd_channels.c index 3570a4576..94b90fe36 100644 --- a/src/cmnds/cmd_channels.c +++ b/src/cmnds/cmd_channels.c @@ -29,25 +29,104 @@ static int CMD_AddChannel(const void *context, const char *cmd, const char *args int ch, val; if(args==0||*args==0) { - ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_AddChannel: command requires argument"); + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_AddChannel: command requires 2 arguments (next 2, min and max, are optionsl)"); return 1; } Tokenizer_TokenizeString(args); if(Tokenizer_GetArgsCount() < 2) { - ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_AddChannel: command requires 2 arguments"); + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_AddChannel: command requires 2 arguments (next 2, min and max, are optionsl)"); return 1; } ch = Tokenizer_GetArgInteger(0); val = Tokenizer_GetArgInteger(1); + if(Tokenizer_GetArgsCount() == 4) { + int min, max; + + min = Tokenizer_GetArgInteger(2); + max = Tokenizer_GetArgInteger(3); + + CHANNEL_AddClamped(ch,val,min,max); + } else { + CHANNEL_Add(ch,val); + } - CHANNEL_Add(ch,val); + + return 1; +} +static int CMD_ClampChannel(const void *context, const char *cmd, const char *args){ + int ch, max, min; + + if(args==0||*args==0) { + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_ClampChannel: command requires argument"); + return 1; + } + Tokenizer_TokenizeString(args); + if(Tokenizer_GetArgsCount() < 2) { + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_ClampChannel: command requires 3 arguments"); + return 1; + } + + ch = Tokenizer_GetArgInteger(0); + min = Tokenizer_GetArgInteger(1); + max = Tokenizer_GetArgInteger(2); + + CHANNEL_AddClamped(ch,0, min, max); return 1; } +static int CMD_SetPinRole(const void *context, const char *cmd, const char *args){ + int pin, roleIndex; + const char *role; + + if(args==0||*args==0) { + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_SetPinRole: command requires argument"); + return 1; + } + Tokenizer_TokenizeString(args); + if(Tokenizer_GetArgsCount() < 2) { + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_SetPinRole: command requires 2 arguments"); + return 1; + } + + pin = Tokenizer_GetArgInteger(0); + role = Tokenizer_GetArg(1); + + roleIndex = PIN_ParsePinRoleName(role); + if(roleIndex == IOR_Total_Options) { + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_SetPinRole: This role is not known"); + } else { + PIN_SetPinRoleForPinIndex(pin,roleIndex); + } + + return 1; +} +static int CMD_SetPinChannel(const void *context, const char *cmd, const char *args){ + int pin, ch; + + if(args==0||*args==0) { + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_SetPinChannel: command requires argument"); + return 1; + } + Tokenizer_TokenizeString(args); + if(Tokenizer_GetArgsCount() < 2) { + ADDLOG_INFO(LOG_FEATURE_CMD, "CMD_SetPinChannel: command requires 2 arguments"); + return 1; + } + + pin = Tokenizer_GetArgInteger(0); + ch = Tokenizer_GetArgInteger(1); + + PIN_SetPinChannelForPinIndex(pin,ch); + + return 1; +} void CMD_InitChannelCommands(){ CMD_RegisterCommand("SetChannel", "", CMD_SetChannel, "qqqqq0", NULL); CMD_RegisterCommand("AddChannel", "", CMD_AddChannel, "qqqqq0", NULL); + CMD_RegisterCommand("ClampChannel", "", CMD_ClampChannel, "qqqqq0", NULL); + CMD_RegisterCommand("SetPinRole", "", CMD_SetPinRole, "qqqqq0", NULL); + CMD_RegisterCommand("SetPinChannel", "", CMD_SetPinChannel, "qqqqq0", NULL); } diff --git a/src/cmnds/cmd_eventHandlers.c b/src/cmnds/cmd_eventHandlers.c index 2168d9a39..47a58970a 100644 --- a/src/cmnds/cmd_eventHandlers.c +++ b/src/cmnds/cmd_eventHandlers.c @@ -52,6 +52,10 @@ setEventHandler OnHold 11 addChannel 1 -10 // addChangeHandler Channel1 == 0 backlog lcd_clearAndGoto I2C1 0x23 1 1; lcd_print I2C1 0x23 Disabled +AddEventHandler OnClick 0 addChannel 1 -10 0 100 AddEventHandler OnClick 1 addChannel 1 10 0 100 + + + */ // diff --git a/src/httpserver/new_http.c b/src/httpserver/new_http.c index 7e375cea5..973d118f9 100644 --- a/src/httpserver/new_http.c +++ b/src/httpserver/new_http.c @@ -238,6 +238,16 @@ const char *htmlPinRoleNames[] = { "e", }; +int PIN_ParsePinRoleName(const char *name) { + int i; + + for(i = 0; i < IOR_Total_Options; i++) { + if(!stricmp(name,htmlPinRoleNames[i])) + return i; + } + return IOR_Total_Options; +} + void setupAllWB2SPinsAsButtons() { PIN_SetPinRoleForPinIndex(6,IOR_Button); PIN_SetPinChannelForPinIndex(6,1); diff --git a/src/new_pins.c b/src/new_pins.c index 71337c531..9fe85b0b1 100644 --- a/src/new_pins.c +++ b/src/new_pins.c @@ -462,6 +462,24 @@ void CHANNEL_Set(int ch, int iVal, int bForce) { Channel_OnChanged(ch,prevValue); } +void CHANNEL_AddClamped(int ch, int iVal, int min, int max) { + 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(g_channelValues[ch]>max) + g_channelValues[ch] = max; + if(g_channelValues[ch]= CHANNEL_MAX) { diff --git a/src/new_pins.h b/src/new_pins.h index 8eb0d974c..214983e8a 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -129,6 +129,7 @@ void CHANNEL_SetChangeCallback(void (*cb)(int idx, int iVal)); void PIN_SetGenericDoubleClickCallback(void (*cb)(int pinIndex)); void CHANNEL_Set(int ch, int iVal, int bForce); void CHANNEL_Add(int ch, int iVal); +void CHANNEL_AddClamped(int ch, int iVal, int min, int max); int CHANNEL_Get(int ch); int CHANNEL_GetRoleForOutputChannel(int ch); // See: enum ChannelType @@ -139,6 +140,8 @@ void CHANNEL_SetStateOnly(int iVal); int CHANNEL_HasChannelPinWithRole(int ch, int iorType); int PIN_GetPWMIndexForPinIndex(int pin); + +int PIN_ParsePinRoleName(const char *name); // from new_builtin.c void Setup_Device_Empty(); diff --git a/windowsTest_msvc2008.vcproj b/windowsTest_msvc2008.vcproj index 53ef86613..5922036b6 100644 --- a/windowsTest_msvc2008.vcproj +++ b/windowsTest_msvc2008.vcproj @@ -163,30 +163,6 @@ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > - - - - - - - - - - @@ -207,18 +183,6 @@ RelativePath=".\src\new_common.c" > - - - - - @@ -597,7 +561,7 @@ > + + @@ -748,10 +716,6 @@ RelativePath=".\src\i2c\drv_i2c_mcp23017.h" > - - @@ -873,6 +837,46 @@ Name="XR809_Only" > + + + + + + + + + + + + + + + + +