触摸开关自动识别输入口的倒置,两位三位触摸芯片都是低电平有效,只有四位触摸芯片高电平有效。

增加触摸开关的长按事件InitButtonPress,支持长按3秒重启,5秒重置
This commit is contained in:
nnhy 2015-11-05 10:09:44 +00:00
parent 4c63c376ba
commit 12a0856b39
5 changed files with 80 additions and 38 deletions

View File

@ -10,7 +10,7 @@
#endif #endif
InputPort* Button_GrayLevel::ACZero = NULL; InputPort* Button_GrayLevel::ACZero = NULL;
byte Button_GrayLevel::OnGrayLevel = 0xff; // 开灯时 led 灰度 byte Button_GrayLevel::OnGrayLevel = 0xFF; // 开灯时 led 灰度
byte Button_GrayLevel::OffGrayLevel = 0x00; // 关灯时 led 灰度 byte Button_GrayLevel::OffGrayLevel = 0x00; // 关灯时 led 灰度
int Button_GrayLevel::ACZeroAdjTime=2300; int Button_GrayLevel::ACZeroAdjTime=2300;
@ -22,40 +22,45 @@ Button_GrayLevel::Button_GrayLevel() : ByteDataPort()
Index = 0; Index = 0;
_Value = false; _Value = false;
_GrayLevelDrive = NULL; _Pwm = NULL;
_PulseIndex = 0xff; _Channel = 0;
_Handler = NULL; _Handler = NULL;
_Param = NULL; _Param = NULL;
_tid = 0; _tid = 0;
Next = 0xFF; Next = 0xFF;
OnPress = NULL;
} }
void Button_GrayLevel::Set(Pin key, Pin relay, bool relayInvert) void Button_GrayLevel::Set(Pin key, Pin relay, bool relayInvert)
{ {
assert_param(key != P0); assert_param(key != P0);
// 中断过滤模式
Key.Mode = InputPort::Rising;
Key.ShakeTime = 10;
Key.Set(key); Key.Set(key);
Key.Register(OnPress, this);
// 中断过滤模式
if(!OnPress)
Key.Mode = InputPort::Rising;
// 自动识别倒置
if(Key.Read())
Key.Invert = true;
Key.ShakeTime = 10;
Key.Register(OnKeyPress, this);
Key.Open(); Key.Open();
if(relay != P0) if(relay != P0) Relay.Init(relay, relayInvert).Open();
{
Relay.Invert = relayInvert;
Relay.Set(relay).Open();
}
} }
void Button_GrayLevel::Set(PWM* drive, byte pulseIndex) void Button_GrayLevel::Set(PWM* drive, byte pulseIndex)
{ {
if(drive && pulseIndex < 4) if(drive && pulseIndex < 4)
{ {
_GrayLevelDrive = drive; _Pwm = drive;
_PulseIndex = pulseIndex; _Channel = pulseIndex;
// 刷新输出 // 刷新输出
RenewGrayLevel(); RenewGrayLevel();
} }
@ -63,20 +68,20 @@ void Button_GrayLevel::Set(PWM* drive, byte pulseIndex)
void Button_GrayLevel::RenewGrayLevel() void Button_GrayLevel::RenewGrayLevel()
{ {
if(_GrayLevelDrive) if(_Pwm)
{ {
_GrayLevelDrive->Pulse[_PulseIndex] = _Value? (0xff-OnGrayLevel) : (0xff-OffGrayLevel); _Pwm->Pulse[_Channel] = _Value? (0xFF - OnGrayLevel) : (0xFF - OffGrayLevel);
_GrayLevelDrive->Config(); _Pwm->Config();
} }
} }
void Button_GrayLevel::OnPress(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;
if(btn) btn->OnPress(port->_Pin, down); if(btn) btn->OnKeyPress(port, down);
} }
void Button_GrayLevel::OnPress(Pin pin, bool down) void Button_GrayLevel::OnKeyPress(InputPort* port, bool down)
{ {
// 每次按下弹起,都取反状态 // 每次按下弹起,都取反状态
if(down) if(down)
@ -84,6 +89,10 @@ void Button_GrayLevel::OnPress(Pin pin, bool down)
SetValue(!_Value); SetValue(!_Value);
if(_Handler) _Handler(this, _Param); if(_Handler) _Handler(this, _Param);
} }
else
{
if(OnPress) OnPress(port, down, this);
}
} }
void Button_GrayLevel::Register(EventHandler handler, void* param) void Button_GrayLevel::Register(EventHandler handler, void* param)
@ -170,7 +179,7 @@ void Button_GrayLevel::Init(byte tim, byte count, Button_GrayLevel* btns, EventH
static PWM LedPWM(tim); static PWM LedPWM(tim);
// 设置分频 尽量不要改 Prescaler * Period 就是 PWM 周期 // 设置分频 尽量不要改 Prescaler * Period 就是 PWM 周期
LedPWM.Prescaler = 0x04; // 随便改 只要肉眼看不到都没问题 LedPWM.Prescaler = 0x04; // 随便改 只要肉眼看不到都没问题
LedPWM.Period = 0xff; // 对应灰度调节范围 LedPWM.Period = 0xFF; // 对应灰度调节范围
LedPWM.Start(); LedPWM.Start();
// 配置 LED 引脚 // 配置 LED 引脚

View File

@ -21,20 +21,6 @@ struct ButtonPin
// 干脆把_Value挪到最后解决问题 // 干脆把_Value挪到最后解决问题
class Button_GrayLevel : public ByteDataPort class Button_GrayLevel : public ByteDataPort
{ {
private:
static void OnPress(InputPort* port, bool down, void* param);
void OnPress(Pin pin, bool down);
EventHandler _Handler;
void* _Param;
// 指示灯灰度驱动器 PWM;
PWM* _GrayLevelDrive;
byte _PulseIndex;
private:
bool _Value; // 状态
ushort Reserved; // 补足对齐问题
public: public:
int Index; // 索引号,方便在众多按钮中标识按钮 int Index; // 索引号,方便在众多按钮中标识按钮
#if DEBUG #if DEBUG
@ -43,8 +29,9 @@ public:
InputPort Key; // 输入按键 InputPort Key; // 输入按键
OutputPort Relay; // 继电器 OutputPort Relay; // 继电器
static byte OnGrayLevel; // 开灯时 led 灰度
static byte OffGrayLevel; // 关灯时 led 灰度 // 长按事件。
InputPort::IOReadHandler OnPress;
public: public:
// 构造函数。指示灯和继电器一般开漏输出,需要倒置 // 构造函数。指示灯和继电器一般开漏输出,需要倒置
@ -61,9 +48,28 @@ public:
virtual int OnWrite(byte data); virtual int OnWrite(byte data);
virtual byte OnRead(); virtual byte OnRead();
private:
// 指示灯灰度驱动器 PWM;
PWM* _Pwm;
byte _Channel;
bool _Value; // 状态
ushort Reserved; // 补足对齐问题
EventHandler _Handler;
void* _Param;
static void OnKeyPress(InputPort* port, bool down, void* param);
void OnKeyPress(InputPort* port, bool down);
public:
static byte OnGrayLevel; // 开灯时 led 灰度
static byte OffGrayLevel; // 关灯时 led 灰度
static void Init(byte tim, byte count, Button_GrayLevel* btns, EventHandler onpress, const ButtonPin* pins, byte* level, const byte* state); static void Init(byte tim, byte count, Button_GrayLevel* btns, EventHandler onpress, const ButtonPin* pins, byte* level, const byte* state);
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);
// 过零检测 // 过零检测
private: private:
static int ACZeroAdjTime; // 过零检测时间补偿 默认 2300us static int ACZeroAdjTime; // 过零检测时间补偿 默认 2300us

View File

@ -514,7 +514,7 @@ void InputPort::OnPress(bool down)
_PressStart = Sys.Ms(); _PressStart = Sys.Ms();
else else
if (_PressStart > 0) PressTime = Sys.Ms() - _PressStart; if (_PressStart > 0) PressTime = Sys.Ms() - _PressStart;
debug_printf("OnPress P%c%d down=%d Invert=%d 时间=%d\r\n", _PIN_NAME(_Pin), down, Invert, PressTime); //debug_printf("OnPress P%c%d down=%d Invert=%d 时间=%d\r\n", _PIN_NAME(_Pin), down, Invert, PressTime);
if(down) if(down)
{ {

View File

@ -133,6 +133,28 @@ void ClearConfig()
Sys.Reset(); Sys.Reset();
} }
void CheckUserPress(InputPort* port, bool down, void* param)
{
if(down) return;
debug_printf("长按 %d 毫秒 \r\n", port->PressTime);
// 按下5秒清空设置并重启
if(port->PressTime >= 5000)
ClearConfig();
// 按下3秒重启
else if(port->PressTime >= 3000)
Sys.Reset();
}
void InitButtonPress(Button_GrayLevel* btns, byte count)
{
for(int i=0; i<count; i++)
{
btns[i].OnPress = CheckUserPress;
}
}
/*void NoUsed() /*void NoUsed()
{ {
Setup(1234, ""); Setup(1234, "");

View File

@ -6,6 +6,8 @@
#include "TinyNet\TinyClient.h" #include "TinyNet\TinyClient.h"
#include "App\Button_GrayLevel.h"
void Setup(ushort code, const char* name, COM_Def message = COM1, int baudRate = 1024000); void Setup(ushort code, const char* name, COM_Def message = COM1, int baudRate = 1024000);
void* InitConfig(void* data, uint size); void* InitConfig(void* data, uint size);
@ -16,6 +18,9 @@ ITransport* CreateShunCom(COM_Def index, int baudRate, Pin rst, Pin power, Pin s
TinyClient* CreateTinyClient(ITransport* port); TinyClient* CreateTinyClient(ITransport* port);
void CheckUserPress(InputPort* port, bool down, void* param = NULL);
void InitButtonPress(Button_GrayLevel* btns, byte count);
//void NoUsed(); //void NoUsed();
#endif #endif