Exemple #1
0
void sr844_UpdateControls(int panel, gpibioPtr dev)
{
	sr844_CheckClear(dev);
	SetCtrlIndex(panel, SR844_CTRL_TC, sr844_GetIntVal(dev, "OFLT?"));
	sr844_CheckClear(dev);
	SetCtrlIndex(panel, SR844_CTRL_SENS, sr844_GetIntVal(dev, "SENS?"));
	sr844_CheckClear(dev);
	SetCtrlVal(panel, SR844_CTRL_1MO50O, sr844_GetIntVal(dev, "INPZ?"));
	sr844_CheckClear(dev);
	SetCtrlVal(panel, SR844_CTRL_FILTSLOPE, sr844_GetIntVal(dev, "OFSL?"));
}
Exemple #2
0
void CVICALLBACK clbMenuDeleteItem (int menuBar, int menuItem, void *callbackData, int panel)
{
	int							iIndex				=	0,
								iCurrentIndex		=	0;
	
	GetCtrlIndex ( panel , PANEL_COMMAND_NAME_LIST , &iCurrentIndex );
			
	bSaveChanges = 1;
	
	if ( iCurrentIndex < giNumberOfItems )
	{
		giNumberOfItems--;
	
		for ( iIndex = giCurrentItemIndex; iIndex < giNumberOfItems; iIndex++ )
			gvtListOfCommands[iIndex] = gvtListOfCommands[iIndex+1];
	
		UpdateList( panel );
		
		if ( iCurrentIndex >= giNumberOfItems )
			iCurrentIndex = giNumberOfItems - 1;
		
		if ( iCurrentIndex < 0 )
			iCurrentIndex = 0;
		
		giCurrentItemIndex = iCurrentIndex;
		
		SetCtrlIndex ( panel , PANEL_COMMAND_NAME_LIST , iCurrentIndex );
		
		UpdateCurrentItem( panel );
	}

	return;
}
Exemple #3
0
int das1602_ControlCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
    portPtr port = callbackData;
    switch (control)
    {
        case DAS_CTRL_RANGE:
            if(event == EVENT_COMMIT && port)
                GetCtrlVal(panel, control, &port->port.analogueIOport.range);
            break;
        case DAS_CTRL_INPUT:
            if(event == EVENT_COMMIT && port)
            {
                int i;
                MCCdevPtr dev = port->port.analogueIOport.IO.acqchan->dev;
                das1602Ptr das = dev->device;
                GetCtrlVal(panel, control, &i);
                port->control = 0;
                if(i != -1)
                {
                    das->Achannels[i]->control = control;
                    SetCtrlAttribute (panel, control, ATTR_CALLBACK_DATA, das->Achannels[i]);
                    SetCtrlAttribute (panel, DAS_CTRL_RANGE, ATTR_CALLBACK_DATA, das->Achannels[i]);
                    SetCtrlAttribute (panel, DAS_CTRL_ACQ, ATTR_CALLBACK_DATA, das->Achannels[i]);
                    SetCtrlIndex (panel, DAS_CTRL_RANGE, das1602_IndexFromRange(das->Achannels[i]->port.analogueIOport.range));
                    SetCtrlVal (panel, DAS_CTRL_ACQ, das->Achannels[i]->port.analogueIOport.IO.acqchan->acquire);
                }
                SetCtrlAttribute (panel, DAS_CTRL_RANGE, ATTR_DIMMED, (i == -1));
                SetCtrlAttribute (panel, DAS_CTRL_ACQ, ATTR_DIMMED, (i == -1));
                if(i == -1)SetCtrlVal (panel, DAS_CTRL_ACQ, 0);
            }
            break;
        case DAS_CTRL_ACQ:
        if(event == EVENT_COMMIT && port && utilG.acq.status != ACQ_BUSY)
        {
            int i;
            MCCdevPtr dev = port->port.analogueIOport.IO.acqchan->dev;
            das1602Ptr das = dev->device;
            GetCtrlIndex (panel, DAS_CTRL_INPUT, &i);
            if(i)
            {
                GetCtrlVal (panel, control, &port->port.analogueIOport.IO.acqchan->acquire);
                    if (port->port.analogueIOport.IO.acqchan->acquire)
                    acqchanlist_AddChannel(port->port.analogueIOport.IO.acqchan);
                else
                    acqchanlist_RemoveChannel(port->port.analogueIOport.IO.acqchan);
                SetMenuBarAttribute (das->menu, port->menuitem_id, ATTR_CHECKED, port->port.analogueIOport.IO.acqchan->acquire);
            }
        else if(event == EVENT_COMMIT && utilG.acq.status == ACQ_BUSY)
            SetCtrlVal (panel, control, port->port.analogueIOport.IO.acqchan->acquire);
            
        }
        break;
    }
    if(event == EVENT_COMMIT && port)
        das1602_UpdateMeasurePanel (port);
    return 0;
}
Exemple #4
0
void InitManipulateCallback(int menubar, int menuItem, void *callbackData, int panel)
{
    int i, height1, height2;
    channelPtr chan;

    channel_InitViewPanel();
    InstallCtrlCallback (chanview.p1, CHANVIEW_CHANNELS,
                         ManipulateSelectionCallback, 0);
    ClearListCtrl (chanview.p1, CHANVIEW_CHANNELS);
    for (i = 0; i < channelG.channels.nItems; i++)
    {
        chan = channellist_GetItem (i);
        if (!chan->curves.nItems)
            InsertListItem (chanview.p1, CHANVIEW_CHANNELS, -1, chan->label, i);
    }

    SetCtrlIndex (chanview.p1, CHANVIEW_CHANNELS, 0);
    GetCtrlVal (chanview.p1, CHANVIEW_CHANNELS, &i);
    chan = channellist_GetItem (i);
    InstallCtrlCallback (chanview.p1, CHANVIEW_GRAPH,
                         ManipulateGraphCallback, chan);

    channel_UpdateViewPanel(chan);

    SetCtrlAttribute (chanview.p1, CHANVIEW_GRAPH, ATTR_CTRL_MODE,
                      VAL_HOT);
    SetCtrlAttribute (chanview.p1, CHANVIEW_GRAPH, ATTR_NUM_CURSORS, 1);
    SetCursorAttribute (chanview.p1, CHANVIEW_GRAPH, 1, ATTR_CURSOR_MODE,
                        VAL_SNAP_TO_POINT);
    SetCursorAttribute (chanview.p1, CHANVIEW_GRAPH, 1,
                        ATTR_CROSS_HAIR_STYLE, VAL_SHORT_CROSS);
    SetCursorAttribute (chanview.p1, CHANVIEW_GRAPH, 1, ATTR_CURSOR_COLOR,
                        VAL_YELLOW);
    GetPanelAttribute (chanview.p1, ATTR_HEIGHT, &height1);

    chanview.p2 = LoadPanel (chanview.p1, "chanfncu.uir", MANIP);
    
    GetPanelAttribute (chanview.p2, ATTR_HEIGHT, &height2);
    SetPanelAttribute (chanview.p1, ATTR_HEIGHT, height1+height2+6);
    SetPanelPos (chanview.p2, height1, 6);

    InstallCtrlCallback (chanview.p2, MANIP_READING,
                         ManipulateReadingCallback, chan);

    DisplayPanel (chanview.p2);
    InstallPopup (chanview.p1);
    MessagePopup ("Manipulate Channel Message", "Only channels not connected to a curve may be edited");
}
Exemple #5
0
int		UpdateCurrentItem( int panelHandle )
{
	int			iIndex								=	giCurrentItemIndex;
	
	char		szStringValue[LOW_STRING]			=	{0};
	
	int			iPortIndex							=	0,
				iCurrentTabIndex					=	0;
	
	int			tabPanelHandle						=	0;
	
	GetActiveTabPage (panelHandle , PANEL_TAB , &iCurrentTabIndex );
	
	GetPanelHandleFromTabPage ( panelHandle , PANEL_TAB , iCurrentTabIndex, &tabPanelHandle );
	
	SetCtrlVal( panelHandle , PANEL_COMMAND_NAME_STRING , gvtListOfCommands[iIndex].szCommandName );
	
	if (( gvtListOfCommands[iIndex].iConfigType == 1 ) || ( gvtListOfCommands[iIndex].iConfigType == 2 ))
		SetTabPageAttribute ( panelHandle , PANEL_TAB , 2 , ATTR_VISIBLE, 1 );
	else
		SetTabPageAttribute ( panelHandle , PANEL_TAB , 2 , ATTR_VISIBLE, 0 );
	
	if ( gvtListOfCommands[iIndex].iConfigType == 4 ) 
		SetTabPageAttribute ( panelHandle , PANEL_TAB , 1 , ATTR_VISIBLE, 1 );
	else
		SetTabPageAttribute ( panelHandle , PANEL_TAB , 1 , ATTR_VISIBLE, 0 );
	
	switch(iCurrentTabIndex)
	{
		case 0:
				if ( gvtListOfCommands[iIndex].pBaudRateArray[0] )
					sprintf( szStringValue , "%d" , gvtListOfCommands[iIndex].pBaudRateArray[0] ); 							     
				else
					strcpy( szStringValue , "-" ); 							     
				
				SetCtrlVal( tabPanelHandle , DEFAULT_BOUD_RATE , szStringValue );
				
				sprintf( szStringValue , "0x%02llX" , gvtListOfCommands[iIndex].BitDirectionMask ); 												  
				SetCtrlVal( tabPanelHandle , DEFAULT_BIT_DIR_MASK , szStringValue ); 
				
				sprintf( szStringValue , "%lf" , gvtListOfCommands[iIndex].lfSetTimeout ); 											
				SetCtrlVal( tabPanelHandle , DEFAULT_SET_TIMEOUT , szStringValue );     											  
				
				sprintf( szStringValue , "%lf" , gvtListOfCommands[iIndex].lfSetDelay ); 
				SetCtrlVal( tabPanelHandle , DEFAULT_SET_DELAY , szStringValue );												  	  
				
				sprintf( szStringValue , "%lf" , gvtListOfCommands[iIndex].dPowerUpLevel ); 													  
				SetCtrlVal( tabPanelHandle , DEFAULT_POWER_UP_LEVEL , szStringValue );  	
													
				if ( gvtListOfCommands[iIndex].lfMaxValue == 0.0 )
					gvtListOfCommands[iIndex].lfMaxValue = 5.0;
				
				sprintf( szStringValue , "%lf" , gvtListOfCommands[iIndex].lfMaxValue ); 													  
				SetCtrlVal( tabPanelHandle , DEFAULT_MAX_VALUE , szStringValue ); 
				
				sprintf( szStringValue , "%lf" , gvtListOfCommands[iIndex].lfMinValue ); 													  
				SetCtrlVal( tabPanelHandle , DEFAULT_MIN_VALUE , szStringValue ); 
																				
				sprintf( szStringValue , "%d" , gvtListOfCommands[iIndex].valueCount ); 														  
				SetCtrlVal( tabPanelHandle , DEFAULT_VALUE_COUNT , szStringValue ); 
				
				sprintf( szStringValue , "0x%02llX" , gvtListOfCommands[iIndex].DefValue ); 													  
				SetCtrlVal( tabPanelHandle , DEFAULT_DEFAULT_VALUE , szStringValue );  
				
				sprintf( szStringValue , "0x%02llX" , gvtListOfCommands[iIndex].UseBitsMap ); 															  
				SetCtrlVal( tabPanelHandle , DEFAULT_USE_BITS_MAP , szStringValue );												  
						
				if ( gvtListOfCommands[iIndex].iPortsQuantity == 0)
					gvtListOfCommands[iIndex].iPortsQuantity = 1;
				
				memset( szStringValue , 0 , LOW_STRING );
				
				for ( iPortIndex = 0; iPortIndex < gvtListOfCommands[iIndex].iPortsQuantity; iPortIndex++ )
				{
					if ( iPortIndex > 0 )
						strcat( szStringValue , "," );
					
					sprintf( szStringValue + strlen(szStringValue) , "%d" , gvtListOfCommands[iIndex].pPortNumbersArray[iPortIndex] ); 															  
				}
				
				SetCtrlVal( tabPanelHandle , DEFAULT_PORTS , szStringValue );
				
				SetCtrlVal( tabPanelHandle , DEFAULT_PULLING_TYPE , gvtListOfCommands[iIndex].bPullingState );
				
				SetCtrlVal( tabPanelHandle , DEFAULT_DEVICE_NAME , gvtListOfCommands[iIndex].szDeviceName );
				
				SetCtrlVal( tabPanelHandle , DEFAULT_VALUE_TYPE , gvtListOfCommands[iIndex].valueType );
				
				SetCtrlVal( tabPanelHandle , DEFAULT_PILLING_STATE , gvtListOfCommands[iIndex].bPowerUpState );
	
				if ( gvtListOfCommands[iIndex].iConfigType )
					SetCtrlVal( tabPanelHandle , DEFAULT_CONFIG_TYPE , gvtListOfCommands[iIndex].iConfigType );
				else
					SetCtrlIndex( tabPanelHandle , DEFAULT_CONFIG_TYPE , 0 );
					
				if ( gvtListOfCommands[iIndex].iMeasureType )
					SetCtrlVal( tabPanelHandle , DEFAULT_MEASURE_TYPE , gvtListOfCommands[iIndex].iMeasureType );
				else
					SetCtrlIndex( tabPanelHandle , DEFAULT_MEASURE_TYPE , 0 );
				
				break; 
				
		case 1:
				break;
				
		case 2:
				sprintf( szStringValue , "%d" , gvtListOfCommands[iIndex].iAlalogMeasureNumberOfPoints  ); 
				SetCtrlVal( tabPanelHandle , MEAS_CONF_NUMBER_OF_POINTS , szStringValue );
				
				sprintf( szStringValue , "%d" , gvtListOfCommands[iIndex].iAlalogMeasureSimpleRate ); 
				SetCtrlVal( tabPanelHandle , MEAS_CONF_SIMPLE_RATE , szStringValue );
				
				SetCtrlVal( tabPanelHandle , MEAS_CONF_MEASURE_FUNCTION , gvtListOfCommands[iIndex].iAlalogMeasureFunction );
				
				break;
		
		default: 
				break;
	}
	
	return 0;
}
Exemple #6
0
void acquire_scans (void)
{
	int color;
	int Nleft=0;
	char file [ FILENAME_MAX ];

	SetCtrlAttribute (Main_pnl_handle, ERG_panel_acquire, ATTR_DIMMED, 1);
	SetCtrlAttribute (Main_pnl_handle, ERG_panel_abortscan, ATTR_DIMMED, 1);
	if (experiment==1){
		GetCtrlVal (Sequence_pnl_handle, Seq_panel_seq_number, &seq_num);
		Nscans=	seq_num*m;
	}
	else {
		GetCtrlVal (Main_pnl_handle, ERG_panel_nscans, &Nscans);
	}

	DirSelectPopup ("d:\\data\\test", "Select Directory", 1, 1, pathname);

	i=0;
	SetCtrlAttribute (Main_pnl_handle, ERG_panel_pause, ATTR_DIMMED, 0);
	SetCtrlAttribute (Main_pnl_handle, ERG_panel_abortscan, ATTR_DIMMED, 0);
	
// start trigger 
	SRS_flag=2;
	SRS_onoff();
	DeleteGraphPlot (Main_pnl_handle, ERG_panel_mask_display, -1, VAL_IMMEDIATE_DRAW);
	
	if (experiment==1){			 // mode sequence
		for (i=0;i<seq_num;i++) {
			for (h=0;h<m;h++){
				SetCtrlIndex (Sequence_pnl_handle, Seq_panel_mask_list, h);
				for (k=0;k<Npixel;k++){
					drive_level[k]=mask[h].voltages[k];
				}				
				display_masks();
				
				ProcessSystemEvents();
				GetLabelFromIndex (Sequence_pnl_handle, Seq_panel_mask_list, h, &mask_filename);
				strcpy(filename, pathname);
				
				//prepare file to write
				sprintf(file, "\\sequence%d_%s.txt", i, mask_filename);
				strcat(filename, file);
				data_file = OpenFile (filename, VAL_WRITE_ONLY, VAL_TRUNCATE, VAL_ASCII);
				
				//enable oscillo then wait for trigger and get ERG trace
				color=floor(256/Nscans)*(i*m+h);
				waveform(color, data_file);	
				get_intensity();
				
				//write header file
				headerfile();
				
				//write ERG trace 
				ArrayToFile (filename, data2fit, VAL_DOUBLE, 10000, 1, VAL_GROUPS_TOGETHER, VAL_GROUPS_AS_ROWS, VAL_SEP_BY_TAB, 100, VAL_ASCII, VAL_APPEND);
				nmeasure[0]=i*m+h+1;
				displaychannel();
				
				Nleft=Nscans-(i*m+h);
				SetCtrlVal (Main_pnl_handle, ERG_panel_nremain, Nleft);
				ProcessSystemEvents();
				if (pause_flag)
				{
					while (pause_flag)
						ProcessSystemEvents();
				}
			}
		}
	}
	
	else{				  // mode normal
	//prepare file name for acquiring data
		while ( i < Nscans )
		{
			strcpy(filename, pathname);
			sprintf(file, "\\scope_data%d.txt", i);
			strcat(filename, file);
			data_file = OpenFile (filename, VAL_WRITE_ONLY, VAL_TRUNCATE, VAL_ASCII);
			color=floor(256/Nscans)*i;
			waveform(color, data_file);
			get_intensity();
			
			headerfile();
			ArrayToFile (filename, data2fit, VAL_DOUBLE, 10000, 1, VAL_GROUPS_TOGETHER, VAL_GROUPS_AS_ROWS, VAL_SEP_BY_TAB, 100, VAL_ASCII, VAL_APPEND);
			
			i++;
			Nleft=Nscans-i+1;
			SetCtrlVal (Main_pnl_handle, ERG_panel_nremain, Nleft);
			ProcessSystemEvents();
			if (pause_flag)
			{
				while (pause_flag)
					ProcessSystemEvents();
			}
			CloseFile (data_file);
		}
	}
	
	SetCtrlVal (Main_pnl_handle, ERG_panel_nremain, 0);
	SetCtrlAttribute (Main_pnl_handle, ERG_panel_pause, ATTR_DIMMED, 1);
	SetCtrlAttribute (Main_pnl_handle, ERG_panel_abortscan, ATTR_DIMMED, 1);
	SetCtrlAttribute (Main_pnl_handle, ERG_panel_acquire, ATTR_DIMMED, 0);
	
// stop trigger 	
	SRS_flag=0;
	SRS_onoff();
	
	ibsic(device); 
	return;
}
Exemple #7
0
int usb1208ls_ControlCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
    portPtr port = callbackData;
    switch (control)
    {
        case USB1208LS_RANGE:
            if(event == EVENT_COMMIT && port)
                GetCtrlVal(panel, control, &port->port.analogueIOport.range);
            break;
        case USB1208LS_INPUT:
            if(event == EVENT_COMMIT && port)
            {
                int i;
                MCCdevPtr dev = port->port.analogueIOport.IO.acqchan->dev;
                usb1208lsPtr pmd = dev->device;
                GetCtrlVal(panel, control, &i);
                port->control = 0;
                if(i != -1)
                {
                    pmd->aiPorts[i]->control = control;
                    SetCtrlAttribute (panel, control, ATTR_CALLBACK_DATA, pmd->aiPorts[i]);
                    SetCtrlAttribute (panel, USB1208LS_RANGE, ATTR_CALLBACK_DATA, pmd->aiPorts[i]);
                    SetCtrlAttribute (panel, USB1208LS_ACQ, ATTR_CALLBACK_DATA, pmd->aiPorts[i]);
                    SetCtrlAttribute (panel, USB1208LS_AVERAGE, ATTR_CALLBACK_DATA, pmd->aiPorts[i]);
                    SetCtrlVal (panel, USB1208LS_AVERAGE, pmd->aiPorts[i]->averaging);
                    SetCtrlIndex (panel, USB1208LS_RANGE, usb1208ls_IndexFromRange(pmd->aiPorts[i]->port.analogueIOport.range));
                    SetCtrlVal (panel, USB1208LS_ACQ, pmd->aiPorts[i]->port.analogueIOport.IO.acqchan->acquire);
                }
                SetCtrlAttribute (panel, USB1208LS_RANGE, ATTR_DIMMED, (i == -1));
                SetCtrlAttribute (panel, USB1208LS_ACQ, ATTR_DIMMED, (i == -1));
                if(i == -1)SetCtrlVal (panel, USB1208LS_ACQ, 0);
            }
            break;
        case USB1208LS_ACQ:
            if(event == EVENT_COMMIT && port && utilG.acq.status != ACQ_BUSY)
            {
                int i;
                MCCdevPtr dev = port->port.analogueIOport.IO.acqchan->dev;
                usb1208lsPtr pmd = dev->device;
                GetCtrlIndex (panel, USB1208LS_INPUT, &i);
                if(i)
                {
                    GetCtrlVal (panel, control, &port->port.analogueIOport.IO.acqchan->acquire);
                    if (port->port.analogueIOport.IO.acqchan->acquire)
                        acqchanlist_AddChannel(port->port.analogueIOport.IO.acqchan);
                    else
                        acqchanlist_RemoveChannel(port->port.analogueIOport.IO.acqchan);
                    SetMenuBarAttribute (pmd->menu, port->menuitem_id, ATTR_CHECKED, port->port.analogueIOport.IO.acqchan->acquire);
                }
            }
            else if(event == EVENT_COMMIT && utilG.acq.status == ACQ_BUSY)
                SetCtrlVal (panel, control, port->port.analogueIOport.IO.acqchan->acquire);
            break;
        /*case USB1208LS_DIGITAL_OUT_0:
        case USB1208LS_DIGITAL_OUT_1:
        case USB1208LS_DIGITAL_OUT_2:
        case USB1208LS_DIGITAL_OUT_3:
        case USB1208LS_DIGITAL_OUT_4:
        case USB1208LS_DIGITAL_OUT_5:
            if(event == EVENT_COMMIT && port)
            {
                MCCdevPtr dev = port->port.digitalIOport.IO.source->acqchan->dev;
                usb1208lsPtr pmd = dev->device;
                GetCtrlVal (panel, USB1208LS_DIGITAL_OUT_0, &pmd->bits[0]);
                GetCtrlVal (panel, USB1208LS_DIGITAL_OUT_1, &pmd->bits[1]);
                GetCtrlVal (panel, USB1208LS_DIGITAL_OUT_2, &pmd->bits[2]);
                GetCtrlVal (panel, USB1208LS_DIGITAL_OUT_3, &pmd->bits[3]);
                GetCtrlVal (panel, USB1208LS_DIGITAL_OUT_4, &pmd->bits[4]);
                GetCtrlVal (panel, USB1208LS_DIGITAL_OUT_5, &pmd->bits[5]);
                pmd->bits[1] *= 2;
                pmd->bits[2] *= 4;
                pmd->bits[3] *= 8;
                pmd->bits[4] *= 16;
                pmd->bits[5] *= 32;
                port->port.digitalIOport.IO.source->biaslevel = pmd->bits[0] + pmd->bits[1] + pmd->bits[2] + pmd->bits[3] + pmd->bits[4] + pmd->bits[5];
                port->port.digitalIOport.IO.source->SetLevel(port->port.digitalIOport.IO.source);
            }
            break;*/
        case USB1208LS_AVERAGE:
            if(event == EVENT_COMMIT && port)
               GetCtrlVal (panel, control, &port->averaging);
            break;
    }
    if (event == EVENT_COMMIT && port)
        usb1208ls_UpdateMeasurePanel(port);
    return 0;
}
Exemple #8
0
static void k2400_UpdateControls (int panel, gpibioPtr dev)
{
    char s_text[20], m_text[20];
    k2400Ptr smu = dev->device;
    double absmax;
	
    k2400_GetMachineStatus (dev);
    k2400_GetMeasurementParameters (dev);
	//k2400_GetReadings(smu->source->acqchan);

    SetCtrlVal (panel, K2400_SOURCE, smu->source->acqchan->reading);
    SetCtrlVal (panel, K2400_MEASURE, smu->measure->reading);

    SetCtrlVal (panel, K2400_OPERATE, smu->operate);
    SetInputMode (panel, K2400_SOURCE, smu->operate);
    SetInputMode (panel, K2400_MEASURE, smu->operate);

    SetCtrlVal (panel, K2400_SELECT, smu->src.current);
    SetCtrlVal (panel, K2400_SENSE, smu->sense);

    if (smu->src.current) {
        Fmt (s_text, "A"); Fmt (m_text, "V");
    } else {
        Fmt (s_text, "V"); Fmt (m_text, "A");
    }

    SetCtrlVal (panel, K2400_SOURCETEXT, s_text);
    SetCtrlVal (panel, K2400_MEASURETEXT, m_text);

    SetCtrlAttribute (panel, K2400_SOURCE_I_RANGE, ATTR_VISIBLE, smu->src.current);
    SetCtrlAttribute (panel, K2400_SOURCE_V_RANGE, ATTR_VISIBLE, !smu->src.current);

    if (smu->src.current) {
        SetCtrlIndex (panel, K2400_SOURCE_I_RANGE, smu->src.rangeC);
        GetCtrlVal (panel, K2400_SOURCE_I_RANGE, &smu->source->max);
    } else {
        SetCtrlIndex (panel, K2400_SOURCE_V_RANGE, smu->src.rangeV);
        GetCtrlVal (panel, K2400_SOURCE_V_RANGE, &smu->source->max);
    }

    smu->source->min = -smu->source->max;
    SetCtrlAttribute (panel, K2400_SOURCE, ATTR_MIN_VALUE, smu->source->min);
    SetCtrlAttribute (panel, K2400_SOURCE, ATTR_MAX_VALUE, smu->source->max);
    SetCtrlVal (panel, K2400_DELAY, smu->src.delay);

    SetCtrlAttribute (panel, K2400_MEAS_I_RANGE, ATTR_VISIBLE, !smu->src.current);
    SetCtrlAttribute (panel, K2400_MEAS_V_RANGE, ATTR_VISIBLE, smu->src.current);

    SetCtrlVal (panel, K2400_LEVEL, k2400_GetCompLevel (dev));

    if (smu->src.current) {
        SetCtrlIndex (panel, K2400_MEAS_V_RANGE, smu->meas.range);
        GetCtrlVal (panel, K2400_MEAS_V_RANGE, &absmax);
    } else {
        SetCtrlIndex (panel, K2400_MEAS_I_RANGE, smu->meas.range);
        GetCtrlVal (panel, K2400_MEAS_I_RANGE, &absmax);
    }

    SetCtrlAttribute (panel, K2400_LEVEL, ATTR_MIN_VALUE, -absmax);
    SetCtrlAttribute (panel, K2400_LEVEL, ATTR_MAX_VALUE, absmax);

    SetCtrlVal (panel, K2400_FILTER, smu->meas.filter);
    SetCtrlVal (panel, K2400_INTTIME, smu->meas.inttime);

}