E-DRIVE / Protocol / Structs

Modified : 2020.1.13


데이터 송수신 시에 사용하는 구조체들을 소개합니다.



Protocol::Header

헤더

데이터 송수신 시에 사용하는 헤더입니다.

namespace Protocol
{
    struct Header
    {
        u8      dataType;       // 데이터의 형식
        u8      length;         // 데이터의 길이
        u8      from;           // 데이터를 전송하는 장치의 DeviceType
        u8      to;             // 데이터를 수신하는 장치의 DeviceType
        
    };
}
변수 이름 형식 크기 범위 설명
dataType Protocol::DataType::Type 1 Byte - 데이터의 타입
length uint8_t 1 Byte 0 ~ 255 데이터의 길이
from Protocol::DeviceType::Type 1 Byte - 데이터를 전송하는 장치
to Protocol::DeviceType::Type 1 Byte - 데이터를 수신하는 장치



Protocol::Ping

Ping

특정 장치가 존재하는지를 확인할 때 사용합니다. 응답은 Ack를 받습니다.

namespace Protocol
{
    struct Ping
    {
        u64     systemTime;   // Ping을 전송하는 장치의 시각
    };
}
변수 이름 형식 크기 범위 설명
systemTime uint64_t 8 Byte - 시스템 시간



Protocol::Ack

응답

특정한 데이터를 요청하지 않은 경우에 Ack를 응답으로 전송합니다. 수신 받은 데이터의 crc16을 포함하여 돌려보내기 때문에 데이터를 전송한 측에서 정상적으로 데이터를 전송했는지 판별하는데 사용합니다.

namespace Protocol
{
    struct Ack
    {
        u64     systemTime;     // 수신 받은 시간
        u8      dataType;       // 수신 받은 데이터 타입
        u16     crc16;          // 수신 받은 데이터의 crc16
    };
}
변수 이름 형식 크기 범위 설명
systemTime uint64_t 8 Byte - 시스템 시간
dataType Protocol::DataType::Type 1 Byte - 수신 받은 데이터 타입
crc16 uint16_t 2 Byte - 수신 받은 헤더와 데이터의 CRC16 값



Protocol::Error

오류

드론에 문제가 생긴 경우 Error 구조체를 600ms에 한 번 송신합니다.

errorFlagsForSensor와 errorFlagsForState는 각각의 값에 해당하는 플래그를 조합하여 여러 오류들이 동시에 발생하는 것을 표시합니다.

문제가 완전히 없어진 경우 Error 플래그를 0으로 초기화하여 추가로 5회 전송 후 전송을 중단합니다.

namespace Protocol
{
    struct Error
    {
        u64     systemTime;             // 에러 메세지 송신 시각
        u32     errorFlagsForSensor;    // 센서 오류 플래그
        u32     errorFlagsForState;     // 상태 오류 플래그
    };
}
변수 이름 형식 크기 범위 설명
systemTime uint64_t 8 Byte - 시스템 시간
errorFlagsForSensor ErrorFlagsForSensor::Type 4 Byte - 센서 오류 플래그 조합
errorFlagsForState ErrorFlagsForState::Type 4 Byte - 상태 오류 플래그 조합



Protocol::Request

데이터 요청

namespace Protocol
{
    struct Request
    {
        u8      dataType;          // 요청할 데이터 타입
    };
}
변수 이름 형식 크기 범위 설명
dataType Protocol::DataType::Type 1 Byte - 요청할 데이터 타입



Protocol::Address

장치 주소(고유번호)

namespace Protocol
{
    struct Address
    {
        u8   address[16];
    };
}
변수 이름 형식 크기 범위 설명
address uint8_t Array 16 Byte - 장치 주소



Protocol::Information

펌웨어 정보

namespace Protocol
{
    struct Information
    {
        u8      modeUpdate;     // 업데이트 모드

        u32     modelNumber;    // 모델 번호
        u32     version;        // 현재 펌웨어의 버전

