@startuml
title <b>Mythen2Detector - Class Diagram  - 2017/12/01</b>\n

skinparam classFontSize 13

'----------------------------------------------------------------------------
package "Frames" #DDDDDD {
class AcquisitionData {
Contains several
data frames 
..
}
}

'----------------------------------------------------------------------------
package "Flatfield files" #DDDDDD {
class Flatfield {
Needed to
load and save
flatfield files 
}
}

Flatfield  -->  Controller : get modules info
Controller --> Flatfield : load and save flatfield files

'----------------------------------------------------------------------------
package "Hardware communication" #DDDDDD {

class Cmd {
  +m_cmd
  +m_description
  +m_float_return_type
}

class Com {
  + {abstract} connect()
  + {abstract} disconnect()
  + {abstract} command()
}

class ComSim {
  +connect()
  +disconnect()
  +command()
}

class ComNet {
  +connect()
  +disconnect()
  +command()
}

Com <|-- ComSim
Com <|-- ComNet
Com o---left "n" Cmd : contains
}

'----------------------------------------------------------------------------
package "Stream management" #DDDDDD {

class Stream {
  + {abstract} update()
}

class StreamNo {
  +update()
}

class StreamCsv {
  +update()
}

class StreamLog {
  +update()
}

class StreamNexus {
  +update()
}

Stream <|---right StreamNo
Stream <|---down StreamCsv
Stream <|---down StreamLog
Stream <|---down StreamNexus
Stream --> AcquisitionData : use
}

Stream -- Controller : get modules info

'----------------------------------------------------------------------------
package "Collect camera data" #DDDDDD {
class CollectTask {
}

CollectTask -right--> Com : use
CollectTask o-- "1" AcquisitionData : last aquisition data
}

'----------------------------------------------------------------------------

class DeviceTask {
}
DeviceTask <|-- Controller

'----------------------------------------------------------------------------
package "Frames treatment" #DDDDDD {
class DataTask {
std::list<AcquisitionData> m_data_list
}

DeviceTask <|-- DataTask

DataTask --> Controller : update_stream()
DataTask o-- "n" AcquisitionData : contains a list
}

'----------------------------------------------------------------------------
class Controller {
}
Controller --> CollectTask : use
Controller --> CollectTask : collect()
Controller --> Stream : update(acquisition_data)
Controller -down--> DataTask : add_acquisition_data()

'----------------------------------------------------------------------------
package "TANGO" #DDDDDD {
class Mythen2Detector {
}
Mythen2Detector -down--> Controller : use
}
'----------------------------------------------------------------------------

@enduml