diff --git a/.github/workflows/ci.yml.disabled b/.github/workflows/ci.yml similarity index 97% rename from .github/workflows/ci.yml.disabled rename to .github/workflows/ci.yml index 1d5fd54..a65c2e1 100644 --- a/.github/workflows/ci.yml.disabled +++ b/.github/workflows/ci.yml @@ -18,7 +18,6 @@ jobs: strategy: matrix: idf_version: - - "v5.0" - "v5.4" target: - esp32s3 @@ -38,7 +37,6 @@ jobs: strategy: matrix: idf_version: - - "v5.0" - "v5.4" container: image: espressif/idf:${{ matrix.idf_version }} diff --git a/idf_component.yml b/idf_component.yml index c64206b..5695db6 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -7,4 +7,4 @@ targets: - esp32s3 dependencies: idf: - version: ">=5.0.0" + version: ">=5.4.0" diff --git a/include/cast_itransport.h b/include/cast_itransport.h new file mode 100644 index 0000000..1165c8d --- /dev/null +++ b/include/cast_itransport.h @@ -0,0 +1,59 @@ +/** + * @file cast_itransport.h + */ +#ifndef CAST_ITRANSPORT_H +#define CAST_ITRANSPORT_H + +#include "esp_err.h" +#include +#include + +/** + * @brief CASTトランスポートインタフェース構造体 + * 各通信規格(WiFi, ESP-NOW等)はこの構造体の関数ポインタを実装する + */ +typedef struct { + /** + * @brief パケット送信関数 + * CASTミドルウェアがヘッダを付与し、分割した1チャンクを送信側に渡す + * @param data 送信するデータのポインタ + * @param len データ長 + * @return esp_err_t 送信成否(ESP_OK, ESP_FAILなど) + */ + esp_err_t (*send)(const uint8_t *data, size_t len); + + /** + * @brief 最大ペイロードサイズ(MTU)の取得 + * ミドルウェアはこの値を元に画像を分割するサイズを決定する + * @return size_t 送信可能な最大バイト数 + */ + size_t (*get_mtu)(void); + + /** + * @brief 現在のRSSIを取得する + * @return int16_t RSSI(dBm)。取得不可なら0またはエラー値を返す + */ + int16_t (*get_rssi)(void); + + /** + * @brief 相手とのセッションが確立されているか + * @return true 接続されている / false 接続されていない + */ + bool (*is_connected)(void); + + /** + * @brief 通信路の状態確認 + * 現在、送信可能な状態か(接続済みか等)を返す + * @return true 送信可能 / false 送信不可 + */ + bool (*is_ready)(void); + + /** + * @brief 受信コールバックの登録 + * 下層のドライバがデータを受信した際、ミドルウェアへ渡すための仕組み + * @return esp_err_t 送信成否(ESP_OK, ESP_FAILなど) + */ + esp_err_t (*set_recv_callback)(void (*cb)(const uint8_t *data, size_t len)); +} cast_transport_interface_t; + +#endif /* CAST_ITRANSPORT_H */ \ No newline at end of file diff --git a/justfile b/justfile index 79e8c00..9ccf64b 100644 --- a/justfile +++ b/justfile @@ -5,7 +5,7 @@ TARGET := env("TARGET", "esp32s3") PORT := env("PORT", "/dev/ttyUSB0") # Versions and targets to test -IDF_VERSIONS := env("IDF_VERSIONS", "v5.0 v5.4") +IDF_VERSIONS := env("IDF_VERSIONS", "v5.4") TARGETS := env("TARGETS", "esp32s3") COMPONENT_NAME := env("COMPONENT_NAME", "cast_protocol") diff --git a/src/cast_internal.h b/src/cast_internal.h new file mode 100644 index 0000000..0c4266a --- /dev/null +++ b/src/cast_internal.h @@ -0,0 +1,59 @@ +/** + * @file cast_internal.h + */ +#ifndef CAST_INTERNAL_H +#define CAST_INTERNAL_H + +#include + +#define CAST_MAGIC_BYTE 0xCA // CASTプロトコルの識別用 + +/** + * @brief パケットタイプ(制御/データ) + */ +typedef enum { + CAST_PKT_TYPE_DATA = 0, // 画像チャンク + CAST_PKT_TYPE_ACK = 1, // 受信完了通知 + CAST_PKT_TYPE_NACK = 2, // 再送要求 + CAST_PKT_TYPE_CTRL = 3 // 戦略変更命令 +} cast_packet_type_t; + +/** + * @brief 送信する画像のフォーマット情報 + */ +typedef enum { + CAST_FMT_JPEG = 0, + CAST_FMT_RGB565 = 1, + CAST_FMT_GRAYSCALE = 2, + CAST_FMT_NONE = 255 // 制御パケット用 +} cast_image_format_t; + +/** + * @brief CASTプロトコル共通ヘッダ (11バイト) + * * [フィールド再利用(Overloading)の設計指針] + * プロトコルの軽量化のため、PacketTypeに応じて以下の通り意味を読み替える。 + * * 1. DATA時: すべてのフィールドを定義通り使用。 + * 2. ACK/NACK時: + * - chunk_index: 「どのチャンク」に対する応答かを指定。 + * 特定の番号を入れることで Selective Repeat(選択的再送)を可能にする。 + * (例: NACKかつchunk_index=3なら「3番が欠落した」と解釈) + * - total_chunks: 受信側が現在までに把握している累積のチャンク数などを格納可能。 + * 3. CTRL時: + * - chunk_index / total_chunks: 命令の種類(Sub-Command ID)やパラメータとして再利用。 + * * ※ 無効なフィールドは原則として 0 または CAST_FMT_NONE で埋めること。 + */ +typedef struct { + uint8_t magic; // 0xCA(固定) + uint8_t type; // cast_packet_type_t + uint8_t format; // cast_image_format_t(DATA以外では無視) + uint16_t frame_id; // 対象フレームID + uint16_t chunk_index; // チャンク番号、または応答対象のチャンク番号 + uint16_t total_chunks; // 総チャンク数、または制御用パラメータ + uint16_t payload_len; // このパケットに含まれるデータ長(DATA以外では通常0) + /* @note この後に最大MTU-2のサイズとなるまで実際のデータが入る */ +} __attribute__((packed)) cast_header_t; + +// CRC(2バイト)を考慮したパケット最大オーバーヘッド +#define CAST_PROTOCOL_OVERHEAD (sizeof(cast_header_t) + 2) + +#endif /* CAST_INTERNAL_H */ \ No newline at end of file