mirror of
https://github.com/emqx/neuron.git
synced 2026-10-20 07:21:35 +08:00
Merge pull request #2434 from hxy7yx/main-2
feat(datalayers):support array type
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* NEURON IIoT System for Industry 4.0
|
||||
* Copyright (C) 2020-2024 EMQ Technologies Co., Ltd All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
ALTER TABLE tags RENAME TO temp_tags;
|
||||
|
||||
-- update type integer
|
||||
CREATE TABLE
|
||||
IF NOT EXISTS tags (
|
||||
driver_name TEXT NOT NULL,
|
||||
group_name TEXT NOT NULL,
|
||||
name TEXT NULL check (length (name) <= 128),
|
||||
address TEXT NULL check (length (address) <= 128),
|
||||
attribute INTEGER NOT NULL check (attribute BETWEEN 0 AND 15),
|
||||
precision INTEGER NOT NULL check (precision BETWEEN 0 AND 17),
|
||||
decimal REAL NOT NULL,
|
||||
bias REAL NOT NULL check (bias BETWEEN -1000 AND 1000),
|
||||
type INTEGER NOT NULL check (type BETWEEN 0 AND 34 OR type = 40),
|
||||
description TEXT NULL check (length (description) <= 512),
|
||||
value TEXT,
|
||||
format TEXT,
|
||||
UNIQUE (driver_name, group_name, name),
|
||||
FOREIGN KEY (driver_name, group_name) REFERENCES groups (driver_name, name) ON UPDATE CASCADE ON DELETE CASCADE
|
||||
);
|
||||
|
||||
INSERT INTO
|
||||
tags
|
||||
SELECT
|
||||
driver_name,
|
||||
group_name,
|
||||
name,
|
||||
address,
|
||||
attribute,
|
||||
PRECISION,
|
||||
decimal,
|
||||
bias,
|
||||
TYPE,
|
||||
description,
|
||||
NULL,
|
||||
format
|
||||
FROM
|
||||
temp_tags;
|
||||
|
||||
DROP TABLE temp_tags;
|
||||
|
||||
COMMIT;
|
||||
@@ -17,6 +17,8 @@
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
**/
|
||||
|
||||
#include <jansson.h>
|
||||
|
||||
#include "errcodes.h"
|
||||
#include "plugin.h"
|
||||
#include "type.h"
|
||||
@@ -219,6 +221,120 @@ static void tag_array_init(void *_elt)
|
||||
static UT_icd ut_datatag_icd = { sizeof(datatag), tag_array_init,
|
||||
tag_array_copy, tag_array_free };
|
||||
|
||||
void process_array_to_json_string(json_t * array,
|
||||
neu_resp_tag_value_meta_t *tag_meta,
|
||||
UT_array * string_tags,
|
||||
neu_reqresp_trans_data_t * trans_data)
|
||||
{
|
||||
switch (tag_meta->value.type) {
|
||||
case NEU_TYPE_ARRAY_INT8:
|
||||
for (size_t i = 0; i < tag_meta->value.value.i8s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.i8s.i8s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_UINT8:
|
||||
for (size_t i = 0; i < tag_meta->value.value.u8s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.u8s.u8s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_INT16:
|
||||
for (size_t i = 0; i < tag_meta->value.value.i16s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.i16s.i16s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_UINT16:
|
||||
for (size_t i = 0; i < tag_meta->value.value.u16s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.u16s.u16s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_INT32:
|
||||
for (size_t i = 0; i < tag_meta->value.value.i32s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.i32s.i32s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_UINT32:
|
||||
for (size_t i = 0; i < tag_meta->value.value.u32s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.u32s.u32s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_INT64:
|
||||
for (size_t i = 0; i < tag_meta->value.value.i64s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.i64s.i64s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_UINT64:
|
||||
for (size_t i = 0; i < tag_meta->value.value.u64s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.u64s.u64s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_FLOAT:
|
||||
for (size_t i = 0; i < tag_meta->value.value.f32s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_real(tag_meta->value.value.f32s.f32s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_DOUBLE:
|
||||
for (size_t i = 0; i < tag_meta->value.value.f64s.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_real(tag_meta->value.value.f64s.f64s[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_STRING:
|
||||
for (size_t i = 0; i < tag_meta->value.value.strs.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_string(tag_meta->value.value.strs.strs[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_ARRAY_BOOL:
|
||||
for (size_t i = 0; i < tag_meta->value.value.bools.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_boolean(tag_meta->value.value.bools.bools[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
case NEU_TYPE_BYTES:
|
||||
for (size_t i = 0; i < tag_meta->value.value.bytes.length; ++i) {
|
||||
json_array_append_new(
|
||||
array, json_integer(tag_meta->value.value.bytes.bytes[i]));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
char *json_str = json_dumps(array, JSON_COMPACT);
|
||||
json_decref(array);
|
||||
|
||||
datatag tag = { trans_data->driver,
|
||||
trans_data->group,
|
||||
tag_meta->tag,
|
||||
{ .string_value = json_str },
|
||||
STRING_TYPE };
|
||||
utarray_push_back(string_tags, &tag);
|
||||
|
||||
free(json_str);
|
||||
}
|
||||
|
||||
int handle_trans_data(neu_plugin_t * plugin,
|
||||
neu_reqresp_trans_data_t *trans_data)
|
||||
{
|
||||
@@ -297,27 +413,21 @@ int handle_trans_data(neu_plugin_t * plugin,
|
||||
STRING_TYPE };
|
||||
utarray_push_back(string_tags, &tag);
|
||||
} break;
|
||||
case NEU_TYPE_BYTES: {
|
||||
char formatted[NEU_VALUE_SIZE];
|
||||
int offset = 0;
|
||||
|
||||
offset +=
|
||||
snprintf(formatted + offset, sizeof(formatted) - offset, "[ ");
|
||||
|
||||
for (int i = 0; i < tag_meta->value.value.bytes.length; ++i) {
|
||||
offset += snprintf(
|
||||
formatted + offset, sizeof(formatted) - offset, "%u%s",
|
||||
tag_meta->value.value.bytes.bytes[i],
|
||||
(i == tag_meta->value.value.bytes.length - 1) ? " " : ", ");
|
||||
}
|
||||
|
||||
snprintf(formatted + offset, sizeof(formatted) - offset, "]");
|
||||
datatag tag = { trans_data->driver,
|
||||
trans_data->group,
|
||||
tag_meta->tag,
|
||||
{ .string_value = formatted },
|
||||
STRING_TYPE };
|
||||
utarray_push_back(string_tags, &tag);
|
||||
case NEU_TYPE_BYTES:
|
||||
case NEU_TYPE_ARRAY_BOOL:
|
||||
case NEU_TYPE_ARRAY_INT8:
|
||||
case NEU_TYPE_ARRAY_UINT8:
|
||||
case NEU_TYPE_ARRAY_INT16:
|
||||
case NEU_TYPE_ARRAY_UINT16:
|
||||
case NEU_TYPE_ARRAY_INT32:
|
||||
case NEU_TYPE_ARRAY_UINT32:
|
||||
case NEU_TYPE_ARRAY_INT64:
|
||||
case NEU_TYPE_ARRAY_UINT64:
|
||||
case NEU_TYPE_ARRAY_FLOAT:
|
||||
case NEU_TYPE_ARRAY_DOUBLE: {
|
||||
json_t *array = json_array();
|
||||
process_array_to_json_string(array, tag_meta, string_tags,
|
||||
trans_data);
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user