Compare commits

...

6 Commits

Author SHA1 Message Date
59a5ba452f Fixed ordering
All checks were successful
Test And Build / Build (push) Successful in 6s
Test And Build / Lint (push) Successful in 5s
2025-09-17 12:37:55 +02:00
6dc2b131f7 Exempt EPICS libraries from -Weffc++
Some checks failed
Test And Build / Build (push) Failing after 6s
Test And Build / Lint (push) Successful in 26s
2025-09-17 12:33:58 +02:00
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
6 changed files with 166 additions and 89 deletions

View File

@@ -5,21 +5,19 @@
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_);
} }
// ============================================================================= // =============================================================================
msgPrintControl::msgPrintControl() : map_(), suffix_{} {}
msgPrintControl::~msgPrintControl() = default; msgPrintControl::~msgPrintControl() = default;
bool msgPrintControl::shouldBePrinted(msgPrintControlKey &key, bool wantToPrint, bool msgPrintControl::shouldBePrinted(msgPrintControlKey &key, bool wantToPrint,
@@ -78,8 +76,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;
} }
@@ -107,7 +105,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

@@ -5,8 +5,15 @@
#define DefaultMaxRepetitions 4 #define DefaultMaxRepetitions 4
#include <asynDriver.h> // The EPICS libaries do not follow -Weffc++
#include <macros.h> #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#include "asynDriver.h"
#include "macros.h"
#pragma GCC diagnostic pop
#include <string.h> #include <string.h>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
@@ -18,12 +25,23 @@
*/ */
class HIDDEN msgPrintControlKey { class HIDDEN msgPrintControlKey {
public: public:
msgPrintControlKey(char *controller_, int axisNo, const char *fileName,
int line, size_t maxRepetitions = DefaultMaxRepetitions);
bool operator==(const msgPrintControlKey &other) const {
return axisNo_ == other.axisNo_ && line_ == other.line_ &&
functionName_ == other.functionName_ &&
controller_ == other.controller_;
}
void format(char *buffer, size_t bufferSize);
std::string controller_; std::string controller_;
// -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_;
/** /**
@@ -32,17 +50,6 @@ class HIDDEN msgPrintControlKey {
* *
*/ */
size_t maxRepetitions_; size_t maxRepetitions_;
msgPrintControlKey(char *controller_, int axisNo, const char *fileName,
int line, size_t maxRepetitions = DefaultMaxRepetitions);
bool operator==(const msgPrintControlKey &other) const {
return axisNo_ == other.axisNo_ && line_ == other.line_ &&
strcmp(functionName_, other.functionName_) == 0 &&
controller_ == other.controller_;
}
void format(char *buffer, size_t bufferSize);
}; };
/** /**
@@ -55,7 +62,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);
@@ -85,6 +92,12 @@ template <> struct hash<msgPrintControlKey> {
*/ */
class HIDDEN msgPrintControl { class HIDDEN msgPrintControl {
public: public:
/**
* @brief Construct a new msgPrintControl object
*
*/
msgPrintControl();
/** /**
* @brief Destroy the msgPrintControl object * @brief Destroy the msgPrintControl object
* *

View File

@@ -1,12 +1,19 @@
// 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 "msgPrintControl.h"
#include "sinqAxis.h"
#include "sinqController.h"
#include <math.h> #include <math.h>
#include <unistd.h> #include <unistd.h>
@@ -31,20 +38,21 @@ struct sinqAxisImpl {
}; };
sinqAxis::sinqAxis(class sinqController *pC, int axisNo) sinqAxis::sinqAxis(class sinqController *pC, int axisNo)
: asynMotorAxis((asynMotorController *)pC, axisNo), pC_(pC) { : asynMotorAxis((asynMotorController *)pC, axisNo), pC_(pC), pSinqA_([] {
asynStatus status = asynSuccess;
epicsTimeStamp lastPollTime; epicsTimeStamp lastPollTime;
epicsTimeGetCurrent(&lastPollTime); epicsTimeGetCurrent(&lastPollTime);
return std::make_unique<sinqAxisImpl>(sinqAxisImpl{
pSinqA_ = std::make_unique<sinqAxisImpl>( .expectedArrivalTime = 0,
(sinqAxisImpl){.expectedArrivalTime = 0,
.offsetMovTimeout = 30, .offsetMovTimeout = 30,
.scaleMovTimeout = 2.0, .scaleMovTimeout = 2.0,
.watchdogMovActive = false, .watchdogMovActive = false,
.targetPosition = 0.0, .targetPosition = 0.0,
.wasMoving = false, .wasMoving = false,
.lastPollTime = lastPollTime}); .lastPollTime = lastPollTime,
});
}()) {
asynStatus status = asynSuccess;
/* /*
This check is also done in asynMotorAxis, but there the IOC continues This check is also done in asynMotorAxis, but there the IOC continues
@@ -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) {
@@ -354,9 +367,15 @@ asynStatus sinqAxis::move(double position, int relative, double minVelocity,
return pC_->callParamCallbacks(); return pC_->callParamCallbacks();
} }
asynStatus sinqAxis::doMove(double /*position*/, int /*relative*/, asynStatus sinqAxis::doMove(double position, int relative, double minVelocity,
double /*minVelocity*/, double /*maxVelocity*/, double maxVelocity, double acceleration) {
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;
} }
@@ -398,8 +417,14 @@ 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;
} }
@@ -421,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;

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`.
* *
@@ -435,8 +450,10 @@ class HIDDEN sinqAxis : public asynMotorAxis {
void setTargetPosition(double targetPosition); void setTargetPosition(double targetPosition);
private: private:
std::unique_ptr<sinqAxisImpl> pSinqA_; // Ordering matters because pC_ is initialized before pSinqA_ in the
// constructor
sinqController *pC_; sinqController *pC_;
std::unique_ptr<sinqAxisImpl> pSinqA_;
}; };
// ============================================================================= // =============================================================================

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>
@@ -113,13 +120,8 @@ sinqController::sinqController(const char *portName,
0, // No additional callback interfaces beyond those in base class 0, // No additional callback interfaces beyond those in base class
ASYN_CANBLOCK | ASYN_MULTIDEVICE, ASYN_CANBLOCK | ASYN_MULTIDEVICE,
1, // autoconnect 1, // autoconnect
0, 0) // Default priority and stack size 0, 0), // Default priority and stack size
{ pSinqC_(std::make_unique<sinqControllerImpl>((sinqControllerImpl){
asynStatus status = asynSuccess;
// The paramLib indices are populated with the calls to createParam
pSinqC_ = std::make_unique<sinqControllerImpl>((sinqControllerImpl){
.outstandingForcedFastPolls = 0, .outstandingForcedFastPolls = 0,
.pasynOctetSyncIOipPort = nullptr, .pasynOctetSyncIOipPort = nullptr,
.msgPrintC = msgPrintControl(), .msgPrintC = msgPrintControl(),
@@ -147,7 +149,9 @@ sinqController::sinqController(const char *portName,
.motorPositionDeadband = 0, .motorPositionDeadband = 0,
.adaptivePolling = 0, .adaptivePolling = 0,
.encoderType = 0, .encoderType = 0,
}); })) {
asynStatus status = asynSuccess;
// 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)

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
* *