        u16     year;           // 빌드 년
        u8      month;          // 빌드 월
        u8      day;            // 빌드 일
    };
}
변수 이름 형식 크기 범위 설명
modeUpdate Mode::Update::Type 1 Byte - 업데이트 모드
modelNumber ModelNumber::Type 4 Byte - 모델 번호
version Protocol::Version 4 Byte - 펌웨어의 버전
year uint16_t 2 Byte - 펌웨어 빌드 년
month uint8_t 1 Byte - 펌웨어 빌드 월
day uint8_t 1 Byte - 펌웨어 빌드 일



Protocol::InformationCC2541

BLE(Bluetooth Low Energy) 통신 칩의 펌웨어 정보

namespace Protocol
{
    struct InformationCC2541
    {
        u8      modeUpdate;     // 업데이트 모드

        u32     modelNumber;    // 모델 번호
        u32     version;        // 현재 펌웨어의 버전

        u16     year;           // 빌드 년
        u8      month;          // 빌드 월
        u8      day;            // 빌드 일

        u8      imageType;      // 이미지 타입
    };
}
변수 이름 형식 크기 범위 설명
modeUpdate Mode::Update::Type 1 Byte - 업데이트 모드
modelNumber ModelNumber::Type 4 Byte - 모델 번호
version Protocol::Version 4 Byte - 펌웨어의 버전
year uint16_t 2 Byte - 펌웨어 빌드 년
month uint8_t 1 Byte - 펌웨어 빌드 월
day uint8_t 1 Byte - 펌웨어 빌드 일
imageType ImageType::Type 1 Byte - 이미지 타입



Protocol::Version

펌웨어 버전

버전 비교 시 v 값으로 비교할 수 있도록 struct 내부의 변수 배치 순서를 다른 구조체들과 다르게 역순으로 배열하였습니다.

namespace Protocol
{
    union Version
    {
        struct
        {
            u16     build;      // Build Number
            u8      minor;      // Minor Number
            u8      major;      // Major Number
        };

        u32 v;
    };
}
변수 이름 형식 크기 범위 설명
build uint16_t 14 bit 0 ~ 65535 빌드 번호
minor uint8_t 1 Byte 0 ~ 255 부 번호
major uint8_t 1 Byte 0 ~ 255 주 번호
v uint32_t 4 Byte - build, minor, major를 하나로 묶은 것



Control::Double8

조종

namespace Control
{
    struct Double8
    {
        s8      accel;      // accel
        s8      wheel;      // wheel
    };
}
변수 이름 형식 크기 범위 설명 음수 값(-) 양수 값(+)
accel int8_t 1 Byte -100 ~ 100 전후 후방 전방
wheel int8_t 1 Byte -100 ~ 100 좌우 좌측 우측



Control::Double8AndRequestData

조종 및 데이터 요청

조종 명령 시 응답 데이터로 Ack 대신 요청한 데이터를 응답으로 보내게 함.

namespace Control
{
    struct Double8AndRequestData
    {
        s8      accel;      // accel
        s8      wheel;      // wheel

        u8      dataType;   // DataType
    };
}
변수 이름 형식 크기 범위 설명 음수 값(-) 양수 값(+)
accel int8_t 1 Byte -100 ~ 100 전후 후방 전방
wheel int8_t 1 Byte -100 ~ 100 좌우 좌측 우측
dataType Protocol::DataType::Type - 1 Byte 요청할 데이터 타입 - -



Control::PositionDriveMove

이동

namespace Control
{
    struct PositionDriveMove
    {
        float       positionX;              // meter
        float       positionY;              // meter
        float       velocity;               // m/s
    };
}
변수 이름 형식 크기 범위 단위 설명
positionX float 4 Byte -10.0 ~ 10.0 meter 앞(+), 뒤(-)
positionY float 4 Byte -10.0 ~ 10.0 meter 좌(+), 우(-)
velocity float 4 Byte 0.0 ~ 5.0 m/s 앞뒤 이동 속도



Control::PositionDriveHeading

제자리 회전

