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);
 }