From 504cfadc1becd76e632549acc53eeb523d64d3b7 Mon Sep 17 00:00:00 2001 From: snijder <snijder@astron.nl> Date: Wed, 20 Jan 2021 15:45:05 +0100 Subject: [PATCH] Redid the generator --- .gitignore | 1 + YAML_files/LTS_RCU2L.yaml | 272 +++++++++++++++++++++++ YAML_files/LTS_RCU2_ADC.yaml | 43 ++++ YAML_files/LTS_RCU2_dither.yaml | 29 +++ YAML_files/LTS_RCU2dig.yaml | 212 ++++++++++++++++++ YAML_files/LTS_clk.yaml | 84 +++++++ YAML_files/LTS_clkPLL.yaml | 43 ++++ YAML_files/LTS_pypcc.yaml | 5 + YAML_files/LTS_switch.yaml | 26 +++ code_generator.py | 0 main.py | 155 +++++-------- output_devices.csv | 22 +- yaml_reader.py | 381 ++++++++++++++++++-------------- 13 files changed, 981 insertions(+), 292 deletions(-) create mode 100644 YAML_files/LTS_RCU2L.yaml create mode 100644 YAML_files/LTS_RCU2_ADC.yaml create mode 100644 YAML_files/LTS_RCU2_dither.yaml create mode 100644 YAML_files/LTS_RCU2dig.yaml create mode 100644 YAML_files/LTS_clk.yaml create mode 100644 YAML_files/LTS_clkPLL.yaml create mode 100644 YAML_files/LTS_pypcc.yaml create mode 100644 YAML_files/LTS_switch.yaml create mode 100644 code_generator.py diff --git a/.gitignore b/.gitignore index f9606a3..8093a02 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /venv +/output.py diff --git a/YAML_files/LTS_RCU2L.yaml b/YAML_files/LTS_RCU2L.yaml new file mode 100644 index 0000000..03ce804 --- /dev/null +++ b/YAML_files/LTS_RCU2L.yaml @@ -0,0 +1,272 @@ +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] + + + diff --git a/YAML_files/LTS_RCU2_ADC.yaml b/YAML_files/LTS_RCU2_ADC.yaml new file mode 100644 index 0000000..a61c7f6 --- /dev/null +++ b/YAML_files/LTS_RCU2_ADC.yaml @@ -0,0 +1,43 @@ +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 diff --git a/YAML_files/LTS_RCU2_dither.yaml b/YAML_files/LTS_RCU2_dither.yaml new file mode 100644 index 0000000..aa21250 --- /dev/null +++ b/YAML_files/LTS_RCU2_dither.yaml @@ -0,0 +1,29 @@ +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] diff --git a/YAML_files/LTS_RCU2dig.yaml b/YAML_files/LTS_RCU2dig.yaml new file mode 100644 index 0000000..2f9c9ee --- /dev/null +++ b/YAML_files/LTS_RCU2dig.yaml @@ -0,0 +1,212 @@ +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] + + + diff --git a/YAML_files/LTS_clk.yaml b/YAML_files/LTS_clk.yaml new file mode 100644 index 0000000..58ae764 --- /dev/null +++ b/YAML_files/LTS_clk.yaml @@ -0,0 +1,84 @@ +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 + diff --git a/YAML_files/LTS_clkPLL.yaml b/YAML_files/LTS_clkPLL.yaml new file mode 100644 index 0000000..c6e99bb --- /dev/null +++ b/YAML_files/LTS_clkPLL.yaml @@ -0,0 +1,43 @@ +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 diff --git a/YAML_files/LTS_pypcc.yaml b/YAML_files/LTS_pypcc.yaml new file mode 100644 index 0000000..98536bc --- /dev/null +++ b/YAML_files/LTS_pypcc.yaml @@ -0,0 +1,5 @@ +dev_name: PCC_I2C +dev_children: + - child_dev : I2Cswitch + child_conf: LTS_switch + child_addr: 1 #I2C port on raspberry pi diff --git a/YAML_files/LTS_switch.yaml b/YAML_files/LTS_switch.yaml new file mode 100644 index 0000000..eec8a39 --- /dev/null +++ b/YAML_files/LTS_switch.yaml @@ -0,0 +1,26 @@ +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] diff --git a/code_generator.py b/code_generator.py new file mode 100644 index 0000000..e69de29 diff --git a/main.py b/main.py index d635ea9..c91f4db 100644 --- a/main.py +++ b/main.py @@ -1,131 +1,82 @@ -import yaml_reader -from opcua import ua, uamethod, Server +from yaml_reader import * + +from opcua import ua, uamethod, Server + import sys import time import logging -import numpy -from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt -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) - port = device_property(dtype=int, default_value=9788) - - - def init_device(self): - Device.init_device(self) - 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): - return 'Information', dict(manufacturer='Tango', - model='PS2000', - version_number=123) +# import numpy +# from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt +# from tango.server import Device, attribute, command, pipe, device_property - @DebugIt() - def read_noise(self): - return numpy.random.random_integers(1000, size=(100, 100)) +write_data = "test" - @command - def TurnOn(self): - # turn on the actual power supply here - self.set_state(DevState.ON) +class device_template: + """ + List of all useful attributes + """ - @command - def TurnOff(self): - # turn off the actual power supply here - self.set_state(DevState.OFF) + def __init__(self): + pass - @command(dtype_in=float, doc_in="Ramp target current", - dtype_out=bool, doc_out="True if ramping went well, " - "False otherwise") - def Ramp(self, target_current): - # should do the ramping - return True + def create_device_XMI(self, device): + template = f""" + <attributes name="{device.name}_{device.RW}" attType="Scalar" rwType="{device.RW}" displayLevel="OPERATOR" polledPeriod="{device.polling_period}" maxX="" maxY="" allocReadMember="true" isDynamic="false"> + <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 -def get_real_data(): - real_values.access_incrementer += 1 - return real_values.access_incrementer +class device_instance: + def __init__(self, attr_key): + self.attribute_mapping = {} + self.attribute_key = attr_key -def add_monitor_point(device, node): - 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 read_func_R(self): + """Return the LED_R attribute.""" + self.read_value = self.attribute_mapping["LED_R"].get_value() + return self.read_value -def add_control_point(device, node): - pass + def read_func_RW(self): + """Return the LED_RW attribute.""" + self.read_RW = self.attribute_mapping["LED_RW"].get_value() + return self.read_RW -class mock_server: - def __init__(self): - # gonna move the server here - pass + # PROTECTED REGION END # // RCUSCC.LED_RW_read + 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 -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/") +class generator: -# setup our own namespace, not really necessary but should as spec -uri = "http://lofar.eu" -idx = server.register_namespace(uri) + def __init__(self): + self.the_data = yaml_reader() + self.the_data.start_read() + self.the_data.group_groups() -# get Objects node, this is where we should put our custom stuff -obj = server.get_objects_node() +stuff = generator() -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 diff --git a/output_devices.csv b/output_devices.csv index 3d5d459..42f891a 100644 --- a/output_devices.csv +++ b/output_devices.csv @@ -1,21 +1 @@ -name, description, RW, max, min, scale, width -"Att_0","Gain of ADC0","W","24","None","None","5" -"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" +"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" \ No newline at end of file diff --git a/yaml_reader.py b/yaml_reader.py index 5a6425e..365f27c 100644 --- a/yaml_reader.py +++ b/yaml_reader.py @@ -1,171 +1,214 @@ import yaml -""" -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 - - - - - var_name: Att - var_description: Gain of ADC0 - var_number: 3 - var_dev: [IO1.OUT1,IO1.OUT2,IO2.OUT1] - var_width: 5 - var_max: [21,21,24] - var_R/W: W - -""" - - -class var_Param: - 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) - - -class yaml_generated_device: - def __init__(self, name="", description="", RW="R", maxval=None, minval=None, scale=None, width=None): - self.name = name - self.description = description - self.RW = RW - self.max = maxval - self.min = minval - self.scale = scale - self.width = width - - def device_copy(self, old_device): - self.name = old_device.name - self.description = old_device.description - self.RW = old_device.RW - self.max = old_device.max - self.min = old_device.min - self.scale = old_device.scale - self.width = old_device.width - - -def add_depth(depth): - for i in range(depth): - print("\t", end="") - - -class explorer: - def __init__(self): - self.device_list = [] - self.nof_devices = 0 - - 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): - file = open("output_devices.csv", "w") - - file.write("name, description, RW, max, min, scale, width\n") - - for i in self.device_list: - file.write("\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"\n".format(i.name, i.description, i.RW, i.max, i.min, i.scale, i.width)) - - file.close() - - def new_device(self): - # add the device or devices to the list - if self.current_device is None: - return - - if self.current_Device_instances != 0: - self.current_device.name += "_x" - for i in range(self.current_Device_instances): - 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) - print("]") - - def explore_dict(self, data, name, depth): - for k, v in data.items(): - add_depth(depth) - print(k, "-> ", end="") - self.explore(v, str(k), depth) - - def explore(self, data, name, depth, has_depth=False): - add_depth(depth) - - self.add_device_data(name, data) - # - # print("\t>>>\tName: {}".format(name)) - - if isinstance(data, list): - self.explore_list(data, name, depth) - 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): - with open('control_I2C.yaml') as f: - yaml_data = yaml.load_all(f, Loader=yaml.FullLoader) - depth = 0 - # explore(yaml_data, depth) - - for i in yaml_data: - depth = 0 - - Items = i.items() - for k, v in Items: - sub_data = yaml.load(str(v), Loader=yaml.FullLoader) - print(k) - self.explore(sub_data, str(k), depth) - - self.log_data() - return self.device_list - - -device_list = explorer().start_explore() +class device_template: + """ + List of all useful 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 + +class yaml_reader: + # these 3 parameters are of interest for finding the sub files. + dev_child_param = "dev_children" # indicates the items below are sub files. + child_name = "child_name" # name of the group + child_file_name = "child_conf" # name of the file ( does not contain file extension) + variable_param = "Variables" + method_param = "Methods" + group_param = "dev_groups" + + def __init__(self) -> object: + + self.current_file = "" + self.previous_file = [] + + self.current_device = "" + + self.variable_list = [] + self.method_list = [] + + # same as above but ordered in groups + self.board_list = [] + self.groups = [] + self.variables_grouped = [] + self.methods_grouped = [] + + def add_method(self, data): + if "method_invisible" in data: + # we dont care about invisible methods, they don't exist I THINK???? + return + else: + self.method_list.append(method_template(data["method_name"], self.current_device)) + + def start_read(self): + self.read_file("YAML_files/LTS_pypcc.yaml") + self.group_boards() + self.group_groups() + self.log_groups() + + + + def read_file(self, file): + if len(self.current_file) != "": + self.previous_file.append(self.current_file) + 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) + + + def log_data(self): + file = open("output_devices.csv", "w") + + 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.method_list: + print("method: {}, {}".format(i.board, i.name)) + + + def log_groups(self): + for i in range(len(self.board_list)): + print(">>>\t", self.board_list[i]) + + for j in self.variables_grouped[i]: + text = "\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"".format(j.board, j.name, j.description, j.RW, j.max, j.min, j.scale, j.dtype) + print("\t", text) + + def group_boards(self): + 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([]) + + for j in range(len(self.board_list)): + if i.board == self.board_list[j]: + self.variables_grouped[j].append(i) + + def group_groups(self): + print(self.groups) + for i in self.groups: + for j in self.board_list: + if j in i: + print(i, j) + + + def compare_lists(self, lst1, lst2): + matches = 0 + + for i in lst1: + if i in lst2: + matches += 1 + + def catch_param(self, key, data): + # print("{}:".format(key), data) + + key = str(key) + + if key.find(self.dev_child_param) != -1: + print("{}:".format(key), data, " - there are sub files that I should open") + file_name = "YAML_files/{}.yaml".format(dict(data)["child_conf"]) + print("opening: ", file_name) + + + if self.current_file.find("switch") != -1: + print("\t >>>\t", data) + self.current_device = data["child_name"] + + 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 -- GitLab