shows queue usage as a percentage

This commit is contained in:
2025-11-07 14:28:01 +01:00
parent 77ed74a203
commit ba07a8af9b
3 changed files with 21 additions and 13 deletions

View File

@@ -96,8 +96,10 @@ asynStatus asynStreamGeneratorDriver::createInt32Param(
setIntegerParam(*variable, initialValue));
}
asynStatus asynStreamGeneratorDriver::createFloat64Param(
asynStatus status, char *name, int *variable, double initialValue) {
asynStatus asynStreamGeneratorDriver::createFloat64Param(asynStatus status,
char *name,
int *variable,
double initialValue) {
// TODO should show error if there is one
return (asynStatus)(status | createParam(name, asynParamFloat64, variable) |
setDoubleParam(*variable, initialValue));
@@ -114,7 +116,7 @@ asynStreamGeneratorDriver::asynStreamGeneratorDriver(
const int kafkaMaxPacketSize)
: asynPortDriver(portName, 1, /* maxAddr */
asynInt32Mask | asynFloat64Mask |
asynDrvUserMask, /* Interface mask */
asynDrvUserMask, /* Interface mask */
asynInt32Mask, // | asynFloat64Mask, /* Interrupt mask */
0, /* asynFlags. This driver does not block and it is
not multi-device, but has a
@@ -125,6 +127,7 @@ asynStreamGeneratorDriver::asynStreamGeneratorDriver(
0), /* Default stack size*/
num_channels(numChannels + 1), kafkaEnabled(enableKafkaStream),
monitorTopic(monitorTopic), detectorTopic(detectorTopic),
udpQueueSize(udpQueueSize), kafkaQueueSize(kafkaQueueSize),
// measured in max packet sizes
udpQueue(
epicsRingBytesCreate(243 * udpQueueSize * sizeof(NormalisedEvent))),
@@ -308,15 +311,17 @@ asynStatus asynStreamGeneratorDriver::readInt32(asynUser *pasynUser,
getParamName(function, &paramName);
if (function == P_UdpQueueHighWaterMark) {
*value = epicsRingBytesHighWaterMark(this->udpQueue) /
sizeof(NormalisedEvent);
const double toPercent = 100. / (243. * udpQueueSize);
*value = (epicsInt32)(epicsRingBytesHighWaterMark(this->udpQueue) /
sizeof(NormalisedEvent) * toPercent);
// Aparently resetting the watermark causes problems...
// at least concurrently :D
// epicsRingBytesResetHighWaterMark(this->udpQueue);
return asynSuccess;
} else if (function == P_SortedQueueHighWaterMark) {
*value = epicsRingBytesHighWaterMark(this->sortedQueue) /
sizeof(NormalisedEvent);
const double toPercent = 100. / (243. * udpQueueSize);
*value = (epicsInt32)(epicsRingBytesHighWaterMark(this->sortedQueue) /
sizeof(NormalisedEvent) * toPercent);
// epicsRingBytesResetHighWaterMark(this->sortedQueue);
return asynSuccess;
}