@startuml

skinparam backgroundColor #FEFEFE

box "Application" #0091BD
participant "main()" as main
end box

box "Driver library" #00C1DE
participant "Device" as ddev
participant "Buffer" as dbuf
participant "Network" as dnet
participant "Inference" as dinf
end box

box "Kernel driver" #7D868C
participant "Device" as kdev
participant "Buffer" as kbuf
participant "Network" as knet
participant "Inference" as kinf
participant "Mailbox" as kmbox
end box

box "Cortex-M application" #E5ECEB
participant "Message process" as cmsg
end box

activate main

note over main
    Create device
    Create network
    Allocate and fill IFM buffers
    Allocate OFM buffers
end note

main -> dinf++: Inference(network, ifm, ofm)
    dinf -> knet++: ioctl(INFERENCE_CREATE, network, ifm, ofm)
        note over kinf
            Create inference
        end note

        knet -> kinf++: create(network, ifm, ofm)
            kinf -> kmbox++: inference()
                note over kmbox
                    Write inference request to queue in shared memory
                    Send IRQ
                end note

                kmbox -> cmsg: INFERENCE_REQUEST
            return
        return file descriptor
    return file descriptor
return

main -> dinf++: wait()
    dinf -> kinf++: poll()

    cmsg -> kdev++: INFERENCE_RESPONSE
        note over kdev
            Inference response is handled by the IRQ bottom handler thread
            Message is read from queue in shared memory
        end note

        kdev -> kmbox++: read()
        return

        note over kinf
            Inference response handler unlocks the polling thread
        end note

        kdev -> kinf++: inference_response()
        return
    deactivate cmsg

    return
return

@enduml
