evolution

Dependencies:   mbed

Committer:
avnisha
Date:
Wed Feb 05 04:33:33 2014 +0000
Revision:
1:02e0c04d84d3
Parent:
0:f25a61b099e5
ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
avnisha 0:f25a61b099e5 1 #include "mbed.h"
avnisha 0:f25a61b099e5 2
avnisha 0:f25a61b099e5 3
avnisha 0:f25a61b099e5 4 /*
avnisha 1:02e0c04d84d3 5 * Based on
avnisha 1:02e0c04d84d3 6 *
avnisha 1:02e0c04d84d3 7 * http://mbed.org/users/AjK/notebook/regarding-interrupts-use-and-blocking/?c=9228
avnisha 1:02e0c04d84d3 8 */
avnisha 1:02e0c04d84d3 9
avnisha 1:02e0c04d84d3 10
avnisha 1:02e0c04d84d3 11 /*
avnisha 1:02e0c04d84d3 12
avnisha 1:02e0c04d84d3 13 Specification:
avnisha 1:02e0c04d84d3 14
avnisha 1:02e0c04d84d3 15 led1: flash briefly once per second, EVERY second.
avnisha 1:02e0c04d84d3 16 led2: On at t = 2 and off at t = 5
avnisha 1:02e0c04d84d3 17 led3: On at t = 3 and off at t = 6
avnisha 0:f25a61b099e5 18 */
avnisha 0:f25a61b099e5 19
avnisha 1:02e0c04d84d3 20 #define SIX
avnisha 0:f25a61b099e5 21
avnisha 0:f25a61b099e5 22 #ifdef ONE
avnisha 1:02e0c04d84d3 23 /*
avnisha 1:02e0c04d84d3 24 * Basic processing looping
avnisha 1:02e0c04d84d3 25 *
avnisha 1:02e0c04d84d3 26 * Good - simple to write/debug
avnisha 1:02e0c04d84d3 27 * Bad - not so simple to add led2/led3 without some state machine logic and timer polling
avnisha 1:02e0c04d84d3 28 */
avnisha 1:02e0c04d84d3 29
avnisha 0:f25a61b099e5 30
avnisha 0:f25a61b099e5 31 DigitalOut led1(LED1);
avnisha 0:f25a61b099e5 32
avnisha 0:f25a61b099e5 33 int main() {
avnisha 0:f25a61b099e5 34 while(1) {
avnisha 0:f25a61b099e5 35 led1 = 1;
avnisha 0:f25a61b099e5 36 wait(0.2);
avnisha 0:f25a61b099e5 37 led1 = 0;
avnisha 0:f25a61b099e5 38 wait(0.2);
avnisha 0:f25a61b099e5 39 }
avnisha 0:f25a61b099e5 40 }
avnisha 0:f25a61b099e5 41
avnisha 0:f25a61b099e5 42 #endif
avnisha 0:f25a61b099e5 43
avnisha 0:f25a61b099e5 44 #ifdef TWO
avnisha 1:02e0c04d84d3 45
avnisha 1:02e0c04d84d3 46 /*
avnisha 1:02e0c04d84d3 47 * Event driven logic and loop together
avnisha 1:02e0c04d84d3 48 *
avnisha 1:02e0c04d84d3 49 * Good - led2 is getting serviced by callback
avnisha 1:02e0c04d84d3 50 * Bad - led1 will missing some flashes due to wait() in callback
avnisha 1:02e0c04d84d3 51 *
avnisha 1:02e0c04d84d3 52 */
avnisha 0:f25a61b099e5 53
avnisha 0:f25a61b099e5 54 Timeout to1;
avnisha 0:f25a61b099e5 55 DigitalOut led1(LED1);
avnisha 0:f25a61b099e5 56 DigitalOut led2(LED2);
avnisha 0:f25a61b099e5 57
avnisha 0:f25a61b099e5 58 void cb1(void) {
avnisha 0:f25a61b099e5 59 led2 = 1;
avnisha 0:f25a61b099e5 60 wait(3);
avnisha 0:f25a61b099e5 61 led2 = 0;
avnisha 0:f25a61b099e5 62 }
avnisha 0:f25a61b099e5 63
avnisha 0:f25a61b099e5 64 int main() {
avnisha 0:f25a61b099e5 65
avnisha 0:f25a61b099e5 66 to1.attach(&cb1, 2);
avnisha 0:f25a61b099e5 67
avnisha 0:f25a61b099e5 68 while(1) {
avnisha 0:f25a61b099e5 69 led1 = 1;
avnisha 0:f25a61b099e5 70 wait(0.05);
avnisha 0:f25a61b099e5 71 led1 = 0;
avnisha 0:f25a61b099e5 72 wait(0.95);
avnisha 0:f25a61b099e5 73 }
avnisha 0:f25a61b099e5 74 }
avnisha 0:f25a61b099e5 75
avnisha 0:f25a61b099e5 76 #endif
avnisha 0:f25a61b099e5 77 #ifdef THREE
avnisha 1:02e0c04d84d3 78
avnisha 1:02e0c04d84d3 79 /*
avnisha 1:02e0c04d84d3 80 * Good - led1/led2/led3 all getting serviced
avnisha 1:02e0c04d84d3 81 * Bad - timing off on led3 since that callback has to wait for previous callback to finish
avnisha 1:02e0c04d84d3 82 * - timing off on led1 due to both callbacks wait()
avnisha 1:02e0c04d84d3 83 */
avnisha 1:02e0c04d84d3 84
avnisha 0:f25a61b099e5 85
avnisha 0:f25a61b099e5 86 Timeout to1;
avnisha 0:f25a61b099e5 87 Timeout to2;
avnisha 0:f25a61b099e5 88 DigitalOut led1(LED1);
avnisha 0:f25a61b099e5 89 DigitalOut led2(LED2);
avnisha 0:f25a61b099e5 90 DigitalOut led3(LED3);
avnisha 0:f25a61b099e5 91
avnisha 0:f25a61b099e5 92 void cb1(void) {
avnisha 0:f25a61b099e5 93 led2 = 1;
avnisha 0:f25a61b099e5 94 wait(3);
avnisha 0:f25a61b099e5 95 led2 = 0;
avnisha 0:f25a61b099e5 96 }
avnisha 0:f25a61b099e5 97
avnisha 0:f25a61b099e5 98 void cb2(void) {
avnisha 0:f25a61b099e5 99 led3 = 1;
avnisha 0:f25a61b099e5 100 wait(3);
avnisha 0:f25a61b099e5 101 led3 = 0;
avnisha 0:f25a61b099e5 102 }
avnisha 0:f25a61b099e5 103
avnisha 0:f25a61b099e5 104 int main() {
avnisha 0:f25a61b099e5 105
avnisha 0:f25a61b099e5 106 to1.attach(&cb1, 2);
avnisha 0:f25a61b099e5 107 to2.attach(&cb2, 3);
avnisha 0:f25a61b099e5 108
avnisha 0:f25a61b099e5 109 while(1) {
avnisha 0:f25a61b099e5 110 led1 = 1;
avnisha 0:f25a61b099e5 111 wait(0.05);
avnisha 0:f25a61b099e5 112 led1 = 0;
avnisha 0:f25a61b099e5 113 wait(0.95);
avnisha 0:f25a61b099e5 114 }
avnisha 0:f25a61b099e5 115 }
avnisha 0:f25a61b099e5 116 #endif
avnisha 0:f25a61b099e5 117
avnisha 0:f25a61b099e5 118 #ifdef FOUR
avnisha 0:f25a61b099e5 119
avnisha 1:02e0c04d84d3 120 /*
avnisha 1:02e0c04d84d3 121 * Good - Use gloabls to coordinate callback/main loop - no wait() in callback
avnisha 1:02e0c04d84d3 122 * Bad - led1 uses wait() making it less effective for polling other devices
avnisha 1:02e0c04d84d3 123 */
avnisha 1:02e0c04d84d3 124
avnisha 0:f25a61b099e5 125
avnisha 0:f25a61b099e5 126 Timeout to1;
avnisha 0:f25a61b099e5 127 Timeout to2;
avnisha 0:f25a61b099e5 128 DigitalOut led1(LED1);
avnisha 0:f25a61b099e5 129 DigitalOut to1_led(LED2);
avnisha 0:f25a61b099e5 130 DigitalOut to2_led(LED3);
avnisha 0:f25a61b099e5 131
avnisha 0:f25a61b099e5 132 bool to1triggered = false;
avnisha 0:f25a61b099e5 133 bool to2triggered = false;
avnisha 0:f25a61b099e5 134
avnisha 0:f25a61b099e5 135 void cb1(void) {
avnisha 0:f25a61b099e5 136 to1triggered = true;
avnisha 0:f25a61b099e5 137 }
avnisha 0:f25a61b099e5 138
avnisha 0:f25a61b099e5 139 void to1handle(void) {
avnisha 0:f25a61b099e5 140 if (to1_led == 0) {
avnisha 0:f25a61b099e5 141 to1_led = 1;
avnisha 0:f25a61b099e5 142 to1.detach();
avnisha 0:f25a61b099e5 143 to1.attach(&cb1, 3);
avnisha 0:f25a61b099e5 144 }
avnisha 0:f25a61b099e5 145 else {
avnisha 0:f25a61b099e5 146 to1_led = 0;
avnisha 0:f25a61b099e5 147 to1.detach();
avnisha 0:f25a61b099e5 148 }
avnisha 0:f25a61b099e5 149 }
avnisha 0:f25a61b099e5 150
avnisha 0:f25a61b099e5 151
avnisha 0:f25a61b099e5 152 void cb2(void) {
avnisha 0:f25a61b099e5 153 to2triggered = true;
avnisha 0:f25a61b099e5 154 }
avnisha 0:f25a61b099e5 155
avnisha 0:f25a61b099e5 156 void to2handle(void) {
avnisha 0:f25a61b099e5 157 if (to2_led == 0) {
avnisha 0:f25a61b099e5 158 to2_led = 1;
avnisha 0:f25a61b099e5 159 to2.detach();
avnisha 0:f25a61b099e5 160 to2.attach(&cb2, 3);
avnisha 0:f25a61b099e5 161 }
avnisha 0:f25a61b099e5 162 else {
avnisha 0:f25a61b099e5 163 to2_led = 0;
avnisha 0:f25a61b099e5 164 to2.detach();
avnisha 0:f25a61b099e5 165 }
avnisha 0:f25a61b099e5 166 }
avnisha 0:f25a61b099e5 167
avnisha 0:f25a61b099e5 168
avnisha 0:f25a61b099e5 169 int main() {
avnisha 0:f25a61b099e5 170
avnisha 0:f25a61b099e5 171 to1.attach(&cb1, 2);
avnisha 0:f25a61b099e5 172 to2.attach(&cb2, 3);
avnisha 0:f25a61b099e5 173
avnisha 0:f25a61b099e5 174 while(1) {
avnisha 0:f25a61b099e5 175
avnisha 0:f25a61b099e5 176 if (to1triggered) {
avnisha 0:f25a61b099e5 177 to1triggered = false;
avnisha 0:f25a61b099e5 178 to1handle();
avnisha 0:f25a61b099e5 179 }
avnisha 0:f25a61b099e5 180
avnisha 0:f25a61b099e5 181 if (to2triggered) {
avnisha 0:f25a61b099e5 182 to2triggered = false;
avnisha 0:f25a61b099e5 183 to2handle();
avnisha 0:f25a61b099e5 184 }
avnisha 0:f25a61b099e5 185
avnisha 0:f25a61b099e5 186 led1 = 1;
avnisha 0:f25a61b099e5 187 wait(0.05);
avnisha 0:f25a61b099e5 188 led1 = 0;
avnisha 0:f25a61b099e5 189 wait(0.95);
avnisha 0:f25a61b099e5 190 }
avnisha 0:f25a61b099e5 191 }
avnisha 0:f25a61b099e5 192
avnisha 0:f25a61b099e5 193 #endif
avnisha 0:f25a61b099e5 194
avnisha 1:02e0c04d84d3 195 #ifdef FIVE
avnisha 1:02e0c04d84d3 196
avnisha 1:02e0c04d84d3 197 /*
avnisha 1:02e0c04d84d3 198 * Good - all led's are callback interrupt driven
avnisha 1:02e0c04d84d3 199 * Bad - printf() in callback (interrupt context) bad idea
avnisha 1:02e0c04d84d3 200 */
avnisha 0:f25a61b099e5 201
avnisha 0:f25a61b099e5 202 #include "mbed.h"
avnisha 0:f25a61b099e5 203
avnisha 0:f25a61b099e5 204 Ticker tled1on;
avnisha 0:f25a61b099e5 205 Timeout tled1off;
avnisha 0:f25a61b099e5 206 Timeout to1;
avnisha 0:f25a61b099e5 207 Timeout to2;
avnisha 0:f25a61b099e5 208 DigitalOut led1(LED1);
avnisha 0:f25a61b099e5 209 DigitalOut to1_led(LED2);
avnisha 0:f25a61b099e5 210 DigitalOut to2_led(LED3);
avnisha 0:f25a61b099e5 211
avnisha 0:f25a61b099e5 212 void cb1(void) {
avnisha 0:f25a61b099e5 213 if (to1_led == 0) {
avnisha 0:f25a61b099e5 214 to1_led = 1;
avnisha 0:f25a61b099e5 215 }
avnisha 0:f25a61b099e5 216 else {
avnisha 0:f25a61b099e5 217 to1_led = 0;
avnisha 0:f25a61b099e5 218 }
avnisha 0:f25a61b099e5 219 // Reschedule a new event.
avnisha 1:02e0c04d84d3 220 printf("cb1 callback\n");
avnisha 0:f25a61b099e5 221 to1.detach();
avnisha 0:f25a61b099e5 222 to1.attach(&cb1, 3);
avnisha 0:f25a61b099e5 223 }
avnisha 0:f25a61b099e5 224
avnisha 0:f25a61b099e5 225 void cb2(void) {
avnisha 0:f25a61b099e5 226 if (to2_led == 0) {
avnisha 0:f25a61b099e5 227 to2_led = 1;
avnisha 0:f25a61b099e5 228 }
avnisha 0:f25a61b099e5 229 else {
avnisha 0:f25a61b099e5 230 to2_led = 0;
avnisha 0:f25a61b099e5 231 }
avnisha 0:f25a61b099e5 232 // Reschedule a new event.
avnisha 0:f25a61b099e5 233 to2.detach();
avnisha 0:f25a61b099e5 234 to2.attach(&cb2, 3);
avnisha 0:f25a61b099e5 235 }
avnisha 0:f25a61b099e5 236
avnisha 0:f25a61b099e5 237 void tled1off_cb(void) {
avnisha 0:f25a61b099e5 238 led1 = 0;
avnisha 0:f25a61b099e5 239 }
avnisha 0:f25a61b099e5 240
avnisha 0:f25a61b099e5 241 void tled1on_cb(void) {
avnisha 0:f25a61b099e5 242 led1 = 1;
avnisha 0:f25a61b099e5 243 tled1off.detach();
avnisha 0:f25a61b099e5 244 tled1off.attach(&tled1off_cb, 0.05);
avnisha 0:f25a61b099e5 245 }
avnisha 0:f25a61b099e5 246
avnisha 0:f25a61b099e5 247 int main() {
avnisha 0:f25a61b099e5 248
avnisha 0:f25a61b099e5 249 led1 = 1;
avnisha 0:f25a61b099e5 250 tled1off.attach(&tled1on_cb, 0.05);
avnisha 0:f25a61b099e5 251 tled1on.attach(&tled1on_cb, 1);
avnisha 0:f25a61b099e5 252 to1.attach(&cb1, 2);
avnisha 0:f25a61b099e5 253 to2.attach(&cb2, 3);
avnisha 0:f25a61b099e5 254
avnisha 0:f25a61b099e5 255 while(1) {
avnisha 1:02e0c04d84d3 256 // Calculate PI here as we have so much time
avnisha 0:f25a61b099e5 257 }
avnisha 0:f25a61b099e5 258 }
avnisha 0:f25a61b099e5 259
avnisha 0:f25a61b099e5 260 #endif
avnisha 0:f25a61b099e5 261
avnisha 1:02e0c04d84d3 262 #ifdef SIX
avnisha 1:02e0c04d84d3 263
avnisha 1:02e0c04d84d3 264 /*
avnisha 1:02e0c04d84d3 265 * Final version ... event driven for LED's
avnisha 1:02e0c04d84d3 266 */
avnisha 0:f25a61b099e5 267
avnisha 0:f25a61b099e5 268 Ticker tled1on;
avnisha 0:f25a61b099e5 269 Timeout tled1off;
avnisha 0:f25a61b099e5 270 Timeout to1;
avnisha 0:f25a61b099e5 271 Timeout to2;
avnisha 0:f25a61b099e5 272 DigitalOut led1(LED1);
avnisha 0:f25a61b099e5 273 DigitalOut to1_led(LED2);
avnisha 0:f25a61b099e5 274 DigitalOut to2_led(LED3);
avnisha 0:f25a61b099e5 275
avnisha 0:f25a61b099e5 276 void cb1(void) {
avnisha 0:f25a61b099e5 277 if (to1_led == 0) {
avnisha 0:f25a61b099e5 278 to1_led = 1;
avnisha 0:f25a61b099e5 279 }
avnisha 0:f25a61b099e5 280 else {
avnisha 0:f25a61b099e5 281 to1_led = 0;
avnisha 0:f25a61b099e5 282 }
avnisha 0:f25a61b099e5 283
avnisha 0:f25a61b099e5 284
avnisha 0:f25a61b099e5 285 // Reschedule a new event.
avnisha 0:f25a61b099e5 286 to1.detach();
avnisha 0:f25a61b099e5 287 to1.attach(&cb1, 3);
avnisha 0:f25a61b099e5 288 }
avnisha 0:f25a61b099e5 289
avnisha 0:f25a61b099e5 290 void cb2(void) {
avnisha 0:f25a61b099e5 291 if (to2_led == 0) {
avnisha 0:f25a61b099e5 292 to2_led = 1;
avnisha 0:f25a61b099e5 293 }
avnisha 0:f25a61b099e5 294 else {
avnisha 0:f25a61b099e5 295 to2_led = 0;
avnisha 0:f25a61b099e5 296 }
avnisha 0:f25a61b099e5 297 // Reschedule a new event.
avnisha 0:f25a61b099e5 298 to2.detach();
avnisha 0:f25a61b099e5 299 to2.attach(&cb2, 3);
avnisha 0:f25a61b099e5 300 }
avnisha 0:f25a61b099e5 301
avnisha 0:f25a61b099e5 302 void tled1off_cb(void) {
avnisha 0:f25a61b099e5 303 led1 = 0;
avnisha 0:f25a61b099e5 304 }
avnisha 0:f25a61b099e5 305
avnisha 0:f25a61b099e5 306 void tled1on_cb(void) {
avnisha 0:f25a61b099e5 307 led1 = 1;
avnisha 0:f25a61b099e5 308 tled1off.detach();
avnisha 0:f25a61b099e5 309 tled1off.attach(&tled1off_cb, 0.05);
avnisha 0:f25a61b099e5 310 }
avnisha 0:f25a61b099e5 311
avnisha 0:f25a61b099e5 312 int main() {
avnisha 0:f25a61b099e5 313
avnisha 0:f25a61b099e5 314 led1 = 1;
avnisha 0:f25a61b099e5 315 tled1off.attach(&tled1on_cb, 0.05);
avnisha 0:f25a61b099e5 316 tled1on.attach(&tled1on_cb, 1);
avnisha 0:f25a61b099e5 317 to1.attach(&cb1, 2);
avnisha 0:f25a61b099e5 318 to2.attach(&cb2, 3);
avnisha 0:f25a61b099e5 319
avnisha 0:f25a61b099e5 320 while(1) {
avnisha 0:f25a61b099e5 321 // Calculate PI here as we have so much time :)
avnisha 1:02e0c04d84d3 322 printf("main loop\n");
avnisha 0:f25a61b099e5 323 }
avnisha 0:f25a61b099e5 324 }
avnisha 0:f25a61b099e5 325
avnisha 0:f25a61b099e5 326 #endif
avnisha 0:f25a61b099e5 327