saving state

This commit is contained in:
2025-11-19 16:16:35 +01:00
parent 668dd65823
commit fdbb8f5061
4 changed files with 85 additions and 44 deletions

View File

@@ -27,3 +27,47 @@ record(bi, "$(INSTR)$(NAME):Enable_RBV")
field(ONAM, "ON")
field(SCAN, ".5 second")
}
record(longin,"$(INSTR)$(NAME):UDP_DROPPED")
{
field(DESC, "UDP Packets Missed")
field(EGU, "Events")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) DROP")
# field(SCAN, "I/O Intr")
field(SCAN, "1 second")
field(PINI, "YES")
}
record(longin,"$(INSTR)$(NAME):UDP_WATERMARK")
{
field(DESC, "UDP Queue Usage")
field(EGU, "%")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) UDP")
# field(SCAN, "I/O Intr")
field(SCAN, "1 second")
field(PINI, "YES")
}
record(longin,"$(INSTR)$(NAME):NORMALISED_WATERMARK")
{
field(DESC, "Normalised Queue Usage")
field(EGU, "%")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) NORM")
# field(SCAN, "I/O Intr")
field(SCAN, "1 second")
field(PINI, "YES")
}
record(longin,"$(INSTR)$(NAME):SORTED_WATERMARK")
{
field(DESC, "Sort Queue Usage")
field(EGU, "%")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) SORT")
# field(SCAN, "I/O Intr")
field(SCAN, "1 second")
field(PINI, "YES")
}

View File

@@ -236,39 +236,3 @@ record(ai, "$(INSTR)$(NAME):ELAPSED-TIME")
field(PINI, "YES")
# field(FLNK, "$(INSTR)$(NAME):ETO")
}
################################################################################
# Stream Generator Status PVs
record(longin,"$(INSTR)$(NAME):UDP_DROPPED")
{
field(DESC, "UDP Packets Missed")
field(EGU, "Events")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) DROP")
# field(SCAN, "I/O Intr")
field(SCAN, "1 second")
field(PINI, "YES")
}
record(longin,"$(INSTR)$(NAME):UDP_WATERMARK")
{
field(DESC, "UDP Queue Usage")
field(EGU, "%")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) UDP")
# field(SCAN, "I/O Intr")
field(SCAN, "1 second")
field(PINI, "YES")
}
record(longin,"$(INSTR)$(NAME):SORTED_WATERMARK")
{
field(DESC, "Partial Sort Queue Usage")
field(EGU, "%")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) SORT")
# field(SCAN, "I/O Intr")
field(SCAN, "1 second")
field(PINI, "YES")
}

View File

@@ -201,6 +201,8 @@ asynStreamGeneratorDriver::asynStreamGeneratorDriver(
status = createInt32Param(status, P_UdpDroppedString, &P_UdpDropped);
status = createInt32Param(status, P_UdpQueueHighWaterMarkString,
&P_UdpQueueHighWaterMark);
status = createInt32Param(status, P_NormalisedQueueHighWaterMarkString,
&P_NormalisedQueueHighWaterMark);
status = createInt32Param(status, P_SortedQueueHighWaterMarkString,
&P_SortedQueueHighWaterMark);
@@ -346,15 +348,26 @@ asynStatus asynStreamGeneratorDriver::readInt32(asynUser *pasynUser,
if (function == P_UdpQueueHighWaterMark) {
const double toPercent = 100. / (243. * udpQueueSize);
*value = (epicsInt32)(epicsRingBytesHighWaterMark(this->udpQueue) /
sizeof(NormalisedEvent) * toPercent);
*value =
(epicsInt32)(((double)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_NormalisedQueueHighWaterMark) {
const double toPercent = 100. / (243. * udpQueueSize);
*value = (epicsInt32)(((double)epicsRingBytesHighWaterMark(
this->normalisedQueue)) /
sizeof(NormalisedEvent) * toPercent);
// epicsRingBytesResetHighWaterMark(this->sortedQueue);
return asynSuccess;
} else if (function == P_SortedQueueHighWaterMark) {
const double toPercent = 100. / (243. * udpQueueSize);
*value = (epicsInt32)(epicsRingBytesHighWaterMark(this->sortedQueue) /
*value = (epicsInt32)(((double)epicsRingBytesHighWaterMark(
this->sortedQueue)) /
sizeof(NormalisedEvent) * toPercent);
// epicsRingBytesResetHighWaterMark(this->sortedQueue);
return asynSuccess;
@@ -781,15 +794,30 @@ void asynStreamGeneratorDriver::processEvents() {
"%s:%s: starting count: (%d, %d, %d, %" PRIu64 ")\n",
driverName, functionName, countPreset, timePreset,
presetChannel, startTimestamp);
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: starting count: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
driverName, functionName, eventsA[0].timestamp, eventsA[1].timestamp, eventsA[2].timestamp);
}
if (eventsA[std::max((std::size_t) 0, toProcess - 1)].timestamp < eventsA[0].timestamp)
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: time-span: %" PRIu64 " %" PRIu64 "\n",
driverName, functionName, eventsA[0].timestamp, eventsA[std::max((std::size_t) 0, toProcess - 1)].timestamp);
if (!std::is_sorted( eventsA, eventsA + toProcess, oldestEventsFirst ))
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: not sorted: %" PRIu64 " %" PRIu64 "\n",
driverName, functionName, eventsA[0].timestamp, eventsA[std::max((std::size_t) 0, toProcess - 1)].timestamp);
if (currStatus == STATUS_COUNTING) {
for (std::size_t i = 0; i < toProcess; ++i) {
counts[eventsA[i].source == 0 ? eventsA[i].pixelId
: this->num_channels - 1] += 1;
elapsedSeconds = (eventsA[i].timestamp - startTimestamp) / 1e9;
elapsedSeconds =
((double)(eventsA[i].timestamp - startTimestamp)) / 1e9;
const bool reachedCount =
countPreset && counts[presetChannel] >= countPreset;
@@ -798,10 +826,13 @@ void asynStreamGeneratorDriver::processEvents() {
if (reachedCount || reachedTime) {
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: reached preset: (%lld, %f)\n", driverName,
functionName, counts[presetChannel],
elapsedSeconds);
asynPrint(
pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: reached preset: (%d, %d) (%lld, %f, %" PRIu64
")\n",
driverName, functionName, reachedCount, reachedTime,
counts[presetChannel], elapsedSeconds,
eventsA[i].timestamp);
// TODO should really check there an no more events with the
// same final timestamp

View File

@@ -141,6 +141,7 @@ constexpr static char P_ClearCountsString[]{"C_%" PRIu64};
constexpr static char P_UdpDroppedString[]{"DROP"};
constexpr static char P_UdpQueueHighWaterMarkString[]{"UDP"};
constexpr static char P_NormalisedQueueHighWaterMarkString[]{"NORM"};
constexpr static char P_SortedQueueHighWaterMarkString[]{"SORT"};
/*******************************************************************************
@@ -188,6 +189,7 @@ class asynStreamGeneratorDriver : public asynPortDriver {
// System Status Parameter Identifying IDs
int P_UdpDropped;
int P_UdpQueueHighWaterMark;
int P_NormalisedQueueHighWaterMark;
int P_SortedQueueHighWaterMark;
private: