1. caw program parameters are now in snake_case rather than camelCase.

2. Column headers are now printed for caw 'log' output.
3. The websocket LLL_NOTICE logs may now be turned off using the 'extraLogsFl'.
4. Changed the 'Number' processor to work with the 'feedback' example.
5. README.md updates.
This commit is contained in:
kevin 2024-09-12 17:18:42 -04:00
parent 35f95f3eac
commit c55f7d34ec
12 changed files with 71 additions and 37 deletions

View File

@ -1148,6 +1148,7 @@ channel that does not exist.
- DONE: All cfg to value conversion should go through `cfg_to_value()`. - DONE: All cfg to value conversion should go through `cfg_to_value()`.
- Try using adding 'time' type and 'cfg' types to a 'log:{...}' stmt.
Names Names
------ ------

View File

@ -710,17 +710,18 @@ cw::rc_t cw::flow::create( handle_t& hRef,
p->sample_rate = kDefaultSampleRate; p->sample_rate = kDefaultSampleRate;
p->maxCycleCount = kInvalidCnt; p->maxCycleCount = kInvalidCnt;
p->proj_dir = proj_dir; p->proj_dir = proj_dir;
p->printLogHdrFl = true;
// parse the optional args // parse the optional args
if((rc = flowCfg->readv("network", 0, p->networkCfg, if((rc = flowCfg->readv("network", 0, p->networkCfg,
"non_real_time_fl", kOptFl, p->non_real_time_fl, "non_real_time_fl", kOptFl, p->non_real_time_fl,
"framesPerCycle", kOptFl, p->framesPerCycle, "frames_per_cycle", kOptFl, p->framesPerCycle,
"sample_rate", kOptFl, p->sample_rate, "sample_rate", kOptFl, p->sample_rate,
"maxCycleCount", kOptFl, maxCycleCount, "max_cycle_count", kOptFl, maxCycleCount,
"durLimitSecs", kOptFl, durLimitSecs, "dur_limit_secs", kOptFl, durLimitSecs,
"preset", kOptFl, p->init_net_preset_label, "preset", kOptFl, p->init_net_preset_label,
"printClassDictFl", kOptFl, printClassDictFl, "print_class_dict_fl", kOptFl, printClassDictFl,
"printNetworkFl", kOptFl, p->printNetworkFl, "print_network_fl", kOptFl, p->printNetworkFl,
"multiPriPresetProbFl", kOptFl, p->multiPriPresetProbFl, "multiPriPresetProbFl", kOptFl, p->multiPriPresetProbFl,
"multiSecPresetProbFl", kOptFl, p->multiSecPresetProbFl, "multiSecPresetProbFl", kOptFl, p->multiSecPresetProbFl,
"multiPresetInterpFl", kOptFl, p->multiPresetInterpFl)) != kOkRC ) "multiPresetInterpFl", kOptFl, p->multiPresetInterpFl)) != kOkRC )
@ -875,10 +876,10 @@ cw::rc_t cw::flow::exec_cycle( handle_t h )
cw::rc_t cw::flow::exec( handle_t h ) cw::rc_t cw::flow::exec( handle_t h )
{ {
rc_t rc = kOkRC; rc_t rc = kOkRC;
flow_t* p = _handleToPtr(h); //flow_t* p = _handleToPtr(h);
while( rc == kOkRC ) while( rc == kOkRC )
rc = exec_cycle(p->net); rc = exec_cycle(h);
return rc; return rc;
} }

View File

@ -2220,7 +2220,7 @@ namespace cw
// Register variables and get their current value // Register variables and get their current value
if((rc = var_register_and_get( proc, kAnyChIdx, if((rc = var_register_and_get( proc, kAnyChIdx,
kChCntPid, "chCnt", kBaseSfxId, chCnt, kChCntPid, "ch_cnt", kBaseSfxId, chCnt,
kSratePId, "srate", kBaseSfxId, srate)) != kOkRC ) kSratePId, "srate", kBaseSfxId, srate)) != kOkRC )
{ {
goto errLabel; goto errLabel;
@ -5181,7 +5181,7 @@ namespace cw
rc_t rc = kOkRC; rc_t rc = kOkRC;
const char* out_type_label = nullptr; const char* out_type_label = nullptr;
unsigned out_type_fl = kInvalidTFl; unsigned out_type_fl = kInvalidTFl;
variable_t* dum = nullptr; variable_t* first_in_var = nullptr;
unsigned inVarN = var_mult_count(proc,"in"); unsigned inVarN = var_mult_count(proc,"in");
unsigned inSfxIdA[ inVarN ]; unsigned inSfxIdA[ inVarN ];
@ -5206,12 +5206,15 @@ namespace cw
// register each of the input vars // register each of the input vars
for(unsigned i=0; i<p->inVarN; ++i) for(unsigned i=0; i<p->inVarN; ++i)
{ {
variable_t* dum; variable_t* foo;
if((rc = var_register(proc, "in", inSfxIdA[i], kInPId+i, kAnyChIdx, nullptr, dum )) != kOkRC ) if((rc = var_register(proc, "in", inSfxIdA[i], kInPId+i, kAnyChIdx, nullptr, foo )) != kOkRC )
{ {
rc = cwLogError(rc,"Variable registration failed for the variable 'in:%i'.",inSfxIdA[i]);; rc = cwLogError(rc,"Variable registration failed for the variable 'in:%i'.",inSfxIdA[i]);;
goto errLabel; goto errLabel;
} }
if( i==0 )
first_in_var = foo;
} }
@ -5227,14 +5230,14 @@ namespace cw
if( textIsEqual(out_type_label,"") ) if( textIsEqual(out_type_label,"") )
{ {
// ... then get the type of the first input variable // ... then get the type of the first input variable
if((rc = var_find(proc, kInPId, kAnyChIdx, dum )) != kOkRC ) if((rc = var_find(proc, kInPId, kAnyChIdx, first_in_var )) != kOkRC )
{ {
goto errLabel; goto errLabel;
} }
// if the first input variable's type has a valid type is not included in the // if the first input variable's type has a valid type is not included in the
if( dum->value != nullptr ) if( first_in_var->value != nullptr )
out_type_fl = (dum->value->tflag & kTypeMask) ; out_type_fl = (first_in_var->value->tflag & kTypeMask) ;
} }
else else
{ {
@ -5248,7 +5251,7 @@ namespace cw
} }
// Create the output variable // Create the output variable
if((rc = var_create( proc, "out", kBaseSfxId, kOutPId, kAnyChIdx, nullptr, out_type_fl, dum )) != kOkRC ) if((rc = var_create( proc, "out", kBaseSfxId, kOutPId, kAnyChIdx, nullptr, out_type_fl, first_in_var )) != kOkRC )
{ {
goto errLabel; goto errLabel;
} }
@ -5267,7 +5270,6 @@ namespace cw
{ {
if( var->vid == kTriggerPId ) if( var->vid == kTriggerPId )
{ {
if( proc->ctx->isInRuntimeFl )
p->store_vid = kOutPId; p->store_vid = kOutPId;
} }
else else
@ -5279,9 +5281,13 @@ namespace cw
p->store_vid = var->vid; p->store_vid = var->vid;
} }
else else
{
// This call to set the a variable is safe because
// we are in init-time not runtime and therefore single threaded
var_set( proc, kOutPId, kAnyChIdx, var->value ); var_set( proc, kOutPId, kAnyChIdx, var->value );
} }
} }
}
return kOkRC; return kOkRC;
} }

