From 74b94266aac0cbc7fc994c9efd0dfd989836f6b8 Mon Sep 17 00:00:00 2001 From: wang_x1 Date: Wed, 19 Aug 2015 15:49:24 +0200 Subject: [PATCH 1/2] compatibility layer for MCA interface --- mca.m | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 mca.m diff --git a/mca.m b/mca.m new file mode 100644 index 0000000..214599b --- /dev/null +++ b/mca.m @@ -0,0 +1,212 @@ +function varargout = mca(commandswitch, varargin) + +%% create CA context if non existent +global context; +if isempty(context) + javaaddpath('./ca_matlab-1.0.0.jar'); + disp('Add matlab jar'); +end + +if isempty(context) + import ch.psi.jcae.*; + % Use of SLS configuration + properties = java.util.Properties(); + properties.setProperty('EPICS_CA_ADDR_LIST', 'sls-cagw'); + properties.setProperty('EPICS_CA_SERVER_PORT', '5062'); + context = Context(properties); + disp('MCA initialized'); +end + +%% call function table +if nargin == 0 + error('Please provide function index number'); +end + +global channel_table +if isempty(channel_table) + channel_table = containers.Map('KeyType','int32','ValueType','any'); +end + +switch (commandswitch) + case -1 + varargout{1} = '5.0.0.TEST'; + case 0 + % mcaunlock is not necessary + + case 1 % mcaopen PVName1, PVName2, ... + if ischar(varargin) + lens = 1; + params = {varargin}; + else + lens = length(varargin); + params = varargin; + end + channels = num2cell(zeros(1, lens)); + for i=1:lens + PVName = params{i}; + channels{i} = addChannel(PVName); + end + varargout = channels; + + case 2 % mcaopen {PVName1, PVName2} + params = varargin{1}; + lens = length(params); + channels = zeros(1, lens); + for i=1:lens + PVName = params{i}; + channels(i) = addChannel(PVName); + end + varargout{1} = channels; + + case 3 % mcaopen + handles = cell2mat(channel_table.keys()); + counts = repmat({''}, 1, length(handles)); + for i=1:length(handles) + channel = channel_table(handles(i)); + counts{i} = char(channel.getName()); + end + varargout{1} = handles; + varargout{2} = counts; + + case 5 % mcaclose + for i=1:length(varargin) + handle = varargin{i}; + channel = channel_table(handle); + channel.close(); + channel_table.remove(handle); + end + + case 10 % mcainfo + + case 11 % mcainfo handle + + case 12 % mcastate + handles = cell2mat(channel_table.keys()); + counts = zeros(1, length(handles)); + for i=1:length(handles) + channel = channel_table(handles(i)); + counts(i) = channel.isConnected(); + end + varargout{1} = handles; + varargout{2} = counts; + + case 13 % mcastate handle1, handle2 + handles = cell2mat(varargin); + counts = zeros(1, length(handles)); + for i=1:length(handles) + channel = channel_table(handles(i)); + counts(i) = channel.isConnected(); + end + varargout{1} = counts; + + case 30 % mcapoll is not necessary + + case 40 % mcaenumstrings + + case 41 % mcaegu + + case 42 % mcaprec + + case 43 % mcatype + + case 50 % mcaget handle1, handle2, ... + handles = cell2mat(varargin); + for i=1:length(handles) + channel = channel_table(handles(i)); + varargout{i} = channel.get(); + end + + case 51 % mcaget [handle1, handle2, ...] + handles = varargin{1}; + counts = zeros(1, length(handles)); + for i=1:length(handles) + channel = channel_table(handles(i)); + counts(i) = channel.get(true); + end + varargout{1} = counts; + + case 60 % mcatime + + case 61 % mcaalarm + + case 70 % mcaput handle, value, handle, value ... + if (mod(length(varargin), 2) ~=0 ) + error('Handles and values must match'); + end + for i=1:2:length(varargin) + handle = varargin{i}; + value = varargin{i+1}; + + channel = channel_table(handle); + channel.put(value); + end + case 80 % mcaput [hand1e1, handle2,...], [value1, value2, ...] + handles = varargin{1}; + values = varargin{2}; + if (length(handles) ~= length(values)) + error('Handles and values must match') + end + for i=1:length(handles) + handle = handles(1); + value = values(1); + + channel = channel_table(handle); + channel.putNoWait(value); + end + + + case 100 % mcamon + handle = varargin{1}; + channel = channel_table(handle); + channel.setMonitored(true); + + varargout{1} = channel.isMonitored(); + + case 200 % mcaclearmon + handle = varargin{1}; + channel = channel_table(handle); + channel.setMonitored(false); + + case 300 % mcacache + handles = cell2mat(varargin); + for i=1:length(handles) + channel = channel_table(handles(i)); + varargout{i} = channel.get(false); + end + + case 500 % MCAMON - get info on installed monitors. + + case 510 % MCAMONEVENTS - Event count for monitors + handles = cell2mat(channel_table.keys()); + counts = zeros(1, length(handles)); + varargout{1} = handles; + varargout{2} = counts; + + case 600 % MCAEXEC - Execute the command strings for the + % channels in the monitor queue + + case 999 % MCAEXIT + if channel_table + delete(channel_table); + channel_table = []; + end + context.close(); + + case 1001 % Set connection timeout + case 1002 % Set get timeout + case 1003 % Set put timeout + case 1004 % Reset timeout to defaults + case 1000 % Set all timeout, connection/get/put +end + +end + +function handle = addChannel(PVName) + global context + global channel_table + + import ch.psi.jcae.*; + channel = Channels.create(context, ChannelDescriptor('double', PVName)); + handle = channel.hashCode(); + channel_table(handle) = channel; +end \ No newline at end of file From 04d490d988c6ec672a4d7880576897f73fab1a4e Mon Sep 17 00:00:00 2001 From: wang_x1 Date: Thu, 27 Aug 2015 11:41:16 +0200 Subject: [PATCH 2/2] workaround java import problem\nuse environment variable to configure epics CA --- mca.m | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/mca.m b/mca.m index 214599b..577d988 100644 --- a/mca.m +++ b/mca.m @@ -5,15 +5,16 @@ if isempty(context) javaaddpath('./ca_matlab-1.0.0.jar'); disp('Add matlab jar'); -end - -if isempty(context) - import ch.psi.jcae.*; - % Use of SLS configuration + % Use EPICS CA configuration from evironment variables properties = java.util.Properties(); - properties.setProperty('EPICS_CA_ADDR_LIST', 'sls-cagw'); - properties.setProperty('EPICS_CA_SERVER_PORT', '5062'); - context = Context(properties); + properties.setProperty('EPICS_CA_ADDR_LIST', getenv('EPICS_CA_ADDR_LIST')); + properties.setProperty('EPICS_CA_AUTO_ADDR_LIST', getenv('EPICS_CA_AUTO_ADDR_LIST')); + properties.setProperty('EPICS_CA_CONN_TMO', getenv('EPICS_CA_CONN_TMO')); + properties.setProperty('EPICS_CA_BEACON_PERIOD', getenv('EPICS_CA_BEACON_PERIOD')); + properties.setProperty('EPICS_CA_REPEATER_PORT', getenv('EPICS_CA_REPEATER_PORT')); + properties.setProperty('EPICS_CA_SERVER_PORT', getenv('EPICS_CA_SERVER_PORT')); + properties.setProperty('EPICS_CA_MAX_ARRAY_BYTES', getenv('EPICS_CA_MAX_ARRAY_BYTES')); + context = javaObjectEDT('ch.psi.jcae.Context', properties); disp('MCA initialized'); end @@ -205,8 +206,9 @@ global context global channel_table - import ch.psi.jcae.*; - channel = Channels.create(context, ChannelDescriptor('double', PVName)); + channel_desc = javaObjectEDT('ch.psi.jcae.ChannelDescriptor', 'double', PVName); + channel = ch.psi.jcae.Channels.create(context, channel_desc); handle = channel.hashCode(); channel_table(handle) = channel; -end \ No newline at end of file +end +