Added connection assertion and moved msgPrintControl to key
This commit is contained in:
@ -2,11 +2,13 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
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) {
|
||||||
controller_ = controller;
|
controller_ = controller;
|
||||||
axisNo_ = axisNo;
|
axisNo_ = axisNo;
|
||||||
line_ = line;
|
line_ = line;
|
||||||
functionName_ = functionName;
|
functionName_ = functionName;
|
||||||
|
maxRepetitions_ = maxRepetitions;
|
||||||
}
|
}
|
||||||
|
|
||||||
void msgPrintControlKey::format(char *buffer, size_t bufferSize) {
|
void msgPrintControlKey::format(char *buffer, size_t bufferSize) {
|
||||||
@ -16,10 +18,6 @@ void msgPrintControlKey::format(char *buffer, size_t bufferSize) {
|
|||||||
|
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
|
|
||||||
msgPrintControl::msgPrintControl(size_t maxRepetitions) {
|
|
||||||
maxRepetitions_ = maxRepetitions;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool msgPrintControl::shouldBePrinted(msgPrintControlKey &key, bool wantToPrint,
|
bool msgPrintControl::shouldBePrinted(msgPrintControlKey &key, bool wantToPrint,
|
||||||
asynUser *pasynUser) {
|
asynUser *pasynUser) {
|
||||||
|
|
||||||
@ -34,12 +32,12 @@ bool msgPrintControl::shouldBePrinted(msgPrintControlKey &key, bool wantToPrint,
|
|||||||
*/
|
*/
|
||||||
if (map_.find(key) != map_.end()) {
|
if (map_.find(key) != map_.end()) {
|
||||||
size_t repetitions = map_[key];
|
size_t repetitions = map_[key];
|
||||||
if (repetitions < maxRepetitions_) {
|
if (repetitions < key.maxRepetitions_) {
|
||||||
// Number of allowed repetitions not exceeded -> Printing the
|
// Number of allowed repetitions not exceeded -> Printing the
|
||||||
// message is ok.
|
// message is ok.
|
||||||
map_[key] = repetitions + 1;
|
map_[key] = repetitions + 1;
|
||||||
return true;
|
return true;
|
||||||
} else if (repetitions == maxRepetitions_) {
|
} else if (repetitions == key.maxRepetitions_) {
|
||||||
// Reached number of allowed repetitions -> Printing the message
|
// Reached number of allowed repetitions -> Printing the message
|
||||||
// is ok, but further trys are rejected.
|
// is ok, but further trys are rejected.
|
||||||
char formattedKey[100] = {0};
|
char formattedKey[100] = {0};
|
||||||
@ -88,7 +86,8 @@ bool msgPrintControl::shouldBePrinted(msgPrintControlKey &key, bool wantToPrint,
|
|||||||
|
|
||||||
bool msgPrintControl::shouldBePrinted(char *portName, int axisNo,
|
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) {
|
||||||
msgPrintControlKey key =
|
msgPrintControlKey key =
|
||||||
msgPrintControlKey(portName, axisNo, functionName, __LINE__);
|
msgPrintControlKey(portName, axisNo, functionName, __LINE__);
|
||||||
return shouldBePrinted(key, wantToPrint, pasynUser);
|
return shouldBePrinted(key, wantToPrint, pasynUser);
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef msgPrintControl_H
|
#ifndef msgPrintControl_H
|
||||||
#define msgPrintControl_H
|
#define msgPrintControl_H
|
||||||
|
|
||||||
|
#define DefaultMaxRepetitions 4
|
||||||
|
|
||||||
#include <asynDriver.h>
|
#include <asynDriver.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -21,8 +23,15 @@ class msgPrintControlKey {
|
|||||||
const char *functionName_;
|
const char *functionName_;
|
||||||
int line_;
|
int line_;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum number of times a message is printed before it is
|
||||||
|
* suppressed. This number is not used as part of the hash.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
size_t maxRepetitions_;
|
||||||
|
|
||||||
msgPrintControlKey(char *controller_, int axisNo, const char *fileName,
|
msgPrintControlKey(char *controller_, int axisNo, const char *fileName,
|
||||||
int line);
|
int line, size_t maxRepetitions = DefaultMaxRepetitions);
|
||||||
|
|
||||||
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_ &&
|
||||||
@ -73,8 +82,6 @@ template <> struct hash<msgPrintControlKey> {
|
|||||||
*/
|
*/
|
||||||
class msgPrintControl {
|
class msgPrintControl {
|
||||||
public:
|
public:
|
||||||
msgPrintControl(size_t maxRepetitions);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks if the error message associated with "key" has been printed
|
* @brief Checks if the error message associated with "key" has been printed
|
||||||
* more than `this->maxRepetitions_` times in a row. If yes, returns false,
|
* more than `this->maxRepetitions_` times in a row. If yes, returns false,
|
||||||
@ -115,7 +122,8 @@ class msgPrintControl {
|
|||||||
* @param pasynUser
|
* @param pasynUser
|
||||||
*/
|
*/
|
||||||
bool shouldBePrinted(char *controller, int axisNo, const char *functionName,
|
bool shouldBePrinted(char *controller, int axisNo, const char *functionName,
|
||||||
int line, bool wantToPrint, asynUser *pasynUser);
|
int line, bool wantToPrint, asynUser *pasynUser,
|
||||||
|
size_t maxRepetitions = DefaultMaxRepetitions);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Reset the error message count incremented in `shouldBePrinted` for
|
* @brief Reset the error message count incremented in `shouldBePrinted` for
|
||||||
@ -129,13 +137,6 @@ class msgPrintControl {
|
|||||||
*/
|
*/
|
||||||
void resetCount(msgPrintControlKey &key, asynUser *pasynUser);
|
void resetCount(msgPrintControlKey &key, asynUser *pasynUser);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Maximum number of times a message is printed before it is
|
|
||||||
* suppressed.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
size_t maxRepetitions_;
|
|
||||||
|
|
||||||
char *getSuffix();
|
char *getSuffix();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -296,6 +296,11 @@ asynStatus sinqAxis::move(double position, int relative, double minVelocity,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status = assertConnected();
|
||||||
|
if (status != asynSuccess) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
// Since the move command was successfull, we assume that the motor has
|
// Since the move command was successfull, we assume that the motor has
|
||||||
// started its movement.
|
// started its movement.
|
||||||
status = setIntegerParam(pC_->motorStatusHomed(), 0);
|
status = setIntegerParam(pC_->motorStatusHomed(), 0);
|
||||||
@ -363,6 +368,11 @@ asynStatus sinqAxis::home(double minVelocity, double maxVelocity,
|
|||||||
__LINE__);
|
__LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status = assertConnected();
|
||||||
|
if (status != asynSuccess) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
// Update the motor record
|
// Update the motor record
|
||||||
return callParamCallbacks();
|
return callParamCallbacks();
|
||||||
|
|
||||||
@ -376,11 +386,16 @@ asynStatus sinqAxis::home(double minVelocity, double maxVelocity,
|
|||||||
__LINE__);
|
__LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status = assertConnected();
|
||||||
|
if (status != asynSuccess) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
// Update the motor record
|
// Update the motor record
|
||||||
return callParamCallbacks();
|
return callParamCallbacks();
|
||||||
} else {
|
} else {
|
||||||
// Bubble up all other problems
|
// Bubble up all other problems
|
||||||
return status;
|
return assertConnected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,6 +406,7 @@ asynStatus sinqAxis::doHome(double minVelocity, double maxVelocity,
|
|||||||
|
|
||||||
asynStatus sinqAxis::reset() {
|
asynStatus sinqAxis::reset() {
|
||||||
asynStatus status = doReset();
|
asynStatus status = doReset();
|
||||||
|
|
||||||
if (status == asynSuccess) {
|
if (status == asynSuccess) {
|
||||||
// Perform some fast polls
|
// Perform some fast polls
|
||||||
pC_->lock();
|
pC_->lock();
|
||||||
@ -403,6 +419,12 @@ asynStatus sinqAxis::reset() {
|
|||||||
}
|
}
|
||||||
pC_->unlock();
|
pC_->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asynStatus pl_status = assertConnected();
|
||||||
|
if (pl_status != asynSuccess) {
|
||||||
|
return pl_status;
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,6 +478,25 @@ asynStatus sinqAxis::setMotorPosition(double motorPosition) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asynStatus sinqAxis::assertConnected() {
|
||||||
|
asynStatus status = asynSuccess;
|
||||||
|
int connected = 0;
|
||||||
|
|
||||||
|
status = pC_->getIntegerParam(axisNo(), pC_->motorConnected(), &connected);
|
||||||
|
if (status != asynSuccess) {
|
||||||
|
return pC_->paramLibAccessFailed(status, "motorConnected", axisNo(),
|
||||||
|
__PRETTY_FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connected == 0) {
|
||||||
|
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
|
"Controller \"%s\", axis %d => %s, line "
|
||||||
|
"%d:\nAxis is not connected, all commands are ignored.\n",
|
||||||
|
pC_->portName, axisNo(), __PRETTY_FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
|
return asynSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
asynStatus sinqAxis::setVeloFields(double velo, double vbas, double vmax) {
|
asynStatus sinqAxis::setVeloFields(double velo, double vbas, double vmax) {
|
||||||
asynStatus status = asynSuccess;
|
asynStatus status = asynSuccess;
|
||||||
int variableSpeed = 0;
|
int variableSpeed = 0;
|
||||||
|
@ -348,6 +348,16 @@ class epicsShareClass sinqAxis : public asynMotorAxis {
|
|||||||
*/
|
*/
|
||||||
asynStatus setMotorPosition(double motorPosition);
|
asynStatus setMotorPosition(double motorPosition);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the axis is not connected and print a corresponding error
|
||||||
|
* message
|
||||||
|
*
|
||||||
|
* This method is meant to be used at the end of "interactive" function
|
||||||
|
* calls such as move, home, stop etc which can be manually triggered from
|
||||||
|
* the IOC shell or from the channel access protocol.
|
||||||
|
*/
|
||||||
|
asynStatus assertConnected();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Internal variables used in the movement timeout watchdog
|
// Internal variables used in the movement timeout watchdog
|
||||||
time_t expectedArrivalTime_;
|
time_t expectedArrivalTime_;
|
||||||
|
@ -48,7 +48,7 @@ sinqController::sinqController(const char *portName,
|
|||||||
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
|
||||||
msgPrintControl_(4) {
|
msgPrintControl_() {
|
||||||
|
|
||||||
asynStatus status = asynSuccess;
|
asynStatus status = asynSuccess;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user