From 2a060b21360f9e07787b3bbbd5d4d05de840aba8 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Tue, 5 Aug 2025 14:36:12 +0100 Subject: [PATCH] Add waitForDebugger --- utilitiesApp/src/Makefile | 2 +- utilitiesApp/src/utilities.dbd | 1 + utilitiesApp/src/utilities.h | 2 + utilitiesApp/src/waitForDebugger.cpp | 88 ++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 utilitiesApp/src/waitForDebugger.cpp diff --git a/utilitiesApp/src/Makefile b/utilitiesApp/src/Makefile index 56e52bb..913df67 100644 --- a/utilitiesApp/src/Makefile +++ b/utilitiesApp/src/Makefile @@ -25,7 +25,7 @@ INC += utilities.h win32_dirent.h ibexSeqPVmacros.h # specify all source files to be compiled and added to the library utilities_SRCS += iocname.cpp trimString.cpp ioccalc.cpp iocdcalc.cpp compress.cpp mkdir.cpp iocstringtest.cpp iocshHelpers.cpp utilities_SRCS += FileList.cpp json.cpp dbLoadRecordsFuncs.cpp iocshCmdFuncs.cpp freeIPPort.cpp msgBox.cpp -utilities_SRCS_WIN32 += win32_dirent.c getProcessUptime.cpp putDbAndWait.cpp +utilities_SRCS_WIN32 += win32_dirent.c getProcessUptime.cpp putDbAndWait.cpp waitForDebugger.cpp utilities_SRCS += find_calibration_range.c find_calibration_range_impl.cpp find_calibration_range_utils.cpp diff --git a/utilitiesApp/src/utilities.dbd b/utilitiesApp/src/utilities.dbd index 8cee68f..3b3494a 100644 --- a/utilitiesApp/src/utilities.dbd +++ b/utilitiesApp/src/utilities.dbd @@ -8,4 +8,5 @@ registrar(dbLoadRecordsFuncsRegister) registrar(iocshCmdFuncsRegister) registrar(freeIPPortRegister) registrar(msgBoxRegister) +registrar(waitForDebuggerRegister) function(find_calibration_range) diff --git a/utilitiesApp/src/utilities.h b/utilitiesApp/src/utilities.h index ca0fab8..1d2f9db 100644 --- a/utilitiesApp/src/utilities.h +++ b/utilitiesApp/src/utilities.h @@ -35,6 +35,8 @@ epicsShareFunc double getProcessUptime(const char* procExecutableName); epicsShareFunc int putDbAndWait(const std::string& pvName, const void *value, double timeout); +epicsShareFunc int waitForDebugger(int timeout); + #ifdef _WIN32 #include "win32_dirent.h" #else diff --git a/utilitiesApp/src/waitForDebugger.cpp b/utilitiesApp/src/waitForDebugger.cpp new file mode 100644 index 0000000..0b0327a --- /dev/null +++ b/utilitiesApp/src/waitForDebugger.cpp @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#include "epicsStdlib.h" +#include "epicsString.h" +#include "epicsStdio.h" +#include "dbDefs.h" +#include "epicsMutex.h" +#include "dbBase.h" +#include "dbStaticLib.h" +#include "dbFldTypes.h" +#include "dbCommon.h" +#include "dbAccessDefs.h" +#include +#include +#include +#include +#include +#include +#include +#include "envDefs.h" +#include "macLib.h" +#include "errlog.h" +#include "pcrecpp.h" + +#include +#include +#include + +#include + +#include "utilities.h" + +// 0 on success, -1 on timeout +epicsShareFunc int waitForDebugger(int timeout) +{ + epicsTimeStamp start_time, current; + epicsTimeGetCurrent(&start_time); + while(true) { + if (IsDebuggerPresent()) { + return 0; + } + epicsTimeGetCurrent(¤t); + if (timeout > 0 && epicsTimeDiffInSeconds(¤t, &start_time) > timeout) { + return -1; + } + } +} + +extern "C" { + +// EPICS iocsh shell commands + +static const iocshArg waitForDebuggerInitArg0 = { "timeout", iocshArgInt }; +static const iocshArg * const waitForDebuggerInitArgs[] = { &waitForDebuggerInitArg0 }; + +static const iocshFuncDef waitForDebuggerDef = {"waitForDebugger", sizeof(waitForDebuggerInitArgs) / sizeof(iocshArg*), waitForDebuggerInitArgs}; + +static void waitForDebuggerInitCallFunc(const iocshArgBuf *args) +{ + waitForDebugger(args[0].ival); +} + +static void waitForDebuggerRegister(void) +{ + iocshRegister(&waitForDebuggerDef, waitForDebuggerInitCallFunc); +} + +epicsExportRegistrar(waitForDebuggerRegister); // need to be declared via registrar() in utilities.dbd too + +}