外部割り込みにチャタリング対策を施したライブラリになっている.イベントが発生するとタイマーを起動させ,時間を空けて再度ピンの状態を調べるのだ.フライトピンのみならず,分離検知機構にも利用できるぞ!!

Dependents:   Hybrid_main_FirstEdtion

Committer:
Gaku0606
Date:
Mon Jul 17 10:05:35 2017 +0000
Revision:
2:5545caf08e9c
Parent:
1:9164a72286f1
ww

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Gaku0606 0:397d7fc7dba5 1 #ifndef _EXTERNAL_TRIGGER_HPP_
Gaku0606 0:397d7fc7dba5 2 #define _EXTERNAL_TRIGGER_HPP_
Gaku0606 0:397d7fc7dba5 3
Gaku0606 0:397d7fc7dba5 4 #include "mbed.h"
Gaku0606 0:397d7fc7dba5 5
Gaku0606 0:397d7fc7dba5 6 /**
Gaku0606 1:9164a72286f1 7 * @file ExternalTrigger.hpp
Gaku0606 1:9164a72286f1 8 * @author Gaku Matsumoto
Gaku0606 1:9164a72286f1 9 * @data 2016/01/28
Gaku0606 1:9164a72286f1 10 */
Gaku0606 1:9164a72286f1 11
Gaku0606 1:9164a72286f1 12 /**
Gaku0606 0:397d7fc7dba5 13 * 立ち上がりか立ち下がりかを決める引数
Gaku0606 0:397d7fc7dba5 14 */
Gaku0606 0:397d7fc7dba5 15 typedef enum{
Gaku0606 0:397d7fc7dba5 16 RISE = 1,
Gaku0606 0:397d7fc7dba5 17 FALL = 0
Gaku0606 0:397d7fc7dba5 18 }InterruptMode;
Gaku0606 0:397d7fc7dba5 19
Gaku0606 0:397d7fc7dba5 20 /**
Gaku0606 0:397d7fc7dba5 21 * @bref ピン変化割り込みをより身近にするためのライブラリです
Gaku0606 0:397d7fc7dba5 22 * @author Gaku MATSUMOTO
Gaku0606 0:397d7fc7dba5 23 * @note 別に使わなくてもいいです
Gaku0606 0:397d7fc7dba5 24 */
Gaku0606 0:397d7fc7dba5 25 class ExtTrigger{
Gaku0606 0:397d7fc7dba5 26 public:
Gaku0606 0:397d7fc7dba5 27 /**
Gaku0606 0:397d7fc7dba5 28 * @bref コンストラクタ,ピン割り込みを設定したいピン番号と割り込みモードを設定
Gaku0606 0:397d7fc7dba5 29 * @param[in] pin ピン番号 ex)p12
Gaku0606 0:397d7fc7dba5 30 * @param[in] mode RISE:立ち上がり割り込み, FALL:立ち下がり割り込み
Gaku0606 0:397d7fc7dba5 31 * @param[in] seconds チャタリング待ち時間
Gaku0606 0:397d7fc7dba5 32 * @note チャタリング待ち時間は引数無しだと無効になります.
Gaku0606 0:397d7fc7dba5 33 */
Gaku0606 0:397d7fc7dba5 34 ExtTrigger(PinName pin, InterruptMode mode, float seconds = 0.0);
Gaku0606 0:397d7fc7dba5 35
Gaku0606 0:397d7fc7dba5 36 /**
Gaku0606 0:397d7fc7dba5 37 * @bref コンストラクタ,ピン割り込みを設定したいピン番号と割り込みモードを設定
Gaku0606 0:397d7fc7dba5 38 * @param[in] pin ピン番号 ex)p12
Gaku0606 0:397d7fc7dba5 39 * @param[in] mode RISE:立ち上がり割り込み, FALL:立ち下がり割り込み
Gaku0606 0:397d7fc7dba5 40 * @param[in] *func イベントが発生したときに呼び出す関数のアドレス
Gaku0606 0:397d7fc7dba5 41 * @param[in] seconds チャタリング待ち時間
Gaku0606 0:397d7fc7dba5 42 * @note チャタリング待ち時間は引数無しだと無効になります
Gaku0606 0:397d7fc7dba5 43 */
Gaku0606 0:397d7fc7dba5 44 ExtTrigger(PinName pin, InterruptMode mode, void (*func)(), float seconds = 0.0);
Gaku0606 0:397d7fc7dba5 45
Gaku0606 0:397d7fc7dba5 46 /**
Gaku0606 0:397d7fc7dba5 47 * @bref デストラクタ,割り込みピンを開放します.
Gaku0606 0:397d7fc7dba5 48 */
Gaku0606 0:397d7fc7dba5 49 ~ExtTrigger(){
Gaku0606 0:397d7fc7dba5 50 _pin.disable_irq();
Gaku0606 0:397d7fc7dba5 51 };
Gaku0606 0:397d7fc7dba5 52
Gaku0606 0:397d7fc7dba5 53 public:
Gaku0606 0:397d7fc7dba5 54
Gaku0606 0:397d7fc7dba5 55 /**
Gaku0606 0:397d7fc7dba5 56 * @bref 指定したピンをプルダウンに設定します
Gaku0606 0:397d7fc7dba5 57 */
Gaku0606 0:397d7fc7dba5 58 void setPullDown();
Gaku0606 0:397d7fc7dba5 59
Gaku0606 0:397d7fc7dba5 60 /**
Gaku0606 0:397d7fc7dba5 61 * @bref 指定したピンをプルアップ設定します
Gaku0606 0:397d7fc7dba5 62 */
Gaku0606 0:397d7fc7dba5 63 void setPullUp();
Gaku0606 0:397d7fc7dba5 64
Gaku0606 0:397d7fc7dba5 65 /**
Gaku0606 0:397d7fc7dba5 66 * @bref 指定したピンをオープンにします.
Gaku0606 0:397d7fc7dba5 67 */
Gaku0606 0:397d7fc7dba5 68 void setPullNone();
Gaku0606 0:397d7fc7dba5 69
Gaku0606 0:397d7fc7dba5 70 /**
Gaku0606 0:397d7fc7dba5 71 * フラグが立っているかどうかを確認します
Gaku0606 0:397d7fc7dba5 72 * @return 1: 指定した動作が行われた,0: まだイベントは起きていない
Gaku0606 0:397d7fc7dba5 73 */
Gaku0606 0:397d7fc7dba5 74 int judgement();
Gaku0606 0:397d7fc7dba5 75
Gaku0606 0:397d7fc7dba5 76 /**
Gaku0606 0:397d7fc7dba5 77 * @bref フラグを強制的に下げます.
Gaku0606 0:397d7fc7dba5 78 */
Gaku0606 0:397d7fc7dba5 79 void clear();
Gaku0606 0:397d7fc7dba5 80
Gaku0606 0:397d7fc7dba5 81 /**
Gaku0606 0:397d7fc7dba5 82 * @bref チャタリング対策として,最初のトリガーから設定した時間経った後再度確認するタイマーをセットします.
Gaku0606 0:397d7fc7dba5 83 * @param[in] seconds float型,[秒]
Gaku0606 0:397d7fc7dba5 84 */
Gaku0606 0:397d7fc7dba5 85 void antiChattering(float seconds);
Gaku0606 0:397d7fc7dba5 86
Gaku0606 0:397d7fc7dba5 87 /**
Gaku0606 0:397d7fc7dba5 88 * @bref 呼び出される関数を後から設定したり,変更します.
Gaku0606 0:397d7fc7dba5 89 * @note インスタンス生成のときに入れた方がいいかもしれません.
Gaku0606 0:397d7fc7dba5 90 */
Gaku0606 0:397d7fc7dba5 91 void setCallFunc(void (*func)());
Gaku0606 0:397d7fc7dba5 92
Gaku0606 2:5545caf08e9c 93 /**
Gaku0606 2:5545caf08e9c 94 * @bref ピンの状態を読み取る
Gaku0606 2:5545caf08e9c 95 */
Gaku0606 2:5545caf08e9c 96 int read(){
Gaku0606 2:5545caf08e9c 97 return _pin.read();
Gaku0606 2:5545caf08e9c 98 }
Gaku0606 2:5545caf08e9c 99
Gaku0606 0:397d7fc7dba5 100 private:
Gaku0606 0:397d7fc7dba5 101 Timeout antiC_timer;
Gaku0606 0:397d7fc7dba5 102 float _sec;
Gaku0606 0:397d7fc7dba5 103 ExtTrigger* _ext;
Gaku0606 0:397d7fc7dba5 104 InterruptIn _pin;
Gaku0606 0:397d7fc7dba5 105 void (*callFunc)();
Gaku0606 0:397d7fc7dba5 106 int userFuncFlag;
Gaku0606 0:397d7fc7dba5 107 void checkAgain();
Gaku0606 0:397d7fc7dba5 108 void interruptFunc();
Gaku0606 0:397d7fc7dba5 109 int flag;
Gaku0606 0:397d7fc7dba5 110 InterruptMode _mode;
Gaku0606 0:397d7fc7dba5 111 };
Gaku0606 0:397d7fc7dba5 112
Gaku0606 0:397d7fc7dba5 113 ExtTrigger::ExtTrigger(PinName pin, InterruptMode mode, float seconds) : _pin(pin){
Gaku0606 0:397d7fc7dba5 114 userFuncFlag = 0;
Gaku0606 0:397d7fc7dba5 115 _mode = mode;
Gaku0606 0:397d7fc7dba5 116 _sec = seconds;
Gaku0606 0:397d7fc7dba5 117 _ext = this;
Gaku0606 0:397d7fc7dba5 118 flag = 0;
Gaku0606 0:397d7fc7dba5 119 //立ち上がり割り込み設定
Gaku0606 0:397d7fc7dba5 120 if(mode == RISE){
Gaku0606 0:397d7fc7dba5 121 _pin.rise(_ext, &ExtTrigger::interruptFunc);
Gaku0606 0:397d7fc7dba5 122 }
Gaku0606 0:397d7fc7dba5 123 //立ち下がり割り込み設定
Gaku0606 0:397d7fc7dba5 124 else if (mode == FALL){
Gaku0606 0:397d7fc7dba5 125 _pin.fall(_ext, &ExtTrigger::interruptFunc);
Gaku0606 0:397d7fc7dba5 126 }
Gaku0606 0:397d7fc7dba5 127 else{
Gaku0606 0:397d7fc7dba5 128 error("ExternalTrigger error\r\n");
Gaku0606 0:397d7fc7dba5 129 }
Gaku0606 0:397d7fc7dba5 130 }
Gaku0606 0:397d7fc7dba5 131
Gaku0606 0:397d7fc7dba5 132 ExtTrigger::ExtTrigger(PinName pin, InterruptMode mode, void (*func)(), float seconds) : _pin(pin){
Gaku0606 0:397d7fc7dba5 133
Gaku0606 0:397d7fc7dba5 134 userFuncFlag = 0;
Gaku0606 0:397d7fc7dba5 135 _mode = mode;
Gaku0606 0:397d7fc7dba5 136 _sec = seconds;
Gaku0606 0:397d7fc7dba5 137 _ext = this;
Gaku0606 0:397d7fc7dba5 138 flag = 0;
Gaku0606 0:397d7fc7dba5 139 callFunc = *func;
Gaku0606 0:397d7fc7dba5 140 userFuncFlag = 1;
Gaku0606 0:397d7fc7dba5 141 //立ち上がり割り込み設定
Gaku0606 0:397d7fc7dba5 142 if(mode == RISE){
Gaku0606 0:397d7fc7dba5 143 _pin.rise(_ext, &ExtTrigger::interruptFunc);
Gaku0606 0:397d7fc7dba5 144 }
Gaku0606 0:397d7fc7dba5 145 //立ち下がり割り込み設定
Gaku0606 0:397d7fc7dba5 146 else if (mode == FALL){
Gaku0606 0:397d7fc7dba5 147 _pin.fall(_ext, &ExtTrigger::interruptFunc);
Gaku0606 0:397d7fc7dba5 148 }
Gaku0606 0:397d7fc7dba5 149 else{
Gaku0606 0:397d7fc7dba5 150 error("ExternalTrigger error\r\n");
Gaku0606 0:397d7fc7dba5 151 }
Gaku0606 0:397d7fc7dba5 152 }
Gaku0606 0:397d7fc7dba5 153
Gaku0606 0:397d7fc7dba5 154 int ExtTrigger::judgement(){
Gaku0606 0:397d7fc7dba5 155 return flag;
Gaku0606 0:397d7fc7dba5 156 }
Gaku0606 0:397d7fc7dba5 157
Gaku0606 0:397d7fc7dba5 158 void ExtTrigger::clear(){
Gaku0606 0:397d7fc7dba5 159 flag = 0;
Gaku0606 0:397d7fc7dba5 160 return;
Gaku0606 0:397d7fc7dba5 161 }
Gaku0606 0:397d7fc7dba5 162
Gaku0606 0:397d7fc7dba5 163 void ExtTrigger::antiChattering(float seconds){
Gaku0606 0:397d7fc7dba5 164 _sec = seconds;
Gaku0606 0:397d7fc7dba5 165 return;
Gaku0606 0:397d7fc7dba5 166 }
Gaku0606 0:397d7fc7dba5 167
Gaku0606 0:397d7fc7dba5 168 void ExtTrigger::setCallFunc(void (*func)()){
Gaku0606 0:397d7fc7dba5 169 if(*func != NULL){
Gaku0606 0:397d7fc7dba5 170 userFuncFlag = 1;
Gaku0606 0:397d7fc7dba5 171 callFunc = *func;//関数のアドレスを保存
Gaku0606 0:397d7fc7dba5 172 }
Gaku0606 0:397d7fc7dba5 173 else{
Gaku0606 0:397d7fc7dba5 174 userFuncFlag = 0;
Gaku0606 0:397d7fc7dba5 175 }
Gaku0606 0:397d7fc7dba5 176 }
Gaku0606 0:397d7fc7dba5 177
Gaku0606 0:397d7fc7dba5 178 void ExtTrigger::interruptFunc(){
Gaku0606 0:397d7fc7dba5 179 //タイマーセット
Gaku0606 0:397d7fc7dba5 180 flag = 0;
Gaku0606 0:397d7fc7dba5 181 if(_sec != 0.0){
Gaku0606 0:397d7fc7dba5 182 antiC_timer.attach(_ext, &ExtTrigger::checkAgain, _sec);
Gaku0606 0:397d7fc7dba5 183 }
Gaku0606 0:397d7fc7dba5 184 else{
Gaku0606 0:397d7fc7dba5 185 flag = 1;
Gaku0606 0:397d7fc7dba5 186 if(userFuncFlag) (*callFunc)();
Gaku0606 0:397d7fc7dba5 187 }
Gaku0606 0:397d7fc7dba5 188 return;
Gaku0606 0:397d7fc7dba5 189 }
Gaku0606 0:397d7fc7dba5 190
Gaku0606 0:397d7fc7dba5 191 void ExtTrigger::checkAgain(){
Gaku0606 0:397d7fc7dba5 192 if(_mode == RISE){
Gaku0606 0:397d7fc7dba5 193 if(_pin.read() == 1) flag = 1;
Gaku0606 0:397d7fc7dba5 194 else flag = 0;
Gaku0606 0:397d7fc7dba5 195 }
Gaku0606 0:397d7fc7dba5 196 else{
Gaku0606 0:397d7fc7dba5 197 if(_pin.read() == 0) flag = 1;
Gaku0606 0:397d7fc7dba5 198 else flag = 0;
Gaku0606 0:397d7fc7dba5 199 }
Gaku0606 0:397d7fc7dba5 200
Gaku0606 0:397d7fc7dba5 201 if(userFuncFlag && flag) (*callFunc)();
Gaku0606 0:397d7fc7dba5 202 return;
Gaku0606 0:397d7fc7dba5 203 }
Gaku0606 0:397d7fc7dba5 204
Gaku0606 0:397d7fc7dba5 205 void ExtTrigger::setPullDown(){
Gaku0606 0:397d7fc7dba5 206 _pin.mode(PullDown);
Gaku0606 0:397d7fc7dba5 207 return;
Gaku0606 0:397d7fc7dba5 208 }
Gaku0606 0:397d7fc7dba5 209
Gaku0606 0:397d7fc7dba5 210 void ExtTrigger::setPullUp(){
Gaku0606 0:397d7fc7dba5 211 _pin.mode(PullUp);
Gaku0606 0:397d7fc7dba5 212 return;
Gaku0606 0:397d7fc7dba5 213 }
Gaku0606 0:397d7fc7dba5 214
Gaku0606 0:397d7fc7dba5 215 void ExtTrigger::setPullNone(){
Gaku0606 0:397d7fc7dba5 216 _pin.mode(PullNone);
Gaku0606 0:397d7fc7dba5 217 return;
Gaku0606 0:397d7fc7dba5 218 }
Gaku0606 0:397d7fc7dba5 219
Gaku0606 0:397d7fc7dba5 220 #endif