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

changed to 16 fpgas, removed unbN/pnM from opcua

parent 309e8a05
No related branches found
No related tags found
No related merge requests found
......@@ -48,10 +48,21 @@ using namespace std;
Fpga::Fpga(list<class Node*>& nodelist)
{
FPGA = nodelist;
pointMap = new RegisterMap();
// Add points:
pointMap->add_register("fpga_mask_R", 0, 16, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_BOOLEAN);
pointMap->add_register("fpga_mask_RW", 0, 16, 0xffffffff, 0, "RW", "COMP", 0, REG_FORMAT_BOOLEAN);
pointMap->add_register("fpga_status_R", 0, 16, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_BOOLEAN);
pointMap->add_register("fpga_temp_R", 0, 16, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_FLOAT);
pointMap->add_register("fpga_version_R", 0, 16, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_STRING);
pointMap->add_register("fpga_scrap_R", 0, 16, 0xffffffff, 0, "RO", "COMP", 0, REG_FORMAT_INTEGER);
pointMap->add_register("fpga_scrap_RW", 0, 16, 0xffffffff, 0, "RW", "COMP", 0, REG_FORMAT_INTEGER);
}
Fpga::~Fpga()
{
if(pointMap != NULL) delete pointMap;
}
Node * Fpga::select_node(const int nr)
......@@ -85,6 +96,11 @@ uint Fpga::node_number(Node *node)
return (node->GetUniboardNr() * 4) + node->GetLocalNr();
}
RegisterMap * Fpga::get_pointMap(void)
{
return pointMap;
}
bool Fpga::point(const uint clientId, TermOutput& termout, const char cmd, const string addr, const uint offs,
std::vector<unsigned int>& data, const int len)
{
......
......@@ -36,6 +36,7 @@ class Fpga
{
private:
list<class Node*> FPGA;
RegisterMap *pointMap;
public:
Fpga(std::list<class Node*>& nodelist);
......@@ -46,6 +47,7 @@ public:
Node * select_node(const int nr);
std::vector<int> get_all_nodes(void);
std::vector<bool> get_all_enabled_nodes(void);
RegisterMap * get_pointMap(void);
uint node_number(Node *node);
bool is_fpga(const std::string addr);
};
......
......@@ -115,8 +115,6 @@ static void beforeReadArrayWeights(UA_Server *server,
const UA_NumericRange *range, const UA_DataValue *data)
{
string node_str = "weights";
// UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "beforeReadArrayWeights: %s", (char *)node_str.c_str());
//update_UNB_Variable(server, string(node_str));
}
static void afterWriteArrayWeights(UA_Server *server,
......@@ -207,24 +205,25 @@ static void addValueCallbackTo_BAND_Variable(UA_Server *server, std::string regn
UA_Server_setVariableNode_valueCallback(server, currentNodeId, callback);
}
static void add_BAND_Variable(UA_Server *server, std::string regname)
static void add_BAND_Variable_string(UA_Server *server, std::string regname, unsigned int size)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "add_BAND_Variable: %s", (char *)regname.c_str());
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "add_BAND_Variable_string: %s", (char *)regname.c_str());
UA_VariableAttributes vattr = UA_VariableAttributes_default;
const size_t array_size = 32; // FIXME 32...
//UA_Int32 *values = (UA_Int32 *) UA_Array_new(array_size, &UA_TYPES[UA_TYPES_INT32]);
UA_Float *values = (UA_Float *) UA_Array_new(array_size, &UA_TYPES[UA_TYPES_FLOAT]);
for(int i=0;i<array_size;i++) {
values[i] = UA_Float(0.0);
}
static void add_BAND_Variable_integer(UA_Server *server, std::string regname, unsigned int size)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "add_BAND_Variable_integer: %s", (char *)regname.c_str());
UA_VariableAttributes vattr = UA_VariableAttributes_default;
UA_Int32 *values = (UA_Int32 *) UA_Array_new(size, &UA_TYPES[UA_TYPES_INT32]);
for(unsigned int i=0;i<size;i++) {
values[i] = UA_Int32(0);
}
UA_Variant_setArray(&vattr.value, values, array_size, &UA_TYPES[UA_TYPES_FLOAT]);
UA_Variant_setArray(&vattr.value, values, size, &UA_TYPES[UA_TYPES_INT32]);
vattr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
vattr.valueRank = UA_VALUERANK_ONE_DIMENSION;
vattr.dataType = UA_TYPES[UA_TYPES_FLOAT].typeId;
UA_UInt32 myArrayDimensions[1] = {array_size};
vattr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
UA_UInt32 myArrayDimensions[1] = {size};
vattr.arrayDimensions = myArrayDimensions;
vattr.arrayDimensionsSize = 1;
......@@ -240,133 +239,89 @@ static void add_BAND_Variable(UA_Server *server, std::string regname)
// handle error
printf("Error adding node");
}
// clean up
//UA_Array_delete(values, array_size, &UA_TYPES[UA_TYPES_STRING]);
}
// for test:
static void updateVariable(UA_Server *server)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,"updateVariable()");
UA_Int32 my_integer = 30; // FIXME: this is example code, remove later
UA_Variant value;
UA_Variant_setScalar(&value, &my_integer, &UA_TYPES[UA_TYPES_INT32]);
UA_NodeId currentNodeId = UA_NODEID_STRING(1, (char *)"sensors");
UA_Server_writeValue(server, currentNodeId, value);
}
// for test:
static void addVariable(UA_Server *server)
static void add_BAND_Variable_float(UA_Server *server, std::string regname, unsigned int size)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,"addVariable()");
/* Define the attribute of the myInteger variable node */
UA_VariableAttributes attr = UA_VariableAttributes_default;
UA_Int32 myInteger = 42; // FIXME: this is example code, remove later
UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
attr.description = UA_LOCALIZEDTEXT((char *)"en-US",(char *)"sensors");
attr.displayName = UA_LOCALIZEDTEXT((char *)"en-US",(char *)"sensors");
attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
/* Add the variable node to the information model */
UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, (char *)"sensors");
UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, (char *)"sensors");
UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
parentReferenceNodeId, myIntegerName,
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr, NULL, NULL);
updateVariable(server);
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "add_BAND_Variable_float: %s", (char *)regname.c_str());
UA_VariableAttributes vattr = UA_VariableAttributes_default;
UA_Float *values = (UA_Float *) UA_Array_new(size, &UA_TYPES[UA_TYPES_FLOAT]);
for(unsigned int i=0;i<size;i++) {
values[i] = UA_Float(0.0);
}
UA_Variant_setArray(&vattr.value, values, size, &UA_TYPES[UA_TYPES_FLOAT]);
vattr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
vattr.valueRank = UA_VALUERANK_ONE_DIMENSION;
vattr.dataType = UA_TYPES[UA_TYPES_FLOAT].typeId;
UA_UInt32 myArrayDimensions[1] = {size};
static void update_UNB_Variable(UA_Server *server, std::string regname)
{
// UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "update_UNB_Variable: %s", (char *)regname.c_str());
CMD Cmd;
string cmdname = "";
CMDstatus cmdstatus = {CMD_STATUS_OK, 0,0};
CMDstatus cmdstatusnew = cmdstatus;
TermOutput termout;
uint UNB_client_ID = c_CLIENT_ID_UASERVER;
while(!SD.control_mutex[UNB_client_ID].try_lock()) { cerr << "uaserver: mutex not ready\n"; usleep(100000); }
try {
string input_cmd_str = "read " + regname;
cmdstatusnew = Cmd.command(UNB_client_ID, input_cmd_str, termout, cmdname, &SD);
if(cmdstatusnew.status != CMD_EMPTY) cmdstatus = cmdstatusnew;
} catch(runtime_error& e) {
cerr << "update_UNB_Variable: " << e.what() << endl;
termout.strout << e.what();
vattr.arrayDimensions = myArrayDimensions;
vattr.arrayDimensionsSize = 1;
vattr.displayName = UA_LOCALIZEDTEXT((char *)"locale", (char *)regname.c_str());
UA_StatusCode retval = UA_Server_addVariableNode(server,
UA_NODEID_STRING(1, (char *)regname.c_str()), // new node id
UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), // parent node
UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), // reference type
UA_QUALIFIEDNAME(1, (char *)regname.c_str()), // node browse name
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
vattr, NULL, NULL);
if (retval != UA_STATUSCODE_GOOD) {
// handle error
printf("Error adding node");
}
SD.control_mutex[UNB_client_ID].unlock();
UA_String str = UA_STRING_ALLOC((char *)p_termout(termout).c_str());
UA_Variant value;
UA_Variant_setScalar(&value, &str, &UA_TYPES[UA_TYPES_STRING]);
UA_NodeId currentNodeId = UA_NODEID_STRING(1, (char *)regname.c_str());
UA_Server_writeValue(server, currentNodeId, value);
// clean up
//UA_Array_delete(values, array_size, &UA_TYPES[UA_TYPES_STRING]);
}
static void add_UNB_Variable(UA_Server *server, std::string regname)
static void add_BAND_Variable_boolean(UA_Server *server, std::string regname, unsigned int size)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "add_UNB_Variable: %s", (char *)regname.c_str());
UA_String str = UA_STRING_ALLOC((char *)"Hello UNB"); // FIXME: clear afterwards?
UA_VariableAttributes attr = UA_VariableAttributes_default;
attr.displayName = UA_LOCALIZEDTEXT((char *)"en-US", (char *)regname.c_str());
attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
attr.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
UA_Variant_setScalar(&attr.value, &str, &UA_TYPES[UA_TYPES_STRING]);
UA_NodeId currentNodeId = UA_NODEID_STRING(1, (char *)regname.c_str());
UA_QualifiedName currentName = UA_QUALIFIEDNAME(1, (char *)regname.c_str());
UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
UA_NodeId variableTypeNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE);
UA_Server_addVariableNode(server, currentNodeId, parentNodeId,
parentReferenceNodeId, currentName,
variableTypeNodeId, attr, NULL, NULL);
//update_UNB_Variable(server, regname); // this causes "mutex not ready" fix?
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "add_BAND_Variable_boolean: %s", (char *)regname.c_str());
UA_VariableAttributes vattr = UA_VariableAttributes_default;
UA_Boolean *values = (UA_Boolean *) UA_Array_new(size, &UA_TYPES[UA_TYPES_BOOLEAN]);
for(unsigned int i=0;i<size;i++) {
values[i] = UA_Boolean(false);
}
static void beforeReadUNB(UA_Server *server,
const UA_NodeId *sessionId, void *sessionContext,
const UA_NodeId *nodeid, void *nodeContext,
const UA_NumericRange *range, const UA_DataValue *data)
{
// (why is it so hard to get the nodeid?)
char *node_str = new char[nodeid->identifier.string.length + 1];
memcpy((void *)node_str, (void *)nodeid->identifier.string.data, nodeid->identifier.string.length);
node_str[nodeid->identifier.string.length] = 0; // add end of string char
UA_Variant_setArray(&vattr.value, values, size, &UA_TYPES[UA_TYPES_BOOLEAN]);
vattr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
vattr.valueRank = UA_VALUERANK_ONE_DIMENSION;
vattr.dataType = UA_TYPES[UA_TYPES_BOOLEAN].typeId;
UA_UInt32 myArrayDimensions[1] = {size};
//UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "beforeReadUNB: %s", node_str);
update_UNB_Variable(server, string(node_str));
delete []node_str;
vattr.arrayDimensions = myArrayDimensions;
vattr.arrayDimensionsSize = 1;
vattr.displayName = UA_LOCALIZEDTEXT((char *)"locale", (char *)regname.c_str());
UA_StatusCode retval = UA_Server_addVariableNode(server,
UA_NODEID_STRING(1, (char *)regname.c_str()), // new node id
UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), // parent node
UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), // reference type
UA_QUALIFIEDNAME(1, (char *)regname.c_str()), // node browse name
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
vattr, NULL, NULL);
if (retval != UA_STATUSCODE_GOOD) {
// handle error
printf("Error adding node");
}
static void afterWriteUNB(UA_Server *server,
const UA_NodeId *sessionId, void *sessionContext,
const UA_NodeId *nodeId, void *nodeContext,
const UA_NumericRange *range, const UA_DataValue *data) {
//UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "afterWriteUNB: The variable was updated"); // TODO
}
static void addValueCallbackTo_UNB_Variable(UA_Server *server, std::string regname)
static void add_BAND_Variable(UA_Server *server, std::string regname, int format, unsigned int size)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "addValueCallbackTo_UNB_Variable: %s", (char *)regname.c_str());
UA_NodeId currentNodeId = UA_NODEID_STRING(1, (char *)regname.c_str());
UA_ValueCallback callback;
callback.onRead = beforeReadUNB;
callback.onWrite = afterWriteUNB;
UA_Server_setVariableNode_valueCallback(server, currentNodeId, callback);
switch(format) {
case REG_FORMAT_STRING:
add_BAND_Variable_string(server, regname, size);
break;
case REG_FORMAT_INTEGER:
add_BAND_Variable_integer(server, regname, size);
break;
case REG_FORMAT_FLOAT:
add_BAND_Variable_float(server, regname, size);
break;
case REG_FORMAT_BOOLEAN:
add_BAND_Variable_boolean(server, regname, size);
break;
default:
return; // nothing
}
}
......@@ -383,22 +338,8 @@ int ua_server_init(bool warm_start)
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "UA Server add nodes");
addArrayWeights(mUaServer);
addValueCallbackTo_ArrayWeights(mUaServer);
addVariable(mUaServer);
uint nodeid = 1;
for(auto node : nodes) {
RegisterMap *regmap = SD.unb->get_RegisterMap(node);
std::string prefix = SD.unb->string_node_id(node);
std::vector<std::string> regnames = regmap->getRegnames(prefix);
for(auto m : regnames) {
//add_UNB_Method(mUaServer, m, nodeid);
add_UNB_Variable(mUaServer, m);
addValueCallbackTo_UNB_Variable(mUaServer, m);
nodeid++;
}
}
std::vector<int> bands = SD.unb->get_bands();
for(auto band : bands) {
......@@ -407,23 +348,24 @@ int ua_server_init(bool warm_start)
std::string prefix = SD.unb->string_band_id(band);
std::vector<std::string> regnames = applicationmap->getRegnames(prefix);
for(auto m : regnames) {
add_BAND_Variable(mUaServer, m);
int format = applicationmap->getFormat(m);
unsigned int size = applicationmap->getSpan(m);
add_BAND_Variable(mUaServer, m, format, size);
addValueCallbackTo_BAND_Variable(mUaServer, m);
nodeid++;
}
}
std::string regname = "fpga_temp_R";
add_BAND_Variable(mUaServer, regname);
addValueCallbackTo_BAND_Variable(mUaServer, regname);
regname = "fpga_mask_R";
add_BAND_Variable(mUaServer, regname);
addValueCallbackTo_BAND_Variable(mUaServer, regname);
regname = "fpga_status_R";
add_BAND_Variable(mUaServer, regname);
addValueCallbackTo_BAND_Variable(mUaServer, regname);
RegisterMap *pointmap = SD.unb->get_pointMap();
std::vector<std::string> regnames = pointmap->getRegnames("");
for(auto m : regnames) {
int format = pointmap->getFormat(m);
unsigned int size = pointmap->getSpan(m);
add_BAND_Variable(mUaServer, m, format, size);
addValueCallbackTo_BAND_Variable(mUaServer, m);
nodeid++;
}
return 0;
}
......
......@@ -27,8 +27,9 @@
#define REG_ADDR_ROM_SYSTEM_SPAN (8192)
#define REG_FORMAT_STRING 0
#define REG_FORMAT_INT 1
#define REG_FORMAT_INTEGER 1
#define REG_FORMAT_FLOAT 2
#define REG_FORMAT_BOOLEAN 3
class RegisterMap {
......@@ -41,7 +42,7 @@ class RegisterMap {
std::string access;
std::string type;
uint32_t instance;
uint32_t format;
int format;
} register_info;
std::map <std::string, register_info> reg;
......
# Configuration file for sdpunb
# Configuration file for band0 (low band)
# the following nodes are contributing
# NODE config:
......@@ -28,26 +28,26 @@ node 13 10.99.2.14 unb2b_minimal 2 0
node 14 10.99.2.15 unb2b_minimal 2 0
node 15 10.99.2.16 unb2b_minimal 2 0
# UNB 4
node 16 10.99.2.17 unb2b_minimal 2 0
node 17 10.99.2.18 unb2b_minimal 2 0
node 18 10.99.2.19 unb2b_minimal 2 0
node 19 10.99.2.20 unb2b_minimal 2 0
# UNB 5
node 20 10.99.2.21 unb2b_minimal 2 0
node 21 10.99.2.22 unb2b_minimal 2 0
node 22 10.99.2.23 unb2b_minimal 2 0
node 23 10.99.2.24 unb2b_minimal 2 0
# UNB 6
node 24 10.99.2.25 unb2b_minimal 2 0
node 25 10.99.2.26 unb2b_minimal 2 0
node 26 10.99.2.27 unb2b_minimal 2 0
node 27 10.99.2.28 unb2b_minimal 2 0
# UNB 7
node 28 10.99.2.29 unb2b_minimal 2 0
node 29 10.99.2.30 unb2b_minimal 2 0
node 30 10.99.2.31 unb2b_minimal 2 0
node 31 10.99.2.32 unb2b_minimal 2 0
## UNB 4
#node 16 10.99.2.17 unb2b_minimal 2 0
#node 17 10.99.2.18 unb2b_minimal 2 0
#node 18 10.99.2.19 unb2b_minimal 2 0
#node 19 10.99.2.20 unb2b_minimal 2 0
#
## UNB 5
#node 20 10.99.2.21 unb2b_minimal 2 0
#node 21 10.99.2.22 unb2b_minimal 2 0
#node 22 10.99.2.23 unb2b_minimal 2 0
#node 23 10.99.2.24 unb2b_minimal 2 0
#
## UNB 6
#node 24 10.99.2.25 unb2b_minimal 2 0
#node 25 10.99.2.26 unb2b_minimal 2 0
#node 26 10.99.2.27 unb2b_minimal 2 0
#node 27 10.99.2.28 unb2b_minimal 2 0
#
## UNB 7
#node 28 10.99.2.29 unb2b_minimal 2 0
#node 29 10.99.2.30 unb2b_minimal 2 0
#node 30 10.99.2.31 unb2b_minimal 2 0
#node 31 10.99.2.32 unb2b_minimal 2 0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment