Skip to content
Merged
Show file tree
Hide file tree
Changes from 59 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
467a854
Initial dev changes to OxInstIPS_SCPI.protocol
iangillingham-stfc Mar 12, 2025
1dcb2ed
Further SCPI migration
iangillingham-stfc Mar 27, 2025
5d73d90
Corrections to SCPI protocol on connection to real instrument
iangillingham-stfc May 1, 2025
6f9d113
Tests IOCS config changed to specify use of SCPI protocol
iangillingham-stfc May 1, 2025
8fa489d
Further corrections to SCPI protocol on connection to real instrument
iangillingham-stfc May 6, 2025
c9a7adf
Added voltage_limit to device_scpi.py
iangillingham-stfc May 6, 2025
cc0799d
Added system_test files after moving out of generic support/DeviceEmu…
iangillingham-stfc May 6, 2025
4922bc5
.gitignore: added __pycache__ and .idea directories
iangillingham-stfc May 6, 2025
2438716
tests/ips.py reverted to original as scpi tests are now in ips_scpi.py
iangillingham-stfc May 7, 2025
94ffca5
refactor: Split tests into common and specific to legacy and SCPI
iangillingham-stfc May 7, 2025
f82db58
Added ips_scpi.py for specific SCPI protocol tests
iangillingham-stfc May 8, 2025
255777c
Added to and made changes with lewis emulator and tests. Originally p…
iangillingham-stfc Jun 5, 2025
cde4713
SCPI protocol: Some 'out' commands had associated 'in' to read back t…
iangillingham-stfc Jun 10, 2025
19bd866
stream_interface_scpi.py: Removed some no longer needed diagnostic lo…
iangillingham-stfc Jun 10, 2025
13d36a9
ips_common.py tests: Removed some no longer needed diagnostic logging…
iangillingham-stfc Jun 10, 2025
d339f2c
ips_scpi.py tests: Commented out the ioc_launcher_class attribute for…
iangillingham-stfc Jun 10, 2025
5955855
Deleted modes_scpi.py
iangillingham-stfc Jun 10, 2025
03ae20e
Added StreamDevice protocol functions for SCPI getSysAlarms, readSysA…
iangillingham-stfc Jun 25, 2025
6cab1e4
Added lewis emulator device support for the level meter board and mag…
iangillingham-stfc Jun 25, 2025
9cea6da
Added lewis emulator support for reading system alarms (STAT:SYS:ALRM)
iangillingham-stfc Jun 25, 2025
c5f2035
Added lewis emulator support for temperature board status and level m…
iangillingham-stfc Jun 25, 2025
744a5da
Added tests for magnet temperature sensor board and level meter board…
iangillingham-stfc Jun 25, 2025
1e52a2a
Commenced adding Level Sensor board support
iangillingham-stfc Jun 26, 2025
d73ecfb
Added loads of stuff to the SCPI protocol file.
iangillingham-stfc Jul 3, 2025
21b908d
Added loads of device attributes to the lewis device.py file.
iangillingham-stfc Jul 3, 2025
f699099
Added LevelMeterHeliumReadRate Enum class to encapsulate He level rea…
iangillingham-stfc Jul 3, 2025
f3c247b
Added tests for helium and nitrogen levels attributes.
iangillingham-stfc Jul 3, 2025
d4b0ea0
Added lewis emulation features for helium and nitrogen levels attribu…
iangillingham-stfc Jul 3, 2025
3c96b6b
Removed commented out code.
iangillingham-stfc Jul 9, 2025
4e3f028
Ruff formatted: Added type annotations and general formatting.
iangillingham-stfc Jul 9, 2025
7829d0b
Ruff formatted: Added type annotations and general formatting.
iangillingham-stfc Jul 9, 2025
035241a
Fixed a couple of long lines.
iangillingham-stfc Jul 9, 2025
24867b7
aSub record framework added to handle system error processing.
iangillingham-stfc Jul 29, 2025
78a5432
Added pressure and levels daughter board support
iangillingham-stfc Aug 7, 2025
923e6d3
Modified src/Makefile to build for both the test IOC and support modu…
iangillingham-stfc Aug 7, 2025
b3cbf3b
device.py: Added Temperature and pressure values along with system al…
iangillingham-stfc Aug 7, 2025
d6c6b7e
OxInstIPS_SCPI.protocol: SYS:ALRM now read in one string then passed …
iangillingham-stfc Aug 7, 2025
707e698
modes.py: Pressure board class added and case corrected for some alar…
iangillingham-stfc Aug 7, 2025
735cc37
RELEASE cosmetic mods
iangillingham-stfc Aug 7, 2025
b17feea
alarms.c: aSub function starting to receive alarm data and preliminar…
iangillingham-stfc Aug 7, 2025
5a3ed7d
Switch alarms code from C to C++ and renamed to alarms.cpp
iangillingham-stfc Aug 12, 2025
3da1d99
alarms.c renamed to alarms.cpp
iangillingham-stfc Aug 12, 2025
fff7596
Refactor: Used C++ STL to remove complexity of arrays of pointers to …
iangillingham-stfc Aug 13, 2025
db24ffb
Refactor: Augmented code documentation. Corrected the order of some m…
iangillingham-stfc Aug 13, 2025
4d2eb07
fix: Corrected system alarm messages source for pressure board.
iangillingham-stfc Aug 13, 2025
b5c9447
Added tests for system alarm handling and removed He/N filling status…
iangillingham-stfc Aug 19, 2025
9f8475a
Type checking sorted for pyright.
iangillingham-stfc Aug 21, 2025
b3bc2fa
Corrected for ruff checks.
iangillingham-stfc Aug 21, 2025
29d6c15
Added support for discovered alarm status 'Magnet Safety'
iangillingham-stfc Aug 28, 2025
1784122
alarms.cpp: Removed diagnostic log messages and additional documentat…
iangillingham-stfc Aug 28, 2025
3485c96
Ruff formatted (again)
iangillingham-stfc Sep 16, 2025
f7e4543
OxinstIPS_SCPI.protocol: Removed no longer relevant commentary regard…
iangillingham-stfc Sep 16, 2025
ca1b808
alarms.cpp: PR review changes
iangillingham-stfc Sep 16, 2025
fe3233b
Removed commented out code from interfaces/__init__.py
iangillingham-stfc Sep 16, 2025
6f6869c
stream_interface_scpi.py: Removed redundent code in set_activity()
iangillingham-stfc Sep 16, 2025
9132e72
stream_interface_scpi.py: Removed redundent function get_trip_current()
iangillingham-stfc Sep 16, 2025
3db02a3
stream_interface_scpi.py: Removed commentded out code in get_pressure()
iangillingham-stfc Sep 16, 2025
14a174a
More Ruff formatting that somehow got missed
iangillingham-stfc Sep 16, 2025
c48246c
ips.py: Commented out ioc_launcher_class: ProcServLauncher to improve…
iangillingham-stfc Sep 17, 2025
a5c5b76
Remove unused parameters
Tom-Willemsen Oct 15, 2025
3590a5e
Fix run_tests.bat & remove commented-out code
Tom-Willemsen Oct 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ relPaths.sh
/doc/
*_info_positions.req
*_info_settings.req
__pycache__/
.idea
322 changes: 322 additions & 0 deletions OxInstIPSApp/protocol/OxInstIPS_SCPI.protocol
Original file line number Diff line number Diff line change
@@ -0,0 +1,322 @@
# File OxInstIPS_SCPI.protocol
#
# Stream Device protocol file for the Oxford Instruments Modular IPS
# superconducting magnet power supplies.
# This protocol supports the SCPI commands for the IPS, replacing the legacy command set.
#
# The full protocol is described in the IPS Operators Handbook.
#
# The commands are case-sensitive.
# Keywords are a maximum of four characters long. Keywords longer than four characters
# generate an invalid command response.
# Keywords are separated by a colon: (ASCII 0x3Ah).
# The maximum line length is 1024 bytes (characters), including line terminators.
# All command lines are terminated by the new line character \n (ASCII 0x0Ah).
#
Terminator = "\n";

readtimeout = 500;
replytimeout = 5000;
locktimeout = 20000;
PollPeriod = 500;
ExtraInput = Ignore;

# Device board/slot names
magnet_temperature_sensor = "MB1.T1";
level_meter = "DB1.L1";
magnet_supply = "GRPZ";
temperature_sensor_10T = "DB8.T1";
pressure_sensor_10T = "DB5.P1";

#########################################################################################
# ---------
# *IDN?
# ---------
# IDN:OXFORD INSTRUMENTS:MERCURY dd:ss:ff
# Where:
# dd is the basic instrument type (iPS , iPS, Cryojet etc.)
# ss is the serial number of the main board
# ff is the firmware version of the instrument
# Get the unit version information - returns unit type and firmware information.
# Manual says letter commands always reply with themselves at the start, but
# found out this one does not. Manual also shows a copyright symbol, which is not an
# ASCII symbol and might cause problems for EPICS. In practice found (c) instead.
# The %s format grabs the string upto the first space, the %c grabs the rest. It
# was too long to fit into one EPICS string record value.
getVersion { out "*IDN?";
in "IDN:OXFORD INSTRUMENTS:%(\$1MODEL.VAL)[ a-zA-Z0-9]:%*[ a-zA-Z0-9]:%(\$1VERSION.VAL)s";}