View File

@ -291,7 +291,7 @@ namespace cw
break; break;
case kStringTFl: case kStringTFl:
cwLogPrint("%s ", v->u.s); cwLogPrint("s:%s ", v->u.s);
break; break;
case kTimeTFl: case kTimeTFl:
@ -299,6 +299,7 @@ namespace cw
break; break;
case kCfgTFl: case kCfgTFl:
cwLogPrint("c:");
if( v->u.cfg != nullptr ) if( v->u.cfg != nullptr )
v->u.cfg->print(); v->u.cfg->print();
break; break;
@ -2010,7 +2011,16 @@ cw::rc_t cw::flow::var_call_custom_value_func( variable_t* var )
if( var->flags & kLogVarFl ) if( var->flags & kLogVarFl )
{ {
cwLogPrint("cycle: %8i ",var->proc->ctx->cycleIndex);
if( var->proc->ctx->printLogHdrFl )
{
cwLogPrint("%s","exe cycle: process: id: variable: id vid ch : : : type:value : destination\n");
cwLogPrint("%s","---------- ----------- ----- --------------- -- --- ----- ------------: -------------\n");
//: 0 : a: 0: out: 0 vid: 2 ch: -1 : : : <invalid>:
var->proc->ctx->printLogHdrFl = false;
}
cwLogPrint("%8i ",var->proc->ctx->cycleIndex);
cwLogPrint("%10s:%5i", var->proc->label,var->proc->label_sfx_id); cwLogPrint("%10s:%5i", var->proc->label,var->proc->label_sfx_id);
if( var->chIdx == kAnyChIdx ) if( var->chIdx == kAnyChIdx )

View File

@ -345,7 +345,6 @@ namespace cw
const object_t* networkCfg; // 'network' cfg from flowCfg const object_t* networkCfg; // 'network' cfg from flowCfg
bool printNetworkFl; bool printNetworkFl;
bool non_real_time_fl; // set if this is a non-real-time program bool non_real_time_fl; // set if this is a non-real-time program
unsigned framesPerCycle; // sample frames per cycle (64) unsigned framesPerCycle; // sample frames per cycle (64)
srate_t sample_rate; // default sample rate (48000.0) srate_t sample_rate; // default sample rate (48000.0)
@ -356,6 +355,8 @@ namespace cw
unsigned cycleIndex; // Incremented with each processing cycle unsigned cycleIndex; // Incremented with each processing cycle
bool printLogHdrFl;
bool multiPriPresetProbFl; // If set then probability is used to choose presets on multi-preset application bool multiPriPresetProbFl; // If set then probability is used to choose presets on multi-preset application
bool multiSecPresetProbFl; // bool multiSecPresetProbFl; //
bool multiPresetInterpFl; // If set then interpolation is applied between two selectedd presets on multi-preset application bool multiPresetInterpFl; // If set then interpolation is applied between two selectedd presets on multi-preset application

View File

@ -2337,6 +2337,7 @@ cw::rc_t cw::ui::ws::parseArgs( const object_t& o, args_t& args, const char* ob
"idleMsgPeriodMs", args.idleMsgPeriodMs, "idleMsgPeriodMs", args.idleMsgPeriodMs,
"queueBlkCnt", args.queueBlkCnt, "queueBlkCnt", args.queueBlkCnt,
"queueBlkByteCnt", args.queueBlkByteCnt, "queueBlkByteCnt", args.queueBlkByteCnt,
"extraLogsFl", args.extraLogsFl,
"uiCfgFn", uiCfgFn )) != kOkRC ) "uiCfgFn", uiCfgFn )) != kOkRC )
{ {
rc = cwLogError(rc,"'ui' cfg. parse failed."); rc = cwLogError(rc,"'ui' cfg. parse failed.");
@ -2401,7 +2402,8 @@ cw::rc_t cw::ui::ws::create( handle_t& h,
args.xmtBufByteN, args.xmtBufByteN,
args.fmtBufByteN, args.fmtBufByteN,
args.queueBlkCnt, args.queueBlkCnt,
args.queueBlkByteCnt); args.queueBlkByteCnt,
args.extraLogsFl);
} }
@ -2420,7 +2422,8 @@ cw::rc_t cw::ui::ws::create( handle_t& h,
unsigned xmtBufByteN, unsigned xmtBufByteN,
unsigned fmtBufByteN, unsigned fmtBufByteN,
unsigned queueBlkCnt, unsigned queueBlkCnt,
unsigned queueBlkByteCnt ) unsigned queueBlkByteCnt,
bool extraLogsFl)
{ {
rc_t rc = kOkRC; rc_t rc = kOkRC;
@ -2440,7 +2443,7 @@ cw::rc_t cw::ui::ws::create( handle_t& h,
void* wsCbA = wsCbFunc==nullptr ? p : cbArg; void* wsCbA = wsCbFunc==nullptr ? p : cbArg;
// create the websocket // create the websocket
if((rc = websock::create(p->wsH, wsCbF, wsCbA, physRootDir, dfltPageFn, port, protocolA, protocolN, queueBlkCnt, queueBlkByteCnt )) != kOkRC ) if((rc = websock::create(p->wsH, wsCbF, wsCbA, physRootDir, dfltPageFn, port, protocolA, protocolN, queueBlkCnt, queueBlkByteCnt, extraLogsFl )) != kOkRC )
{ {
cwLogError(rc,"UI Websock create failed."); cwLogError(rc,"UI Websock create failed.");
goto errLabel; goto errLabel;
@ -2630,7 +2633,8 @@ cw::rc_t cw::ui::srv::create( handle_t& h,
unsigned xmtBufByteN, unsigned xmtBufByteN,
unsigned fmtBufByteN, unsigned fmtBufByteN,
unsigned queueBlkCnt, unsigned queueBlkCnt,
unsigned queueBlkByteCnt ) unsigned queueBlkByteCnt,
bool extraLogsFl )
{ {
rc_t rc = kOkRC; rc_t rc = kOkRC;
if((rc = destroy(h)) != kOkRC ) if((rc = destroy(h)) != kOkRC )

7
cwUi.h
View File

@ -195,6 +195,7 @@ namespace cw
unsigned idleMsgPeriodMs; // min period without messages before an idle message is generated unsigned idleMsgPeriodMs; // min period without messages before an idle message is generated
unsigned queueBlkCnt; unsigned queueBlkCnt;
unsigned queueBlkByteCnt; unsigned queueBlkByteCnt;
bool extraLogsFl; // Report the websock LLL_NOTICE logs
} args_t; } args_t;
rc_t parseArgs( const object_t& o, args_t& args, const char* object_label="ui" ); rc_t parseArgs( const object_t& o, args_t& args, const char* object_label="ui" );
@ -224,7 +225,8 @@ namespace cw
unsigned xmtBufByteN = 1024, unsigned xmtBufByteN = 1024,
unsigned fmtBufByteN = 4096, unsigned fmtBufByteN = 4096,
unsigned queueBlkCnt = 4, unsigned queueBlkCnt = 4,
unsigned queueBlkByteCnt = 4096 ); unsigned queueBlkByteCnt = 4096,
bool extraLogsFl = false );
rc_t destroy( handle_t& h ); rc_t destroy( handle_t& h );
@ -275,7 +277,8 @@ namespace cw
unsigned xmtBufByteN = 1024, unsigned xmtBufByteN = 1024,
unsigned fmtBufByteN = 4096, unsigned fmtBufByteN = 4096,
unsigned queueBlkCnt = 4, unsigned queueBlkCnt = 4,
unsigned queueBlkByteCnt = 4096 ); unsigned queueBlkByteCnt = 4096,
bool extraLogsFl = false );
rc_t destroy( handle_t& h ); rc_t destroy( handle_t& h );

