Compare commits
8 Commits
1.4.2
...
fix_timing
| Author | SHA1 | Date | |
|---|---|---|---|
| 62a3d8c834 | |||
| fd2afa9ec6 | |||
| 949e9faef3 | |||
| 5df84d6017 | |||
| 08c85129f3 | |||
| a980740fd5 | |||
| 338b4d61b4 | |||
| 25b832a6e9 |
@@ -1,24 +0,0 @@
|
|||||||
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
|
|
||||||
58
.gitlab-ci.yml
Normal file
58
.gitlab-ci.yml
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
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 --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
|
||||||
|
|
||||||
|
# clangtidy:
|
||||||
|
# stage: lint
|
||||||
|
# script:
|
||||||
|
# - curl https://docker.psi.ch:5000/v2/_catalog
|
||||||
|
# # - dnf update -y
|
||||||
|
# # - dnf install -y clang-tools-extra
|
||||||
|
# # - clang-tidy sinqEPICSApp/src/*.cpp sinqEPICSApp/src/*.c sinqEPICSApp/src/*.h -checks=cppcoreguidelines-*,cert-*
|
||||||
|
# # 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/turboPmac/$(ls -U /ioc/modules/turboPmac/ | head -1)" "./turboPmac-${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA}"
|
||||||
|
artifacts:
|
||||||
|
name: "turboPmac-${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA}"
|
||||||
|
paths:
|
||||||
|
- "turboPmac-${CI_COMMIT_TAG:-$CI_COMMIT_SHORT_SHA}/*"
|
||||||
|
expire_in: 1 week
|
||||||
|
when: always
|
||||||
|
tags:
|
||||||
|
- sinq
|
||||||
2
Makefile
2
Makefile
@@ -34,4 +34,4 @@ TEMPLATES += db/turboPmac.db
|
|||||||
DBDS += sinqMotor/src/sinqMotor.dbd
|
DBDS += sinqMotor/src/sinqMotor.dbd
|
||||||
DBDS += src/turboPmac.dbd
|
DBDS += src/turboPmac.dbd
|
||||||
|
|
||||||
USR_CFLAGS += -Wall -Wextra -Wunused-result -Werror -fvisibility=hidden # -Wpedantic // Does not work because EPICS macros trigger warnings
|
USR_CFLAGS += -Wall -Wextra -Weffc++ -Wunused-result -Werror # -Wpedantic // Does not work because EPICS macros trigger warnings
|
||||||
Submodule sinqMotor updated: 7a0de4e9d9...c65a8de5dd
@@ -230,7 +230,8 @@ static asynStatus sendPmacGetBuffer(pmacPvt *pPmacPvt, asynUser *pasynUser,
|
|||||||
|
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
|
|
||||||
int pmacAsynIPPortConfigure(const char *portName, const char *hostInfo) {
|
epicsShareFunc int pmacAsynIPPortConfigure(const char *portName,
|
||||||
|
const char *hostInfo) {
|
||||||
asynStatus status = asynSuccess;
|
asynStatus status = asynSuccess;
|
||||||
asynInterface *int32LowerLevelInterface = NULL;
|
asynInterface *int32LowerLevelInterface = NULL;
|
||||||
asynInterface *octetLowerLevelInterface = NULL;
|
asynInterface *octetLowerLevelInterface = NULL;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
#define asynInterposePmac_H
|
#define asynInterposePmac_H
|
||||||
|
|
||||||
#include <epicsExport.h>
|
#include <epicsExport.h>
|
||||||
#include <macros.h>
|
|
||||||
#include <shareLib.h>
|
#include <shareLib.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -26,7 +25,8 @@ extern "C" {
|
|||||||
* 172.23.243.156:1025)
|
* 172.23.243.156:1025)
|
||||||
* @return status
|
* @return status
|
||||||
*/
|
*/
|
||||||
int HIDDEN pmacAsynIPPortConfigure(const char *portName, const char *hostInfo);
|
epicsShareFunc int pmacAsynIPPortConfigure(const char *portName,
|
||||||
|
const char *hostInfo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -553,6 +553,11 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
int sizeUserMessage) {
|
int sizeUserMessage) {
|
||||||
asynStatus status = asynError;
|
asynStatus status = asynError;
|
||||||
|
|
||||||
|
// Create the unique callsite identifier manually so it can be used later in
|
||||||
|
// the shouldBePrinted calls.
|
||||||
|
msgPrintControlKey keyError = msgPrintControlKey(
|
||||||
|
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__);
|
||||||
|
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case 0:
|
case 0:
|
||||||
status = asynSuccess;
|
status = asynSuccess;
|
||||||
@@ -561,9 +566,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
case 1:
|
case 1:
|
||||||
// EPICS should already prevent this issue in the first place,
|
// EPICS should already prevent this issue in the first place,
|
||||||
// since it contains the user limits
|
// since it contains the user limits
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nTarget "
|
"Controller \"%s\", axis %d => %s, line %d\nTarget "
|
||||||
"position would exceed user limits.%s\n",
|
"position would exceed user limits.%s\n",
|
||||||
@@ -575,9 +579,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
// Command not possible
|
// Command not possible
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(
|
asynPrint(
|
||||||
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nAxis is "
|
"Controller \"%s\", axis %d => %s, line %d\nAxis is "
|
||||||
@@ -591,9 +594,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
"moving. Please call the support.");
|
"moving. Please call the support.");
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nAir cushion "
|
"Controller \"%s\", axis %d => %s, line %d\nAir cushion "
|
||||||
"feedback stopped during movement (P%2.2d01 = %d).%s\n",
|
"feedback stopped during movement (P%2.2d01 = %d).%s\n",
|
||||||
@@ -607,9 +609,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
setAxisParamChecked(this, motorMessageText, userMessage);
|
setAxisParamChecked(this, motorMessageText, userMessage);
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(
|
asynPrint(
|
||||||
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nNo air cushion "
|
"Controller \"%s\", axis %d => %s, line %d\nNo air cushion "
|
||||||
@@ -632,9 +633,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
which is not properly homed or if a bug occured.
|
which is not properly homed or if a bug occured.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(
|
asynPrint(
|
||||||
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nAxis hit the "
|
"Controller \"%s\", axis %d => %s, line %d\nAxis hit the "
|
||||||
@@ -653,9 +653,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
case 11:
|
case 11:
|
||||||
// Following error
|
// Following error
|
||||||
|
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(
|
asynPrint(
|
||||||
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nMaximum allowed "
|
"Controller \"%s\", axis %d => %s, line %d\nMaximum allowed "
|
||||||
@@ -672,9 +671,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 12:
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nSecurity "
|
"Controller \"%s\", axis %d => %s, line %d\nSecurity "
|
||||||
"input is triggered (P%2.2d01 = %d).%s\n",
|
"input is triggered (P%2.2d01 = %d).%s\n",
|
||||||
@@ -692,9 +690,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
case 13:
|
case 13:
|
||||||
// Driver hardware error triggered
|
// Driver hardware error triggered
|
||||||
|
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nDriver "
|
"Controller \"%s\", axis %d => %s, line %d\nDriver "
|
||||||
"hardware error triggered.%s\n",
|
"hardware error triggered.%s\n",
|
||||||
@@ -710,9 +707,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
case 14:
|
case 14:
|
||||||
// EPICS should already prevent this issue in the first place,
|
// EPICS should already prevent this issue in the first place,
|
||||||
// since it contains the user limits
|
// since it contains the user limits
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
asynPrint(pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nMove "
|
"Controller \"%s\", axis %d => %s, line %d\nMove "
|
||||||
"command exceeds hardware limits (P%2.2d01 = %d).%s\n",
|
"command exceeds hardware limits (P%2.2d01 = %d).%s\n",
|
||||||
@@ -727,9 +723,8 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
||||||
if (pC_->getMsgPrintControl().shouldBePrinted(
|
if (pC_->getMsgPrintControl().shouldBePrinted(keyError, true,
|
||||||
pC_->portName, axisNo_, __PRETTY_FUNCTION__, __LINE__, true,
|
pC_->pasynUser())) {
|
||||||
pC_->pasynUser())) {
|
|
||||||
asynPrint(
|
asynPrint(
|
||||||
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
pC_->pasynUser(), ASYN_TRACE_ERROR,
|
||||||
"Controller \"%s\", axis %d => %s, line %d\nUnknown error "
|
"Controller \"%s\", axis %d => %s, line %d\nUnknown error "
|
||||||
@@ -740,6 +735,10 @@ asynStatus turboPmacAxis::handleError(int error, char *userMessage,
|
|||||||
setAxisParamChecked(this, motorMessageText, userMessage);
|
setAxisParamChecked(this, motorMessageText, userMessage);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (status == asynSuccess) {
|
||||||
|
pC_->getMsgPrintControl().resetCount(keyError, pC_->pasynUser());
|
||||||
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
#include "turboPmacController.h"
|
#include "turboPmacController.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
struct HIDDEN turboPmacAxisImpl;
|
struct turboPmacAxisImpl;
|
||||||
|
|
||||||
class HIDDEN turboPmacAxis : public sinqAxis {
|
class turboPmacAxis : public sinqAxis {
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief Construct a new turboPmacAxis
|
* @brief Construct a new turboPmacAxis
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ struct turboPmacControllerImpl {
|
|||||||
// User for writing int32 values to the port driver.
|
// User for writing int32 values to the port driver.
|
||||||
asynUser *pasynInt32SyncIOipPort;
|
asynUser *pasynInt32SyncIOipPort;
|
||||||
|
|
||||||
// Indices of additional ParamLib entries
|
// Indices of additional PVs
|
||||||
int rereadEncoderPosition;
|
int rereadEncoderPosition;
|
||||||
int readConfig;
|
int readConfig;
|
||||||
int flushHardware;
|
int flushHardware;
|
||||||
@@ -254,21 +254,9 @@ asynStatus turboPmacController::writeRead(int axisNo, const char *command,
|
|||||||
pasynOctetSyncIOipPort(), command, commandLength, response, MAXBUF_,
|
pasynOctetSyncIOipPort(), command, commandLength, response, MAXBUF_,
|
||||||
pTurboPmacC_->comTimeout, &nbytesOut, &nbytesIn, &eomReason);
|
pTurboPmacC_->comTimeout, &nbytesOut, &nbytesIn, &eomReason);
|
||||||
|
|
||||||
/*
|
// if (strchr(command, '=')) {
|
||||||
If sth. is written to the controller, it needs some time to process the
|
// usleep(20000);
|
||||||
command. However, the controller returns the acknowledgment via
|
// }
|
||||||
pasynOctetSyncIO->writeRead immediately, signalling to the driver that it is
|
|
||||||
ready to receive the next command. In practice, this can result in commands
|
|
||||||
getting discarded on the driver side or in bringing the driver in undefined
|
|
||||||
states (e.g. stuck in status 1).
|
|
||||||
|
|
||||||
To prevent this, we wait for 20 ms after a write command to give the
|
|
||||||
controller enough time to process everything. A write command can be
|
|
||||||
identified by looking for the equal sign.
|
|
||||||
*/
|
|
||||||
if (strchr(command, '=')) {
|
|
||||||
usleep(20000);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgPrintControlKey comKey =
|
msgPrintControlKey comKey =
|
||||||
msgPrintControlKey(portName, axisNo, __PRETTY_FUNCTION__, __LINE__);
|
msgPrintControlKey(portName, axisNo, __PRETTY_FUNCTION__, __LINE__);
|
||||||
|
|||||||
@@ -15,11 +15,11 @@
|
|||||||
// Forward declaration of the controller class to resolve the cyclic dependency
|
// Forward declaration of the controller class to resolve the cyclic dependency
|
||||||
// between the controller and the axis .h-file. See
|
// between the controller and the axis .h-file. See
|
||||||
// https://en.cppreference.com/w/cpp/language/class.
|
// https://en.cppreference.com/w/cpp/language/class.
|
||||||
class HIDDEN turboPmacAxis;
|
class turboPmacAxis;
|
||||||
|
|
||||||
struct HIDDEN turboPmacControllerImpl;
|
struct turboPmacControllerImpl;
|
||||||
|
|
||||||
class HIDDEN turboPmacController : public sinqController {
|
class turboPmacController : public sinqController {
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief Construct a new turboPmacController object. This function is meant
|
* @brief Construct a new turboPmacController object. This function is meant
|
||||||
@@ -93,8 +93,7 @@ class HIDDEN turboPmacController : public sinqController {
|
|||||||
* @return asynStatus
|
* @return asynStatus
|
||||||
*/
|
*/
|
||||||
asynStatus writeRead(int axisNo, const char *command, char *response,
|
asynStatus writeRead(int axisNo, const char *command, char *response,
|
||||||
int numExpectedResponses)
|
int numExpectedResponses);
|
||||||
__attribute__((visibility("hidden")));
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Specialized version of sinqController::couldNotParseResponse
|
* @brief Specialized version of sinqController::couldNotParseResponse
|
||||||
|
|||||||
Reference in New Issue
Block a user