This library is push button or dipSw noise cancel and on/off edge recognition

Dependents:   led-sound_checker clockGenerator

Fork of DigitalSw by suu pen

sample program "DigitalSW_hello" https://developer.mbed.org/users/suupen/code/DigitalSW_hello/rev/ffa16c2a347f

Committer:
suupen
Date:
Sat Oct 29 01:46:17 2016 +0000
Revision:
5:9198c5c0afcb
Parent:
1:cd8bb4f0b08d
sw input use interrupt.; pullup/pulldown setting.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:45e3ec3004a6 1 /**
suupen 0:45e3ec3004a6 2 * Digital Switch Library
suupen 1:cd8bb4f0b08d 3 * include chattering cancel process.
suupen 0:45e3ec3004a6 4 *
suupen 0:45e3ec3004a6 5 *
suupen 0:45e3ec3004a6 6 * <scematic>
suupen 0:45e3ec3004a6 7 *
suupen 0:45e3ec3004a6 8 * +---------- mbed (pxx) (internal pullUp)
suupen 0:45e3ec3004a6 9 * |
suupen 0:45e3ec3004a6 10 * o | sw
suupen 0:45e3ec3004a6 11 * |
suupen 0:45e3ec3004a6 12 * o
suupen 0:45e3ec3004a6 13 * |
suupen 0:45e3ec3004a6 14 * -+- GND
suupen 0:45e3ec3004a6 15 *
suupen 0:45e3ec3004a6 16 * <timing chart>
suupen 0:45e3ec3004a6 17 *
suupen 0:45e3ec3004a6 18 * down Side up Side
suupen 0:45e3ec3004a6 19 * interrupt ! !
suupen 0:45e3ec3004a6 20 * off---------+ +-------------------
suupen 0:45e3ec3004a6 21 * | | !
suupen 0:45e3ec3004a6 22 * on +----------------+ !
suupen 0:45e3ec3004a6 23 * ! !
suupen 0:45e3ec3004a6 24 * edge on edge off edge
suupen 0:45e3ec3004a6 25 *
suupen 0:45e3ec3004a6 26 *
suupen 0:45e3ec3004a6 27 * <example program>
suupen 0:45e3ec3004a6 28 * @code
suupen 0:45e3ec3004a6 29 * #include "mbed.h"
suupen 0:45e3ec3004a6 30 * #include "DigitalSw.h"
suupen 0:45e3ec3004a6 31 *
suupen 0:45e3ec3004a6 32 * DigitalSw sw(p21);
suupen 0:45e3ec3004a6 33 *
suupen 0:45e3ec3004a6 34 * DigitalOut level(LED4);
suupen 0:45e3ec3004a6 35 * DigitalOut onEdgeToggle(LED1);
suupen 0:45e3ec3004a6 36 * DigitalOut offEdgeToggle(LED2);
suupen 0:45e3ec3004a6 37 *
suupen 0:45e3ec3004a6 38 * int main() {
suupen 0:45e3ec3004a6 39 * while(1) {
suupen 0:45e3ec3004a6 40 *
suupen 0:45e3ec3004a6 41 * level = sw.getLevel();
suupen 0:45e3ec3004a6 42 *
suupen 0:45e3ec3004a6 43 * if(sw.getOnEdge() == 1){
suupen 0:45e3ec3004a6 44 * onEdgeToggle = !onEdgeToggle;
suupen 0:45e3ec3004a6 45 * }
suupen 0:45e3ec3004a6 46 *
suupen 0:45e3ec3004a6 47 * if(sw.getOffEdge() == 1){
suupen 0:45e3ec3004a6 48 * offEdgeToggle = !offEdgeToggle;
suupen 0:45e3ec3004a6 49 * }
suupen 0:45e3ec3004a6 50 * }
suupen 0:45e3ec3004a6 51 * }
suupen 0:45e3ec3004a6 52 * @endcode
suupen 0:45e3ec3004a6 53 */
suupen 0:45e3ec3004a6 54
suupen 0:45e3ec3004a6 55
suupen 0:45e3ec3004a6 56 #ifndef DIGITALSW_H
suupen 0:45e3ec3004a6 57 #define DIGITALSW_H
suupen 0:45e3ec3004a6 58
suupen 0:45e3ec3004a6 59 #include "mbed.h"
suupen 0:45e3ec3004a6 60
suupen 0:45e3ec3004a6 61 /**
suupen 0:45e3ec3004a6 62 * digital switch.
suupen 0:45e3ec3004a6 63 */
suupen 0:45e3ec3004a6 64
suupen 0:45e3ec3004a6 65
suupen 0:45e3ec3004a6 66 /**
suupen 0:45e3ec3004a6 67 * @class DigitalSw
suupen 0:45e3ec3004a6 68 * @brief nothine
suupen 0:45e3ec3004a6 69 */
suupen 0:45e3ec3004a6 70 class DigitalSw
suupen 0:45e3ec3004a6 71 {
suupen 0:45e3ec3004a6 72
suupen 0:45e3ec3004a6 73 public:
suupen 0:45e3ec3004a6 74
suupen 0:45e3ec3004a6 75 /** Create a DigitalSw port, connected to the specified sw pins
suupen 0:45e3ec3004a6 76 * @param sw pin
suupen 5:9198c5c0afcb 77 * @param (option) Register pull 1:PullUp(default), 0:PullDown
suupen 0:45e3ec3004a6 78 * @note nothing
suupen 0:45e3ec3004a6 79 */
suupen 5:9198c5c0afcb 80 DigitalSw(PinName sw, uint8_t pull = 1);
suupen 0:45e3ec3004a6 81
suupen 0:45e3ec3004a6 82 /**
suupen 0:45e3ec3004a6 83 * Reset the edge and level.
suupen 0:45e3ec3004a6 84 * edge = off(0), level = off(0)
suupen 0:45e3ec3004a6 85 */
suupen 0:45e3ec3004a6 86 void reset(void);
suupen 0:45e3ec3004a6 87
suupen 0:45e3ec3004a6 88 /**
suupen 0:45e3ec3004a6 89 * Get the number of level by the sw.
suupen 0:45e3ec3004a6 90 *
suupen 0:45e3ec3004a6 91 * @return Number of sw level. 0:Low(off) 1:Hi(on)
suupen 0:45e3ec3004a6 92 */
suupen 0:45e3ec3004a6 93 int16_t getLevel(void);
suupen 0:45e3ec3004a6 94
suupen 0:45e3ec3004a6 95 /**
suupen 0:45e3ec3004a6 96 * Get the number of on edge by the sw.
suupen 0:45e3ec3004a6 97 *
suupen 0:45e3ec3004a6 98 * @return Number of sw on edge. 0:no edge, 1:edge
suupen 0:45e3ec3004a6 99 */
suupen 0:45e3ec3004a6 100 int16_t getOnEdge(void);
suupen 0:45e3ec3004a6 101
suupen 0:45e3ec3004a6 102 /**
suupen 0:45e3ec3004a6 103 * Get the number of off edge by the sw.
suupen 0:45e3ec3004a6 104 *
suupen 0:45e3ec3004a6 105 * @return Number of sw off edge. 0:no edge, 1:edge
suupen 0:45e3ec3004a6 106 */
suupen 0:45e3ec3004a6 107 int16_t getOffEdge(void);
suupen 0:45e3ec3004a6 108
suupen 0:45e3ec3004a6 109
suupen 0:45e3ec3004a6 110 private:
suupen 0:45e3ec3004a6 111
suupen 0:45e3ec3004a6 112 void swLevelUp(void);
suupen 0:45e3ec3004a6 113 void swLevelDown(void);
suupen 0:45e3ec3004a6 114
suupen 0:45e3ec3004a6 115
suupen 0:45e3ec3004a6 116 InterruptIn _sw;
suupen 5:9198c5c0afcb 117 int8_t _pull;
suupen 0:45e3ec3004a6 118
suupen 0:45e3ec3004a6 119 volatile int16_t _onEdge;
suupen 0:45e3ec3004a6 120 volatile int16_t _offEdge;
suupen 0:45e3ec3004a6 121 volatile int16_t _levelNow;
suupen 0:45e3ec3004a6 122 volatile int16_t _levelOld;
suupen 0:45e3ec3004a6 123
suupen 0:45e3ec3004a6 124 };
suupen 0:45e3ec3004a6 125
suupen 0:45e3ec3004a6 126 #endif /* DIGITALSW_H */