namespace Control
{
    struct PositionDriveHeading
    {
        float       heading;                // degree
        float       rotationalVelocity;     // deg/s
    };
}
변수 이름 형식 크기 범위 단위 설명
heading float 4 Byte -360.0 ~ 360.0 degree 반시계방향(+), 시계방향(-)
rotationalVelocity float 4 Byte 10.0 ~ 180.0 degree/s 좌우 회전 속도



Protocol::Command::Command

설정 변경

namespace Protocol
{
    namespace Command
    {
        struct Command
        {
            u8      commandType;   // 명령 타입
            u8      option;        // 명령에 대한 옵션
        };
    }
}
변수 이름 형식 크기 범위 설명
commandType Protocol::CommandType::Type 1 Byte - 명령 타입
option Mode::Drone::Type 1 Byte - 옵션
  System::DriveEvent::Type   -  
  uint8_t   -  



Protocol::Command::LightEvent

설정 변경 + LED 이벤트

namespace Protocol
{
    namespace Command
    {
        struct LightEvent
        {
            Protocol::Command::Command      command;
            Protocol::Light::Event          event;
        };
    }
}
변수 이름 형식 크기 범위 설명
command Protocol::Command::Command 2 Byte - 명령
event Protocol::Light::Event 4 Byte - LED 이벤트



Protocol::Command::LightEventColor

설정 변경 + LED 이벤트(RGB)

namespace Protocol
{
    namespace Command
    {
        struct LightEventColor
        {
            Protocol::Command::Command      command;
            Protocol::Light::Event          event;
            Light::Color                    color;
        };
    }
}
변수 이름 형식 크기 범위 설명
command Protocol::Command::Command 2 Byte - 명령
event Protocol::Light::Event 4 Byte - LED 이벤트
color Light::Color 3 Byte - LED RGB 색상



Protocol::Command::LightEventColors

설정 변경 + LED 이벤트(Palette)

namespace Protocol
{
    namespace Command
    {
        struct LightEventColors
        {
            Protocol::Command::Command      command;
            Protocol::Light::Event          event;
            u8                              colors;
        };
    }
}
변수 이름 형식 크기 범위 설명
command Protocol::Command::Command 2 Byte - 명령
event Protocol::Light::Event 4 Byte - LED 이벤트
colors Light::Colors::Type 1 Byte - LED 팔레트 인덱스



Protocol::RawMotion

Motion 센서 RAW 데이터

namespace Protocol
{
    struct RawMotion
    {
        s16     accX;
        s16     accY;
        s16     accZ;
        
        s16     gyroRoll;
        s16     gyroPitch;
        s16     gyroYaw;
    };
}
변수 이름 형식 크기 범위 설명
accelX int16_t 2 Byte -32,768 ~ 32,767 가속도 X
accelY int16_t 2 Byte -32,768 ~ 32,767 가속도 Y
accelZ int16_t 2 Byte -32,768 ~ 32,767 가속도 Z
gyroRoll int16_t 2 Byte -32,768 ~ 32,767 자이로 Roll
gyroPitch int16_t 2 Byte -32,768 ~ 32,767 자이로 Pitch
gyroYaw int16_t 2 Byte -32,768 ~ 32,767 자이로 Yaw



Protocol::RawLineTracer

라인트레이서 RAW 데이터

namespace Protocol
{
    struct RawLineTracer
    {
        s16         frontH;         // Front H raw data
        s8          frontS;         // Front S raw data
        s8          frontV;         // Front V raw data
        
        u8          sequence;       // 시퀀스
        s8          accel;          // accel
        s8          wheel;          // wheel
        
        u8          color;          // color
    };
}
변수 이름 형식 크기 범위 설명
frontH uint16_t 2 Byte 0 ~ 360 Front H raw data
frontS int8_t 1 Byte   Front S raw data
frontV int8_t 1 Byte   Front V raw data
sequence uint8_t 1 Byte   시퀀스
accel int8_t 1 Byte   accel
wheel int8_t 1 Byte   wheel
color uint8_t 1 Byte   color



