add /decode endpoint

This commit is contained in:
John
2021-11-06 21:56:17 +01:00
parent 0d751ab1c7
commit 39498ee02f
3 changed files with 77 additions and 1 deletions
+1 -1
View File
@@ -21,7 +21,7 @@
* added some PIC calibration data to "ebuspicloader" verbose output
* added support for upcoming adapter 3 firmware enhancements
* added config override path
* added support for adding message definition, retrieving data types and raw messages to HTTP port
* added support for adding message definition, retrieving data types and raw messages, and decode data types from raw values to HTTP port
* added "--mqttverbose" option
## Breaking Changes
+26
View File
@@ -157,6 +157,32 @@ paths:
application/json;charset=utf-8:
schema:
$ref: '#/components/schemas/RawMessages'
/decode:
get:
summary: Decode raw data with the specified field defintion.
parameters:
- name: def
in: query
description: the field definition (starting with type).
allowEmptyValue: false
required: true
schema:
type: string
- name: raw
in: query
description: the raw symbols to decode as hex sequence.
required: true
allowEmptyValue: false
schema:
type: string
pattern: '^([0-9a-f][0-9a-f])+$'
responses:
200:
description: Success
content:
application/json;charset=utf-8:
schema:
$ref: '#/components/schemas/FieldValue'
/{file}:
get:
summary: Retrieve a particular file.
+50
View File
@@ -2259,6 +2259,56 @@ result_t MainLoop::executeGet(const vector<string>& args, bool* connected, ostri
return formatHttpResult(ret, type, ostream);
}
if (uri == "/decode") {
string def;
string raw;
if (args.size() > argPos) {
string query = args[argPos];
istringstream stream(query);
string token;
while (getline(stream, token, '&')) {
size_t pos = token.find('=');
string qname, value;
if (pos != string::npos) {
qname = token.substr(0, pos);
value = token.substr(pos + 1);
} else {
qname = token;
}
if (qname == "def") {
def = value;
} else if (qname == "raw") {
raw = value;
}
if (ret != RESULT_OK) {
break;
}
}
}
if (ret == RESULT_OK) {
time_t now;
time(&now);
istringstream defstr("#\n" + def); // ensure first line is not used for determining col names
string errorDescription;
DataFieldTemplates* templates = getTemplates("*");
LoadableDataFieldSet fields("", templates);
ret = fields.readFromStream(&defstr, "temporary", now, true, nullptr, &errorDescription);
if (ret == RESULT_OK) {
const SingleDataField* field = fields[0];
SlaveSymbolString slave;
slave.push_back(0); // dummy length
ret = slave.parseHex(raw);
if (ret == RESULT_OK) {
slave.adjustHeader();
ret = field->read(slave, 0, false, nullptr, 0, OF_JSON|OF_SHORT, 0, ostream);
}
}
type = 6;
}
*connected = false;
return formatHttpResult(ret, type, ostream);
}
if (uri.length() < 1 || uri[0] != '/' || uri.find("//") != string::npos || uri.find("..") != string::npos) {
ret = RESULT_ERR_INVALID_ARG;
} else {