25ref class WASimClient::Private
29 using clientEventCallback_t = void(__stdcall *)(
const WASimCommander::Client::ClientEvent &);
30 using listResultsCallback_t = void(__stdcall *)(
const WASimCommander::Client::ListResult &);
31 using dataCallback_t = void(__stdcall *)(
const WASimCommander::Client::DataRequestRecord &);
33 using commandCallback_t = void(__stdcall *)(
const WASimCommander::Command &);
36 WASimCommander::Client::WASimClient *client =
nullptr;
37 [UnmanagedFunctionPointer(CallingConvention::StdCall)]
38 delegate
void ClientEventCallback(
const WASimCommander::Client::ClientEvent &);
39 [UnmanagedFunctionPointer(CallingConvention::StdCall)]
40 delegate
void ListResultsCallback(
const WASimCommander::Client::ListResult &);
41 [UnmanagedFunctionPointer(CallingConvention::StdCall)]
42 delegate
void DataCallback(
const WASimCommander::Client::DataRequestRecord &);
43 [UnmanagedFunctionPointer(CallingConvention::StdCall)]
45 [UnmanagedFunctionPointer(CallingConvention::StdCall)]
46 delegate
void CommandResultCallback(
const WASimCommander::Command &);
47 [UnmanagedFunctionPointer(CallingConvention::StdCall)]
48 delegate
void ResponseCallback(
const WASimCommander::Command &);
50 [MarshalAs(UnmanagedType::FunctionPtr)]
51 ClientEventCallback ^clientEventCb;
52 [MarshalAs(UnmanagedType::FunctionPtr)]
53 ListResultsCallback ^listResultsCb;
54 [MarshalAs(UnmanagedType::FunctionPtr)]
56 [MarshalAs(UnmanagedType::FunctionPtr)]
58 [MarshalAs(UnmanagedType::FunctionPtr)]
59 CommandResultCallback ^resultCb;
60 [MarshalAs(UnmanagedType::FunctionPtr)]
61 ResponseCallback ^responseCb;
70 Private(
WASimClient ^q, WASimCommander::Client::WASimClient *c) :
73 clientEventCb = gcnew ClientEventCallback(
this, &Private::onClientEvent);
74 IntPtr pCb = Marshal::GetFunctionPointerForDelegate(clientEventCb);
75 client->setClientEventCallback(
static_cast<clientEventCallback_t
>(pCb.ToPointer()));
77 listResultsCb = gcnew ListResultsCallback(
this, &Private::onListResult);
78 pCb = Marshal::GetFunctionPointerForDelegate(listResultsCb);
79 client->setListResultsCallback(
static_cast<listResultsCallback_t
>(pCb.ToPointer()));
81 dataCb = gcnew DataCallback(
this, &Private::onDataResult);
82 pCb = Marshal::GetFunctionPointerForDelegate(dataCb);
83 client->setDataCallback(
static_cast<dataCallback_t
>(pCb.ToPointer()));
85 logCb = gcnew LogCallback(
this, &Private::onLogRecord);
86 pCb = Marshal::GetFunctionPointerForDelegate(logCb);
87 client->setLogCallback(
static_cast<logCallback_t
>(pCb.ToPointer()));
89 resultCb = gcnew CommandResultCallback(
this, &Private::onCommandResult);
90 pCb = Marshal::GetFunctionPointerForDelegate(resultCb);
91 client->setCommandResultCallback(
static_cast<commandCallback_t
>(pCb.ToPointer()));
93 responseCb = gcnew ResponseCallback(
this, &Private::onServerResponse);
94 pCb = Marshal::GetFunctionPointerForDelegate(responseCb);
95 client->setResponseCallback(
static_cast<commandCallback_t
>(pCb.ToPointer()));
98 void onClientEvent(
const WASimCommander::Client::ClientEvent &ev)
100 if (clientEventHandler)
101 clientEventHandler->Invoke(gcnew ClientEvent(ev));
104 void onListResult(
const WASimCommander::Client::ListResult &lr)
106 if (listResultsHandler)
107 listResultsHandler->Invoke(gcnew ListResult(lr));
110 void onDataResult(
const WASimCommander::Client::DataRequestRecord &ev)
113 dataHandler->Invoke(gcnew DataRequestRecord(ev));
119 logHandler->Invoke(gcnew LogRecord(lr), (LogSource)s);
122 void onCommandResult(
const WASimCommander::Command &cmd)
125 resultHandler->Invoke(gcnew Command(cmd));
128 void onServerResponse(
const WASimCommander::Command &cmd)
131 responseHandler->Invoke(gcnew Command(cmd));
134 inline HR executeCalculatorCode(String ^ code, CalcResultType resultType, interior_ptr<double> pfResult, interior_ptr<String ^> psResult)
136 pin_ptr<double> pf = pfResult;
138 const HRESULT hr = client->executeCalculatorCode(
139 marshal_as<std::string>(code),
141 pf, psResult ? &s :
nullptr
144 *psResult = marshal_as<String ^>(s);
148 inline HR getVariable(VariableRequest ^var, interior_ptr<double> pfResult, interior_ptr<String ^> psResult)
150 pin_ptr<double> pf = pfResult;
152 HR ret = (
HR)client->getVariable(var, pf, psResult ? &s :
nullptr);
154 *psResult = marshal_as<String ^>(s);
158 inline HR getOrCreateLocalVariable(String ^ name, interior_ptr<String ^> unit,
double defaultValue, interior_ptr<double> pfResult)
160 pin_ptr<double> pf = pfResult;
162 return (
HR)client->getOrCreateLocalVariable(marshal_as<std::string>(name), pf, defaultValue, marshal_as<std::string>((String ^)*unit));
163 return (
HR)client->getOrCreateLocalVariable(marshal_as<std::string>(name), pf, defaultValue);
169 client->setListResultsCallback(
nullptr);
170 client->setDataCallback(
nullptr);
171 client->setCommandResultCallback(
nullptr);
172 client->setResponseCallback(
nullptr);
173 client->setClientEventCallback(
nullptr);
174 client->setLogCallback(
nullptr);
177 delete clientEventHandler;
178 delete listResultsHandler;
181 delete resultHandler;
182 delete responseHandler;
184 delete clientEventCb;
185 delete listResultsCb;
197 d { gcnew Private(this, m_client) }
203WASimClient::~WASimClient()
219 return d->executeCalculatorCode(code, resultType, &pfResult,
nullptr);
223 return d->executeCalculatorCode(code, resultType,
nullptr, &psResult);
227 return d->executeCalculatorCode(code, resultType, &pfResult, &psResult);
231 return d->getVariable(var, &pfResult,
nullptr);
235 return d->getVariable(var,
nullptr, &psResult);
239 return d->getVariable(var, &pfResult, &psResult);
243 return d->getOrCreateLocalVariable(variableName,
nullptr, defaultValue, &pfResult);
247 return d->getOrCreateLocalVariable(variableName, &unitName, defaultValue, &pfResult);
252 const std::vector<WASimCommander::Client::DataRequestRecord> &res = m_client->dataRequests();
253 array<DataRequestRecord ^> ^ret = gcnew array<DataRequestRecord ^>((
int)res.size());
255 for (
const auto &dr : res)
262 const std::vector<uint32_t> &res = m_client->dataRequestIdsList();
263 array<UInt32> ^ret = gcnew array<UInt32>((
int)res.size());
265 pin_ptr<UInt32> pp = &ret[0];
266 memcpy(pp, res.data(), res.size() * 4);
273 const std::vector<WASimCommander::Client::RegisteredEvent> &res = m_client->registeredEvents();
274 array<RegisteredEvent ^> ^ret = gcnew array<RegisteredEvent ^>((
int)res.size());
276 for (
const auto &ev : res)
281#define DELEGATE_HANDLER(E, D, H) \
282 void WASimClient::E::add(D ^ h) { H += h; } \
283 void WASimClient::E::remove(D ^ h) { H -= h; }
285DELEGATE_HANDLER(OnClientEvent, ClientEventDelegate, d->clientEventHandler)
286DELEGATE_HANDLER(OnListResults, ListResultsDelegate, d->listResultsHandler)
287DELEGATE_HANDLER(OnDataReceived, DataDelegate, d->dataHandler)
288DELEGATE_HANDLER(OnLogRecordReceived, LogDelegate, d->logHandler)
289DELEGATE_HANDLER(OnCommandResult, CommandResultDelegate, d->resultHandler)
290DELEGATE_HANDLER(OnResponseReceived, ResponseDelegate, d->responseHandler)
292#undef DELEGATE_HANDLER
C+/CLI wrapper implementation of WASimCommander::Client::WASimClient. See documentation for the C++ c...
HR getVariable(VariableRequest ^ var, [Out] double % pfResult)
Get the value of a variable with a numeric result type. This is the most typical use case since most ...
delegate void ResponseDelegate(Command ^)
Event delegate for all Command structures received from server (OnResponseReceived).
delegate void ListResultsDelegate(ListResult ^)
Event delegate for delivering list results, eg. of local variables sent from Server (OnListResults).
array< UInt32 > ^ dataRequestIdsList()
See WASimClient::dataRequestIdsList().
delegate void LogDelegate(LogRecord ^, LogSource)
Event delegate for log entries (from both Client and Server) (OnLogRecordReceived).
HR getOrCreateLocalVariable(String ^ variableName, double defaultValue, [Out] double % pfResult)
array< DataRequestRecord ^> ^ dataRequests()
See WASimClient::dataRequests().
WASimClient(UInt32 clientId)
Construct a new client with the given ID. The ID must be unique among any other possible clients and ...
void disconnectSimulator()
See WASimClient::disconnectSimulator().
HR executeCalculatorCode(String^ code)
Execute calculator code without result.
delegate void DataDelegate(DataRequestRecord ^)
Event delegate for subscription result data (OnDataReceived).
delegate void CommandResultDelegate(Command ^)
Event delegate for command responses returned from server (OnCommandResult).
array< RegisteredEvent ^> ^ registeredEvents()
See WASimClient::registeredEvents().
delegate void ClientEventDelegate(ClientEvent ^)
Event delegate for Client events (OnClientEvent)
WASimCommander::CLI::Client namespace. Implementation of the C++ WASimClient as a C++/CLI ....
HR
Method return status values; HRESULT "alias".
WASimCommander::CLI namespace. Container for implementation of the C++ WASimCommander API and WASimCl...
LogSource
Log entry source, Client or Server.
CalcResultType
The type of result that calculator code is expected to produce.
WASimCommander main namespace. Defines constants and structs used in Client-Server interactions....
DataRequestRecord inherits and extends WASimCommander::CLI::Structs::DataRequest with data pertinent ...
Structure to hold data for registered (reusable) calculator events. Used to submit events with WASimC...
Structure for using with WASimClient::getVariable() and WASimClient::setVariable() to specify informa...