more cleaning
Test And Build / Lint (push) Successful in 5s
Test And Build / Build (push) Failing after 8s

This commit is contained in:
2026-08-07 16:04:43 +02:00
parent 4d61d0177a
commit f5eba004fb
2 changed files with 58 additions and 54 deletions
+42 -52
View File
@@ -144,6 +144,15 @@ static int setNonBlock(SOCKET fd, int nonBlockFlag) {
return 0;
}
/* Clamp the asyn I/O timeout to a poll() timeout in milliseconds: negative
* values (infinite wait) pass through, a zero timeout becomes a 1 ms poll. */
static int pollmsecFromTimeout(double timeoutSeconds) {
int pollmsec = (int)(timeoutSeconds * 1000.0);
if (pollmsec == 0)
return 1;
return pollmsec;
}
pmacAsynIPPort::pmacAsynIPPort(const char *portName, const char *hostInfo)
: asynPortDriver(portName, 1 /* maxAddr */, asynOctetMask | asynInt32Mask,
0 /* interruptMask */, ASYN_CANBLOCK, 1 /* autoConnect */,
@@ -374,11 +383,7 @@ asynStatus pmacAsynIPPort::socketRead(asynUser *pasynUser, char *data,
(int)maxchars);
return asynError;
}
readPollmsec = (int)(pasynUser->timeout * 1000.0);
if (readPollmsec == 0)
readPollmsec = 1;
if (readPollmsec < 0)
readPollmsec = -1;
readPollmsec = pollmsecFromTimeout(pasynUser->timeout);
pollfd.fd = fd_;
pollfd.events = POLLIN;
@@ -430,7 +435,8 @@ asynStatus pmacAsynIPPort::socketWrite(asynUser *pasynUser, const char *data,
struct pollfd pollfd;
asynPrint(pasynUser, ASYN_TRACE_FLOW, "%s write.\n", IPHostName_.c_str());
*nbytesTransferred = 0;
if (nbytesTransferred)
*nbytesTransferred = 0;
if (fd_ == INVALID_SOCKET) {
epicsSnprintf(pasynUser->errorMessage, pasynUser->errorMessageSize,
"%s disconnected", IPHostName_.c_str());
@@ -438,11 +444,7 @@ asynStatus pmacAsynIPPort::socketWrite(asynUser *pasynUser, const char *data,
}
if (numchars == 0)
return asynSuccess;
writePollmsec = (int)(pasynUser->timeout * 1000.0);
if (writePollmsec == 0)
writePollmsec = 1;
if (writePollmsec < 0)
writePollmsec = -1;
writePollmsec = pollmsecFromTimeout(pasynUser->timeout);
for (;;) {
pollfd.fd = fd_;
pollfd.events = POLLOUT;
@@ -475,7 +477,8 @@ asynStatus pmacAsynIPPort::socketWrite(asynUser *pasynUser, const char *data,
break;
}
if (thisWrite > 0) {
*nbytesTransferred += thisWrite;
if (nbytesTransferred)
*nbytesTransferred += thisWrite;
numchars -= thisWrite;
if (numchars == 0)
break;
@@ -496,11 +499,25 @@ asynStatus pmacAsynIPPort::socketWrite(asynUser *pasynUser, const char *data,
}
}
asynPrint(pasynUser, ASYN_TRACE_FLOW, "wrote %lu to %s, return %s.\n",
(unsigned long)*nbytesTransferred, IPHostName_.c_str(),
pasynManager->strStatus(status));
(unsigned long)(nbytesTransferred ? *nbytesTransferred : 0),
IPHostName_.c_str(), pasynManager->strStatus(status));
return status;
}
asynStatus pmacAsynIPPort::sendPmacCommand(asynUser *pasynUser,
EthernetCmd &cmd,
uint8_t requestType, uint8_t request,
uint16_t wValue, uint16_t wLength,
size_t *nbytesTransfered) {
cmd.RequestType = requestType;
cmd.Request = request;
cmd.wValue = wValue;
cmd.wIndex = 0;
cmd.wLength = htons(wLength);
return socketWrite(pasynUser, reinterpret_cast<const char *>(&cmd),
ETHERNET_CMD_HEADER, nbytesTransfered);
}
/*
Read reponse data from PMAC into buffer inBuf_. If there is no data in the
socket buffer then issue pmac GETBUFFER command to get any outstanding data
@@ -530,7 +547,7 @@ asynStatus pmacAsynIPPort::readResponse(asynUser *pasynUser, size_t maxchars,
check for more response data on the PMAC */
if (pmacReadReady(pasynUser)) {
status = sendPmacGetBuffer(pasynUser, maxchars, nbytesTransfered);
status = sendPmacGetBuffer(pasynUser, maxchars);
asynPrintIO(pasynUser, ASYN_TRACE_FLOW,
reinterpret_cast<const char *>(&pinCmd_),
ETHERNET_CMD_HEADER, "%s write GETBUFFER\n", portName);
@@ -569,17 +586,10 @@ int pmacAsynIPPort::pmacReadReady(asynUser *pasynUser) {
char data[2] = {0};
asynStatus status;
size_t thisRead = 0;
size_t nbytesTransfered = 0;
int retval = 0;
cmd.RequestType = VR_UPLOAD;
cmd.Request = VR_PMAC_READREADY;
cmd.wValue = 0;
cmd.wIndex = 0;
cmd.wLength = htons(2);
status = socketWrite(pasynUser, reinterpret_cast<const char *>(&cmd),
ETHERNET_CMD_HEADER, &nbytesTransfered);
status = sendPmacCommand(pasynUser, cmd, VR_UPLOAD, VR_PMAC_READREADY, 0, 2,
nullptr);
if (status != asynSuccess) {
asynPrintIO(pasynUser, ASYN_TRACE_ERROR,
@@ -617,17 +627,10 @@ int pmacAsynIPPort::pmacFlush(asynUser *pasynUser) {
char data[2] = {0};
asynStatus status = asynSuccess;
size_t thisRead = 0;
size_t nbytesTransfered = 0;
int retval = 0;
cmd.RequestType = VR_DOWNLOAD;
cmd.Request = VR_PMAC_FLUSH;
cmd.wValue = 0;
cmd.wIndex = 0;
cmd.wLength = 0;
status = socketWrite(pasynUser, reinterpret_cast<const char *>(&cmd),
ETHERNET_CMD_HEADER, &nbytesTransfered);
status = sendPmacCommand(pasynUser, cmd, VR_DOWNLOAD, VR_PMAC_FLUSH, 0, 0,
nullptr);
if (status != asynSuccess) {
asynPrintIO(pasynUser, ASYN_TRACE_ERROR,
@@ -657,15 +660,9 @@ int pmacAsynIPPort::pmacFlush(asynUser *pasynUser) {
}
asynStatus pmacAsynIPPort::sendPmacGetBuffer(asynUser *pasynUser,
size_t maxchars,
size_t *nbytesTransfered) {
pinCmd_.RequestType = VR_UPLOAD;
pinCmd_.Request = VR_PMAC_GETBUFFER;
pinCmd_.wValue = 0;
pinCmd_.wIndex = 0;
pinCmd_.wLength = htons(maxchars);
return socketWrite(pasynUser, reinterpret_cast<const char *>(&pinCmd_),
ETHERNET_CMD_HEADER, nbytesTransfered);
size_t maxchars) {
return sendPmacCommand(pasynUser, pinCmd_, VR_UPLOAD, VR_PMAC_GETBUFFER, 0,
maxchars, nullptr);
}
/*
@@ -685,14 +682,8 @@ asynStatus pmacAsynIPPort::writeOctet(asynUser *pasynUser, const char *data,
buffer for control commands and do PMAC_GETRESPONSE and CTRL_RESPONSE
commands as necessary, */
if (numchars == 1 && strchr(ctrlCommands, data[0])) {
poutCmd_.RequestType = VR_UPLOAD;
poutCmd_.Request = VR_CTRL_RESPONSE;
poutCmd_.wValue = data[0];
poutCmd_.wIndex = 0;
poutCmd_.wLength = htons(0);
status =
socketWrite(pasynUser, reinterpret_cast<const char *>(&poutCmd_),
ETHERNET_CMD_HEADER, &nbytesActual);
status = sendPmacCommand(pasynUser, poutCmd_, VR_UPLOAD,
VR_CTRL_RESPONSE, data[0], 0, &nbytesActual);
*nbytesTransfered = nbytesActual == ETHERNET_CMD_HEADER ? numchars : 0;
} else {
if (numchars > ETHERNET_DATA_SIZE) {
@@ -819,8 +810,7 @@ asynStatus pmacAsynIPPort::readOctet(asynUser *pasynUser, char *data,
"pmacAsynIPPort::readOctet. Calling readResponse().\n");
if (!initialRead) {
if (pmacReadReady(pasynUser)) {
status = sendPmacGetBuffer(pasynUser, maxchars,
nbytesTransfered);
status = sendPmacGetBuffer(pasynUser, maxchars);
}
}
status =
+16 -2
View File
@@ -116,6 +116,9 @@ class HIDDEN pmacAsynIPPort : public asynPortDriver {
/**
* @brief Raw write to the TCP socket.
*
* If nbytesTransferred is not null, it receives the number of bytes that
* were sent to the socket.
*/
asynStatus socketWrite(asynUser *pasynUser, const char *data,
size_t numchars, size_t *nbytesWritten);
@@ -130,6 +133,18 @@ class HIDDEN pmacAsynIPPort : public asynPortDriver {
asynStatus pollSocket(asynUser *pasynUser, struct pollfd *pollfd,
int pollmsec, int *pollstatus);
/**
* @brief Fill in a PMAC ethernet command header and send it over the
* socket.
*
* Only the 8 byte command header is sent. Commands that carry a payload
* (e.g. GETRESPONSE in writeOctet) are sent directly via socketWrite.
*/
asynStatus sendPmacCommand(asynUser *pasynUser, EthernetCmd &cmd,
uint8_t requestType, uint8_t request,
uint16_t wValue, uint16_t wLength,
size_t *nbytesTransfered);
/**
* @brief Read response data from the PMAC into the internal input buffer
*
@@ -157,8 +172,7 @@ class HIDDEN pmacAsynIPPort : public asynPortDriver {
/**
* @brief Send a GETBUFFER command to the PMAC.
*/
asynStatus sendPmacGetBuffer(asynUser *pasynUser, size_t maxchars,
size_t *nbytesTransfered);
asynStatus sendPmacGetBuffer(asynUser *pasynUser, size_t maxchars);
// Host name and TCP port of the PMAC
std::string IPHostName_;