testharness for my semphore class

Dependencies:   mbed

Committer:
roberto_b
Date:
Tue Sep 14 20:38:26 2010 +0000
Revision:
0:a2eb037fbb76

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
roberto_b 0:a2eb037fbb76 1 /**
roberto_b 0:a2eb037fbb76 2 * Test program for a bug. (http://mbed.org/forum/bugs-suggestions/topic/1074/)
roberto_b 0:a2eb037fbb76 3 *
roberto_b 0:a2eb037fbb76 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
roberto_b 0:a2eb037fbb76 5 * http://shinta.main.jp/
roberto_b 0:a2eb037fbb76 6 */
roberto_b 0:a2eb037fbb76 7
roberto_b 0:a2eb037fbb76 8 #include "mbed.h"
roberto_b 0:a2eb037fbb76 9 #include "Semaphore.h"
roberto_b 0:a2eb037fbb76 10
roberto_b 0:a2eb037fbb76 11 Serial ser(USBTX, USBRX);
roberto_b 0:a2eb037fbb76 12
roberto_b 0:a2eb037fbb76 13 DigitalOut interrupt_data_led(LED1);
roberto_b 0:a2eb037fbb76 14 DigitalOut dataled(LED2);
roberto_b 0:a2eb037fbb76 15 DigitalOut data_locked_led(LED3);
roberto_b 0:a2eb037fbb76 16 DigitalOut no_data_led(LED4);
roberto_b 0:a2eb037fbb76 17
roberto_b 0:a2eb037fbb76 18 Semaphore sem;
roberto_b 0:a2eb037fbb76 19
roberto_b 0:a2eb037fbb76 20 volatile char shared_resource = 'a'; // This is a shared resource for example.
roberto_b 0:a2eb037fbb76 21
roberto_b 0:a2eb037fbb76 22 #define LOCK() sem.try_enter()
roberto_b 0:a2eb037fbb76 23 #define UNLOCK() sem.release()
roberto_b 0:a2eb037fbb76 24
roberto_b 0:a2eb037fbb76 25 void toggle_led( DigitalOut &led) {
roberto_b 0:a2eb037fbb76 26 if ( 1 == led)
roberto_b 0:a2eb037fbb76 27 led = 0;
roberto_b 0:a2eb037fbb76 28 else
roberto_b 0:a2eb037fbb76 29 led = 1;
roberto_b 0:a2eb037fbb76 30 }
roberto_b 0:a2eb037fbb76 31
roberto_b 0:a2eb037fbb76 32 char* my_itoa(int val, int base) {
roberto_b 0:a2eb037fbb76 33 static char buf[12] = {0};
roberto_b 0:a2eb037fbb76 34
roberto_b 0:a2eb037fbb76 35 int i = 10;
roberto_b 0:a2eb037fbb76 36 if ( 0 != val) {
roberto_b 0:a2eb037fbb76 37 for (; val && i ; --i, val /= base)
roberto_b 0:a2eb037fbb76 38 buf[i] = "0123456789abcdef"[val % base];
roberto_b 0:a2eb037fbb76 39 return &buf[i+1];
roberto_b 0:a2eb037fbb76 40 } else {
roberto_b 0:a2eb037fbb76 41 buf[0] = '0';
roberto_b 0:a2eb037fbb76 42 buf[1] = '0';
roberto_b 0:a2eb037fbb76 43 return &buf[0];
roberto_b 0:a2eb037fbb76 44 }
roberto_b 0:a2eb037fbb76 45 }
roberto_b 0:a2eb037fbb76 46
roberto_b 0:a2eb037fbb76 47 void waitBeforeSend(char ch) {
roberto_b 0:a2eb037fbb76 48 while ( 0 == ser.writeable()) {
roberto_b 0:a2eb037fbb76 49 wait_ms(1);
roberto_b 0:a2eb037fbb76 50 }
roberto_b 0:a2eb037fbb76 51 ser.putc( ch );
roberto_b 0:a2eb037fbb76 52 toggle_led(dataled);
roberto_b 0:a2eb037fbb76 53 }
roberto_b 0:a2eb037fbb76 54
roberto_b 0:a2eb037fbb76 55
roberto_b 0:a2eb037fbb76 56 /**
roberto_b 0:a2eb037fbb76 57 * A call back function for serial interrupt.
roberto_b 0:a2eb037fbb76 58 */
roberto_b 0:a2eb037fbb76 59 void func_serial_interrupt(void) {
roberto_b 0:a2eb037fbb76 60 toggle_led(interrupt_data_led);
roberto_b 0:a2eb037fbb76 61 if (LOCK()) {
roberto_b 0:a2eb037fbb76 62 shared_resource = ser.getc();
roberto_b 0:a2eb037fbb76 63 UNLOCK();
roberto_b 0:a2eb037fbb76 64 } else {
roberto_b 0:a2eb037fbb76 65 toggle_led(no_data_led);
roberto_b 0:a2eb037fbb76 66 }
roberto_b 0:a2eb037fbb76 67 }
roberto_b 0:a2eb037fbb76 68
roberto_b 0:a2eb037fbb76 69 /**
roberto_b 0:a2eb037fbb76 70 * Entry point.
roberto_b 0:a2eb037fbb76 71 */
roberto_b 0:a2eb037fbb76 72 int main() {
roberto_b 0:a2eb037fbb76 73 int i = 0;
roberto_b 0:a2eb037fbb76 74 char *out = "my semaphore test program\r\n";
roberto_b 0:a2eb037fbb76 75 ser.attach(&func_serial_interrupt);
roberto_b 0:a2eb037fbb76 76 char *ptr = out;
roberto_b 0:a2eb037fbb76 77 while ( *ptr != 0 ) {
roberto_b 0:a2eb037fbb76 78 waitBeforeSend(*ptr);
roberto_b 0:a2eb037fbb76 79 ptr++;
roberto_b 0:a2eb037fbb76 80 }
roberto_b 0:a2eb037fbb76 81
roberto_b 0:a2eb037fbb76 82 while (1) {
roberto_b 0:a2eb037fbb76 83 /*
roberto_b 0:a2eb037fbb76 84 * Hung up serial communication if you hit keys on console for Serial.
roberto_b 0:a2eb037fbb76 85 */
roberto_b 0:a2eb037fbb76 86 if (LOCK()) {
roberto_b 0:a2eb037fbb76 87 ptr = my_itoa(shared_resource, 16);
roberto_b 0:a2eb037fbb76 88 UNLOCK();
roberto_b 0:a2eb037fbb76 89 while ( *ptr != 0 ) {
roberto_b 0:a2eb037fbb76 90 waitBeforeSend(*ptr);
roberto_b 0:a2eb037fbb76 91 ptr++;
roberto_b 0:a2eb037fbb76 92 }
roberto_b 0:a2eb037fbb76 93 i++;
roberto_b 0:a2eb037fbb76 94 i %= 20;
roberto_b 0:a2eb037fbb76 95 if (!i) {
roberto_b 0:a2eb037fbb76 96 waitBeforeSend('\r');
roberto_b 0:a2eb037fbb76 97 waitBeforeSend('\n');
roberto_b 0:a2eb037fbb76 98 } else {
roberto_b 0:a2eb037fbb76 99 waitBeforeSend(' ');
roberto_b 0:a2eb037fbb76 100 }
roberto_b 0:a2eb037fbb76 101 } else {
roberto_b 0:a2eb037fbb76 102 toggle_led(data_locked_led);
roberto_b 0:a2eb037fbb76 103 }
roberto_b 0:a2eb037fbb76 104 wait_ms(100);
roberto_b 0:a2eb037fbb76 105 }
roberto_b 0:a2eb037fbb76 106 }