@startuml
!include C4_Component.puml

LAYOUT_WITH_LEGEND()

title Component diagram for for Axem Headset Data Server

Container_Boundary(c1, "Axem Headset Data Server") {
    Component(headset_live_source, "Headset Live Source", "Java", "Receives Headset data and forwards to all needed components")
    Component(headset_capture, "Headset Data Capture", "Java", "Receives Headset data and writes the data to the file system")
    Component(headset_data_reader, "Headset Data Reader", "Java", "Reads Headset data from file")
    Component(headset_data_player, "Headset Data Player", "Java", "Receives stored Headset Data from the local file system, (or remote storage, remote relay), plays that data at correct Hz")
    Component(headset_data_processor, "Headset Data Processor", "Java or C# that wraps C/C++", "Receives headset dataset an exercise set (exercise plus rest period), and processes that dataset")
    Component(headset_data_viewer, "Headset Data Viewer", "Java or C#", "displays headset data (live or static)")
    Component(filesystem, "File System", "exFAT", "Stores Headset Data as protocol buffers")
    Component(filesystem2, "File System", "exFAT", "Stores Headset Data as protocol buffers")
 }
Container(mobile_app, "Mobile App", "Unity, C#", "Provides an interface for the patient to guide exercises, give feedback, show progress, reward efforts, encourage")

System(axem_headset, "Axem Headset", "Monitors Patient Motor Cortex Activity, and forwards fNIRS data.")
System(axem_services, "Axem Service Software System", "Stores all patient data, provides exercises, exercise schedules, processes patient headset data, etc.")

Rel_R(axem_headset, headset_live_source, "sends raw fNIRS data", "Bluetooth")
Rel(headset_capture, filesystem, "Writes to", "protobuf")
Rel(headset_data_viewer, headset_capture, "forwards headset data downstream", "protobuf")
Rel(headset_live_source, headset_data_processor, "sends headset data for processing", "protobuf")
Rel(headset_live_source, mobile_app, "sends headset data for processing", "protobuf")
Rel(headset_live_source, headset_data_viewer, "sends headset data", "protobuf")
Rel(axem_services, headset_data_player, "sends headset data", "protobuf/HTTPS")
Rel(headset_data_reader, headset_data_player, "data from read", "protobuf")
Rel(filesystem2, headset_data_reader, "data from file to", "protobuf")
Rel(headset_data_player, mobile_app, "sends headset data", "protobuf")
Rel(headset_data_player, headset_data_processor, "sends headset data for processing", "protobuf")
Rel(headset_data_processor, mobile_app, "sends headset data", "protobuf")
Rel(headset_data_processor, axem_services, "sends headset data", "protobuf/HTTPS")
Rel(mobile_app, axem_services, "Sends data to, and receives data from", "protobuf/HTTPS")

@enduml
