mirror of
https://github.com/emqx/neuron.git
synced 2026-10-29 15:09:11 +08:00
Merge pull request #1476 from fengzeroz/main
core/modbus: support bytes
This commit is contained in:
@@ -159,7 +159,6 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
|
||||
case NEU_TYPE_BIT:
|
||||
case NEU_TYPE_BOOL:
|
||||
case NEU_TYPE_STRING:
|
||||
case NEU_TYPE_BYTES:
|
||||
case NEU_TYPE_WORD:
|
||||
case NEU_TYPE_DWORD:
|
||||
case NEU_TYPE_LWORD:
|
||||
@@ -168,6 +167,18 @@ void neu_driver_cache_update_change(neu_driver_cache_t *cache,
|
||||
elem->changed = true;
|
||||
}
|
||||
break;
|
||||
case NEU_TYPE_BYTES:
|
||||
if (elem->value.value.bytes.length !=
|
||||
value.value.bytes.length) {
|
||||
elem->changed = true;
|
||||
} else {
|
||||
if (memcpy(elem->value.value.bytes.bytes,
|
||||
value.value.bytes.bytes,
|
||||
value.value.bytes.length) != 0) {
|
||||
elem->changed = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NEU_TYPE_PTR: {
|
||||
if (elem->value.value.ptr.length != value.value.ptr.length) {
|
||||
elem->changed = true;
|
||||
@@ -290,10 +301,15 @@ int neu_driver_cache_meta_get(neu_driver_cache_t *cache, const char *group,
|
||||
value->value.value.boolean = elem->value.value.boolean;
|
||||
break;
|
||||
case NEU_TYPE_STRING:
|
||||
case NEU_TYPE_BYTES:
|
||||
memcpy(value->value.value.str, elem->value.value.str,
|
||||
sizeof(elem->value.value.str));
|
||||
break;
|
||||
case NEU_TYPE_BYTES:
|
||||
value->value.value.bytes.length = elem->value.value.bytes.length;
|
||||
memcpy(value->value.value.bytes.bytes,
|
||||
elem->value.value.bytes.bytes,
|
||||
elem->value.value.bytes.length);
|
||||
break;
|
||||
case NEU_TYPE_PTR:
|
||||
value->value.value.ptr.length = elem->value.value.ptr.length;
|
||||
value->value.value.ptr.type = elem->value.value.ptr.type;
|
||||
@@ -368,10 +384,15 @@ int neu_driver_cache_meta_get_changed(neu_driver_cache_t *cache,
|
||||
value->value.value.boolean = elem->value.value.boolean;
|
||||
break;
|
||||
case NEU_TYPE_STRING:
|
||||
case NEU_TYPE_BYTES:
|
||||
memcpy(value->value.value.str, elem->value.value.str,
|
||||
sizeof(elem->value.value.str));
|
||||
break;
|
||||
case NEU_TYPE_BYTES:
|
||||
value->value.value.bytes.length = elem->value.value.bytes.length;
|
||||
memcpy(value->value.value.bytes.bytes,
|
||||
elem->value.value.bytes.bytes,
|
||||
elem->value.value.bytes.length);
|
||||
break;
|
||||
case NEU_TYPE_PTR:
|
||||
value->value.value.ptr.length = elem->value.value.ptr.length;
|
||||
value->value.value.ptr.type = elem->value.value.ptr.type;
|
||||
@@ -444,10 +465,15 @@ int neu_driver_cache_get(neu_driver_cache_t *cache, const char *group,
|
||||
value->value.value.boolean = elem->value.value.boolean;
|
||||
break;
|
||||
case NEU_TYPE_STRING:
|
||||
case NEU_TYPE_BYTES:
|
||||
memcpy(value->value.value.str, elem->value.value.str,
|
||||
sizeof(elem->value.value.str));
|
||||
break;
|
||||
case NEU_TYPE_BYTES:
|
||||
value->value.value.bytes.length = elem->value.value.bytes.length;
|
||||
memcpy(value->value.value.bytes.bytes,
|
||||
elem->value.value.bytes.bytes,
|
||||
elem->value.value.bytes.length);
|
||||
break;
|
||||
case NEU_TYPE_PTR:
|
||||
value->value.value.ptr.length = elem->value.value.ptr.length;
|
||||
value->value.value.ptr.type = elem->value.value.ptr.type;
|
||||
@@ -518,10 +544,15 @@ int neu_driver_cache_get_changed(neu_driver_cache_t *cache, const char *group,
|
||||
value->value.value.boolean = elem->value.value.boolean;
|
||||
break;
|
||||
case NEU_TYPE_STRING:
|
||||
case NEU_TYPE_BYTES:
|
||||
memcpy(value->value.value.str, elem->value.value.str,
|
||||
sizeof(elem->value.value.str));
|
||||
break;
|
||||
case NEU_TYPE_BYTES:
|
||||
value->value.value.bytes.length = elem->value.value.bytes.length;
|
||||
memcpy(value->value.value.bytes.bytes,
|
||||
elem->value.value.bytes.bytes,
|
||||
elem->value.value.bytes.length);
|
||||
break;
|
||||
case NEU_TYPE_PTR:
|
||||
value->value.value.ptr.length = elem->value.value.ptr.length;
|
||||
value->value.value.ptr.type = elem->value.value.ptr.type;
|
||||
|
||||
+17
-16
@@ -378,6 +378,7 @@ static void fix_value(neu_datatag_t *tag, neu_type_e value_type,
|
||||
switch (tag->type) {
|
||||
case NEU_TYPE_BOOL:
|
||||
case NEU_TYPE_STRING:
|
||||
case NEU_TYPE_BYTES:
|
||||
break;
|
||||
case NEU_TYPE_BIT:
|
||||
value->type = NEU_TYPE_BIT;
|
||||
@@ -404,16 +405,16 @@ static void fix_value(neu_datatag_t *tag, neu_type_e value_type,
|
||||
value->value.u32 = (uint32_t) value->value.u64;
|
||||
switch (tag->option.value32.endian) {
|
||||
case NEU_DATATAG_ENDIAN_LB32:
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes + 2);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes.bytes);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes.bytes + 2);
|
||||
break;
|
||||
case NEU_DATATAG_ENDIAN_BB32:
|
||||
value->value.u32 = htonl(value->value.u32);
|
||||
break;
|
||||
case NEU_DATATAG_ENDIAN_BL32:
|
||||
value->value.u32 = htonl(value->value.u32);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes + 2);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes.bytes);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes.bytes + 2);
|
||||
break;
|
||||
case NEU_DATATAG_ENDIAN_LL32:
|
||||
default:
|
||||
@@ -428,16 +429,16 @@ static void fix_value(neu_datatag_t *tag, neu_type_e value_type,
|
||||
|
||||
switch (tag->option.value32.endian) {
|
||||
case NEU_DATATAG_ENDIAN_LB32:
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes + 2);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes.bytes);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes.bytes + 2);
|
||||
break;
|
||||
case NEU_DATATAG_ENDIAN_BB32:
|
||||
value->value.u32 = htonl(value->value.u32);
|
||||
break;
|
||||
case NEU_DATATAG_ENDIAN_BL32:
|
||||
value->value.u32 = htonl(value->value.u32);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes + 2);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes.bytes);
|
||||
neu_ntohs_p((uint16_t *) value->value.bytes.bytes + 2);
|
||||
break;
|
||||
case NEU_DATATAG_ENDIAN_LL32:
|
||||
default:
|
||||
@@ -1374,8 +1375,8 @@ static int read_report_group(int64_t timestamp, int64_t timeout,
|
||||
case NEU_TYPE_INT32:
|
||||
switch (tag->option.value32.endian) {
|
||||
case NEU_DATATAG_ENDIAN_LB32: {
|
||||
uint16_t *v1 = (uint16_t *) value.value.value.bytes;
|
||||
uint16_t *v2 = (uint16_t *) (value.value.value.bytes + 2);
|
||||
uint16_t *v1 = (uint16_t *) value.value.value.bytes.bytes;
|
||||
uint16_t *v2 = (uint16_t *) (value.value.value.bytes.bytes + 2);
|
||||
|
||||
neu_htons_p(v1);
|
||||
neu_htons_p(v2);
|
||||
@@ -1386,8 +1387,8 @@ static int read_report_group(int64_t timestamp, int64_t timeout,
|
||||
break;
|
||||
case NEU_DATATAG_ENDIAN_BL32:
|
||||
value.value.value.u32 = htonl(value.value.value.u32);
|
||||
uint16_t *v1 = (uint16_t *) value.value.value.bytes;
|
||||
uint16_t *v2 = (uint16_t *) (value.value.value.bytes + 2);
|
||||
uint16_t *v1 = (uint16_t *) value.value.value.bytes.bytes;
|
||||
uint16_t *v2 = (uint16_t *) (value.value.value.bytes.bytes + 2);
|
||||
|
||||
neu_htons_p(v1);
|
||||
neu_htons_p(v2);
|
||||
@@ -1523,8 +1524,8 @@ static void read_group(int64_t timestamp, int64_t timeout,
|
||||
case NEU_TYPE_INT32:
|
||||
switch (tag->option.value32.endian) {
|
||||
case NEU_DATATAG_ENDIAN_LB32: {
|
||||
uint16_t *v1 = (uint16_t *) value.value.value.bytes;
|
||||
uint16_t *v2 = (uint16_t *) (value.value.value.bytes + 2);
|
||||
uint16_t *v1 = (uint16_t *) value.value.value.bytes.bytes;
|
||||
uint16_t *v2 = (uint16_t *) (value.value.value.bytes.bytes + 2);
|
||||
|
||||
neu_htons_p(v1);
|
||||
neu_htons_p(v2);
|
||||
@@ -1535,8 +1536,8 @@ static void read_group(int64_t timestamp, int64_t timeout,
|
||||
break;
|
||||
case NEU_DATATAG_ENDIAN_BL32:
|
||||
value.value.value.u32 = htonl(value.value.value.u32);
|
||||
uint16_t *v1 = (uint16_t *) value.value.value.bytes;
|
||||
uint16_t *v2 = (uint16_t *) (value.value.value.bytes + 2);
|
||||
uint16_t *v1 = (uint16_t *) value.value.value.bytes.bytes;
|
||||
uint16_t *v2 = (uint16_t *) (value.value.value.bytes.bytes + 2);
|
||||
|
||||
neu_htons_p(v1);
|
||||
neu_htons_p(v2);
|
||||
|
||||
@@ -137,6 +137,19 @@ int neu_datatag_parse_addr_option(const neu_datatag_t * datatag,
|
||||
int ret = 0;
|
||||
|
||||
switch (datatag->type) {
|
||||
case NEU_TYPE_BYTES: {
|
||||
char *op = find_last_character(datatag->address, '.');
|
||||
|
||||
if (op == NULL) {
|
||||
ret = -1;
|
||||
} else {
|
||||
int n = sscanf(op, ".%hhd", &option->bytes.length);
|
||||
if (n != 1 || option->string.length <= 0) {
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_TYPE_STRING: {
|
||||
char *op = find_last_character(datatag->address, '.');
|
||||
|
||||
|
||||
@@ -233,6 +233,9 @@ void neu_json_decode_write_req_free(neu_json_write_req_t *req)
|
||||
if (req->t == NEU_JSON_STR) {
|
||||
free(req->value.val_str);
|
||||
}
|
||||
if (req->t == NEU_JSON_BYTES && req->value.val_bytes.length > 0) {
|
||||
free(req->value.val_bytes.bytes);
|
||||
}
|
||||
|
||||
free(req);
|
||||
}
|
||||
@@ -346,6 +349,10 @@ void neu_json_decode_write_tags_req_free(neu_json_write_tags_req_t *req)
|
||||
if (req->tags[i].t == NEU_JSON_STR) {
|
||||
free(req->tags[i].value.val_str);
|
||||
}
|
||||
if (req->tags[i].t == NEU_JSON_BYTES &&
|
||||
req->tags[i].value.val_bytes.length > 0) {
|
||||
free(req->tags[i].value.val_bytes.bytes);
|
||||
}
|
||||
}
|
||||
free(req->tags);
|
||||
free(req);
|
||||
|
||||
@@ -80,6 +80,17 @@ static json_t *encode_object(json_t *object, neu_json_elem_t ele)
|
||||
case NEU_JSON_BOOL:
|
||||
json_object_set_new(ob, ele.name, json_boolean(ele.v.val_bool));
|
||||
break;
|
||||
case NEU_JSON_BYTES: {
|
||||
void *bytes = json_array();
|
||||
|
||||
for (int i = 0; i < ele.v.val_bytes.length; i++) {
|
||||
json_array_append_new(bytes,
|
||||
json_integer(ele.v.val_bytes.bytes[i]));
|
||||
}
|
||||
|
||||
json_object_set_new(ob, ele.name, bytes);
|
||||
break;
|
||||
}
|
||||
case NEU_JSON_OBJECT:
|
||||
json_object_set_new(ob, ele.name, ele.v.val_object);
|
||||
break;
|
||||
@@ -117,6 +128,8 @@ static int decode_object(json_t *root, neu_json_elem_t *ele)
|
||||
ele->t = NEU_JSON_BOOL;
|
||||
} else if (json_is_integer(ob)) {
|
||||
ele->t = NEU_JSON_INT;
|
||||
} else if (json_is_array(ob)) {
|
||||
ele->t = NEU_JSON_BYTES;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,6 +160,23 @@ static int decode_object(json_t *root, neu_json_elem_t *ele)
|
||||
case NEU_JSON_BOOL:
|
||||
ele->v.val_bool = json_boolean_value(ob);
|
||||
break;
|
||||
case NEU_JSON_BYTES: {
|
||||
json_t *value = NULL;
|
||||
|
||||
ele->v.val_bytes.length = json_array_size(ob);
|
||||
if (ele->v.val_bytes.length > 0) {
|
||||
int index = 0;
|
||||
|
||||
ele->v.val_bytes.bytes =
|
||||
calloc(ele->v.val_bytes.length, sizeof(uint8_t));
|
||||
json_array_foreach(ob, index, value)
|
||||
{
|
||||
ele->v.val_bytes.bytes[index] =
|
||||
(uint8_t) json_integer_value(value);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NEU_JSON_OBJECT:
|
||||
ele->v.val_object = ob;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user