cawUiDecl.h,ui.cfg,main.cpp : Added program loading in a background thread.
Added List widget procesing. Added ReloadIoBtn and ReloadPgmBtn.
This commit is contained in:
parent
44a1af00b7
commit
8673dc18c2
@ -13,6 +13,9 @@ namespace caw {
|
|||||||
kReportBtnId,
|
kReportBtnId,
|
||||||
kLatencyBtnId,
|
kLatencyBtnId,
|
||||||
|
|
||||||
|
kReloadIoBtnId,
|
||||||
|
kReloadPgmBtnId,
|
||||||
|
|
||||||
kPgmSelId,
|
kPgmSelId,
|
||||||
kPgmPresetSelId,
|
kPgmPresetSelId,
|
||||||
kPgmLoadBtnId,
|
kPgmLoadBtnId,
|
||||||
@ -48,6 +51,7 @@ namespace caw {
|
|||||||
kDoubleWidgetId,
|
kDoubleWidgetId,
|
||||||
kStringWidgetId,
|
kStringWidgetId,
|
||||||
kMeterWidgetId,
|
kMeterWidgetId,
|
||||||
|
kListWidgetId,
|
||||||
|
|
||||||
|
|
||||||
kPgmBaseSelId,
|
kPgmBaseSelId,
|
||||||
|
@ -14,6 +14,9 @@
|
|||||||
button:{ name: reportBtnId, title:"App Report" },
|
button:{ name: reportBtnId, title:"App Report" },
|
||||||
button:{ name: latencyBtnId, title:"Latency Reset"},
|
button:{ name: latencyBtnId, title:"Latency Reset"},
|
||||||
|
|
||||||
|
button:{ name: reloadIoBtnId, title:"Reload IO"},
|
||||||
|
button:{ name: reloadPgmBtnId,title:"Reload Pgm"},
|
||||||
|
|
||||||
select:{ name: pgmSelId, title:"Programs", children: {} },
|
select:{ name: pgmSelId, title:"Programs", children: {} },
|
||||||
select:{ name: pgmPresetSelId, title:"Presets", children: {}, enable:false },
|
select:{ name: pgmPresetSelId, title:"Presets", children: {}, enable:false },
|
||||||
button:{ name: pgmLoadBtnId, title:"Load", enable:false },
|
button:{ name: pgmLoadBtnId, title:"Load", enable:false },
|
||||||
|
114
src/caw/main.cpp
114
src/caw/main.cpp
@ -29,6 +29,8 @@ enum {
|
|||||||
kHwReportSelId,
|
kHwReportSelId,
|
||||||
kTestStubSelId,
|
kTestStubSelId,
|
||||||
kHelpSelId,
|
kHelpSelId,
|
||||||
|
|
||||||
|
kPgmLoadThreadId
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -59,7 +61,6 @@ typedef struct app_str
|
|||||||
io::handle_t ioH;
|
io::handle_t ioH;
|
||||||
io_flow_ctl::handle_t ioFlowH;
|
io_flow_ctl::handle_t ioFlowH;
|
||||||
caw::ui::handle_t uiH;
|
caw::ui::handle_t uiH;
|
||||||
|
|
||||||
} app_t;
|
} app_t;
|
||||||
|
|
||||||
ui::appIdMap_t appIdMapA[] = {
|
ui::appIdMap_t appIdMapA[] = {
|
||||||
@ -71,6 +72,9 @@ ui::appIdMap_t appIdMapA[] = {
|
|||||||
{ kPanelDivId, kReportBtnId, "reportBtnId" },
|
{ kPanelDivId, kReportBtnId, "reportBtnId" },
|
||||||
{ kPanelDivId, kLatencyBtnId, "latencyBtnId" },
|
{ kPanelDivId, kLatencyBtnId, "latencyBtnId" },
|
||||||
|
|
||||||
|
{ kPanelDivId, kReloadIoBtnId, "reloadIoBtnId" },
|
||||||
|
{ kPanelDivId, kReloadPgmBtnId, "reloadPgmBtnId"},
|
||||||
|
|
||||||
{ kPanelDivId, kPgmSelId, "pgmSelId" },
|
{ kPanelDivId, kPgmSelId, "pgmSelId" },
|
||||||
{ kPanelDivId, kPgmPresetSelId, "pgmPresetSelId" },
|
{ kPanelDivId, kPgmPresetSelId, "pgmPresetSelId" },
|
||||||
{ kPanelDivId, kPgmLoadBtnId, "pgmLoadBtnId" },
|
{ kPanelDivId, kPgmLoadBtnId, "pgmLoadBtnId" },
|
||||||
@ -163,6 +167,69 @@ errLabel:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc_t _load_pgm_thread_func( void* arg )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
app_t* app = (app_t*)arg;
|
||||||
|
|
||||||
|
const flow::ui_net_t* ui_net = nullptr;
|
||||||
|
|
||||||
|
if((rc = program_initialize(app->ioFlowH, app->pgm_preset_idx )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Network initialization failed.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((ui_net = program_ui_net(app->ioFlowH)) == nullptr )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Network UI description initialization failed.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((rc = caw::ui::create(app->uiH, app->ioH, app->ioFlowH, ui_net )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Network UI create failed.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
uiSetEnable(app->ioH, io::uiFindElementUuId( app->ioH, kRunCheckId ), true );
|
||||||
|
uiSetEnable(app->ioH, io::uiFindElementUuId( app->ioH, kPgmPrintBtnId ), true );
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _on_load_pgm_thread_complete(app_t* app)
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
unsigned preset_cnt = program_preset_count(app->ioFlowH);
|
||||||
|
|
||||||
|
unsigned pgmPresetSelUuId = io::uiFindElementUuId( app->ioH, kPgmPresetSelId );
|
||||||
|
unsigned pgmLoadBtnUuId = io::uiFindElementUuId( app->ioH, kPgmLoadBtnId );
|
||||||
|
|
||||||
|
// populate the preset menu
|
||||||
|
for(unsigned i=0; i<preset_cnt; ++i)
|
||||||
|
{
|
||||||
|
unsigned uuId;
|
||||||
|
if((rc = uiCreateOption( app->ioH, uuId, pgmPresetSelUuId, nullptr, kPgmPresetBaseSelId+i, kInvalidId, "optClass", program_preset_title(app->ioFlowH,i) )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Error on populating the program preset select widget.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( preset_cnt > 0 )
|
||||||
|
{
|
||||||
|
uiSetEnable( app->ioH, pgmPresetSelUuId, true );
|
||||||
|
app->pgm_preset_idx = 0; // since it is showing - select the first preset as the default preset
|
||||||
|
}
|
||||||
|
|
||||||
|
uiSetEnable( app->ioH, pgmLoadBtnUuId, true );
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
rc_t _on_pgm_select(app_t* app, unsigned pgmSelOptId )
|
rc_t _on_pgm_select(app_t* app, unsigned pgmSelOptId )
|
||||||
{
|
{
|
||||||
@ -193,6 +260,7 @@ rc_t _on_pgm_select(app_t* app, unsigned pgmSelOptId )
|
|||||||
uiSetEnable( app->ioH, pgmPrintBtnUuId, false ); //
|
uiSetEnable( app->ioH, pgmPrintBtnUuId, false ); //
|
||||||
uiSetEnable( app->ioH, runCheckUuId, false ); //
|
uiSetEnable( app->ioH, runCheckUuId, false ); //
|
||||||
app->pgm_preset_idx = kInvalidIdx; // The preset menu is empty and so there can be no valid preset selected.
|
app->pgm_preset_idx = kInvalidIdx; // The preset menu is empty and so there can be no valid preset selected.
|
||||||
|
|
||||||
pgm_idx = pgmSelOptId - kPgmBaseSelId; // Calc the ioFlowCtl preset index of the selected preset.
|
pgm_idx = pgmSelOptId - kPgmBaseSelId; // Calc the ioFlowCtl preset index of the selected preset.
|
||||||
|
|
||||||
// load the program
|
// load the program
|
||||||
@ -258,29 +326,15 @@ rc_t _on_pgm_load(app_t* app )
|
|||||||
|
|
||||||
if( !program_is_initialized( app->ioFlowH) )
|
if( !program_is_initialized( app->ioFlowH) )
|
||||||
{
|
{
|
||||||
const flow::ui_net_t* ui_net = nullptr;
|
// Load the program in a separate thread so that we can see the log messages as they occur.
|
||||||
|
// Without async load the program is blocked until the load is complete.
|
||||||
if((rc = program_initialize(app->ioFlowH, app->pgm_preset_idx )) != kOkRC )
|
// When _load_pgm_thread_func() is complete _on_load_pgm_thread_complete() is called.
|
||||||
|
bool asyncResponseFl = true;
|
||||||
|
if((rc = threadRunOnce( app->ioH, kPgmLoadThreadId, asyncResponseFl, _load_pgm_thread_func, app, "pgm_loader_thread" )) != kOkRC )
|
||||||
{
|
{
|
||||||
rc = cwLogError(rc,"Network initialization failed.");
|
rc = cwLogError(rc,"Unable to start program loader thread.");
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((ui_net = program_ui_net(app->ioFlowH)) == nullptr )
|
|
||||||
{
|
|
||||||
rc = cwLogError(rc,"Network UI description initialization failed.");
|
|
||||||
goto errLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
if((rc = caw::ui::create(app->uiH, app->ioH, app->ioFlowH, ui_net )) != kOkRC )
|
|
||||||
{
|
|
||||||
rc = cwLogError(rc,"Network UI create failed.");
|
|
||||||
goto errLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
uiSetEnable(app->ioH, io::uiFindElementUuId( app->ioH, kRunCheckId ), true );
|
|
||||||
uiSetEnable(app->ioH, io::uiFindElementUuId( app->ioH, kPgmPrintBtnId ), true );
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
@ -399,6 +453,12 @@ rc_t _ui_value_callback(app_t* app, const io::ui_msg_t& m )
|
|||||||
latency_measure_setup(app->ioH);
|
latency_measure_setup(app->ioH);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case kReloadIoBtnId:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kReloadPgmBtnId:
|
||||||
|
break;
|
||||||
|
|
||||||
case kPgmSelId:
|
case kPgmSelId:
|
||||||
_on_pgm_select(app,m.value->u.u);
|
_on_pgm_select(app,m.value->u.u);
|
||||||
break;
|
break;
|
||||||
@ -421,7 +481,6 @@ rc_t _ui_value_callback(app_t* app, const io::ui_msg_t& m )
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case kLogId:
|
case kLogId:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kButtonWidgetId:
|
case kButtonWidgetId:
|
||||||
@ -451,6 +510,11 @@ rc_t _ui_value_callback(app_t* app, const io::ui_msg_t& m )
|
|||||||
case kStringWidgetId:
|
case kStringWidgetId:
|
||||||
rc = _on_variable_value(app,m,m.value->u.s);
|
rc = _on_variable_value(app,m,m.value->u.s);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case kListWidgetId:
|
||||||
|
rc = _on_variable_value(app,m,m.value->u.u);
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -521,6 +585,10 @@ rc_t _ui_echo_callback(app_t* app, const io::ui_msg_t& m )
|
|||||||
case kStringWidgetId:
|
case kStringWidgetId:
|
||||||
rc = _on_variable_echo<const char*>(app,m);
|
rc = _on_variable_echo<const char*>(app,m);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case kListWidgetId:
|
||||||
|
rc = _on_variable_echo<unsigned>(app,m);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@ -588,6 +656,8 @@ rc_t _io_callback( void* arg, const io::msg_t* m )
|
|||||||
switch( m->tid )
|
switch( m->tid )
|
||||||
{
|
{
|
||||||
case io::kThreadTId:
|
case io::kThreadTId:
|
||||||
|
if( m->u.thread->id == kPgmLoadThreadId )
|
||||||
|
_on_load_pgm_thread_complete(app);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case io::kTimerTId:
|
case io::kTimerTId:
|
||||||
|
Loading…
Reference in New Issue
Block a user