39 template<u8 GPIOBaseNumber>
49 template<u8 GPIOBaseNumber, u8 Pin, bsp::drv::Active LogicActive>
54 static_assert(Pin <= 15,
"Pin out of range");
67 int fd = open((
"/sys/class/gpio/gpio" + std::to_string(GPIOBaseNumber + Pin) +
"/value").c_str(), O_WRONLY);
68 if (fd == -1)
return *
this;
70 write(fd, state ?
"1" :
"0", 1);
81 [[nodiscard]]
operator u8() const noexcept {
82 int fd = open((
"/sys/class/gpio/gpio" + std::to_string(GPIOBaseNumber + Pin) +
"/value").c_str(), O_RDONLY);
83 if (fd == -1)
return 0;
85 char buffer[2] = { 0 };
86 read(fd, buffer,
sizeof(buffer));
89 bool result = buffer[0] ==
'1';
99 bool init() const noexcept {
100 int fd = open(
"/sys/class/gpio/export", O_WRONLY);
101 if (fd == -1)
return false;
103 auto value = std::to_string(GPIOBaseNumber + Pin);
104 write(fd, value.c_str(), value.length());
116 int fd = open(
"/sys/class/gpio/unexport", O_WRONLY);
117 if (fd == -1)
return false;
119 auto value = std::to_string(GPIOBaseNumber + Pin);
120 write(fd, value.c_str(), value.length());
130 int fd = open((
"/sys/class/gpio/gpio" + std::to_string(GPIOBaseNumber + Pin) +
"/direction").c_str(), O_WRONLY);
131 if (fd == -1)
return;
141 int fd = open((
"/sys/class/gpio/gpio" + std::to_string(GPIOBaseNumber + Pin) +
"/direction").c_str(), O_WRONLY);
142 if (fd == -1)
return;
153 template<addr_t,
template<addr_t,u8>
typename>
163 template<u8 GPIOBaseNumber>
196 template<u8 Pin, bsp::drv::Active LogicActive>