输入口增加按下时间统计,利于长按按钮的功能统计

This commit is contained in:
nnhy 2015-11-03 09:50:06 +00:00
parent da95bed688
commit 586b14d99c
14 changed files with 34 additions and 25 deletions

View File

@ -44,10 +44,10 @@ void Button::Set(Pin key, Pin led, bool ledInvert, Pin relay, bool relayInvert)
} }
} }
void Button::OnPress(Pin pin, bool down, void* param) void Button::OnPress(InputPort* port, bool down, void* param)
{ {
Button* btn = (Button*)param; Button* btn = (Button*)param;
if(btn) btn->OnPress(pin, down); if(btn) btn->OnPress(port->_Pin, down);
} }
void Button::OnPress(Pin pin, bool down) void Button::OnPress(Pin pin, bool down)

View File

@ -12,7 +12,7 @@
class Button : public Object, public ByteDataPort class Button : public Object, public ByteDataPort
{ {
private: private:
static void OnPress(Pin pin, bool down, void* param); static void OnPress(InputPort* port, bool down, void* param);
void OnPress(Pin pin, bool down); void OnPress(Pin pin, bool down);
EventHandler _Handler; EventHandler _Handler;

View File

@ -70,10 +70,10 @@ void Button_GrayLevel::RenewGrayLevel()
} }
} }
void Button_GrayLevel::OnPress(Pin pin, bool down, void* param) void Button_GrayLevel::OnPress(InputPort* port, bool down, void* param)
{ {
Button_GrayLevel* btn = (Button_GrayLevel*)param; Button_GrayLevel* btn = (Button_GrayLevel*)param;
if(btn) btn->OnPress(pin, down); if(btn) btn->OnPress(port->_Pin, down);
} }
void Button_GrayLevel::OnPress(Pin pin, bool down) void Button_GrayLevel::OnPress(Pin pin, bool down)

View File

@ -22,7 +22,7 @@ struct ButtonPin
class Button_GrayLevel : public ByteDataPort class Button_GrayLevel : public ByteDataPort
{ {
private: private:
static void OnPress(Pin pin, bool down, void* param); static void OnPress(InputPort* port, bool down, void* param);
void OnPress(Pin pin, bool down); void OnPress(Pin pin, bool down);
EventHandler _Handler; EventHandler _Handler;

View File

@ -61,10 +61,10 @@ Button_magnetic::~Button_magnetic()
} }
void Button_magnetic::OnPress(Pin pin, bool down, void* param) void Button_magnetic::OnPress(InputPort* port, bool down, void* param)
{ {
Button_magnetic * btn = (Button_magnetic*)param; Button_magnetic * btn = (Button_magnetic*)param;
if(btn) btn->OnPress(pin, down); if(btn) btn->OnPress(port->_Pin, down);
} }
void Button_magnetic::OnPress(Pin pin, bool down) void Button_magnetic::OnPress(Pin pin, bool down)

View File

@ -17,7 +17,7 @@ class Button_magnetic
private: private:
void Init(); void Init();
static void OnPress(Pin pin, bool down, void* param); static void OnPress(InputPort* port, bool down, void* param);
void OnPress(Pin pin, bool down); void OnPress(Pin pin, bool down);
EventHandler _Handler; EventHandler _Handler;

View File

@ -53,10 +53,10 @@ Sensor::~Sensor()
Mag = NULL; Mag = NULL;
} }
void Sensor::OnPress(Pin pin, bool down, void* param) void Sensor::OnPress(InputPort* port, bool down, void* param)
{ {
Sensor* btn = (Sensor*)param; Sensor* btn = (Sensor*)param;
if(btn) btn->OnPress(pin, down); if(btn) btn->OnPress(port->_Pin, down);
} }
void Sensor::OnPress(Pin pin, bool down) void Sensor::OnPress(Pin pin, bool down)

View File

@ -41,7 +41,7 @@ public:
private: private:
void Init(); void Init();
static void OnPress(Pin pin, bool down, void* param); static void OnPress(InputPort* port, bool down, void* param);
void OnPress(Pin pin, bool down); void OnPress(Pin pin, bool down);
EventHandler _Handler; EventHandler _Handler;

View File

