CQ出版社セミナ "実習・Armマイコン内蔵ペリフェラルを活用するためのC++プログラミング" で使う外付け回路のテスト

Dependencies:   mbed UIT_SetOutputPortType UIT_AQM1602 UIT_ADT7410

Revision:
0:8c850cf6285d
Child:
1:0a21041026c7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PushButton/PushButton.cpp	Tue Mar 03 03:30:50 2020 +0000
@@ -0,0 +1,35 @@
+//----------------------------------------------------------------
+//  InterruptIn, Timeout を利用してチャタリングを防止するクラス
+//      割込みサービス・ルーチンは非 static 関数にしている
+//
+//  2019/02/16, Copyright (c) 2019 MIKAMI, Naoki
+//----------------------------------------------------------------
+
+#include "PushButton.hpp"
+
+using namespace Mikami;
+
+// コンストラクタ
+PushButton::PushButton(PinName pin, PinMode mode, RiseFall rf,
+                        void (*Func)(), float time)
+    : pbSw_(InterruptIn(pin, mode)), fp_(Func), time_(time)
+{
+    if (rf == RISE)
+        pbSw_.rise(callback(this, &PushButton::IsrIntrIn));
+    else
+        pbSw_.fall(callback(this, &PushButton::IsrIntrIn));
+}
+            
+// InterruptIn の割込みサービス・ルーチン
+void PushButton::IsrIntrIn()
+{
+    fp_();      // コンストラクタの引数で与えられた関数が実行される
+    pbSw_.disable_irq();
+    enabler_.attach(callback(this, &PushButton::IsrTimeout), time_);
+}
+
+// Timeout の割込みサービス・ルーチン
+void PushButton::IsrTimeout()
+{
+    pbSw_.enable_irq();
+}