View File

@ -596,7 +596,8 @@ cw::rc_t cw::websock::create(
const protocol_t* protocolArgA, const protocol_t* protocolArgA,
unsigned protocolN, unsigned protocolN,
unsigned queueBlkCnt, unsigned queueBlkCnt,
unsigned queueBlkByteCnt ) unsigned queueBlkByteCnt,
bool extraLogsFl )
{ {
rc_t rc; rc_t rc;
struct lws_context_creation_info info; struct lws_context_creation_info info;
@ -607,7 +608,10 @@ cw::rc_t cw::websock::create(
websock_t* p = mem::allocZ<websock_t>(); websock_t* p = mem::allocZ<websock_t>();
int logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE; int logs = LLL_USER | LLL_ERR | LLL_WARN;
if( extraLogsFl )
logs |= LLL_NOTICE;
lws_set_log_level(logs, nullptr); lws_set_log_level(logs, nullptr);
p->_event_loop_ops_custom = {}; p->_event_loop_ops_custom = {};

View File

@ -47,7 +47,8 @@ namespace cw
const protocol_t* protocolA, const protocol_t* protocolA,
unsigned protocolN, unsigned protocolN,
unsigned queueBlkCnt, unsigned queueBlkCnt,
unsigned queueBlkByteCnt ); unsigned queueBlkByteCnt,
bool extraLogsFl);
rc_t destroy( handle_t& h ); rc_t destroy( handle_t& h );

View File

@ -59,7 +59,8 @@ cw::rc_t cw::websockSrv::create(
unsigned protocolN, unsigned protocolN,
unsigned timeOutMs, unsigned timeOutMs,
unsigned queueBlkCnt, unsigned queueBlkCnt,
unsigned queueBlkByteCnt ) unsigned queueBlkByteCnt,
bool extraLogsFl )
{ {
rc_t rc; rc_t rc;
if((rc = destroy(h)) != kOkRC ) if((rc = destroy(h)) != kOkRC )
@ -67,7 +68,7 @@ cw::rc_t cw::websockSrv::create(
websockSrv_t* p = mem::allocZ<websockSrv_t>(); websockSrv_t* p = mem::allocZ<websockSrv_t>();
if((rc = websock::create( p->_websockH, cbFunc, cbArg, physRootDir, dfltHtmlPageFn, port, protocolA, protocolN, queueBlkCnt, queueBlkByteCnt )) != kOkRC ) if((rc = websock::create( p->_websockH, cbFunc, cbArg, physRootDir, dfltHtmlPageFn, port, protocolA, protocolN, queueBlkCnt, queueBlkByteCnt, extraLogsFl )) != kOkRC )
goto errLabel; goto errLabel;
@ -181,6 +182,7 @@ cw::rc_t cw::websockSrvTest( const object_t* cfg )
unsigned xmtBufByteN = 128; unsigned xmtBufByteN = 128;
unsigned queueBlkCnt = 3; unsigned queueBlkCnt = 3;
unsigned queueBlkByteCnt= 4096; unsigned queueBlkByteCnt= 4096;
bool extraLogsFl = true;
appCtx_t appCtx; appCtx_t appCtx;
enum enum
@ -203,7 +205,7 @@ cw::rc_t cw::websockSrvTest( const object_t* cfg )
unsigned protocolN = sizeof(protocolA)/sizeof(protocolA[0]); unsigned protocolN = sizeof(protocolA)/sizeof(protocolA[0]);
if((rc = websockSrv::create( h, websockCb, &appCtx, physRootDir, dfltHtmlPageFn, port, protocolA, protocolN, timeOutMs, queueBlkCnt, queueBlkByteCnt )) != kOkRC ) if((rc = websockSrv::create( h, websockCb, &appCtx, physRootDir, dfltHtmlPageFn, port, protocolA, protocolN, timeOutMs, queueBlkCnt, queueBlkByteCnt, extraLogsFl )) != kOkRC )
return rc; return rc;
appCtx.wsH = websockSrv::websockHandle(h); appCtx.wsH = websockSrv::websockHandle(h);

View File

@ -18,7 +18,8 @@ namespace cw {
unsigned protocolN, unsigned protocolN,
unsigned websockTimeOutMs, unsigned websockTimeOutMs,
unsigned queueBlkCnt, unsigned queueBlkCnt,
unsigned queueBlkByteCnt); unsigned queueBlkByteCnt,
bool extraLogsFl );
rc_t destroy( handle_t& h ); rc_t destroy( handle_t& h );

View File

@ -142,7 +142,7 @@
sine_tone: { sine_tone: {
vars: { vars: {
srate: { type:srate, value:0, doc:"Sine tone sample rate. 0=Use default system sample rate"} srate: { type:srate, value:0, doc:"Sine tone sample rate. 0=Use default system sample rate"}
chCnt: { type:uint, value:2, doc:"Output signal channel count."}, ch_cnt: { type:uint, value:2, doc:"Output signal channel count."},
hz: { type:coeff, value:440.0, doc:"Frequency in Hertz."}, hz: { type:coeff, value:440.0, doc:"Frequency in Hertz."},
phase: { type:coeff, value:0.0, doc:"Offset phase in radians."}, phase: { type:coeff, value:0.0, doc:"Offset phase in radians."},
dc: { type:coeff, value:0.0, doc:"DC offset applied after gain."}, dc: { type:coeff, value:0.0, doc:"DC offset applied after gain."},
@ -154,7 +154,7 @@
a220 : { hz:220 }, a220 : { hz:220 },
a440 : { hz:440 }, a440 : { hz:440 },
a880 : { hz:880 }, a880 : { hz:880 },
mono: { chCnt:1, gain:0.75 } mono: { ch_cnt:1, gain:0.75 }
} }
} }