Compare commits

..

7 Commits
1.5.0 ... 1.5.4

Author SHA1 Message Date
902b18d038 Excempt EPICS libraries from -Weffc++
All checks were successful
Test And Build / Lint (push) Successful in 6s
Test And Build / Build (push) Successful in 7s
2025-09-17 12:18:06 +02:00
0e10bcf69d Fixed some more warnings
All checks were successful
Test And Build / Lint (push) Successful in 5s
Test And Build / Build (push) Successful in 6s
2025-09-17 11:28:12 +02:00
cb4adb068c Fixed some warnings
All checks were successful
Test And Build / Lint (push) Successful in 6s
Test And Build / Build (push) Successful in 5s
2025-09-17 11:24:15 +02:00
d7c9d009ee Better solution for suppressing unused variable warning
All checks were successful
Test And Build / Lint (push) Successful in 5s
Test And Build / Build (push) Successful in 5s
2025-09-17 11:08:24 +02:00
3ab40a8bf5 Fixed compiler warnings
Some checks failed
Test And Build / Lint (push) Failing after 2s
Test And Build / Build (push) Successful in 7s
2025-09-17 10:52:56 +02:00
0478854007 Added compiler flags to improve code quality 2025-09-17 10:25:50 +02:00
9a32532c22 Expanded error messageto give users the ability to help themselves
All checks were successful
Test And Build / Lint (push) Successful in 5s
Test And Build / Build (push) Successful in 6s
2025-09-17 10:24:07 +02:00
7 changed files with 150 additions and 55 deletions

View File

@@ -26,6 +26,7 @@ TEMPLATES += db/sinqMotor.db
# This file registers the motor-specific functions in the IOC shell. # This file registers the motor-specific functions in the IOC shell.
DBDS += src/sinqMotor.dbd DBDS += src/sinqMotor.dbd
USR_CFLAGS += -Wall -Wextra -Weffc++ -Wunused-result # -Werror USR_CFLAGS += -Wall -Wextra -Wunused-result # -Werror
USR_CXXFLAGS += -Wall -Wextra -Wunused-result
# MISCS would be the place to keep the stream device template files # MISCS would be the place to keep the stream device template files

View File

@@ -5,17 +5,13 @@
msgPrintControlKey::msgPrintControlKey(char *controller, int axisNo, msgPrintControlKey::msgPrintControlKey(char *controller, int axisNo,
const char *functionName, int line, const char *functionName, int line,
size_t maxRepetitions) { size_t maxRepetitions)
controller_ = controller; : controller_(controller), axisNo_(axisNo), functionName_(functionName),
axisNo_ = axisNo; line_(line), maxRepetitions_(maxRepetitions) {}
line_ = line;
functionName_ = functionName;
maxRepetitions_ = maxRepetitions;
}
void msgPrintControlKey::format(char *buffer, size_t bufferSize) { void msgPrintControlKey::format(char *buffer, size_t bufferSize) {
snprintf(buffer, bufferSize, "controller %s, axis %d, function %s, line %d", snprintf(buffer, bufferSize, "controller %s, axis %d, function %s, line %d",
controller_.c_str(), axisNo_, functionName_, line_); controller_.c_str(), axisNo_, functionName_.c_str(), line_);
} }
// ============================================================================= // =============================================================================
@@ -78,8 +74,8 @@ bool msgPrintControl::shouldBePrinted(msgPrintControlKey &key, bool wantToPrint,
pasynUser, ASYN_TRACE_ERROR, pasynUser, ASYN_TRACE_ERROR,
"Controller \"%s\", axis %d => %s, line %d\nError " "Controller \"%s\", axis %d => %s, line %d\nError "
"associated with key \"%s\" has been resolved.\n", "associated with key \"%s\" has been resolved.\n",
key.controller_.c_str(), key.axisNo_, key.functionName_, key.controller_.c_str(), key.axisNo_,
key.line_, formattedKey); key.functionName_.c_str(), key.line_, formattedKey);
} }
map_[key] = 0; map_[key] = 0;
} }
@@ -92,8 +88,8 @@ bool msgPrintControl::shouldBePrinted(char *portName, int axisNo,
const char *functionName, int line, const char *functionName, int line,
bool wantToPrint, asynUser *pasynUser, bool wantToPrint, asynUser *pasynUser,
size_t maxRepetitions) { size_t maxRepetitions) {
msgPrintControlKey key = msgPrintControlKey key = msgPrintControlKey(portName, axisNo, functionName,
msgPrintControlKey(portName, axisNo, functionName, __LINE__); line, maxRepetitions);
return shouldBePrinted(key, wantToPrint, pasynUser); return shouldBePrinted(key, wantToPrint, pasynUser);
} }
@@ -107,7 +103,7 @@ void msgPrintControl::resetCount(msgPrintControlKey &key, asynUser *pasynUser) {
"Controller \"%s\", axis %d => %s, line %d\nError " "Controller \"%s\", axis %d => %s, line %d\nError "
"associated with key \"%s\" has been resolved.\n", "associated with key \"%s\" has been resolved.\n",
key.controller_.c_str(), key.axisNo_, key.controller_.c_str(), key.axisNo_,
key.functionName_, key.line_, formattedKey); key.functionName_.c_str(), key.line_, formattedKey);
} }
map_[key] = 0; map_[key] = 0;
} }

