Files
Loongson_2k0300_SmartCar/src/GPIO.cpp
T

96 lines
2.2 KiB
C++

/*
* @Author: ilikara 3435193369@qq.com
* @Date: 2024-10-10 15:02:10
* @LastEditors: ilikara 3435193369@qq.com
* @LastEditTime: 2024-12-01 03:50:49
* @FilePath: /smartcar/src/GPIO.cpp
* @Description:
*
* Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
*/
#include "GPIO.h"
GPIO::GPIO(int gpioNum) : gpioNum(gpioNum), fd(-1)
{
gpioPath = "/sys/class/gpio/gpio" + std::to_string(gpioNum);
writeToFile("/sys/class/gpio/export", std::to_string(gpioNum));
fd = open((gpioPath + "/value").c_str(), O_RDWR);
if (fd == -1)
{
throw std::runtime_error("Failed to open GPIO value file: " + std::string(strerror(errno)));
}
}
GPIO::~GPIO()
{
if (fd != -1)
{
close(fd); // 关闭文件描述符
}
}
bool GPIO::setDirection(const std::string &direction)
{
return writeToFile(gpioPath + "/direction", direction);
}
bool GPIO::setEdge(const std::string &edge)
{
return writeToFile(gpioPath + "/edge", edge);
}
bool GPIO::setValue(bool value)
{
if (fd == -1)
{
std::cerr << "GPIO file descriptor is invalid" << std::endl;
return false;
}
// 使用文件描述符写入 GPIO 值 ('1' 或 '0')
const char *val_str = value ? "1" : "0";
if (write(fd, val_str, 1) != 1)
{
std::cerr << "Failed to write GPIO value: " << strerror(errno) << std::endl;
return false;
}
return true;
}
bool GPIO::readValue()
{
if (fd == -1)
{
std::cerr << "GPIO file descriptor is invalid" << std::endl;
return false;
}
char value;
lseek(fd, 0, SEEK_SET); // 重置文件偏移量
if (read(fd, &value, 1) != 1)
{
std::cerr << "Failed to read GPIO value: " << strerror(errno) << std::endl;
return false;
}
return value == '1'; // 如果读取的值为 '1',则返回 true,否则返回 false
}
int GPIO::getFileDescriptor() const
{
return fd;
}
bool GPIO::writeToFile(const std::string &path, const std::string &value)
{
int fd = ::open(path.c_str(), O_WRONLY);
if (fd == -1)
{
return false;
}
ssize_t n = ::write(fd, value.c_str(), value.size());
::close(fd);
return (n == static_cast<ssize_t>(value.size()));
}