Skip to content
Snippets Groups Projects
Commit b835efb1 authored by Pieter Donker's avatar Pieter Donker
Browse files

add double type and fixed bug

parent b1694bb1
Branches
No related tags found
No related merge requests found
......@@ -57,7 +57,7 @@ Fpga::Fpga(list<class Node*>& nodelist)
pointMap->add_register("FPGA_mask_R", "fpga/enable_mask", nodes.size(), 1, "RO", REG_FORMAT_BOOLEAN, 1);
pointMap->add_register("FPGA_mask_RW", "fpga/enable_mask", nodes.size(), 1, "RW", REG_FORMAT_BOOLEAN, 1);
pointMap->add_register("FPGA_status_R", "fpga/status", nodes.size(), 1, "RO", REG_FORMAT_BOOLEAN, 1);
pointMap->add_register("FPGA_temp_R", "fpga/temp", nodes.size(), 1, "RO", REG_FORMAT_FLOAT, 1);
pointMap->add_register("FPGA_temp_R", "fpga/temp", nodes.size(), 1, "RO", REG_FORMAT_DOUBLE, 1);
pointMap->add_register("FPGA_version_R", "fpga/name", nodes.size(), 1, "RO", REG_FORMAT_STRING, 1);
pointMap->add_register("FPGA_firmware_version_R", "fpga/firmware_version", nodes.size(), 1, "RO", REG_FORMAT_STRING, 1);
pointMap->add_register("FPGA_hardware_version_R", "fpga/hardware_version", nodes.size(), 1, "RO", REG_FORMAT_STRING, 1);
......@@ -86,12 +86,12 @@ Fpga::Fpga(list<class Node*>& nodelist)
pointMap->add_register("FPGA_wg_enable_R", "fpga/wg_enable", nodes.size(), C_S_pn, "RO", REG_FORMAT_BOOLEAN, 1);
pointMap->add_register("FPGA_wg_enable_RW", "fpga/wg_enable", nodes.size(), C_S_pn, "RW", REG_FORMAT_BOOLEAN, 1);
pointMap->add_register("FPGA_wg_amplitude_R", "fpga/wg_amplitude", nodes.size(), C_S_pn, "RO", REG_FORMAT_FLOAT, 1);
pointMap->add_register("FPGA_wg_amplitude_RW", "fpga/wg_amplitude", nodes.size(), C_S_pn, "RW", REG_FORMAT_FLOAT, 1);
pointMap->add_register("FPGA_wg_phase_R", "fpga/wg_phase", nodes.size(), C_S_pn, "RO", REG_FORMAT_FLOAT, 1);
pointMap->add_register("FPGA_wg_phase_RW", "fpga/wg_phase", nodes.size(), C_S_pn, "RW", REG_FORMAT_FLOAT, 1);
pointMap->add_register("FPGA_wg_frequency_R", "fpga/wg_frequency", nodes.size(), C_S_pn, "RO", REG_FORMAT_FLOAT, 1);
pointMap->add_register("FPGA_wg_frequency_RW", "fpga/wg_frequency", nodes.size(), C_S_pn, "RW", REG_FORMAT_FLOAT, 1);
pointMap->add_register("FPGA_wg_amplitude_R", "fpga/wg_amplitude", nodes.size(), C_S_pn, "RO", REG_FORMAT_DOUBLE, 1);
pointMap->add_register("FPGA_wg_amplitude_RW", "fpga/wg_amplitude", nodes.size(), C_S_pn, "RW", REG_FORMAT_DOUBLE, 1);
pointMap->add_register("FPGA_wg_phase_R", "fpga/wg_phase", nodes.size(), C_S_pn, "RO", REG_FORMAT_DOUBLE, 1);
pointMap->add_register("FPGA_wg_phase_RW", "fpga/wg_phase", nodes.size(), C_S_pn, "RW", REG_FORMAT_DOUBLE, 1);
pointMap->add_register("FPGA_wg_frequency_R", "fpga/wg_frequency", nodes.size(), C_S_pn, "RO", REG_FORMAT_DOUBLE, 1);
pointMap->add_register("FPGA_wg_frequency_RW", "fpga/wg_frequency", nodes.size(), C_S_pn, "RW", REG_FORMAT_DOUBLE, 1);
uint32_t scrap_span = 0;
uint32_t scrap_span_next = 0;
......@@ -214,14 +214,9 @@ bool Fpga::point(TermOutput& termout, const char cmd, const string addr,
auto node = select_node(nodes[idx]);
// if (node->getEnabled() == false) { continue; }
// uint node_nr = node_number(node);
CPointMap *regmap = node->get_RegisterMap();
int span = regmap->getDataSize(relative_addr);
// CMMap *mmap = node->get_MMap();
// int span = mmap->getSpan(addr);
int nof_values = nvalues;
if (nvalues < 0 || nvalues > span) {
nof_values = span;
......@@ -236,9 +231,6 @@ bool Fpga::point(TermOutput& termout, const char cmd, const string addr,
cout << "str=" << cm.getStr(idx) << " len=" << cm.getStrLen(idx) << endl;
memcpy((void *)data2, (void *)cm.getStrPtr(idx), cm.getStrLen(idx));
nof_values = cm.getStrLen(idx);
// if (cm.getStrLen(idx) % 4 > 0) {
// nof_values += 1;
// }
if ((ret = node->exec_cmd(cmd, relative_addr, type, instance,
data2, nof_values, format))) {
retcnt++;
......@@ -325,6 +317,13 @@ bool Fpga::point(TermOutput& termout, const char cmd, const string addr,
ptr_out[idx * termresults.nof_vals + i] = ptr_in[i];
}
} break;
case REG_FORMAT_DOUBLE: {
double *ptr_in = (double *)termresults.val;
double *ptr_out = (double *)termout.val;
for (unsigned int i=0; i<termresults.nof_vals; i++) {
ptr_out[idx * termresults.nof_vals + i] = ptr_in[i];
}
} break;
case REG_FORMAT_STRING: {
char *ptr_in = (char *)termresults.val;
char *ptr_out = (char *)termout.val;
......
......@@ -147,6 +147,9 @@ void Node::worker()
case REG_FORMAT_FLOAT: {
sz = sizeof(float);
} break;
case REG_FORMAT_DOUBLE: {
sz = sizeof(double);
} break;
case REG_FORMAT_INT32: {
sz = sizeof(int32_t);
} break;
......@@ -320,6 +323,9 @@ bool Node::exec_reply(TermOutput& termout)
int sz = 0;
switch (r->datatype) {
case REG_FORMAT_DOUBLE: {
sz = sizeof(double);
} break;
case REG_FORMAT_FLOAT: {
sz = sizeof(float);
} break;
......
......@@ -139,6 +139,12 @@ static UA_StatusCode ua_read_DataSource(UA_Server *server,
UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_FLOAT]);
dataValue->hasValue = true;
} break;
case UA_TYPES_DOUBLE: {
double *ptr = (double *)termout.val;
UA_Double value = (UA_Double)ptr[0];
UA_Variant_setScalarCopy(&dataValue->value, &value, &UA_TYPES[UA_TYPES_DOUBLE]);
dataValue->hasValue = true;
} break;
case UA_TYPES_INT16: {
int16_t *ptr = (int16_t *)termout.val;
UA_Int16 value = (UA_Int16)ptr[0];
......@@ -202,6 +208,16 @@ static UA_StatusCode ua_read_DataSource(UA_Server *server,
UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_FLOAT]);
dataValue->hasValue = true;
} break;
case UA_TYPES_DOUBLE: {
UA_Double *values = (UA_Double *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_DOUBLE]);
double *ptr = (double *)termout.val;
for (unsigned int i=0; i<termout.nof_vals; i++) {
values[i] = UA_Double(ptr[i]);
//cout << i << " ptr=" << ptr[i] << " value=" << values[i] << endl;
}
UA_Variant_setArray(&dataValue->value, values, termout.nof_vals, &UA_TYPES[UA_TYPES_DOUBLE]);
dataValue->hasValue = true;
} break;
case UA_TYPES_INT16: {
UA_Int16 *values = (UA_Int16 *) UA_Array_new(termout.nof_vals, &UA_TYPES[UA_TYPES_INT16]);
int16_t *ptr = (int16_t *)termout.val;
......@@ -297,6 +313,9 @@ static UA_StatusCode ua_write_DataSource(UA_Server *server,
case UA_TYPES_FLOAT: {
retval = false;
} break;
case UA_TYPES_DOUBLE: {
retval = false;
} break;
case UA_TYPES_INT16: {
retval = true;
int16_t *dptr = (int16_t *)data->value.data;
......@@ -357,34 +376,29 @@ static UA_StatusCode ua_write_DataSource(UA_Server *server,
if (data->hasValue && data->value.arrayLength > 0) {
//data.value is a UA_Variant
// cout << "data.value.arrayLength=" << data->value.arrayLength << endl;
// unsigned int *data_sdp = new unsigned int[data->value.arrayLength];
uint32_t *data_sdp = new uint32_t[data->value.arrayLength];
uint32_t *data_sdp = new uint32_t[data->value.arrayLength*2];
CMData cm(data->value.arrayLength);
cm.clear();
switch (ntype.identifier.numeric - 1) {
case UA_TYPES_STRING: {
cm.setFormat(FORMAT_STRING);
// cout << "dataformat=" << cm.getFormat() << endl;
UA_String *dptr = (UA_String *)data->value.data;
UA_String str_data;
for (int i=0; i<(int)data->value.arrayLength; i++){
str_data = dptr[i];
// cout << "n_chars=" << to_string(str_data.length) << endl;
cm.clearStr(i);
memcpy((void *)cm.getStrPtr(i), (void *)str_data.data, str_data.length);
cout << dec << i << " [" << cm.getStr(i) << "] " << endl;
}
retval = true;
} break;
case UA_TYPES_FLOAT: {
retval = true;
float *dptr = (float *)data->value.data;
for (uint i=0; i<data->value.arrayLength; i++) {
data_sdp[i] = (uint32_t)dptr[i];
}
memcpy(data_sdp, data->value.data, data->value.arrayLength*sizeof(UA_Float));
} break;
case UA_TYPES_DOUBLE: {
retval = true;
memcpy(data_sdp, data->value.data, data->value.arrayLength*sizeof(UA_Double));
} break;
case UA_TYPES_INT16: {
retval = true;
......@@ -782,6 +796,62 @@ static void ua_add_Variable_float(UA_Server *server, string regname, unsigned in
}
}
static void ua_add_Variable_double(UA_Server *server, string regname, unsigned int size, string perm, bool is_scalar)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "ua_add_Variable_double: %s", (char *)regname.c_str());
UA_VariableAttributes vattr = UA_VariableAttributes_default;
if (perm == "RW") {
vattr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
}
else if (perm == "WO") {
vattr.accessLevel = UA_ACCESSLEVELMASK_WRITE;
}
else if (perm == "RO") {
vattr.accessLevel = UA_ACCESSLEVELMASK_READ;
}
if (is_scalar) {
UA_Double value = UA_Double(0.0);
UA_Variant_setScalar(&vattr.value, &value, &UA_TYPES[UA_TYPES_DOUBLE]);
vattr.valueRank = UA_VALUERANK_SCALAR;
}
else {
vattr.valueRank = UA_VALUERANK_ONE_DIMENSION;
UA_UInt32 myArrayDimensions[1] = {size};
vattr.arrayDimensions = myArrayDimensions;
vattr.arrayDimensionsSize = 1;
UA_Double *values = (UA_Double *) UA_Array_new(size, &UA_TYPES[UA_TYPES_DOUBLE]);
for (unsigned int i=0; i<size; i++) {
values[i] = UA_Double(0.0);
}
UA_Variant_setArray(&vattr.value, values, size, &UA_TYPES[UA_TYPES_DOUBLE]);
vattr.value.arrayDimensions = myArrayDimensions;
vattr.value.arrayDimensionsSize = 1;
}
vattr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
vattr.displayName = UA_LOCALIZEDTEXT((char *)"locale", (char *)regname.c_str());
UA_DataSource DataSource;
DataSource.read = ua_read_DataSource;
DataSource.write = ua_write_DataSource;
UA_StatusCode retval = UA_Server_addDataSourceVariableNode(server,
UA_NODEID_STRING(mUaLofarNameSpace, (char *)regname.c_str()), // currentNodeId
UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), // parentNodeId
UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), // parentReferenceNodeId
UA_QUALIFIEDNAME(mUaLofarNameSpace, (char *)regname.c_str()), // node browse name
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
vattr, DataSource, NULL, NULL);
if (retval != UA_STATUSCODE_GOOD) {
// handle error
cout << "Error adding node" << endl;
}
}
static void ua_add_Variable_boolean(UA_Server *server, string regname, unsigned int size, string perm, bool is_scalar)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "ua_add_Variable_boolean: %s", (char *)regname.c_str());
......@@ -861,6 +931,9 @@ static void ua_add_Variable(UA_Server *server, string regname, int format, unsig
case REG_FORMAT_FLOAT: {
ua_add_Variable_float(server, regname, size, perm, is_scalar);
} break;
case REG_FORMAT_DOUBLE: {
ua_add_Variable_double(server, regname, size, perm, is_scalar);
} break;
case REG_FORMAT_BOOLEAN: {
ua_add_Variable_boolean(server, regname, size, perm, is_scalar);
} break;
......
......@@ -89,7 +89,7 @@ Periph_fpga::Periph_fpga(string ipaddr, string expected_design_name, uint expect
registerMap->add_register("fpga/note", "-", 0, 1, "RO", REG_FORMAT_STRING, 1);
registerMap->add_register("fpga/firmware_version", "-", 0, 1, "RO", REG_FORMAT_STRING, 10);
registerMap->add_register("fpga/hardware_version", "-", 0, 1, "RO", REG_FORMAT_STRING, 10);
registerMap->add_register("fpga/temp", "-", 1, 1, "RO", REG_FORMAT_STRING, 5);
registerMap->add_register("fpga/temp", "-", 1, 1, "RO", REG_FORMAT_DOUBLE, 5);
registerMap->add_register("fpga/status", "-", 1, 1, "RO", REG_FORMAT_STRING, 1);
registerMap->add_register("fpga/enable_mask", "-", 1, 1, "RW", REG_FORMAT_BOOLEAN, 1);
registerMap->add_register("fpga/rbf", "-", 0, 1, "RW", REG_FORMAT_STRING, 1);
......@@ -123,9 +123,9 @@ Periph_fpga::Periph_fpga(string ipaddr, string expected_design_name, uint expect
registerMap->add_register("fpga/sdp_info_block_period", "-", 1, 1, "RO", REG_FORMAT_UINT32, 1);
registerMap->add_register("fpga/wg_enable", "-", 1, 12, "RW", REG_FORMAT_BOOLEAN, 1);
registerMap->add_register("fpga/wg_amplitude", "-", 1, 12, "RW", REG_FORMAT_FLOAT, 1);
registerMap->add_register("fpga/wg_phase", "-", 1, 12, "RW", REG_FORMAT_FLOAT, 1);
registerMap->add_register("fpga/wg_frequency", "-", 1, 12, "RW", REG_FORMAT_FLOAT, 1);
registerMap->add_register("fpga/wg_amplitude", "-", 1, 12, "RW", REG_FORMAT_DOUBLE, 1);
registerMap->add_register("fpga/wg_phase", "-", 1, 12, "RW", REG_FORMAT_DOUBLE, 1);
registerMap->add_register("fpga/wg_frequency", "-", 1, 12, "RW", REG_FORMAT_DOUBLE, 1);
registerMap->print_screen();
......@@ -214,7 +214,7 @@ bool Periph_fpga::Write(const string addr_str, const uint32_t nvalues, uint32_t
}
uint32_t addr = mmap->getValidAddr((addr_str), 1);
uint32_t span = mmap->getSpan((addr_str));
cout << "addr=" << addr_str << " span=" << to_string(span) << endl;
//cout << "addr=" << addr_str << " span=" << to_string(span) << endl;
mmap->getWritePermission((addr_str));
bool isfifo = mmap->type_isfifo((addr_str));
......@@ -561,7 +561,7 @@ bool Periph_fpga::monitor(TermOutput& termout, uint seconds)
termout.clear();
}
if ((seconds % registerMap->getUpdateInterval("fpga/temp")) == 0) {
read_fpga_temperature(termout, REG_FORMAT_FLOAT, R_UCP);
read_fpga_temperature(termout, REG_FORMAT_DOUBLE, R_UCP);
termout.clear();
}
if ((seconds % registerMap->getUpdateInterval("fpga/hardware_version")) == 0) {
......@@ -803,7 +803,7 @@ bool Periph_fpga::read_stamps(TermOutput& termout, int format)
bool Periph_fpga::read_fpga_temperature(TermOutput& termout, int format, int mode)
{
bool retval = true;
float temp = my_current_temp;
double temp = my_current_temp;
if (mode == R_UCP) {
// cout << "read from UCP" << endl;
uint32_t data[20];
......@@ -813,9 +813,9 @@ bool Periph_fpga::read_fpga_temperature(TermOutput& termout, int format, int mod
// ADC to engineering
// see the constants: https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_alttemp_sense.pdf
// page 10
temp = ((693. * (float)data[0]) / 1024.) - 265;
temp = ((693. * (double)data[0]) / 1024.) - 265;
}
float *temp_ptr = (float *)termout.val;
double *temp_ptr = (double *)termout.val;
*temp_ptr = temp;
termout.nof_vals = 1;
termout.datatype = format;
......@@ -1407,10 +1407,10 @@ bool Periph_fpga::read_wg_amplitude(TermOutput& termout, int format) {
retval = Read(regname, &data[i]);
}
float ampl;
float *_ptr = (float *)termout.val ;
double ampl;
double *_ptr = (double *)termout.val ;
for (uint i=0; i< C_S_pn; i++) {
ampl = (float)data[i] / C_WG_AMPL_UNIT;
ampl = ((double)data[i]) / C_WG_AMPL_UNIT;
*_ptr = ampl;
_ptr++;
}
......@@ -1424,13 +1424,15 @@ bool Periph_fpga::write_wg_amplitude(uint32_t *data, uint32_t nvalues) {
bool retval = true;
uint32_t *reg = new uint32_t[2];
float ampl;
double ampl;
string regname;
double *_ptr = (double *)data;
for (uint i=0; i< C_S_pn; i++) {
regname = "mm/0/REG_WG/" + to_string(i) + "/ampl";
ampl = (float)data[i] * C_WG_AMPL_UNIT;
ampl = (*_ptr) * C_WG_AMPL_UNIT;
reg[0] = (uint32_t)ampl;
retval = Write(regname, 1, reg);
_ptr++;
}
delete[] reg;
return retval;
......@@ -1452,10 +1454,10 @@ bool Periph_fpga::read_wg_phase(TermOutput& termout, int format) {
retval = Read(regname, &data[i]);
}
float phase;
float *_ptr = (float *)termout.val ;
double phase;
double *_ptr = (double *)termout.val ;
for (uint i=0; i< C_S_pn; i++) {
phase = ((float)data[i]) / C_WG_PHASE_UNIT;
phase = ((double)data[i]) / C_WG_PHASE_UNIT;
*_ptr = phase;
_ptr++;
}
......@@ -1471,11 +1473,13 @@ bool Periph_fpga::write_wg_phase (uint32_t *data, uint32_t nvalues) {
float phase;
string regname;
double *_ptr = (double *)data;
for (uint i=0; i< C_S_pn; i++) {
regname = "mm/0/REG_WG/" + to_string(i) + "/phase";
phase = ((float)data[i]) * C_WG_PHASE_UNIT;
phase = (*_ptr) * C_WG_PHASE_UNIT;
reg[0] = (uint32_t)phase;
retval = Write(regname, 1, reg);
_ptr++;
}
delete[] reg;
return retval;
......@@ -1498,10 +1502,10 @@ bool Periph_fpga::read_wg_frequency(TermOutput& termout, int format) {
retval = Read(regname, &data[i]);
}
float freq;
float *_ptr = (float *)termout.val ;
double freq;
double *_ptr = (double *)termout.val ;
for (uint i=0; i< C_S_pn; i++) {
freq = ((float)data[i] / C_WG_FREQ_UNIT) * C_F_adc;
freq = (((double)data[i]) / C_WG_FREQ_UNIT) * C_F_adc;
*_ptr = freq;
_ptr++;
}
......@@ -1515,21 +1519,22 @@ bool Periph_fpga::write_wg_frequency(uint32_t *data, uint32_t nvalues) {
bool retval = true;
uint32_t *reg = new uint32_t[2];
float freq, intpart;
double freq, intpart;
string regname;
double *_ptr = (double *)data;
for (uint i=0; i< C_S_pn; i++) {
regname = "mm/0/REG_WG/" + to_string(i) + "/freq";
freq = (float)data[i] / C_F_adc;
freq = (*_ptr) / C_F_adc;
freq = modf(freq, &intpart);
freq = freq * C_WG_FREQ_UNIT;
reg[0] = (uint32_t)freq;
retval = Write(regname, 1, reg);
_ptr++;
}
delete[] reg;
return retval;
}
bool Periph_fpga::write_wdi_override(TermOutput& termout)
{
uint32_t data = 0xB007FAC7;
......
......@@ -55,9 +55,7 @@ private:
std::string my_current_fw_version;
std::string my_current_hardware_version;
std::string my_current_firmware_version;
float my_current_temp;
// float my_current_processing_enable;
double my_current_temp;
std::vector<uint32_t> Scrap_RW_copy;
std::vector<short> Weights_RW_copy;
......
......@@ -43,7 +43,8 @@
#define REG_FORMAT_INT32 4
#define REG_FORMAT_UINT32 5
#define REG_FORMAT_FLOAT 6
#define REG_FORMAT_BOOLEAN 7
#define REG_FORMAT_DOUBLE 7
#define REG_FORMAT_BOOLEAN 8
class CMMap {
private:
......
......@@ -53,7 +53,6 @@ public:
const static uint MAX_VAL_SIZE = 100;
const static uint FORMAT_UNKNOWN = 0;
const static uint FORMAT_STRING = 1;
const static uint FORMAT_UINT32 = 2;
struct StrData {
char val[MAX_VAL_SIZE];
......@@ -65,17 +64,14 @@ public:
uint n_vals = 1;
uint dataformat = FORMAT_UNKNOWN;
StrData *strdata = NULL;
uint32_t *intdata = NULL;
CMData(uint nvals=1) {
n_vals = nvals;
strdata = new StrData[n_vals];
intdata = new uint32_t[n_vals];
};
~CMData() {
if (strdata) delete[] strdata;
if (intdata) delete[] intdata;
};
void setFormat(uint format) {
......@@ -91,7 +87,6 @@ public:
//datatype = 0;
for (uint i=0; i<n_vals; i++){
clearStr(i);
clearInt(i);
}
}
......@@ -99,10 +94,6 @@ public:
std::memset((void *)strdata[val_nr].val, 0, MAX_VAL_SIZE);
}
void clearInt(uint val_nr) {
intdata[val_nr] = 0;
}
char *getStrPtr(uint val_nr) {
return strdata[val_nr].val;
}
......@@ -114,14 +105,6 @@ public:
std::string getStr(uint val_nr) {
return std::string(strdata[val_nr].val);
}
uint32_t getInt(uint val_nr) {
return intdata[val_nr];
}
void setInt(uint val_nr, uint val) {
intdata[val_nr] = (uint32_t)val;
}
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment