cmDspFx.c, cmDspFx.c : If the second character in the 'scalarOp' object is '$' then any input triggers an output.
This commit is contained in:
parent
90bfc6c05b
commit
c9dc494178
@ -2909,6 +2909,7 @@ typedef struct cmDspScalar_str
|
|||||||
cmDspInst_t inst;
|
cmDspInst_t inst;
|
||||||
_cmDspScalarOpFunc_t func;
|
_cmDspScalarOpFunc_t func;
|
||||||
unsigned inPortCnt;
|
unsigned inPortCnt;
|
||||||
|
bool allActiveFl;
|
||||||
} cmDspScalarOp_t;
|
} cmDspScalarOp_t;
|
||||||
|
|
||||||
cmDspRC_t _cmDspScalarOpFuncMult(cmDspCtx_t* ctx, cmDspInst_t* inst )
|
cmDspRC_t _cmDspScalarOpFuncMult(cmDspCtx_t* ctx, cmDspInst_t* inst )
|
||||||
@ -2966,6 +2967,7 @@ cmDspInst_t* _cmDspScalarOpAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsig
|
|||||||
double dfltVal[ inPortCnt ];
|
double dfltVal[ inPortCnt ];
|
||||||
unsigned i;
|
unsigned i;
|
||||||
_cmDspScalarOpFunc_t fp = NULL;
|
_cmDspScalarOpFunc_t fp = NULL;
|
||||||
|
bool allActiveFl = false;
|
||||||
|
|
||||||
// validate the count of input ports
|
// validate the count of input ports
|
||||||
if( inPortCnt == 0 )
|
if( inPortCnt == 0 )
|
||||||
@ -2974,12 +2976,26 @@ cmDspInst_t* _cmDspScalarOpAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsig
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// locate the operation function
|
if( opIdStr != NULL )
|
||||||
if( strcmp(opIdStr,"*") == 0 )
|
{
|
||||||
fp = _cmDspScalarOpFuncMult;
|
switch( opIdStr[0] )
|
||||||
else
|
{
|
||||||
if( strcmp(opIdStr,"+") == 0 )
|
case '*':
|
||||||
fp = _cmDspScalarOpFuncAdd;
|
fp = _cmDspScalarOpFuncMult;
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
fp = _cmDspScalarOpFuncAdd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the second character of the operator string is '$' then all input ports trigger an output
|
||||||
|
if( strlen( opIdStr ) > 0 && opIdStr[1]=='$' )
|
||||||
|
allActiveFl = true;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// validate the operation function
|
// validate the operation function
|
||||||
if( fp == NULL )
|
if( fp == NULL )
|
||||||
@ -3012,7 +3028,7 @@ cmDspInst_t* _cmDspScalarOpAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsig
|
|||||||
|
|
||||||
p->inPortCnt = inPortCnt;
|
p->inPortCnt = inPortCnt;
|
||||||
p->func = fp;
|
p->func = fp;
|
||||||
|
p->allActiveFl = allActiveFl;
|
||||||
va_end(vl1);
|
va_end(vl1);
|
||||||
|
|
||||||
return &p->inst;
|
return &p->inst;
|
||||||
@ -3039,7 +3055,7 @@ cmDspRC_t _cmDspScalarOpRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_
|
|||||||
|
|
||||||
if((rc = cmDspSetEvent(ctx,inst,evt)) == kOkDspRC )
|
if((rc = cmDspSetEvent(ctx,inst,evt)) == kOkDspRC )
|
||||||
{
|
{
|
||||||
if( evt->dstVarId == kBaseOpdSoId )
|
if( evt->dstVarId == kBaseOpdSoId || p->allActiveFl )
|
||||||
p->func(ctx,inst);
|
p->func(ctx,inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -898,7 +898,7 @@ cmDspRC_t _cmDspSysPgm_UiTest(cmDspSysH_t h, void** userPtrPtr )
|
|||||||
cmDspInst_t* prp = cmDspSysAllocInst(h,"Printer", NULL, 1, ">" );
|
cmDspInst_t* prp = cmDspSysAllocInst(h,"Printer", NULL, 1, ">" );
|
||||||
cmDspInst_t* mtp = cmDspSysAllocInst(h,"Meter", "meter", 3, 0.0, 0.0, 4.0);
|
cmDspInst_t* mtp = cmDspSysAllocInst(h,"Meter", "meter", 3, 0.0, 0.0, 4.0);
|
||||||
cmDspInst_t* ctp = cmDspSysAllocInst(h,"Counter", NULL, 3, 0.0, 10.0, 1.0 );
|
cmDspInst_t* ctp = cmDspSysAllocInst(h,"Counter", NULL, 3, 0.0, 10.0, 1.0 );
|
||||||
cmDspSysAllocInst(h,"Label", "label1", 1, "label2");
|
cmDspInst_t* lbl = cmDspSysAllocInst(h,"Label", "label1", 1, "label2");
|
||||||
if((rc = cmDspSysLastRC(h)) != kOkDspRC )
|
if((rc = cmDspSysLastRC(h)) != kOkDspRC )
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@ -924,6 +924,8 @@ cmDspRC_t _cmDspSysPgm_UiTest(cmDspSysH_t h, void** userPtrPtr )
|
|||||||
cmDspSysInstallCb(h, chb, "out", prp, "in", NULL );
|
cmDspSysInstallCb(h, chb, "out", prp, "in", NULL );
|
||||||
cmDspSysInstallCb(h, chb, "sym", prp, "in", NULL );
|
cmDspSysInstallCb(h, chb, "sym", prp, "in", NULL );
|
||||||
|
|
||||||
|
cmDspSysInstallCb(h, mdp, "val", lbl, "in", NULL );
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -2055,8 +2057,8 @@ cmDspRC_t _cmDspSysPgm_ScalarOp( cmDspSysH_t h, void** userPtrPtr )
|
|||||||
{
|
{
|
||||||
cmDspRC_t rc;
|
cmDspRC_t rc;
|
||||||
|
|
||||||
cmDspInst_t* add = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "+", "in-0", 0.0, "in-1", 0.0 );
|
cmDspInst_t* add = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "+", "in-0", 0.0, "in-1", 0.0 );
|
||||||
cmDspInst_t* mul0 = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "*", "in-0", 0.0, "in-1", 0.0 );
|
cmDspInst_t* mul0 = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "*$", "in-0", 0.0, "in-1", 0.0 );
|
||||||
cmDspInst_t* mul1 = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "*", "in-0", 0.0, "in-1", 0.0 );
|
cmDspInst_t* mul1 = cmDspSysAllocInst( h, "ScalarOp", NULL, 6, 2, "*", "in-0", 0.0, "in-1", 0.0 );
|
||||||
cmDspInst_t* in = cmDspSysAllocScalar( h, "Input", 0.0, 10.0, 0.001, 0.0);
|
cmDspInst_t* in = cmDspSysAllocScalar( h, "Input", 0.0, 10.0, 0.001, 0.0);
|
||||||
cmDspInst_t* in_m = cmDspSysAllocScalar( h, "Input_M", 0.0, 10.0, 0.001, 0.0);
|
cmDspInst_t* in_m = cmDspSysAllocScalar( h, "Input_M", 0.0, 10.0, 0.001, 0.0);
|
||||||
@ -2068,6 +2070,18 @@ cmDspRC_t _cmDspSysPgm_ScalarOp( cmDspSysH_t h, void** userPtrPtr )
|
|||||||
if((rc = cmDspSysLastRC(h)) != kOkDspRC )
|
if((rc = cmDspSysLastRC(h)) != kOkDspRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
|
// Notice that changing 'in' or 'in_m' causes 'out' to be recomputed, but other
|
||||||
|
// changes are cached prior to 'add'. This prevents the program from going into
|
||||||
|
// an infinite loop.
|
||||||
|
//
|
||||||
|
// in -> mult0
|
||||||
|
// in_m -> mult0--+
|
||||||
|
// +-->fb -> mult1 +----> add
|
||||||
|
// | fb_m -> mult1-------> add --------+------> out
|
||||||
|
// | |
|
||||||
|
// +-------------------------------------+
|
||||||
|
//
|
||||||
|
|
||||||
cmDspSysInstallCb( h, in, "val", mul0, "in-0", NULL );
|
cmDspSysInstallCb( h, in, "val", mul0, "in-0", NULL );
|
||||||
cmDspSysInstallCb( h, in_m, "val", mul0, "in-1", NULL );
|
cmDspSysInstallCb( h, in_m, "val", mul0, "in-1", NULL );
|
||||||
cmDspSysInstallCb( h, fb, "val", mul1, "in-0", NULL );
|
cmDspSysInstallCb( h, fb, "val", mul1, "in-0", NULL );
|
||||||
|
Loading…
Reference in New Issue
Block a user