11 Commits

Author SHA1 Message Date
c32708e49c Removed lastSpeed caching
Some checks failed
Test And Build / Lint (push) Failing after 4s
Test And Build / Build (push) Successful in 7s
After discussion with Sven Schlienger, I now send the new speed
unconditionally before each move command. This also means that the
caching of the last speed is no longer needed.
2025-07-16 11:23:37 +02:00
14a733fb67 adds gitea action
Some checks failed
Test And Build / Lint (push) Failing after 4s
Test And Build / Build (push) Successful in 8s
2025-07-04 14:18:44 +02:00
64b932c3ae Fixed bug 2025-07-01 10:05:39 +02:00
09897b6125 Added node reset to doReset 2025-07-01 10:03:20 +02:00
9d47cd4e24 Fixed docs 2025-06-18 09:26:32 +02:00
52fa4e1e78 Updated sinqMotor version 2025-06-18 08:35:00 +02:00
a9e08460d9 Updated sinqMotor 2025-06-18 08:17:21 +02:00
37dacbd3ee Updated sinqMotor version and removed unnecessary require 2025-06-17 13:21:59 +02:00
d198dc8c9f Use axisParam accessor macros 2025-06-17 13:21:55 +02:00
13f2ec4fbf Switched to macro-based getters and setters for paramLib 2025-06-17 13:21:08 +02:00
6ccb60f263 Merge pull request 'Remove sinqmotor dep, it's statically linked. specify rhel8 arch' (#1) from makefile-fixes into main
Reviewed-on: #1
2025-06-11 16:52:42 +02:00
9 changed files with 134 additions and 380 deletions

View File

@@ -0,0 +1,24 @@
name: Test And Build
on: [push]
jobs:
Lint:
runs-on: linepics
steps:
- name: checkout repo
uses: actions/checkout@v4
- name: cppcheck
run: cppcheck --std=c++17 --addon=cert --addon=misc --error-exitcode=1 src/*.cpp
- name: formatting
run: clang-format --style=file --Werror --dry-run src/*.cpp
Build:
runs-on: linepics
steps:
- name: checkout repo
uses: actions/checkout@v4
with:
submodules: 'true'
- run: |
sed -i 's/ARCH_FILTER=.*/ARCH_FILTER=linux%/' Makefile
echo -e "\nIGNORE_SUBMODULES += sinqmotor" >> Makefile
make install

View File

@@ -1,48 +0,0 @@
default:
image: docker.psi.ch:5000/sinqdev/sinqepics:latest
stages:
- lint
- build
- test
cppcheck:
stage: lint
script:
- cppcheck --std=c++17 --addon=cert --addon=misc --suppress=cert-STR07-C --error-exitcode=1 src/*.cpp
artifacts:
expire_in: 1 week
tags:
- sinq
formatting:
stage: lint
script:
- clang-format --style=file --Werror --dry-run src/*.cpp
artifacts:
expire_in: 1 week
tags:
- sinq
build_module:
stage: build
script:
- export SINQMOTOR_VERSION="$(grep 'sinqMotor_VERSION=' Makefile | cut -d= -f2)"
- git clone --depth 1 --branch "${SINQMOTOR_VERSION}" https://gitlab-ci-token:${CI_JOB_TOKEN}@git.psi.ch/sinq-epics-modules/sinqmotor.git
- pushd sinqmotor
- sed -i 's/ARCH_FILTER=.*/ARCH_FILTER=linux%/' Makefile
- echo "LIBVERSION=${SINQMOTOR_VERSION}" >> Makefile
- make install
- popd
- sed -i 's/ARCH_FILTER=.*/ARCH_FILTER=linux%/' Makefile
- echo "LIBVERSION=${CI_COMMIT_TAG:-0.0.1}" >> Makefile
- make install
- cp -rT "/ioc/modules/masterMacs/$(ls -U /ioc/modules/masterMacs/ | head -1)" "./masterMacs-${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA}"
artifacts:
name: "masterMacs-${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA}"
paths:
- "masterMacs-${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA}/*"
expire_in: 1 week
when: always
tags:
- sinq

View File

@@ -4,7 +4,7 @@ include /ioc/tools/driver.makefile
MODULE=masterMacs MODULE=masterMacs
BUILDCLASSES=Linux BUILDCLASSES=Linux
EPICS_VERSIONS=7.0.7 EPICS_VERSIONS=7.0.7
ARCH_FILTER=RHEL8% ARCH_FILTER=RHEL%
# Specify the version of asynMotor we want to build against # Specify the version of asynMotor we want to build against
motorBase_VERSION=7.2.2 motorBase_VERSION=7.2.2

