cwFlow,cwFlowTypes : Changes to fix problems with communicating between connected variables.
Added _set_var_template(), _var_setter()
This commit is contained in:
parent
07d9c137b9
commit
33e1945ab4
97
cwFlow.cpp
97
cwFlow.cpp
@ -183,7 +183,17 @@ namespace cw
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _connect_vars( variable_t* src_var, variable_t* in_var )
|
||||||
|
{
|
||||||
|
// connect in_var into src_var's outgoing var chain
|
||||||
|
in_var->connect_link = src_var->connect_link;
|
||||||
|
src_var->connect_link = in_var;
|
||||||
|
|
||||||
|
assert( src_var->value != nullptr );
|
||||||
|
|
||||||
|
in_var->value = src_var->value;
|
||||||
|
in_var->src_var = src_var;
|
||||||
|
}
|
||||||
|
|
||||||
rc_t _setup_input( flow_t* p, instance_t* in_inst, const char* in_var_label, const char* src_label_arg )
|
rc_t _setup_input( flow_t* p, instance_t* in_inst, const char* in_var_label, const char* src_label_arg )
|
||||||
{
|
{
|
||||||
@ -244,14 +254,7 @@ namespace cw
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_connect_vars( src_var, in_var );
|
||||||
// connect in_var into src_var's outgoing var chain
|
|
||||||
in_var->connect_link = src_var->connect_link;
|
|
||||||
src_var->connect_link = in_var;
|
|
||||||
|
|
||||||
|
|
||||||
in_var->value = src_var->value;
|
|
||||||
|
|
||||||
|
|
||||||
//cwLogInfo("'%s:%s' connected to source '%s:%s' %p.", in_inst->label, in_var_label, src_inst->label, suffix, in_var->value );
|
//cwLogInfo("'%s:%s' connected to source '%s:%s' %p.", in_inst->label, in_var_label, src_inst->label, suffix, in_var->value );
|
||||||
|
|
||||||
@ -301,8 +304,8 @@ namespace cw
|
|||||||
if( max_vid == kInvalidId || var->vid > max_vid )
|
if( max_vid == kInvalidId || var->vid > max_vid )
|
||||||
max_vid = var->vid;
|
max_vid = var->vid;
|
||||||
|
|
||||||
if( var->chIdx != kAnyChIdx && var->chIdx > max_chIdx )
|
if( var->chIdx != kAnyChIdx && (var->chIdx+1) > max_chIdx )
|
||||||
max_chIdx = var->chIdx;
|
max_chIdx = (var->chIdx + 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -332,17 +335,19 @@ namespace cw
|
|||||||
variable_t* v0 = inst->varMapA[idx];
|
variable_t* v0 = inst->varMapA[idx];
|
||||||
rc = cwLogError(kInvalidStateRC,"The variable '%s' id:%i ch:%i and '%s' id:%i ch:%i share the same variable map position on instance: %s. This is usually cased by duplicate variable id's.",
|
rc = cwLogError(kInvalidStateRC,"The variable '%s' id:%i ch:%i and '%s' id:%i ch:%i share the same variable map position on instance: %s. This is usually cased by duplicate variable id's.",
|
||||||
v0->label,v0->vid,v0->chIdx, var->label,var->vid,var->chIdx,inst->label);
|
v0->label,v0->vid,v0->chIdx, var->label,var->vid,var->chIdx,inst->label);
|
||||||
|
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// assign this variable to a map position
|
// assign this variable to a map position
|
||||||
inst->varMapA[ idx ] = var;
|
inst->varMapA[ idx ] = var;
|
||||||
|
|
||||||
if( var->value == nullptr )
|
if( var->chIdx != kAnyChIdx && var->value == nullptr )
|
||||||
{
|
{
|
||||||
rc = cwLogError(kInvalidStateRC,"The value of the variable '%s' ch:%i on instance:'%s' has not been set.",var->label,var->chIdx,inst->label);
|
rc = cwLogError(kInvalidStateRC,"The value of the variable '%s' ch:%i on instance:'%s' has not been set.",var->label,var->chIdx,inst->label);
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -352,6 +357,49 @@ namespace cw
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _complete_input_connections( instance_t* inst )
|
||||||
|
{
|
||||||
|
for(variable_t* var=inst->varL; var!=nullptr; var=var->var_link)
|
||||||
|
if(var->chIdx == kAnyChIdx && is_connected_to_external_proc(var) )
|
||||||
|
{
|
||||||
|
|
||||||
|
variable_t* base_src_var = var->src_var;
|
||||||
|
|
||||||
|
// since 'var' is on the 'any' channel the 'src' var must also be on the 'any' channel
|
||||||
|
assert( base_src_var->chIdx == kAnyChIdx );
|
||||||
|
|
||||||
|
printf("%s %s\n",inst->label,var->label);
|
||||||
|
for(variable_t* in_var = var->ch_link; in_var != nullptr; in_var=in_var->ch_link)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
variable_t* svar = base_src_var;
|
||||||
|
for(; svar!=nullptr; svar=svar->ch_link)
|
||||||
|
if( svar->chIdx == in_var->chIdx )
|
||||||
|
break;
|
||||||
|
|
||||||
|
_connect_vars( svar==nullptr ? base_src_var : svar, in_var);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _call_value_func_on_all_variables( instance_t* inst )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
rc_t rc1 = kOkRC;
|
||||||
|
|
||||||
|
for(unsigned i=0; i<inst->varMapN; ++i)
|
||||||
|
if( inst->varMapA[i] != nullptr && inst->varMapA[i]->vid != kInvalidId )
|
||||||
|
{
|
||||||
|
variable_t* var = inst->varMapA[i];
|
||||||
|
|
||||||
|
if((rc = var->inst->class_desc->members->value( var->inst, var )) != kOkRC )
|
||||||
|
rc1 = cwLogError(rc,"The proc instance '%s' reported an invalid valid on variable:%s chIdx:%i.", var->inst->label, var->label, var->chIdx );
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc1;
|
||||||
|
}
|
||||||
|
|
||||||
rc_t _preset_channelize_vars( instance_t* inst, const char* type_src_label, const char* preset_label, const object_t* preset_cfg )
|
rc_t _preset_channelize_vars( instance_t* inst, const char* type_src_label, const char* preset_label, const object_t* preset_cfg )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
@ -384,12 +432,12 @@ namespace cw
|
|||||||
if( value->is_list() )
|
if( value->is_list() )
|
||||||
{
|
{
|
||||||
for(unsigned chIdx=0; chIdx<value->child_count(); ++chIdx)
|
for(unsigned chIdx=0; chIdx<value->child_count(); ++chIdx)
|
||||||
if((rc = var_channelize( inst, value_label, chIdx, value->child_ele(chIdx), dummy )) != kOkRC )
|
if((rc = var_channelize( inst, value_label, chIdx, value->child_ele(chIdx), kInvalidId, dummy )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
else // otherwise a single value was given
|
else // otherwise a single value was given
|
||||||
{
|
{
|
||||||
if((rc = var_channelize( inst, value_label, kAnyChIdx, value, dummy )) != kOkRC )
|
if((rc = var_channelize( inst, value_label, kAnyChIdx, value, kInvalidId, dummy )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -626,7 +674,7 @@ namespace cw
|
|||||||
// that were expressed with a list have numeric channel indexes assigned.
|
// that were expressed with a list have numeric channel indexes assigned.
|
||||||
|
|
||||||
|
|
||||||
// TODO: Should the 'all' variable be removed for variables that have numeric channel indexes.
|
// TODO: Should the 'all' variable be removed for variables that have numeric channel indexes?
|
||||||
|
|
||||||
// connect the variable lists in the instance 'in' dictionary
|
// connect the variable lists in the instance 'in' dictionary
|
||||||
if( pvars.in_dict != nullptr )
|
if( pvars.in_dict != nullptr )
|
||||||
@ -681,6 +729,11 @@ namespace cw
|
|||||||
if((rc =_create_instance_var_map( inst )) != kOkRC )
|
if((rc =_create_instance_var_map( inst )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
|
_complete_input_connections(inst);
|
||||||
|
|
||||||
|
if((rc = _call_value_func_on_all_variables( inst )) != kOkRC )
|
||||||
|
goto errLabel;
|
||||||
|
|
||||||
// insert an instance in the network
|
// insert an instance in the network
|
||||||
if( p->network_tail == nullptr )
|
if( p->network_tail == nullptr )
|
||||||
{
|
{
|
||||||
@ -787,7 +840,7 @@ namespace cw
|
|||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
|
|
||||||
// locate the proc instance
|
// locate the proc instance
|
||||||
if((inst = instance_find(p,inst_label)) != nullptr )
|
if((inst = instance_find(p,inst_label)) == nullptr )
|
||||||
{
|
{
|
||||||
rc = cwLogError(kInvalidIdRC,"Unknown proc instance label '%s'.", cwStringNullGuard(inst_label));
|
rc = cwLogError(kInvalidIdRC,"Unknown proc instance label '%s'.", cwStringNullGuard(inst_label));
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
@ -886,7 +939,7 @@ cw::rc_t cw::flow::create( handle_t& hRef,
|
|||||||
// create the instance
|
// create the instance
|
||||||
if( (rc= _create_instance( p, inst_cfg ) ) != kOkRC )
|
if( (rc= _create_instance( p, inst_cfg ) ) != kOkRC )
|
||||||
{
|
{
|
||||||
rc = cwLogError(rc,"The instantiation at network index %i is invalid.",i);
|
rc = cwLogError(rc,"The instantiation at proc index %i is invalid.",i);
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -983,6 +1036,7 @@ cw::rc_t cw::flow::apply_preset( handle_t h, const char* presetLabel )
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the preset value is a string then look it up in the class dictionary
|
||||||
if( preset_value_cfg->is_string() )
|
if( preset_value_cfg->is_string() )
|
||||||
{
|
{
|
||||||
const char* class_preset_label;
|
const char* class_preset_label;
|
||||||
@ -990,10 +1044,15 @@ cw::rc_t cw::flow::apply_preset( handle_t h, const char* presetLabel )
|
|||||||
_class_preset_channelize_vars(inst, class_preset_label );
|
_class_preset_channelize_vars(inst, class_preset_label );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
// if the preset value is a dict then apply it directly
|
||||||
if( preset_value_cfg->is_dict() )
|
if( preset_value_cfg->is_dict() )
|
||||||
{
|
{
|
||||||
printf("Not implemented.\n");
|
if((rc = _preset_channelize_vars( inst, "network", presetLabel, preset_value_cfg )) != kOkRC )
|
||||||
assert(0);
|
{
|
||||||
|
rc = cwLogError(rc,"The preset '%s' application failed on instance '%s'.", presetLabel, inst_label );
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
222
cwFlowTypes.cpp
222
cwFlowTypes.cpp
@ -437,29 +437,143 @@ namespace cw
|
|||||||
rc_t _var_broadcast_new_value( variable_t* var )
|
rc_t _var_broadcast_new_value( variable_t* var )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
|
/*
|
||||||
// notify each connected var that the value has changed
|
// notify each connected var that the value has changed
|
||||||
for(variable_t* con_var = var->connect_link; con_var!=nullptr; con_var=con_var->connect_link)
|
for(variable_t* con_var = var->connect_link; con_var!=nullptr; con_var=con_var->connect_link)
|
||||||
if((rc = con_var->inst->class_desc->members->value( con_var->inst, con_var )) != kOkRC )
|
if((rc = con_var->inst->class_desc->members->value( con_var->inst, con_var )) != kOkRC )
|
||||||
break;
|
break;
|
||||||
|
*/
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
void _var_setter( variable_t* var, T val )
|
||||||
|
{
|
||||||
|
cwLogError(kAssertFailRC,"Unimplemented variable setter.");
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void _var_setter<bool>( variable_t* var, bool val )
|
||||||
|
{
|
||||||
|
var->local_value.u.b = val;
|
||||||
|
var->local_value.flags = kBoolTFl;
|
||||||
|
cwLogMod("%s.%s ch:%i %i (bool).",var->inst->label,var->label,var->chIdx,val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void _var_setter<unsigned>( variable_t* var, unsigned val )
|
||||||
|
{
|
||||||
|
var->local_value.u.u = val;
|
||||||
|
var->local_value.flags = kUIntTFl;
|
||||||
|
cwLogMod("%s.%s ch:%i %i (uint).",var->inst->label,var->label,var->chIdx,val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void _var_setter<int>( variable_t* var, int val )
|
||||||
|
{
|
||||||
|
var->local_value.u.i = val;
|
||||||
|
var->local_value.flags = kIntTFl;
|
||||||
|
cwLogMod("%s.%s ch:%i %i (int).",var->inst->label,var->label,var->chIdx,val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void _var_setter<float>( variable_t* var, float val )
|
||||||
|
{
|
||||||
|
var->local_value.u.f = val;
|
||||||
|
var->local_value.flags = kFloatTFl;
|
||||||
|
cwLogMod("%s.%s ch:%i %f (float).",var->inst->label,var->label,var->chIdx,val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void _var_setter<double>( variable_t* var, double val )
|
||||||
|
{
|
||||||
|
var->local_value.u.d = val;
|
||||||
|
var->local_value.flags = kDoubleTFl;
|
||||||
|
cwLogMod("%s.%s ch:%i %f (double).",var->inst->label,var->label,var->chIdx,val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void _var_setter<const char*>( variable_t* var, const char* val )
|
||||||
|
{
|
||||||
|
var->local_value.u.s = mem::duplStr(val);
|
||||||
|
var->local_value.flags = kStringTFl;
|
||||||
|
cwLogMod("%s.%s ch:%i %s (string).",var->inst->label,var->label,var->chIdx,val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void _var_setter<abuf_t*>( variable_t* var, abuf_t* val )
|
||||||
|
{
|
||||||
|
var->local_value.u.abuf = val;
|
||||||
|
var->local_value.flags = kABufTFl;
|
||||||
|
cwLogMod("%s.%s ch:%i %s (abuf).",var->inst->label,var->label,var->chIdx,abuf==nullptr ? "null" : "valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void _var_setter<fbuf_t*>( variable_t* var, fbuf_t* val )
|
||||||
|
{
|
||||||
|
var->local_value.u.fbuf = val;
|
||||||
|
var->local_value.flags = kFBufTFl;
|
||||||
|
cwLogMod("%s.%s ch:%i %s (fbuf).",var->inst->label,var->label,var->chIdx,fbuf==nullptr ? "null" : "valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
rc_t _var_set_template( variable_t* var, unsigned typeFlag, T val )
|
||||||
|
{
|
||||||
|
rc_t rc;
|
||||||
|
|
||||||
|
if((rc = _validate_var_assignment( var, typeFlag )) != kOkRC )
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
// If the instance is fully initialized ...
|
||||||
|
if( var->inst->varMapA != nullptr )
|
||||||
|
{
|
||||||
|
// ... then inform the proc. that the value changed
|
||||||
|
// (we don't want to do call to occur if we are inside or prior to 'proc.create()'
|
||||||
|
// call because calls' to 'proc.value()' will see the instance in a incomplete state)
|
||||||
|
rc = var->inst->class_desc->members->value( var->inst, var );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( rc == kOkRC )
|
||||||
|
{
|
||||||
|
// release the current value
|
||||||
|
_value_release(&var->local_value);
|
||||||
|
|
||||||
|
// set the new local value
|
||||||
|
_var_setter(var,val);
|
||||||
|
|
||||||
|
// make the var point to the local value
|
||||||
|
var->value = &var->local_value;
|
||||||
|
|
||||||
|
|
||||||
|
// send the value to connected downstream proc's
|
||||||
|
rc = _var_broadcast_new_value( var );
|
||||||
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rc_t _var_set( variable_t* var, bool val )
|
rc_t _var_set( variable_t* var, bool val )
|
||||||
{
|
{
|
||||||
rc_t rc;
|
rc_t rc;
|
||||||
if((rc = _validate_var_assignment( var, kBoolTFl )) != kOkRC )
|
if((rc = _validate_var_assignment( var, kBoolTFl )) != kOkRC )
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
if((rc = var->inst->class_desc->members->value( var->inst, var )) == kOkRC )
|
||||||
|
{
|
||||||
|
|
||||||
|
_value_release(&var->local_value);
|
||||||
|
var->local_value.u.b = val;
|
||||||
|
var->local_value.flags = kBoolTFl;
|
||||||
|
var->value = &var->local_value;
|
||||||
|
|
||||||
|
cwLogMod("%s.%s ch:%i %i (bool).",var->inst->label,var->label,var->chIdx,val);
|
||||||
|
|
||||||
|
rc = _var_broadcast_new_value( var );
|
||||||
|
}
|
||||||
|
|
||||||
_value_release(&var->local_value);
|
return rc;
|
||||||
var->local_value.u.b = val;
|
|
||||||
var->local_value.flags = kBoolTFl;
|
|
||||||
var->value = &var->local_value;
|
|
||||||
|
|
||||||
cwLogMod("%s.%s ch:%i %i (bool).",var->inst->label,var->label,var->chIdx,val);
|
|
||||||
|
|
||||||
return _var_broadcast_new_value( var );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rc_t _var_set( variable_t* var, unsigned val )
|
rc_t _var_set( variable_t* var, unsigned val )
|
||||||
@ -467,16 +581,20 @@ namespace cw
|
|||||||
rc_t rc;
|
rc_t rc;
|
||||||
if((rc = _validate_var_assignment( var, kUIntTFl )) != kOkRC )
|
if((rc = _validate_var_assignment( var, kUIntTFl )) != kOkRC )
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
_value_release(&var->local_value);
|
|
||||||
var->local_value.u.u = val;
|
|
||||||
var->local_value.flags = kUIntTFl;
|
|
||||||
var->value = &var->local_value;
|
|
||||||
|
|
||||||
cwLogMod("%s.%s ch:%i %i (uint_t).",var->inst->label,var->label,var->chIdx,val);
|
if((rc = var->inst->class_desc->members->value( var->inst, var )) == kOkRC )
|
||||||
|
{
|
||||||
|
_value_release(&var->local_value);
|
||||||
|
var->local_value.u.u = val;
|
||||||
|
var->local_value.flags = kUIntTFl;
|
||||||
|
var->value = &var->local_value;
|
||||||
|
|
||||||
|
cwLogMod("%s.%s ch:%i %i (uint_t).",var->inst->label,var->label,var->chIdx,val);
|
||||||
|
|
||||||
return _var_broadcast_new_value( var );
|
_var_broadcast_new_value( var );
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc_t _var_set( variable_t* var, int val )
|
rc_t _var_set( variable_t* var, int val )
|
||||||
@ -576,27 +694,37 @@ namespace cw
|
|||||||
return _var_broadcast_new_value( var );
|
return _var_broadcast_new_value( var );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool is_connected_to_external_proc( const variable_t* var )
|
||||||
|
{
|
||||||
|
return var->src_var != nullptr && var->value != nullptr && var->value != &var->local_value;
|
||||||
|
}
|
||||||
|
|
||||||
template< typename T >
|
template< typename T >
|
||||||
rc_t _var_set_driver( variable_t* var, T value )
|
rc_t _var_set_driver( variable_t* var, unsigned typeFlag, T value )
|
||||||
{
|
{
|
||||||
rc_t rc;
|
rc_t rc;
|
||||||
|
|
||||||
|
// if this variable is fed from the output of an external proc - then it's local value cannot be set
|
||||||
|
if(is_connected_to_external_proc(var) )
|
||||||
|
return kOkRC;
|
||||||
|
|
||||||
|
|
||||||
// if this assignment targets a specific channel ...
|
// if this assignment targets a specific channel ...
|
||||||
if( var->chIdx != kAnyChIdx )
|
if( var->chIdx != kAnyChIdx )
|
||||||
{
|
{
|
||||||
rc = _var_set(var,value); // ... then set it alone
|
rc = _var_set_template( var, typeFlag, value ); // ... then set it alone
|
||||||
}
|
}
|
||||||
else // ... otherwise set all channels.
|
else // ... otherwise set all channels.
|
||||||
{
|
{
|
||||||
for(; var!=nullptr; var=var->ch_link)
|
for(; var!=nullptr; var=var->ch_link)
|
||||||
if((rc = _var_set(var,value)) != kOkRC )
|
if((rc = _var_set_template( var, typeFlag, value )) != kOkRC)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
rc_t _var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, abuf_t* abuf )
|
rc_t _var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, abuf_t* abuf )
|
||||||
{
|
{
|
||||||
@ -606,7 +734,7 @@ namespace cw
|
|||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if( var != nullptr )
|
if( var != nullptr )
|
||||||
_var_set_driver( var, abuf );
|
_var_set_driver( var, kABufTFl, abuf );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -619,7 +747,7 @@ namespace cw
|
|||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if( var != nullptr )
|
if( var != nullptr )
|
||||||
_var_set_driver( var, fbuf );
|
_var_set_driver( var, kFBufTFl, fbuf );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -628,13 +756,15 @@ namespace cw
|
|||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
switch( var->varDesc->type & kTypeMask )
|
unsigned typeFlag = var->varDesc->type & kTypeMask;
|
||||||
|
|
||||||
|
switch( typeFlag )
|
||||||
{
|
{
|
||||||
case kBoolTFl:
|
case kBoolTFl:
|
||||||
{
|
{
|
||||||
bool v;
|
bool v;
|
||||||
if((rc = value->value(v)) == kOkRC )
|
if((rc = value->value(v)) == kOkRC )
|
||||||
rc = _var_set_driver( var, v );
|
rc = _var_set_driver( var, typeFlag, v );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -642,7 +772,7 @@ namespace cw
|
|||||||
{
|
{
|
||||||
unsigned v;
|
unsigned v;
|
||||||
if((rc = value->value(v)) == kOkRC )
|
if((rc = value->value(v)) == kOkRC )
|
||||||
rc = _var_set_driver( var, v );
|
rc = _var_set_driver( var, typeFlag, v );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -650,7 +780,7 @@ namespace cw
|
|||||||
{
|
{
|
||||||
int v;
|
int v;
|
||||||
if((rc = value->value(v)) == kOkRC )
|
if((rc = value->value(v)) == kOkRC )
|
||||||
rc = _var_set_driver( var, v );
|
rc = _var_set_driver( var, typeFlag, v );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -658,7 +788,7 @@ namespace cw
|
|||||||
{
|
{
|
||||||
float v;
|
float v;
|
||||||
if((rc = value->value(v)) == kOkRC )
|
if((rc = value->value(v)) == kOkRC )
|
||||||
rc = _var_set_driver( var, v );
|
rc = _var_set_driver( var, typeFlag, v );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -666,7 +796,7 @@ namespace cw
|
|||||||
{
|
{
|
||||||
double v;
|
double v;
|
||||||
if((rc = value->value(v)) == kOkRC )
|
if((rc = value->value(v)) == kOkRC )
|
||||||
rc = _var_set_driver( var, v );
|
rc = _var_set_driver( var, typeFlag, v );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -674,7 +804,7 @@ namespace cw
|
|||||||
{
|
{
|
||||||
const char* v;
|
const char* v;
|
||||||
if((rc = value->value(v)) == kOkRC )
|
if((rc = value->value(v)) == kOkRC )
|
||||||
rc = _var_set_driver( var, v );
|
rc = _var_set_driver( var, typeFlag, v );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -692,11 +822,11 @@ namespace cw
|
|||||||
|
|
||||||
rc_t _var_map_id_to_index( instance_t* inst, unsigned vid, unsigned chIdx, unsigned& idxRef )
|
rc_t _var_map_id_to_index( instance_t* inst, unsigned vid, unsigned chIdx, unsigned& idxRef )
|
||||||
{
|
{
|
||||||
unsigned idx = vid * inst->varMapChN + (chIdx == kAnyChIdx ? 0 : chIdx);
|
unsigned idx = vid * inst->varMapChN + (chIdx == kAnyChIdx ? 0 : (chIdx+1));
|
||||||
|
|
||||||
// verify that the map idx is valid
|
// verify that the map idx is valid
|
||||||
if( idx >= inst->varMapN )
|
if( idx >= inst->varMapN )
|
||||||
return cwLogError(kAssertFailRC,"The variable map positioning location %i is out of the range % on instance '%s' vid:%i ch:%i.", idx, inst->varMapN, inst->label,vid,chIdx);
|
return cwLogError(kAssertFailRC,"The variable map positioning location %i is out of the range %i on instance '%s' vid:%i ch:%i.", idx, inst->varMapN, inst->label,vid,chIdx);
|
||||||
|
|
||||||
idxRef = idx;
|
idxRef = idx;
|
||||||
|
|
||||||
@ -820,9 +950,10 @@ namespace cw
|
|||||||
|
|
||||||
void _var_print( const variable_t* var )
|
void _var_print( const variable_t* var )
|
||||||
{
|
{
|
||||||
const char* local_label = var->value==nullptr || var->value == &var->local_value ? "local" : " ";
|
//const char* local_label = var->value==nullptr || var->value == &var->local_value ? "local" : " ";
|
||||||
|
const char* conn_label = is_connected_to_external_proc(var) ? "extern" : " ";
|
||||||
|
|
||||||
printf(" %20s id:%4i ch:%3i : %s : ", var->label, var->vid, var->chIdx, local_label );
|
printf(" %20s id:%4i ch:%3i : %s : ", var->label, var->vid, var->chIdx, conn_label );
|
||||||
|
|
||||||
if( var->value == nullptr )
|
if( var->value == nullptr )
|
||||||
_value_print( &var->local_value );
|
_value_print( &var->local_value );
|
||||||
@ -1095,7 +1226,7 @@ cw::rc_t cw::flow::var_create( instance_t* inst, const char* var_label, unsigned
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
cw::rc_t cw::flow::var_channelize( instance_t* inst, const char* var_label, unsigned chIdx, const object_t* value_cfg, variable_t*& varRef )
|
cw::rc_t cw::flow::var_channelize( instance_t* inst, const char* var_label, unsigned chIdx, const object_t* value_cfg, unsigned vid, variable_t*& varRef )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
@ -1124,7 +1255,7 @@ cw::rc_t cw::flow::var_channelize( instance_t* inst, const char* var_label, uns
|
|||||||
if( var == nullptr && chIdx != kAnyChIdx )
|
if( var == nullptr && chIdx != kAnyChIdx )
|
||||||
{
|
{
|
||||||
// create the channelized var
|
// create the channelized var
|
||||||
if((rc = _var_create( inst, var_label, kInvalidId, chIdx, value_cfg, var )) != kOkRC )
|
if((rc = _var_create( inst, var_label, vid, chIdx, value_cfg, var )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
// if no value was set then set the value from the 'any' channel
|
// if no value was set then set the value from the 'any' channel
|
||||||
@ -1247,12 +1378,17 @@ cw::rc_t cw::flow::var_register( instance_t* inst, const char* var_label, unsign
|
|||||||
}
|
}
|
||||||
else // an exact match was not found - channelize the variable
|
else // an exact match was not found - channelize the variable
|
||||||
{
|
{
|
||||||
if((rc = var_channelize(inst,var_label,chIdx,value_cfg,var)) != kOkRC )
|
if((rc = var_channelize(inst,var_label,chIdx,value_cfg,vid,var)) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
var->vid = vid;
|
var->vid = vid;
|
||||||
varRef = var;
|
varRef = var;
|
||||||
|
|
||||||
|
if((var = _var_find_on_label_and_ch(inst,var_label,kAnyChIdx)) != nullptr )
|
||||||
|
var->vid = vid;
|
||||||
|
else
|
||||||
|
rc = cwLogError(kInvalidStateRC,"The variable '%s' instance '%s' has no base channel.", var_label, inst->label, chIdx);
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
if( rc != kOkRC )
|
if( rc != kOkRC )
|
||||||
@ -1331,7 +1467,7 @@ cw::rc_t cw::flow::var_set( instance_t* inst, unsigned vid, unsigned chIdx, bool
|
|||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
|
|
||||||
if((rc = _var_find_to_set(inst, vid, chIdx, kBoolTFl, var )) == kOkRC )
|
if((rc = _var_find_to_set(inst, vid, chIdx, kBoolTFl, var )) == kOkRC )
|
||||||
_var_set_driver( var, val );
|
_var_set_driver( var, kBoolTFl, val );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1342,7 +1478,7 @@ cw::rc_t cw::flow::var_set( instance_t* inst, unsigned vid, unsigned chIdx, uint
|
|||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
|
|
||||||
if((rc = _var_find_to_set(inst, vid, chIdx, kUIntTFl, var )) == kOkRC )
|
if((rc = _var_find_to_set(inst, vid, chIdx, kUIntTFl, var )) == kOkRC )
|
||||||
_var_set_driver( var, val );
|
_var_set_driver( var, kUIntTFl, val );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1353,7 +1489,7 @@ cw::rc_t cw::flow::var_set( instance_t* inst, unsigned vid, unsigned chIdx, int_
|
|||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
|
|
||||||
if((rc = _var_find_to_set(inst, vid, chIdx, kIntTFl, var )) == kOkRC )
|
if((rc = _var_find_to_set(inst, vid, chIdx, kIntTFl, var )) == kOkRC )
|
||||||
_var_set_driver( var, val );
|
_var_set_driver( var, kIntTFl, val );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1364,7 +1500,7 @@ cw::rc_t cw::flow::var_set( instance_t* inst, unsigned vid, unsigned chIdx, floa
|
|||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
|
|
||||||
if((rc = _var_find_to_set(inst, vid, chIdx, kFloatTFl, var )) == kOkRC )
|
if((rc = _var_find_to_set(inst, vid, chIdx, kFloatTFl, var )) == kOkRC )
|
||||||
_var_set_driver( var, val );
|
_var_set_driver( var, kFloatTFl, val );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1375,7 +1511,7 @@ cw::rc_t cw::flow::var_set( instance_t* inst, unsigned vid, unsigned chIdx, doub
|
|||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
|
|
||||||
if((rc = _var_find_to_set(inst, vid, chIdx, kDoubleTFl, var )) == kOkRC )
|
if((rc = _var_find_to_set(inst, vid, chIdx, kDoubleTFl, var )) == kOkRC )
|
||||||
_var_set_driver( var, val );
|
_var_set_driver( var, kDoubleTFl, val );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1386,7 +1522,7 @@ cw::rc_t cw::flow::var_set( instance_t* inst, unsigned vid, unsigned chIdx, cons
|
|||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
|
|
||||||
if((rc = _var_find_to_set(inst, vid, chIdx, kStringTFl, var )) == kOkRC )
|
if((rc = _var_find_to_set(inst, vid, chIdx, kStringTFl, var )) == kOkRC )
|
||||||
_var_set_driver( var, val );
|
_var_set_driver( var, kStringTFl, val );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -165,6 +165,7 @@ namespace cw
|
|||||||
value_t local_value; // the local value instance (actual value if this is not a 'src' variable)
|
value_t local_value; // the local value instance (actual value if this is not a 'src' variable)
|
||||||
value_t* value; // pointer to the value associated with this variable
|
value_t* value; // pointer to the value associated with this variable
|
||||||
unsigned chIdx; // channel index
|
unsigned chIdx; // channel index
|
||||||
|
struct variable_str* src_var; // pointer to this input variables source link (or null if it uses the local_value)
|
||||||
struct variable_str* var_link; // link to other var's on 'inst'
|
struct variable_str* var_link; // link to other var's on 'inst'
|
||||||
struct variable_str* connect_link; // list of outgoing connections
|
struct variable_str* connect_link; // list of outgoing connections
|
||||||
struct variable_str* ch_link; // list of channels that share this variable (rooted on 'any' channel - in order by channel number)
|
struct variable_str* ch_link; // list of channels that share this variable (rooted on 'any' channel - in order by channel number)
|
||||||
@ -280,11 +281,13 @@ namespace cw
|
|||||||
|
|
||||||
// Channelizing creates a new var record with an explicit channel index to replace the
|
// Channelizing creates a new var record with an explicit channel index to replace the
|
||||||
// automatically generated variable whose channel index is set to 'all'.
|
// automatically generated variable whose channel index is set to 'all'.
|
||||||
rc_t var_channelize( instance_t* inst, const char* var_label, unsigned chIdx, const object_t* value_cfg, variable_t*& varRef );
|
rc_t var_channelize( instance_t* inst, const char* var_label, unsigned chIdx, const object_t* value_cfg, unsigned vid, variable_t*& varRef );
|
||||||
|
|
||||||
// `value_cfg` is optional. Set it to NULL to ignore
|
// `value_cfg` is optional. Set it to NULL to ignore
|
||||||
rc_t var_register( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, const object_t* value_cfg, variable_t*& varRef );
|
rc_t var_register( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, const object_t* value_cfg, variable_t*& varRef );
|
||||||
|
|
||||||
|
// Returns true if this var is connected to an external proc variable
|
||||||
|
bool is_connected_to_external_proc( const variable_t* var );
|
||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user