URUSHI@TSUKUBA / Mbed 2 deprecated AnimatedLED9

Dependencies:   mbed-rtos mbed

Committer:
BuntarouShizuki
Date:
Thu Jan 22 08:48:09 2015 +0000
Revision:
0:fefcd43a3608
hello

Who changed what in which revision?

UserRevisionLine numberNew 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 };