syntax = "proto3";

import "cmvr/api/common.proto";

package cmvr.api;

message FreedomValue {
    int32 id = 1;                 // 自由度id 0-6 分别对应六个自由度 小拇指 无名指 中指 食指 大拇指弯曲 大拇指旋转
    float value = 2;              // 值 0-1百分比
}

message RH56DFTPDexHand {
    int32 dof_id = 1;             // 自由度ID，唯一标识不同的关节或自由度
    int32 angle = 2;              // 自由度角度
    int32 speed = 3;              // 自由度速度
    int32 force = 4;              // 实际受力
    int32 position = 5;           // 执行器位置
    int32 current = 6;            // 执行器实际电流
    int32 temperature = 7;        // 执行器温度
    int32 error = 8;              // 执行器故障信息
    repeated string error_message = 9;  // 错误消息列表
}
// 传感器数据
// 传感器数据
message SensorData {
    // 手指类型（掌心作为特殊类型）
    enum FingerType {
        PINKY = 0;    // 小拇指
        RING = 1;     // 无名指
        MIDDLE_FINGER = 2;   // 中指（避免与PartType.MIDDLE冲突）
        INDEX = 3;    // 食指
        THUMB = 4;    // 大拇指
        PALM = 5;     // 掌心
    }

    // 部位类型（指中改为THUMB_MIDDLE以避免冲突）
    enum PartType {
        TIP = 0;      // 指端
        FINGER = 1;   // 指尖
        PAD = 2;      // 指腹
        THUMB_MIDDLE = 3;  // 大拇指指中（仅大拇指有）
        PALM_PAD = 4;      // 掌心部位（对应PalmTactileData）
    }

    FingerType finger_type = 4;  // 手指类型（掌心使用PALM）
    PartType part_type = 5;      // 部位类型
    string sensor_name = 6;      // 传感器名称（如"小拇指指端"）

    message RowData {
        repeated int32 values = 1 [packed = true];  // 一维数组，存放每行的浮点数值
    }
    repeated RowData data = 1;  // 二维数组，每行数据是 RowData 类型
    int32 rows = 2;             // 行
    int32 cols = 3;             // 列
}


message DexHandState {
    bool is_initialized = 1;      // 是否初始化
    repeated RH56DFTPDexHand hands = 2;  // 包含多个自由度状态
}

message GetDexHandStateCommand {
    message Request {
        CommandHeader.Request header = 1;
    }

    message Feedback {
        CommandHeader.Feedback header = 1;
        DexHandState  state = 2;
    }
}

message SetDexHandPositionsCommand {
    message Request {
        CommandHeader.Request header = 1;
        repeated FreedomValue values = 2;
    }

    message Feedback {
        CommandHeader.Feedback header = 1;
    }
}

message SetDexHandAnglesCommand {
    message Request {
        CommandHeader.Request header = 1;
        repeated FreedomValue values = 2;
    }

    message Feedback {
        CommandHeader.Feedback header = 1;
    }
}

message SetDexHandForceCommand {
    message Request {
        CommandHeader.Request header = 1;
        repeated FreedomValue values = 2;
    }

    message Feedback {
        CommandHeader.Feedback header = 1;
    }
}

message SetDexHandSpeedCommand {
    message Request {
        CommandHeader.Request header = 1;
        repeated FreedomValue values = 2;
    }

    message Feedback {
        CommandHeader.Feedback header = 1;
    }
}

message SetDexHandPresetActCommand {
    message Request {
        CommandHeader.Request header = 1;
        int32 presetActId = 2;
    }

    message Feedback {
        CommandHeader.Feedback header = 1;
    }
}

message GetSensorDataCommand {
    message Request {
        CommandHeader.Request header = 1;
    }

    message Feedback {
        CommandHeader.Feedback header = 1;
        repeated SensorData sensor = 2;//所有传感器的数据
    }
}

message GetSensorDataStreamCommand {
    message Request {
        CommandHeader.Request header = 1;
    }

    message Feedback {
        CommandHeader.Feedback header = 1;
        repeated SensorData sensor = 2;//所有传感器的数据
    }
}