View File

@@ -23,7 +23,7 @@ class HIDDEN msgPrintControlKey {
// -1 indicates a non-axis specific message // -1 indicates a non-axis specific message
int axisNo_; int axisNo_;
const char *functionName_; std::string functionName_;
int line_; int line_;
/** /**
@@ -38,7 +38,7 @@ class HIDDEN msgPrintControlKey {
bool operator==(const msgPrintControlKey &other) const { bool operator==(const msgPrintControlKey &other) const {
return axisNo_ == other.axisNo_ && line_ == other.line_ && return axisNo_ == other.axisNo_ && line_ == other.line_ &&
strcmp(functionName_, other.functionName_) == 0 && functionName_ == other.functionName_ &&
controller_ == other.controller_; controller_ == other.controller_;
} }
@@ -55,7 +55,7 @@ template <> struct hash<msgPrintControlKey> {
// Combine the hashes of the members (x and y) // Combine the hashes of the members (x and y)
size_t h1 = std::hash<std::string>{}(obj.controller_); size_t h1 = std::hash<std::string>{}(obj.controller_);
size_t h2 = hash<int>{}(obj.axisNo_); size_t h2 = hash<int>{}(obj.axisNo_);
size_t h3 = std::hash<const char *>{}(obj.functionName_); size_t h3 = std::hash<std::string>{}(obj.functionName_);
size_t h4 = hash<int>{}(obj.line_); size_t h4 = hash<int>{}(obj.line_);
// Combine the hashes (simple XOR and shifting technique) // Combine the hashes (simple XOR and shifting technique)
return h1 ^ (h2 << 1) ^ (h3 << 2) ^ (h4 << 3); return h1 ^ (h2 << 1) ^ (h3 << 2) ^ (h4 << 3);

View File

@@ -1,12 +1,20 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
#include "sinqAxis.h" // The EPICS libaries do not follow -Weffc++
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include "epicsExport.h" #include "epicsExport.h"
#include "iocsh.h" #include "iocsh.h"
#include "msgPrintControl.h"
#include "sinqController.h"
#include <epicsTime.h> #include <epicsTime.h>
#include <errlog.h> #include <errlog.h>
#pragma GCC diagnostic pop
#include "sinqAxis.h"
#include "msgPrintControl.h"
#include "sinqController.h"
#include <math.h> #include <math.h>
#include <unistd.h> #include <unistd.h>
@@ -318,7 +326,12 @@ asynStatus sinqAxis::forcedPoll(bool *moving) {
return poll_status; return poll_status;
} }
asynStatus sinqAxis::doPoll(bool *moving) { return asynSuccess; } asynStatus sinqAxis::doPoll(bool *moving) {
// Suppress unused variable warning - this is just a default fallback
// function.
(void)moving;
return asynSuccess;
}
asynStatus sinqAxis::move(double position, int relative, double minVelocity, asynStatus sinqAxis::move(double position, int relative, double minVelocity,
double maxVelocity, double acceleration) { double maxVelocity, double acceleration) {
@@ -356,6 +369,13 @@ asynStatus sinqAxis::move(double position, int relative, double minVelocity,
asynStatus sinqAxis::doMove(double position, int relative, double minVelocity, asynStatus sinqAxis::doMove(double position, int relative, double minVelocity,
double maxVelocity, double acceleration) { double maxVelocity, double acceleration) {
// Suppress unused variable warning - this is just a default fallback
// function.
(void)position;
(void)relative;
(void)minVelocity;
(void)maxVelocity;
(void)acceleration;
return asynSuccess; return asynSuccess;
} }
@@ -399,6 +419,12 @@ asynStatus sinqAxis::home(double minVelocity, double maxVelocity,
asynStatus sinqAxis::doHome(double minVelocity, double maxVelocity, asynStatus sinqAxis::doHome(double minVelocity, double maxVelocity,
double acceleration, int forwards) { double acceleration, int forwards) {
// Suppress unused variable warning - this is just a default fallback
// function.
(void)minVelocity;
(void)maxVelocity;
(void)acceleration;
(void)forwards;
return asynSuccess; return asynSuccess;
} }
@@ -420,7 +446,12 @@ asynStatus sinqAxis::reset() {
asynStatus sinqAxis::doReset() { return asynError; } asynStatus sinqAxis::doReset() { return asynError; }
asynStatus sinqAxis::enable(bool on) { return asynSuccess; } asynStatus sinqAxis::enable(bool on) {
// Suppress unused variable warning - this is just a default fallback
// function.
(void)on;
return asynSuccess;
}
asynStatus sinqAxis::motorPosition(double *motorPos) { asynStatus sinqAxis::motorPosition(double *motorPos) {
asynStatus status = asynSuccess; asynStatus status = asynSuccess;
@@ -482,9 +513,9 @@ asynStatus sinqAxis::setVeloFields(double velo, double vbas, double vmax) {
"vmax=%lf.\n", "vmax=%lf.\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__,
vbas, vmax); vbas, vmax);
setAxisParamChecked( setAxisParamChecked(this, motorMessageText,
this, motorMessageText, "Lower speed limit must not be smaller than "
"Lower speed limit must not be smaller than upper speed limit"); "upper speed limit. Please call the support.");
return asynError; return asynError;
} }
if (velo < vbas || velo > vmax) { if (velo < vbas || velo > vmax) {
@@ -495,8 +526,10 @@ asynStatus sinqAxis::setVeloFields(double velo, double vbas, double vmax) {
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__,
velo, vbas, vmax); velo, vbas, vmax);
setAxisParamChecked(this, motorMessageText, setAxisParamChecked(
"Speed is not inside limits"); this, motorMessageText,
"Speed is not inside limits. Set a new valid speed and try "
"to move the motor. Otherwise, please call the support.");
return asynError; return asynError;
} }
@@ -709,8 +742,9 @@ static const iocshArg setWatchdogEnabledArg2 = {
"Enabling / disabling the watchdog", iocshArgInt}; "Enabling / disabling the watchdog", iocshArgInt};
static const iocshArg *const setWatchdogEnabledArgs[] = { static const iocshArg *const setWatchdogEnabledArgs[] = {
&setWatchdogEnabledArg0, &setWatchdogEnabledArg1, &setWatchdogEnabledArg2}; &setWatchdogEnabledArg0, &setWatchdogEnabledArg1, &setWatchdogEnabledArg2};
static const iocshFuncDef setWatchdogEnabledDef = {"setWatchdogEnabled", 3, static const iocshFuncDef setWatchdogEnabledDef = {
setWatchdogEnabledArgs}; "setWatchdogEnabled", 3, setWatchdogEnabledArgs,
"Set to 0 to disable the watchdog and to any other value to enable it."};
static void setWatchdogEnabledCallFunc(const iocshArgBuf *args) { static void setWatchdogEnabledCallFunc(const iocshArgBuf *args) {
setWatchdogEnabled(args[0].sval, args[1].ival, args[2].ival); setWatchdogEnabled(args[0].sval, args[1].ival, args[2].ival);
@@ -756,8 +790,9 @@ static const iocshArg setOffsetMovTimeoutArg2 = {"Offset timeout for movement",
static const iocshArg *const setOffsetMovTimeoutArgs[] = { static const iocshArg *const setOffsetMovTimeoutArgs[] = {
&setOffsetMovTimeoutArg0, &setOffsetMovTimeoutArg1, &setOffsetMovTimeoutArg0, &setOffsetMovTimeoutArg1,
&setOffsetMovTimeoutArg2}; &setOffsetMovTimeoutArg2};
static const iocshFuncDef setOffsetMovTimeoutDef = {"setOffsetMovTimeout", 3, static const iocshFuncDef setOffsetMovTimeoutDef = {
setOffsetMovTimeoutArgs}; "setOffsetMovTimeout", 3, setOffsetMovTimeoutArgs,
"Specify an offset (in seconds) for the movement timeout watchdog"};
static void setOffsetMovTimeoutCallFunc(const iocshArgBuf *args) { static void setOffsetMovTimeoutCallFunc(const iocshArgBuf *args) {
setOffsetMovTimeout(args[0].sval, args[1].ival, args[2].dval); setOffsetMovTimeout(args[0].sval, args[1].ival, args[2].dval);
@@ -803,8 +838,9 @@ static const iocshArg setScaleMovTimeoutArg2 = {
"Multiplier for calculated move time", iocshArgDouble}; "Multiplier for calculated move time", iocshArgDouble};
static const iocshArg *const setScaleMovTimeoutArgs[] = { static const iocshArg *const setScaleMovTimeoutArgs[] = {
&setScaleMovTimeoutArg0, &setScaleMovTimeoutArg1, &setScaleMovTimeoutArg2}; &setScaleMovTimeoutArg0, &setScaleMovTimeoutArg1, &setScaleMovTimeoutArg2};
static const iocshFuncDef setScaleMovTimeoutDef = {"setScaleMovTimeout", 3, static const iocshFuncDef setScaleMovTimeoutDef = {
setScaleMovTimeoutArgs}; "setScaleMovTimeout", 3, setScaleMovTimeoutArgs,
"Set a scaling factor for the maximum expected movement time."};
static void setScaleMovTimeoutCallFunc(const iocshArgBuf *args) { static void setScaleMovTimeoutCallFunc(const iocshArgBuf *args) {
setScaleMovTimeout(args[0].sval, args[1].ival, args[2].dval); setScaleMovTimeout(args[0].sval, args[1].ival, args[2].dval);

View File

@@ -8,8 +8,16 @@ Stefan Mathis, November 2024
#ifndef sinqAxis_H #ifndef sinqAxis_H
#define sinqAxis_H #define sinqAxis_H
// The EPICS libaries do not follow -Weffc++
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include "asynMotorAxis.h" #include "asynMotorAxis.h"
#include <macros.h> #include "macros.h"
#pragma GCC diagnostic pop
#include <memory> #include <memory>
#include <type_traits> #include <type_traits>
@@ -32,6 +40,13 @@ class HIDDEN sinqAxis : public asynMotorAxis {
*/ */
~sinqAxis(); ~sinqAxis();
/**
* @brief Delete the copy and copy assignment constructors, because this
* class should not be copied (it is tied to hardware!)
*/
sinqAxis(const sinqAxis &) = delete;
sinqAxis &operator=(const sinqAxis &) = delete;
/** /**
* @brief Check if a poll should be performed. If yes, call `forcedPoll`. * @brief Check if a poll should be performed. If yes, call `forcedPoll`.
* *
@@ -606,7 +621,7 @@ template <typename A, typename C>
asynStatus getAxisParamImpl(A *axis, C *controller, const char *indexName, asynStatus getAxisParamImpl(A *axis, C *controller, const char *indexName,
int (C::*func)(), int *readValue, int (C::*func)(), int *readValue,
const char *callerFunctionName, int lineNumber, const char *callerFunctionName, int lineNumber,
size_t msgSize, TypeTag<int>) { size_t /*msgSize*/, TypeTag<int>) {
int indexValue = (controller->*func)(); int indexValue = (controller->*func)();
asynStatus status = asynStatus status =
controller->getIntegerParam(axis->axisNo(), indexValue, readValue); controller->getIntegerParam(axis->axisNo(), indexValue, readValue);
@@ -634,7 +649,7 @@ template <typename A, typename C>
asynStatus getAxisParamImpl(A *axis, C *controller, const char *indexName, asynStatus getAxisParamImpl(A *axis, C *controller, const char *indexName,
int (C::*func)(), double *readValue, int (C::*func)(), double *readValue,
const char *callerFunctionName, int lineNumber, const char *callerFunctionName, int lineNumber,
size_t msgSize, TypeTag<double>) { size_t /*msgSize*/, TypeTag<double>) {
int indexValue = (controller->*func)(); int indexValue = (controller->*func)();
asynStatus status = asynStatus status =
controller->getDoubleParam(axis->axisNo(), indexValue, readValue); controller->getDoubleParam(axis->axisNo(), indexValue, readValue);
@@ -665,7 +680,7 @@ template <typename A, typename C>
asynStatus getAxisParamImpl(A *axis, C *controller, const char *indexName, asynStatus getAxisParamImpl(A *axis, C *controller, const char *indexName,
int (C::*func)(), std::string *readValue, int (C::*func)(), std::string *readValue,
const char *callerFunctionName, int lineNumber, const char *callerFunctionName, int lineNumber,
size_t msgSize, TypeTag<std::string>) { size_t /*msgSize*/, TypeTag<std::string>) {
int indexValue = (controller->*func)(); int indexValue = (controller->*func)();
// Convert the pointer to a reference, since getStringParam expects the // Convert the pointer to a reference, since getStringParam expects the

View File

@@ -1,15 +1,22 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
#include "sinqController.h" // The EPICS libaries do not follow -Weffc++
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include "asynMotorController.h" #include "asynMotorController.h"
#include "asynOctetSyncIO.h" #include "asynOctetSyncIO.h"
#include "epicsExport.h" #include "epicsExport.h"
#include "iocsh.h" #include "iocsh.h"
#include "msgPrintControl.h"
#include "sinqAxis.h"
#include <deque>
#include <errlog.h> #include <errlog.h>
#include <initHooks.h> #include <initHooks.h>
#pragma GCC diagnostic pop
#include "msgPrintControl.h"
#include "sinqAxis.h"
#include "sinqController.h"
#include <deque>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
@@ -119,15 +126,35 @@ sinqController::sinqController(const char *portName,
asynStatus status = asynSuccess; asynStatus status = asynSuccess;
// The paramLib indices are populated with the calls to createParam // The paramLib indices are populated with the calls to createParam
pSinqC_ = std::make_unique<sinqControllerImpl>( pSinqC_ = std::make_unique<sinqControllerImpl>((sinqControllerImpl){
(sinqControllerImpl){.outstandingForcedFastPolls = 0, .outstandingForcedFastPolls = 0,
.pasynOctetSyncIOipPort = nullptr, .pasynOctetSyncIOipPort = nullptr,
.msgPrintC = msgPrintControl(), .msgPrintC = msgPrintControl(),
.comTimeoutWindow = 3600, .comTimeoutWindow = 3600,
.maxNumberTimeouts = 60, .maxNumberTimeouts = 60,
.timeoutEvents = {}, .timeoutEvents = {},
.maxSubsequentTimeouts = 10, .maxSubsequentTimeouts = 10,
.maxSubsequentTimeoutsExceeded = false}); .maxSubsequentTimeoutsExceeded = false,
.motorMessageText = 0,
.motorReset = 0,
.motorEnable = 0,
.motorEnableRBV = 0,
.motorCanDisable = 0,
.motorEnableMovWatchdog = 0,
.motorCanSetSpeed = 0,
.motorLimitsOffset = 0,
.motorForceStop = 0,
.motorConnected = 0,
.motorVeloFromDriver = 0,
.motorVbasFromDriver = 0,
.motorVmaxFromDriver = 0,
.motorAcclFromDriver = 0,
.motorHighLimitFromDriver = 0,
.motorLowLimitFromDriver = 0,
.motorPositionDeadband = 0,
.adaptivePolling = 0,
.encoderType = 0,
});
// Store the poll period information. The poller itself will be started // Store the poll period information. The poller itself will be started
// later (after the IOC is running in epicsInithookFunction) // later (after the IOC is running in epicsInithookFunction)
@@ -824,7 +851,8 @@ static const iocshArg *const setThresholdComTimeoutArgs[] = {
&setThresholdComTimeoutArg0, &setThresholdComTimeoutArg1, &setThresholdComTimeoutArg0, &setThresholdComTimeoutArg1,
&setThresholdComTimeoutArg2}; &setThresholdComTimeoutArg2};
static const iocshFuncDef setThresholdComTimeoutDef = { static const iocshFuncDef setThresholdComTimeoutDef = {
"setThresholdComTimeout", 3, setThresholdComTimeoutArgs}; "setThresholdComTimeout", 3, setThresholdComTimeoutArgs,
"Set the communication timeout threshold in seconds"};
static void setThresholdComTimeoutCallFunc(const iocshArgBuf *args) { static void setThresholdComTimeoutCallFunc(const iocshArgBuf *args) {
setThresholdComTimeout(args[0].sval, args[1].ival, args[2].ival); setThresholdComTimeout(args[0].sval, args[1].ival, args[2].ival);
@@ -885,7 +913,9 @@ static const iocshArg SetMaxSubsequentTimeoutsArg1 = {
static const iocshArg *const SetMaxSubsequentTimeoutsArgs[] = { static const iocshArg *const SetMaxSubsequentTimeoutsArgs[] = {
&SetMaxSubsequentTimeoutsArg0, &SetMaxSubsequentTimeoutsArg1}; &SetMaxSubsequentTimeoutsArg0, &SetMaxSubsequentTimeoutsArg1};
static const iocshFuncDef setMaxSubsequentTimeoutsDef = { static const iocshFuncDef setMaxSubsequentTimeoutsDef = {
"setMaxSubsequentTimeouts", 2, SetMaxSubsequentTimeoutsArgs}; "setMaxSubsequentTimeouts", 2, SetMaxSubsequentTimeoutsArgs,
"Set the maximum number of subsequent timeouts before the user receives an "
"error message"};
static void setMaxSubsequentTimeoutsCallFunc(const iocshArgBuf *args) { static void setMaxSubsequentTimeoutsCallFunc(const iocshArgBuf *args) {
setMaxSubsequentTimeouts(args[0].sval, args[1].ival); setMaxSubsequentTimeouts(args[0].sval, args[1].ival);
} }
@@ -939,13 +969,15 @@ asynStatus setForcedFastPolls(const char *portName, int forcedFastPolls) {
static const iocshArg SetForcedFastPollsArg0 = {"Controller name (e.g. mcu1)", static const iocshArg SetForcedFastPollsArg0 = {"Controller name (e.g. mcu1)",
iocshArgString}; iocshArgString};
static const iocshArg SetForcedFastPollsArg1 = { static const iocshArg SetForcedFastPollsArg1 = {
"Number of fast polls after \"waking\" the poller (e.g. after issueing a " "Number of fast polls after \"waking\" the poller (e.g. after issuing a "
"move command).", "move command).",
iocshArgInt}; iocshArgInt};
static const iocshArg *const SetForcedFastPollsArgs[] = { static const iocshArg *const SetForcedFastPollsArgs[] = {
&SetForcedFastPollsArg0, &SetForcedFastPollsArg1}; &SetForcedFastPollsArg0, &SetForcedFastPollsArg1};
static const iocshFuncDef setForcedFastPollsDef = {"setForcedFastPolls", 2, static const iocshFuncDef setForcedFastPollsDef = {
SetForcedFastPollsArgs}; "setForcedFastPolls", 2, SetForcedFastPollsArgs,
"Set the number of fast polls after \"waking\" the poller (e.g. after "
"issuing a move command)."};
static void setForcedFastPollsCallFunc(const iocshArgBuf *args) { static void setForcedFastPollsCallFunc(const iocshArgBuf *args) {
setForcedFastPolls(args[0].sval, args[1].ival); setForcedFastPolls(args[0].sval, args[1].ival);
} }

View File

@@ -9,10 +9,18 @@ Stefan Mathis, November 2024
#ifndef sinqController_H #ifndef sinqController_H
#define sinqController_H #define sinqController_H
// The EPICS libaries do not follow -Weffc++
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include "asynMotorController.h" #include "asynMotorController.h"
#include "msgPrintControl.h" #include "msgPrintControl.h"
#include <initHooks.h> #include <initHooks.h>
#include <macros.h> #include <macros.h>
#pragma GCC diagnostic pop
#include <memory> #include <memory>
#define motorMessageIsFromDriverString "MOTOR_MESSAGE_DRIVER" #define motorMessageIsFromDriverString "MOTOR_MESSAGE_DRIVER"
@@ -58,6 +66,13 @@ class HIDDEN sinqController : public asynMotorController {
*/ */
virtual ~sinqController(void); virtual ~sinqController(void);
/**
* @brief Delete the copy and copy assignment constructors, because this
* class should not be copied (it is tied to hardware!)
*/
sinqController(const sinqController &) = delete;
sinqController &operator=(const sinqController &) = delete;
/** /**
* @brief Overloaded function of asynMotorController * @brief Overloaded function of asynMotorController
* *