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

Dependents:   Hybrid_main_FirstEdtion

Committer:
Gaku0606
Date:
Sun Jan 29 07:31:30 2017 +0000
Revision:
0:397d7fc7dba5
Child:
1:9164a72286f1
????????????????????

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