반응형
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 환경 등에서도 유사한 아키텍처를 적용할 수 있음
반응형
'임베디드 관련 정리' 카테고리의 다른 글
Concept과 Interface의 혼용 전략 (0) | 2025.06.06 |
---|---|
임베디드 시스템에서 Interface와 concept 선택 (1) | 2025.06.05 |
리액티브 FSM / 상태기계 기반 아키텍처 정리 (0) | 2025.05.30 |
서비스 지향 아키텍처 정리 (0) | 2025.05.29 |
모듈형 아키텍처 정리 (0) | 2025.05.28 |
댓글