Protocol::State

현재 상태

namespace Protocol
{
    struct State
    {
        u8      modeDrone;      // 드론 동작 모드
        u8      modeDrive;      // 주행 모드
        
        u16     irFrontLeft;    // 정면 좌측 거리센서
        u16     irFrontRight;   // 정면 우측 거리센서
        
        u8      colorFront;     // 바닥 앞 부분 색상(RGB)
        u8      colorRear;      // 바닥 뒷 부분 색상(RGB)
        u8      card;           // 식별한 카드(상위 4비트는 front, 하위 4비트는 rear 색상)

        u8      battery;        // 배터리
        s8      rssi;           // RSSI
    };
}
변수 이름 형식 크기 범위 설명
modeDrone Mode::Drone::Type 1 Byte - 드론 동작 모드
modeDrive Mode::Drive::Type 1 Byte - 주행 모드
irFrontLeft uint16_t 2 Byte 0 ~ 4,096 정면 좌측 거리센서(Raw)
irFrontRight uint16_t 2 Byte 0 ~ 4,096 정면 우측 거리센서(Raw)
colorFront CardColor::Type 1 Byte - 바닥 앞 부분 색상(RGB)
colorRear CardColor::Type 1 Byte - 바닥 뒷 부분 색상(RGB)
card CardNameColor::Type,
CardNameFunction::Type
1 Byte - 식별한 카드
battery uint8_t 1 Byte 0 ~ 100 배터리
rssi int8_t 1 Byte -127 ~ 0 신호 세기



Protocol::Attitude

자세

namespace Protocol
{
    struct Attitude
    {
        s16     roll;         // Roll
        s16     pitch;        // Pitch
        s16     yaw;          // Yaw
    };
}
변수 이름 형식 크기 범위 설명
roll int16_t 2 Byte -32,768 ~ 32,767 Roll
pitch int16_t 2 Byte -32,768 ~ 32,767 Pitch
yaw int16_t 2 Byte -32,768 ~ 32,767 Yaw

자세를 확인할 때 값의 범위는 다음과 같습니다.

이름 형식 크기 범위 설명
roll int16_t 2 Byte -90 ~ 90 좌우 기울기 각도
pitch int16_t 2 Byte -90 ~ 90 전후 기울기 각도
yaw int16_t 2 Byte -180 ~ 180 좌우 회전 시 각도



Protocol::Position

위치

namespace Protocol
{
    struct Position
    {
        float       x;      // meter
        float       y;      // meter
        float       z;      // meter
    };
}
변수 이름 형식 크기 범위 단위 설명
x float 4 Byte -100.0 ~ 100.0 meter 앞(+), 뒤(-)
y float 4 Byte -100.0 ~ 100.0 meter 좌(+), 우(-)
z float 4 Byte -100.0 ~ 100.0 meter 위(+), 아래(-)



Protocol::Motion

Motion 센서 데이터와 자세

namespace Protocol
{
    struct Motion
    {
        s16     accX;
        s16     accY;
        s16     accZ;

        s16     gyroRoll;
        s16     gyroPitch;
        s16     gyroYaw;

        s16     angleRoll;
        s16     anglePitch;
        s16     angleYaw;
    };
}
변수 이름 형식 크기 범위 단위 설명
accelX int16_t 2 Byte -1,568 ~ 1,568
(-156.8 ~ 156.8)
m/s2 x 10 가속도 X
accelY int16_t 2 Byte -1,568 ~ 1,568
(-156.8 ~ 156.8)
m/s2 x 10 가속도 Y
accelZ int16_t 2 Byte -1,568 ~ 1,568
(-156.8 ~ 156.8)
m/s2 x 10 가속도 Z
gyroRoll int16_t 2 Byte -2,000 ~ 2,000 degree/s 자이로 Roll
gyroPitch int16_t 2 Byte -2,000 ~ 2,000 degree/s 자이로 Pitch
gyroYaw int16_t 2 Byte -2,000 ~ 2,000 degree/s 자이로 Yaw
angleRoll int16_t 2 Byte -180 ~ 180 degree 자세 Roll
anglePitch int16_t 2 Byte -180 ~ 180 degree 자세 Pitch
angleYaw int16_t 2 Byte -180 ~ 180 degree 자세 Yaw