#########################################################################################

# Get measured power supply voltage in volts
# The return string is of the form: STAT:DEV:GRPZ:PSU:SIG:VOLT:-0.0002V
getSupplyVoltage { out "READ:DEV:" $magnet_supply ":PSU:SIG:VOLT";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:VOLT:%f%*s";}

# Get demand current (output current) in amps. We are only interested in the Z axis magnet group.
# The return string is of the form: STAT:DEV:GRPZ:PSU:CSET:<value>:A
getDemandCurrent { out "READ:DEV:" $magnet_supply ":PSU:SIG:CSET";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:CSET:%f%*s";}

# Get measured magnet curren in amps - ER=no.
# The return string is of the form: STAT:DEV:GRPZ:PSU:SIG:CURR:-0.0001A
getMeasuredMagnetCurrent { out "READ:DEV:" $magnet_supply ":PSU:SIG:CURR";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:CURR:%f%*s";}

# Get set point (target current) in amps ER=yes.
getSetpointCurrent { out "READ:DEV:" $magnet_supply ":PSU:SIG:CSET";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:CSET:%f%*s";}

# Get current sweep rate in amps per minute ER=yes.
getCurrentSweepRate { out "READ:DEV:" $magnet_supply ":PSU:SIG:RCST";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:RCST:%f%*s";}

# Get demand field (output field) in tesla ER=yes.
getDemandField { out "READ:DEV:" $magnet_supply ":PSU:SIG:FLD";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:FLD:%f%*s";}

# Get set point (target field) in tesla ER=yes.
getSetpointField { out "READ:DEV:" $magnet_supply ":PSU:SIG:FSET";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:FSET:%f%*s";}

# Get field sweep rate in tesla per minute ER=yes.
# Returns status like: STAT:DEV:GRPZ:PSU:SIG:RFST:0.3850T/m
getFieldSweepRate { out "READ:DEV:" $magnet_supply ":PSU:SIG:RFST";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:RFST:%f%*s";}

# Get software voltage limit in volts ER=no.
# The documentation states that a float is returned, but in reality, a string may be returned instead, such as 'N/A'
getSoftwareVoltageLimit { out "READ:DEV:" $magnet_supply ":PSU:VLIM";
in "STAT:DEV:" $magnet_supply ":PSU:VLIM:%f%*s"; @mismatch{in "%*s";} wait 100;}

# Get persistent magnet current in amps ER=yes.
getPersistentMagnetCurrent { out "READ:DEV:" $magnet_supply ":PSU:SIG:PCUR";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:PCUR:%f%*s";}

# Get persistent magnetic field in tesla ER=yes.
getPersistentMagnetField { out "READ:DEV:" $magnet_supply ":PSU:SIG:PFLD";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:PFLD:%f%*s";}

# Get switch heater current in milliamp ER=no.
getHeaterCurrent { out "READ:DEV:" $magnet_supply ":PSU:SHTC";
in "STAT:DEV:" $magnet_supply ":PSU:SHTC:%f%*s";}

# Get safe current limit, most negative in amps ER=no.
getNegCurrentLimit { out "READ:DEV:" $magnet_supply ":PSU:CLIM";
in "STAT:DEV:" $magnet_supply ":PSU:CLIM:%f%*s";}

# Get safe current limit, most positive in amps ER=no.
# no units appended to the value, so assume amps.
getPosCurrentLimit { out "READ:DEV:" $magnet_supply ":PSU:CLIM";
in "STAT:DEV:" $magnet_supply ":PSU:CLIM:%f";}

# Get lead resistance (PTC/NTC) Ohms.
# unit appended 'R'
getLeadResistance { out "READ:DEV:" $magnet_temperature_sensor ":TEMP:SIG:RES";
in "STAT:DEV:" $magnet_temperature_sensor ":TEMP:SIG:RES:%f%*s";}

# Get magnet inductance in henry ER=no.
# no units appended
getMagnetInductance { out "READ:DEV:" $magnet_supply ":PSU:IND";
in "STAT:DEV:" $magnet_supply ":PSU:IND:%f";}

# Get Activity status (analogous to the legacy A command)
getActivity { out "READ:DEV:" $magnet_supply ":PSU:ACTN";
in "STAT:DEV:" $magnet_supply ":PSU:ACTN:%#{HOLD=0|RTOS=1|RTOZ=2|CLMP=4}";}

getHeaterStatus { out "READ:DEV:" $magnet_supply ":PSU:SIG:SWHT";
in "STAT:DEV:" $magnet_supply ":PSU:SIG:SWHT:%{OFF|ON}";}

# *** Need to know what is returned on no alarms present, as it is not documented. ***
# *** Found empirically that it returns an empty string (afterSTAT:SYS:ALRM:)
# when no alarms are present. ***
# Note: For the input we must use %#s (not just %s) as there may be a tab character delimiter
getSysAlarms { out "READ:SYS:ALRM";
in "STAT:SYS:ALRM:%#s";}


# --------------- The following work around limitation of getting legacy status from SCPI protocol -------------
# Get PSU Status status DWORD
getMagnetSupplyStatus { out "READ:DEV:" $magnet_supply ":PSU:STAT";
in "STAT:DEV:" $magnet_supply ":PSU:STAT:%x";}

# --------------------------------------------------------------------------------------------------------------


# ---------
# SYS:LOCK Command
# ---------
# Set Control mode - grab control of the unit from local users.
# OFF | SOFT | ON
# With a real device, this command always replies: STAT:SET:SYS:LOCK:OFF:DENIED
# where 'OFF' may be 'OFF', 'ON' or 'SOFT'.
# It's also not possible to read the LOCK status. So this feature might be totally useless.
setControl { out "SET:SYS:LOCK:%{OFF|SOFT|ON}"; in "READ:SYS:LOCK:%*s";}

# ---------
# DEV:<UID>:PSU:ACTN
# ---------
# Set the activity - i.e. Make it do something.
# HOLD -> Hold
# RTOS -> To Set Point
# RTOZ -> To Zero
# CLMP -> Clamp
setActivity { out "SET:DEV:" $magnet_supply ":PSU:ACTN:%#{HOLD=0|RTOS=1|RTOZ=2|CLMP=4}";
in "STAT:SET:DEV:" $magnet_supply ":PSU:ACTN:%*s";}

# ---------
# SWHT Command
# ---------
#
# Set the status of the heater.
# 0 = heater off (close switch)
# 1 = heater on (open switch) [Checks that magnet curr == psu curr before having any effect, so safer]
# Returns status of this form: STAT:SET:DEV:GRPZ:PSU:SIG:SWHT:OFF:VALID
# DO NOT USE SWHN command!!
#
setHeaterStatus { out "SET:DEV:" $magnet_supply ":PSU:SIG:SWHT:%#{OFF=0|ON=1}";
in "STAT:SET:DEV:" $magnet_supply ":PSU:SIG:SWHT:%*s";
@init {getHeaterStatus;} }

# Set the setpoint (target) current.
# Returns status like: STAT:SET:DEV:GRPZ:PSU:SIG:CSET:0.0004:VALID
setSetpointCurrent { out "SET:DEV:" $magnet_supply ":PSU:SIG:CSET:%#.4f";
in "STAT:SET:DEV:" $magnet_supply ":PSU:SIG:CSET:%*f:%*s";
@init {getSetpointCurrent;} }

# Set the setpoint (target) field.
# Returns status like: STAT:SET:DEV:GRPZ:PSU:SIG:FSET:0.00:VALID
setSetpointField { out "SET:DEV:" $magnet_supply ":PSU:SIG:FSET:%#.5f";
in "STAT:SET:DEV:" $magnet_supply ":PSU:SIG:FSET:%*f%*s";
@init {getSetpointField;} }

# Set current sweep rate.
# Rate at which current will be ramped or swept to target, either the setpoint or zero.
# Returns status like: STAT:DEV:GRPZ:PSU:SIG:RCST:5.5:VALID
setCurrentSweepRate { out "SET:DEV:" $magnet_supply ":PSU:SIG:RCST:%#.3f";
in "STAT:SET:DEV:" $magnet_supply ":PSU:SIG:RCST:%*f%*s";
@init {getCurrentSweepRate;} }

# Set field sweep rate.
# Rate at which field will be ramped or swept to target, either the setpoint or zero.
# Returns status like: STAT:SET:DEV:GRPZ:PSU:SIG:RFST:0.3850:VALID
setFieldSweepRate { out "SET:DEV:" $magnet_supply ":PSU:SIG:RFST:%#.4f";
in "STAT:SET:DEV:" $magnet_supply ":PSU:SIG:RFST:%*f%*s";
@init {getFieldSweepRate;} }

# -------------------------------------------------------
# LEVELS BOARD COMMANDS
# -------------------------------------------------------
getLevelNitFreqZero { out "READ:DEV:" $level_meter ":LVL:NIT:FREQ:ZERO";
in "STAT:DEV:" $level_meter ":LVL:NIT:FREQ:ZERO:%f";}

setLevelNitFreqZero { out "SET:DEV:" $level_meter ":LVL:NIT:FREQ:ZERO:%d";
in "STAT:SET:DEV:" $level_meter ":LVL:NIT:FREQ:ZERO:%*d%*s";
@init {getLevelNitFreqZero;} }

getLevelNitFreqFull { out "READ:DEV:" $level_meter ":LVL:NIT:FREQ:FULL";
in "STAT:DEV:" $level_meter ":LVL:NIT:FREQ:FULL:%f";}

setLevelNitFreqFull { out "SET:DEV:" $level_meter ":LVL:NIT:FREQ:FULL:%d";
in "STAT:SET:DEV:" $level_meter ":LVL:NIT:FREQ:FULL:%*d%*s";
@init {getLevelNitFreqFull;}}

getLevelHeEmptyRes { out "READ:DEV:" $level_meter ":LVL:HEL:RES:ZERO";
in "STAT:DEV:" $level_meter ":LVL:HEL:RES:ZERO:%f";}

setLevelHeEmptyRes { out "SET:DEV:" $level_meter ":LVL:HEL:RES:ZERO:%f";
in "STAT:SET:DEV:" $level_meter ":LVL:HEL:RES:ZERO:%*f%*s";
@init {getLevelHeEmptyRes;}}

getLevelHeFullRes { out "READ:DEV:" $level_meter ":LVL:HEL:RES:FULL";
in "STAT:DEV:" $level_meter ":LVL:HEL:RES:FULL:%f";}

setLevelHeFullRes { out "SET:DEV:" $level_meter ":LVL:HEL:RES:FULL:%f";
in "STAT:SET:DEV:" $level_meter ":LVL:HEL:RES:FULL:%*f%*s";
@init {getLevelHeFullRes;}}


getLevelHeFillStartThreshold { out "READ:DEV:" $level_meter ":LVL:HEL:LOW";
in "STAT:DEV:" $level_meter ":LVL:HEL:LOW:%d";}

setLevelHeFillStartThreshold { out "SET:DEV:" $level_meter ":LVL:HEL:LOW:%d";
in "STAT:SET:DEV:" $level_meter ":LVL:HEL:LOW:%*d%*s";
@init {getLevelHeFillStartThreshold;}}

getLevelHeFillStopThreshold { out "READ:DEV:" $level_meter ":LVL:HEL:HIGH";
in "STAT:DEV:" $level_meter ":LVL:HEL:HIGH:%d";}

setLevelHeFillStopThreshold { out "SET:DEV:" $level_meter ":LVL:HEL:HIGH:%d";
in "STAT:SET:DEV:" $level_meter ":LVL:HEL:HIGH:%*d%*s";
@init {getLevelHeFillStopThreshold;}}

# The documentation is wrong!:
# READ:DEV:DB1.L1:LVL:HEL:RFL actually returns which relay output is used to turn the
# autofill on or off (or indeed can be used to set which relay is used), not the current status.
# If this is implemented in future, it will need to be modified.
#getLevelHeRefilling { out "READ:DEV:" $level_meter ":LVL:HEL:RFL";
# in "STAT:DEV:" $level_meter ":LVL:HEL:RFL:%{OFF|ON}";}

getLevelHeReadingRate { out "READ:DEV:" $level_meter ":LVL:HEL:PULS:SLOW";
in "STAT:DEV:" $level_meter ":LVL:HEL:PULS:SLOW:%{OFF|ON}";}

setLevelHeReadingRate { out "SET:DEV:" $level_meter ":LVL:HEL:PULS:SLOW:%{OFF|ON}";
in "STAT:SET:DEV:" $level_meter ":LVL:HEL:PULS:SLOW:%*s";
@init {getLevelHeReadingRate;}}


getLevelNitReadInterval { out "READ:DEV:" $level_meter ":LVL:NIT:PPS";
in "STAT:DEV:" $level_meter ":LVL:NIT:PPS:%d";
@init {getLevelHeFillStopThreshold;}}

setLevelNitReadInterval { out "SET:DEV:" $level_meter ":LVL:NIT:PPS:%d";
in "STAT:DEV:" $level_meter ":LVL:NIT:PPS:%*d%*s";
@init {getLevelNitReadInterval;}}


getLevelNitFillStartThreshold { out "READ:DEV:" $level_meter ":LVL:NIT:LOW";
in "STAT:DEV:" $level_meter ":LVL:NIT:LOW:%d";}

setLevelNitFillStartThreshold { out "SET:DEV:" $level_meter ":LVL:NIT:LOW:%d";
in "STAT:SET:DEV:" $level_meter ":LVL:NIT:LOW:%*d%*s";
@init {getLevelNitFillStartThreshold;}}

getLevelNitFillStopThreshold { out "READ:DEV:" $level_meter ":LVL:NIT:HIGH";
in "STAT:DEV:" $level_meter ":LVL:NIT:HIGH:%d";}

setLevelNitFillStopThreshold { out "SET:DEV:" $level_meter ":LVL:NIT:HIGH:%d";
in "STAT:SET:DEV:" $level_meter ":LVL:NIT:HIGH:%*d%*s";
@init {getLevelNitFillStopThreshold;}};

# The documentation is wrong!:
# READ:DEV:DB1.L1:LVL:NIT:RFL actually returns which relay output is used to turn the
# autofill on or off (or indeed can be used to set which relay is used), not the current status.
# If this is implemented in future, it will need to be modified.
#getLevelNitRefilling { out "READ:DEV:" $level_meter ":LVL:NIT:RFL";
# in "STAT:DEV:" $level_meter ":LVL:NIT:RFL:%{OFF|ON}";}

getLevelNitrogenLevel { out "READ:DEV:" $level_meter ":LVL:SIG:NIT:LEV";
in "STAT:DEV:" $level_meter ":LVL:SIG:NIT:LEV:%f";}

getLevelHeliumLevel { out "READ:DEV:" $level_meter ":LVL:SIG:HEL:LEV";
in "STAT:DEV:" $level_meter ":LVL:SIG:HEL:LEV:%f";}

# -------------------------------------------------------
# TEMPERATURE BOARD COMMANDS
# -------------------------------------------------------
getMagnetTemperature { out "READ:DEV:" $magnet_temperature_sensor ":TEMP:SIG:TEMP";
in "STAT:DEV:" $magnet_temperature_sensor ":TEMP:SIG:TEMP:%f%*s";}

getLambdaPlateTemperature { out "READ:DEV:" $temperature_sensor_10T ":TEMP:SIG:TEMP";
in "STAT:DEV:" $temperature_sensor_10T ":TEMP:SIG:TEMP:%f%*s";}


# -------------------------------------------------------
# PRESSURE BOARD COMMANDS
# -------------------------------------------------------
getPressure { out "READ:DEV:" $pressure_sensor_10T ":PRES:SIG:PRES";
in "STAT:DEV:" $pressure_sensor_10T ":PRES:SIG:PRES:%f%*s";}




33 changes: 22 additions & 11 deletions OxInstIPSApp/src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@ TOP=../..

include $(TOP)/configure/CONFIG

# -------------------------------
# Build an Diamond Support Module
# -------------------------------

PROD_IOC += OxInstIPS
LIBRARY_IOC += OxInstIPS
PROD_IOC += OxInstIPSIoc

# xxxRecord.h will be created from xxxRecord.dbd
#DBDINC += xxx.h
Expand All @@ -21,31 +18,43 @@ PROD_IOC += OxInstIPS
# OxInstIPS.dbd will be installed into <top>/dbd
DBD += OxInstIPS.dbd

# OxInstIPS.dbd will be created from these files
# OxInstIPSIoc.dbd will be created from these files
OxInstIPSIoc_DBD += base.dbd
OxInstIPSIoc_DBD += calcSupport.dbd
OxInstIPSIoc_DBD += asyn.dbd
OxInstIPSIoc_DBD += stream.dbd
OxInstIPSIoc_DBD += asubFunctions.dbd
OxInstIPSIoc_DBD += OxInstIPS.dbd

OxInstIPS_DBD += base.dbd
OxInstIPS_DBD += calcSupport.dbd
OxInstIPS_DBD += asyn.dbd
OxInstIPS_DBD += stream.dbd
OxInstIPS_DBD += asubFunctions.dbd

# OxInstIPS_registerRecordDeviceDriver.cpp will be created
# OxInstIPS.dbd
OxInstIPS_SRCS += OxInstIPS_registerRecordDeviceDriver.cpp
OxInstIPSIoc_SRCS += OxInstIPS_registerRecordDeviceDriver.cpp
OxInstIPS_SRCS += alarms.cpp

# These two lines are needed for non-vxWorks builds, such as Linux
OxInstIPS_SRCS_DEFAULT += OxInstIPSMain.cpp
OxInstIPS_SRCS_vxWorks += -nil-
OxInstIPSIoc_SRCS_DEFAULT += OxInstIPSMain.cpp
OxInstIPSIoc_SRCS_vxWorks += -nil-

# Add locally compiled object code
#OxInstIPS_SRCS +=

# The following adds object code from base/src/vxWorks
OxInstIPS_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary
OxInstIPSIoc_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary

# This line says that this IOC Application depends on the
# xxx Support Module
OxInstIPS_LIBS += stream asyn calc sscan pcre
OxInstIPSIoc_LIBS += stream calc sscan pcre utilities asubFunctions OxInstIPS

# We need to link this IOC Application against the EPICS Base libraries
OxInstIPSIoc_LIBS += $(EPICS_BASE_IOC_LIBS)

OxInstIPS_LIBS += stream calc sscan pcre utilities asubFunctions
OxInstIPS_LIBS += $(EPICS_BASE_IOC_LIBS)

# ---------------------------------------------------
Expand Down Expand Up @@ -77,3 +86,5 @@ OxInstIPS_LIBS += $(EPICS_BASE_IOC_LIBS)
#endif

include $(TOP)/configure/RULES


Loading