libcw/cwIoMinTest.cpp
2024-12-01 14:35:24 -05:00

147 lines
2.7 KiB
C++

//| Copyright: (C) 2020-2024 Kevin Larke <contact AT larke DOT org>
//| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file.
#include "cwCommon.h"
#include "cwLog.h"
#include "cwCommonImpl.h"
#include "cwTest.h"
#include "cwKeyboard.h"
#include "cwMem.h"
#include "cwObject.h"
#include "cwTime.h"
#include "cwMidiDecls.h"
#include "cwMidi.h"
#include "cwUiDecls.h"
#include "cwIo.h"
#include "cwIoMinTest.h"
namespace cw
{
enum
{
kThread0Id,
kThread1Id
};
typedef struct app_str
{
unsigned n0;
unsigned n1;
io::handle_t ioH;
} app_t;
void minTestThreadCb( app_t* app, const io::thread_msg_t* tm )
{
switch( tm->id )
{
case kThread0Id:
app->n0 += 1;
break;
case kThread1Id:
app->n1 += 1;
break;
}
}
// The main application callback
rc_t minTestCb( void* arg, const io::msg_t* m )
{
rc_t rc = kOkRC;
app_t* app = reinterpret_cast<app_t*>(arg);
switch( m->tid )
{
case io::kThreadTId:
minTestThreadCb( app, m->u.thread );
break;
case io::kSerialTId:
break;
case io::kMidiTId:
break;
case io::kAudioTId:
break;
case io::kAudioMeterTId:
break;
case io::kSockTId:
break;
case io::kWebSockTId:
break;
case io::kUiTId:
break;
default:
assert(0);
}
return rc;
}
}
cw::rc_t cw::min_test( const object_t* cfg )
{
rc_t rc;
app_t app = {};
bool asyncFl = true;
// create the io framework instance
if((rc = create(app.ioH,cfg,minTestCb,&app)) != kOkRC )
return rc;
if((rc = threadCreate( app.ioH, kThread0Id, asyncFl, &app, "min_test_0" )) != kOkRC )
{
rc = cwLogError(rc,"Thread 0 create failed.");
goto errLabel;
}
if((rc = threadCreate( app.ioH, kThread1Id, asyncFl, &app, "min_test_1" )) != kOkRC )
{
rc = cwLogError(rc,"Thread 1 create failed.");
goto errLabel;
}
// start the io framework instance
if((rc = start(app.ioH)) != kOkRC )
{
rc = cwLogError(rc,"Test app start failed.");
goto errLabel;
}
printf("<enter> to quit.\n");
// execuite the io framework
while( !isShuttingDown(app.ioH))
{
const unsigned wsTimeOutMs = 50;
time::spec_t t0 = time::current_time();
exec(app.ioH,wsTimeOutMs);
time::spec_t t1 = time::current_time();
unsigned dMs = time::elapsedMs(t0,t1);
if( dMs < wsTimeOutMs )
sleepMs(wsTimeOutMs-dMs);
if( isKeyWaiting() )
break;
printf("%i %i\n",app.n0,app.n1);
}
errLabel:
destroy(app.ioH);
printf("ioMinTest Done.\n");
return rc;
}