Select Git revision
aggregate_and_plot.py
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
main.cpp 4.58 KiB
#include <iostream>
#include "apsctl/conf.h"
//#include "structs.h"
#include "drivers/drvbase.h"
#include <capnp/message.h>
#include <capnp/serialize-packed.h>
#include "interface/pypcc.capnp.h"
#include <fcntl.h>
c_drivers drivers1;
t_buffer buffer[3072];
bool mask[96];
int fd_out;
void SetResult(int id,int lenbuffer,int lenmask){
std::cout << "Set Result lenbuf="<<lenbuffer<<" lenmask="<<lenmask<<"\n";
::capnp::MallocMessageBuilder message;
OPCUAset::Builder result = message.initRoot<OPCUAset>();
result.setId(id);
result.setType(InstType::VAR_SET);
::capnp::List<uint8_t>::Builder buf2= result.initData(lenbuffer);
for (int x=0;x<lenbuffer;x++) buf2.set(x,buffer[x]);
::capnp::List<bool>::Builder mask2= result.initMask(lenmask);
for (int x=0;x<lenmask;x++) mask2.set(x,mask[x]);
std::cout << "Send result id=" << id << "\n";
writePackedMessageToFd(fd_out,message);
};
void getvar(int varid,int lenmask){
if ((varid<0) || (varid>number_vars)){
std::cout << "get var: Invalid variable id!\n";
return;
};
int drvnum=variables[varid].driver;
std::cout << "getvar: id=" << varid << " name=" << variables[varid].name << " driver=" << drvnum << "\n";
int lenbuffer=drivers1.d[drvnum]->getvar(varid,buffer,lenmask,mask);
SetResult(varid,lenbuffer,lenmask);
}
void setvar(int varid,int lenbuffer,int lenmask){
if ((varid<0) || (varid>number_vars)){
std::cout << "Set var: Invalid variable id!\n";
return;
};
int drvnum=variables[varid].driver;
std::cout << "set variable call: Inst id=" << varid <<"=" << variables[varid].name << " len="<<lenbuffer<<"\n";
//std::cout << "Mask=" << lenmask << "," << mask[0] << "," << mask[1] <<"\n";
// std::cout << "Driver " << drvnum << " lenbuffer=" << lenbuffer << " len mask" << lenmask <<"\n";
drivers1.d[drvnum]->setvar(varid,lenbuffer,buffer,lenmask,mask);
}
void setdev(t_devreg devreg,int lenbuffer,int lenmask){
std::cout << "setdev " << devreg.driver << ":"<<devreg.address <<":"<<devreg.register_W<<"\n";
drivers1.d[devreg.driver]->setdevreg(devreg,lenbuffer,buffer,lenmask,mask);
}
void methodcall(int varid,int lenmask)
{
if ((varid<0) || (varid>number_methods)){
std::cout << "Set var: Invalid method id!\n";
return;
};
t_method method=method_config[varid];
for (int x=0;x<method.len;x++)
{ t_instruction I=method.instructions[x];
switch (I.type){
case inst_setvar:
for (int x=0;x<I.len;x++) buffer[x]=I.data[x];
setvar(I.variable,I.len,lenmask);
getvar(I.variable,lenmask);
break;
case inst_getvar:
getvar(I.variable,lenmask);
break;
case inst_getvarall:
getvar(I.variable,0);
break;
case inst_wait:
std::cout << "Sleep not implemented yet!!\n";
break;
case inst_devreg:
for (int x=0;x<I.len;x++) buffer[x]=I.data[x];
setdev(I.devreg,I.len,lenmask);
break;
case inst_method:
methodcall(I.variable,lenmask);
break;
}
}
}
int main(int argc, char *argv[])
{
// driver
// std::cout << drivers1.d[0]->config.name << "\n";
// std::cout << drivers1.d[1]->config.name << "\n";
// std::cout << drivers1.d[1]->parent->config.name << "\n";
// c_i2c i2c1(I2C1);
// u_char buffer[32];
// for (int x=0;x<32;x++) buffer[x]=0;
// for (int x=0;x<3;x++) buffer[x]=1;
// buffer[2]=1;
// drivers1.d[1]->setvar(1,32,buffer);
// for (int x=0;x<3;x++) buffer[x]=x;
// drivers1.d[1]->setvar(4,32,buffer);
// for (int x=0;x<number_vars;x++)
// std::cout << variables[x].name << "\n";
for (int x=0;x<number_drivers;x++) drivers1.d[x]->drivers=drivers1.d;
std::cout << "Open read pipe\n";
int fd_in=open("serv_to_RCU",O_RDONLY);
if (fd_in<0) return false;
fd_out=open("RCU_to_serv",O_WRONLY);
if (fd_out<0) return false;
while (1) {
::capnp::PackedFdMessageReader message(fd_in);
// ::capnp::StreamFdMessageReader message(fd_in);
OPCUAset::Reader Inst=message.getRoot<OPCUAset>();
// int encoded_array=capnp::messageToFlatArray(Inst);
int lenbuffer=0;
for (uint8_t value: Inst.getData()) buffer[lenbuffer++]=value;
int lenmask=0;
for (bool value: Inst.getMask()) mask[lenmask++]=value;
int varid=Inst.getId();
if (Inst.getType()==InstType::METHOD){
std::cout << "Method call: Inst id=" << int(Inst.getId()) <<"\n";
methodcall(varid,lenmask);
continue;
}
if (Inst.getType()==InstType::VAR_SET) setvar(varid,lenbuffer,lenmask);
getvar(varid,lenmask);
};
// fclose(fd);
};