Compare commits

..

2 Commits

Author SHA1 Message Date
mathis_s 308747b747 Reset error during each poll
Test And Build / Build (push) Successful in 7s
Test And Build / Lint (push) Failing after 7s
2026-05-27 13:58:11 +02:00
wall_e 3339f5a3a3 human readable tcpdump
Test And Build / Build (push) Successful in 7s
Test And Build / Lint (push) Failing after 7s
2026-05-04 17:05:20 +02:00
5 changed files with 202 additions and 33 deletions
+3
View File
@@ -21,6 +21,9 @@ TEMPLATES += sinqEPICSApp/Db/el734.db
# DBD files to include in the release
DBDS += sinqEPICSApp/src/sinq.dbd
# Release version
LIBVERSION=2026
# Source files to build
SOURCES += sinqEPICSApp/src/devScalerEL737.c
SOURCES += sinqEPICSApp/src/SINQController.cpp
+4 -1
View File
@@ -505,7 +505,10 @@ asynStatus EL734Axis::poll(bool *moving)
// errlogPrintf("Axis %d, reply %s, msr %d, oredmsr = %d, position = %lf\n",
// axisNo_, reply, msr, oredMSR, position);
oredMSR |= msr;
// Reset the error during each poll. This is necessary because some errors
// apparently don't get cleared by the controller (especially "lower / higher
// limit hit").
oredMSR = msr;
if ((msr & 0x1) == 0)
{
// done: check for trouble
+31 -29
View File
@@ -48,7 +48,7 @@ January 2019
#include "PhytronDriver.h"
#include <epicsExport.h>
#define IDLEPOLL 5
#define IDLEPOLL 60
/** Creates a new PhytronController object.
* \param[in] portName The name of the asyn port that will be created for this driver
@@ -56,7 +56,7 @@ January 2019
* \param[in] numAxes The number of axes that this controller supports
*/
PhytronController::PhytronController(const char *portName, const char *PhytronPortName, const char *sel ,
int encX, int encY, int ignoreLimitsX, int ignoreLimitsY)
int encX, int encY)
: SINQController(portName, PhytronPortName,2)
{
asynStatus status;
@@ -82,8 +82,8 @@ PhytronController::PhytronController(const char *portName, const char *PhytronPo
new PhytronDoseAxis(this, 1, encX);
new PhytronDoseAxis(this, 2, encY);
} else {
new PhytronAxis(this, 1, encX, ignoreLimitsX);
new PhytronAxis(this, 2, encY, ignoreLimitsY);
new PhytronAxis(this, 1, encX);
new PhytronAxis(this, 2, encY);
}
@@ -92,7 +92,7 @@ PhytronController::PhytronController(const char *portName, const char *PhytronPo
PhytronDoseController::PhytronDoseController(const char *portName, const char *PhytronPortName, const char *sel ,
int encX, int encY)
: PhytronController(portName, PhytronPortName, sel, encX, encY, 0, 0)
: PhytronController(portName, PhytronPortName, sel, encX, encY)
{
new PhytronDoseAxis(this, 1, encX);
new PhytronDoseAxis(this, 2, encY);
@@ -106,9 +106,9 @@ PhytronDoseController::PhytronDoseController(const char *portName, const char *P
* \param[in] numAxes The number of axes that this controller supports
*/
extern "C" int PhytronCreateController(const char *portName, const char *PhytronPortName, const char *selector,
int encX, int encY, int ignoreLimitsX, int ignoreLimitsY)
int encX, int encY)
{
new PhytronController(portName, PhytronPortName,selector, encX, encY, ignoreLimitsX, ignoreLimitsY);
new PhytronController(portName, PhytronPortName,selector, encX, encY);
return(asynSuccess);
}
@@ -178,10 +178,10 @@ PhytronDoseAxis* PhytronDoseController::getAxis(int axisNo)
asynStatus PhytronController::transactController(int axisNo,char command[COMLEN], char reply[COMLEN])
{
asynStatus status = asynSuccess;
size_t in = 0, out = 0;
int reason = 0;
char myReply[COMLEN+10] = {0}, myCommand[COMLEN+10] = {0}, *pPtr = {0};
asynStatus status;
size_t in, out;
int reason;
char myReply[COMLEN+10], myCommand[COMLEN+10], *pPtr;
SINQAxis *axis = getAxis(axisNo);
@@ -237,12 +237,11 @@ asynStatus PhytronController::transactController(int axisNo,char command[COMLEN]
*
* Initializes register numbers, etc.
*/
PhytronAxis::PhytronAxis(PhytronController *pC, int axisNo, int enc, int ignoreLimits)
PhytronAxis::PhytronAxis(PhytronController *pC, int axisNo, int enc)
: SINQAxis(pC, axisNo),
pC_(pC)
{
encoder = enc;
ignore_limits = ignoreLimits;
if(axisNo == 1){
phytronChar = 'X';
} else {
@@ -437,9 +436,8 @@ asynStatus PhytronAxis::setPosition(double position)
errlogPrintf("PhytronAxis::setPosition called with %lf\n", position);
// writing encoder register is wrong
//sprintf(command, "%s%cP22S%f", pC_->selector,phytronChar, position/1000.);
//status = pC_->transactController(axisNo_,command,reply);
sprintf(command, "%s%cP22S%f", pC_->selector,phytronChar, position/1000.);
status = pC_->transactController(axisNo_,command,reply);
sprintf(command, "%s%cP20S%f", pC_->selector,phytronChar, position/1000.);
status = pC_->transactController(axisNo_,command,reply);
next_poll = -1;
@@ -469,6 +467,8 @@ asynStatus PhytronAxis::poll(bool *moving)
{
asynStatus comStatus = asynSuccess;
char command[COMLEN], reply[COMLEN];
double lowlim;
// protect against excessive polling
if(time(NULL) < next_poll){
@@ -538,7 +538,13 @@ asynStatus PhytronAxis::poll(bool *moving)
if(!*moving) {
if(homing){
setIntegerParam(pC_->motorStatusAtHome_, true);
if(homing_direction) {
pC_->getDoubleParam(axisNo_,pC_->motorHighLimit_,&lowlim);
} else {
pC_->getDoubleParam(axisNo_,pC_->motorLowLimit_,&lowlim);
}
setPosition(lowlim);
setIntegerParam(pC_->motorStatusAtHome_, true);
} else {
/*
check limits and errors, upper
@@ -550,7 +556,7 @@ asynStatus PhytronAxis::poll(bool *moving)
updateMsgTxtFromDriver("No connection to phytron controller");
goto skip;
}
if(strstr(reply,"ACKE") != NULL && ignore_limits == 0){
if(strstr(reply,"ACKE") != NULL){
setIntegerParam(pC_->motorStatusHighLimit_, true);
updateMsgTxtFromDriver("Hit High Limit");
comStatus = asynError;
@@ -569,7 +575,7 @@ asynStatus PhytronAxis::poll(bool *moving)
updateMsgTxtFromDriver("No connection to phytron controller");
goto skip;
}
if(strstr(reply,"ACKE") != NULL && ignore_limits == 0){
if(strstr(reply,"ACKE") != NULL){
setIntegerParam(pC_->motorStatusLowLimit_, true);
updateMsgTxtFromDriver("Low Limit Hit");
comStatus = asynError;
@@ -610,7 +616,7 @@ asynStatus PhytronAxis::poll(bool *moving)
*/
PhytronDoseAxis::PhytronDoseAxis(PhytronController *pC, int axisNo, int enc)
: PhytronAxis(pC, axisNo, enc, 0)
: PhytronAxis(pC, axisNo, enc)
{
if(axisNo == 1){
doseChar = '3';
@@ -714,19 +720,15 @@ static const iocshArg PhytronCreateControllerArg1 = {"Phytron port name", iocshA
static const iocshArg PhytronCreateControllerArg2 = {"Phytron Selector", iocshArgString};
static const iocshArg PhytronCreateControllerArg3 = {"EncoderX", iocshArgInt};
static const iocshArg PhytronCreateControllerArg4 = {"EncoderY", iocshArgInt};
static const iocshArg PhytronCreateControllerArg5 = {"IgnoreLimitsX", iocshArgInt};
static const iocshArg PhytronCreateControllerArg6 = {"IgnoreLimitsY", iocshArgInt};
static const iocshArg * const PhytronCreateControllerArgs[] = {&PhytronCreateControllerArg0,
&PhytronCreateControllerArg1,
&PhytronCreateControllerArg2,
&PhytronCreateControllerArg3,
&PhytronCreateControllerArg4,
&PhytronCreateControllerArg5,
&PhytronCreateControllerArg6};
static const iocshFuncDef PhytronCreateControllerDef = {"PhytronCreateController", 7, PhytronCreateControllerArgs};
&PhytronCreateControllerArg2,
&PhytronCreateControllerArg3,
&PhytronCreateControllerArg4};
static const iocshFuncDef PhytronCreateControllerDef = {"PhytronCreateController", 5, PhytronCreateControllerArgs};
static void PhytronCreateContollerCallFunc(const iocshArgBuf *args)
{
PhytronCreateController(args[0].sval, args[1].sval, args[2].sval, args[3].ival,args[4].ival, args[5].ival, args[6].ival);
PhytronCreateController(args[0].sval, args[1].sval, args[2].sval, args[3].ival,args[4].ival);
}
static const iocshArg PhytronDoseCreateControllerArg0 = {"Port name", iocshArgString};
+2 -3
View File
@@ -30,7 +30,7 @@ class PhytronAxis : public SINQAxis
{
public:
/* These are the methods we override from the base class */
PhytronAxis(class PhytronController *pC, int axis, int enc, int ignoreLimits);
PhytronAxis(class PhytronController *pC, int axis, int enc);
void report(FILE *fp, int level);
asynStatus move(double position, int relative, double min_velocity, double max_velocity, double acceleration);
asynStatus moveVelocity(double min_velocity, double max_velocity, double acceleration);
@@ -50,7 +50,6 @@ protected:
int homing_direction; /*1 forward, 0 backwards */
time_t next_poll;
int encoder;
int ignore_limits;
int haveBrake;
int brakeIO;
@@ -75,7 +74,7 @@ PhytronDoseController *pC_;
class PhytronController : public SINQController {
public:
PhytronController(const char *portName, const char *PhytronPortName, const char *selector,
int encX, int encY, int ignoreLimitsX, int ignoreLimitsY);
int encX, int encY);
void report(FILE *fp, int level);
PhytronAxis* getAxis(asynUser *pasynUser);
+162
View File
@@ -0,0 +1,162 @@
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
################################################################################
# This converts the hex form of a wireshark analysis follow to something
# more human readable.
#
# It is only partially implemented!
################################################################################
f_name="${1}"
if [ "$#" -eq 2 ]; then
filt="${2}"
fi
declare -A POSITION_MODE
POSITION_MODE[1]="RELATIVE"
POSITION_MODE[2]="ABSOLUTE"
POSITION_MODE[3]="INTERNAL_REFERANCE"
POSITION_MODE[4]="EXTERNAL_REFERANCE"
declare -A COMMANDS
function to_ord() {
printf "%x" "'$1"
}
function add_char() {
COMMANDS["$(to_ord "$1")"]="$2"
}
function add_ord() {
COMMANDS["$1"]="$2"
}
add_char A Start_Movement
add_char C Get_Position
add_char D Set_Position_And_Clear_Error
add_char d Set_Direction
add_char p Set_Position_Mode
add_char '$' Get_Status
add_char 0 0
add_char 1 1
add_char 2 2
add_char 3 3
add_char 4 4
add_char 5 5
add_char 6 6
add_char 7 7
add_char 8 8
add_char 9 9
add_char '#' '#'
add_ord 00 ''
add_ord 0d '' # '\r'
add_ord 2b '+'
add_ord 2d '-'
while read -r line; do
fields="$( echo "${line}" | sed -e 's/^ *//' -e 's/ /:/' -e 's/ /:/' | tr -s ' ' )"
IFS=' ' bytes=($( echo "${fields}" | cut -d':' -f2))
string="$( echo "${fields}" | cut -d':' -f3)"
parsing_number=-1
num_len=0
is_negative=0
human_readable=()
for byte in "${bytes[@]}"; do
if [[ -v COMMANDS["${byte}"] ]]; then
if [[ "${COMMANDS["${byte}"]}" == Get_Status ]] || [[ "${COMMANDS["${byte}"]}" == Get_Position ]] || [[ "${COMMANDS["${byte}"]}" == Set_Position_Mode ]] || [[ "${COMMANDS["${byte}"]}" == Set_Position_And_Clear_Error ]]; then
parsing_number=0
numlen=0
is_negative=0
elif [[ "${parsing_number}" -ge 0 ]] && ( [[ "${byte}" == 00 ]] || [[ "${byte}" == 0d ]] ); then
if [[ "${num_len}" -ge 1 ]]; then
if [[ "${human_readable[${#human_readable[@]}-1]}" == Get_Status ]]; then
if [[ "$(( parsing_number & 2#0001 ))" -eq 1 ]]; then
human_readable=("${human_readable[@]}" "READY")
fi
if [[ "$(( parsing_number & 2#0010 ))" -eq 1 ]]; then
human_readable=("${human_readable[@]}" "ZERO-POS_REACHED")
fi
if [[ "$(( parsing_number & 2#0100 ))" -eq 1 ]]; then
human_readable=("${human_readable[@]}" "POSITIONING_ERROR")
fi
if [[ "$(( parsing_number & 2#1000 ))" -eq 1 ]]; then
human_readable=("${human_readable[@]}" "SOMETHING?")
fi
elif [[ "${human_readable[${#human_readable[@]}-1]}" == Set_Position_Mode ]]; then
human_readable=("${human_readable[@]}" "${POSITION_MODE[${parsing_number}]}")
else
if [[ "${is_negative}" -eq 1 ]]; then
human_readable=("${human_readable[@]}" "$(( parsing_number * -1))")
else
human_readable=("${human_readable[@]}" "${parsing_number}")
fi
fi
fi
parsing_number=-1
continue
elif [ "${parsing_number}" -ge 0 ]; then
if [[ "${COMMANDS["${byte}"]}" == '-' ]]; then
is_negative=1
elif [[ "${COMMANDS["${byte}"]}" == '+' ]]; then
is_negative=0
else
parsing_number="$(( parsing_number * 10 + "${COMMANDS["${byte}"]}" ))"
fi
num_len=$(( num_len + 1 ))
continue
fi
if [ "${#human_readable[@]}" -gt 0 ]; then
human_readable=("${human_readable[@]}" "${COMMANDS["${byte}"]}")
else
human_readable=("${COMMANDS["${byte}"]}")
fi
else
if [ "${#human_readable[@]}" -gt 0 ]; then
human_readable=("${human_readable[@]}" "${byte}(unknown)")
else
human_readable=("${byte}(unknown)")
fi
fi
done
if [[ "${human_readable[0]}" == '#' ]]; then
if [[ -z "${filt+x}" ]]; then
echo "Sent: ${human_readable[@]}"
else
if [[ "${human_readable[1]}" == "${filt}" ]]; then
echo "Sent: ${human_readable[@]}"
fi
fi
else
# Some commands prefix the response with two 0's (I assume there can be
# more axes)
if [[ "${human_readable[0]}" == 0 ]] && [[ "${human_readable[1]}" == 0 ]]; then
IFS=' ' human_readable=("${human_readable[@]:2}")
fi
if [[ -z "${filt+x}" ]]; then
echo "Received: ${human_readable[@]}"
else
if [[ "${human_readable[0]}" == "${filt}" ]]; then
echo "Received: ${human_readable[@]}"
fi
fi
fi
done < "${f_name}"