Port驱动不再记录Group和Mask,改为具体移植库自己计算

This commit is contained in:
大石头X2 2016-12-17 11:12:32 +08:00
parent 0dc04fb164
commit e759dea052
4 changed files with 22 additions and 35 deletions

View File

@ -266,9 +266,9 @@ static void UnionPress(InputPort& port, bool down)
byte data[1]; byte data[1];
data[0] = down ? 1 : 0; data[0] = down ? 1 : 0;
client->Store.Write(port.Index + 1, Buffer(data, 1)); client->Store.Write(port.State + 1, Buffer(data, 1));
// 主动上报状态 // 主动上报状态
client->ReportAsync(port.Index + 1, 1); client->ReportAsync(port.State + 1, 1);
} }
void IOK027X::Union(Pin pin1, Pin pin2) void IOK027X::Union(Pin pin1, Pin pin2)
@ -279,7 +279,7 @@ void IOK027X::Union(Pin pin1, Pin pin2)
auto port = new InputPort(p[i]); auto port = new InputPort(p[i]);
port->Invert = true; port->Invert = true;
port->ShakeTime = 40; port->ShakeTime = 40;
port->Index = i; port->State = i;
port->Press.Bind(UnionPress); port->Press.Bind(UnionPress);
port->UsePress(); port->UsePress();
port->Open(); port->Open();

View File

@ -9,8 +9,6 @@
Port::Port() Port::Port()
{ {
_Pin = P0; _Pin = P0;
Group = nullptr;
Mask = 0;
Opened = false; Opened = false;
State = 0; State = 0;
} }
@ -49,16 +47,6 @@ Port& Port::Set(Pin pin)
#endif #endif
_Pin = pin; _Pin = pin;
if(_Pin != P0)
{
Group = IndexToGroup(pin >> 4);
Mask = 1 << (pin & 0x0F);
}
else
{
Group = nullptr;
Mask = 0;
}
return *this; return *this;
} }
@ -67,16 +55,12 @@ bool Port::Empty() const
{ {
if(_Pin != P0) return false; if(_Pin != P0) return false;
if(Group == nullptr || Mask == 0) return true;
return false; return false;
} }
void Port::Clear() void Port::Clear()
{ {
Group = nullptr;
_Pin = P0; _Pin = P0;
Mask = 0;
} }
// 确定配置,确认用对象内部的参数进行初始化 // 确定配置,确认用对象内部的参数进行初始化

View File

@ -29,12 +29,9 @@ public:
AF_7 = 7 AF_7 = 7
}; };
void* Group; // 引脚组
ushort Mask; // 组内引脚位。每个引脚一个位
Pin _Pin; // 引脚 Pin _Pin; // 引脚
bool Opened; // 是否已经打开 bool Opened; // 是否已经打开
int State; // 用户状态数据。常用于批量端口操作时记录索引 int State; // 用户状态数据。常用于批量端口操作时记录索引
byte Index; //引脚自身次序编号,用于区分多引脚次序
Port(); Port();
@ -69,7 +66,6 @@ protected:
virtual void OnClose(); virtual void OnClose();
private: private:
static void* IndexToGroup(byte index);
void OpenPin(); void OpenPin();
}; };

View File

