Skip to content
Snippets Groups Projects
Select Git revision
  • a13422fe2b044b26b667f4e045ce8cfedd6ec647
  • master default protected
  • dither_on_off_disabled
  • yocto
  • pypcc2
  • pypcc3
  • 2020-12-07-the_only_working_copy
  • v2.1
  • v2.0
  • v1.0
  • v0.9
  • Working-RCU_ADC,ID
  • 2020-12-11-Holiday_Season_release
13 results

main.cpp

Blame
  • 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);
    };