gpio_manager.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #pragma once
  2. #include <mutex>
  3. #include <inttypes.h>
  4. #include <driver/gpio.h>
  5. #include <esp_log.h>
  6. class GpioManager {
  7. public:
  8. enum class GpioMode {
  9. INPUT,
  10. OUTPUT,
  11. INPUT_PULLUP,
  12. INPUT_PULLDOWN
  13. };
  14. static void SetLevel(gpio_num_t gpio, uint32_t level) {
  15. std::lock_guard<std::mutex> lock(mutex_);
  16. ESP_ERROR_CHECK(gpio_set_level(gpio, level));
  17. ESP_LOGD("GpioManager", "Set GPIO %d level: %d", static_cast<int>(gpio), static_cast<int>(level));
  18. }
  19. static int GetLevel(gpio_num_t gpio) {
  20. std::lock_guard<std::mutex> lock(mutex_);
  21. int level = gpio_get_level(gpio);
  22. ESP_LOGD("GpioManager", "Get GPIO %d level: %d", static_cast<int>(gpio), level);
  23. return level;
  24. }
  25. static void Config(gpio_num_t gpio, GpioMode mode) {
  26. std::lock_guard<std::mutex> lock(mutex_);
  27. gpio_config_t config = {};
  28. config.pin_bit_mask = (1ULL << gpio);
  29. switch(mode) {
  30. case GpioMode::INPUT:
  31. config.mode = GPIO_MODE_INPUT;
  32. config.pull_up_en = GPIO_PULLUP_DISABLE;
  33. config.pull_down_en = GPIO_PULLDOWN_DISABLE;
  34. break;
  35. case GpioMode::OUTPUT:
  36. config.mode = GPIO_MODE_OUTPUT;
  37. break;
  38. case GpioMode::INPUT_PULLUP:
  39. config.mode = GPIO_MODE_INPUT;
  40. config.pull_up_en = GPIO_PULLUP_ENABLE;
  41. break;
  42. case GpioMode::INPUT_PULLDOWN:
  43. config.mode = GPIO_MODE_INPUT;
  44. config.pull_down_en = GPIO_PULLDOWN_ENABLE;
  45. break;
  46. }
  47. ESP_ERROR_CHECK(gpio_config(&config));
  48. ESP_LOGI("GpioManager", "Configured GPIO %d mode: %d", gpio, static_cast<int>(mode));
  49. }
  50. private:
  51. static std::mutex mutex_;
  52. };
  53. std::mutex GpioManager::mutex_;