#pragma once #include #include "stm32/stm32.hpp" extern "C" { #include "logger.h" } namespace iflytop { using namespace std; #define STM32_GPIO_LISTENER_NUM 10 class ZGPIO { public: typedef enum { kRisingIrqEvent, kFallingIrqEvent, } IrqTypeEvent_t; typedef enum { kMode_nopull, // kMode_pullup, // kMode_pulldown, // kMode_od, // } GPIOMode_t; typedef enum { kType_AIN, kType_Input, kType_Output } GPIOType_t; typedef enum { kIRQ_noIrq, kIRQ_risingIrq, kIRQ_fallingIrq, kIRQ_risingAndFallingIrq, } GPIOIrqType_t; typedef function onirq_t; typedef struct { Pin_t pin; GPIOMode_t mode; GPIOIrqType_t irqtype; bool mirror; } InputGpioCfg_t; typedef struct { Pin_t pin; GPIOMode_t mode; bool mirror; bool initLevel; bool log_when_setstate; } OutputGpioCfg_t; private: Pin_t m_pin = PinNull; GPIO_TypeDef *m_gpio; uint16_t m_pinoff; GPIOType_t m_gpiotype; GPIOMode_t m_mode; GPIOIrqType_t m_irqtype; bool m_mirror; bool lastLevel; bool m_log_when_setstate = false; onirq_t m_onirq; bool m_initflag; bool m_preset_pin = false; public: ZGPIO(){}; ZGPIO(Pin_t pin) { m_pin = pin; m_preset_pin = true; }; void initAsInput(Pin_t pin, GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror); void initAsOutput(Pin_t pin, GPIOMode_t mode, bool mirror, bool initLevel); void initAsOutput(OutputGpioCfg_t *outputcfg) { m_log_when_setstate = outputcfg->log_when_setstate; initAsOutput(outputcfg->pin, outputcfg->mode, outputcfg->mirror, outputcfg->initLevel); } void initAsInput(InputGpioCfg_t *inputcfg) { initAsInput(inputcfg->pin, inputcfg->mode, inputcfg->irqtype, inputcfg->mirror); } void initAsInput(GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror) { ZASSERT(m_preset_pin); initAsInput(m_pin, mode, irqtype, mirror); } void initAsOutput(GPIOMode_t mode, bool mirror, bool initLevel) { ZASSERT(m_preset_pin); initAsOutput(m_pin, mode, mirror, initLevel); } void enableTrace(bool enable) { m_log_when_setstate = enable; } void regListener(onirq_t listener); bool isMirror(); bool isItRisingEXITGPIO(); bool isItFallingEXITGPIO(); bool isItRisingAndItFallingEXITGPIO(); bool getState(); uint32_t getStateUint32(); bool setState(bool state); void toggleState(); bool isNull() { return m_pin == PinNull; } Pin_t getPin() { return m_pin; } IRQn_Type getEXTIIRQn(); GPIO_TypeDef *getHalPinPort() { return m_gpio; } uint16_t getHalPin() { return m_pinoff; } bool tryTriggerIRQ(uint16_t GPIO_Pin); bool isInit() { return m_initflag; } private: bool enableClock(); }; } // namespace iflytop extern iflytop::ZGPIO IO_PA0; extern iflytop::ZGPIO IO_PA1; extern iflytop::ZGPIO IO_PA2; extern iflytop::ZGPIO IO_PA3; extern iflytop::ZGPIO IO_PA4; extern iflytop::ZGPIO IO_PA5; extern iflytop::ZGPIO IO_PA6; extern iflytop::ZGPIO IO_PA7; extern iflytop::ZGPIO IO_PA8; extern iflytop::ZGPIO IO_PA9; extern iflytop::ZGPIO IO_PA10; extern iflytop::ZGPIO IO_PA11; extern iflytop::ZGPIO IO_PA12; extern iflytop::ZGPIO IO_PA13; extern iflytop::ZGPIO IO_PA14; extern iflytop::ZGPIO IO_PA15; extern iflytop::ZGPIO IO_PB0; extern iflytop::ZGPIO IO_PB1; extern iflytop::ZGPIO IO_PB2; extern iflytop::ZGPIO IO_PB3; extern iflytop::ZGPIO IO_PB4; extern iflytop::ZGPIO IO_PB5; extern iflytop::ZGPIO IO_PB6; extern iflytop::ZGPIO IO_PB7; extern iflytop::ZGPIO IO_PB8; extern iflytop::ZGPIO IO_PB9; extern iflytop::ZGPIO IO_PB10; extern iflytop::ZGPIO IO_PB11; extern iflytop::ZGPIO IO_PB12; extern iflytop::ZGPIO IO_PB13; extern iflytop::ZGPIO IO_PB14; extern iflytop::ZGPIO IO_PB15; extern iflytop::ZGPIO IO_PC0; extern iflytop::ZGPIO IO_PC1; extern iflytop::ZGPIO IO_PC2; extern iflytop::ZGPIO IO_PC3; extern iflytop::ZGPIO IO_PC4; extern iflytop::ZGPIO IO_PC5; extern iflytop::ZGPIO IO_PC6; extern iflytop::ZGPIO IO_PC7; extern iflytop::ZGPIO IO_PC8; extern iflytop::ZGPIO IO_PC9; extern iflytop::ZGPIO IO_PC10; extern iflytop::ZGPIO IO_PC11; extern iflytop::ZGPIO IO_PC12; extern iflytop::ZGPIO IO_PC13; extern iflytop::ZGPIO IO_PC14; extern iflytop::ZGPIO IO_PC15; extern iflytop::ZGPIO IO_PD0; extern iflytop::ZGPIO IO_PD1; extern iflytop::ZGPIO IO_PD2; extern iflytop::ZGPIO IO_PD3; extern iflytop::ZGPIO IO_PD4; extern iflytop::ZGPIO IO_PD5; extern iflytop::ZGPIO IO_PD6; extern iflytop::ZGPIO IO_PD7; extern iflytop::ZGPIO IO_PD8; extern iflytop::ZGPIO IO_PD9; extern iflytop::ZGPIO IO_PD10; extern iflytop::ZGPIO IO_PD11; extern iflytop::ZGPIO IO_PD12; extern iflytop::ZGPIO IO_PD13; extern iflytop::ZGPIO IO_PD14; extern iflytop::ZGPIO IO_PD15; extern iflytop::ZGPIO IO_PE0; extern iflytop::ZGPIO IO_PE1; extern iflytop::ZGPIO IO_PE2; extern iflytop::ZGPIO IO_PE3; extern iflytop::ZGPIO IO_PE4; extern iflytop::ZGPIO IO_PE5; extern iflytop::ZGPIO IO_PE6; extern iflytop::ZGPIO IO_PE7; extern iflytop::ZGPIO IO_PE8; extern iflytop::ZGPIO IO_PE9; extern iflytop::ZGPIO IO_PE10; extern iflytop::ZGPIO IO_PE11; extern iflytop::ZGPIO IO_PE12; extern iflytop::ZGPIO IO_PE13; extern iflytop::ZGPIO IO_PE14; extern iflytop::ZGPIO IO_PE15; extern iflytop::ZGPIO IO_PF0; extern iflytop::ZGPIO IO_PF1; extern iflytop::ZGPIO IO_PF2; extern iflytop::ZGPIO IO_PF3; extern iflytop::ZGPIO IO_PF4; extern iflytop::ZGPIO IO_PF5; extern iflytop::ZGPIO IO_PF6; extern iflytop::ZGPIO IO_PF7; extern iflytop::ZGPIO IO_PF8; extern iflytop::ZGPIO IO_PF9; extern iflytop::ZGPIO IO_PF10; extern iflytop::ZGPIO IO_PF11; extern iflytop::ZGPIO IO_PF12; extern iflytop::ZGPIO IO_PF13; extern iflytop::ZGPIO IO_PF14; extern iflytop::ZGPIO IO_PF15; extern iflytop::ZGPIO IO_PG0; extern iflytop::ZGPIO IO_PG1; extern iflytop::ZGPIO IO_PG2; extern iflytop::ZGPIO IO_PG3; extern iflytop::ZGPIO IO_PG4; extern iflytop::ZGPIO IO_PG5; extern iflytop::ZGPIO IO_PG6; extern iflytop::ZGPIO IO_PG7; extern iflytop::ZGPIO IO_PG8; extern iflytop::ZGPIO IO_PG9; extern iflytop::ZGPIO IO_PG10; extern iflytop::ZGPIO IO_PG11; extern iflytop::ZGPIO IO_PG12; extern iflytop::ZGPIO IO_PG13; extern iflytop::ZGPIO IO_PG14; extern iflytop::ZGPIO IO_PG15;