본문 바로가기
임베디드 관련 정리

IReceiver 기반 구조를 통해 센서 모듈을 모듈화하는 기법

by minhyeok.lee 2025. 6. 1.
반응형

IReceiver 기반 구조를 통해 공통 인터페이스로 다양한 센서 모듈을 모듈화하는 기법 정리

해당 기법은 인터페이스를 활용하여 임베디드 시스템에서 확장성, 유지보수성, 테스트 용이성을 높이는 강력한 방법

 

인터페이스란?

2025.05.31 - [언어/C, C++] - [C++] 인터페이스(Interface) 정리

 

[C++] 인터페이스(Interface) 정리

인터페이스(Interface)C++의 인터페이스(Interface) 는 명확하게 문법적으로 존재하는 개념은 아니지만, 순수 가상 함수(pure virtual function) 를 사용"추상 클래스(Abstract Class)" 형태로 구현되고 이는 C++에

kfdd6630.tistory.com


✅ 1. 구조 개요

🔸 공통 인터페이스 (Interface)

class IReceiver
{
public:
  virtual void startReception() = 0;
  virtual void pauseReception() = 0;
  virtual void requestMeasurement() = 0;
  virtual void onReceive() = 0;
  virtual int16_t getDistance(int index) const = 0;
  virtual bool isValid() const = 0;
  virtual bool isTimedOut(uint32_t timeoutMs) const = 0;
  virtual ~IReceiver() = default;
};
  • 기능의 최소 단위만 명세
  • 다양한 센서 클래스가 이 구조만 지키면 시스템에 연결 가능

✅ 2. 실제 구현 예시

🔸 초음파 센서용 UART 수신 클래스

class UsController : public IReceiver
{
public:
  UsController(UART_HandleTypeDef *uart);

  void startReception() override;
  void pauseReception() override;
  void requestMeasurement() override;
  void onReceive() override;
  int16_t getDistance(int index) const override;
  bool isValid() const override;
  bool isTimedOut(uint32_t timeoutMs) const override;

private:
  UART_HandleTypeDef *_uart;
  us_pckt _packet;
  uint16_t _distances[4];
  bool _valid;
};

 


🔸 Modbus 기반 거리 센서

class ModbusController : public IReceiver
{
public:
  ModbusController(UART_HandleTypeDef *uart, uint8_t slaveId);

  void startReception() override;
  void pauseReception() override;
  void requestMeasurement() override;
  void onReceive() override;
  int16_t getDistance(int index) const override;
  bool isValid() const override;
  bool isTimedOut(uint32_t timeoutMs) const override;

private:
  UART_HandleTypeDef *_uart;
  uint8_t _slaveId;
  uint8_t _rxBuf[64];
  uint16_t _distances[4];
  bool _valid;
};

✅ 3. 사용하는 측 코드 (DI 기반)

🔸 UsManager에서 통합적으로 다룸

class UsManager
{
public:
  UsManager(IReceiver &receiver) : _receiver(receiver) {}

  void start()
  {
    _receiver.startReception();
  }

  void update()
  {
    if (_receiver.isValid())
    {
      int d = _receiver.getDistance(0);
      // 거리 처리 로직
    }
  }

private:
  IReceiver &_receiver;
};

✅ 4. 장점 요약

항목 설명
확장성 새로운 센서 추가 시 IReceiver만 구현하면 기존 코드 수정 없이 연동 가능
유지보수성 센서별 로직이 분리되어 있어 수정이 쉽고, 다른 센서로 교체도 용이
테스트 용이성 MockReceiver 등으로 단위 테스트 가능
코드 일관성 Manager 등에서 통신 방식을 몰라도 공통된 방식으로 제어 가능

✅ 5. 확장 예시

센서 종류 클래스 이름 통신 방식 비고
초음파 UsController UART 전용 패킷 파싱 포함
Modbus 거리센서 ModbusController Modbus RTU CRC 검사 포함
UWB UwbController UART Packet 구조 정의 필요
테스트용 가상센서 MockReceiver 없음 테스트 자동화에 활용 가능

✅ 결론

  • IReceiver를 활용한 모듈화는 다양한 하드웨어 간 일관된 처리를 가능하게 하고, 소프트웨어 구조를 유연하게 설계할 수 있게 함
  • STM32, FreeRTOS 기반 프로젝트뿐 아니라 ROS2, Linux Embedded 환경 등에서도 유사한 아키텍처를 적용할 수 있음
반응형

댓글