@ -995,7 +995,7 @@ void NRF24L01::AddError()
} }
} }
void NRF24L01::OnIRQ(Pin pin, bool down, void* param) void NRF24L01::OnIRQ(InputPort* port, bool down, void* param)
{ {
// 必须在down=true才能读取到正确的状态 // 必须在down=true才能读取到正确的状态
if(!down) return; if(!down) return;

View File

@ -616,7 +616,7 @@ void W5500::Register(byte Index, HardSocket* handler)
} }
// irq 中断处理部分 // irq 中断处理部分
void W5500::OnIRQ(Pin pin, bool down, void* param) void W5500::OnIRQ(InputPort* port, bool down, void* param)
{ {
if(!down) return; // 低电平中断 if(!down) return; // 低电平中断

View File

@ -82,7 +82,7 @@ public:
private: private:
// 中断脚回调 // 中断脚回调
static void OnIRQ(Pin pin, bool down, void* param); static void OnIRQ(InputPort* port, bool down, void* param);
static void IRQTask(void* param); static void IRQTask(void* param);
void OnIRQ(); void OnIRQ();

View File

@ -23,7 +23,7 @@ private:
static void ReceiveTask(void* param); static void ReceiveTask(void* param);
uint _tidOpen; uint _tidOpen;
uint _tidRecv; uint _tidRecv;
static void OnIRQ(Pin pin, bool down, void* param); static void OnIRQ(InputPort* port, bool down, void* param);
void OnIRQ(); void OnIRQ();
int _Lock; // 收发数据锁,确保同时只有一个对象使用 int _Lock; // 收发数据锁,确保同时只有一个对象使用

View File

@ -510,15 +510,17 @@ void InputPort::OnPress(bool down)
if(down) if(down)
{ {
if((Mode & Rising) == 0) return; if((Mode & Rising) == 0) return;
_PressStart = Sys.Ms();
} }
else else
{ {
if((Mode & Falling) == 0) return; if((Mode & Falling) == 0) return;
PressTime = Sys.Ms() - _PressStart;
} }
if(HardEvent) if(HardEvent)
{ {
if(Handler) Handler(_Pin, down, Param); if(Handler) Handler(this, down, Param);
} }
else else
{ {
@ -538,8 +540,8 @@ void InputPort::InputTask(void* param)
{ {
port->_Value = 0; port->_Value = 0;
v &= port->Mode; v &= port->Mode;
if(v & Rising) port->Handler(port->_Pin, true, port->Param); if(v & Rising) port->Handler(port, true, port->Param);
if(v & Falling) port->Handler(port->_Pin, false, port->Param); if(v & Falling) port->Handler(port, false, port->Param);
} }
} }
} }

19
Port.h
View File

@ -82,14 +82,19 @@ public:
// 整体写入所有包含的引脚 // 整体写入所有包含的引脚
void Write(bool value); void Write(bool value);
void WriteGroup(ushort value); // 整组写入 // 整组写入
void Up(uint ms); // 拉高一段时间后拉低 void WriteGroup(ushort value);
void Blink(uint times, uint ms); // 闪烁多次 // 拉高一段时间后拉低
void Up(uint ms);
// 闪烁多次
void Blink(uint times, uint ms);
ushort ReadGroup(); // 整组读取 // 整组读取
ushort ReadGroup();
// 读取指定索引引脚。索引按照从小到大0xFF表示任意脚为true则返回true // 读取指定索引引脚。索引按照从小到大0xFF表示任意脚为true则返回true
bool Read(byte index); bool Read(byte index);
bool Read(); // Read() ReadReal() 的区别在 前者读输出 一个读输入 在开漏输出的时候有很大区别 // Read/ReadInput 的区别在于,前者读输出后者,读输入,在开漏输出的时候有很大区别
bool Read();
bool ReadInput(); bool ReadInput();
static bool Read(Pin pin); static bool Read(Pin pin);
@ -150,7 +155,7 @@ public:
}Trigger; }Trigger;
// 读取委托 // 读取委托
typedef void (*IOReadHandler)(Pin pin, bool down, void* param); typedef void (*IOReadHandler)(InputPort* port, bool down, void* param);
ushort ShakeTime; // 抖动时间。毫秒 ushort ShakeTime; // 抖动时间。毫秒
PuPd Pull; // 上拉下拉电阻 PuPd Pull; // 上拉下拉电阻
@ -159,6 +164,7 @@ public:
bool Invert; // 是否倒置输入输出 bool Invert; // 是否倒置输入输出
bool HardEvent; // 是否使用硬件事件。默认false bool HardEvent; // 是否使用硬件事件。默认false
ushort PressTime; // 长按时间
InputPort() : Port() { Init(); } InputPort() : Port() { Init(); }
InputPort(Pin pin, bool floating = true, PuPd pull = UP) : Port() InputPort(Pin pin, bool floating = true, PuPd pull = UP) : Port()
@ -194,6 +200,7 @@ private:
byte _Value; byte _Value;
uint _taskInput; // 输入任务 uint _taskInput; // 输入任务
ulong _PressStart; // 开始按下时间
static void InputTask(void* param); static void InputTask(void* param);
}; };