Skip to content

2 1 API Design

lovyan03 edited this page Apr 1, 2025 · 1 revision

FlexHAL API設計

目次

  1. API設計の基本方針

  2. インターフェース設計

  3. 公開API一覧

  4. FlexHALクラス設計

  5. C言語ラッパー

API設計の基本方針

インターフェースベースの設計

FlexHALはインターフェースベースの設計を采用しています:

  • 共通インターフェース(IGPIO, ISPI, II2Cなど)から派生した複数の実装型を提供
  • ファクトリパターンによる実装の選択
  • 全機能に一貫したパターンを適用

抽象化とネイティブアクセスの両立

  • 抽象化されたインターフェースを通じたアクセス
  • ネイティブ実装への直接アクセスも可能
  • 抽象化によるオーバーヘッドを避けるための設計

インターフェース設計

基本インターフェース

// GPIOインターフェースの例
class IGPIO {
public:
  virtual ~IGPIO() = default;
  virtual void pinMode(uint8_t pin, int mode) = 0;
  virtual void digitalWrite(uint8_t pin, int level) = 0;
  virtual int digitalRead(uint8_t pin) = 0;
  virtual int analogRead(uint8_t pin) = 0;
  virtual void analogWrite(uint8_t pin, int value) = 0;
};

// ピンインターフェースの例
class IPin {
public:
  virtual ~IPin() = default;
  virtual void setMode(int mode) = 0;
  virtual void write(int level) = 0;
  virtual int read() = 0;
};

ファクトリパターン

// GPIOファクトリの例
class GPIOFactory {
public:
  static std::unique_ptr<IGPIO> create(GPIOType type = GPIOType::Default);
  
  enum class GPIOType {
    Default,      // デフォルト(優先順位に基づく)
    Native,       // ネイティブ実装
    Arduino,      // Arduino実装
    ESP_IDF,      // ESP-IDF実装
    Software      // ソフトウェア実装
  };
};

実装の優先順位

デフォルトの実装を選択する場合の優先順位:

  1. ネイティブ実装(最高のパフォーマンス)
  2. フレームワーク実装(ESP-IDFやArduinoなど)
  3. ソフトウェア実装(汎用性が高いがパフォーマンスは低い)

公開API一覧

GPIO関連

namespace flexhal::gpio {
  // Arduino互換インターフェース
  void pinMode(uint8_t pin, int mode);
  void digitalWrite(uint8_t pin, int level);
  int digitalRead(uint8_t pin);
  int analogRead(uint8_t pin);
  void analogWrite(uint8_t pin, int value);
  
  // 拡張インターフェース
  std::unique_ptr<IGPIO> createGPIO(GPIOFactory::GPIOType type = GPIOFactory::GPIOType::Default);
  std::unique_ptr<IPin> createPin(uint8_t pin, GPIOFactory::GPIOType type = GPIOFactory::GPIOType::Default);
}

通信バス関連

namespace flexhal::bus {
  namespace spi {
    // SPIインターフェース
    void begin(uint8_t sck, uint8_t miso, uint8_t mosi, uint8_t cs = -1);
    void end();
    void transfer(uint8_t* buffer, size_t size);
    
    // 拡張インターフェース
    std::unique_ptr<ISPI> createSPI(SPIFactory::SPIType type = SPIFactory::SPIType::Default);
  }
  
  namespace i2c {
    // I2Cインターフェース
    void begin(uint8_t sda, uint8_t scl);
    void end();
    bool write(uint8_t address, uint8_t* data, size_t size);
    bool read(uint8_t address, uint8_t* buffer, size_t size);
    
    // 拡張インターフェース
    std::unique_ptr<II2C> createI2C(I2CFactory::I2CType type = I2CFactory::I2CType::Default);
  }
}

FlexHALクラス設計

シングルトンパターン

class FlexHAL {
public:
  static FlexHAL& instance();
  
  // GPIO関連
  IGPIO* gpio();
  
  // バス関連
  ISPI* spi(uint8_t busNum = 0);
  II2C* i2c(uint8_t busNum = 0);
  
  // ユーティリティ
  ILogger* logger();
  
 private:
  FlexHAL();
  ~FlexHAL();
  // 非コピー化
  FlexHAL(const FlexHAL&) = delete;
  FlexHAL& operator=(const FlexHAL&) = delete;
};

C言語ラッパー

設計方針

将来的なC言語ラッパーの設計方針:

  • C++インターフェースをラップするC言語APIを提供
  • ハンドルベースのインターフェースでオブジェクト指向をシミュレート
  • 初期リリースでは実装せず、将来的な拡張として位置づけ
// C言語ラッパーの例(将来的な実装予定)
#ifdef __cplusplus
extern "C" {
#endif

// GPIOハンドル
typedef struct FlexHAL_GPIO_Handle* FlexHAL_GPIO;

// GPIO関数
FlexHAL_GPIO FlexHAL_GPIO_Create(void);
void FlexHAL_GPIO_Destroy(FlexHAL_GPIO gpio);
void FlexHAL_GPIO_PinMode(FlexHAL_GPIO gpio, uint8_t pin, int mode);
void FlexHAL_GPIO_DigitalWrite(FlexHAL_GPIO gpio, uint8_t pin, int level);
int FlexHAL_GPIO_DigitalRead(FlexHAL_GPIO gpio, uint8_t pin);

#ifdef __cplusplus
}
#endif

最終更新: 2025-04-01