11-18-2012 03:27 AM - edited 11-18-2012 03:27 AM
Hi. I'm new in the LabWindows CVI and i put to panel a toggle button, a led and a binary switch. I want to turn on the led when i pressing the button and to change the color of led from switch. I put all components to panel, i set a callback function for each, i generate all callbacks from menu and the next step i think it is to use GetCtrlVal and SetCtrlVal, but i don't know how to use this function and where to use. I need help..I had never used LabWindowsCvi before
11-18-2012 01:44 PM
The case with button and the led it's solved. Now i don't know how to change the color of led using that switch..
11-18-2012 04:02 PM - edited 11-18-2012 04:07 PM
You are correct that GetCtrlVal and SetCtrlVal are the two functions to use here. Did you have a look at the many example programs that ship with CVI? Almost all of them use these two basic functions. Try to learn about the debug functions such that you can step through the code line by line and see how the functions affect the UI.
Setting the LED will look something like SetCtrlVal ( panel_handle, PANEL_LED_10, 1 ); This will switch the LED ON and accordingly change its color from OFF_COLOR to ON_COLOR. The other relevant function here is SetCtrlAttribute, e.g. SetCtrlAttribute ( panel_handle, PANEL_LED_10, ATTR_ON_COLOR, VAL_RED ); SetCtrlAttribute ( panel_handle, PANEL_LED_10, ATTR_OFF_COLOR, VAL_GREEN );
11-19-2012 04:54 PM
Here is how i did it :
int CVICALLBACK chooseColour (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int switchState;
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute(panelHandle, PANEL_LED,ATTR_CTRL_VAL, &switchState);
if (switchState == 1)
{
SetCtrlAttribute(panelHandle, PANEL_LED,ATTR_CTRL_VAL, 0);
}
else
SetCtrlAttribute(panelHandle, PANEL_LED,ATTR_CTRL_VAL, 1);
break;
....
i'm curious about yours 🙂
11-20-2012 02:23 AM
Well, your code switches the led from on to off and vice versa and can be simplified as follows:
int status;
case EVENT_COMMIT: GetCtrlVal (panel, control, &status); SetCtrlVal (panel, control, !status);
break;
Wolfgang has added the elements to change the color the led assumes while turned on (ON state): depending on your needs you may want a alarm signal (red), a OK signal (green), a warning (normally yellow) or other colors for your own purposes.
11-20-2012 11:59 AM
Thanks for suggestions. I succeed to change the color from binary switch, but i want to change only the color from switch ( not to activate the led) and turn on/off the led only from button. I don't know how to implement the function.. For example. I have switch off ( for switch off to have a blue color when i press the button) and when i have switch on ( for switch on, i want a green color). I don't know how to make the switch to send his status (on (blue) /off (green)) to button without to turn on the led. I implement what you said and i succed to change the color of led but i want to activate the led only from button..I think you understand what i want to do..Any advice is welcome
11-20-2012 01:58 PM
I may be missing something, but the solution seems quite simple to me.
You have a callback for the switch into which you can manipulate the desired led color with SetCtrlAttribute as Wolfgang suggested. You must consider that a switch button has 2 stable states, and you can read the switch state with GetCtrlVal: it will return 1 when the switch is on, 0 when off, so in the commit event case read the switch button and set the led color accordingly.
On the other hand, you have the button callback that must switch the led on and off with SetCtrlVal.
I suppose you have all elementary bricks in your hand: now you must try and build up your building.
11-20-2012 11:07 PM
Finnaly i solved. it wasn't hard ..
int CVICALLBACK switchcb (int panel, int control, int event, //switchcb - callback for switch..
void *callbackData, int eventData1, int eventData2)
{
int switchState;
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute(panelHandle, PANEL_switch,ATTR_CTRL_VAL, &switchState);
if (switchState == 0)
{
SetCtrlAttribute(panelHandle, PANEL_LED,ATTR_ON_COLOR, VAL_BLUE);
}
else
SetCtrlAttribute(panelHandle, PANEL_LED,ATTR_ON_COLOR, VAL_GREEN);
break;
case EVENT_LEFT_CLICK:
break;
}
return 0;
}
11-21-2012 04:11 AM - edited 11-21-2012 04:13 AM
Here is the button callback
int CVICALLBACK TurnOn (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
SetCtrlAttribute(panelHandle,PANEL_LED,ATTR_DIMMED, 0);
break;
}
return 0;
}
and the switcher callback
int CVICALLBACK ChooseColour (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int state;
switch (event)
{
case EVENT_COMMIT:
GetCtrlAttribute(panelHandle, PANEL_LED,ATTR_CTRL_VAL, &state);
SetCtrlAttribute(panelHandle, PANEL_LED,ATTR_CTRL_VAL, !state);
break;
}
return 0;
}
you activate the led only from the buton, and change the colour from the switcher as you said...
11-21-2012 04:29 AM - edited 11-21-2012 04:39 AM
pleasure ha scritto:
you activate the led only from the buton, and change the colour from the switcher as you said...
Hi pleasure,
I have to disagree with your solution: turning on a LED has nothing to do with dimming it.
Turning a LED on means changing its state from 0 to 1 by using SetCtrlVal (or SetCtrlAttribute with ATTR_CTRL_VAL, which is the same): what you are doing in your ChooseColour function.
You can edit LED properties and play with both Initial State and Initially dimmed parameters and see in the preview box which is the effect of both: each of four combinations of those attributes is valid, but it will have a different visual effect as you can see here:
Keep in mind, additionally, that dimming a control has usually the meaning of declaring it inactive in the current situation: it is well different from an off led!