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

Dependents:   Hybrid_main_FirstEdtion

Committer:
Gaku0606
Date:
Sun Jan 29 07:43:29 2017 +0000
Revision:
1:9164a72286f1
Parent:
0:397d7fc7dba5
Child:
2:5545caf08e9c
???????

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 0:397d7fc7dba5 93 private:
Gaku0606 0:397d7fc7dba5 94 Timeout antiC_timer;
Gaku0606 0:397d7fc7dba5 95 float _sec;
Gaku0606 0:397d7fc7dba5 96 ExtTrigger* _ext;
Gaku0606 0:397d7fc7dba5 97 InterruptIn _pin;
Gaku0606 0:397d7fc7dba5 98 void (*callFunc)();
Gaku0606 0:397d7fc7dba5 99 int userFuncFlag;
Gaku0606 0:397d7fc7dba5 100 void checkAgain();
Gaku0606 0:397d7fc7dba5 101 void interruptFunc();
Gaku0606 0:397d7fc7dba5 102 int flag;
Gaku0606 0:397d7fc7dba5 103 InterruptMode _mode;
Gaku0606 0:397d7fc7dba5 104 };
Gaku0606 0:397d7fc7dba5 105
Gaku0606 0:397d7fc7dba5 106 ExtTrigger::ExtTrigger(PinName pin, InterruptMode mode, float seconds) : _pin(pin){
Gaku0606 0:397d7fc7dba5 107 userFuncFlag = 0;
Gaku0606 0:397d7fc7dba5 108 _mode = mode;
Gaku0606 0:397d7fc7dba5 109 _sec = seconds;
Gaku0606 0:397d7fc7dba5 110 _ext = this;
Gaku0606 0:397d7fc7dba5 111 flag = 0;
Gaku0606 0:397d7fc7dba5 112 //立ち上がり割り込み設定
Gaku0606 0:397d7fc7dba5 113 if(mode == RISE){
Gaku0606 0:397d7fc7dba5 114 _pin.rise(_ext, &ExtTrigger::interruptFunc);
Gaku0606 0:397d7fc7dba5 115 }
Gaku0606 0:397d7fc7dba5 116 //立ち下がり割り込み設定
Gaku0606 0:397d7fc7dba5 117 else if (mode == FALL){
Gaku0606 0:397d7fc7dba5 118 _pin.fall(_ext, &ExtTrigger::interruptFunc);
Gaku0606 0:397d7fc7dba5 119 }
Gaku0606 0:397d7fc7dba5 120 else{
Gaku0606 0:397d7fc7dba5 121 error("ExternalTrigger error\r\n");
Gaku0606 0:397d7fc7dba5 122 }
Gaku0606 0:397d7fc7dba5 123 }
Gaku0606 0:397d7fc7dba5 124
Gaku0606 0:397d7fc7dba5 125 ExtTrigger::ExtTrigger(PinName pin, InterruptMode mode, void (*func)(), float seconds) : _pin(pin){
Gaku0606 0:397d7fc7dba5 126
Gaku0606 0:397d7fc7dba5 127 userFuncFlag = 0;
Gaku0606 0:397d7fc7dba5 128 _mode = mode;
Gaku0606 0:397d7fc7dba5 129 _sec = seconds;
Gaku0606 0:397d7fc7dba5 130 _ext = this;
Gaku0606 0:397d7fc7dba5 131 flag = 0;
Gaku0606 0:397d7fc7dba5 132 callFunc = *func;
Gaku0606 0:397d7fc7dba5 133 userFuncFlag = 1;
Gaku0606 0:397d7fc7dba5 134 //立ち上がり割り込み設定
Gaku0606 0:397d7fc7dba5 135 if(mode == RISE){
Gaku0606 0:397d7fc7dba5 136 _pin.rise(_ext, &ExtTrigger::interruptFunc);
Gaku0606 0:397d7fc7dba5 137 }
Gaku0606 0:397d7fc7dba5 138 //立ち下がり割り込み設定
Gaku0606 0:397d7fc7dba5 139 else if (mode == FALL){
Gaku0606 0:397d7fc7dba5 140 _pin.fall(_ext, &ExtTrigger::interruptFunc);
Gaku0606 0:397d7fc7dba5 141 }
Gaku0606 0:397d7fc7dba5 142 else{
Gaku0606 0:397d7fc7dba5 143 error("ExternalTrigger error\r\n");
Gaku0606 0:397d7fc7dba5 144 }
Gaku0606 0:397d7fc7dba5 145 }
Gaku0606 0:397d7fc7dba5 146
Gaku0606 0:397d7fc7dba5 147 int ExtTrigger::judgement(){
Gaku0606 0:397d7fc7dba5 148 return flag;
Gaku0606 0:397d7fc7dba5 149 }
Gaku0606 0:397d7fc7dba5 150
Gaku0606 0:397d7fc7dba5 151 void ExtTrigger::clear(){
Gaku0606 0:397d7fc7dba5 152 flag = 0;
Gaku0606 0:397d7fc7dba5 153 return;
Gaku0606 0:397d7fc7dba5 154 }
Gaku0606 0:397d7fc7dba5 155
Gaku0606 0:397d7fc7dba5 156 void ExtTrigger::antiChattering(float seconds){
Gaku0606 0:397d7fc7dba5 157 _sec = seconds;
Gaku0606 0:397d7fc7dba5 158 return;
Gaku0606 0:397d7fc7dba5 159 }
Gaku0606 0:397d7fc7dba5 160
Gaku0606 0:397d7fc7dba5 161 void ExtTrigger::setCallFunc(void (*func)()){
Gaku0606 0:397d7fc7dba5 162 if(*func != NULL){
Gaku0606 0:397d7fc7dba5 163 userFuncFlag = 1;
Gaku0606 0:397d7fc7dba5 164 callFunc = *func;//関数のアドレスを保存
Gaku0606 0:397d7fc7dba5 165 }
Gaku0606 0:397d7fc7dba5 166 else{
Gaku0606 0:397d7fc7dba5 167 userFuncFlag = 0;
Gaku0606 0:397d7fc7dba5 168 }
Gaku0606 0:397d7fc7dba5 169 }
Gaku0606 0:397d7fc7dba5 170
Gaku0606 0:397d7fc7dba5 171 void ExtTrigger::interruptFunc(){
Gaku0606 0:397d7fc7dba5 172 //タイマーセット
Gaku0606 0:397d7fc7dba5 173 flag = 0;
Gaku0606 0:397d7fc7dba5 174 if(_sec != 0.0){
Gaku0606 0:397d7fc7dba5 175 antiC_timer.attach(_ext, &ExtTrigger::checkAgain, _sec);
Gaku0606 0:397d7fc7dba5 176 }
Gaku0606 0:397d7fc7dba5 177 else{
Gaku0606 0:397d7fc7dba5 178 flag = 1;
Gaku0606 0:397d7fc7dba5 179 if(userFuncFlag) (*callFunc)();
Gaku0606 0:397d7fc7dba5 180 }
Gaku0606 0:397d7fc7dba5 181 return;
Gaku0606 0:397d7fc7dba5 182 }
Gaku0606 0:397d7fc7dba5 183
Gaku0606 0:397d7fc7dba5 184 void ExtTrigger::checkAgain(){
Gaku0606 0:397d7fc7dba5 185 if(_mode == RISE){
Gaku0606 0:397d7fc7dba5 186 if(_pin.read() == 1) flag = 1;
Gaku0606 0:397d7fc7dba5 187 else flag = 0;
Gaku0606 0:397d7fc7dba5 188 }
Gaku0606 0:397d7fc7dba5 189 else{
Gaku0606 0:397d7fc7dba5 190 if(_pin.read() == 0) flag = 1;
Gaku0606 0:397d7fc7dba5 191 else flag = 0;
Gaku0606 0:397d7fc7dba5 192 }
Gaku0606 0:397d7fc7dba5 193
Gaku0606 0:397d7fc7dba5 194 if(userFuncFlag && flag) (*callFunc)();
Gaku0606 0:397d7fc7dba5 195 return;
Gaku0606 0:397d7fc7dba5 196 }
Gaku0606 0:397d7fc7dba5 197
Gaku0606 0:397d7fc7dba5 198 void ExtTrigger::setPullDown(){
Gaku0606 0:397d7fc7dba5 199 _pin.mode(PullDown);
Gaku0606 0:397d7fc7dba5 200 return;
Gaku0606 0:397d7fc7dba5 201 }
Gaku0606 0:397d7fc7dba5 202
Gaku0606 0:397d7fc7dba5 203 void ExtTrigger::setPullUp(){
Gaku0606 0:397d7fc7dba5 204 _pin.mode(PullUp);
Gaku0606 0:397d7fc7dba5 205 return;
Gaku0606 0:397d7fc7dba5 206 }
Gaku0606 0:397d7fc7dba5 207
Gaku0606 0:397d7fc7dba5 208 void ExtTrigger::setPullNone(){
Gaku0606 0:397d7fc7dba5 209 _pin.mode(PullNone);
Gaku0606 0:397d7fc7dba5 210 return;
Gaku0606 0:397d7fc7dba5 211 }
Gaku0606 0:397d7fc7dba5 212
Gaku0606 0:397d7fc7dba5 213 #endif