/*--------------------------------------------------------------------
* File: phmonitor.g
*
* Description: Monitors and controls the PID Emulator.
*
* Functions:
* toggle_sym
* slider_callback
* accumulate_trends
* update_trends
* create_monitor
* main
*------------------------------------------------------------------*/
/*--------------------------------------------------------------------
* Function: toggle_sym
* Returns: t or nil
* Description: Toggles a database point between 0 and 1 when a button
* is pressed.
*------------------------------------------------------------------*/
function toggle_sym(sym)
{
set (sym, eval(sym) == 0 ? 1 : 0);
write_point (sym, eval(sym));
}
/*--------------------------------------------------------------------
* Function: slider_callback
* Returns: t or nil
* Description: Attaches a callback and adds and exception function to
* a slider widget. The callback writes a value to the
* datahub point specified, and the exception function
* assigns the value of the datahub point to the slider
* widget whenever the value of the point changes in the
* datahub.
*------------------------------------------------------------------*/
function slider_callback(sld, !pnt)
{
PtAttachCallback(sld, Pt_CB_SLIDER_MOVE,
`write_point(@pnt, ((@eval(sld)).gauge_value)));
add_exception_function(eval(pnt),
`(@eval(sld)).gauge_value = (@eval(pnt)));
}
/* Assign each DataHub point a property value, which in this case is an
* array. These arrays will be used to hold a short history of each point,
* allowing them to be plotted by the trend widget.
*/
setprop (#SP_001, #tdata, make_array (0));
setprop (#MV_001, #tdata, make_array (0));
setprop (#PV_001, #tdata, make_array (0));
/*--------------------------------------------------------------------
* Function: accumulate_trends
* Returns: t or nil
* Description: Adds new data to property value arrays. These arrays
* are property values for the variables that correspond
* to the DataHub points, and are used to update the trend
* widget.
*------------------------------------------------------------------*/
function accumulate_trends (syms...)
{
local data;
with sym in syms do
{
data = getprop (sym, #tdata);
data[length(data)] = eval (sym);
}
}
/*--------------------------------------------------------------------
* Function: update_trends
* Returns: t or nil
* Description: Assigns the most recent arrays to the trend widget.
*------------------------------------------------------------------*/
function update_trends (widget, syms...)
{
local tarray = make_array (length(syms)), i = 0, sym;
with sym in syms do
tarray[i++] = getprop (sym, #tdata);
widget.put_data(tarray);
with sym in syms do
shorten_array (getprop (sym, #tdata), 0);
}
/*--------------------------------------------------------------------
* Function: create_monitor
* Returns: doesnt' return
* Description: Creates the Monitor window.
*------------------------------------------------------------------*/
function create_monitor ()
{
local wfile, window, monitor_win, slidesp, progmv, progpv;
local slideauto, slidedp, numkp, numki, numkd, numprop, numint;
local butam, butgood, butpoor, butosc, butout, butx;
wfile = PhabReadWidgetFile(anyos_assign("monitor_widgetfile"));
window = PhabCreateWidgets(wfile, nil, nil);
monitor_win = PhabLookupWidget(window, #Ptmonitor, nil);
slidesp = PhabLookupWidget(window, #PtSliderSP, nil);
slideclr = PhabLookupWidget(window, #RtProgressColor, nil);
butam = PhabLookupWidget(window, #PtOnOffButtonAutomode, nil);
numfreq = PhabLookupWidget(window, #PtNum1, nil);
numkp = PhabLookupWidget(window, #PtNum2, nil);
numki = PhabLookupWidget(window, #PtNum3, nil);
numkd = PhabLookupWidget(window, #PtNum4, nil);
numprop = PhabLookupWidget(window, #PtNum5, nil);
numint = PhabLookupWidget(window, #PtNum6, nil);
butgood = PhabLookupWidget(window, #PtToggleGood, nil);
butpoor = PhabLookupWidget(window, #PtTogglePoor, nil);
butosc = PhabLookupWidget(window, #PtToggleOscillating, nil);
butout = PhabLookupWidget(window, #PtToggleOOC, nil);
labprop = PhabLookupWidget(window, #PtLabelPropVal, nil);
progmv = PhabLookupWidget(window, #ProgressMV, nil);
progpv = PhabLookupWidget(window, #ProgressPV, nil);
trend1 = PhabLookupWidget(window, #Trend1, nil);
slidesp.gauge_value = read_point(#SP_001);
slideclr.gauge_value = read_point(#SP_001);
progmv.gauge_value = read_point(#MV_001);
progpv.gauge_value = read_point(#PV_001);
butam.onoff_state = read_point(#AUTO_001);
numfreq.numeric_value = read_point(#FREQ_001);
anyver_numeric_assign(numkp, numki, numkd, numprop, numint);
add_exception_function(#AUTO_001, `(@butam).onoff_state = AUTO_001);
add_exception_function(#SP_001, `(@slideclr).gauge_value = SP_001);
add_echo_function(#SP_001, `(@slideclr).gauge_value = SP_001);
add_exception_function(#MV_001, `(@progmv).gauge_value = MV_001);
add_exception_function(#PV_001, `(@progpv).gauge_value = PV_001);
slider_callback (slidesp, #SP_001);
attach_msg(monitor_win, "3", "1");
attach_msg(slidesp, "3.1a", "3");
attach_msg(butam, "3.1", "3");
attach_msg(numfreq, "3.2", "3");
attach_msg(numkp, "3.3", "3");
attach_msg(numki, "3.4", "3");
attach_msg(numkd, "3.5", "3");
attach_msg(numprop, "3.6", "3");
attach_msg(numint, "3.7", "3");
attach_msg(butgood, "3.8", "3");
attach_msg(butpoor, "3.9", "3");
attach_msg(butosc, "3.10", "3");
attach_msg(butout, "3.11", "3");
anyver_num_callback (numfreq, #FREQ_001);
anyver_num_callback (numkp, #PID1_Kp);
anyver_num_callback (numki, #PID1_Ki);
anyver_num_callback (numkd, #PID1_Kd);
anyver_num_callback (numprop, #PROP_001);
anyver_num_callback (numint, #INT_001);
PtAttachCallback(butgood, Pt_CB_ACTIVATE,
`anyos_change_settings(t, @numfreq, 4, @numkp, .05,
@numki, .45, @numkd, .05,
@numprop, .7, @numint, 1.0,
3.8, @butam));
PtAttachCallback(butpoor, Pt_CB_ACTIVATE,
`anyos_change_settings(t, @numfreq, 10, @numkp, .05,
@numki, .70, @numkd, .05,
@numprop, .7, @numint, 5.0,
3.8, @butam));
PtAttachCallback(butosc, Pt_CB_ACTIVATE,
`anyos_change_settings(nil, @numfreq, 10, @numkp, .05,
@numki, 1.37, @numkd, .05,
@numprop, .7, @numint, .54,
3.8, @butam));
PtAttachCallback(butout, Pt_CB_ACTIVATE,
`anyos_change_settings(nil, @numfreq, 10, @numkp, .05,
@numki, .45, @numkd, 1.00,
@numprop, .7, @numint, .54,
3.8, @butam));
PtAttachCallback(butam, Pt_CB_ONOFF_NEW_VALUE, `toggle_sym(#AUTO_001));
butx = PhabLookupWidget(window, #Ptxbut, nil);
PtAttachCallback(butx, Pt_CB_ACTIVATE, #exit_program(-1));
/* Set up the trend widget. We must set the trend resources in the
* order below to ensure that the trend widget knows what to do with
* the line colors. We want 3 traces, in the same colors that the
* designer set when creating the slider and progress bars in the
* Photon App Builder.
*/
trend1.trend_count = 3;
trend1.trend_color_list = array (slideclr.progress_bar_color,
progmv.progress_bar_color,
progpv.progress_bar_color);
trend1.trend_attributes = array (1, 2, 3);
/* Animate trends every tenth of a second. The trend data arrays are
* stored in the property lists of the associated database variables.
* We can accumulate trend data faster than we display it by changing
* the rates of accumulation and update. It does not make sense to display
* trend data faster than about 27Hz, because the eye cannot distinguish
* anything beyond that from smooth motion. In reality, 10Hz is plenty.
*/
every (0.1, #accumulate_trends (#SP_001, #MV_001, #PV_001));
every (0.1, #update_trends (trend1, #SP_001, #MV_001, #PV_001));
monitor_win.SetPos(360, 10);
PtRealizeWidget(monitor_win);
send_message("nsnames");
// PtMainLoop();
while(t) next_event();
}
/*--------------------------------------------------------------------
* Function: main
* Returns:
* Description:
*------------------------------------------------------------------*/
function main()
{
/* Get access to the library of common functions. */
require("lib/common.g");
program_startup("monitor", "monq", #create_monitor(), "3");
}
Copyright © 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.