View File

@@ -55,11 +55,11 @@ setMaxSubsequentTimeouts("$(NAME)", 20);
setThresholdComTimeout("$(NAME)", 100, 1); setThresholdComTimeout("$(NAME)", 100, 1);
# Parametrize the EPICS record database with the substitution file named after the MCU. # Parametrize the EPICS record database with the substitution file named after the MCU.
epicsEnvSet("SINQDBPATH","$(sinqMotor_DB)/sinqMotor.db") epicsEnvSet("SINQDBPATH","$(masterMacs_DB)/sinqMotor.db")
dbLoadTemplate("$(TOP)/$(NAME).substitutions", "INSTR=$(INSTR)$(NAME):,CONTROLLER=$(NAME)") dbLoadTemplate("$(TOP)/$(NAME).substitutions", "INSTR=$(INSTR)$(NAME):,CONTROLLER=$(NAME)")
epicsEnvSet("SINQDBPATH","$(masterMacs_DB)/masterMacs.db") epicsEnvSet("SINQDBPATH","$(masterMacs_DB)/masterMacs.db")
dbLoadTemplate("$(TOP)/$(NAME).substitutions", "INSTR=$(INSTR)$(NAME):,CONTROLLER=$(NAME)") dbLoadTemplate("$(TOP)/$(NAME).substitutions", "INSTR=$(INSTR)$(NAME):,CONTROLLER=$(NAME)")
dbLoadRecords("$(sinqMotor_DB)/asynRecord.db","P=$(INSTR)$(NAME),PORT=$(ASYN_PORT)") dbLoadRecords("$(masterMacs_DB)/asynRecord.db","P=$(INSTR)$(NAME),PORT=$(ASYN_PORT)")
``` ```
### Versioning ### Versioning

View File

