asyncapi: 2.6.0
info:
  title: MAVLink FTP
  version: MAVLink v1/v2 FILE_TRANSFER_PROTOCOL (msg 110)
  description: 'File transfer nested inside a normal MAVLink message: every FTP packet,
    of whatever kind, is the SAME outer message type, distinguished only by an inner
    opcode/offset/session sub-header.'
servers:
  serial_link:
    url: serial://tty/115200
    protocol: serial
    description: Physical UART Transport (115200 bps, 8N1.0)
    bindings:
      serial:
        baudRate: 115200
        dataBits: 8
        parity: none
        stopBits: 1.0
        framingType: binary
        integrity: custom
channels:
  omniuart/cmd/FTP_OpenFileRO:
    publish:
      summary: 'Send command FTP_OpenFileRO (ID: 0x04)'
      description: Opens a file for reading; the ack (FTP_Ack) returns a session id
        that scopes every subsequent read against this open file.
      message:
        name: FTP_OpenFileRO_Message
        title: FTP_OpenFileRO Command
        payload:
          $ref: '#/components/schemas/FTP_OpenFileRO_Request'
  omniuart/cmd/FTP_BurstReadFile:
    publish:
      summary: 'Send command FTP_BurstReadFile (ID: 0x0F)'
      description: Requests the server stream the file from offset onward, without
        individual acks per chunk, until burstComplete is set on the final FTP_Ack.
      message:
        name: FTP_BurstReadFile_Message
        title: FTP_BurstReadFile Command
        payload:
          $ref: '#/components/schemas/FTP_BurstReadFile_Request'
  omniuart/telemetry/FTP_Ack:
    subscribe:
      summary: 'Unsolicited telemetry message FTP_Ack (ID: 0x80)'
      description: Every burst-read data packet is this same message, distinguished
        only by offset (where this chunk goes) and burstComplete (whether more are
        coming) -- there is no separate 'initial'/'follow-on' message name the way
        G460 or XMODEM have.
      message:
        name: FTP_Ack_Telemetry_Message
        title: FTP_Ack Telemetry
        payload:
          $ref: '#/components/schemas/FTP_Ack_Telemetry'
  omniuart/telemetry/FTP_Nak:
    subscribe:
      summary: 'Unsolicited telemetry message FTP_Nak (ID: 0x81)'
      description: 'Unsolicited telemetry message from device: FTP_Nak'
      message:
        name: FTP_Nak_Telemetry_Message
        title: FTP_Nak Telemetry
        payload:
          $ref: '#/components/schemas/FTP_Nak_Telemetry'
components:
  messages: {}
  schemas:
    FTP_OpenFileRO_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: 4
          description: Opcode ID for FTP_OpenFileRO
        seq:
          type: integer
        sysId:
          type: integer
        compId:
          type: integer
        msgId:
          type: integer
          default: 110
        seqNumber:
          type: integer
        session:
          type: integer
          default: 0
        opcode:
          type: string
          enum:
          - '4'
          - '15'
          - '128'
          - '129'
          default: 4
        size:
          type: integer
        reqOpcode:
          type: integer
          default: 0
        burstComplete:
          type: integer
          default: 0
        padding:
          type: integer
          default: 0
        offset:
          type: integer
          default: 0
        path:
          type: string
      description: Opens a file for reading; the ack (FTP_Ack) returns a session id
        that scopes every subsequent read against this open file.
    FTP_BurstReadFile_Request:
      type: object
      properties:
        command_id:
          type: integer
          const: 15
          description: Opcode ID for FTP_BurstReadFile
        seq:
          type: integer
        sysId:
          type: integer
        compId:
          type: integer
        msgId:
          type: integer
          default: 110
        seqNumber:
          type: integer
        session:
          type: integer
        opcode:
          type: string
          enum:
          - '4'
          - '15'
          - '128'
          - '129'
          default: 15
        size:
          type: integer
        reqOpcode:
          type: integer
          default: 0
        burstComplete:
          type: integer
          default: 0
        padding:
          type: integer
          default: 0
        offset:
          type: integer
      description: Requests the server stream the file from offset onward, without
        individual acks per chunk, until burstComplete is set on the final FTP_Ack.
    FTP_Ack_Telemetry:
      type: object
      properties:
        seq:
          type: integer
        sysId:
          type: integer
        compId:
          type: integer
        msgId:
          type: integer
          default: 110
        seqNumber:
          type: integer
        session:
          type: integer
        opcode:
          type: string
          enum:
          - '4'
          - '15'
          - '128'
          - '129'
          default: 128
        size:
          type: integer
        reqOpcode:
          type: integer
        burstComplete:
          type: integer
        padding:
          type: integer
          default: 0
        offset:
          type: integer
        data:
          type: string
          contentEncoding: base64
      description: Every burst-read data packet is this same message, distinguished
        only by offset (where this chunk goes) and burstComplete (whether more are
        coming) -- there is no separate 'initial'/'follow-on' message name the way
        G460 or XMODEM have.
    FTP_Nak_Telemetry:
      type: object
      properties:
        seq:
          type: integer
        sysId:
          type: integer
        compId:
          type: integer
        msgId:
          type: integer
          default: 110
        seqNumber:
          type: integer
        session:
          type: integer
        opcode:
          type: string
          enum:
          - '4'
          - '15'
          - '128'
          - '129'
          default: 129
        size:
          type: integer
        reqOpcode:
          type: integer
        burstComplete:
          type: integer
          default: 0
        padding:
          type: integer
          default: 0
        offset:
          type: integer
        errorCode:
          type: integer
      description: Device-initiated telemetry payload for FTP_Nak
