@startuml

'''''''''''''''''''
' Syntax reminder '
'''''''''''''''''''
'
' <|-- ' Extension
'  *-- ' Composition
'  o-- ' Agregation
'
' Orientation of the links:
'   2 dashes: vertical
'   1 dash: horizontal


''''''''''''''
' Parameters '
''''''''''''''

hide empty members

title (Somewhat simplified) OwlPS Positioner's class diagram


''''''''''''''
' Executable '
''''''''''''''

class "owlps-positionerd" as owlps_positionerd << (X, orchid) executable >>

owlps_positionerd *-- Positioning


'''''''''''''''''''''
' Utilitary classes '
'''''''''''''''''''''

' Note: for the sake of clarity, PosUtil and posexcept are not
' associated with the other classes, but they should actually be
' linked with pretty much all of them.

package "Utilitary classes" {
  class PosUtil << static >>
  note top
    The functions of <i>PosUtil</i> are
    used by too many classes to
    link them all in this diagram
  end note

  class posexcept
  note bottom
    <i>posexcept</i> is the super-class of
    a bunch of exception classes that
    do not appear in this diagram
  end note

  ' Text file reading and writing
  class TextFileWriter
  class TextFileReader
  CSVFileReader <|-- TextFileReader
}


'''''''''''''''''''''''''
' Configuration classes '
'''''''''''''''''''''''''

package "Configuration classes" {
  class Configuration << static >>
  UserInterface ..> Configuration
}

owlps_positionerd *-- UserInterface
Configuration <.. Positioning


''''''''''''''''''''''
' Data input classes '
''''''''''''''''''''''

package "Data input classes" {
  class InputDataReader
  MobilesReaderCSV       <.. InputDataReader
  CapturePointsReaderCSV <.. InputDataReader
  TopologyReaderCSV      <.. InputDataReader
}

owlps_positionerd *--  InputDataReader
UserInterface      --> InputDataReader

CSVFileReader <-- MobilesReaderCSV
CSVFileReader <-- CapturePointsReaderCSV
CSVFileReader <-- TopologyReaderCSV


'''''''''''''''''
' Input classes '
'''''''''''''''''

package "Input classes" {
  class Input

  abstract InputMedium --*  Input
  InputCSV             --|> InputMedium
  InputUDPSocket       --|> InputMedium

  abstract InputLogMedium --*  Input
  InputLogCSV             --|> InputLogMedium
}

Input        --* Positioning
InputMedium <--  InputDataReader

CSVFileReader  <-- InputCSV
TextFileWriter <-- InputLogCSV


'''''''''''''''''''''''''''''''''
' Positioning algorithm classes '
'''''''''''''''''''''''''''''''''

package "Positioning algorithm classes" {
  abstract PositioningAlgorithm

  RealPosition                     --|> PositioningAlgorithm

  abstract TrilaterationAlgorithm  --|> PositioningAlgorithm
  InterlinkNetworks                --|> TrilaterationAlgorithm
  FBCM                             --|> TrilaterationAlgorithm
  abstract TrilaterationMethod    <--   TrilaterationAlgorithm
  MinMax                           --|> TrilaterationMethod

  abstract CartographyAlgorithm    --|> PositioningAlgorithm
  NSS                              --|> CartographyAlgorithm

  FRBHMBasic                       --|> FBCM
  FRBHMBasic                       --|> NSS
}

PositioningAlgorithm <.. Positioning


''''''''''''''''''
' Output classes '
''''''''''''''''''

package "Output classes" {
  class Output
  abstract OutputMedium        --*  Output
  OutputCSV                    --|> OutputMedium
  OutputTerminal               --|> OutputMedium
  abstract OutputNetworkSocket --|> OutputMedium
  OutputUDPSocket              --|> OutputNetworkSocket
  OutputTCPSocketEvAAL         --|> OutputNetworkSocket
}

Output          --* Positioning
TextFileWriter <--  OutputCSV


''''''''''''''''
' Data classes '
''''''''''''''''

package "Data classes" {
  class Stock << static >>

  ' Points
  class Point3D
  Waypoint        --|> Point3D
  ReferencePoint  --|> Point3D
  ReferencePoint  --o  Stock

  ' Deployment area
  Building --o Stock
  Area     --o Building
  Waypoint --o Stock
  Waypoint -- Area
  Waypoint -- Building

  ' Devices
  WifiDevice   <|--  Mobile
  Mobile         --o Stock
  WifiDevice   <|--  CapturePoint
  CapturePoint   --o Stock

  ' Requests & results
  Request            <--   InputMedium
  Mobile             <--   Request
  Timestamp           --*  Request
  Measurement         --*  Request
  Measurement         --   CapturePoint
  Result              --   Request
  Result             *--   Point3D
  ResultList         *--   Result
  CalibrationRequest  --|> Request
  ReferencePoint      --   CalibrationRequest
  Direction           --*  CalibrationRequest
}

owlps_positionerd o-- Stock
ReferencePoint    <-- Positioning
ResultList        <-- Output


@enduml

' vim: tw=0
