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

i2c first working version

parent d7caf511
No related branches found
No related tags found
No related merge requests found
cd src/apsctl
python3 yaml2head.py
rm pypcc/pypcc.capnp rm pypcc/pypcc.capnp
cd src/interface cd src/interface
capnp compile -oc++ pypcc.capnp capnp compile -oc++ pypcc.capnp
......
...@@ -75,8 +75,8 @@ def TimerThread(RCU_I2C,RCU_conf): ...@@ -75,8 +75,8 @@ def TimerThread(RCU_I2C,RCU_conf):
logging.info("End Timer thread") logging.info("End Timer thread")
Timerthread1 = threading.Thread(target=TimerThread, args=(RCU_I2C,RCU_conf)) #Timerthread1 = threading.Thread(target=TimerThread, args=(RCU_I2C,RCU_conf))
Timerthread1.start() #Timerthread1.start()
# on SIGINT: stop thread(s) by adding None to instruction queue(s) # on SIGINT: stop thread(s) by adding None to instruction queue(s)
def signal_handler(sig, frame): def signal_handler(sig, frame):
...@@ -102,4 +102,4 @@ finally: ...@@ -102,4 +102,4 @@ finally:
opcuaserv.server.stop() opcuaserv.server.stop()
# RCUthread1.join() # RCUthread1.join()
# CLKthread1.join() # CLKthread1.join()
Timerthread1.join() # Timerthread1.join()
import yaml import yaml
import struct import struct
import time
def Find(L,name,value): def Find(L,name,value):
for x in L: for x in L:
if x[name]==value: if x[name]==value:
...@@ -51,6 +52,7 @@ class yamlreader(): ...@@ -51,6 +52,7 @@ class yamlreader():
v['OPCR']=var1 v['OPCR']=var1
print("Var added:"+name+"_R") print("Var added:"+name+"_R")
self.server.readvar(v['id']) self.server.readvar(v['id'])
time.sleep(0.1);
# Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim2,varvalue2) # Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim2,varvalue2)
# Q1.put(Inst) # Q1.put(Inst)
...@@ -152,19 +154,20 @@ class yamlreader(): ...@@ -152,19 +154,20 @@ class yamlreader():
if width<=1: if width<=1:
data2=[d for d in data] data2=[d for d in data]
elif width==2: elif width==2:
data2 = struct.unpack('>%sH' % len(data), data) data2 = struct.unpack('>%sH' % (len(data)//2), data)
elif width==3: elif width==3:
data2 = [struct.unpack('>L' ,bytearray([0])+data[x*3:x*3+3])[0] for x in range(len(data)//3)] data2 = [struct.unpack('>L' ,bytearray([0])+data[x*3:x*3+3])[0] for x in range(len(data)//3)]
elif width==4: elif width==4:
data2 = struct.unpack('>%sL' % len(data), data) data2 = struct.unpack('>%sL' % (len(data)//4), data)
elif width==8: elif width==8:
data2 = struct.unpack('>%sQ' % len(data), data) data2 = struct.unpack('>%sQ' % (len(data)//8), data)
else: else:
print("OPCset",v['name']," unsupported width!",width) print("OPCset",v['name']," unsupported width!",width)
return; return;
elif dtype=="string": elif dtype=="string":
cnt=int(len(data)/width) cnt=int(len(data)/width)
data2=[(bytearray(data[i*width:(i+1)*width]).decode("utf-8")) for i in range(cnt)] # data2=[(bytearray(data[i*width:(i+1)*width]).decode("utf-8")) for i in range(cnt)]
data2=[bytearray(data)[i*width:(i+1)*width].decode("utf-8") for i in range(cnt)]
else: else:
print("OPCset unsupported type"); print("OPCset unsupported type");
return; return;
......
from test_common import *
name="RCU_band"
RCU=1;
Att=[2,2,2]
setAntmask([RCU])
att=get_value(name+"_R")
print("Att old:",att[3*RCU:3*RCU+3])
att[3*RCU:3*RCU+3]=Att
set_value(name+"_RW",att)
time.sleep(0.5)
att=get_value(name+"_R")
print("Att new:",att[3*RCU:3*RCU+3])
disconnect()
\ No newline at end of file
#include "i2c.h" #include "i2c.h"
#include <iostream> #include <iostream>
//#include <cstdio>
//#include <cstdlib>
#include <linux/i2c-dev.h> #include <linux/i2c-dev.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include "smbus.h" #include "smbus.h"
...@@ -7,7 +9,9 @@ ...@@ -7,7 +9,9 @@
#include <fcntl.h> #include <fcntl.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <linux/types.h> #include <linux/types.h>
#include <unistd.h>
//#include <sys/stat.h>
using namespace std;
c_i2c::c_i2c(const t_driver config1) : drvbase (config1){ c_i2c::c_i2c(const t_driver config1) : drvbase (config1){
std::cout << config.name <<": i2c server, connecting to device " << config.parameters[0] << "\n"; std::cout << config.name <<": i2c server, connecting to device " << config.parameters[0] << "\n";
char filename[20]; char filename[20];
...@@ -23,18 +27,24 @@ bool c_i2c::I2Csend_reg(int addr,int reg,int len,t_buffer* data){ ...@@ -23,18 +27,24 @@ bool c_i2c::I2Csend_reg(int addr,int reg,int len,t_buffer* data){
std::cout << config.name <<": i2c send to addr="<<addr<<" reg="<<reg<<" len="<<len<<" value="<<int(data[0]) <<"\n"; std::cout << config.name <<": i2c send to addr="<<addr<<" reg="<<reg<<" len="<<len<<" value="<<int(data[0]) <<"\n";
if (ioctl(file, I2C_SLAVE, addr)<0) return false; if (ioctl(file, I2C_SLAVE, addr)<0) return false;
// return true; // return true;
return (i2c_smbus_write_block_data(file,reg,len,data)>=0); // return (i2c_smbus_write_block_data(file,reg,len,data)>=0);
return (i2c_smbus_write_i2c_block_data(file,reg,len,data)>=0);
} }
bool c_i2c::I2Cget_reg(int addr,int reg,int len,t_buffer* data){ bool c_i2c::I2Cget_reg(int addr,int reg,int len,t_buffer* data){
std::cout << config.name <<": i2c get from addr="<<addr<<" reg="<<reg<<" len="<<len<<" value="<<int(data[0]) <<"\n";
if (ioctl(file, I2C_SLAVE, addr)<0) return false; if (ioctl(file, I2C_SLAVE, addr)<0) return false;
// return true; // return true;
return (i2c_smbus_read_i2c_block_data(file,reg,len,data)==len); int result=i2c_smbus_read_i2c_block_data(file,reg,len,data);
std::cout << config.name <<": i2c get from addr="<<addr<<" reg="<<reg<<" len="<<len<<" value="<<int(data[0]) <<" result" << result<<"\n";
return (result==len);
} }
bool c_i2c::I2Csend(int addr,int len,t_buffer* data){ bool c_i2c::I2Csend(int addr,int len,t_buffer* data){
std::cout << config.name <<": i2c send to addr="<<addr<<" len="<<len<<" value="<<int(data[0])<<"\n"; // std::cout << config.name <<": i2c send to addr="<<addr<<" len="<<len<<" value="<<int(data[0])<<"\n";
if (ioctl(file, I2C_SLAVE, addr)<0) return false;
int result=write(file,data,len);
std::cout << config.name <<": i2c send to addr="<<addr<<" len="<<len<<" value="<<int(data[0])<<" result" << result<<"\n";
return (result>=0);
} }
...@@ -81,11 +81,11 @@ void c_i2c_array::seti2c(int rcui,const t_devreg devreg,int width,int bitoffset, ...@@ -81,11 +81,11 @@ void c_i2c_array::seti2c(int rcui,const t_devreg devreg,int width,int bitoffset,
void c_i2c_array::geti2c(int rcui,const t_devreg devreg,int width,int bitoffset,t_buffer* buffer){ void c_i2c_array::geti2c(int rcui,const t_devreg devreg,int width,int bitoffset,t_buffer* buffer){
int len2=((width+bitoffset-1)>>3)+1; //1..8 bits = 1 byte, 9..16 bits=2bytes etc. int len2=((width+bitoffset-1)>>3)+1; //1..8 bits = 1 byte, 9..16 bits=2bytes etc.
parent->I2Cget_reg(devreg.address,devreg.register_W,len2,buffer); parent->I2Cget_reg(devreg.address,devreg.register_R,len2,buffer);
if (devreg.store>0) { if (devreg.store>0) {
std::cout << "DEBUG: USED stored value="<< int(buffer[0]) <<"\n"; // std::cout << "DEBUG: USED stored value="<< int(buffer[0]) <<"\n";
buffer[0]=storedRegs[devreg.store-1][rcui]; // buffer[0]=storedRegs[devreg.store-1][rcui];
// storedRegs[devreg.store-1][rcui]=buffer[0]; storedRegs[devreg.store-1][rcui]=buffer[0];
buffer[0]=UnMask(buffer[0],width,bitoffset); buffer[0]=UnMask(buffer[0],width,bitoffset);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment