Skip to content
Snippets Groups Projects
Commit 32e9e664 authored by Paulus Kruger's avatar Paulus Kruger
Browse files

HBAT1 control added

parent c0f9446c
No related branches found
No related tags found
1 merge request!11Pypcc2
......@@ -10,7 +10,7 @@ drivers:
type: i2c_array #An array of similar devices connected to an I2C switch
parent: I2C1
parameters: [0,31] #start,number of RCUs
- name: I2C_HBAT
- name: I2C_HBAT
type: hba1 #Special driver to manage HBAT1s.
parent: I2C_RCU
- name: I2Cbb1
......@@ -43,6 +43,11 @@ drivers:
devreg: [IO3.GPIO1,IO3.GPIO1,IO3.CONF1,IO3.GPIO2]
parameters: [5,4,4,2]
parent: I2C_RCU
- name: HBA_trigger
type: gpio_hba_trigger
devreg: [0x40.0x10] #I2C broadcast register
parameters: [15] #PPS GPIO pin
parent: I2C_RCU
#This is the I2C devices in the RCU
device_registers:
......@@ -118,15 +123,24 @@ device_registers:
description: Device ID
address: 0
- name: HB_UC_update
description: RCU microcontroller
address: 0x40
driver: HBA_trigger
registers:
- name: wait_pps
address: 10
- name: HBAT
dim: 3
address: [0x41,0x42,0x43]
description: Virtual HBAT0 interface
driver: I2C1
driver: I2C_HBAT
registers:
- name: XY
address: 0x10
description: XY delay register
store: True
- name: Version
address: 127
description: HBAT server version
......@@ -170,7 +184,6 @@ device_registers:
description: Stop CW
address: [0x67,0x67]
variables:
- name: Ant_mask
description: Only masked RF chains are updated
......@@ -279,7 +292,7 @@ variables:
- name: HBA_element_beamformer_delays
description: Delays of each frontend
driver: I2C_HBAT
driver: I2C_RCU
devreg: [HBAT1.XY,HBAT2.XY,HBAT3.XY]
bitoffset: [2,2,2]
width: 5
......@@ -328,6 +341,8 @@ variables:
dim: 96
mask: Ant_mask
methods:
- name: RCU_on
driver: I2C_RCU
......@@ -392,4 +407,11 @@ methods:
- name: RCU_off
instructions:
- RCU_Pwr_dig: 0 #Switch power off
#todo, also make all GPIO pins (except power enables) inputs to remove all power from devices.
\ No newline at end of file
#todo, also make all GPIO pins (except power enables) inputs to remove all power from devices.
- name: RCU_HBAT_WAIT_PPS
driver: I2C_RCU
mask: RCU_mask
instructions:
- HB_UC_update.wait_pps : 1
import numpy as np
#import numpy as np
from .hwdev import hwdev;
import logging
class gpio(hwdev):
......
from .hwdev import hwdev;
import logging
import signal
try:
import RPi.GPIO as GPIO
except:
GPIO=False;
class gpio_hba_trigger(hwdev):
def __init__(self,config):
hwdev.__init__(self,config);
self.pin=config['parameters'][0];
logging.info("HBAT wait for PPS on pin %i",self.pin)
if GPIO:
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.pin,GPIO.IN)
else:
logging.warn("RPi GPIO module not found, PPS input disable!")
def i2csetget(self,addr,data,reg=None,read=0):
if (read==0) and GPIO:
channel=GPIO.wait_for_edge(self.pin,GPIO.RISING,timeout=1500)
if channel is None:
logging.info("PPS not received!");
return False;
self.conf['parentcls'].i2csetget(addr,data,reg,read)
import numpy as np
from .hwdev import hwdev;
from .hwdev import hwdev
import logging
from .i2c_array import ApplyMask
from time import sleep
class hba1(hwdev):
def __init__(self,config):
hwdev.__init__(self,config);
logging.info("HBA1 todo")
self.previousHBA=np.zeros([32,3,32],dtype='int')
logging.info("HBA1 not tested yet!")
# self.previousHBA=np.zeros([32,3,32],dtype='int')
def i2csetget(self,addr,data,reg=None,read=0):
if read==0: return self.sethba(addr,reg,data)
elif read==1: return self.gethba(addr,reg,data)
else: logging.warn("Not implemented!")
return False;
def sethba(self,addr,reg,data):
logging.debug("SetHba addr=0x%x reg=0x%x",addr,reg)
I2Ccallback=self.conf['parentcls'].i2csetget
I2Ccallback(0x40,[],reg=0,read=1)#wakeup, do nothing
sleep(0.01)
I2Ccallback(addr,data[:16],reg=reg)
if len(data)>16:
sleep(0.01)
I2Ccallback(addr,data[16:],reg=reg+16)
sleep(0.01)
return True
def gethba(self,addr,reg,data):
I2Ccallback=self.conf['parentcls'].i2csetget
if not(I2Ccallback(addr,data,read=1)): return False;
# I2Ccallback(addr,data,read=1);
if data is None: return False
data[:]=[255]*len(data)
logging.debug("getHba addr=0x%x reg=0x%x data=%s",addr,reg,str((data)))
return True;
\ No newline at end of file
......@@ -79,7 +79,7 @@ def GetSteps(V1):
if isinstance(V1['devreg'],list): Step=len(V1['devreg'])
else: Step=1; #V1.nVars
Step2=V1['dim']*((V1.get('width',8)+7)//8)//Step #int(V1.size/V1.nVars)
#print(Step,Step2,V1);
logging.debug(str(("GetStep",Step,Step2)));
return Step,Step2
......@@ -220,10 +220,10 @@ class i2c_array(hwdev):
return value1,mask
def getstorearray(self,devreg):
def getstorearray(self,devreg,N=1):
storearray=devreg.get('storearray')
if not(storearray):
devreg['storearray']=[0]*self.N;
devreg['storearray']=([0] if N==1 else [[0]*N])*self.N;
storearray=devreg.get('storearray');
return storearray;
......@@ -244,14 +244,19 @@ class i2c_array(hwdev):
def SetVarValue(self,devreg,width,bitoffset,value):
if devreg['register_W']==-1: return True; #We can not set it, only read it e.g. temperature
logging.debug(str(("RCU1 Set ",self.RCUi,devreg['addr'],value)))
#logging.debug(str(("RCU1 Set ",self.RCUi,devreg['addr'],value)))
#self.parentcls.SetChannel(1<<RCU_Switch[RCUi]);
if devreg['store']:
storearray=self.getstorearray(devreg);
storearray=self.getstorearray(devreg,len(value));
previous=storearray[self.RCUi];
value[0]=ApplyMask(value[0],width,bitoffset,previous);
storearray[self.RCUi]=value[0]
logging.debug("Stored value:"+str(value[0]))
if (len(value)>1) and (isinstance(previous,list)) and (len(previous)==len(value)):
for x in range(len(value)):
value[x]=ApplyMask(value[x],width,bitoffset,previous[x]);
storearray[self.RCUi]=value[:]
else:
value[0]=ApplyMask(value[0],width,bitoffset,previous);
storearray[self.RCUi]=value[0]
logging.debug(str(("Stored value:",value,"previous",previous)))
# devreg['drivercls'].i2csetget
return devreg['drivercls'].i2csetget(devreg['addr'],value,reg=devreg['register_W'])
......@@ -275,8 +280,11 @@ class i2c_array(hwdev):
if value2[0] is None: return False
value[:]=value2[:];
if devreg['store']:
storearray=self.getstorearray(devreg);
storearray[self.RCUi]=value[0]
storearray=self.getstorearray(devreg,len(value));
if len(value)==1:
storearray[self.RCUi]=value[0]
else:
storearray[self.RCUi]=value[:]
logging.debug(str(("Store buffer",self.RCUi,value[0])))
# print("Stored values:",self.getstorearray(devreg))
if (width!=l1*8) or (bitoffset>0):
......
......@@ -52,7 +52,7 @@ def runmethod(conf,Qout,methodid,mask):
continue;
v1=conf.getdevreg(key)
if v1:
drv2=v1['drivercls']
drv2=v1.get('drivercls')
if drv: drv.Setdevreg(v1,value,mask)
elif drv2: drv2.Setdevreg(v1,value,mask)
else: logging.warn("Driver not specified for instruction"+key)
......
......@@ -25,7 +25,6 @@ if not isinstance(loglevel_nr, int):
#logging.basicConfig(level=loglevel_nr, format="%(asctime)s [%(levelname)8s] %(message)s")
logging.basicConfig(level=loglevel_nr,format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
RunTimer=True;
def signal_handler(sig, frame):
logging.warn('Stop signal received!')
......@@ -66,6 +65,7 @@ if not(args.test):
time.sleep(1)
logging.info("Start OPC-UA server")
opcuaserv.start()
logging.getLogger().setLevel("WARNING")
if False:
opcuaserv.server.stop()
......
from test_common import *
RCUs=[0,1,2,3];
setRCUmask(RCUs)
#for RCU in RCUs:
#setAntmask(RCUs,[True,True,True])
callmethod("RCU_HBAT_WAIT_PPS")
disconnect();
\ No newline at end of file
......@@ -38,17 +38,22 @@ var1=RCU_conf.getmethodid('RCU_update');
#mask=[i<2 for i in range(N)];
#RCU_I2C.callmethod(var1,[])
if True:
if False:
var1=RCU_conf.getvarid('RCU_LED0');
N=32;
mask=[i<8 for i in range(N)];
data=[0]*N;
elif True:
elif False:
var1=RCU_conf.getvarid('RCU_attenuator');
N=32*3;
mask=[i<6 for i in range(N)];
data=[10]*N;
data[:6]=[0,1,2,3,4,5]
else:
var1=RCU_conf.getvarid('HBA_element_beamformer_delays');
N=32*3;
mask=[i<8 for i in range(N)];
data=[1]*(N*32);
#print(var1)
print("mask=",mask);
print("data=",data);
......@@ -57,19 +62,20 @@ print("data=",data);
var1=RCU_conf.getvarid('RCU_temperature');
N=32;
mask=[i<2 for i in range(N)];
RCU_I2C.readvar(var1,mask);
#RCU_I2C.readvar(var1,mask);
#data=[0]*N;
#RCU_I2C.setvar(var1,data,mask);
#def setvar(self,id1,data=[],mask=[]):
var1=RCU_conf.getmethodid('RCU_on');
#var1=RCU_conf.getmethodid('RCU_on');
var1=RCU_conf.getmethodid('RCU_HBAT_WAIT_PPS');
N=32;
mask=[i<7 for i in range(N)];
#RCU_I2C.callmethod(var1,mask)
RCU_I2C.callmethod(var1,mask)
time.sleep(5);
time.sleep(2);
while RCU_I2C.data_waiting():
varid,data,mask=RCU_I2C.readdata()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment