Использование низкоуровневого типа данных из уровня аппаратной абстракции в приложении (высокий уровень)
У меня есть уровень аппаратной абстракции для периферийного устройства MCU, который написан на C. Код приложения использует периферийное устройство через оболочку C++. Теперь у меня низкий уровень enum ll_enum
и функция, которая требует параметр с этим типом данных.
Мое понимание хорошей архитектуры подразумевало бы следующее:
- Низкоуровневый периферийный драйвер (C)
- не должен знать, что есть более высокий уровень
- имеет определение перечисления
- C++ Wrapper
- очевидно, знает слой низкого уровня и что есть приложение
- Код приложения, который использует оболочку C++
- Просто знает C++ Wrapper
Мое решение прямо сейчас:
У меня есть перечисление в C++ Wrapper, которое имеет те же записи, что и перечисление низкого уровня. Перечисление приводится к низкоуровневому типу в C++ Wrapper.
// ### C++ Wrapper ###
enum hl_enum {
foo = 1,
bar = 2,
}
void Peripheral::hl_function(hl_enum param) {
ll_function((ll_enum)param);
}
// ### Low level C-file ###
typedef enum {
foo = 1,
bar = 2,
} ll_enum;
void ll_function(ll_enum param);
Очевидно, что это плохое решение, потому что вы должны изменить код на двух позициях и попасть в неприятности, если пропустили это.
Есть ли лучшее решение?