blob: a0fa74af150afc01c823237a5a9371f7ad425eb4 [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
*
* https://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_SYSTEM_H_
#define PLC4C_SYSTEM_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <plc4c/utils/list.h>
#include <stdbool.h>
#include "types.h"
/**
* SYSTEM CALLBACKS
*/
/**
* Function pointer for a callback called when a driver is loaded.
* Set in plc4c_system @see plc4c_system_set_on_driver_load_success_callback()
*
* @param driver
*/
typedef void (*plc4c_system_on_driver_load_success_callback)(
plc4c_driver *driver);
/**
* Function pointer for a callback called when loading a driver fails.
* Set in plc4c_system @see plc4c_system_set_on_driver_load_failure_callback
* NOTE: driver_name could be a pointer to the configuration for the driver
* instead....
*
* @param driver_name
* @param error_code
*/
typedef void (*plc4c_system_on_driver_load_failure_callback)(
char *driver_name, plc4c_return_code error);
/**
* Function pointer for a callback called when is successfully made
* Set in plc4c_system @see plc4c_system_set_on_connect_success_callback().
*
* @param connection
*/
typedef void (*plc4c_system_on_connect_success_callback)(
plc4c_connection *connection);
/**
* Function pointer for a callback called when connecting fails.
* Set in plc4c_system @see plc4c_system_set_on_connect_failure_callback.
*
* @param connection_string
* @param error_code
*/
typedef void (*plc4c_system_on_connect_failure_callback)(
char *connection_string, plc4c_return_code error);
/**
* Function pointer for a callback called when is successfully made
* Set in plc4c_system @see plc4c_system_set_on_disconnect_success_callback().
*
* @param connection
*/
typedef void (*plc4c_system_on_disconnect_success_callback)(
plc4c_connection *connection);
/**
* Function pointer for a callback called when connecting fails.
* Set in plc4c_system @see plc4c_system_set_on_disconnect_failure_callback.
*
* @param connection
* @param error_code
*/
typedef void (*plc4c_system_on_disconnect_failure_callback)(
plc4c_connection *connection, plc4c_return_code error);
/**
* Function pointer for a callback called when a driver returns an error.
* Set in plc4c_system @see plc4c_system_set_on_loop_failure_callback.
*
* @param driver
* @param connection
* @param error_code
*/
typedef void (*plc4c_system_on_loop_failure_callback)(
plc4c_driver *driver, plc4c_connection *connection,
plc4c_return_code error);
/**
* OTHER FUNCTION DEFS FOR SYSTEM
*/
/**
* SYSTEM FUNCTIONS
*/
/**
* Function to create a plc4c_system.
*
* @param system
* @return NO_MEMORY if failed to create system
*/
plc4c_return_code plc4c_system_create(plc4c_system **system);
/**
* Function to initialize the PLC4C system (Initialize the driver manager and
* the list of enabled drivers)
*
* @param system
* @return plc4c_return_code
*/
plc4c_return_code plc4c_system_init(plc4c_system *system);
/**
* Function to destroy a plc4c_system.
* This will also destroy all connections associated with the system.
*
* @param system
*/
void plc4c_system_destroy(plc4c_system *system);
/**
* Returns the plc4c_list for tasks for a given system
* TODO: Possilby this should be an SPI function
* @param system plc4c_system
* @return plc4c_list
*/
plc4c_list *plc4c_system_get_task_list(plc4c_system *system);
/**
* Sets the plc4c_list for tasks for a given system
* TODO: Possilby this should be an SPI function
* @param system plc4c_system
* @param task_list plc4c_list
*/
void plc4c_system_set_task_list(plc4c_system *system, plc4c_list *task_list);
void plc4c_system_remove_connection(plc4c_system *system,
plc4c_connection *connection);
/**
* Function to set the on_driver_loaded callback for the plc4c system.
*
* @param system
* @param callback plc4c_system_callback_on_driver
*/
void plc4c_system_set_on_driver_load_success_callback(
plc4c_system *system,
plc4c_system_on_driver_load_success_callback callback);
/**
* Function to set the error callback for loading drivers for the plc4c system.
*
* @param system
* @param callback plc4c_system_callback_driver_load_error
*/
void plc4c_system_set_on_driver_load_failure_callback(
plc4c_system *system,
plc4c_system_on_driver_load_failure_callback callback);
/**
* Function to set the on_connection callback for the plc4c system.
*
* @param system
* @param callback plc4c_system_callback_on_connection
*/
void plc4c_system_set_on_connect_success_callback(
plc4c_system *system, plc4c_system_on_connect_success_callback callback);
/**
* Function to set the error callback for making connections for the plc4c
* system.
*
* @param system
* @param callback plc4c_system_on_connect_failure_callback
*/
void plc4c_system_set_on_connect_failure_callback(
plc4c_system *system, plc4c_system_on_connect_failure_callback callback);
/**
* Function to set the on_disconnection callback for the plc4c system.
*
* @param system
* @param callback plc4c_system_callback_on_disconnection
*/
void plc4c_system_set_on_disconnect_success_callback(
plc4c_system *system, plc4c_system_on_disconnect_success_callback callback);
/**
* Function to set the error callback for shutting down connections for the
* plc4c system.
*
* @param system
* @param callback
*/
void plc4c_system_set_on_disconnect_failure_callback(
plc4c_system *system, plc4c_system_on_disconnect_failure_callback callback);
/**
* Function to set the error callback loops.
*
* @param system
* @param callback plc4c_system_callback_loop_error
*/
void plc4c_system_set_on_loop_failure_callback(
plc4c_system *system, plc4c_system_on_loop_failure_callback callback);
/**
* Function to manually add a driver to the system.
*
* @param system the system the driver should be added to.
* @param driver instance of the driver
* @return plc4c_return_code
*/
plc4c_return_code plc4c_system_add_driver(plc4c_system *system,
plc4c_driver *driver);
/**
* Function to manually add a transport to the system.
*
* @param system the system the transport should be added to.
* @param transport instance of the transport
* @return plc4c_return_code
*/
plc4c_return_code plc4c_system_add_transport(plc4c_system *system,
plc4c_transport *transport);
/**
* Function to clean up the PLC4C system (Free any still used resources,
* terminate live connections, ...)
*
* @param system
*/
void plc4c_system_shutdown(plc4c_system *system);
/**
* Function to initialize a connection to a PLC by parsing the given connection
* string and setting the passed connection system
*
* @param system
* @param connection_string
* @param ponter to where the connection object will be created.
* @return plc4c_return_code INVALID_CONNECTION_STRING, NO_MEMORY
*/
plc4c_return_code plc4c_system_connect(plc4c_system *system,
char *connectionString,
plc4c_connection **connection);
/**
* Function to give any drivers the chance to do their work.
* In single-threaded environments we can't operate with event
* handler loops as they would block the rest of the application.
*
* @param system the system instance
* @return plc4c_return_code
*/
plc4c_return_code plc4c_system_loop(plc4c_system *system);
#ifdef __cplusplus
}
#endif
#endif // PLC4C_SYSTEM_H_