修改长按逻辑为延时关闭,且不提供复位和清零配置
This commit is contained in:
parent
5de32c89e3
commit
6fc7930c40
|
@ -32,8 +32,6 @@ Button_GrayLevel::Button_GrayLevel() : ByteDataPort()
|
||||||
|
|
||||||
_tid = 0;
|
_tid = 0;
|
||||||
Next = 0xFF;
|
Next = 0xFF;
|
||||||
|
|
||||||
OnPress = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Button_GrayLevel::Set(Pin key, Pin relay, bool relayInvert)
|
void Button_GrayLevel::Set(Pin key, Pin relay, bool relayInvert)
|
||||||
|
@ -41,8 +39,7 @@ void Button_GrayLevel::Set(Pin key, Pin relay, bool relayInvert)
|
||||||
Key.Set(key);
|
Key.Set(key);
|
||||||
|
|
||||||
// 中断过滤模式
|
// 中断过滤模式
|
||||||
if(!OnPress)
|
Key.Mode = InputPort::Both;
|
||||||
Key.Mode = InputPort::Rising;
|
|
||||||
|
|
||||||
Key.ShakeTime = 40;
|
Key.ShakeTime = 40;
|
||||||
Key.Register(OnKeyPress, this);
|
Key.Register(OnKeyPress, this);
|
||||||
|
@ -71,6 +68,24 @@ void Button_GrayLevel::RenewGrayLevel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Button_GrayLevel::GrayLevelUp()
|
||||||
|
{
|
||||||
|
if (_Pwm)
|
||||||
|
{
|
||||||
|
_Pwm->Pulse[_Channel] = (0xFF - OnGrayLevel);
|
||||||
|
_Pwm->Config();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Button_GrayLevel::GrayLevelDown()
|
||||||
|
{
|
||||||
|
if (_Pwm)
|
||||||
|
{
|
||||||
|
_Pwm->Pulse[_Channel] = (0xFF - OnGrayLevel);
|
||||||
|
_Pwm->Config();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Button_GrayLevel::OnKeyPress(InputPort* port, bool down, void* param)
|
void Button_GrayLevel::OnKeyPress(InputPort* port, bool down, void* param)
|
||||||
{
|
{
|
||||||
Button_GrayLevel* btn = (Button_GrayLevel*)param;
|
Button_GrayLevel* btn = (Button_GrayLevel*)param;
|
||||||
|
@ -80,15 +95,66 @@ void Button_GrayLevel::OnKeyPress(InputPort* port, bool down, void* param)
|
||||||
void Button_GrayLevel::OnKeyPress(InputPort* port, bool down)
|
void Button_GrayLevel::OnKeyPress(InputPort* port, bool down)
|
||||||
{
|
{
|
||||||
// 每次按下弹起,都取反状态
|
// 每次按下弹起,都取反状态
|
||||||
if(down)
|
/*if(down)
|
||||||
{
|
{
|
||||||
SetValue(!_Value);
|
SetValue(!_Value);
|
||||||
if(_Handler) _Handler(this, _Param);
|
if(_Handler) _Handler(this, _Param);
|
||||||
}
|
}
|
||||||
|
else*/
|
||||||
|
if (!down) // 要处理长按而不动作 所以必须是弹起响应
|
||||||
|
{
|
||||||
|
switch (Stat)
|
||||||
|
{
|
||||||
|
case normal:
|
||||||
|
// 常规模式,长按进入设置模式,并且不动作。否则执行动作
|
||||||
|
if (_Value == true)
|
||||||
|
{
|
||||||
|
if (port->PressTime > 1500)
|
||||||
|
{
|
||||||
|
if (port->PressTime > 3000)
|
||||||
|
DelayClose2(10 * 60 * 1000);
|
||||||
|
else
|
||||||
|
DelayClose2(2 * 60 * 1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetValue(!_Value);
|
||||||
|
if (_Handler) _Handler(this, _Param);
|
||||||
|
break;
|
||||||
|
case set:
|
||||||
|
Stat = normal;
|
||||||
|
Next = 0xff;
|
||||||
|
SetValue(!_Value);
|
||||||
|
if (_Handler) _Handler(this, _Param);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Close2Task(void * param)
|
||||||
|
{
|
||||||
|
auto bt = (Button_GrayLevel *)param;
|
||||||
|
bt->GrayLevelUp();
|
||||||
|
if (bt->delaytime > 1000)
|
||||||
|
{
|
||||||
|
bt->delaytime = bt->delaytime - 1000;
|
||||||
|
Sys.SetTask(bt->_task2, true, 1000);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(OnPress) OnPress(port, down, this);
|
bt->delaytime = 0;
|
||||||
|
Sys.SetTask(bt->_task2, false);
|
||||||
|
bt->SetValue(false);
|
||||||
}
|
}
|
||||||
|
Sys.Sleep(100);
|
||||||
|
bt->GrayLevelDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Button_GrayLevel::DelayClose2(int ms)
|
||||||
|
{
|
||||||
|
if (_task2)Sys.AddTask(Close2Task, this, -1, 1000, "button close");
|
||||||
|
Sys.SetTask(_task2, true, 1000);
|
||||||
|
delaytime = ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Button_GrayLevel::Register(EventHandler handler, void* param)
|
void Button_GrayLevel::Register(EventHandler handler, void* param)
|
||||||
|
|
|
@ -15,6 +15,14 @@ struct ButtonPin
|
||||||
byte PwmIndex;
|
byte PwmIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ButtonStat :byte
|
||||||
|
{
|
||||||
|
normal = 0, // 正常
|
||||||
|
set = 1, // 设置
|
||||||
|
externSet = 2, // 外部设置
|
||||||
|
execution = 3, // 执行设置
|
||||||
|
};
|
||||||
|
|
||||||
// 面板按钮
|
// 面板按钮
|
||||||
// 这里必须使用_packed关键字,生成对齐的代码,否则_Value只占一个字节,导致后面的成员进行内存操作时错乱
|
// 这里必须使用_packed关键字,生成对齐的代码,否则_Value只占一个字节,导致后面的成员进行内存操作时错乱
|
||||||
//__packed class Button
|
//__packed class Button
|
||||||
|
@ -29,9 +37,12 @@ public:
|
||||||
|
|
||||||
InputPort Key; // 输入按键
|
InputPort Key; // 输入按键
|
||||||
OutputPort Relay; // 继电器
|
OutputPort Relay; // 继电器
|
||||||
|
enum ButtonStat Stat = normal; // 状态
|
||||||
|
|
||||||
// 长按事件。
|
// 外部设置模式调用
|
||||||
InputPort::IOReadHandler OnPress;
|
typedef bool(*IOHandler)(Button_GrayLevel* bt, bool down, void * param);
|
||||||
|
IOHandler ExterSet = nullptr;
|
||||||
|
void * ExterSetParam = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 构造函数。指示灯和继电器一般开漏输出,需要倒置
|
// 构造函数。指示灯和继电器一般开漏输出,需要倒置
|
||||||
|
@ -45,6 +56,9 @@ public:
|
||||||
void RenewGrayLevel();
|
void RenewGrayLevel();
|
||||||
void Register(EventHandler handler, void* param = nullptr);
|
void Register(EventHandler handler, void* param = nullptr);
|
||||||
|
|
||||||
|
virtual int Write(byte* pcmd); // 重载 ByteDataPort 的函数 自定义 Delay Flush Open Close
|
||||||
|
//virtual int Read(byte* cmd);
|
||||||
|
|
||||||
virtual int OnWrite(byte data);
|
virtual int OnWrite(byte data);
|
||||||
virtual byte OnRead();
|
virtual byte OnRead();
|
||||||
|
|
||||||
|
@ -70,6 +84,11 @@ public:
|
||||||
static void InitZero(Pin zero, int us = 2300);
|
static void InitZero(Pin zero, int us = 2300);
|
||||||
static bool UpdateLevel(byte* level, Button_GrayLevel* btns, byte count);
|
static bool UpdateLevel(byte* level, Button_GrayLevel* btns, byte count);
|
||||||
|
|
||||||
|
void GrayLevelDown();
|
||||||
|
void GrayLevelUp();
|
||||||
|
void DelayClose2(int ms); // 自定义延时关闭
|
||||||
|
int delaytime = 0;
|
||||||
|
int _task2 = 0;
|
||||||
// 过零检测
|
// 过零检测
|
||||||
private:
|
private:
|
||||||
static int ACZeroAdjTime; // 过零检测时间补偿 默认 2300us
|
static int ACZeroAdjTime; // 过零检测时间补偿 默认 2300us
|
||||||
|
|
Loading…
Reference in New Issue