You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
1.5 KiB

2 years ago
  1. #pragma once
  2. #include <functional>
  3. #include "basic/base.hpp"
  4. namespace iflytop {
  5. using namespace std;
  6. #define STM32_GPIO_LISTENER_NUM 10
  7. class ZGPIO {
  8. public:
  9. typedef enum {
  10. kRisingIrqEvent,
  11. kFallingIrqEvent,
  12. } IrqTypeEvent_t;
  13. typedef enum {
  14. kMode_nopull, //
  15. kMode_pullup, //
  16. kMode_pulldown, //
  17. kMode_od, //
  18. } GPIOMode_t;
  19. typedef enum { kType_AIN, kType_Input, kType_Output } GPIOType_t;
  20. typedef enum {
  21. kIRQ_noIrq,
  22. kIRQ_risingIrq,
  23. kIRQ_fallingIrq,
  24. kIRQ_risingAndFallingIrq,
  25. } GPIOIrqType_t;
  26. typedef function<void(ZGPIO *GPIO_Pin, IrqTypeEvent_t irqevent)> onirq_t;
  27. private:
  28. GPIO_TypeDef *m_gpio;
  29. uint16_t m_pinoff;
  30. GPIOType_t m_gpiotype;
  31. GPIOMode_t m_mode;
  32. GPIOIrqType_t m_irqtype;
  33. bool m_mirror;
  34. bool lastLevel;
  35. onirq_t m_onirq;
  36. public:
  37. ZGPIO(){};
  38. void initAsInput(Pin_t pin, GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror);
  39. void initAsOutput(Pin_t pin, GPIOMode_t mode, bool mirror, bool initLevel);
  40. void regListener(onirq_t listener);
  41. bool isMirror();
  42. bool isItRisingEXITGPIO();
  43. bool isItFallingEXITGPIO();
  44. bool isItRisingAndItFallingEXITGPIO();
  45. bool getState();
  46. uint32_t getStateUint32();
  47. bool setState(bool state);
  48. void toggleState();
  49. IRQn_Type getEXTIIRQn();
  50. GPIO_TypeDef *getPort() { return m_gpio; }
  51. uint16_t getPin() { return m_pinoff; }
  52. bool tryTriggerIRQ(uint16_t GPIO_Pin);
  53. private:
  54. bool enableClock();
  55. };
  56. } // namespace iflytop