Merge pull request #1476 from fengzeroz/main

core/modbus: support bytes
This commit is contained in:
fengzeroz
2023-08-28 11:37:48 +08:00
committed by GitHub
16 changed files with 239 additions and 47 deletions
+36 -5
View File
@@ -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
View File
@@ -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);
+13
View File
@@ -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, '.');
+7
View File
@@ -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);
+30
View File
@@ -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;