You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/05/01 14:53:43 UTC
[plc4x] branch feature/c-api updated: - Continued working on the
read support ...
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/c-api
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/feature/c-api by this push:
new 32727cb - Continued working on the read support ...
32727cb is described below
commit 32727cb5772f3749b2287793109634728659bb2a
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri May 1 16:53:34 2020 +0200
- Continued working on the read support ...
---
sandbox/plc4c/api/include/plc4c/read.h | 3 +-
.../plc4c/drivers/simulated/src/driver_simulated.c | 32 ++++++++++++++++++----
.../plc4c/examples/hello-world/src/hello_world.c | 2 +-
.../plc4c/spi/include/plc4c/spi/types_private.h | 32 ++++++++++++++++------
sandbox/plc4c/spi/src/connection.c | 8 ++++++
sandbox/plc4c/spi/src/read.c | 17 ++++++++++--
sandbox/plc4c/spi/src/system.c | 4 ++-
sandbox/plc4c/spi/src/utils/list.c | 2 ++
8 files changed, 78 insertions(+), 22 deletions(-)
diff --git a/sandbox/plc4c/api/include/plc4c/read.h b/sandbox/plc4c/api/include/plc4c/read.h
index 6f455a1..5b6cf85 100644
--- a/sandbox/plc4c/api/include/plc4c/read.h
+++ b/sandbox/plc4c/api/include/plc4c/read.h
@@ -31,8 +31,7 @@ extern "C" {
* @param read_request_execution pointer to a data-structure handling one execution of the read-request.
* @return return_code
*/
-return_code plc4c_read_request_execute(plc4c_connection *connection,
- plc4c_read_request *read_request,
+return_code plc4c_read_request_execute(plc4c_read_request *read_request,
plc4c_read_request_execution **read_request_execution);
/**
diff --git a/sandbox/plc4c/drivers/simulated/src/driver_simulated.c b/sandbox/plc4c/drivers/simulated/src/driver_simulated.c
index 08a4828..4c54be4 100644
--- a/sandbox/plc4c/drivers/simulated/src/driver_simulated.c
+++ b/sandbox/plc4c/drivers/simulated/src/driver_simulated.c
@@ -38,13 +38,34 @@ struct plc4c_driver_simulated_item_t {
};
typedef struct plc4c_driver_simulated_item_t plc4c_driver_simulated_item;
+return_code plc4c_driver_simulated_read_machine_function(plc4c_system_task *task) {
+ if(task->context == NULL) {
+ return INTERNAL_ERROR;
+ }
+
+ plc4c_read_request_execution *read_request_execution = task->context;
+ plc4c_system_task *system_task = read_request_execution->system_task;
+ switch (system_task->state_id) {
+ case READ_INIT: {
+ plc4c_read_response *read_response = malloc(sizeof(plc4c_read_response));
+ read_request_execution->read_response = read_response;
+ system_task->completed = true;
+ break;
+ }
+ default: {
+ return INTERNAL_ERROR;
+ }
+ }
+ return OK;
+}
+
plc4c_item *plc4c_driver_simulated_parse_address(const char *address_string) {
plc4c_driver_simulated_item *item = (plc4c_driver_simulated_item *) malloc(sizeof(plc4c_driver_simulated_item));
// TODO: Actually to the parsing of the address ...
return (plc4c_item *) item;
}
-return_code plc4c_driver_simulated_connect_function(plc4c_system *system, plc4c_connection *connection,
+return_code plc4c_driver_simulated_connect_function(plc4c_connection *connection,
plc4c_system_task **task) {
plc4c_system_task *new_task = malloc(sizeof(plc4c_system_task));
new_task->context = connection;
@@ -57,18 +78,17 @@ return_code plc4c_driver_simulated_connect_function(plc4c_system *system, plc4c_
return OK;
}
-return_code plc4c_driver_simulated_read_function(plc4c_system *system, plc4c_connection *connection,
- plc4c_read_request *read_request, plc4c_system_task **task) {
+return_code plc4c_driver_simulated_read_function(plc4c_read_request *read_request, plc4c_system_task **task) {
plc4c_system_task *new_task = malloc(sizeof(plc4c_system_task));
new_task->state_id = READ_INIT;
- new_task->state_machine_function = NULL;
+ new_task->state_machine_function = &plc4c_driver_simulated_read_machine_function;
new_task->context = read_request;
+ new_task->completed = false;
*task = new_task;
return OK;
}
-return_code plc4c_driver_simulated_write_function(plc4c_system *system, plc4c_connection *connection,
- plc4c_write_request *write_request, plc4c_system_task **task) {
+return_code plc4c_driver_simulated_write_function(plc4c_write_request *write_request, plc4c_system_task **task) {
plc4c_system_task *new_task = malloc(sizeof(plc4c_system_task));
new_task->state_id = WRITE_INIT;
new_task->state_machine_function = NULL;
diff --git a/sandbox/plc4c/examples/hello-world/src/hello_world.c b/sandbox/plc4c/examples/hello-world/src/hello_world.c
index 25d2710..3ab0ef2 100644
--- a/sandbox/plc4c/examples/hello-world/src/hello_world.c
+++ b/sandbox/plc4c/examples/hello-world/src/hello_world.c
@@ -125,7 +125,7 @@ int main() {
}
// Execute the read-request.
- result = plc4c_read_request_execute(connection, read_request, &read_request_execution);
+ result = plc4c_read_request_execute(read_request, &read_request_execution);
if(result != OK) {
return -1;
} else {
diff --git a/sandbox/plc4c/spi/include/plc4c/spi/types_private.h b/sandbox/plc4c/spi/include/plc4c/spi/types_private.h
index 51a15a4..a02d499 100644
--- a/sandbox/plc4c/spi/include/plc4c/spi/types_private.h
+++ b/sandbox/plc4c/spi/include/plc4c/spi/types_private.h
@@ -33,10 +33,14 @@ typedef struct plc4c_write_item_t plc4c_write_item;
typedef plc4c_item *(*plc4c_connection_parse_address_item)(const char *address_string);
typedef struct plc4c_system_task_t plc4c_system_task;
-typedef plc4c_item (*plc4c_system_task_state_machine_function)(plc4c_system_task* task);
-typedef return_code (*plc4c_connection_connect_function)(plc4c_system *system, plc4c_connection *connection, plc4c_system_task** task);
-typedef return_code (*plc4c_connection_read_function)(plc4c_system *system, plc4c_connection *connection, plc4c_read_request *read_request, plc4c_system_task** task);
-typedef return_code (*plc4c_connection_write_function)(plc4c_system *system, plc4c_connection *connection, plc4c_write_request *write_request, plc4c_system_task** task);
+
+typedef return_code (*plc4c_system_task_state_machine_function)(plc4c_system_task *task);
+
+typedef return_code (*plc4c_connection_connect_function)(plc4c_connection *connection, plc4c_system_task **task);
+
+typedef return_code (*plc4c_connection_read_function)(plc4c_read_request *read_request, plc4c_system_task **task);
+
+typedef return_code (*plc4c_connection_write_function)(plc4c_write_request *write_request, plc4c_system_task **task);
struct plc4c_system_t {
/* drivers */
@@ -99,8 +103,9 @@ struct plc4c_connection_t {
char *transport_connect_information;
char *parameters;
- plc4c_driver* driver;
- plc4c_transport* transport;
+ plc4c_system *system;
+ plc4c_driver *driver;
+ plc4c_transport *transport;
bool supports_reading;
bool supports_writing;
bool supports_subscriptions;
@@ -115,8 +120,7 @@ struct plc4c_connection_list_item_t {
struct plc4c_read_request_t {
plc4c_connection *connection;
- int num_items;
- plc4c_item items[];
+ plc4c_list *items;
};
struct plc4c_write_item_t {
@@ -130,10 +134,20 @@ struct plc4c_write_request_t {
plc4c_write_item *items;
};
+struct plc4c_read_request_execution_t {
+ plc4c_read_request *read_request;
+ plc4c_read_response *read_response;
+ plc4c_system_task *system_task;
+};
+
+struct plc4c_read_response_t {
+ // TODO: Implement
+};
+
struct plc4c_system_task_t {
int state_id;
plc4c_system_task_state_machine_function state_machine_function;
- void* context;
+ void *context;
bool completed;
};
diff --git a/sandbox/plc4c/spi/src/connection.c b/sandbox/plc4c/spi/src/connection.c
index 9ab61a3..21280ac 100644
--- a/sandbox/plc4c/spi/src/connection.c
+++ b/sandbox/plc4c/spi/src/connection.c
@@ -46,6 +46,14 @@ bool plc4c_connection_supports_reading(plc4c_connection *connection) {
}
return_code plc4c_connection_create_read_request(plc4c_connection *connection, int num_items, char* addresses[], plc4c_read_request** read_request) {
+ plc4c_read_request *new_read_request = malloc(sizeof(plc4c_read_request));
+ new_read_request->connection = connection;
+ plc4c_utils_list_create(&(new_read_request->items));
+ for(int i = 0; i < num_items; i++) {
+ plc4c_item *item = connection->driver->parse_address_function(addresses[i]);
+ plc4c_utils_list_insert_tail_value(new_read_request->items, item);
+ }
+ *read_request = new_read_request;
return OK;
}
diff --git a/sandbox/plc4c/spi/src/read.c b/sandbox/plc4c/spi/src/read.c
index 307268c..0830a73 100644
--- a/sandbox/plc4c/spi/src/read.c
+++ b/sandbox/plc4c/spi/src/read.c
@@ -21,9 +21,20 @@
#include <plc4c/read.h>
#include <plc4c/spi/types_private.h>
-return_code plc4c_read_request_execute(plc4c_connection *connection,
- plc4c_read_request *read_request,
- plc4c_read_request_execution **read_request_execution) {
+
+return_code plc4c_read_request_execute(plc4c_read_request *read_request,
+ plc4c_read_request_execution **read_request_execution) {
+ plc4c_system_task *system_task;
+ read_request->connection->driver->read_function(read_request, &system_task);
+ // Add the new task to the task-list.
+ plc4c_utils_list_insert_tail_value(read_request->connection->system->task_list, system_task);
+
+ plc4c_read_request_execution *new_read_request_execution = malloc(sizeof(plc4c_read_request_execution));
+ new_read_request_execution->read_request = read_request;
+ new_read_request_execution->read_response = NULL;
+ new_read_request_execution->system_task = system_task;
+
+ *read_request_execution = new_read_request_execution;
return OK;
}
diff --git a/sandbox/plc4c/spi/src/system.c b/sandbox/plc4c/spi/src/system.c
index 21474d0..f7a0cd0 100644
--- a/sandbox/plc4c/spi/src/system.c
+++ b/sandbox/plc4c/spi/src/system.c
@@ -272,6 +272,8 @@ return_code plc4c_system_connect(plc4c_system *system,
return result;
}
+ new_connection->system = system;
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Find a matching driver from the driver-list
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -338,7 +340,7 @@ return_code plc4c_system_connect(plc4c_system *system,
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
plc4c_system_task *new_connection_task = NULL;
- result = new_connection->driver->connect_function(system, new_connection, &new_connection_task);
+ result = new_connection->driver->connect_function(new_connection, &new_connection_task);
if(result != OK) {
return -1;
}
diff --git a/sandbox/plc4c/spi/src/utils/list.c b/sandbox/plc4c/spi/src/utils/list.c
index 3e145b0..d1ba87d 100644
--- a/sandbox/plc4c/spi/src/utils/list.c
+++ b/sandbox/plc4c/spi/src/utils/list.c
@@ -67,6 +67,7 @@ void plc4c_utils_list_insert_head_value(plc4c_list* list, void* value) {
plc4c_list_element *new_element = malloc(sizeof(plc4c_list_element));
new_element->value = value;
new_element->next = NULL;
+ new_element->previous = NULL;
plc4c_utils_list_insert_head(list, new_element);
}
@@ -84,6 +85,7 @@ void plc4c_utils_list_insert_tail_value(plc4c_list* list, void* value) {
plc4c_list_element *new_element = malloc(sizeof(plc4c_list_element));
new_element->value = value;
new_element->next = NULL;
+ new_element->previous = NULL;
plc4c_utils_list_insert_tail(list, new_element);
}