Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ jobs:
strategy:
matrix:
idf_version:
- "v5.0"
- "v5.4"
target:
- esp32s3
Expand All @@ -38,7 +37,6 @@ jobs:
strategy:
matrix:
idf_version:
- "v5.0"
- "v5.4"
container:
image: espressif/idf:${{ matrix.idf_version }}
Expand Down
2 changes: 1 addition & 1 deletion idf_component.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ targets:
- esp32s3
dependencies:
idf:
version: ">=5.0.0"
version: ">=5.4.0"
59 changes: 59 additions & 0 deletions include/cast_itransport.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/**
* @file cast_itransport.h
*/
#ifndef CAST_ITRANSPORT_H
#define CAST_ITRANSPORT_H

#include "esp_err.h"
#include <stdint.h>
#include <stddef.h>

/**
* @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 */
2 changes: 1 addition & 1 deletion justfile
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
59 changes: 59 additions & 0 deletions src/cast_internal.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/**
* @file cast_internal.h
*/
#ifndef CAST_INTERNAL_H
#define CAST_INTERNAL_H

#include <stdint.h>

#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 */