Commit cdeacae0 authored by Claes Sjofors's avatar Claes Sjofors

Ge dynamic TimeoutColor added

parent 796de9df
This diff is collapsed.
......@@ -110,6 +110,7 @@ static attrnav_sEnumElement elem_dyn_type1[] = {
static attrnav_sEnumElement elem_dyn_type2[] = {
{ (int) ge_mDynType2_DigTextColor , "DigTextColor"},
{ (int) ge_mDynType2_TimeoutColor , "TimeoutColor"},
{ 0, ""}};
static attrnav_sEnumElement elem_dyn_type1_tone[] = {
......
......@@ -454,6 +454,8 @@ GeDyn::GeDyn( const GeDyn& x) :
e = new GeAxis((const GeAxis&) *elem); break;
case ge_mDynType2_DigTextColor:
e = new GeDigTextColor((const GeDigTextColor&) *elem); break;
case ge_mDynType2_TimeoutColor:
e = new GeTimeoutColor((const GeTimeoutColor&) *elem); break;
default: ;
}
switch( elem->action_type1) {
......@@ -593,6 +595,7 @@ void GeDyn::open( ifstream& fp)
case ge_eSave_BarChart: e = (GeDynElem *) new GeBarChart(this); break;
case ge_eSave_Axis: e = (GeDynElem *) new GeAxis(this); break;
case ge_eSave_DigTextColor: e = (GeDynElem *) new GeDigTextColor(this); break;
case ge_eSave_TimeoutColor: e = (GeDynElem *) new GeTimeoutColor(this); break;
case ge_eSave_HostObject: e = (GeDynElem *) new GeHostObject(this); break;
case ge_eSave_DigSound: e = (GeDynElem *) new GeDigSound(this); break;
case ge_eSave_XY_Curve: e = (GeDynElem *) new GeXY_Curve(this); break;
......@@ -1512,6 +1515,9 @@ GeDynElem *GeDyn::create_dyn2_element( int mask, int instance)
case ge_mDynType2_DigTextColor:
e = (GeDynElem *) new GeDigTextColor(this);
break;
case ge_mDynType2_TimeoutColor:
e = (GeDynElem *) new GeTimeoutColor(this);
break;
default: ;
}
return e;
......@@ -1694,6 +1700,9 @@ GeDynElem *GeDyn::copy_element( GeDynElem& x)
case ge_mDynType2_DigTextColor:
e = (GeDynElem *) new GeDigTextColor((GeDigTextColor&) x);
break;
case ge_mDynType2_TimeoutColor:
e = (GeDynElem *) new GeTimeoutColor((GeTimeoutColor&) x);
break;
default: ;
}
}
......@@ -9801,6 +9810,296 @@ int GeAxis::export_java( grow_tObject object, ofstream& fp, bool first, char *va
return 1;
}
void GeTimeoutColor::get_attributes( attr_sItem *attrinfo, int *item_count)
{
int i = *item_count;
strcpy( attrinfo[i].name, "TimeoutColor.Time");
attrinfo[i].value = &time;
attrinfo[i].type = glow_eType_Double;
attrinfo[i++].size = sizeof( time);
strcpy( attrinfo[i].name, "TimeoutColor.Color");
attrinfo[i].value = &color;
attrinfo[i].type = glow_eType_Color;
attrinfo[i++].size = sizeof( color);
*item_count = i;
}
void GeTimeoutColor::save( ofstream& fp)
{
fp << int(ge_eSave_TimeoutColor) << endl;
fp << int(ge_eSave_TimeoutColor_time) << FSPACE << time << endl;
fp << int(ge_eSave_TimeoutColor_color) << FSPACE << int(color) << endl;
fp << int(ge_eSave_End) << endl;
}
void GeTimeoutColor::open( ifstream& fp)
{
int type;
int end_found = 0;
int tmp;
char dummy[40];
for (;;)
{
if ( !fp.good()) {
fp.clear();
fp.getline( dummy, sizeof(dummy));
printf( "** Read error GeTimeoutColor: \"%d %s\"\n", type, dummy);
}
fp >> type;
switch( type) {
case ge_eSave_TimeoutColor: break;
case ge_eSave_TimeoutColor_time: fp >> time; break;
case ge_eSave_TimeoutColor_color: fp >> tmp; color = (glow_eDrawType)tmp; break;
case ge_eSave_End: end_found = 1; break;
default:
cout << "GeTimeoutColor:open syntax error" << endl;
fp.getline( dummy, sizeof(dummy));
}
if ( end_found)
break;
}
}
int GeTimeoutColor::connect( grow_tObject object, glow_sTraceData *trace_data)
{
color = dyn->get_color1( object, color);
if ( color < 0 || color >= glow_eDrawType__) {
printf( "** Color out of range, TimeoutColor\n");
return 0;
}
time_FloatToD( &dtime, time);
trace_data->p = &pdummy;
first_scan = true;
init_done = false;
double scan_time;
switch( dyn->cycle) {
case glow_eCycle_Slow:
scan_time = dyn->graph->scan_time;
break;
case glow_eCycle_Fast:
scan_time = dyn->graph->fast_scan_time;
break;
default:
scan_time = 1;
}
scan_interval = (int)(time / scan_time / 2);
if ( scan_interval < 1)
scan_interval = 1;
interval_cnt = 0;
return 1;
}
int GeTimeoutColor::disconnect( grow_tObject object)
{
subid = pwr_cNSubid;
return 1;
}
int GeTimeoutColor::scan( grow_tObject object)
{
if ( (init_done && subid.nid == 0 && subid.rix == 0) || dyn->ignore_color)
return 1;
interval_cnt++;
if ( interval_cnt < scan_interval)
return 1;
interval_cnt = 0;
if ( !init_done) {
// Get subid from other dyn element
for ( GeDynElem *elem = dyn->elements; elem; elem = elem->next) {
if ( elem == this)
continue;
switch( elem->dyn_type1) {
case ge_mDynType1_DigLowColor:
subid = ((GeDigLowColor *)elem)->subid;
break;
case ge_mDynType1_DigColor:
subid = ((GeDigColor *)elem)->subid;
break;
case ge_mDynType1_DigError:
subid = ((GeDigError *)elem)->subid;
break;
case ge_mDynType1_DigWarning:
subid = ((GeDigWarning *)elem)->subid;
break;
case ge_mDynType1_DigFlash:
subid = ((GeDigFlash *)elem)->subid;
break;
case ge_mDynType1_Invisible:
subid = ((GeInvisible *)elem)->subid;
break;
case ge_mDynType1_DigBorder:
subid = ((GeDigBorder *)elem)->subid;
break;
case ge_mDynType1_DigText:
subid = ((GeDigText *)elem)->subid;
break;
case ge_mDynType1_Value:
subid = ((GeValue *)elem)->subid;
break;
case ge_mDynType1_AnalogColor:
subid = ((GeAnalogColor *)elem)->subid;
break;
case ge_mDynType1_Rotate:
subid = ((GeRotate *)elem)->subid;
break;
case ge_mDynType1_Move:
if ( ((GeMove *)elem)->move_x_p)
subid = ((GeMove *)elem)->move_x_subid;
else if ( ((GeMove *)elem)->move_x_p)
subid = ((GeMove *)elem)->move_y_subid;
else if ( ((GeMove *)elem)->scale_x_p)
subid = ((GeMove *)elem)->scale_x_subid;
else if ( ((GeMove *)elem)->scale_y_p)
subid = ((GeMove *)elem)->scale_y_subid;
break;
case ge_mDynType1_DigShift:
subid = ((GeDigShift *)elem)->subid;
break;
case ge_mDynType1_AnalogShift:
subid = ((GeAnalogShift *)elem)->subid;
break;
case ge_mDynType1_Video:
break;
case ge_mDynType1_Animation:
subid = ((GeAnimation *)elem)->subid;
break;
case ge_mDynType1_Bar:
subid = ((GeBar *)elem)->subid;
break;
case ge_mDynType1_Trend:
if ( ((GeTrend *)elem)->p1)
subid = ((GeTrend *)elem)->subid1;
else if ( ((GeTrend *)elem)->p2)
subid = ((GeTrend *)elem)->subid2;
break;
case ge_mDynType1_FillLevel:
subid = ((GeFillLevel *)elem)->subid;
break;
case ge_mDynType1_FastCurve:
subid = ((GeFastCurve *)elem)->subid;
break;
case ge_mDynType1_AnalogText:
subid = ((GeAnalogText *)elem)->subid;
break;
case ge_mDynType1_Table:
break;
case ge_mDynType1_StatusColor:
subid = ((GeStatusColor *)elem)->subid;
break;
case ge_mDynType1_HostObject:
break;
case ge_mDynType1_DigSound:
subid = ((GeDigSound *)elem)->subid;
break;
case ge_mDynType1_XY_Curve:
if ( ((GeXY_Curve *)elem)->update_p)
subid = ((GeXY_Curve *)elem)->update_subid;
else if ( ((GeXY_Curve *)elem)->noofpoints_p)
subid = ((GeXY_Curve *)elem)->noofpoints_subid;
break;
case ge_mDynType1_DigCommand:
subid = ((GeDigCommand *)elem)->subid;
break;
case ge_mDynType1_Pie:
subid = ((GePie *)elem)->subid[0];
break;
case ge_mDynType1_BarChart:
subid = ((GeBarChart *)elem)->subid[0];
break;
default: ;
}
switch( elem->dyn_type2) {
case ge_mDynType2_Axis:
if ( ((GeAxis *)elem)->min_value_p)
subid = ((GeAxis *)elem)->min_value_subid;
else if ( ((GeAxis *)elem)->max_value_p)
subid = ((GeAxis *)elem)->max_value_subid;
break;
case ge_mDynType2_DigTextColor:
subid = ((GeDigTextColor *)elem)->subid;
break;
case ge_mDynType2_TimeoutColor:
break;
default: ;
}
if ( !(subid.nid == 0 && subid.rix == 0))
break;
}
init_done = true;
return 1;
}
pwr_tBoolean val;
pwr_tTime last_update, current_time, timeout_time;
pwr_tStatus sts;
sts = gdh_GetSubscriptionOldness( subid, 0, &last_update, 0);
if ( EVEN(sts)) return 1;
time_Aadd( &timeout_time, &last_update, &dtime);
time_GetTime( &current_time);
if ( time_Acomp( &current_time, &timeout_time) >= 0)
val = 1;
else
val = 0;
if ( !first_scan) {
if ( old_value == val) {
// No change since last time
return 1;
}
}
else
first_scan = false;
if ( dyn->total_dyn_type1 & ge_mDynType1_Tone) {
if ( val) {
if ( color >= (glow_eDrawType) glow_eDrawTone__) {
if ( dyn->reset_color)
grow_ResetObjectFillColor( object); // Previous color might be a tone
grow_SetObjectFillColor( object, color);
}
else
grow_SetObjectColorTone( object, (glow_eDrawTone) color);
dyn->ignore_color = true;
}
else {
if ( color >= (glow_eDrawType) glow_eDrawTone__)
grow_ResetObjectFillColor( object);
grow_ResetObjectColorTone( object);
dyn->reset_color = true;
}
}
else {
if ( val) {
grow_SetObjectFillColor( object, color);
dyn->ignore_color = true;
}
else {
grow_ResetObjectFillColor( object);
dyn->reset_color = true;
}
}
old_value = val;
return 1;
}
void GeHostObject::get_attributes( attr_sItem *attrinfo, int *item_count)
{
int i = *item_count;
......
......@@ -124,6 +124,7 @@
ge_eDynPrio_HostObject,
ge_eDynPrio_Invisible,
ge_eDynPrio_DigFlash,
ge_eDynPrio_TimeoutColor,
ge_eDynPrio_DigError,
ge_eDynPrio_DigWarning,
ge_eDynPrio_AnalogColor,
......@@ -217,7 +218,8 @@
typedef enum {
ge_mDynType2_No = 0,
ge_mDynType2_Axis = 1 << 0,
ge_mDynType2_DigTextColor = 1 << 1
ge_mDynType2_DigTextColor = 1 << 1,
ge_mDynType2_TimeoutColor = 1 << 2
} ge_mDynType2;
//! Action types.
......@@ -325,6 +327,7 @@
ge_eSave_BarChart = 37,
ge_eSave_Axis = 38,
ge_eSave_DigTextColor = 39,
ge_eSave_TimeoutColor = 40,
ge_eSave_PopupMenu = 50,
ge_eSave_SetDig = 51,
ge_eSave_ResetDig = 52,
......@@ -527,6 +530,8 @@
ge_eSave_Axis_maxvalue_attr = 3801,
ge_eSave_DigTextColor_attribute = 3900,
ge_eSave_DigTextColor_color = 3901,
ge_eSave_TimeoutColor_time = 4000,
ge_eSave_TimeoutColor_color = 4001,
ge_eSave_PopupMenu_ref_object = 5000,
ge_eSave_SetDig_attribute = 5100,
ge_eSave_SetDig_instance = 5101,
......@@ -2774,6 +2779,37 @@ class GeAxis : public GeDynElem {
};
//! Set the supplied border color when the signal is high.
class GeTimeoutColor : public GeDynElem {
public:
double time; //!< Timeout time
glow_eDrawType color; //!< Fill color to set when the subscription is old.
pwr_tBoolean *p;
pwr_tSubid subid;
bool first_scan;
bool init_done;
pwr_tBoolean old_value;
pwr_tDeltaTime dtime;
int scan_interval;
int interval_cnt;
GeTimeoutColor( GeDyn *e_dyn) :
GeDynElem(e_dyn, ge_mDynType1_No, ge_mDynType2_TimeoutColor, ge_mActionType1_No, ge_mActionType2_No, ge_eDynPrio_TimeoutColor),
time(5), color(glow_eDrawType_Inherit)
{}
GeTimeoutColor( const GeTimeoutColor& x) :
GeDynElem(x.dyn,x.dyn_type1,x.dyn_type2,x.action_type1,x.action_type2,x.prio), time(x.time), color(x.color)
{}
void get_attributes( attr_sItem *attrinfo, int *item_count);
void save( ofstream& fp);
void open( ifstream& fp);
int connect( grow_tObject object, glow_sTraceData *trace_data);
int disconnect( grow_tObject object);
int scan( grow_tObject object);
};
/*@}*/
#endif
......
......@@ -3212,8 +3212,10 @@ int XNavGbl::load_config( XNav *xnav)
{
int sts;
if ( strcmp( xnav->opplace_name, "") == 0)
if ( strcmp( xnav->opplace_name, "") == 0) {
xnav->opplace_p = (pwr_sClass_OpPlace *) calloc(1, sizeof(pwr_sClass_OpPlace));
return 0;
}
strcpy( OpPlace, xnav->opplace_name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment