testharness for my semphore class

Dependencies:   mbed

main.cpp

Committer:
roberto_b
Date:
2010-09-14
Revision:
0:a2eb037fbb76

File content as of revision 0:a2eb037fbb76:

/**
 * Test program for a bug. (http://mbed.org/forum/bugs-suggestions/topic/1074/)
 *
 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
 * http://shinta.main.jp/
 */

#include "mbed.h"
#include "Semaphore.h"

Serial ser(USBTX, USBRX);

DigitalOut interrupt_data_led(LED1);
DigitalOut dataled(LED2);
DigitalOut data_locked_led(LED3);
DigitalOut no_data_led(LED4);

Semaphore sem;

volatile char shared_resource = 'a';   // This is a shared resource for example.

#define LOCK() sem.try_enter()
#define UNLOCK() sem.release()

void toggle_led( DigitalOut &led) {
    if ( 1 == led)
        led = 0;
    else
        led = 1;
}

char* my_itoa(int val, int base) {
    static char buf[12] = {0};

    int i = 10;
    if ( 0 != val) {
        for (; val && i ; --i, val /= base)
            buf[i] = "0123456789abcdef"[val % base];
        return &buf[i+1];
    } else {
        buf[0] = '0';
        buf[1] = '0';
        return &buf[0];
    }
}

void waitBeforeSend(char ch) {
    while ( 0 == ser.writeable()) {
        wait_ms(1);
    }
    ser.putc( ch );
    toggle_led(dataled);
}


/**
 * A call back function for serial interrupt.
 */
void func_serial_interrupt(void) {
    toggle_led(interrupt_data_led);
    if (LOCK()) {
        shared_resource = ser.getc();
        UNLOCK();
    } else {
        toggle_led(no_data_led);
    }
}

/**
 * Entry point.
 */
int main() {
    int i = 0;
    char *out = "my semaphore test program\r\n";
    ser.attach(&func_serial_interrupt);
    char *ptr = out;
    while ( *ptr != 0 ) {
        waitBeforeSend(*ptr);
        ptr++;
    }

    while (1) {
        /*
         * Hung up serial communication if you hit keys on console for Serial.
         */
        if (LOCK()) {
            ptr = my_itoa(shared_resource, 16);
            UNLOCK();
            while ( *ptr != 0 ) {
                waitBeforeSend(*ptr);
                ptr++;
            }
            i++;
            i %= 20;
            if (!i) {
                waitBeforeSend('\r');
                waitBeforeSend('\n');
            } else {
                waitBeforeSend(' ');
            }
        } else {
            toggle_led(data_locked_led);
        }
        wait_ms(100);
    }
}