@ -28,12 +28,12 @@ static const byte PORT_IRQns[] = {
#define REGION_Port 1 #define REGION_Port 1
#ifdef REGION_Port #ifdef REGION_Port
void* Port::IndexToGroup(byte index) { return ((GPIO_TypeDef *) (GPIOA_BASE + (index << 10))); } static GPIO_TypeDef* IndexToGroup(byte index) { return ((GPIO_TypeDef *) (GPIOA_BASE + (index << 10))); }
// 分组时钟 // 分组时钟
static byte _GroupClock[10]; static byte _GroupClock[10];
void Port::OpenClock(Pin pin, bool flag) static void OpenClock(Pin pin, bool flag)
{ {
int gi = pin >> 4; int gi = pin >> 4;
@ -69,13 +69,14 @@ void Port::OpenPin()
GPIO_StructInit(&gpio); GPIO_StructInit(&gpio);
OnOpen(&gpio); OnOpen(&gpio);
GPIO_Init((GPIO_TypeDef*)Group, &gpio);
GPIO_Init(IndexToGroup(_Pin >> 4), &gpio);
} }
void Port::OnOpen(void* param) void Port::OnOpen(void* param)
{ {
auto gpio = (GPIO_InitTypeDef*)param; auto gpio = (GPIO_InitTypeDef*)param;
gpio->GPIO_Pin = Mask; gpio->GPIO_Pin = 1 << (_Pin & 0x0F);
#ifdef STM32F1 #ifdef STM32F1
// PA15/PB3/PB4 需要关闭JTAG // PA15/PB3/PB4 需要关闭JTAG
@ -115,7 +116,7 @@ void Port::AFConfig(GPIO_AF GPIO_AF) const
#if defined(STM32F0) || defined(GD32F150) || defined(STM32F4) #if defined(STM32F0) || defined(GD32F150) || defined(STM32F4)
assert(Opened, "打开后才能配置AF"); assert(Opened, "打开后才能配置AF");
GPIO_PinAFConfig((GPIO_TypeDef*)Group, _PIN(_Pin), GPIO_AF); GPIO_PinAFConfig(IndexToGroup(_Pin >> 4), _PIN(_Pin), GPIO_AF);
#endif #endif
} }
@ -123,7 +124,9 @@ bool Port::Read() const
{ {
if(_Pin == P0) return false; if(_Pin == P0) return false;
return GPIO_ReadInputData((GPIO_TypeDef*)Group) & Mask; auto gp = IndexToGroup(_Pin >> 4);
ushort ms = 1 << (_Pin & 0x0F);
return GPIO_ReadInputData(gp) & ms;
} }
#endif #endif
@ -167,8 +170,10 @@ bool OutputPort::Read() const
{ {
if(Empty()) return false; if(Empty()) return false;
auto gp = IndexToGroup(_Pin >> 4);
ushort ms = 1 << (_Pin & 0x0F);
// 转为bool时会转为0/1 // 转为bool时会转为0/1
bool rs = GPIO_ReadOutputData((GPIO_TypeDef*)Group) & Mask; bool rs = GPIO_ReadOutputData(gp) & ms;
return rs ^ Invert; return rs ^ Invert;
} }
@ -183,10 +188,12 @@ void OutputPort::Write(bool value) const
{ {
if(Empty()) return; if(Empty()) return;
auto gi = IndexToGroup(_Pin >> 4);
ushort ms = 1 << (_Pin & 0x0F);
if(value ^ Invert) if(value ^ Invert)
GPIO_SetBits((GPIO_TypeDef*)Group, Mask); GPIO_SetBits(gi, ms);
else else
GPIO_ResetBits((GPIO_TypeDef*)Group, Mask); GPIO_ResetBits(gi, ms);
} }
// 设置端口状态 // 设置端口状态
@ -372,7 +379,7 @@ InputPort::Trigger GetTrigger(InputPort::Trigger mode, bool invert)
void InputPort::ClosePin() void InputPort::ClosePin()
{ {
int idx = Bits2Index(Mask); int idx = Bits2Index(1 << (_Pin & 0x0F));
auto st = &States[idx]; auto st = &States[idx];
if(st->Port == this) if(st->Port == this)
@ -399,7 +406,7 @@ bool InputPort::OnRegister()
} }
byte gi = _Pin >> 4; byte gi = _Pin >> 4;
int idx = Bits2Index(Mask); int idx = Bits2Index(1 << (_Pin & 0x0F));
auto st = &States[idx]; auto st = &States[idx];
auto port = st->Port; auto port = st->Port;
@ -416,7 +423,7 @@ bool InputPort::OnRegister()
st->Port = this; st->Port = this;
//byte gi = _Pin >> 4; //byte gi = _Pin >> 4;
//int idx = Bits2Index(Mask); //int idx = Bits2Index(1 << (_Pin & 0x0F));
// 打开时钟选择端口作为端口EXTI时钟线 // 打开时钟选择端口作为端口EXTI时钟线
#if defined(STM32F0) || defined(GD32F150) || defined(STM32F4) #if defined(STM32F0) || defined(GD32F150) || defined(STM32F4)