@@ -19,7 +19,6 @@ struct masterMacsAxisImpl {
std::bitset<16> axisStatus; std::bitset<16> axisStatus;
std::bitset<16> axisError; std::bitset<16> axisError;
double lastSetSpeed;
bool waitForHandshake; bool waitForHandshake;
time_t timeAtHandshake; time_t timeAtHandshake;
bool needInit = true; bool needInit = true;
@@ -122,7 +121,6 @@ masterMacsAxis::masterMacsAxis(masterMacsController *pC, int axisNo)
pMasterMacsA_ = std::make_unique<masterMacsAxisImpl>((masterMacsAxisImpl){ pMasterMacsA_ = std::make_unique<masterMacsAxisImpl>((masterMacsAxisImpl){
.axisStatus = std::bitset<16>(0), .axisStatus = std::bitset<16>(0),
.axisError = std::bitset<16>(0), .axisError = std::bitset<16>(0),
.lastSetSpeed = 0.0,
.waitForHandshake = false, .waitForHandshake = false,
.timeAtHandshake = 0, .timeAtHandshake = 0,
.targetReachedUninitialized = true, .targetReachedUninitialized = true,
@@ -262,11 +260,6 @@ asynStatus masterMacsAxis::init() {
__PRETTY_FUNCTION__, __LINE__); __PRETTY_FUNCTION__, __LINE__);
} }
// Cache the motor speed. If this value differs from the one in the motor
// record at the start of a movement, the motor record value is sent to
// MasterMACS.
pMasterMacsA_->lastSetSpeed = motorVelocity;
// Store the motor position in the parameter library // Store the motor position in the parameter library
pl_status = setMotorPosition(motorPosition); pl_status = setMotorPosition(motorPosition);
if (pl_status != asynSuccess) { if (pl_status != asynSuccess) {
@@ -363,14 +356,8 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
} }
if (timedOut) { if (timedOut) {
pl_status = setAxisParamChecked(this, motorMessageText,
setStringParam(pC_->motorMessageText(), "Timed out while waiting for a handshake");
"Timed out while waiting for a handshake");
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
} }
pC_->read(axisNo_, 86, response); pC_->read(axisNo_, 86, response);
@@ -394,32 +381,15 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
// poll. This is already part of the movement procedure. // poll. This is already part of the movement procedure.
*moving = true; *moving = true;
pl_status = setIntegerParam(pC_->motorStatusMoving(), *moving); setAxisParamChecked(this, motorStatusMoving, *moving);
if (pl_status != asynSuccess) { setAxisParamChecked(this, motorStatusDone, !(*moving));
return pC_->paramLibAccessFailed(pl_status,
"motorStatusMoving_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
pl_status = setIntegerParam(pC_->motorStatusDone(), !(*moving));
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorStatusDone_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
return asynSuccess; return asynSuccess;
} }
} }
// Motor resolution from parameter library // Motor resolution from parameter library
pl_status = pC_->getDoubleParam(axisNo_, pC_->motorRecResolution(), getAxisParamChecked(this, motorRecResolution, &motorRecResolution);
&motorRecResolution);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorRecResolution_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
// Read the previous motor position // Read the previous motor position
pl_status = motorPosition(&previousPosition); pl_status = motorPosition(&previousPosition);
@@ -483,15 +453,9 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
pC_->getMsgPrintControl().getSuffix()); pC_->getMsgPrintControl().getSuffix());
} }
pl_status = setAxisParamChecked(this, motorMessageText,
setStringParam(pC_->motorMessageText(), "Communication error between PC and motor "
"Communication error between PC and motor " "controller. Please call the support.");
"controller. Please call the support.");
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
poll_status = asynError; poll_status = asynError;
} else { } else {
@@ -643,12 +607,7 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
} }
} }
pl_status = setStringParam(pC_->motorMessageText(), errorMessage); setAxisParamChecked(this, motorMessageText, errorMessage);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
} }
} else { } else {
pC_->getMsgPrintControl().resetCount(keyError, pC_->pasynUser()); pC_->getMsgPrintControl().resetCount(keyError, pC_->pasynUser());
@@ -689,40 +648,18 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
directly, but need to shrink them a bit. In this case, we're shrinking directly, but need to shrink them a bit. In this case, we're shrinking
them by 0.1 mm or 0.1 degree (depending on the axis type) on both sides. them by 0.1 mm or 0.1 degree (depending on the axis type) on both sides.
*/ */
pl_status = pC_->getDoubleParam(axisNo_, pC_->motorLimitsOffset(), getAxisParamChecked(this, motorLimitsOffset, &limitsOffset);
&limitsOffset);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorLimitsOffset_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
highLimit = highLimit - limitsOffset; highLimit = highLimit - limitsOffset;
lowLimit = lowLimit + limitsOffset; lowLimit = lowLimit + limitsOffset;
pl_status = pC_->setDoubleParam( setAxisParamChecked(this, motorHighLimitFromDriver, highLimit);
axisNo_, pC_->motorHighLimitFromDriver(), highLimit); setAxisParamChecked(this, motorLowLimitFromDriver, lowLimit);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(
pl_status, "motorHighLimitFromDriver_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
pl_status = pC_->setDoubleParam(axisNo_, pC_->motorLowLimitFromDriver(),
lowLimit);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorLowLimit_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
} }
// Update the enable PV // Update the enable PV
pl_status = setIntegerParam(pC_->motorEnableRBV(), setAxisParamChecked(this, motorEnableRBV,
readyToBeSwitchedOn() && switchedOn()); readyToBeSwitchedOn() && switchedOn());
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorEnableRBV_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
if (*moving) { if (*moving) {
// If the axis is moving, evaluate the movement direction // If the axis is moving, evaluate the movement direction
@@ -735,32 +672,11 @@ asynStatus masterMacsAxis::doPoll(bool *moving) {
// Update the parameter library // Update the parameter library
if (hasError) { if (hasError) {
pl_status = setIntegerParam(pC_->motorStatusProblem(), true); setAxisParamChecked(this, motorStatusProblem, true);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorStatusProblem_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
}
pl_status = setIntegerParam(pC_->motorStatusMoving(), *moving);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorStatusMoving_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
pl_status = setIntegerParam(pC_->motorStatusDone(), !(*moving));
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorStatusDone_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
pl_status = setIntegerParam(pC_->motorStatusDirection(), direction);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorStatusDirection_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
} }
setAxisParamChecked(this, motorStatusMoving, *moving);
setAxisParamChecked(this, motorStatusDone, !(*moving));
setAxisParamChecked(this, motorStatusDirection, direction);
pl_status = setMotorPosition(currentPosition); pl_status = setMotorPosition(currentPosition);
if (pl_status != asynSuccess) { if (pl_status != asynSuccess) {
@@ -775,10 +691,7 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
double acceleration) { double acceleration) {
// Status of read-write-operations of ASCII commands to the controller // Status of read-write-operations of ASCII commands to the controller
asynStatus rw_status = asynSuccess; asynStatus status = asynSuccess;
// Status of parameter library operations
asynStatus pl_status = asynSuccess;
char value[pC_->MAXBUF_]; char value[pC_->MAXBUF_];
double motorCoordinatesPosition = 0.0; double motorCoordinatesPosition = 0.0;
@@ -789,19 +702,8 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
// ========================================================================= // =========================================================================
pl_status = pC_->getIntegerParam(axisNo_, pC_->motorEnableRBV(), &enabled); getAxisParamChecked(this, motorEnableRBV, &enabled);
if (pl_status != asynSuccess) { getAxisParamChecked(this, motorRecResolution, &motorRecResolution);
return pC_->paramLibAccessFailed(pl_status, "enableMotorRBV_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
pl_status = pC_->getDoubleParam(axisNo_, pC_->motorRecResolution(),
&motorRecResolution);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorRecResolution_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
if (enabled == 0) { if (enabled == 0) {
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR, asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
@@ -821,42 +723,24 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, position); pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, position);
// Check if the speed is allowed to be changed // Check if the speed is allowed to be changed
pl_status = pC_->getIntegerParam(axisNo_, pC_->motorCanSetSpeed(), getAxisParamChecked(this, motorCanSetSpeed, &motorCanSetSpeed);
&motorCanSetSpeed);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorCanSetSpeed_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
// Initialize the movement handshake // Initialize the movement handshake
rw_status = pC_->write(axisNo_, 86, "0"); status = pC_->write(axisNo_, 86, "0");
if (rw_status != asynSuccess) { if (status != asynSuccess) {
pl_status = setIntegerParam(pC_->motorStatusProblem(), true); setAxisParamChecked(this, motorStatusProblem, true);
if (pl_status != asynSuccess) { return status;
return pC_->paramLibAccessFailed(pl_status, "motorStatusProblem_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
return rw_status;
} }
// Set the new motor speed, if the user is allowed to do so and if the // Set the new motor speed, if the user is allowed to do so and if the
// motor speed changed since the last move command. // motor speed changed since the last move command.
if (motorCanSetSpeed != 0 && pMasterMacsA_->lastSetSpeed != motorVelocity) { if (motorCanSetSpeed != 0) {
pMasterMacsA_->lastSetSpeed = motorVelocity;
snprintf(value, sizeof(value), "%lf", motorVelocity); snprintf(value, sizeof(value), "%lf", motorVelocity);
rw_status = pC_->write(axisNo_, 05, value); status = pC_->write(axisNo_, 05, value);
if (rw_status != asynSuccess) { if (status != asynSuccess) {
pl_status = setIntegerParam(pC_->motorStatusProblem(), true); setAxisParamChecked(this, motorStatusProblem, true);
if (pl_status != asynSuccess) { return status;
return pC_->paramLibAccessFailed(pl_status,
"motorStatusProblem_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
return rw_status;
} }
asynPrint(pC_->pasynUser(), ASYN_TRACE_FLOW, asynPrint(pC_->pasynUser(), ASYN_TRACE_FLOW,
@@ -868,15 +752,10 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
// Set the target position // Set the target position
snprintf(value, sizeof(value), "%lf", motorCoordinatesPosition); snprintf(value, sizeof(value), "%lf", motorCoordinatesPosition);
rw_status = pC_->write(axisNo_, 02, value); status = pC_->write(axisNo_, 02, value);
if (rw_status != asynSuccess) { if (status != asynSuccess) {
pl_status = setIntegerParam(pC_->motorStatusProblem(), true); setAxisParamChecked(this, motorStatusProblem, true);
if (pl_status != asynSuccess) { return status;
return pC_->paramLibAccessFailed(pl_status, "motorStatusProblem_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
return rw_status;
} }
// If the motor has just been enabled, use Enable // If the motor has just been enabled, use Enable
@@ -888,18 +767,13 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
// Start the move // Start the move
if (relative) { if (relative) {
rw_status = pC_->write(axisNo_, 00, "2", timeout); status = pC_->write(axisNo_, 00, "2", timeout);
} else { } else {
rw_status = pC_->write(axisNo_, 00, "1", timeout); status = pC_->write(axisNo_, 00, "1", timeout);
} }
if (rw_status != asynSuccess) { if (status != asynSuccess) {
pl_status = setIntegerParam(pC_->motorStatusProblem(), true); setAxisParamChecked(this, motorStatusProblem, true);
if (pl_status != asynSuccess) { return status;
return pC_->paramLibAccessFailed(pl_status, "motorStatusProblem_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
return rw_status;
} }
// In the next poll, we will check if the handshake has been performed in a // In the next poll, we will check if the handshake has been performed in a
@@ -913,60 +787,44 @@ asynStatus masterMacsAxis::doMove(double position, int relative,
return asynError; return asynError;
} }
return rw_status; return status;
} }
asynStatus masterMacsAxis::stop(double acceleration) { asynStatus masterMacsAxis::stop(double acceleration) {
// Status of read-write-operations of ASCII commands to the controller asynStatus status = pC_->write(axisNo_, 00, "8");
asynStatus rw_status = asynSuccess; if (status != asynSuccess) {
setAxisParamChecked(this, motorStatusProblem, true);
// Status of parameter library operations
asynStatus pl_status = asynSuccess;
// =========================================================================
rw_status = pC_->write(axisNo_, 00, "8");
if (rw_status != asynSuccess) {
pl_status = setIntegerParam(pC_->motorStatusProblem(), true);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorStatusProblem_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
} }
// Reset the driver to idle state and move out of the handshake wait loop, // Reset the driver to idle state and move out of the handshake wait loop,
// if we're currently inside it. // if we're currently inside it.
pMasterMacsA_->waitForHandshake = false; pMasterMacsA_->waitForHandshake = false;
return rw_status; return status;
} }
asynStatus masterMacsAxis::doReset() { asynStatus masterMacsAxis::doReset() {
// Status of read-write-operations of ASCII commands to the controller
asynStatus rw_status = asynSuccess;
// Status of parameter library operations asynStatus status = asynSuccess;
asynStatus pl_status = asynSuccess;
// ========================================================================= // Reset errors
status = pC_->write(axisNo_, 16, "");
if (status != asynSuccess) {
setAxisParamChecked(this, motorStatusProblem, true);
}
rw_status = pC_->write(axisNo_, 17, ""); // Reset the controller
if (rw_status != asynSuccess) { status = pC_->write(axisNo_, 17, "");
pl_status = setIntegerParam(pC_->motorStatusProblem(), true); if (status != asynSuccess) {
if (pl_status != asynSuccess) { setAxisParamChecked(this, motorStatusProblem, true);
return pC_->paramLibAccessFailed(pl_status, "motorStatusProblem_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
} }
// Reset the driver to idle state and move out of the handshake wait loop, // Reset the driver to idle state and move out of the handshake wait loop,
// if we're currently inside it. // if we're currently inside it.
pMasterMacsA_->waitForHandshake = false; pMasterMacsA_->waitForHandshake = false;
return rw_status; return status;
} }
/* /*
@@ -975,41 +833,25 @@ Home the axis. On absolute encoder systems, this is a no-op
asynStatus masterMacsAxis::doHome(double min_velocity, double max_velocity, asynStatus masterMacsAxis::doHome(double min_velocity, double max_velocity,
double acceleration, int forwards) { double acceleration, int forwards) {
// Status of read-write-operations of ASCII commands to the controller
asynStatus rw_status = asynSuccess;
// Status of parameter library operations
asynStatus pl_status = asynSuccess;
char response[pC_->MAXBUF_] = {0}; char response[pC_->MAXBUF_] = {0};
// ========================================================================= // =========================================================================
pl_status = pC_->getStringParam(axisNo_, pC_->encoderType(), getAxisParamChecked(this, encoderType, &response);
sizeof(response), response);
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "encoderType_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
// Only send the home command if the axis has an incremental encoder // Only send the home command if the axis has an incremental encoder
if (strcmp(response, IncrementalEncoder) == 0) { if (strcmp(response, IncrementalEncoder) == 0) {
// Initialize the movement handshake // Initialize the movement handshake
rw_status = pC_->write(axisNo_, 86, "0"); asynStatus status = pC_->write(axisNo_, 86, "0");
if (rw_status != asynSuccess) { if (status != asynSuccess) {
pl_status = setIntegerParam(pC_->motorStatusProblem(), true); setAxisParamChecked(this, motorStatusProblem, true);
if (pl_status != asynSuccess) { return status;
return pC_->paramLibAccessFailed(pl_status,
"motorStatusProblem_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
return rw_status;
} }
rw_status = pC_->write(axisNo_, 00, "9"); status = pC_->write(axisNo_, 00, "9");
if (rw_status != asynSuccess) { if (status != asynSuccess) {
return rw_status; return status;
} }
// In the next poll, we will check if the handshake has been performed // In the next poll, we will check if the handshake has been performed
@@ -1027,12 +869,6 @@ Read the encoder type and update the parameter library accordingly
*/ */
asynStatus masterMacsAxis::readEncoderType() { asynStatus masterMacsAxis::readEncoderType() {
// Status of read-write-operations of ASCII commands to the controller
asynStatus rw_status = asynSuccess;
// Status of parameter library operations
asynStatus pl_status = asynSuccess;
char command[pC_->MAXBUF_] = {0}; char command[pC_->MAXBUF_] = {0};
char response[pC_->MAXBUF_] = {0}; char response[pC_->MAXBUF_] = {0};
int nvals = 0; int nvals = 0;
@@ -1041,9 +877,9 @@ asynStatus masterMacsAxis::readEncoderType() {
// ========================================================================= // =========================================================================
// Check if this is an absolute encoder // Check if this is an absolute encoder
rw_status = pC_->read(axisNo_, 60, response); asynStatus status = pC_->read(axisNo_, 60, response);
if (rw_status != asynSuccess) { if (status != asynSuccess) {
return rw_status; return status;
} }
nvals = sscanf(response, "%d", &encoder_id); nvals = sscanf(response, "%d", &encoder_id);
@@ -1059,28 +895,18 @@ asynStatus masterMacsAxis::readEncoderType() {
2=SSI (Absolute encoder with BiSS interface) 2=SSI (Absolute encoder with BiSS interface)
*/ */
if (encoder_id == 0) { if (encoder_id == 0) {
pl_status = setStringParam(pC_->encoderType(), IncrementalEncoder); setAxisParamChecked(this, encoderType, IncrementalEncoder);
} else { } else {
pl_status = setStringParam(pC_->encoderType(), AbsoluteEncoder); setAxisParamChecked(this, encoderType, AbsoluteEncoder);
} }
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "encoderType_", axisNo_,
__PRETTY_FUNCTION__, __LINE__);
}
return asynSuccess; return asynSuccess;
} }
asynStatus masterMacsAxis::enable(bool on) { asynStatus masterMacsAxis::enable(bool on) {
int timeout_enable_disable = 2; int timeout_enable_disable = 2;
char value[pC_->MAXBUF_]; char msg[pC_->MAXBUF_];
// Status of read-write-operations of ASCII commands to the controller
asynStatus rw_status = asynSuccess;
// Status of parameter library operations
asynStatus pl_status = asynSuccess;
// ========================================================================= // =========================================================================
@@ -1110,14 +936,8 @@ asynStatus masterMacsAxis::enable(bool on) {
"idle and can therefore not be disabled.\n", "idle and can therefore not be disabled.\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__); pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__);
pl_status = setAxisParamChecked(this, motorMessageText,
setStringParam(pC_->motorMessageText(), "Axis cannot be disabled while it is moving.");
"Axis cannot be disabled while it is moving.");
if (pl_status != asynSuccess) {
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
return asynError; return asynError;
} }
@@ -1135,7 +955,7 @@ asynStatus masterMacsAxis::enable(bool on) {
} }
// Enable / disable the axis if it is not moving // Enable / disable the axis if it is not moving
snprintf(value, sizeof(value), "%d", on); snprintf(msg, sizeof(msg), "%d", on);
asynPrint(pC_->pasynUser(), ASYN_TRACE_FLOW, asynPrint(pC_->pasynUser(), ASYN_TRACE_FLOW,
"Controller \"%s\", axis %d => %s, line %d:\n%s axis.\n", "Controller \"%s\", axis %d => %s, line %d:\n%s axis.\n",
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__,
@@ -1150,9 +970,9 @@ asynStatus masterMacsAxis::enable(bool on) {
timeout = PowerCycleTimeout; timeout = PowerCycleTimeout;
} }
rw_status = pC_->write(axisNo_, 04, value, timeout); asynStatus status = pC_->write(axisNo_, 04, msg, timeout);
if (rw_status != asynSuccess) { if (status != asynSuccess) {
return rw_status; return status;
} }
// Query the axis status every few milliseconds until the axis has been // Query the axis status every few milliseconds until the axis has been
@@ -1162,9 +982,9 @@ asynStatus masterMacsAxis::enable(bool on) {
// Read the axis status // Read the axis status
usleep(100000); usleep(100000);
rw_status = readAxisStatus(); status = readAxisStatus();
if (rw_status != asynSuccess) { if (status != asynSuccess) {
return rw_status; return status;
} }
if (switchedOn() == on) { if (switchedOn() == on) {
@@ -1184,14 +1004,10 @@ asynStatus masterMacsAxis::enable(bool on) {
on ? "enable" : "disable", timeout_enable_disable); on ? "enable" : "disable", timeout_enable_disable);
// Output message to user // Output message to user
snprintf(value, sizeof(value), "Failed to %s within %d seconds", snprintf(msg, sizeof(msg), "Failed to %s within %d seconds",
on ? "enable" : "disable", timeout_enable_disable); on ? "enable" : "disable", timeout_enable_disable);
pl_status = setStringParam(pC_->motorMessageText(), value);
if (pl_status != asynSuccess) { setAxisParamChecked(this, motorMessageText, msg);
return pC_->paramLibAccessFailed(pl_status, "motorMessageText_",
axisNo_, __PRETTY_FUNCTION__,
__LINE__);
}
return asynError; return asynError;
} }

View File

@@ -1,13 +1,9 @@
#ifndef masterMacsAXIS_H #ifndef masterMacsAXIS_H
#define masterMacsAXIS_H #define masterMacsAXIS_H
#include "masterMacsController.h"
#include "sinqAxis.h" #include "sinqAxis.h"
#include <memory> #include <memory>
// Forward declaration of the controller class to resolve the cyclic dependency
// between the controller and the axis .h-file. See
// https://en.cppreference.com/w/cpp/language/class.
class masterMacsController;
struct masterMacsAxisImpl; struct masterMacsAxisImpl;
class masterMacsAxis : public sinqAxis { class masterMacsAxis : public sinqAxis {
@@ -122,7 +118,10 @@ class masterMacsAxis : public sinqAxis {
*/ */
void setNeedInit(bool needInit); void setNeedInit(bool needInit);
asynStatus readConfig(); /**
* @brief Return a pointer to the axis controller
*/
virtual masterMacsController *pController() override { return pC_; };
/** /**
* @brief Read the Master MACS status with the xR10 command and store the * @brief Read the Master MACS status with the xR10 command and store the

View File

@@ -136,7 +136,6 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
// Definition of local variables. // Definition of local variables.
asynStatus status = asynSuccess; asynStatus status = asynSuccess;
asynStatus pl_status = asynSuccess;
char fullCommand[MAXBUF_] = {0}; char fullCommand[MAXBUF_] = {0};
char fullResponse[MAXBUF_] = {0}; char fullResponse[MAXBUF_] = {0};
char drvMessageText[MAXBUF_] = {0}; char drvMessageText[MAXBUF_] = {0};
@@ -255,7 +254,7 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
// Log the overall status (communication successfull or not) // Log the overall status (communication successfull or not)
if (status == asynSuccess) { if (status == asynSuccess) {
pl_status = axis->setIntegerParam(this->motorStatusCommsError_, 0); setAxisParamChecked(axis, motorStatusCommsError, false);
} else { } else {
/* /*
@@ -274,35 +273,12 @@ asynStatus masterMacsController::writeRead(int axisNo, int tcpCmd,
the user with different error messages if more than one error the user with different error messages if more than one error
ocurred before an error-free communication ocurred before an error-free communication
*/ */
pl_status = getAxisParamChecked(axis, motorStatusProblem, &motorStatusProblem);
getIntegerParam(axisNo, motorStatusProblem_, &motorStatusProblem);
if (pl_status != asynSuccess) {
return paramLibAccessFailed(pl_status, "motorStatusProblem", axisNo,
__PRETTY_FUNCTION__, __LINE__);
}
if (motorStatusProblem == 0) { if (motorStatusProblem == 0) {
pl_status = setAxisParamChecked(axis, motorMessageText, drvMessageText);
axis->setStringParam(motorMessageText(), drvMessageText); setAxisParamChecked(axis, motorStatusProblem, true);
if (pl_status != asynSuccess) { setAxisParamChecked(axis, motorStatusCommsError, false);
return paramLibAccessFailed(pl_status, "motorMessageText",
axisNo, __PRETTY_FUNCTION__,
__LINE__);
}
pl_status = axis->setIntegerParam(motorStatusProblem_, 1);
if (pl_status != asynSuccess) {
return paramLibAccessFailed(pl_status, "motorStatusProblem",
axisNo, __PRETTY_FUNCTION__,
__LINE__);
}
pl_status = axis->setIntegerParam(motorStatusProblem_, 1);
if (pl_status != asynSuccess) {
return paramLibAccessFailed(pl_status, "motorStatusCommsError_",
axisNo, __PRETTY_FUNCTION__,
__LINE__);
}
} }
} }
@@ -332,13 +308,14 @@ asynStatus masterMacsController::parseResponse(
msgPrintControlKey parseKey = msgPrintControlKey parseKey =
msgPrintControlKey(portName, axisNo, __PRETTY_FUNCTION__, __LINE__); msgPrintControlKey(portName, axisNo, __PRETTY_FUNCTION__, __LINE__);
// Was the motor previously connected? masterMacsAxis *axis = getMasterMacsAxis(axisNo);
status = getIntegerParam(axisNo, motorConnected(), &prevConnected); if (axis == nullptr) {
if (status != asynSuccess) { return asynError;
return paramLibAccessFailed(status, "motorConnected", axisNo,
__PRETTY_FUNCTION__, __LINE__);
} }
// Was the motor previously connected?
getAxisParamChecked(axis, motorConnected, &prevConnected);
// We don't use strlen here since the C string terminator 0x00 // We don't use strlen here since the C string terminator 0x00
// occurs in the middle of the char array. // occurs in the middle of the char array.
for (uint32_t i = 0; i < MAXBUF_; i++) { for (uint32_t i = 0; i < MAXBUF_; i++) {
@@ -361,16 +338,7 @@ asynStatus masterMacsController::parseResponse(
"connected.\n", "connected.\n",
portName, axisNo, __PRETTY_FUNCTION__, __LINE__); portName, axisNo, __PRETTY_FUNCTION__, __LINE__);
masterMacsAxis *axis = getMasterMacsAxis(axisNo); setAxisParamChecked(axis, motorConnected, true);
if (axis == nullptr) {
return asynError;
}
status = axis->setIntegerParam(motorConnected(), 1);
if (status != asynSuccess) {
return paramLibAccessFailed(status, "motorConnected",
axisNo, __PRETTY_FUNCTION__,
__LINE__);
}
status = callParamCallbacks(); status = callParamCallbacks();
if (status != asynSuccess) { if (status != asynSuccess) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,
@@ -398,16 +366,7 @@ asynStatus masterMacsController::parseResponse(
"disconnected.\n", "disconnected.\n",
portName, axisNo, __PRETTY_FUNCTION__, __LINE__); portName, axisNo, __PRETTY_FUNCTION__, __LINE__);
masterMacsAxis *axis = getMasterMacsAxis(axisNo); setAxisParamChecked(axis, motorConnected, false);
if (axis == nullptr) {
return asynError;
}
status = axis->setIntegerParam(motorConnected(), 0);
if (status != asynSuccess) {
return paramLibAccessFailed(status, "motorConnected",
axisNo, __PRETTY_FUNCTION__,
__LINE__);
}
status = callParamCallbacks(); status = callParamCallbacks();
if (status != asynSuccess) { if (status != asynSuccess) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR, asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,

View File

@@ -8,11 +8,15 @@
#ifndef masterMacsController_H #ifndef masterMacsController_H
#define masterMacsController_H #define masterMacsController_H
#include "masterMacsAxis.h"
#include "sinqAxis.h" #include "sinqAxis.h"
#include "sinqController.h" #include "sinqController.h"
#include <memory> #include <memory>
// Forward declaration of the controller class to resolve the cyclic dependency
// between the controller and the axis .h-file. See
// https://en.cppreference.com/w/cpp/language/class.
class masterMacsAxis;
struct masterMacsControllerImpl; struct masterMacsControllerImpl;
class masterMacsController : public sinqController { class masterMacsController : public sinqController {