19 #include <epicsTypes.h>
20 #include <epicsTime.h>
21 #include <epicsThread.h>
22 #include <epicsString.h>
23 #include <epicsTimer.h>
24 #include <epicsMutex.h>
25 #include <epicsEvent.h>
30 #include <epicsExport.h>
54 int function = pasynUser->reason;
55 asynStatus status = asynSuccess;
56 const char *paramName = NULL;
58 getParamName(
function, ¶mName);
63 throw std::runtime_error(
"m_lvdcom is NULL");
66 asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,
67 "%s:%s: function=%d, name=%s, value=%s\n",
71 catch(
const std::exception& ex)
73 epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize,
74 "%s:%s: status=%d, function=%d, name=%s, value=%s, error=%s",
83 int function = pasynUser->reason;
84 asynStatus status = asynSuccess;
85 const char *paramName = NULL;
87 getParamName(
function, ¶mName);
92 throw std::runtime_error(
"m_lvdcom is NULL");
95 asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,
96 "%s:%s: function=%d, name=%s, value=%s\n",
100 catch(
const std::exception& ex)
102 epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize,
103 "%s:%s: status=%d, function=%d, name=%s, value=%s, error=%s",
112 int function = pasynUser->reason;
113 asynStatus status = asynSuccess;
114 const char *paramName = NULL;
116 getParamName(
function, ¶mName);
122 throw std::runtime_error(
"m_lvdcom is NULL");
125 asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,
126 "%s:%s: function=%d, name=%s\n",
127 driverName, functionName,
function, paramName);
130 catch(
const std::exception& ex)
133 epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize,
134 "%s:%s: status=%d, function=%d, name=%s, error=%s",
135 driverName, functionName, status,
function, paramName, ex.what());
142 return writeValue(pasynUser,
"writeFloat64", value);
147 return writeValue(pasynUser,
"writeInt32", value);
152 return readArray(pasynUser,
"readFloat64Array", value, nElements, nIn);
157 return readArray(pasynUser,
"readInt32Array", value, nElements, nIn);
162 return readValue(pasynUser,
"readFloat64", value);
167 return readValue(pasynUser,
"readInt32", value);
172 int function = pasynUser->reason;
174 const char *functionName =
"readOctet";
175 const char *paramName = NULL;
177 getParamName(
function, ¶mName);
183 throw std::runtime_error(
"m_lvdcom is NULL");
186 if ( value_s.size() > maxChars )
189 if (eomReason) { *eomReason = ASYN_EOM_CNT | ASYN_EOM_END; }
190 asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,
191 "%s:%s: function=%d, name=%s, value=\"%s\" (TRUNCATED from %d chars)\n",
192 driverName, functionName,
function, paramName, value_s.substr(0,*nActual).c_str(), value_s.size());
196 *nActual = value_s.size();
197 if (eomReason) { *eomReason = ASYN_EOM_END; }
198 asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,
199 "%s:%s: function=%d, name=%s, value=\"%s\"\n",
200 driverName, functionName,
function, paramName, value_s.c_str());
202 strncpy(value, value_s.c_str(), maxChars);
205 catch(
const std::exception& ex)
207 epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize,
208 "%s:%s: status=%d, function=%d, name=%s, value=\"%s\", error=%s",
209 driverName, functionName, status,
function, paramName, value_s.c_str(), ex.what());
211 if (eomReason) { *eomReason = ASYN_EOM_END; }
219 int function = pasynUser->reason;
220 asynStatus status = asynSuccess;
221 const char *paramName = NULL;
223 getParamName(
function, ¶mName);
224 const char* functionName =
"writeOctet";
225 std::string value_s(value, maxChars);
230 throw std::runtime_error(
"m_lvdcom is NULL");
233 asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,
234 "%s:%s: function=%d, name=%s, value=%s\n",
235 driverName, functionName,
function, paramName, value_s.c_str());
236 *nActual = value_s.size();
239 catch(
const std::exception& ex)
241 epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize,
242 "%s:%s: status=%d, function=%d, name=%s, value=%s, error=%s",
243 driverName, functionName, status,
function, paramName, value_s.c_str(), ex.what());
259 fprintf(fp,
"DCOM pointer is NULL\n");
261 asynPortDriver::report(fp, details);
271 : asynPortDriver(portName,
274 asynInt32Mask | asynInt32ArrayMask | asynFloat64Mask | asynFloat64ArrayMask | asynOctetMask | asynDrvUserMask,
275 asynInt32Mask | asynInt32ArrayMask | asynFloat64Mask | asynFloat64ArrayMask | asynOctetMask,
283 const char *functionName =
"lvDCOMDriver";
284 std::map<std::string,std::string> res;
286 for(std::map<std::string,std::string>::const_iterator it=res.begin(); it != res.end(); ++it)
288 if (it->second ==
"float64")
290 createParam(it->first.c_str(), asynParamFloat64, &i);
292 else if (it->second ==
"int32" || it->second ==
"enum" || it->second ==
"ring" || it->second ==
"boolean")
294 createParam(it->first.c_str(), asynParamInt32, &i);
296 else if (it->second ==
"string")
298 createParam(it->first.c_str(), asynParamOctet, &i);
300 else if (it->second ==
"float64array")
302 createParam(it->first.c_str(), asynParamFloat64Array, &i);
304 else if (it->second ==
"int32array")
306 createParam(it->first.c_str(), asynParamInt32Array, &i);
310 errlogSevPrintf(errlogMajor,
"%s:%s: unknown type %s for parameter %s\n",
driverName, functionName, it->second.c_str(), it->first.c_str());
316 if (epicsThreadCreate(
"lvDCOMDriverTask",
317 epicsThreadPriorityMedium,
318 epicsThreadGetStackSize(epicsThreadStackMedium),
321 printf(
"%s:%s: epicsThreadCreate failure\n",
driverName, functionName);
347 int lvDCOMConfigure(
const char *portName,
const char* configSection,
const char *configFile,
const char *host,
int options,
348 const char* progid,
const char* username,
const char* password)
361 errlogSevPrintf(errlogFatal,
"lvDCOMConfigure failed (NULL)\n");
366 catch(
const std::exception& ex)
368 errlogSevPrintf(errlogFatal,
"lvDCOMConfigure failed: %s\n", ex.what());
375 static const iocshArg
initArg0 = {
"portName", iocshArgString};
376 static const iocshArg
initArg1 = {
"configSection", iocshArgString};
377 static const iocshArg
initArg2 = {
"configFile", iocshArgString};
378 static const iocshArg
initArg3 = {
"host", iocshArgString};
379 static const iocshArg
initArg4 = {
"options", iocshArgInt};
380 static const iocshArg
initArg5 = {
"progid", iocshArgString};
381 static const iocshArg
initArg6 = {
"username", iocshArgString};
382 static const iocshArg
initArg7 = {
"password", iocshArgString};
393 static const iocshFuncDef
initFuncDef = {
"lvDCOMConfigure",
sizeof(
initArgs) /
sizeof(iocshArg*), initArgs};
397 lvDCOMConfigure(args[0].sval, args[1].sval, args[2].sval, args[3].sval, args[4].ival, args[5].sval, args[6].sval, args[7].sval);
virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value)
std::string convertToString(T t)
Convert a numeric type to a string.
int lvDCOMConfigure(const char *portName, const char *configSection, const char *configFile, const char *host, int options, const char *progid, const char *username, const char *password)
EPICS iocsh callable function to call constructor of lvDCOMInterface().
EPICS Asyn port driver class.
virtual void report(FILE *fp, int details)
EPICS driver report function for iocsh dbior command.
static const iocshArg initArg2
Path to the XML input file to load configuration information from.
virtual asynStatus readFloat64Array(asynUser *pasynUser, epicsFloat64 *value, size_t nElements, size_t *nIn)
virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value)
asynStatus readArray(asynUser *pasynUser, const char *functionName, T *value, size_t nElements, size_t *nIn)
An STL exception describing a Win32 Structured Exception.
Header file for various COM utilities.
static void seTransFunction(unsigned int u, EXCEPTION_POINTERS *pExp)
Function to translate a Win32 structured exception into a standard C++ exception. ...
virtual asynStatus readInt32Array(asynUser *pasynUser, epicsInt32 *value, size_t nElements, size_t *nIn)
static const iocshArg initArg0
The name of the asyn driver port we will create.
epicsExportRegistrar(lvDCOMRegister)
static const iocshArg initArg3
host name where LabVIEW is running ("" for localhost)
virtual asynStatus readInt32(asynUser *pasynUser, epicsInt32 *value)
static const char * driverName
Name of driver for use in message printing.
void report(FILE *fp, int details)
Helper for EPICS driver report function.
asynStatus readValue(asynUser *pasynUser, const char *functionName, T *value)
static const iocshArg initArg1
section name of configFile to use to configure this asyn port
lvDCOMInterface * m_lvdcom
virtual asynStatus readFloat64(asynUser *pasynUser, epicsFloat64 *value)
static void lvDCOMTask(void *arg)
header for lvDCOMInterface class.
static const iocshArg initArg6
(optional) remote username for host
void getParams(std::map< std::string, std::string > &res)
asynStatus writeValue(asynUser *pasynUser, const char *functionName, T value)
Header for lvDCOMDriver class.
static const iocshArg *const initArgs[]
Header for templated number to string conversion functions.
virtual asynStatus readOctet(asynUser *pasynUser, char *value, size_t maxChars, size_t *nActual, int *eomReason)
Manager class for LabVIEW DCOM Interaction. Parses an lvinput.xml file and provides access to the Lab...
void setLabviewValue(const char *param, const T &value)
static void lvDCOMRegister(void)
Register new commands with EPICS IOC shell.
static const iocshFuncDef initFuncDef
virtual asynStatus writeOctet(asynUser *pasynUser, const char *value, size_t maxChars, size_t *nActual)
static const iocshArg initArg5
(optional) DCOM ProgID (required if connecting to a compiled LabVIEW application) ...
lvDCOMDriver(lvDCOMInterface *dcomint, const char *portName)
Constructor for the lvDCOMDriver class.
void getLabviewValue(const char *param, T *value)
static void initCallFunc(const iocshArgBuf *args)
static const iocshArg initArg7
(optional) remote password for username on host
static void registerStructuredExceptionHandler()
Register a handler for Win32 strcutured exceptions. This needs to be done on a per thread basis...
static const iocshArg initArg4
options as per lvDCOMOptions enum