|
|
#pragma once
#include <functional>
#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<void(ZGPIO *GPIO_Pin, IrqTypeEvent_t irqevent)> 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;
|