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 e4eb2bc - Made the read operations also have a response-code for every item. e4eb2bc is described below commit e4eb2bc6d9d18d4758c2bafb85334ebc33531d39 Author: Christofer Dutz <christofer.d...@c-ware.de> AuthorDate: Tue May 5 15:13:48 2020 +0200 - Made the read operations also have a response-code for every item. --- .../plc4c/drivers/simulated/src/driver_simulated.c | 17 +++-- .../plc4c/examples/hello-world/src/hello_world.c | 85 ++++++++-------------- .../plc4c/spi/include/plc4c/spi/types_private.h | 11 ++- sandbox/plc4c/spi/src/connection.c | 2 +- 4 files changed, 51 insertions(+), 64 deletions(-) diff --git a/sandbox/plc4c/drivers/simulated/src/driver_simulated.c b/sandbox/plc4c/drivers/simulated/src/driver_simulated.c index 2933eb8..c353128 100644 --- a/sandbox/plc4c/drivers/simulated/src/driver_simulated.c +++ b/sandbox/plc4c/drivers/simulated/src/driver_simulated.c @@ -101,8 +101,9 @@ plc4c_return_code plc4c_driver_simulated_read_machine_function(plc4c_system_task plc4c_driver_simulated_item *cur_item = cur_element->value; // Create a new random value. - plc4c_value_item *value_item = malloc(sizeof(plc4c_value_item)); + plc4c_response_value_item *value_item = malloc(sizeof(plc4c_response_value_item)); value_item->item = (plc4c_item *) cur_item; + value_item->response_code = PLC4C_RESPONSE_CODE_OK; uint32_t *random_value = malloc(sizeof(uint32_t)); *random_value = arc4random(); value_item->value = random_value; @@ -145,7 +146,7 @@ plc4c_return_code plc4c_driver_simulated_write_machine_function(plc4c_system_tas // Process every field in the request. plc4c_list_element *cur_element = plc4c_utils_list_head(write_request->items); while (cur_element != NULL) { - plc4c_value_item *cur_value_item = cur_element->value; + plc4c_request_value_item *cur_value_item = cur_element->value; plc4c_driver_simulated_item *cur_item = (plc4c_driver_simulated_item*) cur_value_item->item; plc4c_response_code response_code = -1; @@ -332,8 +333,8 @@ plc4c_return_code plc4c_driver_simulated_write_function(plc4c_system_task **task return OK; } -void free_read_item(plc4c_list_element *read_item_element) { - plc4c_value_item *value_item = (plc4c_value_item *) read_item_element->value; +void free_read_response_item(plc4c_list_element *read_item_element) { + plc4c_response_value_item *value_item = (plc4c_response_value_item *) read_item_element->value; // do not delete the plc4c_item // we also, in THIS case don't delete the random value which isn't really // a pointer @@ -343,11 +344,11 @@ void free_read_item(plc4c_list_element *read_item_element) { void plc4c_driver_simulated_free_read_response(plc4c_read_response *response) { // the request will be cleaned up elsewhere - plc4c_utils_list_delete_elements(response->items, &free_read_item); + plc4c_utils_list_delete_elements(response->items, &free_read_response_item); } -void free_write_item(plc4c_list_element *write_item_element) { - plc4c_value_item *value_item = (plc4c_value_item *) write_item_element->value; +void free_write_response_item(plc4c_list_element *write_item_element) { + plc4c_response_value_item *value_item = (plc4c_response_value_item *) write_item_element->value; // do not delete the plc4c_item // we also, in THIS case don't delete the random value which isn't really // a pointer @@ -357,7 +358,7 @@ void free_write_item(plc4c_list_element *write_item_element) { void plc4c_driver_simulated_free_write_response(plc4c_write_response *response) { // the request will be cleaned up elsewhere - plc4c_utils_list_delete_elements(response->response_items, &free_write_item); + plc4c_utils_list_delete_elements(response->response_items, &free_write_response_item); } diff --git a/sandbox/plc4c/examples/hello-world/src/hello_world.c b/sandbox/plc4c/examples/hello-world/src/hello_world.c index 6396fca..cdbe94e 100644 --- a/sandbox/plc4c/examples/hello-world/src/hello_world.c +++ b/sandbox/plc4c/examples/hello-world/src/hello_world.c @@ -44,8 +44,8 @@ void onGlobalDisconnect(plc4c_connection *cur_connection) { } void delete_address(plc4c_list_element *address_data_element) { - // these are not malloc'd, no need to free - address_data_element->value = NULL; + // these are not malloc'd, no need to free + address_data_element->value = NULL; } void delete_read_response_item(plc4c_list_element *response_read_item_element) { @@ -66,10 +66,11 @@ enum plc4c_connection_state_t { DISCONNECTING, DISCONNECTED }; -typedef enum plc4c_connection_state_t plc4c_connection_state ; +typedef enum plc4c_connection_state_t plc4c_connection_state; #pragma clang diagnostic push #pragma ide diagnostic ignored "hicpp-multiway-paths-covered" + int main() { bool loop = true; plc4c_system *system = NULL; @@ -161,9 +162,9 @@ int main() { plc4c_list *address_list = NULL; plc4c_utils_list_create(&address_list); - plc4c_utils_list_insert_head_value(address_list,(void *)"RANDOM/foo:INTEGER"); + plc4c_utils_list_insert_head_value(address_list, (void *) "RANDOM/foo:INTEGER"); result = plc4c_connection_create_read_request(connection, address_list, &read_request); - if(result != OK) { + if (result != OK) { printf("FAILED\n"); return -1; } @@ -177,7 +178,7 @@ int main() { plc4c_utils_list_delete_elements(address_list, &delete_address); free(address_list); - if(result != OK) { + if (result != OK) { printf("FAILED\n"); return -1; } else { @@ -185,12 +186,12 @@ int main() { } break; } - // Wait until the read-request execution is finished. + // Wait until the read-request execution is finished. case READ_REQUEST_SENT: { - if(plc4c_read_request_finished_successfully(read_request_execution)) { + if (plc4c_read_request_finished_successfully(read_request_execution)) { printf("SUCCESS\n"); state = READ_RESPONSE_RECEIVED; - } else if(plc4c_read_request_has_error(read_request_execution)) { + } else if (plc4c_read_request_has_error(read_request_execution)) { printf("FAILED\n"); return -1; } @@ -199,7 +200,7 @@ int main() { case READ_RESPONSE_RECEIVED: { // Get the response for the given read-request. plc4c_read_response *read_response = plc4c_read_request_get_response(read_request_execution); - if(read_response == NULL) { + if (read_response == NULL) { printf("FAILED (No Response)\n"); return -1; } @@ -207,11 +208,13 @@ int main() { // Iterate over all returned items. plc4c_list_element *cur_element = plc4c_utils_list_head(read_response->items); while (cur_element != NULL) { - plc4c_value_item *value_item = cur_element->value; + plc4c_response_value_item *value_item = cur_element->value; // Just cast the value to int for now ... // TODO: We need to introduce a fully operational plc_value system later on. - printf("Value %d\n", (int) value_item->value); + printf("- Read Value %d (%s): %d\n", (int) value_item->value, + plc4c_response_code_to_message(value_item->response_code), + (int) value_item->value); cur_element = cur_element->next; } @@ -225,10 +228,10 @@ int main() { printf("Preparing a write-request for 'STDOUT/foo:INTEGER' ... "); plc4c_list *address_list = NULL; plc4c_utils_list_create(&address_list); - plc4c_utils_list_insert_head_value(address_list,(void *)"STDOUT/foo:STRING"); + plc4c_utils_list_insert_head_value(address_list, (void *) "STDOUT/foo:STRING"); plc4c_list *value_list = NULL; plc4c_utils_list_create(&value_list); - plc4c_utils_list_insert_head_value(value_list,(void *)"hurz"); + plc4c_utils_list_insert_head_value(value_list, (void *) "hurz"); result = plc4c_connection_create_write_request(connection, address_list, value_list, &write_request); // As we only used these to create the request, they can now be released again. @@ -237,7 +240,7 @@ int main() { free(address_list); free(value_list); - if(result != OK) { + if (result != OK) { printf("FAILED\n"); return -1; } @@ -246,7 +249,7 @@ int main() { // Execute the write-request. printf("Executing a write-request ... \n"); result = plc4c_write_request_execute(write_request, &write_request_execution); - if(result != OK) { + if (result != OK) { printf("FAILED\n"); return -1; } else { @@ -254,72 +257,47 @@ int main() { } break; } - // Wait until the write-request execution is finished. + // Wait until the write-request execution is finished. case WRITE_REQUEST_SENT: { - if(plc4c_write_request_finished_successfully(write_request_execution)) { + if (plc4c_write_request_finished_successfully(write_request_execution)) { printf("SUCCESS\n"); - - plc4c_write_response *write_response = plc4c_write_request_get_response(write_request_execution); - - // Iterate over the responses ... - printf("Write Response:\n"); - plc4c_list_element *cur_element = plc4c_utils_list_head(write_response->response_items); - while (cur_element != NULL) { - plc4c_response_item *response_item = cur_element->value; - printf(" - %s: %s\n", response_item->item->name, plc4c_response_code_to_message(response_item->response_code)); - cur_element = cur_element->next; - } - - // Clean up. - plc4c_connection_write_response_destroy(write_response); - plc4c_read_request_execution_destroy(read_request_execution); - plc4c_read_request_destroy(read_request); - state = WRITE_RESPONSE_RECEIVED; - } else if(plc4c_write_request_has_error(write_request_execution)) { + } else if (plc4c_write_request_has_error(write_request_execution)) { printf("FAILED\n"); return -1; } break; } case WRITE_RESPONSE_RECEIVED: { - // Get the response for the given write-request. plc4c_write_response *write_response = plc4c_write_request_get_response(write_request_execution); - if(write_response == NULL) { - printf("FAILED (No Response)\n"); - return -1; - } - // Iterate over all returned items. + // Iterate over the responses ... plc4c_list_element *cur_element = plc4c_utils_list_head(write_response->response_items); while (cur_element != NULL) { - plc4c_value_item *value_item = cur_element->value; - - // Just cast the value to int for now ... - // TODO: We need to introduce a fully operational plc_value system later on. - printf("Value %d\n", (int) value_item->value); - + plc4c_response_item *response_item = cur_element->value; + printf(" - Write Value %s (%s)\n", response_item->item->name, + plc4c_response_code_to_message(response_item->response_code)); cur_element = cur_element->next; } // Clean up. plc4c_connection_write_response_destroy(write_response); - plc4c_write_request_execution_destroy(write_request_execution); - plc4c_write_request_destroy(write_request); + plc4c_read_request_execution_destroy(read_request_execution); + plc4c_read_request_destroy(read_request); // Disconnect. printf("Disconnecting ... "); result = plc4c_connection_disconnect(connection); - if(result != OK) { + if (result != OK) { printf("FAILED"); return -1; } state = DISCONNECTING; break; } - // Wait until the connection is disconnected + // Wait until the connection is disconnected case DISCONNECTING: { - if(!plc4c_connection_is_connected(connection)) { + if (!plc4c_connection_is_connected(connection)) { printf("SUCCESS\n"); plc4c_connection_destroy(connection); state = DISCONNECTED; @@ -345,4 +323,5 @@ int main() { return 0; } + #pragma clang diagnostic pop diff --git a/sandbox/plc4c/spi/include/plc4c/spi/types_private.h b/sandbox/plc4c/spi/include/plc4c/spi/types_private.h index 5293ec0..274da85 100644 --- a/sandbox/plc4c/spi/include/plc4c/spi/types_private.h +++ b/sandbox/plc4c/spi/include/plc4c/spi/types_private.h @@ -28,7 +28,8 @@ typedef struct plc4c_item_t plc4c_item; typedef struct plc4c_driver_list_item_t plc4c_driver_list_item; typedef struct plc4c_transport_list_item_t plc4c_transport_list_item; typedef struct plc4c_connection_list_item_t plc4c_connection_list_item; -typedef struct plc4c_value_item_t plc4c_value_item; +typedef struct plc4c_request_value_item_t plc4c_request_value_item; +typedef struct plc4c_response_value_item_t plc4c_response_value_item; typedef struct plc4c_response_item_t plc4c_response_item; typedef plc4c_item *(*plc4c_connection_parse_address_item)(char *address_string); @@ -134,11 +135,17 @@ struct plc4c_connection_list_item_t { }; -struct plc4c_value_item_t { +struct plc4c_request_value_item_t { plc4c_item *item; void *value; }; +struct plc4c_response_value_item_t { + plc4c_item *item; + plc4c_response_code response_code; + void *value; +}; + struct plc4c_response_item_t { plc4c_item *item; plc4c_response_code response_code; diff --git a/sandbox/plc4c/spi/src/connection.c b/sandbox/plc4c/spi/src/connection.c index 8cddbdc..5a98c7a 100644 --- a/sandbox/plc4c/spi/src/connection.c +++ b/sandbox/plc4c/spi/src/connection.c @@ -111,7 +111,7 @@ plc4c_return_code plc4c_connection_create_write_request(plc4c_connection *connec plc4c_item *address_item = connection->driver->parse_address_function(address); // Create a new value item, binding an address item to a value. - plc4c_value_item *value_item = malloc(sizeof(plc4c_value_item)); + plc4c_request_value_item *value_item = malloc(sizeof(plc4c_request_value_item)); value_item->item = address_item; connection->driver->encode_value_function(address_item, value_element->value, &value_item->value);