Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cb70054a72 |
@@ -1,21 +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 sinqEPICSApp/src/*.cpp
|
|
||||||
- name: formatting
|
|
||||||
run: clang-format --style=file --Werror --dry-run sinqEPICSApp/src/*.cpp sinqEPICSApp/src/*.c sinqEPICSApp/src/*.h
|
|
||||||
Build:
|
|
||||||
runs-on: linepics
|
|
||||||
steps:
|
|
||||||
- name: checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- run: |
|
|
||||||
sed -i 's/ARCH_FILTER=.*/ARCH_FILTER=linux%/' Makefile.RHEL8
|
|
||||||
make -f Makefile.RHEL8 install
|
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
default:
|
||||||
|
image: docker.psi.ch:5000/wall_e/sinqepics:latest
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
- build
|
||||||
|
|
||||||
|
cppcheck:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- cppcheck --std=c++17 --addon=cert --addon=misc --error-exitcode=1 sinqEPICSApp/
|
||||||
|
allow_failure: true # Long term this needs to be removed
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
|
||||||
|
formatting:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- clang-format --style=file --Werror --dry-run sinqEPICSApp/src/*.cpp sinqEPICSApp/src/*.c sinqEPICSApp/src/*.h
|
||||||
|
allow_failure: true # Long term this needs to be removed
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
|
||||||
|
# clangtidy:
|
||||||
|
# stage: test
|
||||||
|
# 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:
|
||||||
|
# # - docker
|
||||||
|
|
||||||
|
build_module:
|
||||||
|
stage: build
|
||||||
|
script:
|
||||||
|
- sed -i 's/ARCH_FILTER=.*/ARCH_FILTER=linux%/' Makefile.RHEL8
|
||||||
|
- make -f Makefile.RHEL8 install
|
||||||
|
- cp -rT "/ioc/modules/sinq/$(ls -U /ioc/modules/sinq/ | head -1)" "./sinq-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
artifacts:
|
||||||
|
name: "sinq-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
paths:
|
||||||
|
- "sinq-${CI_COMMIT_SHORT_SHA}/*"
|
||||||
|
expire_in: 1 week
|
||||||
|
when: always
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
+7
-8
@@ -4,7 +4,7 @@ include /ioc/tools/driver.makefile
|
|||||||
MODULE=sinq
|
MODULE=sinq
|
||||||
BUILDCLASSES=Linux
|
BUILDCLASSES=Linux
|
||||||
EPICS_VERSIONS=7.0.7
|
EPICS_VERSIONS=7.0.7
|
||||||
ARCH_FILTER=RHEL8%
|
ARCH_FILTER=RHEL%
|
||||||
|
|
||||||
# additional module dependencies
|
# additional module dependencies
|
||||||
REQUIRED+=SynApps
|
REQUIRED+=SynApps
|
||||||
@@ -12,18 +12,17 @@ REQUIRED+=stream
|
|||||||
REQUIRED+=scaler
|
REQUIRED+=scaler
|
||||||
REQUIRED+=motorBase
|
REQUIRED+=motorBase
|
||||||
|
|
||||||
|
# Release version
|
||||||
|
LIBVERSION=2025-with-pmac
|
||||||
|
|
||||||
# DB files to include in the release
|
# DB files to include in the release
|
||||||
TEMPLATES += sinqEPICSApp/Db/dimetix.db
|
TEMPLATES += sinqEPICSApp/Db/dimetix.db
|
||||||
TEMPLATES += sinqEPICSApp/Db/slsvme.db
|
TEMPLATES += sinqEPICSApp/Db/slsvme.db
|
||||||
TEMPLATES += sinqEPICSApp/Db/spsamor.db
|
TEMPLATES += sinqEPICSApp/Db/spsamor.db
|
||||||
TEMPLATES += sinqEPICSApp/Db/el734.db
|
|
||||||
|
|
||||||
# DBD files to include in the release
|
# DBD files to include in the release
|
||||||
DBDS += sinqEPICSApp/src/sinq.dbd
|
DBDS += sinqEPICSApp/src/sinq.dbd
|
||||||
|
|
||||||
# Release version
|
|
||||||
LIBVERSION=2026
|
|
||||||
|
|
||||||
# Source files to build
|
# Source files to build
|
||||||
SOURCES += sinqEPICSApp/src/devScalerEL737.c
|
SOURCES += sinqEPICSApp/src/devScalerEL737.c
|
||||||
SOURCES += sinqEPICSApp/src/SINQController.cpp
|
SOURCES += sinqEPICSApp/src/SINQController.cpp
|
||||||
@@ -33,9 +32,9 @@ SOURCES += sinqEPICSApp/src/NanotecDriver.cpp
|
|||||||
SOURCES += sinqEPICSApp/src/stptok.cpp
|
SOURCES += sinqEPICSApp/src/stptok.cpp
|
||||||
SOURCES += sinqEPICSApp/src/PhytronDriver.cpp
|
SOURCES += sinqEPICSApp/src/PhytronDriver.cpp
|
||||||
SOURCES += sinqEPICSApp/src/EuroMoveDriver.cpp
|
SOURCES += sinqEPICSApp/src/EuroMoveDriver.cpp
|
||||||
# SOURCES += sinqEPICSApp/src/pmacAsynIPPort.c
|
SOURCES += sinqEPICSApp/src/pmacAsynIPPort.c
|
||||||
# SOURCES += sinqEPICSApp/src/pmacAxis.cpp
|
SOURCES += sinqEPICSApp/src/pmacAxis.cpp
|
||||||
# SOURCES += sinqEPICSApp/src/pmacController.cpp
|
SOURCES += sinqEPICSApp/src/pmacController.cpp
|
||||||
SOURCES += sinqEPICSApp/src/MasterMACSDriver.cpp
|
SOURCES += sinqEPICSApp/src/MasterMACSDriver.cpp
|
||||||
SOURCES += sinqEPICSApp/src/C804Axis.cpp
|
SOURCES += sinqEPICSApp/src/C804Axis.cpp
|
||||||
SOURCES += sinqEPICSApp/src/C804Controller.cpp
|
SOURCES += sinqEPICSApp/src/C804Controller.cpp
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
record(motor,"$(P)$(M)")
|
|
||||||
{
|
|
||||||
field(DESC,"$(DESC)")
|
|
||||||
field(DTYP,"$(DTYP)")
|
|
||||||
field(DIR,"$(DIR)")
|
|
||||||
field(VELO,"$(VELO)")
|
|
||||||
field(HVEL,"$(VELO)")
|
|
||||||
field(VBAS,"$(VELO)")
|
|
||||||
field(VMAX, "${VMAX}")
|
|
||||||
field(ACCL,"$(ACCL)")
|
|
||||||
field(BDST,"$(BDST)")
|
|
||||||
field(BVEL,"$(BVEL)")
|
|
||||||
field(BACC,"$(BACC)")
|
|
||||||
field(OUT,"@asyn($(PORT),$(ADDR))")
|
|
||||||
field(MRES,"$(MRES)")
|
|
||||||
field(PREC,"$(PREC)")
|
|
||||||
field(EGU,"$(EGU)")
|
|
||||||
field(DHLM,"$(DHLM)")
|
|
||||||
field(DLLM,"$(DLLM)")
|
|
||||||
field(INIT,"$(INIT)")
|
|
||||||
field(PINI, "NO")
|
|
||||||
field(TWV,"1")
|
|
||||||
field(RTRY,"0")
|
|
||||||
}
|
|
||||||
|
|
||||||
# The message text
|
|
||||||
record(waveform, "$(P)$(M)-MsgTxt") {
|
|
||||||
field(DTYP, "asynOctetRead")
|
|
||||||
field(INP, "@asyn($(PORT),$(N),1) MOTOR_MESSAGE_TEXT")
|
|
||||||
field(FTVL, "CHAR")
|
|
||||||
field(NELM, "80")
|
|
||||||
field(SCAN, "I/O Intr")
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -505,10 +505,7 @@ asynStatus EL734Axis::poll(bool *moving)
|
|||||||
// errlogPrintf("Axis %d, reply %s, msr %d, oredmsr = %d, position = %lf\n",
|
// errlogPrintf("Axis %d, reply %s, msr %d, oredmsr = %d, position = %lf\n",
|
||||||
// axisNo_, reply, msr, oredMSR, position);
|
// axisNo_, reply, msr, oredMSR, position);
|
||||||
|
|
||||||
// Reset the error during each poll. This is necessary because some errors
|
oredMSR |= msr;
|
||||||
// apparently don't get cleared by the controller (especially "lower / higher
|
|
||||||
// limit hit").
|
|
||||||
oredMSR = msr;
|
|
||||||
if ((msr & 0x1) == 0)
|
if ((msr & 0x1) == 0)
|
||||||
{
|
{
|
||||||
// done: check for trouble
|
// done: check for trouble
|
||||||
|
|||||||
@@ -250,8 +250,6 @@ PhytronAxis::PhytronAxis(PhytronController *pC, int axisNo, int enc)
|
|||||||
haveBrake = 0;
|
haveBrake = 0;
|
||||||
brakeIO = -1;
|
brakeIO = -1;
|
||||||
next_poll = -1;
|
next_poll = -1;
|
||||||
homing = 0;
|
|
||||||
homing_direction = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int PhytronAxis::setBrake(int brakeNO)
|
int PhytronAxis::setBrake(int brakeNO)
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ registrar(EL734Register)
|
|||||||
registrar(PhytronRegister)
|
registrar(PhytronRegister)
|
||||||
registrar(EuroMoveRegister)
|
registrar(EuroMoveRegister)
|
||||||
registrar(NanotecRegister)
|
registrar(NanotecRegister)
|
||||||
# registrar(pmacControllerRegister)
|
registrar(pmacControllerRegister)
|
||||||
registrar(C804ControllerRegister)
|
registrar(C804ControllerRegister)
|
||||||
# registrar(pmacAsynIPPortRegister)
|
registrar(pmacAsynIPPortRegister)
|
||||||
registrar(MasterMACSRegister)
|
registrar(MasterMACSRegister)
|
||||||
registrar(SINQControllerRegister)
|
registrar(SINQControllerRegister)
|
||||||
|
|
||||||
|
|||||||
@@ -1,162 +0,0 @@
|
|||||||
#!/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}"
|
|
||||||
Reference in New Issue
Block a user