diff --git a/.ci b/.ci index 12d76983..20f8e053 160000 --- a/.ci +++ b/.ci @@ -1 +1 @@ -Subproject commit 12d769835e1ee88e94b5b0b4bc0cf7068e678064 +Subproject commit 20f8e053931fdef8a9413cc6229286c5d9ed152f diff --git a/.ci-local/github-actions/post-prepare.py b/.ci-local/github-actions/post-prepare.py new file mode 100755 index 00000000..01e985b6 --- /dev/null +++ b/.ci-local/github-actions/post-prepare.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import os +import sys +import subprocess + +from util import * + +def get_submodule_releases(): + # + releases = [] + for root, dirs, files in os.walk('modules'): + for submodule in dirs: + if 'motor' in submodule: + release_path = "modules/{}/configure/RELEASE".format(submodule) + if os.path.exists(release_path): + releases.append(release_path) + return releases[:] + +# Comment out SUPPORT from motor's RELEASE file +motor_release = "configure/RELEASE" +update_release_file(motor_release, "SUPPORT", '#') +print("{}Updated {}{}".format(ANSI_BLUE, motor_release, ANSI_RESET)) +grep_release_file(motor_release, "#SUPPORT") + +# Comment out SUPPORT from the driver module RELEASE files +releases = get_submodule_releases() +for release in releases: + updated = update_release_file(release, "SUPPORT", '#') + if updated: + print("{}Updated {}{}".format(ANSI_BLUE, release, ANSI_RESET)) + grep_release_file(release, "#SUPPORT") diff --git a/.ci-local/github-actions/sanity-check.py b/.ci-local/github-actions/sanity-check.py new file mode 100644 index 00000000..4e32f6d3 --- /dev/null +++ b/.ci-local/github-actions/sanity-check.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python + +import os +import pprint + +pprint.pprint(dict(os.environ), width = 1) + +#!print("{}", breakmehere) + diff --git a/.ci-local/github-actions/util.py b/.ci-local/github-actions/util.py new file mode 100644 index 00000000..9bca4879 --- /dev/null +++ b/.ci-local/github-actions/util.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +from __future__ import print_function + +import logging +import fileinput +import os + +# Setup ANSI Colors +ANSI_RED = "\033[31;1m" +ANSI_GREEN = "\033[32;1m" +ANSI_YELLOW = "\033[33;1m" +ANSI_BLUE = "\033[34;1m" +ANSI_MAGENTA = "\033[35;1m" +ANSI_CYAN = "\033[36;1m" +ANSI_RESET = "\033[0m" +ANSI_CLEAR = "\033[0K" + +logger = logging.getLogger(__name__) + +def create_file(filename): + dirname = os.path.dirname(filename) + print(dirname) + if not os.path.exists(dirname): + os.makedirs(dirname, 0o0755) + if not os.path.exists(filename): + fh = open(filename, 'w') + fh.close() + else: + logger.debug("{} already exists".format(filename)) + +# Update a definition in a release file that already exists +# Append a defintion to a release file that already exists +# Commented out a definition in a release file (location='#') +def update_release_file(filename, var, location): + updated_line = '{0}={1}'.format(var, location.replace('\\', '/')) + + found = False + logger.debug("Opening '%s' for adding '%s'", filename, updated_line) + for line in fileinput.input(filename, inplace=1): + output_line = line.strip() + if '{0}='.format(var) in line: + logger.debug("Found '%s=' line, replacing", var) + found = True + if location != '#': + output_line = updated_line + else: + if output_line[0] != '#': + output_line = "#{}".format(output_line) + logger.debug("Writing line to '%s': '%s'", filename, output_line) + print(output_line) + fileinput.close() + + if not found and location != '#': + fh = open(release_local, "a") + logger.debug("Adding new definition: '%s'", updated_line) + print(updated_line, file=fh) + fh.close() + + return found + +def grep_release_file(filename, var): + fh = open(filename, 'r') + for line in fh: + if '{0}='.format(var) in line: + print(line) + fh.close() + diff --git a/.ci-local/modules.set b/.ci-local/modules.set index 9479f5db..8ccd765f 100644 --- a/.ci-local/modules.set +++ b/.ci-local/modules.set @@ -1,7 +1,7 @@ MODULES="sncseq ipac asyn autosave busy" -SNCSEQ=R2-2-8 +SNCSEQ=R2-2-9 IPAC=master -ASYN=R4-38 -AUTOSAVE=R5-9 -BUSY=R1-7-1 +ASYN=R4-42 +AUTOSAVE=R5-10-2 +BUSY=R1-7-3 diff --git a/.github/workflows/ci-scripts-build-full.yml b/.github/workflows/ci-scripts-build-full.yml new file mode 100644 index 00000000..050e780a --- /dev/null +++ b/.github/workflows/ci-scripts-build-full.yml @@ -0,0 +1,195 @@ +# .github/workflows/ci-scripts-build.yml for use with EPICS Base ci-scripts +# (see: https://github.com/epics-base/ci-scripts) + +# This is YAML - indentation levels are crucial + +# Set the 'name:' properties to values that work for you (MYMODULE) + +name: "GHA full build" + +# Only run manually +on: + workflow_dispatch + +env: + SETUP_PATH: .ci-local:.ci + # For the sequencer on Linux/Windows/MacOS + APT: re2c + CHOCO: re2c + BREW: re2c + +jobs: + build-base: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + # Set environment variables from matrix parameters + env: + CMP: ${{ matrix.cmp }} + BCFG: ${{ matrix.configuration }} + BASE: ${{ matrix.base }} + WINE: ${{ matrix.wine }} + RTEMS: ${{ matrix.rtems }} + RTEMS_TARGET: ${{ matrix.rtems_target }} + EXTRA: ${{ matrix.extra }} + TEST: ${{ matrix.test }} + SET: ${{ matrix.set }} + strategy: + fail-fast: false + matrix: + # Job names also name artifacts, character limitations apply + include: + - os: ubuntu-20.04 + cmp: gcc + configuration: default + wine: "64" + base: "7.0" + set: modules + name: "Ub-20 gcc-9 + MinGW" + + - os: ubuntu-20.04 + cmp: gcc + configuration: static + wine: "64" + base: "7.0" + set: modules + name: "Ub-20 gcc-9 + MinGW, static" + + - os: ubuntu-20.04 + cmp: gcc + configuration: static + extra: "CMD_CXXFLAGS=-std=c++11" + base: "7.0" + set: modules + name: "Ub-20 gcc-9 C++11, static" + + - os: ubuntu-20.04 + cmp: clang + configuration: default + extra: "CMD_CXXFLAGS=-std=c++11" + base: "7.0" + set: modules + name: "Ub-20 clang-10 C++11" + + ### fails building autosave + #!- os: ubuntu-20.04 + #! cmp: gcc + #! configuration: default + #! rtems: "4.10" + #! base: "7.0" + #! set: modules + #! name: "Ub-20 gcc-9 + RT-4.10" + + - os: ubuntu-20.04 + cmp: gcc + configuration: default + rtems: "4.9" + base: "7.0" + set: modules + name: "Ub-20 gcc-9 + RT-4.9" + + ### fails building asyn + #!- os: ubuntu-20.04 + #! cmp: gcc + #! configuration: default + #! rtems: "5" + #! rtems_target: RTEMS-pc686-qemu + #! base: "7.0" + #! set: modules + #! name: "Ub-20 gcc-9 + RT-5.1 pc686" + + ### fails building autosave + #!- os: ubuntu-20.04 + #! cmp: gcc + #! configuration: default + #! rtems: "5" + #! rtems_target: RTEMS-beatnik + #! test: NO + #! base: "7.0" + #! set: modules + #! name: "Ub-20 gcc-9 + RT-5.1 beatnik" + + #!- os: ubuntu-20.04 + #! cmp: gcc-8 + #! utoolchain: true + #! configuration: default + #! base: "7.0" + #! set: modules + #! name: "Ub-20 gcc-8" + + - os: ubuntu-20.04 + cmp: clang + configuration: default + base: "7.0" + set: modules + name: "Ub-20 clang-10" + + - os: macos-latest + cmp: clang + configuration: default + base: "7.0" + set: modules + name: "MacOS clang-12" + + - os: windows-2019 + cmp: gcc + configuration: default + base: "7.0" + set: modules + name: "Win2019 MinGW" + + - os: windows-2019 + cmp: gcc + configuration: static + base: "7.0" + set: modules + name: "Win2019 MinGW, static" + + - os: windows-2019 + cmp: vs2019 + configuration: default + base: "7.0" + set: modules + name: "Win2019 MSC-19" + + - os: windows-2019 + cmp: vs2019 + configuration: static + base: "7.0" + set: modules + name: "Win2019 MSC-19, static" + + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Automatic core dumper analysis + uses: mdavidsaver/ci-core-dumper@master + - name: "apt-get install" + run: | + sudo apt-get update + sudo apt-get -y install qemu-system-x86 g++-mingw-w64-x86-64 gdb + if: runner.os == 'Linux' + - name: "apt-get install ${{ matrix.cmp }}" + run: | + sudo apt-get -y install software-properties-common + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get -y install ${{ matrix.cmp }} + if: matrix.utoolchain + - name: Sanity Check + run: python .ci-local/github-actions/sanity-check.py + - name: Prepare and compile dependencies + run: python .ci/cue.py prepare + - name: Patch main module + run: python .ci-local/github-actions/post-prepare.py + - name: Build main module + run: python .ci/cue.py build + - name: Run main module tests + run: python .ci/cue.py test + - name: Upload tapfiles Artifact + uses: actions/upload-artifact@v4 + with: + name: tapfiles ${{ matrix.name }} + path: '**/O.*/*.tap' + - name: Collect and show test results + run: python .ci/cue.py test-results diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml new file mode 100644 index 00000000..55344899 --- /dev/null +++ b/.github/workflows/ci-scripts-build.yml @@ -0,0 +1,104 @@ +# .github/workflows/ci-scripts-build.yml for use with EPICS Base ci-scripts +# (see: https://github.com/epics-base/ci-scripts) + +# This is YAML - indentation levels are crucial + +# Set the 'name:' properties to values that work for you (MYMODULE) + +name: "GHA build" + +# Trigger on pushes to the master branch and PRs +on: + push: + paths-ignore: + - 'documentation/*' + - '**/*.html' + - '**/*.md' + - '.github/workflows/ci-scripts-build-full.yml' + branches: + - master + pull_request: + +env: + SETUP_PATH: .ci-local:.ci + # For the sequencer on Linux/Windows/MacOS + APT: re2c + CHOCO: re2c + BREW: re2c + +jobs: + build-base: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + # Set environment variables from matrix parameters + env: + CMP: ${{ matrix.cmp }} + BCFG: ${{ matrix.configuration }} + BASE: ${{ matrix.base }} + WINE: ${{ matrix.wine }} + RTEMS: ${{ matrix.rtems }} + RTEMS_TARGET: ${{ matrix.rtems_target }} + EXTRA: ${{ matrix.extra }} + TEST: ${{ matrix.test }} + SET: ${{ matrix.set }} + strategy: + fail-fast: false + matrix: + # Job names also name artifacts, character limitations apply + include: + - os: ubuntu-20.04 + cmp: gcc + configuration: default + base: "7.0" + set: modules + name: "7.0 Ub-20 gcc-9" + + - os: macos-latest + cmp: clang + configuration: default + base: "3.15" + set: modules + name: "3.15 MacOS clang-12" + + - os: windows-2019 + cmp: vs2019 + configuration: static + base: "3.15" + set: modules + name: "3.15 Win VS2019, static" + + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Automatic core dumper analysis + uses: mdavidsaver/ci-core-dumper@master + - name: "apt-get install" + run: | + sudo apt-get update + sudo apt-get -y install qemu-system-x86 g++-mingw-w64-x86-64 gdb + if: runner.os == 'Linux' + - name: "apt-get install ${{ matrix.cmp }}" + run: | + sudo apt-get -y install software-properties-common + sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get -y install ${{ matrix.cmp }} + if: matrix.utoolchain + - name: Sanity Check + run: python .ci-local/github-actions/sanity-check.py + - name: Prepare and compile dependencies + run: python .ci/cue.py prepare + - name: Patch main module + run: python .ci-local/github-actions/post-prepare.py + - name: Build main module + run: python .ci/cue.py build + - name: Run main module tests + run: python .ci/cue.py test + - name: Upload tapfiles Artifact + uses: actions/upload-artifact@v4 + with: + name: tapfiles ${{ matrix.name }} + path: '**/O.*/*.tap' + - name: Collect and show test results + run: python .ci/cue.py test-results diff --git a/.gitignore b/.gitignore index 1263d689..2d9ca64e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,11 @@ O.* *.swp *BAK.adl bin/ -db/ +/db/ dbd/ html/ include/ +/iocsh/ lib/ templates/ cdCommands diff --git a/README.md b/README.md index 738cdc1c..741bd684 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # motor -[![Build Status](https://travis-ci.org/epics-modules/motor.png)](https://travis-ci.org/epics-modules/motor) +[![Build Status](https://github.com/epics-modules/motor/actions/workflows/ci-scripts-build.yml/badge.svg)](https://github.com/epics-modules/motor/actions/workflows/ci-scripts-build.yml) + This module contains motor support for the Experimental Physics and Industrial Control System (EPICS). diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 97f6a7ff..5e94d3a3 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -1,5 +1,93 @@ # Motor Releases +## __R7-3-1 (2023-06-07)__ +R7-3-1 is a release based on the master branch. + +### Changes since R7-3 + +#### Modifications to existing features +* Commit [5eb994d](https://github.com/epics-modules/motor/commit/5eb994dc5e0f8a809382b300ad13f8c83e7da33b) from [Mark Rivers](https://github.com/MarkRivers): Added readController() functions to asynMotorController + +#### Driver submodules (and noteworthy changes) + +| Module | Release | Changes | +| ---------------- | ------- | ------- | +| **motorAcsMotion** | [R2-2](https://github.com/epics-motor/motorAcsMotion/releases/tag/R2-2) | Improved homing and workaround for vxWorks build error | + +## __R7-3 (2023-05-23)__ +R7-3 is a release based on the master branch. + +### Changes since R7-2-2 + +#### New features +* Commit [c764bd6](https://github.com/epics-modules/motor/commit/c764bd6426c3939bded75df2909b76d148c2f8c9): Added motorAcsMotion as a submodule +* Pull request [#160](https://github.com/epics-modules/motor/pull/160) from [Torsten Bögershausen](https://github.com/tboegi): Added the Restore Mode (**RSTM**) field +* Pull request [#163](https://github.com/epics-modules/motor/pull/163): Autosave the RSTM field and allow it to be specified when motor databases are loaded +* Pull request [#197](https://github.com/epics-modules/motor/pull/197): Added model-2-specific databases to work around MOTOR_REC_{OFFSET,RESOLUTION,DIRECTION} errors at iocInit +* Pull request [#193](https://github.com/epics-modules/motor/pull/193) from [Jack Harper](https://github.com/rerpha): Added raw limit (**RHLM**, **RLLM**) fields +* Pull request [#202](https://github.com/epics-modules/motor/pull/202) and [#204](https://github.com/epics-modules/motor/pull/204): Added prop(YES) to fields in motorRecord.dbd that should generate DBE_PROPERTY callbacks +* Pull request [#122](https://github.com/epics-modules/motor/pull/122) from [Torsten Bögershausen](https://github.com/tboegi): Addded Acceleration (**ACCS**) and Acceleration Used (**ACCU**) fields +* Pull request [#203](https://github.com/epics-modules/motor/pull/203): Changed the Acceleration Used (ACCU) field from a readback to a control + +#### Modifications to existing features +* Pull request [#180](https://github.com/epics-modules/motor/pull/180) from [Torsten Bögershausen](https://github.com/tboegi): Reset UEIP to 'No' if no encoder is present +* Pull request [#193](https://github.com/epics-modules/motor/pull/193) from [Jack Harper](https://github.com/rerpha): Soft limits are synced on MRES changes + +#### Bug fixes +* Pull request [#176](https://github.com/epics-modules/motor/pull/176) from [Torsten Bögershausen](https://github.com/tboegi): Added shareLib.h to motordrvCom.h for compatibility with base 7.0.4 +* Pull request [#182](https://github.com/epics-modules/motor/pull/182) from [Freddie Akeroyd](https://github.com/FreddieAkeroyd): Bug fix for negative backlash distance when relative moves are used +* Pull request [#167](https://github.com/epics-modules/motor/pull/167) from [Torsten Bögershausen](https://github.com/tboegi): devMotorAsyn: remove initEvent in init_record() +* Commit [c3d6c6e](https://github.com/epics-modules/motor/commit/c3d6c6ee439e4d46fd2d4c2790091f7c76e31120) from [Mark Rivers](https://github.com/MarkRivers): Fixes for DTYP and EGU not displaying correctly in Phoebus +* Pull request [#206](https://github.com/epics-modules/motor/pull/206) from [Torsten Bögershausen](https://github.com/tboegi): Bug fix for RHLM, RLLM when MRES is negative +* Pull request [#186](https://github.com/epics-modules/motor/pull/186) from [justincslac](https://github.com/justincslac): Bug fix for .gitignore that caused the Db dir to be ignored on case-insensitive file systems +* Commit [96509ca](https://github.com/epics-modules/motor/commit/96509caba2ea1995bfeca3a0e8f11e1f273d2e05) from [Keenan Lang](https://github.com/keenanlang): Added basic_asyn_motor_settings.req which allows autosaveBuild to work with basic_asyn_motor.db + +#### Documentation +* Commit [382c832](https://github.com/epics-modules/motor/commit/382c8324e5176ce769a09302bf829beca5a9cbea) from [Mark Rivers](https://github.com/MarkRivers): Added "Model 3 EPICS Motor Driver Support" slides +* Pull request [#190](https://github.com/epics-modules/motor/pull/190) from [Xiaoqiang Wang](https://github.com/xiaoqiangwang): Corrected field types in motorRecord.html + +#### Continuous Integration +* Configured to build with GitHub Actions using ci-scripts v3.0.1 + +#### Driver submodules (and noteworthy changes) + +All driver modules now use Github Actions for CI builds. + +| Module | Release | Changes | +| ---------------- | ------- | ------- | +| **motorAcs** | [R1-1-1](https://github.com/epics-motor/motorAcs/releases/tag/R1-1-1) | | +| **motorAcsMotion** | [R2-1](https://github.com/epics-motor/motorAcsMotion/releases/tag/R2-1) | Added as a motor submodule | +| **motorAcsTech80** | [R1-0-2](https://github.com/epics-motor/motorAcsTech80/releases/tag/R1-0-2) | | +| **motorAerotech** | [R1-1-1](https://github.com/epics-motor/motorAerotech/releases/tag/R1-1-1) | Ensemble driver and doCommand.ab bug fixes | +| **motorAMCI** | [R1-0-2](https://github.com/epics-motor/motorAMCI/releases/tag/R1-0-2) | Replaced printf calls with asynPrint calls in ANG1Driver.cpp | +| **motorAttocube** | [R1-0-2](https://github.com/epics-motor/motorAttocube/releases/tag/R1-0-2) | | +| **motorDeltaTau** | [R1-0-2](https://github.com/epics-motor/motorDeltaTau/releases/tag/R1-0-2) | | +| **motorFaulhaber** | [R1-0-2](https://github.com/epics-motor/motorFaulhaber/releases/tag/R1-0-2) | | +| **motorHytec** | [R1-0-3](https://github.com/epics-motor/motorHytec/releases/tag/R1-0-3) | | +| **motorIms** | [R1-0-2](https://github.com/epics-motor/motorIms/releases/tag/R1-0-2) | | +| **motorKohzu** | [R1-0-2](https://github.com/epics-motor/motorKohzu/releases/tag/R1-0-2) | | +| **motorMclennan** | [R1-1-1](https://github.com/epics-motor/motorMclennan/releases/tag/R1-1-1) | | +| **motorMicos** | [R2-1](https://github.com/epics-motor/motorMicos/releases/tag/R2-1) | Added support for the SMC Taurus | +| **motorMicroMo** | [R1-0-2](https://github.com/epics-motor/motorMicroMo/releases/tag/R1-0-2) | | +| **motorMicronix** | [R1-1](https://github.com/epics-motor/motorMicronix/releases/tag/R1-1) | | +| **motorMotorSim** | [R1-2](https://github.com/epics-motor/motorMotorSim/releases/tag/R1-2) | Added motorSim8x.iocsh. Multiple improvements to example IOC. | +| **motorMXmotor** | [R1-0-2](https://github.com/epics-motor/motorMXmotor/releases/tag/R1-0-2) | | +| **motorNewFocus** | [R1-2-1](https://github.com/epics-motor/motorNewFocus/releases/tag/R1-2-1) | Improved example newfocus8742 configuration. iocsh files now installed. | +| **motorNewport** | [R1-2-1](https://github.com/epics-motor/motorNewport/releases/tag/R1-2-1) | Added support for the FCL200. ESP300 driver now supports UEIP=Yes. iocsh files now installed. | +| **motorNPoint** | [R1-1](https://github.com/epics-motor/motorNPoint/releases/tag/R1-1) | | +| **motorOms** | [R1-2](https://github.com/epics-motor/motorOms/releases/tag/R1-2) | Enabled non-VxWorks IOCs & epicsMutexTryLock bug fix | +| **motorOmsAsyn** | [R1-0-3](https://github.com/epics-motor/motorOmsAsyn/releases/tag/R1-0-3) | Type fixes | +| **motorOriel** | [R1-0-2](https://github.com/epics-motor/motorOriel/releases/tag/R1-0-2) | | +| **motorParker** | [R1-1-1](https://github.com/epics-motor/motorParker/releases/tag/R1-1-1) | | +| **motorPhytron** | [R1-2](https://github.com/epics-motor/motorPhytron/releases/tag/R1-2) | Added encoder options. Bug fixes for deceleration and homing to limts. | +| **motorPI** | [R1-1-1](https://github.com/epics-motor/motorPI/releases/tag/R1-1-1) | Added E-816 example configuration. iocsh files now installed. | +| **motorPIGCS2** | [R1-2](https://github.com/epics-motor/motorPIGCS2/releases/tag/R1-2) | Added support for E-518 & E-873.3QTU controllers. Added closed loop commands for the E-727. Bug fixes. | +| **motorPiJena** | [R1-0-2](https://github.com/epics-motor/motorPiJena/releases/tag/R1-0-2) | | +| **motorScriptMotor** | [R1-2](https://github.com/epics-motor/motorScriptMotor/releases/tag/R1-2) | Added Attocube AMC support | +| **motorSmarAct** | [R2-0](https://github.com/epics-motor/motorSmarAct/releases/tag/R2-0) | Too many new features to list here; see [motorSmarAct release notes](https://github.com/epics-motor/motorSmarAct/releases/tag/R2-0) | +| **motorSmartMotor** | [R1-0-2](https://github.com/epics-motor/motorSmartMotor/releases/tag/R1-0-2) | | +| **motorThorLabs** | [R1-0-2](https://github.com/epics-motor/motorThorLabs/releases/tag/R1-0-2) | Added support for Kinesis KDC101 and KST101 | + ## __R7-2-2 (2021-02-02)__ R7-2-2 is a release based on the R7-2-1-bugfix branch. diff --git a/docs/index.html b/docs/index.html index 2e6515be..9f7bb765 100644 --- a/docs/index.html +++ b/docs/index.html @@ -50,13 +50,22 @@ the links in the table below:
github issues n/a + + R7-3 + R3.15.7 or later + motorR7-3-1.tar.gz + motorRecord.html + release notes + github issues + 2023-05-23 + R7-2 R3.15.7 or later - motorR7-2-1.tar.gz - motorRecord.html - release notes - github issues + motorR7-2-2.tar.gz + motorRecord.html + release notes + github issues 2020-05-13 @@ -324,6 +333,19 @@ the links in the table below:
Required modules Release needed + + R7-3 + ASYN  
+ IPAC  (for motorHytec & VME-based serial and GPIB examples)
+ LUA  (for motorScriptMotor)
+ MODBUS  (for motorAMCI IOCs) + + R4-41+
+ R2-16
+ R3-0
+ R3-2 + + R7-2 ASYN  
@@ -685,7 +707,7 @@ different releases of EPICS and/or the other required modules are needed).

