{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:orbiplex:schema:sensorium-biosignal-stream-descriptor:v1",
  "title": "sensorium-biosignal-stream-descriptor.v1",
  "description": "Backend-neutral stream layout. Signal rows must be unique, in range and disjoint from source time, package number and marker rows. Metadata describes layout, not observed activation. Unknown units and counter semantics are explicit until qualified by a profile.",
  "x-dia-workflow": "project",
  "x-dia-status": "draft",
  "x-dia-basis": [
    "doc/project/40-proposals/096-sensorium-brainflow-connector.md"
  ],
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema",
    "schema/v",
    "stream/id",
    "backend/preset",
    "source/rows",
    "channels",
    "rate/nominal",
    "source-time/row",
    "package-num/row",
    "marker/row",
    "package-num/semantics"
  ],
  "properties": {
    "schema": {
      "const": "sensorium-biosignal-stream-descriptor.v1"
    },
    "schema/v": {
      "const": 1
    },
    "stream/id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
    },
    "backend/preset": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
    },
    "source/rows": {
      "type": "integer",
      "minimum": 1,
      "maximum": 32
    },
    "channels": {
      "type": "array",
      "minItems": 1,
      "maxItems": 32,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "signal/kind",
          "unit",
          "source/row"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
          },
          "signal/kind": {
            "enum": [
              "eeg",
              "ecg",
              "emg",
              "eog",
              "accelerometer",
              "gyroscope",
              "ppg",
              "eda",
              "temperature",
              "resistance",
              "battery",
              "other"
            ]
          },
          "unit": {
            "enum": [
              "unknown",
              "uV",
              "g",
              "deg/s",
              "native-count"
            ]
          },
          "source/row": {
            "type": "integer",
            "minimum": 0,
            "maximum": 31
          }
        }
      }
    },
    "rate/nominal": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "numerator",
        "denominator"
      ],
      "properties": {
        "numerator": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        "denominator": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        }
      }
    },
    "source-time/row": {
      "type": "integer",
      "minimum": 0,
      "maximum": 31
    },
    "package-num/row": {
      "type": "integer",
      "minimum": 0,
      "maximum": 31
    },
    "marker/row": {
      "type": "integer",
      "minimum": 0,
      "maximum": 31
    },
    "package-num/semantics": {
      "enum": [
        "unknown",
        "per-sample",
        "repeated-packet"
      ]
    }
  }
}
