@startuml /' UML class Diagram : can be displayed with PlantUML (plugin for Eclipse or for PyCharm) PlantUML: - How to install : https://projects.irap.omp.eu/projects/pyros/wiki/Project_Development#PlantUML - Eclipse plugin : http://plantuml.com/eclipse - class diagrams : http://plantuml.com/class-diagram - sequence diagrams : http://plantuml.com/sequence-diagram - state diagrams : http://plantuml.com/state-diagram - Use Case diagrams : http://plantuml.com/use-case-diagram - OLD Activity diagrams : http://plantuml.com/activity-diagram-legacy - NEW Activity diagrams : http://plantuml.com/activity-diagram-beta - Pre-processing (include...) : http://plantuml.com/preprocessing - GANTT diagrams : http://plantuml.com/gantt-diagram - REAL WORLD EXAMPLES !!! : https://real-world-plantuml.com/ - For Python: - https://github.com/SamuelMarks/python-plantuml - https://pythonhosted.org/plantuml/ UML diagrams theory : https://www.ibm.com/developerworks/rational/library/content/RationalEdge/sep04/bell/index.html '/ title __**DeviceController and ClientChannel classes diagram (composition)**__ (ClientChannel is a COMPONENT of DeviceController) end title /' Channels '/ ClientChannel <|-- ClientSerial ClientChannel <|-- ClientSocket ClientChannel <|-- ClientUSB abstract class ClientChannel { my_channel # socket or serial or usb... {abstract} connect_to_server() {abstract} read() {abstract} put() put_read() {abstract} send_data() {abstract} receive_data() {abstract} close() } class ClientSocket { my_channel # (socket) -- connect_to_server() send_data() receive_data() close() } /' Abstract Devices Controllers '/ DeviceControllerAbstract o-- ClientChannel DeviceControllerAbstract <|-- MountPointingControllerAbstract DeviceControllerAbstract <|-- SecurityManagementControllerAbstract DeviceControllerAbstract <|-- DetectorSensorControllerAbstract DeviceControllerAbstract <|-- DetectorShutterControllerAbstract DeviceControllerAbstract <|-- DetectorFocusControllerAbstract DeviceControllerAbstract <|-- FilterSelectorControllerAbstract abstract class DeviceControllerAbstract { my_channel # socket or serial or usb... _cmd = {start, stop, park...} class GenericResult -- {abstract} connect_to_device() {abstract} _format_data_to_send() {abstract} _unformat_received_data() available_commands() execute() execute_generic_cmd() execute_native_cmd() execute_native_cmd() send_data() receive_data() --- **Abstract GET/SET/DO commands :** {abstract} get_timezone(), set_timezone() {abstract} get_date(), set_date() {abstract} get_time(), set_time() {abstract} do_park() {abstract} do_start() {abstract} do_stop() {abstract} do_init() } abstract class MountPointingControllerAbstract { _cmd = {get_ra, get_dec, do_goto...} ---- **Abstract GET/SET/DO commands :** {abstract} get_ack() {abstract} get_ra(), set_ra() {abstract} get_dec(), set_dec() get_radec(), set_radec() {abstract} get_lat(), set_lat() {abstract} get_long(), set_long() {abstract} set_speed() {abstract} do_warm_start() {abstract} do_prec_refr() ---- **Generic MACRO commands:** do_init() do_goto() do_move() } abstract class SecurityManagementControllerAbstract { _cmd = {get_status, set_light...} } abstract class DetectorSensorControllerAbstract { _cmd = {set_pose, do_start_acq...} } /' Concrete Devices Controllers '/ MountPointingControllerAbstract <|-- TelescopeControllerMeade MountPointingControllerAbstract <|-- TelescopeControllerGemini MountPointingControllerAbstract <|-- TelescopeControllerColibri SecurityManagementControllerAbstract <|-- PLCControllerAK SecurityManagementControllerAbstract <|-- PLCControllerColibri DetectorSensorControllerAbstract <|-- CameraControllerCAGIRE DetectorSensorControllerAbstract <|-- CameraControllerDDRAGO DetectorSensorControllerAbstract <|-- SBIGController DetectorShutterControllerAbstract <|-- SBIGController FilterSelectorControllerAbstract <|-- SBIGController SBIGController o-> SBIGSimulator SBIGController <-- AgentDeviceSBIG MountPointingControllerAbstract <|-- DeltaTauController DetectorFocusControllerAbstract <|-- DeltaTauController FilterSelectorControllerAbstract <|-- DeltaTauController class TelescopeControllerGemini { _cmd = {get_ra, get_dec, do_goto...} format_data_to_send() unformat_received_data() } TelescopeControllerMeade : _cmd = {get_ra, get_dec, do_goto...} @enduml