Dronecode Devマニュアル抜粋&翻訳 - Driver Development

#この記事は
Dronecode本家サイトの[Driver Development](https://dev.px4.io/master/en/middleware/drivers.html)ページの抜粋・翻訳です。

# Driver Development
PX4のデバイスドライバーは[デバイスドライバーフレームワーク](https://github.com/PX4/Firmware/tree/master/src/lib/drivers/device)に基づいています

## Creating a Driver
PX4はuORBからのデータを独占的に消費します。一般的なペリフェラルタイプのドライバーは、正しいuORBメッセージをPublishする必要があります。(例えば、ジャイロ、加速度計、気圧計など)
新しいドライバーを作成するための最良のアプローチは、同様のドライバー([src/drivers](https://github.com/PX4/Firmware/tree/master/src/drivers)を見てください)をテンプレートとして始めることです。

> 特定のI/Oバスとセンサーに関する詳細情報は、[Sensor and Actuator Buses](https://dev.px4.io/master/en/sensor_bus/)セクションで参照できます。

Note:
> ドライバーが従う必要のある唯一のパターンは、正しいuORBトピックのPublishです。


## Core Architecture
PX4はリアクティブなシステムであり、uORBのPub/Subを使用してメッセージを転送します。ファイルハンドルは、システムのコアオペレーションに必要ないか、使用されません。2つのおもなAPIが利用されます。

1. Pub/Sub機構。PX4が動作するシステムによって、ファイルやネットワーク、メモリ共有のいずれで実現されるかは変わります。
2. グローバルなデバイスレジストリ。これは、デバイスを列挙し、その構成を取得/設定するために使用できます。これは、リンクリストやファイルシステムへのマップと同じくらい簡単です

## Device IDs
PX4はシステム上で各センサーを一意に認識するためにデバイスIDを使用します。
このIDは設定パラメータに保存され、センサーの校正値を適用するために利用されます。また、どのセンサーログがどのログファイルにエントリされるかの決定にも利用されます。

(例えば`/dev/mag0`の代替に`/dev/mag1`がある場合でも)センサーの順番は優先度には影響しません。優先度はuORBのトピック発行の一部として保存されます。

### Decoding example
3つの磁力計の例では、フライトログ（.px4log）を使用してパラメーターをダンプします。
3つのパラメーターはセンサーIDをエンコードし、MAG_PRIMEはプライマリセンサーとして選択されている磁力計を識別します。各MAGx_IDは24ビットの数値であり、手動でデコードするには左にゼロを埋め込む必要があります。

```
CAL_MAG0_ID = 73225.0
CAL_MAG1_ID = 66826.0
CAL_MAG2_ID = 263178.0
CAL_MAG_PRIME = 73225.0
```

これは、アドレス0x1EのI2C、バス1を介して接続された外部HMC5983です。ログファイルにIMU.MagXとして表示されます。

```
# device ID 73225 in 24-bit binary:
00000001  00011110  00001 001

# decodes to:
HMC5883   0x1E    bus 1 I2C
```

これは、SPI、バス1、スレーブ選択スロット5を介して接続された内部HMC5983です。これは、IMU1.MagXとしてログファイルに表示されます。

```
# device ID 66826 in 24-bit binary:
00000001  00000101  00001 010

# decodes to:
HMC5883   dev 5   bus 1 SPI
```

そしてこれは、SPI、バス1、スレーブ選択スロット4を介して接続された内部MPU9250磁力計です。これは、IMU2.MagXとしてログファイルに表示されます。

```
# device ID 263178 in 24-bit binary:
00000100  00000100  00001 010

#decodes to:
MPU9250   dev 4   bus 1 SPI
```

## Device ID Encoding
デバイスIDは以下の形式の24ビットの数値です。最初のフィールドは、上記のデコード例の最下位ビットであることに注意してください。

```
struct DeviceStructure {
  enum DeviceBusType bus_type : 3;
  uint8_t bus: 5;    // バス種別
  uint8_t address;   // バスのアドレス(例：I2Cのアドレス)
  uint8_t devtype;   // デバイス種別を示すデバイスクラス
};
```

`bus_type`は以下のようにデコードされます：

```
enum DeviceBusType {
  DeviceBusType_UNKNOWN = 0,
  DeviceBusType_I2C     = 1,
  DeviceBusType_SPI     = 2,
  DeviceBusType_UAVCAN  = 3,
};
```

`devtype`は以下のようにデコードされます：

```
#define DRV_MAG_DEVTYPE_HMC5883  0x01
#define DRV_MAG_DEVTYPE_LSM303D  0x02
#define DRV_MAG_DEVTYPE_ACCELSIM 0x03
#define DRV_MAG_DEVTYPE_MPU9250  0x04
#define DRV_ACC_DEVTYPE_LSM303D  0x11
#define DRV_ACC_DEVTYPE_BMA180   0x12
#define DRV_ACC_DEVTYPE_MPU6000  0x13
#define DRV_ACC_DEVTYPE_ACCELSIM 0x14
#define DRV_ACC_DEVTYPE_GYROSIM  0x15
#define DRV_ACC_DEVTYPE_MPU9250  0x16
#define DRV_GYR_DEVTYPE_MPU6000  0x21
#define DRV_GYR_DEVTYPE_L3GD20   0x22
#define DRV_GYR_DEVTYPE_GYROSIM  0x23
#define DRV_GYR_DEVTYPE_MPU9250  0x24
#define DRV_RNG_DEVTYPE_MB12XX   0x31
#define DRV_RNG_DEVTYPE_LL40LS   0x32
```

## Debugging
デバッグについての詳細は[Debugging/Logging](https://dev.px4.io/master/en/debug/)を参照してください。

### Verbose Logging
ドライバーやその他のモジュールは、デフォルトでは冗長性が最小限になるようなログ文字列を出力します。
(例えば、 PX4_DEBUG, PX4_WARN, PX4_ERRなど)

ログの冗長性は、ビルド時にRELEASE_BUILD（デフォルト）、DEBUG_BUILD（詳細）、またはTRACE_BUILD（非常に詳細）マクロを使用して定義されます。

CMakeLists.txtでドライバーpx4_add_module関数のCOMPILE_FLAGSを使用してログレベルを変更します。以下のコード抜粋は、単一のモジュールまたはドライバーに対してDEBUG_BUILDレベルのデバッグを有効にするために必要な変更を示しています。

```
px4_add_module(
    MODULE templates__module
    MAIN module
```
```
    COMPILE_FLAGS
        -DDEBUG_BUILD
```
```
    SRCS
        module.cpp
    DEPENDS
        modules__uORB
    )
```

> .cppファイルの最上部（インクルードの前）に#define DEBUG_BUILDを追加することで、ファイルごとに詳細ログを有効にすることもできます。