/* FILENAME... PIInterface.cpp ************************************************************************* * Copyright (c) 2011-2013 Physik Instrumente (PI) GmbH & Co. KG * This file is distributed subject to the EPICS Open License Agreement * found in the file LICENSE that is included with this distribution. ************************************************************************* Original Author: Steffen Rau Created: 15.12.2010 */ #include #include #include #include #include "PIInterface.h" //#undef asynPrint //#define asynPrint(user,reason,format...) 0 extern "C" { int TranslatePIError(const int error, char* szBuffer, const int maxlen); } double PIInterface::TIMEOUT = 5.0; PIInterface::PIInterface(asynUser* pCom) : m_pCurrentLogSink (NULL) , m_pAsynInterface (pCom) { } PIInterface::~PIInterface() { } asynStatus PIInterface::sendOnly(const char *outputBuff, asynUser* logSink) { size_t nRequested = strlen(outputBuff); size_t nActual; asynStatus status; asynPrint(logSink, ASYN_TRACEIO_DRIVER, "PIInterface::sendOnly() sending \"%s\"\n", outputBuff); //printf("PIInterface::sendOnly() sending \"%s\"\n", outputBuff); status = pasynOctetSyncIO->write(m_pAsynInterface, outputBuff, nRequested, TIMEOUT, &nActual); if (nActual != nRequested) status = asynError; status = pasynOctetSyncIO->write(m_pAsynInterface, "\n", 1, TIMEOUT, &nActual); if (status != asynSuccess) { asynPrint(logSink, ASYN_TRACE_ERROR|ASYN_TRACEIO_DRIVER, "PIGCSController:sendOnly: error sending command %s, sent=%d, status=%d\n", outputBuff, nActual, status); } return(status); } asynStatus PIInterface::sendOnly(char c, asynUser* logSink) { size_t nActual; asynStatus status; asynPrint(logSink, ASYN_TRACEIO_DRIVER, "PIInterface::sendOnly() sending \"#%d\"\n", int(c)); //printf("PIInterface::sendOnly() sending \"#%d\"\n", int(c)); status = pasynOctetSyncIO->write(m_pAsynInterface, &c, 1, TIMEOUT, &nActual); if (nActual != 1) status = asynError; if (status != asynSuccess) { asynPrint(logSink, ASYN_TRACE_ERROR|ASYN_TRACEIO_DRIVER, "PIGCSController:sendOnly: error sending command %d, sent=%d, status=%d\n", int(c), nActual, status); //printf("PIInterface::sendOnly() sending \"#%d\"\n", int(c)); } return(status); } asynStatus PIInterface::sendAndReceive(const char *outputBuff, char *inputBuff, int inputSize, asynUser* logSink) { size_t nWriteRequested=strlen(outputBuff); size_t nWrite, nRead; int eomReason; asynStatus status; size_t pos = 0; asynPrint(logSink, ASYN_TRACEIO_DRIVER, "PIInterface::sendAndReceive() sending \"%s\"\n", outputBuff); // //printf("PIInterface::sendAndReceive() sending \"%s\"\n", outputBuff); status = pasynOctetSyncIO->write(m_pAsynInterface, outputBuff, nWriteRequested, TIMEOUT, &nWrite); if (nWrite != nWriteRequested) { asynPrint(logSink, ASYN_TRACE_ERROR|ASYN_TRACEIO_DRIVER, "PIGCSController:sendAndReceive error calling write, output=%s status=%d, error=%s\n", outputBuff, status, m_pAsynInterface->errorMessage); return asynError; } status = pasynOctetSyncIO->writeRead(m_pAsynInterface, "\n", 1, inputBuff, inputSize, TIMEOUT, &nWrite, &nRead, &eomReason); if (nWrite != 1) { asynPrint(logSink, ASYN_TRACE_ERROR|ASYN_TRACEIO_DRIVER, "PIGCSController:sendAndReceive error calling write, output=%s status=%d, error=%s\n", outputBuff, status, m_pAsynInterface->errorMessage); return asynError; } if (status != asynSuccess) { asynPrint(logSink, ASYN_TRACE_ERROR|ASYN_TRACEIO_DRIVER, "PIGCSController:sendAndReceive error calling writeRead, output=%s status=%d, error=%s\n", outputBuff, status, m_pAsynInterface->errorMessage); } while(inputBuff[strlen(inputBuff)-1] == ' ') { inputBuff[strlen(inputBuff)] = '\n'; pos += nRead + 1; status = pasynOctetSyncIO->read(m_pAsynInterface, inputBuff+pos, inputSize-pos, TIMEOUT, &nRead, &eomReason); } asynPrint(logSink, ASYN_TRACEIO_DRIVER, "PIInterface::sendAndReceive() received \"%s\"\n", inputBuff); // //printf("PIInterface::sendAndReceive() received \"%s\"\n", inputBuff); return(status); } asynStatus PIInterface::sendOnly(const char *outputBuff) { asynUser* logSink = m_pCurrentLogSink; if (NULL == logSink) logSink = m_pAsynInterface; m_interfaceMutex.lock(); asynStatus status = sendOnly(outputBuff, logSink); m_interfaceMutex.unlock(); return status; } asynStatus PIInterface::sendOnly(char c) { asynUser* logSink = m_pCurrentLogSink; if (NULL == logSink) logSink = m_pAsynInterface; m_interfaceMutex.lock(); asynStatus status = sendOnly(c, logSink); m_interfaceMutex.unlock(); return status; } asynStatus PIInterface::sendAndReceive(char c, char *inputBuff, int inputSize) { asynUser* logSink = m_pCurrentLogSink; if (NULL == logSink) logSink = m_pAsynInterface; m_interfaceMutex.lock(); asynStatus status = sendAndReceive(c, inputBuff, inputSize, logSink); m_interfaceMutex.unlock(); return status; } asynStatus PIInterface::sendAndReceive(const char* output, char *inputBuff, int inputSize) { asynUser* logSink = m_pCurrentLogSink; if (NULL == logSink) logSink = m_pAsynInterface; m_interfaceMutex.lock(); asynStatus status = sendAndReceive(output, inputBuff, inputSize, logSink); m_interfaceMutex.unlock(); return status; } asynStatus PIInterface::sendAndReceive(char c, char *inputBuff, int inputSize, asynUser* logSink) { size_t nWrite, nRead; int eomReason; asynStatus status; size_t pos = 0; asynPrint(logSink, ASYN_TRACEIO_DRIVER, "PIInterface::sendAndReceive() sending \"#%d\"\n", int(c)); //printf("PIInterface::sendAndReceive() sending \"#%d\"\n", int(c)); status = pasynOctetSyncIO->writeRead(m_pAsynInterface, &c, 1, inputBuff, inputSize, TIMEOUT, &nWrite, &nRead, &eomReason); if (nWrite != 1) status = asynError; if (status != asynSuccess) { asynPrint(logSink, ASYN_TRACE_ERROR|ASYN_TRACEIO_DRIVER, "PIInterface::sendAndReceive error calling writeRead, output=%d status=%d, error=%s\n", int(c), status, m_pAsynInterface->errorMessage); //printf("PIInterface::sendAndReceive error calling writeRead, output=%d status=%d, error=%s\n", int(c), status, pInterface->errorMessage); } while(inputBuff[strlen(inputBuff)-1] == ' ') { pos += nRead; status = pasynOctetSyncIO->writeRead(m_pAsynInterface, &c, 1, inputBuff+pos, inputSize-pos, TIMEOUT, &nWrite, &nRead, &eomReason); //printf("PIInterface::sendAndReceive(char) in while loop. inputBuff: \"%s\"\n", inputBuff); } asynPrint(logSink, ASYN_TRACEIO_DRIVER, "PIInterface::sendAndReceive() received \"%s\"\n", inputBuff); //printf("PIInterface::sendAndReceive() received \"%s\" - (0x%02X)\n", inputBuff, int(inputBuff[0])); return(status); }