-Page Last Modified: 2020-05-14
+Page Last Modified: 2023-06-07
Kevin Peterson

diff --git a/docs/motorDeviceDriver.html b/docs/motorDeviceDriver.html index 2a4ada64..33340bda 100644 --- a/docs/motorDeviceDriver.html +++ b/docs/motorDeviceDriver.html @@ -47,13 +47,13 @@ for new motor drivers.

The APIs described here are mainly intended to be used with the EPICS motor record. - However the Model 2 and Model 3 drivers are actually independent of the motor record. + However, the Model 2 and Model 3 drivers are actually independent of the motor record. They implement standard EPICS asyn interfaces, and can in principle be used with any EPICS records, and do not require the motor record. However, the motor record currently provides the only "state machine" logic that keeps track of backlash, - enforcing soft limits, etc. Model 2 and 3 drivers to permit access to controller-specific - features that the motor record does not support, and this is typicaly implemented - using standard EPICS records (ao, ai, bo, bi, etc.)

+ enforcing soft limits, etc. Model 2 and 3 drivers permit access to controller-specific + features that the motor record does not support, and this is typically implemented + using standard EPICS records (ao, ai, bo, bi, etc.).

Model 1 device and driver support

@@ -65,13 +65,13 @@

  • The communication channel between device support and driver is custom for the motor record, and is very limited.
  • The communication between device support and the driver is assumed to be via device-dependent - strings. Thus, it not suited to register-based controllers, or controllers where - the driver calls a vendor-library, rather than just sending strings to the controller.
  • -
  • Cannot use other records to with the driver, only the motor record. Cannot take + strings. Thus, it is not suited to register-based controllers, or controllers where + the driver calls a vendor library rather than just sending strings to the controller.
  • +
  • Cannot use other records with the driver, only the motor record. Cannot take advantage of controller-specific features not supported by the motor record.
  • There is no provision for multi-axis coordination.
  • There is only a single thread per controller type. This means that if a - system has, for example, many controllers of a given type then there is only one + system has, for example, many controllers of a given type, then there is only one polling thread for all of these controllers. This is because the poller must wait for each response before sending the next query. This can lead to significantly poorer performance compared to the Model 2 and Model 3 drivers, which have a separate @@ -89,7 +89,7 @@

    The Model 3 C++ API is based on the concept of two types of objects: a motor controller - and one or motor motor axes. The controller object supports the functions that apply + and one or more motor axes. The controller object supports the functions that apply to the entire controller. The controller supports one or more axes. The axis objects support the functions for a specific axis. These objects are implemented in the - device-dependent driver. There is a base class for each of these objects, asynMotorControlller + device-dependent driver. There is a base class for each of these objects, asynMotorController and asynMotorAxis.

    The asynMotorController base class has methods that handle much of the work in writing a driver, including implementing the asyn interfaces and calling the appropriate methods in the axis classes. A basic motor driver derived class will often only - need to implement only the constructor for the controller class, and can just use + need to implement the constructor for the controller class, and can just use the base class implementation of all other methods in the asynMotorController class.

    The asynMotorAxis base class on the other hand mainly provides dummy methods (asynMotorAxis::move(), asynMotorAxis::stop(), etc.). The main work in writing a Model 3 driver consists of implementing these methods in the derived class.

    - There are Model 3 drivers in the motor module for the simulation motor, Hytec XXXX, + There are Model 3 drivers in the motor module for the simulation motor, Hytec 8601, Newport XPS, Parker ACR series controllers (e.g. Aires), and the ACS MCB-4B.

    The ACS MCB-4B is the simplest Model 3 driver, consisting of only 336 lines of well-commented @@ -172,7 +172,7 @@ The number of axes on this controller.

  • numParams
    The number of controller-specific parameters for this controller.  If the driver - only implements the standard motor record parameters then this is set to 0.
  • + only implements the standard motor record parameters, then this is set to 0.
  • interfaceMask
    A bit mask for extra asyn interfaces supported by this controller. It is not necessary to specify the interfaces that the base class implements, which includes asynOctet, @@ -181,11 +181,11 @@
  • interruptMask
    A bit mask for extra asyn interfaces supported by this controller that will do callbacks to device support. It is not necessary to specify the interfaces that the base class - implements, which includes asynOctet, asynInt32, asynFloat64, asynFloat64Array, + implements, which include asynOctet, asynInt32, asynFloat64, asynFloat64Array, and asynGenericPointer. Normally set to 0.
  • asynFlags
    asyn flags to use when creating the asyn port. This is normally (ASYN_CANBLOCK | - ASYN_MULTIDEVICE). ASYN_CANBLOCK means that the driver is "slow" and asynchonous + ASYN_MULTIDEVICE). ASYN_CANBLOCK means that the driver is "slow" and asynchronous device support must be used. ASYN_MULTIDEVICE means that the device supports more than one asyn address, i.e. more than one motor axis.
  • autoConnect
    diff --git a/docs/motorRecord.html b/docs/motorRecord.html index 08c84a76..cc2ff48f 100644 --- a/docs/motorRecord.html +++ b/docs/motorRecord.html @@ -35,9 +35,9 @@ -

    Overview

    This documentation describes version R7-2-1 of the EPICS motor +

    Overview

    This documentation describes version R7-3-1 of the EPICS motor record, and related EPICS software required to build and use it.  Version -R7-2-1 of the motor record is compatible with EPICS base R3.15.7 and above. +R7-3-1 of the motor record is compatible with EPICS base R3.15.7 and above.

    The motor record is intended to support positioning motors of all kinds, but currently supports motor controllers from the following manufacturers: @@ -45,7 +45,7 @@ supports motor controllers from the following manufacturers: