blob: 81a2049d7db2ceb5bdcf179a8baa819ac931d808 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef PLC4C_SPI_TYPES_PRIVATE_H_
#define PLC4C_SPI_TYPES_PRIVATE_H_
#include <plc4c/data.h>
#include <plc4c/system.h>
#include <plc4c/types.h>
#include <plc4c/utils/list.h>
#include <plc4c/utils/queue.h>
#include "read_buffer.h"
#include "write_buffer.h"
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_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 struct plc4c_response_subscription_item_t plc4c_response_subscription_item;
typedef struct plc4c_response_unsubscription_item_t plc4c_response_unsubscription_item;
typedef plc4c_return_code (*plc4c_connection_configure_function)(
plc4c_list* parameters, void** configuration);
typedef plc4c_return_code (*plc4c_connection_parse_address_item)(
char *address_string, void** encoded_address);
typedef plc4c_return_code (*plc4c_connection_encode_value_item)(
plc4c_item *item, void *value, void **encoded_value);
typedef struct plc4c_system_task_t plc4c_system_task;
typedef plc4c_return_code (*plc4c_system_task_state_machine_function)(
plc4c_system_task *task);
typedef plc4c_return_code (*plc4c_connection_connect_function)(
plc4c_connection *connection, plc4c_system_task **task);
typedef plc4c_return_code (*plc4c_connection_disconnect_function)(
plc4c_connection *connection, plc4c_system_task **task);
typedef plc4c_return_code (*plc4c_connection_read_function)(
plc4c_read_request_execution *read_request_execution,
plc4c_system_task **task);
typedef plc4c_return_code (*plc4c_connection_write_function)(
plc4c_write_request_execution *write_request_execution,
plc4c_system_task **task);
typedef plc4c_return_code (*plc4c_connection_subscribe_function)(
plc4c_subscription_request_execution *subscription_request_execution,
plc4c_system_task **task);
typedef plc4c_return_code (*plc4c_connection_unsubscribe_function)(
plc4c_unsubscription_request_execution *unsubscription_request_execution,
plc4c_system_task **task);
typedef void (*plc4c_connect_free_read_response_function)(
plc4c_read_response *response);
typedef void (*plc4c_connect_free_write_response_function)(
plc4c_write_response *response);
typedef void (*plc4c_connect_free_subscription_response_function)(
plc4c_subscription_response *response);
typedef void (*plc4c_connect_free_unsubscription_response_function)(
plc4c_unsubscription_response *response);
typedef plc4c_return_code (*plc4c_transport_configure_function)(
plc4c_list* parameters, void** configuration);
// TODO: Implement the argument.
typedef plc4c_return_code (*plc4c_transport_open_function)(void* config);
// TODO: Implement the argument.
typedef plc4c_return_code (*plc4c_transport_close_function)(void* config);
typedef plc4c_return_code (*plc4c_transport_send_message_function)(
void* transport_configuration, plc4c_spi_write_buffer* message);
// Helper function that tells the transport what to do with the current input
// on positive return value: a read-buffer with given number of bytes is
// returned. RESPONSE_ACCEPT_INCOMPLETE or 0: Currently not enough data is
// or this content is not applicable for the current task. Don't consume
// anything and potentially re-check next time. If however the value is negative
// the buffer seems to contain corrupt data, clean up by skipping the number of
// bytes you get by making the negative value a positive and not returning any
// read-buffer.
typedef int16_t (*accept_message_function)(
uint8_t* data, uint16_t length);
typedef plc4c_return_code (*plc4c_transport_select_message_function)(
void* transport_configuration, uint8_t min_size, accept_message_function accept_message, plc4c_spi_read_buffer** message);
struct plc4c_system_t {
/* drivers */
plc4c_list *driver_list;
/* transports */
plc4c_list *transport_list;
/* connections */
plc4c_list *connection_list;
/* tasks */
plc4c_list *task_list;
/* callbacks */
plc4c_system_on_driver_load_success_callback on_driver_load_success_callback;
plc4c_system_on_driver_load_failure_callback on_driver_load_failure_callback;
plc4c_system_on_connect_success_callback on_connect_success_callback;
plc4c_system_on_connect_failure_callback on_connect_failure_callback;
plc4c_system_on_disconnect_success_callback on_disconnect_success_callback;
plc4c_system_on_disconnect_failure_callback on_disconnect_failure_callback;
plc4c_system_on_loop_failure_callback on_loop_failure_callback;
};
struct plc4c_item_t {
char *name;
void *address;
};
struct plc4c_driver_t {
char *protocol_code;
char *protocol_name;
char *default_transport_code;
plc4c_connection_configure_function configure_function;
plc4c_connection_parse_address_item parse_address_function;
plc4c_connection_connect_function connect_function;
plc4c_connection_disconnect_function disconnect_function;
plc4c_connection_read_function read_function;
plc4c_connection_write_function write_function;
plc4c_connection_subscribe_function subscribe_function;
plc4c_connection_unsubscribe_function unsubscribe_function;
plc4c_connect_free_read_response_function free_read_response_function;
plc4c_connect_free_write_response_function free_write_response_function;
plc4c_connect_free_subscription_response_function free_subscription_response_function;
plc4c_connect_free_unsubscription_response_function free_unsubscription_response_function;
};
struct plc4c_driver_list_item_t {
plc4c_driver *driver;
plc4c_driver_list_item *next;
};
struct plc4c_transport_message_t {
int length;
uint8_t data[];
};
struct plc4c_transport_t {
char *transport_code;
char* transport_name;
plc4c_transport_configure_function configure;
plc4c_transport_open_function open;
plc4c_transport_close_function close;
plc4c_transport_send_message_function send_message;
// Function that uses a function passed in to see if a given system-task
// will be able to consume the current content of the transports input
// buffer.
plc4c_transport_select_message_function select_message;
};
struct plc4c_transport_list_item_t {
plc4c_transport *transport;
plc4c_transport_list_item *next;
};
struct plc4c_connection_t {
char *connection_string;
char *protocol_code;
char *transport_code;
char *transport_connect_information;
void *transport_configuration;
char *parameters;
void *configuration;
bool connected;
// Internal flag indicating the connection should be disconnected
bool disconnect;
// Number of system_tasks currently still active in the system.
int num_running_system_tasks;
plc4c_system *system;
plc4c_driver *driver;
plc4c_transport *transport;
bool supports_reading;
bool supports_writing;
bool supports_subscriptions;
};
struct plc4c_connection_list_item_t {
plc4c_connection *connection;
plc4c_connection_list_item *prev;
plc4c_connection_list_item *next;
};
struct plc4c_data_t {
plc4c_data_type data_type;
size_t size;
union {
bool boolean_value;
int8_t char_value;
uint8_t uchar_value;
int16_t short_value;
uint16_t ushort_value;
int32_t int_value;
uint32_t uint_value;
int64_t lint_value;
uint64_t ulint_value;
/* more */
float float_value;
double double_value;
char *pstring_value;
char *const_string_value;
void *pvoid_value;
} data;
plc4c_data_custom_destroy custom_destroy;
plc4c_data_custom_printf custom_printf;
};
struct plc4c_request_value_item_t {
plc4c_item *item;
plc4c_data *value;
};
struct plc4c_response_value_item_t {
plc4c_item *item;
plc4c_response_code response_code;
plc4c_data *value;
};
struct plc4c_response_subscription_item_t {
plc4c_item *item;
plc4c_response_code response_code;
// This is highly coupled to the protocol used.
void *subscription_handle;
};
struct plc4c_request_unsubscription_item_t {
plc4c_item *item;
// This is highly coupled to the protocol used.
void *subscription_handle;
};
struct plc4c_response_item_t {
plc4c_item *item;
plc4c_response_code response_code;
};
struct plc4c_read_request_t {
plc4c_connection *connection;
plc4c_list *items;
};
struct plc4c_write_request_t {
plc4c_connection *connection;
plc4c_list *items;
};
struct plc4c_subscription_request_t {
plc4c_connection *connection;
plc4c_list *items;
};
struct plc4c_unsubscription_request_t {
plc4c_connection *connection;
plc4c_list *items;
};
struct plc4c_read_request_execution_t {
plc4c_read_request *read_request;
plc4c_read_response *read_response;
plc4c_system_task *system_task;
};
struct plc4c_write_request_execution_t {
plc4c_write_request *write_request;
plc4c_write_response *write_response;
plc4c_system_task *system_task;
};
struct plc4c_subscription_request_execution_t {
plc4c_subscription_request *subscription_request;
plc4c_subscription_response *subscription_response;
plc4c_system_task *system_task;
};
struct plc4c_unsubscription_request_execution_t {
plc4c_unsubscription_request *unsubscription_request;
plc4c_unsubscription_response *unsubscription_response;
plc4c_system_task *system_task;
};
struct plc4c_read_response_t {
plc4c_read_request *read_request;
plc4c_list *items;
};
struct plc4c_write_response_t {
plc4c_write_request *write_request;
plc4c_list *response_items;
};
struct plc4c_subscription_response_t {
plc4c_subscription_request *subscription_request;
plc4c_list *response_items;
};
struct plc4c_subscription_event_t {
plc4c_subscription_request *subscription_request;
plc4c_list *event_items;
};
struct plc4c_unsubscription_response_t {
plc4c_unsubscription_request *unsubscription_request;
plc4c_list *response_items;
};
struct plc4c_system_task_t {
int state_id;
plc4c_system_task_state_machine_function state_machine_function;
bool completed;
void *context;
// Reference to the connection that owns this task
plc4c_connection *connection;
};
#endif // PLC4C_SPI_TYPES_PRIVATE_H_