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

Initial commit

parent 1dc04f6f
No related branches found
No related tags found
No related merge requests found
/venv
PCB_name: RCU-ADC
PCB_version: 1.0
#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_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: OUT1
reg_description: Ouput port register 0..7
reg_addr: 2
ref_default: 0
- reg_name: OUT2
reg_description: Ouput port register 8..15
reg_addr: 3
ref_default: 0
- 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_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: OUT1
reg_description: Ouput port register 0..7
reg_addr: 2
ref_default: 0
- reg_name: OUT2
reg_description: Ouput port register 8..15
reg_addr: 3
ref_default: 0
- 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: IO-Expander for filter selection
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: ADCm
dev_description: Monitor ADC on RCU
dev_address: 0x14
dev_device: LTC2495
dev_registers:
- reg_name: Ch0
reg_addr: 0xB0
- 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
#This 'special' devices that uses I2C
HBAT_devices:
- dev_name: HBAT
dev_number: 3
dev_address: [0x41,0x42,0x43]
dev_description: Virtual HBAT0 interface
dev_registers:
- reg_name: X
reg_addr: 0
reg_description: X delay register
reg_width: 16
- reg_name: Y
reg_addr: 1
reg_description: Y delay register
reg_width: 16
- reg_name: Version
reg_addr: 127
reg_description: HBAT server version
reg_width: 16
SPI_devices:
- dev_name: ADC
dev_number: 3
dev_description: I2C-SPI bridge to ADC
dev_device: AD9683
dev_CLK : [IO3.OUT1.1 ,IO3.OUT1.3 ,IO3.OUT1.5 ]
dev_SDO : [IO3.OUT1.0 ,IO3.OUT1.2 ,IO3.OUT1.4 ]
dev_SDI : [IO3.IN1.0 ,IO3.IN1.2 ,IO3.IN1.4 ]
dev_SDIO_dir: [IO3.CONF1.0,IO3.CONF1.2,IO3.CONF1.4]
dev_CS : [IO3.OUT2.0 ,IO3.OUT2.1 ,IO3.OUT2.2 ]
dev_registers:
- reg_name: PLL_stat
reg_description: PLL locked status
reg_addr: 0x0A
- reg_name: JESD_control1
reg_description: JESD link control
reg_addr: 0x5F
- reg_name: CML_adjust
reg_description: CML output adjust
reg_addr: 0x15
- reg_name: Update
reg_description: Global device uptate
reg_addr: 0xFF
Variables:
- 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
- var_name: Pwr_dig
var_description: Enable LDOs
var_dev: IO2.OUT1
var_width: 1
var_bitoffset: 6
var_R/W: W
- var_name: Pwr_Ant
var_description: Switch power of Antenna 1
var_number: 3
var_dev: [IO1.OUT1,IO1.OUT1,IO1.OUT2]
var_width: 1
var_bitoffset: [6,7,6]
var_R/W: W
- var_name: Band
var_description: 10/30MHz band select
var_number: 3
var_dev: IO2.OUT2
var_width: 2
var_bitoffset: [0,2,4]
var_R/W: W
- var_name: LED
var_description: LEDs on PCB
var_number: 2
var_dev: IO2.OUT2
var_width: 1
var_bitoffset: [6,7]
var_R/W: W
- var_name: ADC_lock
var_number: 3
var_description: Check ADC lock and JESD link ready
var_dev: ADC.PLL_stat
var_width: 8
var_R/W: R
- var_name: V_2v5
var_description: 2.5V on PCB
var_dev: ADCm.Ch1
var_width: 24
var_scale: 1.97e-7
var_R/W: R
- var_name: I_Ant
var_number: 3
var_description: Antenna currents
var_dev: [ADCm.Ch4,ADCm.Ch5,ADCm.Ch6]
var_width: 24
var_scale: 12
var_R/W: R
\ No newline at end of file
main.py 0 → 100644
import yaml_reader
from opcua import ua, uamethod, Server
from opcua.common.callback import CallbackType
import sys
import time
import logging
class real_values:
access_incrementer = 0
def get_real_data():
real_values.access_incrementer += 1
return real_values.access_incrementer
def device_callback(event, dispatcher):
print(dispatcher)
dispatcher.set_value(get_real_data())
class mock_server:
def __init__(self):
# gonna move the server here
pass
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
obj = server.get_objects_node()
# starting!
server.start()
OPC_nodes = []
for i in yaml_reader.device_list:
print("name: {}, description: {}".format(i.name, i.description))
OPC_nodes.append(obj.add_variable(idx, i.name, get_real_data(), ua.VariantType.Int64))
for i in OPC_nodes:
print(i.get_browse_name(), ": ", i.get_value())
server.subscribe_server_callback(CallbackType, device_callback)
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 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
self.log_file = open("test_output.txt", 'w')
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(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(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 = 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)
return self.device_list
device_list = explorer().start_explore()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment