Display text on LCD displays (even on multiple ones). Allow to create windows (frames) on display, and to combine them (split, add, duplicate, scroll). See http://mbed.org/users/hlipka/notebook/lcdwindow/ for more information.

Dependents:   Mbell

Committer:
hlipka
Date:
Sun Nov 28 22:09:54 2010 +0000
Revision:
3:e5d5e2fe4bf6
Child:
9:2fe93daa2106
Made LCD driver thread safe (to allow usage from timers)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hlipka 3:e5d5e2fe4bf6 1 /**
hlipka 3:e5d5e2fe4bf6 2 * code from Igor Skochinsky
hlipka 3:e5d5e2fe4bf6 3 * taken from http://mbed.org/forum/mbed/post/799/
hlipka 3:e5d5e2fe4bf6 4 */
hlipka 3:e5d5e2fe4bf6 5
hlipka 3:e5d5e2fe4bf6 6 #include "semaphore.h"
hlipka 3:e5d5e2fe4bf6 7
hlipka 3:e5d5e2fe4bf6 8 Semaphore::Semaphore(): s(SemFree) {};
hlipka 3:e5d5e2fe4bf6 9
hlipka 3:e5d5e2fe4bf6 10 bool Semaphore::take(bool block)
hlipka 3:e5d5e2fe4bf6 11 {
hlipka 3:e5d5e2fe4bf6 12 int oldval;
hlipka 3:e5d5e2fe4bf6 13 #if defined(TARGET_LPC1768) // on Cortex-M3 we can use ldrex/strex
hlipka 3:e5d5e2fe4bf6 14 do {
hlipka 3:e5d5e2fe4bf6 15 // read the semaphore value
hlipka 3:e5d5e2fe4bf6 16 oldval = __ldrex(&s);
hlipka 3:e5d5e2fe4bf6 17 // loop again if it is locked and we are blocking
hlipka 3:e5d5e2fe4bf6 18 // or setting it with strex failed
hlipka 3:e5d5e2fe4bf6 19 }
hlipka 3:e5d5e2fe4bf6 20 while ( (block && oldval == SemTaken) || __strex(SemTaken, &s) != 0 );
hlipka 3:e5d5e2fe4bf6 21 if ( !block ) __clrex(); // clear exclusive lock set by ldrex
hlipka 3:e5d5e2fe4bf6 22 #else // on arm7 there's only swp
hlipka 3:e5d5e2fe4bf6 23 do {
hlipka 3:e5d5e2fe4bf6 24 // swp sets the pointed data to the given value and returns the previous one
hlipka 3:e5d5e2fe4bf6 25 oldval = __swp(SemTaken, &s);
hlipka 3:e5d5e2fe4bf6 26 // if blocking, loop until the previous value becomes 0
hlipka 3:e5d5e2fe4bf6 27 // which would mean we have successfully taken the lock
hlipka 3:e5d5e2fe4bf6 28 }
hlipka 3:e5d5e2fe4bf6 29 while (block && oldval == SemTaken);
hlipka 3:e5d5e2fe4bf6 30 #endif
hlipka 3:e5d5e2fe4bf6 31 return oldval == SemFree;
hlipka 3:e5d5e2fe4bf6 32 }
hlipka 3:e5d5e2fe4bf6 33
hlipka 3:e5d5e2fe4bf6 34 // release the semaphore
hlipka 3:e5d5e2fe4bf6 35 void Semaphore::release()
hlipka 3:e5d5e2fe4bf6 36 {
hlipka 3:e5d5e2fe4bf6 37 s = SemFree;
hlipka 3:e5d5e2fe4bf6 38 }
hlipka 3:e5d5e2fe4bf6 39