//
//  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.
//

== General thoughts

* Generally all operations in PLC4X that require any form of interaction with a remote system are to be considered async operations.
** Async functions should return a plc4x_promise object
** Example functions:
*** Connection
*** Read
*** Write
*** Subscribe
*** Unsubscribe
*** Disconnect
*** Destroy PLC4X System (As perhaps open connections need to be terminated)
*** Shutdown PLC4X System (As perhaps open connections need to be terminated)
* Generally all others are considered synchronous operations
** Sync functions should return a return_code
** Example functions
*** Create PLC4X System
*** Init PLC4X System
*** Load Driver
* Every function (except setters) should return either a return_code or a plc4c_promise
* No function generally does any IO, they just interact with the state
** Example: read operation just adds a new task to the connection object
** Only function doing IO is the plc4c_system_loop function which has the job of sending outgoing data and processing incoming data
** Different strategies could be applied to handle scheduling of task processing in plc4c_system_loop to avoid hogging too much CPU time

== API Usage

* At first the user needs to create an instance of the plc4c_system, which contains all system-relevant data:
** System configuration
** Drivers
** Connections
** ...
* After the plc4c_system is created the user then initializes the system
** Initializes the driver manager
** Initializes any internal structures
** Loads drivers
* After the plc4c_system is initialized, the user can create plc4c_connections by using the plc4c_system_connect function
** Returns a promise
* The user can attach success- and failure-callbacks to the promise

== Open Questions

* Perhaps all functions should use the async pattern as otherwise users have to know these details.
* Not sure if perhaps the serialization of messages could be done in the functions and the loop just deals with the sending/reading ... however I would opt for having this functionality in the loop as for intermediate states it would have to handle these anyway.