Protocol::Range

Range 센서 데이터 출력

namespace Protocol
{
    struct Range
    {
        s16     left;
        s16     front;
        s16     right;
        s16     rear;
        s16     top;
        s16     bottom;
    };
}
변수 이름 형식 크기 범위 단위 설명
left int16_t 2 Byte 0 ~ 2,000 mm 왼쪽을 바라보는 거리 센서의 출력 값
front int16_t 2 Byte 0 ~ 2,000 mm 정면을 바라보는 거리 센서의 출력 값
right int16_t 2 Byte 0 ~ 2,000 mm 오른쪽을 바라보는 거리 센서의 출력 값
rear int16_t 2 Byte 0 ~ 2,000 mm 뒤를 바라보는 거리 센서의 출력 값
top int16_t 2 Byte 0 ~ 2,000 mm 위쪽를 바라보는 거리 센서의 출력 값
bottom int16_t 2 Byte 0 ~ 2,000 mm 아래쪽을 바라보는 거리 센서의 출력 값



Protocol::Count

카운트

주행 시간 및 관련 카운트 값을 읽을 때 사용합니다.

namespace Protocol
{
    struct Count
    {
        u32     timeSystem;             // 시스템 동작 시간
        u32     timeDrive;              // 주행 시간

        u16     countStart;             // 시작 횟수
        u16     countStop;              // 정지 횟수
        u16     countAccident;          // 충돌 횟수
    };
}
변수 이름 형식 크기 범위 설명
timeSystem uint32_t 4 Byte - 시스템 동작 시간(sec)
timeDrive uint32_t 4 Byte - 주행 시간(sec)
countStart uint16_t 2 Byte 0 ~ 65,535 시작 횟수
countStop uint16_t 2 Byte 0 ~ 65,535 정지 횟수
countAccident uint16_t 2 Byte 0 ~ 65,535 충돌 횟수



Protocol::Bias

바이어스

namespace Protocol
{
    struct Bias
    {
        s16     accelX;         // X
        s16     accelY;         // Y
        s16     accelZ;         // Z

        s16     gyroRoll;       // Roll
        s16     gyroPitch;      // Pitch
        s16     gyroYaw;        // Yaw
    };
}
변수 이름 형식 크기 범위 설명
accelX int16_t 2 Byte -32,768 ~ 32,767 Accel X
accelY int16_t 2 Byte -32,768 ~ 32,767 Accel Y
accelZ int16_t 2 Byte -32,768 ~ 32,767 Accel Z
gyroRoll int16_t 2 Byte -32,768 ~ 32,767 Gyro Roll
gyroPitch int16_t 2 Byte -32,768 ~ 32,767 Gyro Pitch
gyroYaw int16_t 2 Byte -32,768 ~ 32,767 Gyro Yaw



Protocol::Trim

Trim

namespace Protocol
{
    struct Trim
    {
        s16     wheel;      // Wheel
    };
}
변수 이름 형식 크기 범위 설명
wheel int16_t 2 Byte -200 ~ 200 Wheel



Protocol::Motor

모터

모터를 동시에 작동시키거나, 현재 모터에 입력된 값을 확인할 때 사용합니다.

아래의 구조체를 배열로 사용합니다.

namespace Protocol
{
    struct Motor
    {
        u8      rotation;
        s16     value;
    };
}
변수 이름 형식 크기 범위 설명
rotation Rotation::Type 1 Byte - 회전 방향
value uint16_t 2 Byte 0 ~ 4,095 회전 속도



Protocol::MotorSingle

한 개의 모터 제어

하나의 모터를 동작시키거나, 현재 모터에 입력된 값을 확인할 때 사용합니다.

