Skip to content
Snippets Groups Projects
Commit 504cfadc authored by Taya Snijder's avatar Taya Snijder
Browse files

Redid the generator

parent ee9c206e
Branches
No related tags found
No related merge requests found
/venv /venv
/output.py
dev_children:
- child_name: Dither3
child_dev : I2Cbitbang
child_conf: LTS_RCU2_dither
child_GPIO:
- SCL : IO1.OUT1.6
- SDO : IO2.OUT2.3
- SDI : IO2.IN2.3
- SDIOdir : IO2.CONF2.3
- child_name: Dither2
child_dev : I2Cbitbang
child_conf: LTS_RCU2_dither
child_GPIO:
- SCL : IO1.OUT2.7
- SDO : IO1.OUT1.7
- SDI : IO1.IN1.7
- SDIOdir : IO1.CONF1.7
- child_name: ADC1
child_dev : SPIbitbang1
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.1
- SDO : IO3.OUT1.0
- SDI : IO3.IN1.0
- SDIOdir: IO3.CONF1.0
- CS : IO3.OUT2.0
- child_name: ADC2
child_dev : SPIbitbang1
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.3
- SDO : IO3.OUT1.2
- SDI : IO3.IN1.2
- SDIOdir: IO3.CONF1.2
- CS : IO3.OUT2.1
- child_name: ADC3
child_dev : SPIbitbang1
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.5
- SDO : IO3.OUT1.4
- SDI : IO3.IN1.4
- SDIOdir: IO3.CONF1.4
- CS : IO3.OUT2.2
#This is the I2C devices in the RCU
I2C_devices:
- dev_name: IO1
dev_description: IO-Expander for filter selection
dev_address: 0x75
dev_device: TCA9539
dev_registers:
- reg_name: CONF1
reg_addr: 6
- reg_name: CONF2
reg_addr: 7
- reg_name: OUT1
reg_addr: 2
ref_default: 0
- reg_name: OUT2
reg_addr: 3
ref_default: 0
- reg_name: IN1
reg_addr: 0
- reg_name: IN2
reg_addr: 1
- dev_name: IO3
dev_description: IO-Expander for ADC control
dev_address: 0x20
dev_device: TCA6416
dev_registers:
- reg_name: CONF1
reg_description: Direction of IO pins 0..7
reg_addr: 6
- reg_name: CONF2
reg_description: Direction of IO pints 8..15
reg_addr: 7
- reg_name: IN1
reg_description: Ouput port register 0..7
reg_addr: 0
- reg_name: IN2
reg_description: Ouput port register 0..7
reg_addr: 1
- reg_name: OUT1
reg_description: Ouput port register 0..7
reg_addr: 2
reg_default: 0x0F
- reg_name: OUT2
reg_description: Ouput port register 8..15
reg_addr: 3
reg_default: 0x0F
- dev_name: IO2
dev_description: IO-Expander for ON/OFF, Band, BUFx2
dev_address: 0x76
dev_device: TCA9539
dev_registers:
- reg_name: CONF1
reg_addr: 6
- reg_name: CONF2
reg_addr: 7
- reg_name: OUT1
reg_addr: 2
ref_default: 0
- reg_name: OUT2
reg_addr: 3
ref_default: 0
- reg_name: IN1
reg_addr: 0
- reg_name: IN2
reg_addr: 1
- dev_name: UC
dev_description: RCU microcontroller
dev_address: 0x40
dev_registers:
- reg_name: ID
reg_description: Device ID
reg_addr: 0
- dev_name: ROM
dev_description: EEPROM memory
dev_address: 0x53
dev_registers:
- reg_name: ctr_len
reg_description: Length of control data
reg_addr: 0
- reg_name: ctr_dat
reg_description: Control data (protocol buffers)
reg_addr: 2
- dev_name: AN
dev_description: Monitor ADC on RCU
dev_address: 0x14
dev_device: LTC2495
dev_registers:
- reg_name: Ch0
reg_addr: 0xB080
- reg_name: Ch1
reg_addr: 0xB8
- reg_name: Ch2
reg_addr: 0xB1
- reg_name: Ch3
reg_addr: 0xB9
- reg_name: Ch4
reg_addr: 0xB2
- reg_name: Ch5
reg_addr: 0xBA
- reg_name: Ch6
reg_addr: 0xB3
- reg_name: Ch7
reg_addr: 0xBB
- reg_name: Temp
reg_addr: 0xA0C0
Variables:
- var_name: Attenuator1
var_dev: IO1.OUT1
var_width: 5
var_max: 21
var_R/W: RW
- var_name: Attenuator2
var_dev: IO1.OUT2
var_width: 5
var_max: 21
var_R/W: RW
- var_name: Attenuator3
var_dev: IO2.OUT1
var_width: 5
var_max: 24
var_R/W: RW
- var_name: Pwr_dig
var_description: Enable LDOs
var_dict: {0 : Off, 1 : On}
var_dev: IO2.OUT1
var_width: 1
var_bitoffset: 6
var_R/W: RO
- var_name: Band3
var_dev: IO2.OUT2
var_dict: {0 : 10MHz, 1 : 30MHz}
var_width: 1
var_bitoffset: 0
var_R/W: RW
- var_name: Band1
var_dev: IO2.OUT2
var_dict: {0 : 10MHz, 1 : 30MHz}
var_width: 1
var_bitoffset: 1
var_R/W: RW
- var_name: Band2
var_dev: IO2.OUT2
var_dict: {0 : 10MHz, 1 : 30MHz}
var_width: 1
var_bitoffset: 4
var_R/W: RW
- var_name: LED0
var_description: Front panel LEDs, 0=On
var_dict: {0 : Off, 1 : Yellow, 2: Red, 3: Orange}
var_dev: IO2.OUT2
var_width: 2
var_bitoffset: 6
var_R/W: RW
- var_name: Temperature
var_dev: AN.Temp
var_width: 23
var_scale: 4.21e-3
var_R/W: RO
- var_name: Dth3_Pwr
var_dev: IO2.OUT2
var_width: 1
var_bitoffset: 2
- var_name: Dth2_Pwr
var_dev: IO1.OUT2
var_width: 1
var_bitoffset: 6
Methods:
- method_name: RCU_on
registers:
- IO2.CONF1: [0] #Setup IO expanders to output with default values
- IO2.OUT1: [0x4A]
- IO2.OUT2: [0x55]
- IO3.OUT1: [0x7f]
- IO3.OUT2: [0x47]
- IO1.OUT1: [0xCA]
- IO1.OUT2: [0xCA]
- IO2.CONF2: [0]
- IO3.CONF1: [0]
- IO3.CONF2: [0]
- IO1.CONF1: [0]
- IO1.CONF2: [0]
- ADC1_Setup: 1
- ADC2_Setup: 1
- ADC3_Setup: 1
- method_name: RCU_off
registers:
- IO2.OUT1: [0x00] #Switch all off
- IO2.OUT2: [0x00]
- IO3.OUT1: [0x00]
- IO3.OUT2: [0x00]
- IO1.OUT1: [0x00]
- IO1.OUT2: [0x00]
- method_name: Dither_on
method_invisible: 1
registers:
- Dth3_Pwr: [1]
- Dth2_Pwr: [1]
- Dither3_Setup: 1
- Dither2_Setup: 1
- method_name: Dither_off
method_invisible: 1
registers:
- Dth3_Pwr: [0]
- Dth2_Pwr: [0]
I2C_devices:
- dev_name: ADC1
dev_description: I2C-SPI bridge to ADC
dev_device: AD9683
dev_registers:
- reg_name: PLL_stat
reg_description: PLL locked status
reg_addr: 0x0A
- reg_name: JESD_control1
reg_description: JESD link control, ILAS mode
reg_addr: 0x5F
- reg_name: CML_level
reg_description: CML output adjust
reg_addr: 0x15
- reg_name: SYNC_control
reg_description: SYNC / SYSREF control
reg_addr: 0x3A
- reg_name: Update
reg_description: Global device update
reg_addr: 0xFF
Variables:
- var_name: locked
var_dev: ADC1.PLL_stat
var_width: 8
- var_name: SYNC
var_dev: ADC1.SYNC_control
var_width: 8
- var_name: CML
var_dev: ADC1.CML_level
var_width: 8
- var_name: JESD
var_dev: ADC1.JESD_control1
var_width: 8
Methods:
- method_name: Setup
method_invisible: 1
registers:
- ADC1.JESD_control1: [14] #Setup ADCs
- ADC1.SYNC_control: [1] #Setup ADCs
- ADC1.CML_level: [0x7]
- ADC1.Update: [1] #Needed to update ADC registers
I2C_devices:
- dev_name: DS1
dev_description: Dither Source, SI4010
dev_address: 0x70
dev_registers:
- reg_name: TX_Stop
reg_addr: 0x67
- reg_name: TX_Start
reg_addr: 0x62
- reg_name: property
reg_addr: 0x11
- reg_name: TX_FREQ
reg_addr: 0x1140
Variables:
- var_name: Frequency
var_dev: DS1.TX_FREQ
var_width: 32
var_scale: 1e-6
var_bitoffset: 0
Methods:
- method_name: Setup
method_invisible: 1
registers:
- DS1.property: [0x60,1,0,0,0,125,127] #Power level (1,0)
- DS1.property: [0x40,0x06,0x0c,0xc4,0x60] #Frequency 101.5MHz
- DS1.property: [0x21,0,0] #tuning off
- DS1.TX_Start: [0,0,0,0,1]
dev_children:
- child_name: ADC1
child_dev : SPIbitbang1
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.1
- SDO : IO3.OUT1.0
- SDI : IO3.IN1.0
- SDIOdir: IO3.CONF1.0
- CS : IO3.OUT2.0
- child_name: ADC2
child_dev : SPIbitbang1
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.3
- SDO : IO3.OUT1.2
- SDI : IO3.IN1.2
- SDIOdir: IO3.CONF1.2
- CS : IO3.OUT2.1
- child_name: ADC3
child_dev : SPIbitbang1
child_conf: LTS_RCU2_ADC
child_GPIO:
- CLK : IO3.OUT1.5
- SDO : IO3.OUT1.4
- SDI : IO3.IN1.4
- SDIOdir: IO3.CONF1.4
- CS : IO3.OUT2.2
#This is the I2C devices in the RCU
I2C_devices:
- dev_name: IO1
dev_description: IO-Expander for filter selection
dev_address: 0x75
dev_device: TCA9539
dev_registers:
- reg_name: CONF1
reg_addr: 6
- reg_name: CONF2
reg_addr: 7
- reg_name: OUT1
reg_addr: 2
ref_default: 0
- reg_name: OUT2
reg_addr: 3
ref_default: 0
- reg_name: IN1
reg_addr: 0
- reg_name: IN2
reg_addr: 1
- dev_name: IO3
dev_description: IO-Expander for ADC control
dev_address: 0x20
dev_device: TCA6416
dev_registers:
- reg_name: CONF1
reg_description: Direction of IO pins 0..7
reg_addr: 6
- reg_name: CONF2
reg_description: Direction of IO pints 8..15
reg_addr: 7
- reg_name: IN1
reg_description: Ouput port register 0..7
reg_addr: 0
- reg_name: IN2
reg_description: Ouput port register 0..7
reg_addr: 1
- reg_name: OUT1
reg_description: Ouput port register 0..7
reg_addr: 2
reg_default: 0x0F
- reg_name: OUT2
reg_description: Ouput port register 8..15
reg_addr: 3
reg_default: 0x0F
- dev_name: IO2
dev_description: IO-Expander for ON/OFF, Band, BUFx2
dev_address: 0x76
dev_device: TCA9539
dev_registers:
- reg_name: CONF1
reg_addr: 6
- reg_name: CONF2
reg_addr: 7
- reg_name: OUT1
reg_addr: 2
ref_default: 0
- reg_name: OUT2
reg_addr: 3
ref_default: 0
- reg_name: IN1
reg_addr: 0
- reg_name: IN2
reg_addr: 1
- dev_name: UC
dev_description: RCU microcontroller
dev_address: 0x40
dev_registers:
- reg_name: ID
reg_description: Device ID
reg_addr: 0
- dev_name: ROM
dev_description: EEPROM memory
dev_address: 0x53
dev_registers:
- reg_name: ctr_len
reg_description: Length of control data
reg_addr: 0
- reg_name: ctr_dat
reg_description: Control data (protocol buffers)
reg_addr: 2
- dev_name: AN
dev_description: Monitor ADC on RCU
dev_address: 0x14
dev_device: LTC2495
dev_registers:
- reg_name: Ch0
reg_addr: 0xB080
- reg_name: Ch1
reg_addr: 0xB8
- reg_name: Ch2
reg_addr: 0xB1
- reg_name: Ch3
reg_addr: 0xB9
- reg_name: Ch4
reg_addr: 0xB2
- reg_name: Ch5
reg_addr: 0xBA
- reg_name: Ch6
reg_addr: 0xB3
- reg_name: Ch7
reg_addr: 0xBB
- reg_name: Temp
reg_addr: 0xA0C0
Variables:
- var_name: Attenuator1
var_dev: IO1.OUT1
var_width: 5
var_max: 21
var_R/W: RW
- var_name: Attenuator2
var_dev: IO1.OUT2
var_width: 5
var_max: 21
var_R/W: RW
- var_name: Attenuator3
var_dev: IO2.OUT1
var_width: 5
var_max: 24
var_R/W: RW
- var_name: Pwr_dig
var_description: Enable LDOs
var_dict: {0 : Off, 1 : On}
var_dev: IO2.OUT1
var_width: 1
var_bitoffset: 6
var_R/W: RO
- var_name: LED0
var_description: Front panel LEDs, 0=On
var_dict: {0 : Off, 1 : Yellow, 2: Red, 3: Orange}
var_dev: IO2.OUT2
var_width: 2
var_bitoffset: 6
var_R/W: RW
- var_name: Temperature
var_dev: AN.Temp
var_width: 23
var_scale: 4.21e-3
var_R/W: RO
Methods:
- method_name: RCU_on
registers:
- IO2.CONF1: [0] #Setup IO expanders to output with default values
- IO2.OUT1: [0x4A]
- IO2.OUT2: [0x55]
- IO3.OUT1: [0x7f]
- IO3.OUT2: [0x47]
- IO1.OUT1: [0xCA]
- IO1.OUT2: [0xCA]
- IO2.CONF2: [0]
- IO3.CONF1: [0]
- IO3.CONF2: [0]
- IO1.CONF1: [0]
- IO1.CONF2: [0]
- ADC1_Setup: 1
- ADC2_Setup: 1
- ADC3_Setup: 1
- method_name: RCU_off
registers:
- IO2.OUT1: [0x00] #Switch all off
- IO2.OUT2: [0x00]
- IO3.OUT1: [0x00]
- IO3.OUT2: [0x00]
- IO1.OUT1: [0x00]
- IO1.OUT2: [0x00]
dev_children:
- child_name: PLL
child_dev : SPIbitbang2
child_conf: LTS_clkPLL
child_GPIO:
- CLK : IO3.OUT1.4
- SDO : IO3.IN1.5
- SDI : IO3.OUT1.7
- CS : IO3.OUT1.6
#This is the I2C devices in the RCU
I2C_devices:
- dev_name: IO3
dev_description: IO-Expander
dev_address: 0x20
dev_device: TCA6416
dev_registers:
- reg_name: CONF1
reg_addr: 6
- reg_name: CONF2
reg_addr: 7
- reg_name: IN1
reg_addr: 0
- reg_name: IN2
reg_addr: 1
- reg_name: OUT1
reg_addr: 2
reg_default: 0x0F
- reg_name: OUT2
reg_addr: 3
reg_default: 0x0F
Variables:
- var_name: IGNORE_PPS
var_dev: IO3.OUT1
var_width: 1
var_bitoffset: 6
# var_R/W: RW
- var_name: ENABLE_PWR
var_dev: IO3.OUT1
var_width: 1
var_bitoffset: 7
# var_R/W: RW
- var_name: STAT1
var_dev: IO3.OUT1
var_width: 1
var_bitoffset: 4
# var_R/W: RO
# - var_name: STAT2
# var_dev: IO3.OUT1
# var_width: 1
# var_bitoffset: 5
# var_R/W: RO
- var_name: CONF
var_dev: IO3.CONF1
var_width: 8
- var_name: OUT
var_dev: IO3.OUT1
var_width: 8
- var_name: IN
var_dev: IO3.IN1
var_width: 8
Methods:
- method_name: on1
registers:
- IO3.CONF1: [0x2C]
- IO3.OUT1: [0x42]
- method_name: off1
method_invisible: 1
registers:
- IO3.CONF1: [0x2C]
- IO3.OUT1: [0x40]
#Output High=SDI(x2), PPS (0x40) #Read 0x42,
# IN=0x46: High: SDI, CLK, Enable_PWR
I2C_devices:
- dev_name: PLL1
dev_description: I2C-SPI bridge to PLL
dev_device: LTC6950
dev_registers:
- reg_name: a0
reg_addr: 0x00
Variables:
- var_name: locked
var_dev: PLL1.a0
var_R/W: RO
var_width: 23
Methods:
- method_name: Power_off
method_invisible: 1
registers:
- PLL1.3: [0x88]
- method_name: Power_on
method_invisible: 1
registers:
- PLL1.3: [0x08]
- method_name: Reset
method_invisible: 1
registers:
- PLL1.3: [0x0C]
- method_name: Setup
method_invisible: 1
registers:
- PLL1.3: [0x08]
- PLL1.5: [0x97]
- PLL1.6: [0x10]
- PLL1.7: [0x04]
- PLL1.8: [0x01]
- PLL1.7: [0x00]
- PLL1.9: [0x10]
- PLL1.10: [0x14] #0x0A
- PLL1.9: [0x00]
- PLL1.13: [0x01] #0x0D
- PLL1.15: [0x01] #0x0F
- PLL1.17: [0x01] #0x11
- PLL1.19: [0x01] #0x13
dev_name: PCC_I2C
dev_children:
- child_dev : I2Cswitch
child_conf: LTS_switch
child_addr: 1 #I2C port on raspberry pi
dev_name: Switch1
dev_address: 0x70
dev_device: TCA9548
# LTS midplane: I2C 0-5 = RCU 0-5, I2C 6 = UNB2_N0, I2C 7 = UNB2
dev_children:
- child_name: RCU01
child_dev: I2Cdevices
child_conf: LTS_RCU2L
child_addr: 1
- child_name: RCU02
child_dev: I2Cdevices
child_conf: LTS_RCU2L
child_addr: 2
- child_name: RCU03
child_dev: I2Cdevices
child_conf: LTS_RCU2L
child_addr: 3
- child_name: CLK
child_dev: I2Cdevices
child_conf: LTS_clk
child_addr: 7
dev_groups: #Must have the same config!
- group_name: RCUs
group_members: [RCU01,RCU02,RCU03]
# group_members: [RCU01]
import yaml_reader
from opcua import ua, uamethod, Server
from yaml_reader import *
from opcua import ua, uamethod, Server
import sys import sys
import time import time
import logging import logging
import numpy # import numpy
from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt # from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt
from tango.server import Device, attribute, command, pipe, device_property # from tango.server import Device, attribute, command, pipe, device_property
class real_values:
access_incrementer = 0
class mock_device(Device):
voltage = attribute(label="Voltage", dtype="float", display_level=DispLevel.OPERATOR,
access=AttrWriteType.READ, unit="V", format="8.4f", doc="The power supply voltage")
current = attribute(label="Current", dtype="float", display_level=DispLevel.EXPERT,
access=AttrWriteType.READ_WRITE, unit="A", format="8.4f",
min_value=0.0, max_value=8.4, min_alarm=0.1, max_alarm=8.4,
min_warning=0.5, max_warning=8.0, fget="get_current", fset="set_current", doc="The power supply current")
noise = attribute(label="Noise",
dtype=((int,),),
max_dim_x=1024, max_dim_y=1024)
info = pipe(label='Info')
host = device_property(dtype=str) write_data = "test"
port = device_property(dtype=int, default_value=9788)
class device_template:
"""
List of all useful attributes
"""
def init_device(self): def __init__(self):
Device.init_device(self) pass
self.__current = 0.0
self.set_state(DevState.STANDBY)
def read_voltage(self):
self.info_stream("read_voltage(%s, %d)", self.host, self.port)
return 9.99, time.time(), AttrQuality.ATTR_WARNING
def get_current(self):
return self.__current
def set_current(self, current):
# should set the power supply current
self.__current = current
def read_info(self): def create_device_XMI(self, device):
return 'Information', dict(manufacturer='Tango', template = f"""
model='PS2000', <attributes name="{device.name}_{device.RW}" attType="Scalar" rwType="{device.RW}" displayLevel="OPERATOR" polledPeriod="{device.polling_period}" maxX="" maxY="" allocReadMember="true" isDynamic="false">
version_number=123) <dataType xsi:type="pogoDsl:{device.dtype}"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="{device.description}" label="{device.label}" unit="{device.unit}" standardUnit="{device.standard_unit}"
displayUnit="{device.display_unit}" format="" maxValue="{device.max}" minValue="{device.min}" maxAlarm="{device.max_alarm}"
minAlarm="{device.min_alarm}" maxWarning="{device.max_warn}" minWarning="{device.min_warn}" {device.deltaTime}="" {device.deltaValue}=""/>
</attributes>
"""
return template
@DebugIt()
def read_noise(self):
return numpy.random.random_integers(1000, size=(100, 100))
@command class device_instance:
def TurnOn(self): def __init__(self, attr_key):
# turn on the actual power supply here self.attribute_mapping = {}
self.set_state(DevState.ON) self.attribute_key = attr_key
@command
def TurnOff(self):
# turn off the actual power supply here
self.set_state(DevState.OFF)
@command(dtype_in=float, doc_in="Ramp target current", def read_func_R(self):
dtype_out=bool, doc_out="True if ramping went well, " """Return the LED_R attribute."""
"False otherwise")
def Ramp(self, target_current):
# should do the ramping
return True
self.read_value = self.attribute_mapping["LED_R"].get_value()
return self.read_value
def get_real_data(): def read_func_RW(self):
real_values.access_incrementer += 1
return real_values.access_incrementer
"""Return the LED_RW attribute."""
self.read_RW = self.attribute_mapping["LED_RW"].get_value()
return self.read_RW
def add_monitor_point(device, node): # PROTECTED REGION END # // RCUSCC.LED_RW_read
write_val = int(get_real_data())
node = obj.add_variable(idx, i.name, value)
print("Added: {}, description: {}".format(i.name, i.description))
OPC_nodes.append(node)
def write_func_RW(self, value):
# PROTECTED REGION ID(RCUSCC.LED_RW_write) ENABLED START #
"""Set the LED_RW attribute."""
self.attribute_mapping["LED_RW"].set_value(value)
self.write_value_RW = value
# PROTECTED REGION END # // RCUSCC.LED_RW_write
def add_control_point(device, node):
pass
class generator:
class mock_server:
def __init__(self): def __init__(self):
# gonna move the server here self.the_data = yaml_reader()
pass self.the_data.start_read()
self.the_data.group_groups()
logging.basicConfig(level=logging.WARNING) # INFO ERROR WARNING NOTSET DEBUG
# setup our server
server = Server()
server.set_endpoint("opc.tcp://192.168.178.17:4840/lofar/server/")
# setup our own namespace, not really necessary but should as spec
uri = "http://lofar.eu"
idx = server.register_namespace(uri)
# get Objects node, this is where we should put our custom stuff stuff = generator()
obj = server.get_objects_node()
OPC_nodes = []
for i in yaml_reader.device_list:
print("name: {}, description: {}".format(i.name, i.description))
value = int(get_real_data())
var_node = obj.add_variable(idx, i.name, value)
OPC_nodes.append(var_node)
# starting!
server.start()
for i in OPC_nodes:
print(i.get_browse_name(), ": ", i.get_value())
while 1:
time.sleep(0.1)
\ No newline at end of file
name, description, RW, max, min, scale, width "RCU01","Frequency","None","RW","None","None","1e-6""RCU01","Frequency","None","RW","None","None","1e-6""RCU01","locked","None","RW","None","None","None""RCU01","SYNC","None","RW","None","None","None""RCU01","CML","None","RW","None","None","None""RCU01","JESD","None","RW","None","None","None""RCU01","locked","None","RW","None","None","None""RCU01","SYNC","None","RW","None","None","None""RCU01","CML","None","RW","None","None","None""RCU01","JESD","None","RW","None","None","None""RCU01","locked","None","RW","None","None","None""RCU01","SYNC","None","RW","None","None","None""RCU01","CML","None","RW","None","None","None""RCU01","JESD","None","RW","None","None","None""RCU01","Attenuator1","None","RW","21","None","None""RCU01","Attenuator2","None","RW","21","None","None""RCU01","Attenuator3","None","RW","24","None","None""RCU01","Pwr_dig","Enable LDOs","RO","None","None","None""RCU01","Band3","None","RW","None","None","None""RCU01","Band1","None","RW","None","None","None""RCU01","Band2","None","RW","None","None","None""RCU01","LED0","Front panel LEDs, 0=On","RW","None","None","None""RCU01","Temperature","None","RO","None","None","0.00421""RCU01","Dth3_Pwr","None","RW","None","None","None""RCU01","Dth2_Pwr","None","RW","None","None","None""RCU02","Frequency","None","RW","None","None","1e-6""RCU02","Frequency","None","RW","None","None","1e-6""RCU02","locked","None","RW","None","None","None""RCU02","SYNC","None","RW","None","None","None""RCU02","CML","None","RW","None","None","None""RCU02","JESD","None","RW","None","None","None""RCU02","locked","None","RW","None","None","None""RCU02","SYNC","None","RW","None","None","None""RCU02","CML","None","RW","None","None","None""RCU02","JESD","None","RW","None","None","None""RCU02","locked","None","RW","None","None","None""RCU02","SYNC","None","RW","None","None","None""RCU02","CML","None","RW","None","None","None""RCU02","JESD","None","RW","None","None","None""RCU02","Attenuator1","None","RW","21","None","None""RCU02","Attenuator2","None","RW","21","None","None""RCU02","Attenuator3","None","RW","24","None","None""RCU02","Pwr_dig","Enable LDOs","RO","None","None","None""RCU02","Band3","None","RW","None","None","None""RCU02","Band1","None","RW","None","None","None""RCU02","Band2","None","RW","None","None","None""RCU02","LED0","Front panel LEDs, 0=On","RW","None","None","None""RCU02","Temperature","None","RO","None","None","0.00421""RCU02","Dth3_Pwr","None","RW","None","None","None""RCU02","Dth2_Pwr","None","RW","None","None","None""RCU03","Frequency","None","RW","None","None","1e-6""RCU03","Frequency","None","RW","None","None","1e-6""RCU03","locked","None","RW","None","None","None""RCU03","SYNC","None","RW","None","None","None""RCU03","CML","None","RW","None","None","None""RCU03","JESD","None","RW","None","None","None""RCU03","locked","None","RW","None","None","None""RCU03","SYNC","None","RW","None","None","None""RCU03","CML","None","RW","None","None","None""RCU03","JESD","None","RW","None","None","None""RCU03","locked","None","RW","None","None","None""RCU03","SYNC","None","RW","None","None","None""RCU03","CML","None","RW","None","None","None""RCU03","JESD","None","RW","None","None","None""RCU03","Attenuator1","None","RW","21","None","None""RCU03","Attenuator2","None","RW","21","None","None""RCU03","Attenuator3","None","RW","24","None","None""RCU03","Pwr_dig","Enable LDOs","RO","None","None","None""RCU03","Band3","None","RW","None","None","None""RCU03","Band1","None","RW","None","None","None""RCU03","Band2","None","RW","None","None","None""RCU03","LED0","Front panel LEDs, 0=On","RW","None","None","None""RCU03","Temperature","None","RO","None","None","0.00421""RCU03","Dth3_Pwr","None","RW","None","None","None""RCU03","Dth2_Pwr","None","RW","None","None","None""CLK","locked","None","RO","None","None","None""CLK","IGNORE_PPS","None","RW","None","None","None""CLK","ENABLE_PWR","None","RW","None","None","None""CLK","STAT1","None","RW","None","None","None""CLK","CONF","None","RW","None","None","None""CLK","OUT","None","RW","None","None","None""CLK","IN","None","RW","None","None","None"
"Att_0","Gain of ADC0","W","24","None","None","5" \ No newline at end of file
"Att_1","Gain of ADC0","W","24","None","None","5"
"Att_2","Gain of ADC0","W","24","None","None","5"
"Pwr_dig_0","Enable LDOs","W","None","None","None","1"
"Pwr_dig_1","Enable LDOs","W","None","None","None","1"
"Pwr_dig_2","Enable LDOs","W","None","None","None","1"
"Pwr_Ant_0","Switch power of Antenna 1","W","None","None","None","1"
"Pwr_Ant_1","Switch power of Antenna 1","W","None","None","None","1"
"Pwr_Ant_2","Switch power of Antenna 1","W","None","None","None","1"
"Band_0","10/30MHz band select","W","None","None","None","2"
"Band_1","10/30MHz band select","W","None","None","None","2"
"Band_2","10/30MHz band select","W","None","None","None","2"
"LED_0","LEDs on PCB","W","None","None","None","1"
"LED_1","LEDs on PCB","W","None","None","None","1"
"ADC_lock_0","Check ADC lock and JESD link ready","R","None","None","None","8"
"ADC_lock_1","Check ADC lock and JESD link ready","R","None","None","None","8"
"ADC_lock_2","Check ADC lock and JESD link ready","R","None","None","None","8"
"V_2v5_0","2.5V on PCB","R","None","None","1.97e-07","24"
"V_2v5_1","2.5V on PCB","R","None","None","1.97e-07","24"
"V_2v5_2","2.5V on PCB","R","None","None","1.97e-07","24"
import yaml import yaml
class device_template:
"""
List of all useful attributes
""" """
var_name: The name of a device
var_description: description
var_number: the number of instances
var_max: maximum values for each instance
var_min: minimum value of each instance
var_RW: read / write attributes
def __init__(self, data, board=""):
for k, v in data.items():
print("{}: {}".format(k, v))
self.instances = 1
self.name = "{}".format(data["var_name"]) # Required
self.description = None
self.RW = "RW" #TODO: currently assumes that no R/RW attribute means RW by default
self.max = None
self.min = None
self.scale = None
self.dtype = None
self.min_alarm = None
self.max_alarm = None
self.min_warn = None
self.max_warn = None
self.label = None
self.display_unit = None
self.unit = None
self.standard_unit = None
self.format = None
self.polling_period = 0
self.deltaTime = None
self.deltaValue = None
self.max_dim_x = 1
self.max_dim_x = 1
self.set_func = None # "write_func_RW"
self.get_func = None # "read_func_R" or "read_func_RW"
self.board = board
self.group = ""
self.group_nr = -1
if "var_description" in data:
self.description = data["var_description"]
if "var_max" in data:
self.max = data["var_max"]
if "var_min" in data:
self.min = data["var_min"]
if "var_R/W" in data:
self.RW = data["var_R/W"]
#available types and their names: https://pytango.readthedocs.io/en/stable/server_api/server.html#module-tango.server
if "var_width" in data:
if int(data["var_width"]) != 1:
# self.width = data["var_width"]
if "var_scale" in data:
self.dtype = 'double'
self.scale = data["var_scale"]
else:
self.dtype = 'int64'
else:
self.dtype = 'bool'
else:
self.dtype = 'int64'
class method_template:
def __init__(self, method_name, board):
self.name = method_name
self.board = board
- var_name: Att class yaml_reader:
var_description: Gain of ADC0 # these 3 parameters are of interest for finding the sub files.
var_number: 3 dev_child_param = "dev_children" # indicates the items below are sub files.
var_dev: [IO1.OUT1,IO1.OUT2,IO2.OUT1] child_name = "child_name" # name of the group
var_width: 5 child_file_name = "child_conf" # name of the file ( does not contain file extension)
var_max: [21,21,24] variable_param = "Variables"
var_R/W: W method_param = "Methods"
group_param = "dev_groups"
""" def __init__(self) -> object:
self.current_file = ""
self.previous_file = []
class var_Param: self.current_device = ""
var_name = "var_name" # Required
var_description = "var_description" # Optional and maybe unnececary
var_number = "var_number" # not in the device itself, but how many device instances there are
var_max = "var_max" # optional max value
var_min = "var_min" # optional max value
var_RW = "var_R/W" # optional, no mention is assumed R only
var_bitoffset = "var_bitoffset" # not interesting at this level
var_width = "var_width" # used to determine the datatype currently (subject to change)
var_scale = "var_scale" # used to determine the datatype currently (subject to change)
self.variable_list = []
self.method_list = []
class yaml_generated_device: # same as above but ordered in groups
def __init__(self, name="", description="", RW="R", maxval=None, minval=None, scale=None, width=None): self.board_list = []
self.name = name self.groups = []
self.description = description self.variables_grouped = []
self.RW = RW self.methods_grouped = []
self.max = maxval
self.min = minval
self.scale = scale
self.width = width
def device_copy(self, old_device): def add_method(self, data):
self.name = old_device.name if "method_invisible" in data:
self.description = old_device.description # we dont care about invisible methods, they don't exist I THINK????
self.RW = old_device.RW return
self.max = old_device.max else:
self.min = old_device.min self.method_list.append(method_template(data["method_name"], self.current_device))
self.scale = old_device.scale
self.width = old_device.width
def start_read(self):
self.read_file("YAML_files/LTS_pypcc.yaml")
self.group_boards()
self.group_groups()
self.log_groups()
def add_depth(depth):
for i in range(depth):
print("\t", end="")
class explorer: def read_file(self, file):
def __init__(self): if len(self.current_file) != "":
self.device_list = [] self.previous_file.append(self.current_file)
self.nof_devices = 0 self.current_file = file
with open(file) as f:
yaml_data = yaml.load_all(f, Loader=yaml.FullLoader)
for i in yaml_data:
self.reading(i)
self.current_file = self.previous_file[-1]
self.previous_file.pop(-1)
def reading(self, data, param=""):
if isinstance(data, list):
for i in data:
self.reading(i, param)
elif isinstance(data, dict):
for k, v in data.items():
self.reading(v, k)
self.catch_param(param, data)
else:
self.catch_param(param, data)
self.current_device = None # create an empty device for temporarily holding data
self.current_Device_instances = 1 # some devices need to be instantiated more than once
def log_data(self): def log_data(self):
file = open("output_devices.csv", "w") file = open("output_devices.csv", "w")
file.write("name, description, RW, max, min, scale, width\n") for i in self.variable_list:
text = "\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"".format(i.board, i.name, i.description, i.RW, i.max, i.min, i.scale, i.dtype)
print(text)
file.write(text)
for i in self.device_list: for i in self.method_list:
file.write("\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"\n".format(i.name, i.description, i.RW, i.max, i.min, i.scale, i.width)) print("method: {}, {}".format(i.board, i.name))
file.close()
def new_device(self): def log_groups(self):
# add the device or devices to the list for i in range(len(self.board_list)):
if self.current_device is None: print(">>>\t", self.board_list[i])
return
if self.current_Device_instances != 0: for j in self.variables_grouped[i]:
self.current_device.name += "_x" text = "\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"".format(j.board, j.name, j.description, j.RW, j.max, j.min, j.scale, j.dtype)
for i in range(self.current_Device_instances): print("\t", text)
self.device_list.append(yaml_generated_device())
self.device_list[-1].device_copy(self.current_device)
self.device_list[-1].name = self.current_device.name[:-1] + str(i)
else:
self.device_list.append(yaml_generated_device())
self.device_list[-1].device_copy(self.current_device)
def add_device_data(self, param, data):
# if the data is "var_name" a new device has begun,
if param == var_Param.var_name:
# add the current device to the device list
self.new_device()
# reset the current device to its default
self.current_device = yaml_generated_device()
self.current_device.name = data
# add the other parameters
if param == var_Param.var_RW:
self.current_device.RW = data
if param == var_Param.var_description:
self.current_device.description = data
if param == var_Param.var_max:
self.current_device.max = data
if param == var_Param.var_min:
self.current_device.min = data
if param == var_Param.var_scale:
self.current_device.scale = data
if param == var_Param.var_width:
self.current_device.width = data
# store the amount of instances to create
if param == var_Param.var_number:
self.current_Device_instances = data
def explore_list(self, data, name, depth):
print("")
add_depth(depth)
print("[")
for i in data:
self.explore(i, name, depth, True)
add_depth(depth) def group_boards(self):
print("]") for i in self.variable_list:
if not i.board in self.board_list:
print("addding {}".format(i.board))
self.board_list.append(i.board)
self.variables_grouped.append([])
def explore_dict(self, data, name, depth): for j in range(len(self.board_list)):
for k, v in data.items(): if i.board == self.board_list[j]:
add_depth(depth) self.variables_grouped[j].append(i)
print(k, "-> ", end="")
self.explore(v, str(k), depth)
def explore(self, data, name, depth, has_depth=False): def group_groups(self):
add_depth(depth) print(self.groups)
for i in self.groups:
for j in self.board_list:
if j in i:
print(i, j)
self.add_device_data(name, data)
#
# print("\t>>>\tName: {}".format(name))
if isinstance(data, list): def compare_lists(self, lst1, lst2):
self.explore_list(data, name, depth) matches = 0
elif isinstance(data, dict):
self.explore_dict(data, name, depth + 1)
else:
if has_depth:
add_depth(depth + 1)
print(data)
def start_explore(self): for i in lst1:
with open('control_I2C.yaml') as f: if i in lst2:
yaml_data = yaml.load_all(f, Loader=yaml.FullLoader) matches += 1
depth = 0
# explore(yaml_data, depth)
for i in yaml_data: def catch_param(self, key, data):
depth = 0 # print("{}:".format(key), data)
key = str(key)
Items = i.items() if key.find(self.dev_child_param) != -1:
for k, v in Items: print("{}:".format(key), data, " - there are sub files that I should open")
sub_data = yaml.load(str(v), Loader=yaml.FullLoader) file_name = "YAML_files/{}.yaml".format(dict(data)["child_conf"])
print(k) print("opening: ", file_name)
self.explore(sub_data, str(k), depth)
self.log_data()
return self.device_list
if self.current_file.find("switch") != -1:
print("\t >>>\t", data)
self.current_device = data["child_name"]
device_list = explorer().start_explore() self.read_file(file_name)
elif key.find(self.method_param) != -1:
print("{}:".format(key), data, " I should probably generate methods from this")
self.add_method(data)
elif key.find(self.variable_param) != -1:
print("{}:".format(key), data, " there are variable items below this")
dev = device_template(data, self.current_device)
self.variable_list.append(dev)
elif key.find(self.method_param) != -1:
print("{}:".format(key), data, " I should probably generate methods from this")
elif key.find(self.group_param) != -1:
print("{}:".format(key), data["group_members"], " these boards need to be grouped")
self.groups.append(data["group_members"])
else:
pass
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment