From c7f3052bd3cc8073814b92b3ca100678a8be6b1e Mon Sep 17 00:00:00 2001 From: 12 <213> Date: Sat, 6 May 2017 15:55:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=89=E6=A0=85=E6=8C=87?= =?UTF-8?q?=E7=A4=BA=E7=81=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Board/IOK0612.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++++- Board/IOK0612.h | 6 ++++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/Board/IOK0612.cpp b/Board/IOK0612.cpp index cc3473f1..71049618 100644 --- a/Board/IOK0612.cpp +++ b/Board/IOK0612.cpp @@ -1,4 +1,5 @@ #include "IOK0612.h" +#include "Drivers\Esp8266\Esp8266.h" IOK0612* IOK0612::Current = nullptr; @@ -6,7 +7,7 @@ IOK0612::IOK0612() { LedPins.Clear(); ButtonPins.Clear(); - LedPins.Add(PB7); + LedPins.Add(PB10); ButtonPins.Add(PB6); Esp.Com = COM2; @@ -17,7 +18,90 @@ IOK0612::IOK0612() Current = this; } +static bool ledstat2 = false; +//重写指示灯默认倒置 +void IOK0612::InitLeds() +{ + for (int i = 0; i < LedPins.Count(); i++) + { + auto port = new OutputPort(LedPins[i], LedInvert); + //auto port = new OutputPort(LedPins[i], false); + port->Open(); + port->Write(false); + Leds.Add(port); + } +} + + +void IOK0612::FlushLed() +{ + if (LedsShow == 0) // 启动时候20秒 + { + auto esp = dynamic_cast(Host); + if (esp && esp->Linked) // 8266 初始化完成 且 连接完成 + { + Sys.SetTaskPeriod(LedsTaskId, 500); // 慢闪 + } + + Leds[0]->Write(ledstat2); + ledstat2 = !ledstat2; + + if (Sys.Ms() > 20000) + { + Leds[0]->Write(false); + LedsShow = 2; // 置为无效状态 + } + } + + bool stat = false; + // 3分钟内 Client还活着则表示 联网OK + if (Client && Client->LastActive + 180000 > Sys.Ms() && LedsShow == 1)stat = true; + Leds[1]->Write(stat); + if (LedsShow == 2)Sys.SetTask(LedsTaskId, false); +} + +byte IOK0612::LedStat(byte showmode) +{ + auto esp = dynamic_cast(Host); + if (esp) + { + if (showmode == 1) + { + esp->RemoveLed(); + esp->SetLed(*Leds[0]); + } + else + { + esp->RemoveLed(); + // 维护状态为false + Leds[0]->Write(false); + } + } + + if (showmode != 2) + { + if (!LedsTaskId) + { + LedsTaskId = Sys.AddTask(&IOK0612::FlushLed, this, 500, 100, "CltLedStat"); + debug_printf("AddTask(IOK027X:FlushLed)\r\n"); + } + else + { + Sys.SetTask(LedsTaskId, true); + if (showmode == 1)Sys.SetTaskPeriod(LedsTaskId, 500); + } + LedsShow = showmode; + } + if (showmode == 2) + { + // 由任务自己结束,顺带维护输出状态为false + // if (LedsTaskId)Sys.SetTask(LedsTaskId, false); + LedsShow = 2; + + } + return LedsShow; +} /* NRF24L01+ (SPI3) NSS | diff --git a/Board/IOK0612.h b/Board/IOK0612.h index 29d4b6ce..6213c492 100644 --- a/Board/IOK0612.h +++ b/Board/IOK0612.h @@ -7,7 +7,13 @@ class IOK0612 : public B8266 { public: + byte LedsShow; // LED 显示状态开关 0 刚启动时候的20秒 1 使能 2 失能 + uint LedsTaskId; + IOK0612(); + void InitLeds(); + void FlushLed(); // 刷新led状态输出 + byte LedStat(byte showmode); static IOK0612* Current; };