Merge pull request #2434 from hxy7yx/main-2

feat(datalayers):support array type
This commit is contained in:
fengzeroz
2025-04-30 15:47:01 +08:00
committed by GitHub
2 changed files with 193 additions and 21 deletions
+62
View File
@@ -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;
+131 -21
View File
@@ -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;