Skip to content
Snippets Groups Projects
Commit 05f7b2ce authored by Kenneth Hiemstra's avatar Kenneth Hiemstra
Browse files

adding more OPCua nodes

parent 4ec61f2e
Branches
Tags
No related merge requests found
......@@ -74,6 +74,22 @@ Fpga::Fpga(list<class Node*>& nodelist)
printf("scrap_span=%d\n",scrap_span);
pointMap->add_register("fpga_scrap_R", 0, scrap_span, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_INTEGER);
pointMap->add_register("fpga_scrap_RW", 0, scrap_span, 0xffffffff, 0, "RW", "COMP", 0, REG_FORMAT_INTEGER);
uint32_t weights_span = 0;
uint32_t weights_span_next = 0;
uint32_t weights_span_prev = 0;
for(uint idx = 0; idx<nodes.size(); idx++) {
auto node = select_node(nodes[idx]);
RegisterMap *regmap = node->get_RegisterMap();
weights_span_next = regmap->getSpan("fpga/weights_RW");
if(weights_span_next > weights_span_prev) weights_span = weights_span_next;
weights_span_prev = weights_span_next;
}
printf("weights_span=%d\n",weights_span);
weights_span *= nodes.size();
printf("weights_span=%d\n",weights_span);
pointMap->add_register("fpga_weights_R", 0, weights_span, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_INTEGER);
pointMap->add_register("fpga_weights_RW", 0, weights_span, 0xffffffff, 0, "RW", "COMP", 0, REG_FORMAT_INTEGER);
}
Fpga::~Fpga()
......@@ -150,6 +166,10 @@ bool Fpga::point(const uint clientId, TermOutput& termout, const char cmd, const
relative_addr = "fpga/scrap_R";
} else if(addr == "fpga_scrap_RW") {
relative_addr = "fpga/scrap_RW";
} else if(addr == "fpga_weights_R") {
relative_addr = "fpga/weights_R";
} else if(addr == "fpga_weights_RW") {
relative_addr = "fpga/weights_RW";
} else {
retval = false;
termout.strerr << "no such register: " << addr;
......@@ -157,7 +177,6 @@ bool Fpga::point(const uint clientId, TermOutput& termout, const char cmd, const
int format = (int)pointMap->getFormat(addr);
std::vector<int> nodes = get_all_nodes();
std::vector<bool> enabled = get_all_enabled_nodes();
ostringstream strs, strs_pre;
TermOutput termresults;
......@@ -244,9 +263,6 @@ cout << "fpga: W node_nr=" << node_nr << " nof_values=" << nof_values
if(cmd == 'R') {
termout.strout << "(" << node_nr << (ret ? ",0,[" : ",1,[") << termresults.strout.str() << "])";
cout << "Fpga::enabled[" << idx << "]=" << (int)enabled[idx] << endl;
termout.enabled[idx] = enabled[idx];
switch(termresults.datatype) {
case REG_FORMAT_BOOLEAN:
case REG_FORMAT_INTEGER:
......
......@@ -32,7 +32,7 @@ extern int debug;
using namespace std;
UniboardMap::UniboardMap(list<class Node*>& nodelist) : Board(nodelist), Sdp(nodelist), Tr(nodelist), Fpga(nodelist)
UniboardMap::UniboardMap(list<class Node*>& nodelist) : Board(nodelist), Sdp(nodelist), Fpga(nodelist)
{
initialized=false;
}
......@@ -55,9 +55,6 @@ bool UniboardMap::read(const uint clientId, TermOutput& termout, const string ad
if(is_unb_node(addr)) { // addressed with /unb[0:1]/pn[0:3]/...
//cout << "UniboardMap::read unb node" << endl;
retval = execute(clientId, termout, 'R', addr, offs, NULL, nvalues);
} else if(is_tr(addr)) { // addressed with /sdptr/...
//cout << "UniboardMap::read tr" << endl;
retval = translator(clientId, termout, 'R', addr, offs, NULL, nvalues);
} else if(is_sdp(addr)) { // addressed with /band[0:1]/...
//cout << "UniboardMap::read sdp application" << endl;
retval = application(clientId, termout, 'R', addr, offs, NULL, nvalues);
......@@ -75,9 +72,6 @@ bool UniboardMap::write(const uint clientId, TermOutput& termout, const string a
if(is_unb_node(addr)) { // addressed with /unb[0:1]/pn[0:3]/...
//cout << "UniboardMap::write unb node" << endl;
retval = execute(clientId, termout, 'W', addr, offs, data, nvalues);
} else if(is_tr(addr)) { // addressed with /sdptr/...
//cout << "UniboardMap::write tr" << endl;
retval = translator(clientId, termout, 'W', addr, offs, data, nvalues);
} else if(is_sdp(addr)) { // addressed with /band[0:1]/...
//cout << "UniboardMap::write sdp application" << endl;
retval = application(clientId, termout, 'W', addr, offs, data, nvalues);
......
......@@ -27,11 +27,10 @@
#include "board.h"
#include "sdp.h"
#include "tr.h"
#include "fpga.h"
class UniboardMap : public Board, public Sdp, public Tr, public Fpga
class UniboardMap : public Board, public Sdp, public Fpga
{
private:
bool initialized;
......
......@@ -54,7 +54,8 @@ typedef struct {
uint offs;
uint nvalues;
int format;
uint data[65535];
//uint data[200000];
uint data[65536];
} pread_cmd_struct;
typedef struct {
......@@ -77,6 +78,7 @@ void Node::worker(const int clientId)
pread_reply_struct r;
char buf[300000];
printf("Node::worker thread for client[%d] Uniboard=%d New node IP=%s type=%s localnr=%d globalnr=%d\n",
clientId,UniboardNr, myIPaddr.c_str(), Type.c_str(), LocalNr, GlobalNr);
printf("sizeof(pread_cmd_struct)=%d sizeof(pread_reply_struct)=%d\n",sizeof(pread_reply_struct),sizeof(pread_cmd_struct));
......@@ -328,7 +330,7 @@ bool Node::exec_cmd(const uint clientId, std::ostringstream& strs, const char cm
bool Node::exec_reply(const uint clientId, TermOutput& termout)
{
char buf[400000];
char buf[1000000];
ssize_t ret;
ret = read(reply_pipe[clientId][0], buf, sizeof(buf));
if(ret < 0) {
......
This diff is collapsed.
......@@ -78,6 +78,9 @@ Periph_fpga::Periph_fpga(UCP *ucp,
uint32_t scrap_span = registerMap->getSpan("mm/0/unb2b/scrap_ram/data");
registerMap->add_register("fpga/scrap_R", 0, scrap_span, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_INTEGER);
registerMap->add_register("fpga/scrap_RW",0, scrap_span, 0xffffffff, 0, "RW", "COMP", 0, REG_FORMAT_INTEGER);
uint32_t weights_span = 11712; // 187392/16
registerMap->add_register("fpga/weights_R", 0, weights_span, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_INTEGER);
registerMap->add_register("fpga/weights_RW",0, weights_span, 0xffffffff, 0, "RW", "COMP", 0, REG_FORMAT_INTEGER);
// Test FPGA by reading system info:
try {
......@@ -111,9 +114,11 @@ Periph_fpga::Periph_fpga(UCP *ucp,
#define FLASH_EPCS_REG_BUSY 5
#define FLASH_EPCS_REG_UNPROTECT 6
uint scrapram_size = registerMap->getSpan("mm/0/unb2b/scrap_ram/data");
cout << "Periph_fpga::scrapram_size=" << scrapram_size << endl;
Scrap_RW_copy.resize(scrapram_size);
cout << "Periph_fpga::scrapram_size=" << scrap_span << endl;
Scrap_RW_copy.resize(scrap_span);
cout << "Periph_fpga::weights_size=" << weights_span << endl;
Weights_RW_copy.resize(weights_span);
}
Periph_fpga::~Periph_fpga()
......@@ -137,7 +142,6 @@ bool Periph_fpga::Read(UCP *ucp, const std::string addr_str, const uint32_t offs
bool isfifo = registerMap->type_isfifo((addr_str));
ret = ucp->readRegister(addr,nvalues,data_ptr,isfifo);
//usleep(300000);
if(ret && (shift != 0 || mask != 0xffffffff)) {
for(uint32_t i=0; i < nvalues; i++) {
data_ptr[i] &= mask;
......@@ -166,7 +170,6 @@ bool Periph_fpga::Write(UCP *ucp, const std::string addr_str, const uint32_t off
data_ptr[i] &= mask;
}
}
//usleep(300000);
return ucp->writeRegister(addr,nvalues,data_ptr,isfifo);
}
......@@ -188,7 +191,6 @@ bool Periph_fpga::read_fpga_status(TermOutput& termout, int format)
bool Periph_fpga::write_fpga_enable_mask(const uint *data)
{
Enabled = (bool)*data;
cout << "Periph_fpga::write_fpga_enable_mask: data=" << Enabled << endl;
return true;
}
......@@ -297,6 +299,10 @@ bool Periph_fpga::read(UCP *ucp, TermOutput& termout, const std::string addr,
retval = read_fpga_scrap_RW(termout, format);
} else if(addr == "fpga/scrap_R") {
retval = read_fpga_scrap_R(ucp, termout, format);
} else if(addr == "fpga/weights_RW") {
retval = read_fpga_weights_RW(termout, format);
} else if(addr == "fpga/weights_R") {
retval = read_fpga_weights_R(ucp, termout, format);
} else {
throw runtime_error("address "+addr+" not found!");
}
......@@ -340,6 +346,8 @@ bool Periph_fpga::write(UCP *ucp, const std::string addr, const std::string type
retval = write_fpga_enable_mask(data);
} else if(addr == "fpga/scrap_RW") {
retval = write_fpga_scrap_RW(ucp, data, len);
} else if(addr == "fpga/weights_RW") {
retval = write_fpga_weights_RW(ucp, data, len);
} else {
throw runtime_error("address "+addr+" not found!");
}
......@@ -562,6 +570,53 @@ bool Periph_fpga::read_fpga_scrap_RW(TermOutput& termout, int format)
return retval;
}
bool Periph_fpga::read_fpga_weights_R(UCP *ucp, TermOutput& termout, int format)
{
bool retval = true;
uint32_t nvalues = registerMap->getSpan("fpga/weights_R");
retval = Read(ucp, "mm/0/unb2b/scrap_ram/data", 0, 61, (uint32_t *)termout.valint);
termout.nof_vals = nvalues;
termout.datatype = format;
for(uint i=0; i<nvalues; i++) {
if(i>0) termout.strout << ",";
termout.strout << termout.valint[i];
}
return retval;
}
bool Periph_fpga::write_fpga_weights_RW(UCP *ucp, const uint *data, uint nvalues)
{
bool retval = false;
cout << "Periph_fpga::write_fpga_weights " << nvalues << " values" << endl;
for(uint i=0;i<nvalues;i++) {
Weights_RW_copy[i] = (unsigned int)data[i];
}
uint32_t dtmp[61];
for(uint i=0;i<nvalues;i+=192) {
for(uint j=0;j<61;j++) {
dtmp[j] = (unsigned int)data[i];
}
retval = Write(ucp, "mm/0/unb2b/scrap_ram/data", 0, 61, (uint32_t *)dtmp);
}
return retval;
}
bool Periph_fpga::read_fpga_weights_RW(TermOutput& termout, int format)
{
bool retval = true;
for(uint i=0; i < Weights_RW_copy.size(); i++) {
termout.valint[i] = Weights_RW_copy[i];
if(i>0) termout.strout << ",";
termout.strout << termout.valint[i];
}
termout.nof_vals = Weights_RW_copy.size();
termout.datatype = format;
return retval;
}
bool Periph_fpga::write_wdi_override(UCP *ucp, TermOutput& termout)
{
......
......@@ -40,6 +40,7 @@ private:
bool Enabled;
std::vector<unsigned int> Scrap_RW_copy;
std::vector<unsigned int> Weights_RW_copy;
std::ofstream rbf_wf;
uint32_t Flash_page_start, Flash_page_size_bytes, Flash_user_sector_start,
......@@ -82,6 +83,10 @@ public:
bool read_fpga_scrap_RW(TermOutput& termout, int format);
bool write_fpga_scrap_RW(UCP *ucp, const uint *data, uint len);
bool read_fpga_weights_R(UCP *ucp, TermOutput& termout, int format);
bool read_fpga_weights_RW(TermOutput& termout, int format);
bool write_fpga_weights_RW(UCP *ucp, const uint *data, uint len);
bool write_wdi_override(UCP *ucp, TermOutput& termout);
RegisterMap read_reg_map(UCP *ucp);
RegisterMap * getRegisterMap(void) { return registerMap; };
......
......@@ -315,6 +315,7 @@ int main (int argc, char* argv[])
}
SD.tcpport = control_tcpport;
SD.tr = new TranslatorMap();
server_init(false);
TCPSSocket sock(control_tcpport, "", c_MAX_CONTROL_TCPSOCKETS);
......
......@@ -28,6 +28,7 @@ using namespace std;
#include <mutex>
#include "map.h"
#include "tr.h"
#include "io/tcpsocket.h"
#define c_MAX_CONTROL_SERVERS 5
......@@ -43,6 +44,7 @@ class Serverdat {
public:
int tcpport;
UniboardMap *unb;
TranslatorMap *tr;
struct timespec t0;
TCPCSSocket *controlSocket[c_MAX_CONTROL_TCPSOCKETS];
std::string configfile;
......
......@@ -46,9 +46,8 @@ public:
#define SIZE16 16
#define SIZE50 50
#define SIZE200 200
#define SIZE200 200 //12000
bool enabled[SIZE50];
float valfloat[SIZE50];
int valint[SIZE200*SIZE16];
char valstr[SIZE16][SIZE50]; // FIXME magic 16 strings of 50 chars each
......@@ -66,7 +65,6 @@ public:
datatype = 0;
for(unsigned int i=0;i<SIZE50;i++) { // FIXME magic 50...
valfloat[i]=0.;
enabled[i]=0;
}
for(unsigned int i=0;i<SIZE200*SIZE16;i++) { // FIXME magic ...
valint[i]=0;
......
......@@ -49,7 +49,7 @@
extern int debug;
using namespace std;
Tr::Tr(list<class Node*>& nodelist)
TranslatorMap::TranslatorMap()
{
translatorMap = new RegisterMap();
......@@ -61,21 +61,21 @@ Tr::Tr(list<class Node*>& nodelist)
}
Tr::~Tr()
TranslatorMap::~TranslatorMap()
{
if(translatorMap != NULL) delete translatorMap;
}
bool Tr::translator(const uint clientId, TermOutput& termout, const char cmd, const string addr, const uint offs,
bool TranslatorMap::translator(const uint clientId, TermOutput& termout, const char cmd, const string addr, const uint offs,
const unsigned int *data, const int len)
{
bool retval = false;
if(cmd == 'R') {
if(addr == "/sdptr/sdp_info") {
termout.strout << "Tr::sdp_info read: " << endl;
termout.strout << "TranslatorMap::sdp_info read: " << endl;
termout.strout << "hello world";
} else if(addr == "/sdptr/translator_timing") {
termout.strout << "Tr::translator_timing read: " << endl;
termout.strout << "TranslatorMap::translator_timing read: " << endl;
std::array<char, 128> buffer;
std::string result;
std::unique_ptr<FILE, decltype(&pclose)> pipe(popen("/usr/sbin/ntpq -c peers", "r"), pclose);
......@@ -90,7 +90,7 @@ bool Tr::translator(const uint clientId, TermOutput& termout, const char cmd, co
termout.strout << result;
}
} else if(addr == "/sdptr/translator_network") {
termout.strout << "Tr::translator_network read: " << endl;
termout.strout << "TranslatorMap::translator_network read: " << endl;
std::array<char, 128> buffer;
std::string result;
std::unique_ptr<FILE, decltype(&pclose)> pipe(popen("/sbin/ifconfig", "r"), pclose);
......@@ -105,7 +105,7 @@ bool Tr::translator(const uint clientId, TermOutput& termout, const char cmd, co
termout.strout << result;
}
} else if(addr == "/sdptr/tod") {
termout.strout << "Tr::tod read: " << endl;
termout.strout << "TranslatorMap::tod read: " << endl;
std::array<char, 128> buffer;
std::string result;
std::unique_ptr<FILE, decltype(&pclose)> pipe(popen("date", "r"), pclose);
......@@ -124,35 +124,24 @@ bool Tr::translator(const uint clientId, TermOutput& termout, const char cmd, co
termout.strerr << "no such register: " << addr;
}
} else if(cmd == 'W') {
termout.strout << "Tr::translator write ok";
termout.strout << "TranslatorMap::translator write ok";
retval = true;
}
return retval;
}
// "/sdptr/application"
// 0 1 2
#define c_PATH_sdptr 0
#define c_PATH_tr 1
bool Tr::is_tr(const std::string path_str)
bool TranslatorMap::read(const uint clientId, TermOutput& termout, const string addr,
const uint offs, const int nvalues)
{
std::stringstream strs(path_str);
std::string token;
std::vector<std::string> tokens;
while (std::getline(strs, token, '/')) {
tokens.push_back(token);
}
if(tokens.size() > c_PATH_sdptr) {
if(tokens[c_PATH_sdptr] == "") {
// ok, is absolute path starting with '/'
return tokens[c_PATH_tr].compare(0,5,"sdptr") == 0;
return translator(clientId, termout, 'R', addr, offs, NULL, nvalues);
}
bool TranslatorMap::write(const uint clientId, TermOutput& termout, const string addr,
const uint offs, const unsigned int *data, const int nvalues)
{
return translator(clientId, termout, 'W', addr, offs, data, nvalues);
}
return false;
}
......@@ -24,32 +24,33 @@
#include <boost/numeric/ublas/matrix.hpp>
#include <dirent.h>
#include <sys/time.h>
#include <iostream>
#include <fstream>
#include "node.h"
#include "tools/util.h"
#include "registers.h"
namespace ublas = boost::numeric::ublas;
class Tr
class TranslatorMap
{
private:
list<class Node*> NODES;
RegisterMap *translatorMap;
public:
Tr(std::list<class Node*>& nodelist);
~Tr();
TranslatorMap();
~TranslatorMap();
RegisterMap * getTranslatorMap(void) { return translatorMap; };
void print_trmap(ostringstream& strs, std::string prefix) { translatorMap->print(strs, prefix); };
void print_trmap(std::ostringstream& strs, std::string prefix) { translatorMap->print(strs, prefix); };
bool translator(const uint clientId, TermOutput& termout, const char cmd, const string addr, const uint offs,
bool translator(const uint clientId, TermOutput& termout, const char cmd, const std::string addr, const uint offs,
const unsigned int *data, const int len);
bool is_tr(const std::string addr);
bool write(const uint clientId, TermOutput& termout, const std::string addr,
const uint offs, const unsigned int *data, const int nvalues);
bool read(const uint clientId, TermOutput& termout, const std::string addr,
const uint offs, const int nvalues);
};
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment