Files
Amar Mahmutbegovic 77fc239a5b add Chapter08
2025-05-11 21:59:37 +02:00

56 lines
1.1 KiB
C++

#include <span>
#include <cstdio>
#include <cstdint>
template<typename U>
class uart_interface {
public:
void init(std::uint32_t baudrate = 9600) {
static_cast<U*>(this)->initImpl(baudrate);
}
void write(std::span<const char> data) {
static_cast<U*>(this)->writeImpl(data);
}
};
class uart_stm32 : public uart_interface<uart_stm32> {
public:
void initImpl(std::uint32_t baudrate = 9600) {
printf("uart_stm32::init: setting baudrate to %d\r\n", baudrate);
}
void writeImpl(std::span<const char> data) {
printf("uart_stm32::write: ");
for(auto ch: data) {
putc(ch, stdout);
}
}
};
template<typename T>
concept TheUart = std::derived_from<T, uart_interface<T>>;
template<TheUart T>
class gsm_lib{
public:
gsm_lib(T &u) : uart_(u) {}
void init() {
printf("gsm_lib::init: sending AT command\r\n");
uart_.write("AT");
}
private:
T &uart_;
};
int main() {
uart_stm32 uart_stm32_obj;
uart_stm32_obj.init(115200);
gsm_lib gsm(uart_stm32_obj);
gsm.init();
return 0;
}