From 3097b601b68493173c79f5457c84ca4a86c52460 Mon Sep 17 00:00:00 2001 From: "Walter C. Pettus" Date: Wed, 5 Feb 2025 17:20:16 -0800 Subject: [PATCH 01/20] initial muxer implementation --- dripline/extensions/__init__.py | 1 + dripline/extensions/muxer_service.py | 87 ++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 dripline/extensions/muxer_service.py diff --git a/dripline/extensions/__init__.py b/dripline/extensions/__init__.py index b62df1e..b61a31e 100644 --- a/dripline/extensions/__init__.py +++ b/dripline/extensions/__init__.py @@ -7,3 +7,4 @@ # Modules in this directory from .add_auth_spec import * +from .muxer_service import * diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py new file mode 100644 index 0000000..a0e433b --- /dev/null +++ b/dripline/extensions/muxer_service.py @@ -0,0 +1,87 @@ +''' +A class to interface with the multiplexer aka muxer instrument +''' + +from dripline.core import ThrowReply, Entity, calibrate +from dripline.implementations import EthernetSCPIService + +import logging +logger = logging.getLogger(__name__) + +__all__ = [] +__all__.append('MuxerService') + +class MuxerService(EthernetSCPIService): + ''' + Provider to interface with muxer + ''' + + def __init__(self, scan_interval=0,**kwargs): + ''' + scan_interval (int): time between scans in seconds + ''' + EthernetSCPIService.__init__(self,**kwargs) + if scan_interval <= 0: + raise ThrowReply('service_error_invalid_value', 'scan interval must be > 0') + self.scan_interval = scan_interval + self.configure_scan() + + def configure_scan(self, *args, **kwargs): + ''' + loops over the provider's internal list of endpoints and attempts to configure each, then configures and begins scan + ''' + self.send_to_device(['ABOR;*CLS;*OPC?']) + + ch_scan_list = list() + for childname, child in self.sync_children.items(): + + if not isinstance(child, MuxerGetEntity): + continue + error_data = self.send_to_device([child.conf_str+';*OPC?','SYST:ERR?']) + if error_data != '1;+0,"No error"': + logger.critical('Error detected; cannot configure muxer') + raise ThrowReply('resource_error', + f'{error_data} when attempting to configure endpoint <{childname}>') + + ch_scan_list.append(str(child.ch_number)) + child.log_interval = self.scan_interval + + scan_list_cmd = 'ROUT:SCAN (@{})'.format(','.join(ch_scan_list)) + self.send_to_device([scan_list_cmd+';*OPC?',\ + 'TRIG:SOUR TIM;*OPC?',\ + 'TRIG:COUN INF;*OPC?',\ + 'TRIG:TIM {};*OPC?'.format(self.scan_interval),\ + 'INIT;*ESE?']) + + +__all__.append('MuxerGetEntity') +class MuxerGetEntity(Entity): + ''' + Entity for communication with muxer endpoints. No set functionality. + ''' + + def __init__(self, + ch_number, + conf_str=None, + **kwargs): + ''' + ch_number (int): channel number for endpoint + conf_str (str): used by MuxerService to configure endpoint scan + ''' + Entity.__init__(self, **kwargs) + if conf_str is None: + raise ThrowReply('service_error_invalid_value', + f' required for MuxerGetEntity {self.name}') + self.get_str = "DATA:LAST? (@{})".format(ch_number) + self.ch_number = ch_number + self.conf_str = conf_str.format(ch_number) + + @calibrate() + def on_get(self): + result = self.service.send_to_device([self.get_str.format(self.ch_number)]) + logger.debug('very raw is: {}'.format(result)) + return result.split()[0] + + def on_set(self, value): + raise ThrowReply('message_error_invalid_method', + f'endpoint {self.name} does not support set') From 5a36087e8c0cc64cc00c4c8cc1632e11445fdd62 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 19 Mar 2025 15:29:53 -0700 Subject: [PATCH 02/20] two files to connect muxer to dripline service --- muxer-test.yaml | 31 +++++++++++++++++++++++ muxer.yaml | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 muxer-test.yaml create mode 100644 muxer.yaml diff --git a/muxer-test.yaml b/muxer-test.yaml new file mode 100644 index 0000000..ed8c3a2 --- /dev/null +++ b/muxer-test.yaml @@ -0,0 +1,31 @@ +version: "3" +services: + + # The broker for the mesh + rabbit-broker: + image: rabbitmq:3-management + ports: + - "15672:15672" + environment: + - RABBITMQ_DEFAULT_USER=dripline + - RABBITMQ_DEFAULT_PASS=dripline + healthcheck: + test: ["CMD-SHELL", "curl -u dripline:dripline http://rabbit-broker:15672/api/overview &> /dev/null || exit 1"] + + muxer-service: + image: ghcr.io/project8/dragonfly:muxer_test + depends_on: + rabbit-broker: + condition: service_healthy + volumes: + - ./muxer.yaml:/root/muxer.yaml + environment: + - DRIPLINE_USER=dripline + - DRIPLINE_PASSWORD=dripline + command: + - dl-serve + - -c + - /root/muxer.yaml + - -vv + - -b + - rabbit-broker diff --git a/muxer.yaml b/muxer.yaml new file mode 100644 index 0000000..dc22721 --- /dev/null +++ b/muxer.yaml @@ -0,0 +1,65 @@ +name: muxer +module: MuxerService +socket_info: ('glenlivet.p8', 5024) +cmd_at_reconnect: + - + - "" + - "SYST:ERR?" + - "TRIG:DEL:AUTO?" +command_terminator: "\r\n" +response_terminator: "\r\n34980A> " +reply_echo_cmd: True +scan_interval: 30 +endpoints: +##################### Cable B #################### + # PT 100 1/12 + - name: pt100_1_12 + module: MuxerGetEntity + ch_number: 1011 + conf_str: 'CONF:FRES AUTO,DEF,(@{})' + calibration: 'pt100_calibration({})' + # PT 100 2/12 + - name: pt100_2_12 + module: MuxerGetEntity + ch_number: 1012 + conf_str: 'CONF:FRES AUTO,DEF,(@{})' + calibration: 'pt100_calibration({})' +##################### Cable C #################### + # PT 100 3/12 + - name: pt100_3_12 + module: MuxerGetEntity + ch_number: 1004 + conf_str: 'CONF:FRES AUTO,DEF,(@{})' + calibration: 'pt100_calibration({})' + # PT 100 4/12 + - name: pt100_4_12 + module: MuxerGetEntity + ch_number: 1005 + conf_str: 'CONF:FRES AUTO,DEF,(@{})' + calibration: 'pt100_calibration({})' + # PT 100 5/12 + - name: pt100_5_12 + module: MuxerGetEntity + ch_number: 1006 + conf_str: 'CONF:FRES AUTO,DEF,(@{})' + calibration: 'pt100_calibration({})' + # PT 100 6/12 + - name: pt100_6_12 + module: MuxerGetEntity + ch_number: 1007 + conf_str: 'CONF:FRES AUTO,DEF,(@{})' + calibration: 'pt100_calibration({})' + # PT 100 7/12 +## - name: pt_100_7_12 + ## modeule: MuxerGetEntity + ## ch_number: 1013 + ## conf_str: 'CONF:FRES AUTO,DEF,(@{})' + ## calibration: 'pt100_calibration({})' + + # this is not set up but wanted to keep the syntax available as an example + - name: hall_probe_field + module: MuxerGetEntity + ch_number: 1029 + conf_str: 'CONF:VOLT:DC 10,(@{})' + calibration: "(0.9991/0.847)*(1000*{}+0.007)" + From 37d26bd34f4eedfdb276eb4ecbce0923f4dcad06 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 2 Apr 2025 15:22:15 -0700 Subject: [PATCH 03/20] added RelayService by copying old spime_endpoints.py --- dripline/extensions/muxer_service.py | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index a0e433b..26acaef 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -85,3 +85,60 @@ def on_get(self): def on_set(self, value): raise ThrowReply('message_error_invalid_method', f'endpoint {self.name} does not support set') +class MuxerRelay(Entity): + ''' + Entity to communicate with relay cards in muxer, + ''' + def __init__(self, + ch_number, + relay_type=None, + **kwargs): + ''' + # default get/set strings + if 'get_str' not in kwargs: + if relay_type=='relay' or relay_type=='polarity': + kwargs.update( {'get_str':':ROUTE:OPEN? (@{})'.format(ch_number)} ) + elif relay_type=='switch': + kwargs.update( {'get_str':':ROUTE:CLOSE? (@{})'.format(ch_number)} ) + if 'set_str' not in kwargs: + kwargs.update( {'set_str':':ROUTE:{{}} (@{});{}'.format(ch_number,kwargs['get_str'])} ) + # Default kwargs for get_on_set and set_value_lowercase + if 'get_on_set' not in kwargs: + kwargs.update( {'get_on_set':True} ) + if 'set_value_lowercase' not in kwargs: + kwargs.update( {'set_value_lowercase':True} ) + # Default set_value_map and calibration for known relay types (relay, polarity, switch) + if relay_type == 'relay': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {1: 'OPEN', + 0: 'CLOSE', + 'on': 'OPEN', + 'off': 'CLOSE', + 'enable': 'OPEN', + 'disable': 'CLOSE'} } ) + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'1': 'enabled', + '0': 'disabled'} } ) + elif relay_type == 'polarity': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {1: 'OPEN', + 0: 'CLOSE', + 'positive': 'OPEN', + 'negative': 'CLOSE'} } ) + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'1': 'positive', + '0': 'negative'} } ) + elif relay_type == 'switch': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {0: 'OPEN', + 1: 'CLOSE', + 'off': 'OPEN', + 'on': 'CLOSE', + 'disable': 'OPEN', + 'enable': 'CLOSE'} } ) + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'0': 'disabled', + '1': 'enabled'} } ) + elif relay_type is not None: + raise ThrowReply("message_error_invalid_method", + f"endpoint {self.name} expect 'relay'or 'polarity'") From 23e118e15a431b5d4a08f65d9e70ff710c4876e9 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 30 Apr 2025 15:36:22 -0700 Subject: [PATCH 04/20] closed the comment that was commenting out all of RelayService --- dripline/extensions/muxer_service.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 26acaef..4a467a0 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -94,6 +94,9 @@ def __init__(self, relay_type=None, **kwargs): ''' + ch_number (int): channel number for endpoint + relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) + ''' # default get/set strings if 'get_str' not in kwargs: if relay_type=='relay' or relay_type=='polarity': From d0eb97ccf67dcc7c79c31e5a92e571618827256e Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 30 Apr 2025 18:01:48 -0700 Subject: [PATCH 05/20] commenting out the error lines --- dripline/extensions/muxer_service.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 4a467a0..15acb5b 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -93,10 +93,10 @@ def __init__(self, ch_number, relay_type=None, **kwargs): - ''' - ch_number (int): channel number for endpoint - relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) - ''' +# ''' +# ch_number (int): channel number for endpoint + # relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) + # ''' # default get/set strings if 'get_str' not in kwargs: if relay_type=='relay' or relay_type=='polarity': From 32b43e2b3b139a43c2230af9e2a4a89270a0270f Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Mon, 5 May 2025 13:57:43 -0700 Subject: [PATCH 06/20] added an 'append.MuxerRelay' above the relay class and fixed a comment indent --- dripline/extensions/muxer_service.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 15acb5b..05002a3 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -85,6 +85,7 @@ def on_get(self): def on_set(self, value): raise ThrowReply('message_error_invalid_method', f'endpoint {self.name} does not support set') +__all__.append('MuxerRelay') class MuxerRelay(Entity): ''' Entity to communicate with relay cards in muxer, @@ -93,10 +94,10 @@ def __init__(self, ch_number, relay_type=None, **kwargs): -# ''' -# ch_number (int): channel number for endpoint - # relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) - # ''' + ''' + ch_number (int): channel number for endpoint + relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) + ''' # default get/set strings if 'get_str' not in kwargs: if relay_type=='relay' or relay_type=='polarity': From 52e578c2580d0b9fa5b0dff4733dacdbee9da219 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Mon, 5 May 2025 15:09:27 -0700 Subject: [PATCH 07/20] added an 'Enitity.__init__(self,**kwargs) and hopefully fixed the indentation around line 102 --- dripline/extensions/muxer_service.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 05002a3..0cccc15 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -94,10 +94,11 @@ def __init__(self, ch_number, relay_type=None, **kwargs): - ''' + ''' ch_number (int): channel number for endpoint relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) - ''' + ''' + Entity.__init__(self, **kwargs) # default get/set strings if 'get_str' not in kwargs: if relay_type=='relay' or relay_type=='polarity': From b30672a029f853d651e3aabd7f19b807706d39b3 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Mon, 5 May 2025 15:31:36 -0700 Subject: [PATCH 08/20] changed the tabs around using 'expand -t 4' --- dripline/extensions/muxer_service.py | 76 ++++++++++++++-------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 0cccc15..13050c6 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -91,59 +91,59 @@ class MuxerRelay(Entity): Entity to communicate with relay cards in muxer, ''' def __init__(self, - ch_number, - relay_type=None, - **kwargs): - ''' - ch_number (int): channel number for endpoint + ch_number, + relay_type=None, + **kwargs): + ''' + ch_number (int): channel number for endpoint relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) - ''' - Entity.__init__(self, **kwargs) - # default get/set strings - if 'get_str' not in kwargs: - if relay_type=='relay' or relay_type=='polarity': - kwargs.update( {'get_str':':ROUTE:OPEN? (@{})'.format(ch_number)} ) - elif relay_type=='switch': - kwargs.update( {'get_str':':ROUTE:CLOSE? (@{})'.format(ch_number)} ) - if 'set_str' not in kwargs: - kwargs.update( {'set_str':':ROUTE:{{}} (@{});{}'.format(ch_number,kwargs['get_str'])} ) - # Default kwargs for get_on_set and set_value_lowercase - if 'get_on_set' not in kwargs: - kwargs.update( {'get_on_set':True} ) - if 'set_value_lowercase' not in kwargs: - kwargs.update( {'set_value_lowercase':True} ) - # Default set_value_map and calibration for known relay types (relay, polarity, switch) - if relay_type == 'relay': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {1: 'OPEN', + ''' + Entity.__init__(self, **kwargs) + # default get/set strings + if 'get_str' not in kwargs: + if relay_type=='relay' or relay_type=='polarity': + kwargs.update( {'get_str':':ROUTE:OPEN? (@{})'.format(ch_number)} ) + elif relay_type=='switch': + kwargs.update( {'get_str':':ROUTE:CLOSE? (@{})'.format(ch_number)} ) + if 'set_str' not in kwargs: + kwargs.update( {'set_str':':ROUTE:{{}} (@{});{}'.format(ch_number,kwargs['get_str'])} ) + # Default kwargs for get_on_set and set_value_lowercase + if 'get_on_set' not in kwargs: + kwargs.update( {'get_on_set':True} ) + if 'set_value_lowercase' not in kwargs: + kwargs.update( {'set_value_lowercase':True} ) + # Default set_value_map and calibration for known relay types (relay, polarity, switch) + if relay_type == 'relay': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {1: 'OPEN', 0: 'CLOSE', 'on': 'OPEN', 'off': 'CLOSE', 'enable': 'OPEN', 'disable': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'1': 'enabled', + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'1': 'enabled', '0': 'disabled'} } ) - elif relay_type == 'polarity': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {1: 'OPEN', + elif relay_type == 'polarity': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {1: 'OPEN', 0: 'CLOSE', 'positive': 'OPEN', 'negative': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'1': 'positive', + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'1': 'positive', '0': 'negative'} } ) - elif relay_type == 'switch': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {0: 'OPEN', + elif relay_type == 'switch': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {0: 'OPEN', 1: 'CLOSE', 'off': 'OPEN', 'on': 'CLOSE', 'disable': 'OPEN', 'enable': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'0': 'disabled', + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'0': 'disabled', '1': 'enabled'} } ) - elif relay_type is not None: - raise ThrowReply("message_error_invalid_method", + elif relay_type is not None: + raise ThrowReply("message_error_invalid_method", f"endpoint {self.name} expect 'relay'or 'polarity'") From 1f9d28281d781d299b347bffc7f298bb4ed90830 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Tue, 6 May 2025 11:30:50 -0700 Subject: [PATCH 09/20] changed 'Entity.__init__(self,**kwargs)' to be at the end of Relay --- dripline/extensions/muxer_service.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 13050c6..7fccd2d 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -98,7 +98,7 @@ def __init__(self, ch_number (int): channel number for endpoint relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) ''' - Entity.__init__(self, **kwargs) + # default get/set strings if 'get_str' not in kwargs: if relay_type=='relay' or relay_type=='polarity': @@ -146,4 +146,5 @@ def __init__(self, '1': 'enabled'} } ) elif relay_type is not None: raise ThrowReply("message_error_invalid_method", - f"endpoint {self.name} expect 'relay'or 'polarity'") + f"endpoint {self.name} expect 'relay'or 'polarity'") + Entity.__init__(self, **kwargs) From 4722d3bf6ff3d78691f58f5197781029b7dddf1f Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Tue, 6 May 2025 15:13:04 -0700 Subject: [PATCH 10/20] trying to address the get_str eror using pop --- dripline/extensions/muxer_service.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 7fccd2d..9aef636 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -147,4 +147,11 @@ def __init__(self, elif relay_type is not None: raise ThrowReply("message_error_invalid_method", f"endpoint {self.name} expect 'relay'or 'polarity'") + # Remove invalid args before calling Entity + get_str = kwargs.pop('get_str', None) + set_str = kwargs.pop('set_str', None) + Entity.__init__(self, **kwargs) + + self.get_str = get_str + self.set_str = set_str #another addition to fix the get_str error From d21d26b9cde720384c0d83ad08f4e21a216c9b4e Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Tue, 6 May 2025 15:29:08 -0700 Subject: [PATCH 11/20] added self. in front of any kwargs, hoping I didnt break spacing --- dripline/extensions/muxer_service.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 9aef636..1084f99 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -110,39 +110,39 @@ def __init__(self, # Default kwargs for get_on_set and set_value_lowercase if 'get_on_set' not in kwargs: kwargs.update( {'get_on_set':True} ) - if 'set_value_lowercase' not in kwargs: - kwargs.update( {'set_value_lowercase':True} ) + if self.set_value_lowercase not in kwargs: + kwargs.update( {self.set_value_lowercase :True} ) # Default set_value_map and calibration for known relay types (relay, polarity, switch) if relay_type == 'relay': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {1: 'OPEN', + if self.set_value_map not in kwargs: + kwargs.update( { self.set_value_map : {1: 'OPEN', 0: 'CLOSE', 'on': 'OPEN', 'off': 'CLOSE', 'enable': 'OPEN', 'disable': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'1': 'enabled', + if self.calibration not in kwargs: + kwargs.update( { self.calibration : {'1': 'enabled', '0': 'disabled'} } ) elif relay_type == 'polarity': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {1: 'OPEN', + if self.set_value_map not in kwargs: + kwargs.update( { self.set_value_map : {1: 'OPEN', 0: 'CLOSE', 'positive': 'OPEN', 'negative': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'1': 'positive', + if self.calibration not in kwargs: + kwargs.update( { self.calibration : {'1': 'positive', '0': 'negative'} } ) elif relay_type == 'switch': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {0: 'OPEN', + if self.set_value_map not in kwargs: + kwargs.update( { self.set_value_map : {0: 'OPEN', 1: 'CLOSE', 'off': 'OPEN', 'on': 'CLOSE', 'disable': 'OPEN', 'enable': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'0': 'disabled', + if self.calibration not in kwargs: + kwargs.update( { self.calibration : {'0': 'disabled', '1': 'enabled'} } ) elif relay_type is not None: raise ThrowReply("message_error_invalid_method", From cf1000bd05c8c3b51a00f42873f6ef055aecdc12 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Tue, 6 May 2025 15:37:15 -0700 Subject: [PATCH 12/20] did away with adding self. to all objects, ended up doing the kwargs.pop to all of them, which is also what I see in object.py (havent done it to calibration yet tho) --- dripline/extensions/muxer_service.py | 32 ++++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 1084f99..369ea6c 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -110,39 +110,39 @@ def __init__(self, # Default kwargs for get_on_set and set_value_lowercase if 'get_on_set' not in kwargs: kwargs.update( {'get_on_set':True} ) - if self.set_value_lowercase not in kwargs: - kwargs.update( {self.set_value_lowercase :True} ) + if 'set_value_lowercase' not in kwargs: + kwargs.update( {'set_value_lowercase' :True} ) # Default set_value_map and calibration for known relay types (relay, polarity, switch) if relay_type == 'relay': - if self.set_value_map not in kwargs: - kwargs.update( { self.set_value_map : {1: 'OPEN', + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {1: 'OPEN', 0: 'CLOSE', 'on': 'OPEN', 'off': 'CLOSE', 'enable': 'OPEN', 'disable': 'CLOSE'} } ) - if self.calibration not in kwargs: - kwargs.update( { self.calibration : {'1': 'enabled', + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'1': 'enabled', '0': 'disabled'} } ) elif relay_type == 'polarity': - if self.set_value_map not in kwargs: - kwargs.update( { self.set_value_map : {1: 'OPEN', + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {1: 'OPEN', 0: 'CLOSE', 'positive': 'OPEN', 'negative': 'CLOSE'} } ) - if self.calibration not in kwargs: - kwargs.update( { self.calibration : {'1': 'positive', + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'1': 'positive', '0': 'negative'} } ) elif relay_type == 'switch': - if self.set_value_map not in kwargs: - kwargs.update( { self.set_value_map : {0: 'OPEN', + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {0: 'OPEN', 1: 'CLOSE', 'off': 'OPEN', 'on': 'CLOSE', 'disable': 'OPEN', 'enable': 'CLOSE'} } ) - if self.calibration not in kwargs: - kwargs.update( { self.calibration : {'0': 'disabled', + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'0': 'disabled', '1': 'enabled'} } ) elif relay_type is not None: raise ThrowReply("message_error_invalid_method", @@ -150,8 +150,12 @@ def __init__(self, # Remove invalid args before calling Entity get_str = kwargs.pop('get_str', None) set_str = kwargs.pop('set_str', None) + set_value_map = kwargs.pop('set_value_map', None) + set_value_lowercase = kwargs.pop('set_value_lowercase', None) Entity.__init__(self, **kwargs) self.get_str = get_str self.set_str = set_str #another addition to fix the get_str error + self.set_value_lowercase=set_value_lowercase + self.set_value_map= set_value_map From 8ae9e0b95265737854cbce4953ba6a7094e431b3 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 7 May 2025 10:35:01 -0700 Subject: [PATCH 13/20] changing the input to MuxerRelay from Entity to FormatEntity --- dripline/extensions/muxer_service.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 369ea6c..510bc40 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -86,7 +86,7 @@ def on_set(self, value): raise ThrowReply('message_error_invalid_method', f'endpoint {self.name} does not support set') __all__.append('MuxerRelay') -class MuxerRelay(Entity): +class MuxerRelay(FormatEntity): ''' Entity to communicate with relay cards in muxer, ''' @@ -148,14 +148,15 @@ def __init__(self, raise ThrowReply("message_error_invalid_method", f"endpoint {self.name} expect 'relay'or 'polarity'") # Remove invalid args before calling Entity - get_str = kwargs.pop('get_str', None) - set_str = kwargs.pop('set_str', None) - set_value_map = kwargs.pop('set_value_map', None) - set_value_lowercase = kwargs.pop('set_value_lowercase', None) +# commenting all of this out to see if changing to FormatEntity will work + # get_str = kwargs.pop('get_str', None) + # set_str = kwargs.pop('set_str', None) + # set_value_map = kwargs.pop('set_value_map', None) + # set_value_lowercase = kwargs.pop('set_value_lowercase', None) Entity.__init__(self, **kwargs) - self.get_str = get_str - self.set_str = set_str #another addition to fix the get_str error - self.set_value_lowercase=set_value_lowercase - self.set_value_map= set_value_map + # self.get_str = get_str + # self.set_str = set_str #another addition to fix the get_str error + # self.set_value_lowercase=set_value_lowercase + # self.set_value_map= set_value_map From 3985355ba4092b99fdde53fdc96be7cabfa5fd5d Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 7 May 2025 10:54:09 -0700 Subject: [PATCH 14/20] importing FormatEntity from implementations --- dripline/extensions/muxer_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 510bc40..9416bf9 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -3,7 +3,7 @@ ''' from dripline.core import ThrowReply, Entity, calibrate -from dripline.implementations import EthernetSCPIService +from dripline.implementations import EthernetSCPIService, FormatEntity import logging logger = logging.getLogger(__name__) From 854ae0b7377d4bde48d9e3948c4b458c0a01f733 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 7 May 2025 10:59:26 -0700 Subject: [PATCH 15/20] removed ' ' from get_str to see if that is the issue --- dripline/extensions/muxer_service.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 9416bf9..182a0df 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -100,11 +100,11 @@ def __init__(self, ''' # default get/set strings - if 'get_str' not in kwargs: + if get_str not in kwargs: if relay_type=='relay' or relay_type=='polarity': - kwargs.update( {'get_str':':ROUTE:OPEN? (@{})'.format(ch_number)} ) + kwargs.update( {get_str:':ROUTE:OPEN? (@{})'.format(ch_number)} ) elif relay_type=='switch': - kwargs.update( {'get_str':':ROUTE:CLOSE? (@{})'.format(ch_number)} ) + kwargs.update( {get_str:':ROUTE:CLOSE? (@{})'.format(ch_number)} ) if 'set_str' not in kwargs: kwargs.update( {'set_str':':ROUTE:{{}} (@{});{}'.format(ch_number,kwargs['get_str'])} ) # Default kwargs for get_on_set and set_value_lowercase From 62e45249cd40e420090e96670e4f972b67eb85ec Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 7 May 2025 14:00:28 -0700 Subject: [PATCH 16/20] putting self. in front get_str --- dripline/extensions/muxer_service.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 182a0df..0d26294 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -100,11 +100,11 @@ def __init__(self, ''' # default get/set strings - if get_str not in kwargs: + if self.get_str not in kwargs: if relay_type=='relay' or relay_type=='polarity': - kwargs.update( {get_str:':ROUTE:OPEN? (@{})'.format(ch_number)} ) + kwargs.update( {self.get_str:':ROUTE:OPEN? (@{})'.format(ch_number)} ) elif relay_type=='switch': - kwargs.update( {get_str:':ROUTE:CLOSE? (@{})'.format(ch_number)} ) + kwargs.update( {self.get_str:':ROUTE:CLOSE? (@{})'.format(ch_number)} ) if 'set_str' not in kwargs: kwargs.update( {'set_str':':ROUTE:{{}} (@{});{}'.format(ch_number,kwargs['get_str'])} ) # Default kwargs for get_on_set and set_value_lowercase From 97cfa8b56473d1eec85cfa51063215406663e2ad Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 7 May 2025 14:02:48 -0700 Subject: [PATCH 17/20] adding the kwargs.pop thing again to get_str --- dripline/extensions/muxer_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 0d26294..b0021e8 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -149,14 +149,14 @@ def __init__(self, f"endpoint {self.name} expect 'relay'or 'polarity'") # Remove invalid args before calling Entity # commenting all of this out to see if changing to FormatEntity will work - # get_str = kwargs.pop('get_str', None) + get_str = kwargs.pop('get_str', None) # set_str = kwargs.pop('set_str', None) # set_value_map = kwargs.pop('set_value_map', None) # set_value_lowercase = kwargs.pop('set_value_lowercase', None) Entity.__init__(self, **kwargs) - # self.get_str = get_str + self.get_str = get_str # self.set_str = set_str #another addition to fix the get_str error # self.set_value_lowercase=set_value_lowercase # self.set_value_map= set_value_map From c01ccbefd7e46d276a1b777b1921f40579cfdc9d Mon Sep 17 00:00:00 2001 From: "Walter C. Pettus" Date: Wed, 7 May 2025 17:08:32 -0400 Subject: [PATCH 18/20] Fixing super __init__ for Relay --- dripline/extensions/muxer_service.py | 135 +++++++++++++-------------- 1 file changed, 64 insertions(+), 71 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index b0021e8..c97daa0 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -85,78 +85,71 @@ def on_get(self): def on_set(self, value): raise ThrowReply('message_error_invalid_method', f'endpoint {self.name} does not support set') + + + __all__.append('MuxerRelay') class MuxerRelay(FormatEntity): - ''' - Entity to communicate with relay cards in muxer, - ''' - def __init__(self, - ch_number, - relay_type=None, - **kwargs): + ''' + Entity to communicate with relay cards in muxer, ''' - ch_number (int): channel number for endpoint + def __init__(self, + ch_number, + relay_type=None, + **kwargs): + ''' + ch_number (int): channel number for endpoint relay_type (None,'relay','polarity','switch'): automatically configure set_value_map and calibration dictionaries (overwriteable) - ''' - - # default get/set strings - if self.get_str not in kwargs: - if relay_type=='relay' or relay_type=='polarity': - kwargs.update( {self.get_str:':ROUTE:OPEN? (@{})'.format(ch_number)} ) - elif relay_type=='switch': - kwargs.update( {self.get_str:':ROUTE:CLOSE? (@{})'.format(ch_number)} ) - if 'set_str' not in kwargs: - kwargs.update( {'set_str':':ROUTE:{{}} (@{});{}'.format(ch_number,kwargs['get_str'])} ) - # Default kwargs for get_on_set and set_value_lowercase - if 'get_on_set' not in kwargs: - kwargs.update( {'get_on_set':True} ) - if 'set_value_lowercase' not in kwargs: - kwargs.update( {'set_value_lowercase' :True} ) - # Default set_value_map and calibration for known relay types (relay, polarity, switch) - if relay_type == 'relay': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {1: 'OPEN', - 0: 'CLOSE', - 'on': 'OPEN', - 'off': 'CLOSE', - 'enable': 'OPEN', - 'disable': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'1': 'enabled', - '0': 'disabled'} } ) - elif relay_type == 'polarity': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {1: 'OPEN', - 0: 'CLOSE', - 'positive': 'OPEN', - 'negative': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'1': 'positive', - '0': 'negative'} } ) - elif relay_type == 'switch': - if 'set_value_map' not in kwargs: - kwargs.update( { 'set_value_map' : {0: 'OPEN', - 1: 'CLOSE', - 'off': 'OPEN', - 'on': 'CLOSE', - 'disable': 'OPEN', - 'enable': 'CLOSE'} } ) - if 'calibration' not in kwargs: - kwargs.update( { 'calibration' : {'0': 'disabled', - '1': 'enabled'} } ) - elif relay_type is not None: - raise ThrowReply("message_error_invalid_method", - f"endpoint {self.name} expect 'relay'or 'polarity'") - # Remove invalid args before calling Entity -# commenting all of this out to see if changing to FormatEntity will work - get_str = kwargs.pop('get_str', None) - # set_str = kwargs.pop('set_str', None) - # set_value_map = kwargs.pop('set_value_map', None) - # set_value_lowercase = kwargs.pop('set_value_lowercase', None) - - Entity.__init__(self, **kwargs) - - self.get_str = get_str - # self.set_str = set_str #another addition to fix the get_str error - # self.set_value_lowercase=set_value_lowercase - # self.set_value_map= set_value_map + ''' + + # default get/set strings + if get_str not in kwargs: + if relay_type=='relay' or relay_type=='polarity': + kwargs.update( {get_str:':ROUTE:OPEN? (@{})'.format(ch_number)} ) + elif relay_type=='switch': + kwargs.update( {get_str:':ROUTE:CLOSE? (@{})'.format(ch_number)} ) + if 'set_str' not in kwargs: + kwargs.update( {'set_str':':ROUTE:{{}} (@{});{}'.format(ch_number,kwargs['get_str'])} ) + # Default kwargs for get_on_set and set_value_lowercase + if 'get_on_set' not in kwargs: + kwargs.update( {'get_on_set':True} ) + if 'set_value_lowercase' not in kwargs: + kwargs.update( {'set_value_lowercase' :True} ) + # Default set_value_map and calibration for known relay types (relay, polarity, switch) + if relay_type == 'relay': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {1: 'OPEN', + 0: 'CLOSE', + 'on': 'OPEN', + 'off': 'CLOSE', + 'enable': 'OPEN', + 'disable': 'CLOSE'} } ) + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'1': 'enabled', + '0': 'disabled'} } ) + elif relay_type == 'polarity': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {1: 'OPEN', + 0: 'CLOSE', + 'positive': 'OPEN', + 'negative': 'CLOSE'} } ) + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'1': 'positive', + '0': 'negative'} } ) + elif relay_type == 'switch': + if 'set_value_map' not in kwargs: + kwargs.update( { 'set_value_map' : {0: 'OPEN', + 1: 'CLOSE', + 'off': 'OPEN', + 'on': 'CLOSE', + 'disable': 'OPEN', + 'enable': 'CLOSE'} } ) + if 'calibration' not in kwargs: + kwargs.update( { 'calibration' : {'0': 'disabled', + '1': 'enabled'} } ) + elif relay_type is not None: + raise ThrowReply("message_error_invalid_method", + f"endpoint {self.name} expect 'relay'or 'polarity'") + + FormatEntity.__init__(self, **kwargs) + From da797444e608f34d318f11679f0b154ae7a69f2e Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 7 May 2025 14:36:46 -0700 Subject: [PATCH 19/20] indentation issue at line 147 w calibration --- dripline/extensions/muxer_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index c97daa0..2e0f90d 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -144,7 +144,7 @@ def __init__(self, 'on': 'CLOSE', 'disable': 'OPEN', 'enable': 'CLOSE'} } ) - if 'calibration' not in kwargs: + if 'calibration' not in kwargs: kwargs.update( { 'calibration' : {'0': 'disabled', '1': 'enabled'} } ) elif relay_type is not None: From 21518e0fc722f84a5d166cf9962f6a36afa72633 Mon Sep 17 00:00:00 2001 From: Meg Wynne Date: Wed, 7 May 2025 14:39:18 -0700 Subject: [PATCH 20/20] putting get_str back into a string --- dripline/extensions/muxer_service.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dripline/extensions/muxer_service.py b/dripline/extensions/muxer_service.py index 2e0f90d..7dce046 100644 --- a/dripline/extensions/muxer_service.py +++ b/dripline/extensions/muxer_service.py @@ -103,11 +103,11 @@ def __init__(self, ''' # default get/set strings - if get_str not in kwargs: + if 'get_str' not in kwargs: if relay_type=='relay' or relay_type=='polarity': - kwargs.update( {get_str:':ROUTE:OPEN? (@{})'.format(ch_number)} ) + kwargs.update( {'get_str':':ROUTE:OPEN? (@{})'.format(ch_number)} ) elif relay_type=='switch': - kwargs.update( {get_str:':ROUTE:CLOSE? (@{})'.format(ch_number)} ) + kwargs.update( {'get_str':':ROUTE:CLOSE? (@{})'.format(ch_number)} ) if 'set_str' not in kwargs: kwargs.update( {'set_str':':ROUTE:{{}} (@{});{}'.format(ch_number,kwargs['get_str'])} ) # Default kwargs for get_on_set and set_value_lowercase