cmDspFx.c, cmDspFx.c : If the second character in the 'scalarOp' object is '$' then any input triggers an output.

This commit is contained in:
kevin 2020-08-03 12:23:16 -04:00
parent 90bfc6c05b
commit c9dc494178
2 changed files with 41 additions and 11 deletions

View File

@ -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);
} }

View File

@ -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 );