cmDspBuiltIn.c, cmDspValue.h/c : text in 'label' object can now be updated with any variable type.

This commit is contained in:
kevin 2020-08-03 12:22:26 -04:00
parent 220ca1577c
commit 90bfc6c05b
3 changed files with 141 additions and 10 deletions

View File

@ -1702,7 +1702,8 @@ cmDspClass_t* cmMeterClassCons( cmDspCtx_t* ctx )
enum enum
{ {
kInLbId, kInLbId,
kAlignLbId kAlignLbId,
kTextLbId
}; };
cmDspClass_t _cmLabelDC; cmDspClass_t _cmLabelDC;
@ -1710,27 +1711,68 @@ cmDspClass_t _cmLabelDC;
typedef struct typedef struct
{ {
cmDspInst_t inst; cmDspInst_t inst;
cmChar_t* label;
} cmDspLabel_t; } cmDspLabel_t;
cmDspInst_t* _cmDspLabelAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl ) cmDspInst_t* _cmDspLabelAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
{ {
cmDspVarArg_t args[] = const unsigned argCnt = 3;
cmDspVarArg_t args[argCnt+1];
cmChar_t* label = NULL;
unsigned align = kLeftAlignDuiId;
va_list vl1;
va_copy(vl1,vl);
if( va_cnt < 1 )
{ {
{ "in", kInLbId, 0, 0, kInDsvFl | kStrzDsvFl | kReqArgDsvFl, "LabelText" }, va_end(vl1);
{ "align",kAlignLbId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Alignment 0=right 1=left 2=center" }, cmDspClassErr(ctx,classPtr,kVarArgParseFailDspRC,"The 'label' constructor argument list must contain at least one argument.");
{ NULL, 0, 0, 0, 0 } return NULL;
}; }
cmDspLabel_t* p = cmDspInstAlloc(cmDspLabel_t,ctx,classPtr,args,instSymId,id,storeSymId,va_cnt,vl); // get the default label
const char* clabel = va_arg(vl,const char*);
if( clabel != NULL && strlen(clabel) > 0 )
{
label = cmLhAllocStr(ctx->lhH,clabel);
printf("%s\n",label);
}
cmDspSetDefaultDouble(ctx, &p->inst, kAlignLbId, 0.0, kLeftAlignDuiId); // if an alignment id was provided
if( va_cnt > 1 )
align = va_arg(vl,double);
// setup the arg. config. array.
cmDspArgSetup(ctx,args+0,"in", cmInvalidId, kInLbId, 0,0, kInDsvFl | kTypeDsvMask, "Input to set label" );
cmDspArgSetup(ctx,args+1,"align",cmInvalidId, kAlignLbId, 0,0, kInDsvFl | kUIntDsvFl, "Justification: 0=right 1=center 2=left" );
cmDspArgSetup(ctx,args+2,"text", cmInvalidId, kTextLbId, 0,0, kInDsvFl | kStrzDsvFl, "Label text");
cmDspArgSetupNull(args + argCnt);
// create the instance
cmDspLabel_t* p = cmDspInstAlloc(cmDspLabel_t,ctx,classPtr,args,instSymId,id,storeSymId,0,vl1);
p->label = label;
// set the default variable values
cmDspSetDefaultDouble(ctx, &p->inst, kAlignLbId, 0.0, align);
cmDspSetDefaultStrcz( ctx, &p->inst, kTextLbId, NULL, label==NULL ? "" : label );
// create the UI control // create the UI control
cmDspUiLabelCreate(ctx,&p->inst,kInLbId,kAlignLbId); cmDspUiLabelCreate(ctx,&p->inst,kTextLbId,kAlignLbId);
va_end(vl1);
return &p->inst; return &p->inst;
} }
cmDspRC_t _cmDspLabelFree(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{
cmDspLabel_t* p = (cmDspLabel_t*)inst;
cmLhFree(ctx->lhH,p->label);
return kOkDspRC;
}
cmDspRC_t _cmDspLabelReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt ) cmDspRC_t _cmDspLabelReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{ {
cmDspApplyAllDefaults(ctx,inst); cmDspApplyAllDefaults(ctx,inst);
@ -1739,6 +1781,21 @@ cmDspRC_t _cmDspLabelReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t*
cmDspRC_t _cmDspLabelRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt ) cmDspRC_t _cmDspLabelRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{ {
const unsigned bN = 128;
cmChar_t b[ bN+1 ];
// if this event is arriving on the 'in' port ...
if( evt->dstVarId == kInLbId )
{
cmDspLabel_t* p = (cmDspLabel_t*)inst;
// ... then convert it to a string
cmDsvToString( evt->valuePtr, p->label, b, bN );
// and set the 'label' variable
return cmDspSetStrcz(ctx, inst, kTextLbId, b );
}
return cmDspSetEvent(ctx,inst,evt); return cmDspSetEvent(ctx,inst,evt);
} }
@ -1747,7 +1804,7 @@ cmDspClass_t* cmLabelClassCons( cmDspCtx_t* ctx )
cmDspClassSetup(&_cmLabelDC,ctx,"Label", cmDspClassSetup(&_cmLabelDC,ctx,"Label",
NULL, NULL,
_cmDspLabelAlloc, _cmDspLabelAlloc,
NULL, _cmDspLabelFree,
_cmDspLabelReset, _cmDspLabelReset,
NULL, NULL,
_cmDspLabelRecv, _cmDspLabelRecv,

View File

@ -1527,3 +1527,76 @@ void cmDsvPrint( const cmDspValue_t* vp, const cmChar_t* label, cmRpt_t* rpt )
} }
} }
} }
void cmDsvToString( const cmDspValue_t* vp, const cmChar_t* label, cmChar_t* s, unsigned sN )
{
vp = _vcptr(vp);
const char* noLbl="";
const char* lbl = label==NULL? noLbl : label;
if( cmDsvIsMtx(vp) )
{
unsigned i,j;
unsigned rn = cmDsvCols(vp);
unsigned cn = cmDsvRows(vp);
for(i=0; i<rn; ++i)
{
for(j=0; j<cn && sN>2; ++j)
{
switch( cmDsvBasicType(vp) )
{
case kCharDsvFl: snprintf(s,sN,"%s%c ",lbl,vp->u.m.u.cp[ (j*rn) + i ]); break;
case kUCharDsvFl: snprintf(s,sN,"%s%c ",lbl,vp->u.m.u.ucp[ (j*rn) + i ]); break;
case kShortDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.m.u.sp[ (j*rn) + i ]); break;
case kUShortDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.m.u.usp[ (j*rn) + i ]); break;
case kLongDsvFl: snprintf(s,sN,"%s%li ",lbl,vp->u.m.u.lp[ (j*rn) + i ]); break;
case kULongDsvFl: snprintf(s,sN,"%s%li ",lbl,vp->u.m.u.ulp[ (j*rn) + i ]); break;
case kIntDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.m.u.ip[ (j*rn) + i ]); break;
case kUIntDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.m.u.up[ (j*rn) + i ]); break;
case kFloatDsvFl: snprintf(s,sN,"%s%f ",lbl,vp->u.m.u.fp[ (j*rn) + i ]); break;
case kDoubleDsvFl: snprintf(s,sN,"%s%f ",lbl,vp->u.m.u.dp[ (j*rn) + i ]); break;
case kSampleDsvFl: snprintf(s,sN,"%s%f ",lbl,vp->u.m.u.ap[ (j*rn) + i ]); break;
case kRealDsvFl: snprintf(s,sN,"%s%f ",lbl,vp->u.m.u.rp[ (j*rn) + i ]); break;
case kStrzDsvFl: snprintf(s,sN,"%s%s ",lbl,vp->u.m.u.zp[ (j*rn) + i ]); break;
case kJsonDsvFl: cmJsonLeafToString(vp->u.m.u.jp[ (j*rn) + i ],s,sN); break;
default:
{ assert(0); }
}
unsigned n = strlen(s);
sN -= n;
s += n;
}
if( sN > 2 )
snprintf(s,sN,"\n");
}
}
else
{
switch( cmDsvBasicType(vp) )
{
case kBoolDsvFl: snprintf(s,sN,"%s%s ",lbl,vp->u.b ? "true" : "false"); break;
case kCharDsvFl: snprintf(s,sN,"%s%c ",lbl,vp->u.c); break;
case kUCharDsvFl: snprintf(s,sN,"%s%c ",lbl,vp->u.uc); break;
case kShortDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.s); break;
case kUShortDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.us); break;
case kLongDsvFl: snprintf(s,sN,"%s%li ",lbl,vp->u.l); break;
case kULongDsvFl: snprintf(s,sN,"%s%li ",lbl,vp->u.ul); break;
case kIntDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.i); break;
case kUIntDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.u); break;
case kFloatDsvFl: snprintf(s,sN,"%s%f ",lbl,vp->u.f); break;
case kDoubleDsvFl: snprintf(s,sN,"%s%f ",lbl,vp->u.d); break;
case kSampleDsvFl: snprintf(s,sN,"%s%f ",lbl,vp->u.a); break;
case kRealDsvFl: snprintf(s,sN,"%s%f ",lbl,vp->u.r); break;
case kPtrDsvFl: snprintf(s,sN,"%s%p ",lbl,vp->u.vp); break;
case kStrzDsvFl: snprintf(s,sN,"%s%s ",lbl,vp->u.z); break;
case kSymDsvFl: snprintf(s,sN,"%s%i ",lbl,vp->u.u); break;
case kJsonDsvFl: cmJsonLeafToString(vp->u.j,s,sN); break;
default:
{ assert(0); }
}
}
}

View File

@ -331,6 +331,7 @@ extern "C" {
cmDsvRC_t cmDsvDeserializeJson( cmDspValue_t* vp, cmJsonH_t jsH ); cmDsvRC_t cmDsvDeserializeJson( cmDspValue_t* vp, cmJsonH_t jsH );
void cmDsvPrint( const cmDspValue_t* vp, const cmChar_t* label, cmRpt_t* rpt ); void cmDsvPrint( const cmDspValue_t* vp, const cmChar_t* label, cmRpt_t* rpt );
void cmDsvToString( const cmDspValue_t* vp, const cmChar_t* label, cmChar_t* s, unsigned sN );
//) //)