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.
 
 

87 lines
2.1 KiB

#pragma once
#include <functional>
#include "../chip/iflytop_no_os.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;
private:
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;
onirq_t m_onirq;
public:
ZGPIO(){};
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 regListener(onirq_t listener);
bool isMirror();
bool isItRisingEXITGPIO();
bool isItFallingEXITGPIO();
bool isItRisingAndItFallingEXITGPIO();
/*******************************************************************************
* 基本状态读写 *
*******************************************************************************/
bool getState();
uint32_t getStateUint32();
bool setState(bool state);
void toggleState();
/*******************************************************************************
* 辅助方法 *
*******************************************************************************/
IRQn_Type getEXTIIRQn();
GPIO_TypeDef *getPort() { return m_gpio; }
uint16_t getPin() { return m_pinoff; }
bool tryTriggerIRQ(uint16_t GPIO_Pin);
private:
bool enableClock();
};
class STM32_GPIO_LISTENER {
public:
virtual void STM32_GPIO_onIRQ(ZGPIO *GPIO_Pin, ZGPIO::IrqTypeEvent_t irqevent) {}
};
} // namespace iflytop