@startuml
file "Client Coap" as global{
    component "Superviseur" as super

    [Parseur] <<function>> as par
    [Lexeur] <<function>> as lex

    component "Session" <<Thread>> as session {
        () "Socket UDP" as s_udp
        () "Session handle" as h_session
        queue "Buffer" as file_attente
        [Gestionaire\nde la session] <<main>> as main_sess
        h_session - main_sess
        
        file_attente <. main_sess : use

        component "Communication" <<Thread>> as th_com{
            [timer]
            [Gestionaire\ndu message] <<main>> as main_msg
            main_msg ..> timer : use
            main_msg --> s_udp : packet udp
            main_msg <-- s_udp : aquitement\n&\nréponse
        }
        
        component "Apprentissage" <<Thread>> as th_appr{
            stack "buffer\nd'experience" as buff
            [NN]
            [optimiseur]
            [horloge] <<interuption>>

            buff -down-> optimiseur : expérience
            optimiseur -down-> NN : met à jour
            horloge -> optimiseur : déclanche
        }

        main_sess ..> th_com : Instancie
        main_sess --> main_msg : Requette\n&\nRTO
        main_msg --> main_sess : Réponse\n&\ninfo liaison

        main_sess --> buff : transition
        main_sess ..> NN : use

        note left of th_com
            Une instance par message
        end note
    }
    note left of session 
        Une instance par capteur
    end note

}

file "UDP" <<lib>> as lib_udp
file "Tensorflow\nKeras" <<Module>> as lib_ia
main_msg ..> par : use
main_msg ..> lex : use
s_udp .down.> lib_udp : use
th_appr .down.> lib_ia : use

:acteur:
acteur --( h_session
@enduml