-
Notifications
You must be signed in to change notification settings - Fork 1
2 1 API Design
lovyan03 edited this page Apr 1, 2025
·
1 revision
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 // ソフトウェア実装
};
};デフォルトの実装を選択する場合の優先順位:
- ネイティブ実装(最高のパフォーマンス)
- フレームワーク実装(ESP-IDFやArduinoなど)
- ソフトウェア実装(汎用性が高いがパフォーマンスは低い)
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);
}
}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言語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