アプリケーション内でのデバイスの扱い

この文書ではアプリケーションが、実行時に自身のコンテナにマウントされているデバイスを知るための方法と、そのときのフォーマットについて記述します。

背景と目的 #

Actcast Agent がアプリケーションを起動する際、アプリケーションが事前に用意したマニフェストに基いてコンテナにデバイスをマウントします。このとき、いくつかの理由でアプリケーション内から実行時にマウントされたデバイスファイルの詳細を取得できると便利です。

  • マニフェストとコードで同じファイル名を 2 回書かなくて済む
  • コードがマニフェストに依存しなくなり再利用性が上がる
  • マニフェスト V2 ではデバイスファイルを省略できるケースがあるので実行時に詳細を取得する必要がある。

Actcast Agent 及び Actsim ではこのための仕組みを提供しています。

取得方法 #

アプリケーション実行時に DEVICE_SUPPLY_PATH 環境変数が設定されています。 このパスにある JSON ファイルにマウントされているデバイスの詳細が記述されているのでこれを読み出すことで情報が得られます。

actfw-core を利用している場合は get_device_supply() 関数で詳細を取得できます。

ファイルフォーマット #

JSON 形式で以下のようなフォーマットをします。

{
  "devices": [
    {
      "type": "<DEVICE TYPE>",
      "nodes": [
        {"path": "<DEVICE PATH>", "label": "<LABEL>"},
        ...
      ]
    },
    ...
  ]
}

ここで、それぞれのプレースホルダは以下のような意味です。

  • DEVICE TYPE: マニフェストで設定されたデバイスタイプ。具体的にはマニフェストを参照。
  • DEVICE PATH: 実際のデバイスのパス。マニフェストで具体的なパスが記述されていたものも含める。
  • LABEL: 省略可。デバイスタイプにおけるそのデバイスが持つ役割などが書かれる。

具体例 #

デフォルトマニフェスト #

以下のようなマニフェストを書いたとします。

{
  "boards": [
    "RSPi1A",
    "RSPi1B",
    "RSPi1APlus",
    "RSPi1BPlus",
    "RSPi2B",
    "RSPiAlpha",
    "RSPiCM1",
    "RSPi3B",
    "RSPiZero",
    "RSPiCM3",
    "RSPiZeroW",
    "RSPi3BPlus",
    "RSPi3APlus",
    "RSPiCM3Plus",
    "RSPiZero2W"
  ],
  "devices": [
    {
      "type": "camera",
      "device": [
        "/dev/video0"
      ]
    },
    {
      "type": "videocore",
      "device": [
        "/dev/vcsm",
        "/dev/vcio",
        "/dev/vc-mem",
        "/dev/vchiq",
        "/dev/gpiomem"
      ]
    },
    {
      "type": "framebuffer",
      "device": [
        "/dev/fb0"
      ]
    }
  ]
}

すると以下のようなデバイス提供情報がアプリケーションから読み出せます。

{
  "devices": [
    {
      "type": "camera",
      "nodes": [{"path": "/dev/video0"}]
    },
    {
      "type": "videocore",
      "nodes": [
        {"path": "/dev/vcsm"},
        {"path": "/dev/vcio"},
        {"path": "/dev/vc-mem"},
        {"path": "/dev/vchiq"},
        {"path": "/dev/gpiomem"}
      ]
    },
    {
      "type": "framebuffer",
      "nodes": [{"path":"/dev/fb0"}]
    }
  ]
}

マニフェスト V2 における省略記法 #

以下のようなマニフェストを書いたとします。

{
  "version": 2,
  "boards": [
      "RSPi4B"
  ],
  "target_type": "raspberrypi-buster",
  "devices": [
    {"type": "camera"},
    {"type": "display"}
  ]
}

すると以下のようなデバイス提供情報がアプリケーションから読み出せます。

{
  "devices": [
    {
      "type": "camera",
      "nodes": [{"path": "/dev/video0", "label": "image_source"}]
    },
    {
      "type": "display",
      "nodes": [{"path":"/dev/vchiq"}]
    }
  ]
}

Actcast SDKリファレンスマニュアル に戻る