Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TouchSense.h@0:fefcd43a3608, 2015-01-22 (annotated)
- Committer:
- BuntarouShizuki
- Date:
- Thu Jan 22 08:48:09 2015 +0000
- Revision:
- 0:fefcd43a3608
hello
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| BuntarouShizuki | 0:fefcd43a3608 | 1 | #include "mbed.h" |
| BuntarouShizuki | 0:fefcd43a3608 | 2 | #include "rtos.h" |
| BuntarouShizuki | 0:fefcd43a3608 | 3 | |
| BuntarouShizuki | 0:fefcd43a3608 | 4 | //#define DEBUG |
| BuntarouShizuki | 0:fefcd43a3608 | 5 | |
| BuntarouShizuki | 0:fefcd43a3608 | 6 | // for profiling |
| BuntarouShizuki | 0:fefcd43a3608 | 7 | #define PRSIZE 500 |
| BuntarouShizuki | 0:fefcd43a3608 | 8 | #define START_THREAD 1 |
| BuntarouShizuki | 0:fefcd43a3608 | 9 | |
| BuntarouShizuki | 0:fefcd43a3608 | 10 | class FrameRate { |
| BuntarouShizuki | 0:fefcd43a3608 | 11 | float rate; |
| BuntarouShizuki | 0:fefcd43a3608 | 12 | int counter; |
| BuntarouShizuki | 0:fefcd43a3608 | 13 | Timer timer; |
| BuntarouShizuki | 0:fefcd43a3608 | 14 | |
| BuntarouShizuki | 0:fefcd43a3608 | 15 | public: |
| BuntarouShizuki | 0:fefcd43a3608 | 16 | FrameRate() { |
| BuntarouShizuki | 0:fefcd43a3608 | 17 | rate = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 18 | counter = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 19 | timer.start(); |
| BuntarouShizuki | 0:fefcd43a3608 | 20 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 21 | |
| BuntarouShizuki | 0:fefcd43a3608 | 22 | void update() { |
| BuntarouShizuki | 0:fefcd43a3608 | 23 | counter++; |
| BuntarouShizuki | 0:fefcd43a3608 | 24 | if (counter == 10) { |
| BuntarouShizuki | 0:fefcd43a3608 | 25 | rate = 1000*10.0/timer.read_ms(); |
| BuntarouShizuki | 0:fefcd43a3608 | 26 | counter = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 27 | timer.reset(); |
| BuntarouShizuki | 0:fefcd43a3608 | 28 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 29 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 30 | |
| BuntarouShizuki | 0:fefcd43a3608 | 31 | float getRate() { |
| BuntarouShizuki | 0:fefcd43a3608 | 32 | return rate; |
| BuntarouShizuki | 0:fefcd43a3608 | 33 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 34 | }; |
| BuntarouShizuki | 0:fefcd43a3608 | 35 | |
| BuntarouShizuki | 0:fefcd43a3608 | 36 | class TouchSense |
| BuntarouShizuki | 0:fefcd43a3608 | 37 | { |
| BuntarouShizuki | 0:fefcd43a3608 | 38 | float V0; |
| BuntarouShizuki | 0:fefcd43a3608 | 39 | float V1; |
| BuntarouShizuki | 0:fefcd43a3608 | 40 | float C1; |
| BuntarouShizuki | 0:fefcd43a3608 | 41 | |
| BuntarouShizuki | 0:fefcd43a3608 | 42 | DigitalOut &dout; |
| BuntarouShizuki | 0:fefcd43a3608 | 43 | AnalogIn &ain; |
| BuntarouShizuki | 0:fefcd43a3608 | 44 | |
| BuntarouShizuki | 0:fefcd43a3608 | 45 | static const int BUFSIZE = 3; |
| BuntarouShizuki | 0:fefcd43a3608 | 46 | int buf[BUFSIZE]; |
| BuntarouShizuki | 0:fefcd43a3608 | 47 | int bufindex; |
| BuntarouShizuki | 0:fefcd43a3608 | 48 | |
| BuntarouShizuki | 0:fefcd43a3608 | 49 | int state; |
| BuntarouShizuki | 0:fefcd43a3608 | 50 | |
| BuntarouShizuki | 0:fefcd43a3608 | 51 | FrameRate rater; |
| BuntarouShizuki | 0:fefcd43a3608 | 52 | |
| BuntarouShizuki | 0:fefcd43a3608 | 53 | static void threadStarter(void const *p); |
| BuntarouShizuki | 0:fefcd43a3608 | 54 | Thread _thread; |
| BuntarouShizuki | 0:fefcd43a3608 | 55 | public: |
| BuntarouShizuki | 0:fefcd43a3608 | 56 | TouchSense(DigitalOut &dout, AnalogIn &ain): V0(0.0), V1(0.5), C1(20), dout(dout), ain(ain), |
| BuntarouShizuki | 0:fefcd43a3608 | 57 | _thread(&TouchSense::threadStarter, this, osPriorityNormal, 10240) { |
| BuntarouShizuki | 0:fefcd43a3608 | 58 | // XXX: 0.5 must be defined automatically |
| BuntarouShizuki | 0:fefcd43a3608 | 59 | state = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 60 | calibrate(); |
| BuntarouShizuki | 0:fefcd43a3608 | 61 | |
| BuntarouShizuki | 0:fefcd43a3608 | 62 | _thread.signal_set(START_THREAD); |
| BuntarouShizuki | 0:fefcd43a3608 | 63 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 64 | |
| BuntarouShizuki | 0:fefcd43a3608 | 65 | int touched() { |
| BuntarouShizuki | 0:fefcd43a3608 | 66 | return state; |
| BuntarouShizuki | 0:fefcd43a3608 | 67 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 68 | |
| BuntarouShizuki | 0:fefcd43a3608 | 69 | private: |
| BuntarouShizuki | 0:fefcd43a3608 | 70 | void calibrate() { |
| BuntarouShizuki | 0:fefcd43a3608 | 71 | printf("TouchSense.calibrate\r\n"); |
| BuntarouShizuki | 0:fefcd43a3608 | 72 | dout.write(0); |
| BuntarouShizuki | 0:fefcd43a3608 | 73 | Thread::wait(1000); |
| BuntarouShizuki | 0:fefcd43a3608 | 74 | |
| BuntarouShizuki | 0:fefcd43a3608 | 75 | // initialize V0 |
| BuntarouShizuki | 0:fefcd43a3608 | 76 | float s = 0.0; |
| BuntarouShizuki | 0:fefcd43a3608 | 77 | for (int i = 0; i < 10; i++) { |
| BuntarouShizuki | 0:fefcd43a3608 | 78 | float level = ain.read(); |
| BuntarouShizuki | 0:fefcd43a3608 | 79 | printf("TouchSense.calibrate: level=%f\r\n", level); |
| BuntarouShizuki | 0:fefcd43a3608 | 80 | if (s < level) |
| BuntarouShizuki | 0:fefcd43a3608 | 81 | s = level; |
| BuntarouShizuki | 0:fefcd43a3608 | 82 | Thread::wait(100); |
| BuntarouShizuki | 0:fefcd43a3608 | 83 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 84 | V0 = s; |
| BuntarouShizuki | 0:fefcd43a3608 | 85 | printf("TouchSense.calibrate: V0=%f\r\n", V0); |
| BuntarouShizuki | 0:fefcd43a3608 | 86 | |
| BuntarouShizuki | 0:fefcd43a3608 | 87 | // initialize buf, bufindex, and C1 |
| BuntarouShizuki | 0:fefcd43a3608 | 88 | for (int i = 0; i < BUFSIZE; i++) { |
| BuntarouShizuki | 0:fefcd43a3608 | 89 | buf[i] = sense(); |
| BuntarouShizuki | 0:fefcd43a3608 | 90 | printf("TouchSense.calibrate: sense=%d\r\n", buf[i]); |
| BuntarouShizuki | 0:fefcd43a3608 | 91 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 92 | int sum = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 93 | for (int i = 0; i < BUFSIZE; i++) |
| BuntarouShizuki | 0:fefcd43a3608 | 94 | sum += buf[i]; |
| BuntarouShizuki | 0:fefcd43a3608 | 95 | C1 = sum*3.0/BUFSIZE; // XXX: 3 is a magic number |
| BuntarouShizuki | 0:fefcd43a3608 | 96 | bufindex = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 97 | printf("TouchSense.calibrate: C1=%f\r\n", C1); |
| BuntarouShizuki | 0:fefcd43a3608 | 98 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 99 | |
| BuntarouShizuki | 0:fefcd43a3608 | 100 | void loop() { |
| BuntarouShizuki | 0:fefcd43a3608 | 101 | _thread.signal_wait(START_THREAD); |
| BuntarouShizuki | 0:fefcd43a3608 | 102 | printf("TouchSense.loop: start\r\n"); |
| BuntarouShizuki | 0:fefcd43a3608 | 103 | for (;;) { |
| BuntarouShizuki | 0:fefcd43a3608 | 104 | int r = sense(); |
| BuntarouShizuki | 0:fefcd43a3608 | 105 | if (r == -1) |
| BuntarouShizuki | 0:fefcd43a3608 | 106 | buf[bufindex] = C1+1; |
| BuntarouShizuki | 0:fefcd43a3608 | 107 | else |
| BuntarouShizuki | 0:fefcd43a3608 | 108 | buf[bufindex] = r; |
| BuntarouShizuki | 0:fefcd43a3608 | 109 | bufindex = (bufindex+1)%BUFSIZE; |
| BuntarouShizuki | 0:fefcd43a3608 | 110 | |
| BuntarouShizuki | 0:fefcd43a3608 | 111 | int sum = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 112 | for (int i = 0; i < BUFSIZE; i++) |
| BuntarouShizuki | 0:fefcd43a3608 | 113 | sum += buf[i]; |
| BuntarouShizuki | 0:fefcd43a3608 | 114 | float avg = (float)sum/BUFSIZE; |
| BuntarouShizuki | 0:fefcd43a3608 | 115 | |
| BuntarouShizuki | 0:fefcd43a3608 | 116 | if (avg > C1) // touhced for 0.001*BUFSIZE sec |
| BuntarouShizuki | 0:fefcd43a3608 | 117 | state = 1; // touched |
| BuntarouShizuki | 0:fefcd43a3608 | 118 | else |
| BuntarouShizuki | 0:fefcd43a3608 | 119 | state = 0; // untouched |
| BuntarouShizuki | 0:fefcd43a3608 | 120 | |
| BuntarouShizuki | 0:fefcd43a3608 | 121 | rater.update(); |
| BuntarouShizuki | 0:fefcd43a3608 | 122 | Thread::wait(5); |
| BuntarouShizuki | 0:fefcd43a3608 | 123 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 124 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 125 | |
| BuntarouShizuki | 0:fefcd43a3608 | 126 | int sense() { |
| BuntarouShizuki | 0:fefcd43a3608 | 127 | DigitalIn prswitch(p5); |
| BuntarouShizuki | 0:fefcd43a3608 | 128 | prswitch.mode(PullUp); |
| BuntarouShizuki | 0:fefcd43a3608 | 129 | |
| BuntarouShizuki | 0:fefcd43a3608 | 130 | // step 1 |
| BuntarouShizuki | 0:fefcd43a3608 | 131 | int xxx = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 132 | dout.write(0); |
| BuntarouShizuki | 0:fefcd43a3608 | 133 | #ifdef DEBUG |
| BuntarouShizuki | 0:fefcd43a3608 | 134 | printf("touched: ain=%f\n\r", ain.read()); |
| BuntarouShizuki | 0:fefcd43a3608 | 135 | #endif |
| BuntarouShizuki | 0:fefcd43a3608 | 136 | while (ain.read() > V0) { |
| BuntarouShizuki | 0:fefcd43a3608 | 137 | xxx++; |
| BuntarouShizuki | 0:fefcd43a3608 | 138 | if (xxx > 100) { // 0.1 sec |
| BuntarouShizuki | 0:fefcd43a3608 | 139 | printf("touched: warning ain=%f\n\r", ain.read()); |
| BuntarouShizuki | 0:fefcd43a3608 | 140 | return -1; |
| BuntarouShizuki | 0:fefcd43a3608 | 141 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 142 | Thread::wait(1); |
| BuntarouShizuki | 0:fefcd43a3608 | 143 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 144 | |
| BuntarouShizuki | 0:fefcd43a3608 | 145 | // step 2 |
| BuntarouShizuki | 0:fefcd43a3608 | 146 | dout.write(1); |
| BuntarouShizuki | 0:fefcd43a3608 | 147 | |
| BuntarouShizuki | 0:fefcd43a3608 | 148 | // step 3 |
| BuntarouShizuki | 0:fefcd43a3608 | 149 | int count = 0; |
| BuntarouShizuki | 0:fefcd43a3608 | 150 | |
| BuntarouShizuki | 0:fefcd43a3608 | 151 | if (prswitch) { |
| BuntarouShizuki | 0:fefcd43a3608 | 152 | // mode: normal |
| BuntarouShizuki | 0:fefcd43a3608 | 153 | for (;;) { |
| BuntarouShizuki | 0:fefcd43a3608 | 154 | if (count > C1) |
| BuntarouShizuki | 0:fefcd43a3608 | 155 | break; |
| BuntarouShizuki | 0:fefcd43a3608 | 156 | if (ain.read() > V1) |
| BuntarouShizuki | 0:fefcd43a3608 | 157 | break; |
| BuntarouShizuki | 0:fefcd43a3608 | 158 | count++; |
| BuntarouShizuki | 0:fefcd43a3608 | 159 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 160 | #ifdef DEBUG |
| BuntarouShizuki | 0:fefcd43a3608 | 161 | printf("touched: count=%d\r\n", count); |
| BuntarouShizuki | 0:fefcd43a3608 | 162 | #endif |
| BuntarouShizuki | 0:fefcd43a3608 | 163 | } else { |
| BuntarouShizuki | 0:fefcd43a3608 | 164 | // mode: profiling |
| BuntarouShizuki | 0:fefcd43a3608 | 165 | printf("rate = %f\r\n", rater.getRate()); |
| BuntarouShizuki | 0:fefcd43a3608 | 166 | |
| BuntarouShizuki | 0:fefcd43a3608 | 167 | float prdata[PRSIZE]; |
| BuntarouShizuki | 0:fefcd43a3608 | 168 | float prtime[PRSIZE]; |
| BuntarouShizuki | 0:fefcd43a3608 | 169 | Timer timer; |
| BuntarouShizuki | 0:fefcd43a3608 | 170 | |
| BuntarouShizuki | 0:fefcd43a3608 | 171 | timer.start(); |
| BuntarouShizuki | 0:fefcd43a3608 | 172 | for (;;) { |
| BuntarouShizuki | 0:fefcd43a3608 | 173 | prdata[count] = ain.read(); |
| BuntarouShizuki | 0:fefcd43a3608 | 174 | prtime[count] = timer.read(); |
| BuntarouShizuki | 0:fefcd43a3608 | 175 | if (prdata[count] > V1) |
| BuntarouShizuki | 0:fefcd43a3608 | 176 | break; |
| BuntarouShizuki | 0:fefcd43a3608 | 177 | count++; |
| BuntarouShizuki | 0:fefcd43a3608 | 178 | if (count == PRSIZE) { |
| BuntarouShizuki | 0:fefcd43a3608 | 179 | printf("touched: warning[count==PRSIZE]\r\n"); |
| BuntarouShizuki | 0:fefcd43a3608 | 180 | count--; |
| BuntarouShizuki | 0:fefcd43a3608 | 181 | break; |
| BuntarouShizuki | 0:fefcd43a3608 | 182 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 183 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 184 | printf("# n=%d V0=%f V1=%f\r\n", count+1, V0, V1); |
| BuntarouShizuki | 0:fefcd43a3608 | 185 | for (int i = 0; i <= count; i++) |
| BuntarouShizuki | 0:fefcd43a3608 | 186 | printf("%f %f\r\n", prtime[i], prdata[i]); |
| BuntarouShizuki | 0:fefcd43a3608 | 187 | printf("\r\n"); |
| BuntarouShizuki | 0:fefcd43a3608 | 188 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 189 | |
| BuntarouShizuki | 0:fefcd43a3608 | 190 | // step 4 |
| BuntarouShizuki | 0:fefcd43a3608 | 191 | dout.write(0); |
| BuntarouShizuki | 0:fefcd43a3608 | 192 | |
| BuntarouShizuki | 0:fefcd43a3608 | 193 | return count; |
| BuntarouShizuki | 0:fefcd43a3608 | 194 | } |
| BuntarouShizuki | 0:fefcd43a3608 | 195 | }; |