diff --git a/include/neuron/type.h b/include/neuron/type.h index bbfc0811..237a8ca5 100644 --- a/include/neuron/type.h +++ b/include/neuron/type.h @@ -45,6 +45,9 @@ typedef enum { NEU_TYPE_STRING = 13, NEU_TYPE_BYTES = 14, NEU_TYPE_ERROR = 15, + NEU_TYPE_WORD = 16, + NEU_TYPE_DWORD = 17, + NEU_TYPE_LWORD = 18, } neu_type_e; inline static const char *neu_type_string(neu_type_e type) @@ -80,6 +83,12 @@ inline static const char *neu_type_string(neu_type_e type) return "NEU_TYPE_BYTES"; case NEU_TYPE_ERROR: return "NEU_TYPE_ERROR"; + case NEU_TYPE_WORD: + return "NEU_TYPE_WORD"; + case NEU_TYPE_DWORD: + return "NEU_TYPE_DWORD"; + case NEU_TYPE_LWORD: + return "NEU_TYPE_LWORD"; } return ""; diff --git a/persistence/0001_2.3.0_users.sql b/persistence/0001_2.3.0_users.sql index c11d84bd..f7d9bcdd 100644 --- a/persistence/0001_2.3.0_users.sql +++ b/persistence/0001_2.3.0_users.sql @@ -31,3 +31,23 @@ VALUES "admin", "$5$PwFeXpBBIBZuZdZl$fP8fFPWCLoaWcnVXVSR.3Xi8TEqCvX92gjhowNNn6S4" ); + +--- Add tags table --- +ALTER TABLE tags RENAME TO old_tags; +CREATE TABLE IF NOT EXISTS + tags ( + driver_name TEXT NOT NULL, + group_name TEXT NOT NULL, + name TEXT NULL check(length(name) <= 32), + address TEXT NULL check(length(address) <= 64), + attribute INTEGER NOT NULL check(attribute BETWEEN 0 AND 7), + precision INTEGER NOT NULL check(precision BETWEEN 0 AND 17), + decimal REAL NOT NULL, + type INTEGER NOT NULL check(type BETWEEN 0 AND 19), + description TEXT NULL check(length(description) <= 128), + 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 * FROM old_tags; +DROP TABLE old_tags; +COMMIT; \ No newline at end of file diff --git a/src/adapter/driver/cache.c b/src/adapter/driver/cache.c index f0f1c95d..0e514d5b 100644 --- a/src/adapter/driver/cache.c +++ b/src/adapter/driver/cache.c @@ -150,6 +150,9 @@ void neu_driver_cache_update(neu_driver_cache_t *cache, const char *group, case NEU_TYPE_BOOL: case NEU_TYPE_STRING: case NEU_TYPE_BYTES: + case NEU_TYPE_WORD: + case NEU_TYPE_DWORD: + case NEU_TYPE_LWORD: if (memcmp(&elem->value.value, &value.value, sizeof(value.value)) != 0) { elem->changed = true; @@ -212,10 +215,12 @@ int neu_driver_cache_get(neu_driver_cache_t *cache, const char *group, break; case NEU_TYPE_INT16: case NEU_TYPE_UINT16: + case NEU_TYPE_WORD: value->value.value.u16 = elem->value.value.u16; break; case NEU_TYPE_INT32: case NEU_TYPE_UINT32: + case NEU_TYPE_DWORD: case NEU_TYPE_FLOAT: case NEU_TYPE_ERROR: value->value.value.u32 = elem->value.value.u32; @@ -223,6 +228,7 @@ int neu_driver_cache_get(neu_driver_cache_t *cache, const char *group, case NEU_TYPE_INT64: case NEU_TYPE_UINT64: case NEU_TYPE_DOUBLE: + case NEU_TYPE_LWORD: value->value.value.u64 = elem->value.value.u64; break; case NEU_TYPE_BOOL: @@ -267,17 +273,20 @@ int neu_driver_cache_get_changed(neu_driver_cache_t *cache, const char *group, break; case NEU_TYPE_INT16: case NEU_TYPE_UINT16: + case NEU_TYPE_WORD: value->value.value.u16 = elem->value.value.u16; break; case NEU_TYPE_INT32: case NEU_TYPE_UINT32: case NEU_TYPE_FLOAT: case NEU_TYPE_ERROR: + case NEU_TYPE_DWORD: value->value.value.u32 = elem->value.value.u32; break; case NEU_TYPE_INT64: case NEU_TYPE_UINT64: case NEU_TYPE_DOUBLE: + case NEU_TYPE_LWORD: value->value.value.u64 = elem->value.value.u64; break; case NEU_TYPE_BOOL: diff --git a/src/adapter/driver/driver.c b/src/adapter/driver/driver.c index df7f5fb6..5633dae1 100644 --- a/src/adapter/driver/driver.c +++ b/src/adapter/driver/driver.c @@ -281,7 +281,11 @@ void neu_adapter_driver_write_tag(neu_adapter_driver_t *driver, case NEU_TYPE_UINT32: case NEU_TYPE_INT64: case NEU_TYPE_UINT64: - if (cmd->value.type == NEU_TYPE_INT64) { + case NEU_TYPE_WORD: + case NEU_TYPE_LWORD: + case NEU_TYPE_DWORD: + if (cmd->value.type == NEU_TYPE_INT64 || + cmd->value.type == NEU_TYPE_LWORD) { cmd->value.value.u64 = cmd->value.value.u64 / tag->decimal; } else if (cmd->value.type == NEU_TYPE_DOUBLE) { cmd->value.value.u64 = @@ -317,6 +321,7 @@ void neu_adapter_driver_write_tag(neu_adapter_driver_t *driver, break; case NEU_TYPE_INT16: case NEU_TYPE_UINT16: + case NEU_TYPE_WORD: cmd->value.type = NEU_TYPE_UINT16; cmd->value.value.u16 = (uint16_t) cmd->value.value.u64; switch (tag->option.value16.endian) { @@ -330,6 +335,7 @@ void neu_adapter_driver_write_tag(neu_adapter_driver_t *driver, break; case NEU_TYPE_UINT32: case NEU_TYPE_INT32: + case NEU_TYPE_DWORD: cmd->value.type = NEU_TYPE_UINT32; cmd->value.value.u32 = (uint32_t) cmd->value.value.u64; switch (tag->option.value32.endian) { @@ -374,6 +380,7 @@ void neu_adapter_driver_write_tag(neu_adapter_driver_t *driver, case NEU_TYPE_DOUBLE: case NEU_TYPE_UINT64: case NEU_TYPE_INT64: + case NEU_TYPE_LWORD: switch (tag->option.value64.endian) { case NEU_DATATAG_ENDIAN_B64: cmd->value.value.u64 = neu_ntohll(cmd->value.value.u64); diff --git a/src/base/group.c b/src/base/group.c index 03935ff6..87e47785 100644 --- a/src/base/group.c +++ b/src/base/group.c @@ -243,6 +243,7 @@ neu_datatag_t *neu_group_find_tag(neu_group_t *group, const char *tag) result->name = strdup(find->tag->name); result->address = strdup(find->tag->address); result->description = strdup(find->tag->description); + memcpy(result->meta, find->tag->meta, sizeof(find->tag->meta)); } return result;