namespace Protocol
{
    struct MotorSingle
    {
        u8      target;
        u8      rotation;
        s16     value;
    };
}
변수 이름 형식 크기 범위 설명
target Motor::Part::Type 1 Byte 0 ~ 3 동작 대상 모터
rotation Rotation::Type 1 Byte - 회전 방향
value uint16_t 2 Byte 0 ~ 4,095 회전 속도



Protocol::Buzzer

버저

namespace Protocol
{
    struct Buzzer
    {
        u8      mode;   // 버저 작동 모드
        u16     value;  // Scale 또는 hz
        u16     time;   // 연주 시간(ms)
    };
}
변수 이름 형식 크기 범위 설명
mode Buzzer::Mode::Type 1 Byte - 버저 동작 모드
value Buzzer::Scale::Type 2 Byte - Scale
  UInt16 2 Byte 0 ~ 8,000 Hz
time UInt16 2 Byte 0 ~ 65,535 소리를 지속할 시간(ms)



Protocol::BuzzerMelody

버저 멜로디

버저에 예약 가능한 소리의 갯수는 64개입니다. 멜로디에 따라 짧은 멜로디는 여러번 반복이 가능하나 여러개의 음이 담긴 멜로디는 몇 회 이내에서만 정상적으로 동작합니다.

namespace Protocol
{
    struct BuzzerMelody
    {
        u8      melody;   // 멜로디 종류
        u8      repeat;   // 반복 횟수
    };
}
변수 이름 형식 크기 범위 설명
melody Buzzer::Melody::Type 1 Byte - 멜로디 종류
repeat UInt8 1 Byte 0 ~ 10 소리의 길이에 따라 반복 가능한 횟수가 다름



Protocol::Button

버튼

namespace Protocol
{
    struct Button
    {
        u16     button;
        u8      event;
    };
}
변수 이름 형식 크기 범위 설명
button uint16_t 2 Byte - 버튼 입력
event Button::Event::Type 1 Byte - 버튼 이벤트



Protocol::InformationAssembledForController

자주 갱신되는 데이터 모음(조종기)

조종기에 표시되는 데이터의 갱신 속도를 높일 목적으로 여러 데이터를 하나로 합친 구조체

namespace Protocol
{
    struct InformationAssembledForController
    {
        s16     angleRoll;              // 자세 Roll
        s16     anglePitch;             // 자세 Pitch
        s16     angleYaw;               // 자세 Yaw

        u16     rpm;                    // RPM

        s16     positionX;              // meter x 10
        s16     positionY;              // meter x 10
        s16     positionZ;              // meter x 10

        s8      speedX;                 // meter x 10
        s8      speedY;                 // meter x 10

        u8      rangeHeight;            // meter x 100

        s8      rssi;                   // RSSI
    };
}



Protocol::InformationAssembledForEntry

자주 갱신되는 데이터 모음(엔트리)

namespace Protocol
{
    struct InformationAssembledForEntry
    {
        s16     angleRoll;
        s16     anglePitch;
        s16     angleYaw;

        float   pressureTemperature;
        float   pressureAltitude;

        float   positionX;
        float   positionY;

        float   rangeHeight;
    };
}



Protocol::InformationAssembledForByBlocks

자주 갱신되는 데이터 모음(바이블럭)

namespace Protocol
{
    struct InformationAssembledForByBlocks
    {
        s8          battery;            // 배터리 잔량
        
        s16         angleRoll;          // 자세 Roll
        s16         anglePitch;         // 자세 Pitch
        s16         angleYaw;           // 자세 Yaw
        
        s16         positionX;          // meter x 10
        s16         positionY;          // meter x 10
        s16         positionZ;          // meter x 10
        
        s16         rangeLeft;          // meter x 1000
        s16         rangeFront;         // meter x 1000
        s16         rangeRight;         // meter x 1000
        s16         rangeBottom;        // meter x 1000
    };
}



E-DRIVE

  1. Intro
  2. Typedef
  3. DataType
  4. Definitions
  5. Structs
  6. Structs - Light
  7. Structs - Card


Index