Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 4:dae8898e55fe
- Parent:
- 3:423191a375dc
- Child:
- 5:31707531f715
diff -r 423191a375dc -r dae8898e55fe main.cpp
--- a/main.cpp Wed Mar 09 10:12:51 2016 +0000
+++ b/main.cpp Wed Mar 09 17:18:55 2016 +0000
@@ -4,74 +4,7 @@
#include <stdio.h>
#include <ctype.h>
-#define RED_DONE 1
-#define YELLOW_DONE 2
-
-//Delays in ms
-#define TUNIT 250
-#define TDOT TUNIT
-#define TDASH (3*TUNIT)
-#define TGAP TUNIT
-#define TLETTER (3*TUNIT)
-#define TWORD (7*TUNIT)
-
-//Size of the morse character buffer
-#define BUFFERSIZE 100
-
-
-/*
-**** Morse Code ***
-
-. 1 unit
-- 3 units
-inter-space 1 unit
-
-between letters 3 units
-between words 7 units
-*/
-
-//Morse code
-const char* const morseAlpha[] = {
- ".-", //A
- "-...", //B
- "-.-.", //C
- "-..", //D
- ".", //E
- "..-.", //F
- "--.", //G
- "....", //H
- "..", //I
- ".---", //J
- "-.-", //K
- ".-..", //L
- "--", //M
- "-.", //N
- "---", //O
- ".--.", //P
- "--.-", //Q
- ".-.", //R
- "...", //S
- "-", //T
- "..-", //U
- "...-", //V
- ".--", //W
- "-..-", //X
- "-.--", //Y
- "--.." //Z
-};
-
-const char* const morseNumeric[] = {
- "-----", //0
- ".----", //1
- "..---", //2
- "...--", //3
- "....-", //4
- ".....", //5
- "-....", //6
- "--...", //7
- "---..", //8
- "----." //9
-};
+#define DELAY 200
//Digital outputs
DigitalOut onBoardLED(LED1);
@@ -91,144 +24,83 @@
osThreadId tidMain;
//Thread sychronisation primatives
-Semaphore *spaceAvailable;
-Semaphore *samplesInBuffer;
-Mutex *bufferLock;
-
-//Output buffer
-char buffer[BUFFERSIZE];
-unsigned int newestIndex = BUFFERSIZE-1; //First time it is incremented, it will be 0
-unsigned int oldestIndex = BUFFERSIZE-1;
-
+Mutex lock1;
+Mutex lock2;
+unsigned long sw1Count = 0;
+unsigned long sw2Count = 0;
-//Producer
-void addCharacterToQueue(const char c)
-{
- //Is there space?
- int32_t Nspaces = spaceAvailable->wait();
-
- //Ok, there is space - take the lock
- bufferLock->lock();
- redLED = 1;
+void thread1( const void* arg )
+{
+ pc.printf("Entering thread 1\n");
+ while (true) {
+
+ //Start critical section
+ lock1.lock();
+
+ sw1Count++;
+ printf("\nCount1 = %lu", sw1Count);
+
+ //Thread::wait(1); //1ms
- //Update buffer
- newestIndex = (newestIndex+1) % BUFFERSIZE;
- buffer[newestIndex] = c;
- pc.printf("\tAdded ASCII Character: %2Xh (%c) to buffer, %d spaces available\n", c, c, Nspaces-1);
-
- //Release lock
- bufferLock->unlock();
- redLED = 0;
-
- //Signal that a sample has been added
- samplesInBuffer->release();
+ if (SW1 == 1) {
+ yellowLED = 1;
+ lock2.lock();
+ sw2Count--;
+ lock2.unlock();
+ yellowLED = 0;
+ }
+
+ //End critical section
+ lock1.unlock();
+
+ Thread::wait(DELAY);
+ }
}
-//Consumer
-char takeCharacterFromQueue()
-{
- //Are thre any samples in the buffer
- int32_t Nsamples = samplesInBuffer->wait();
-
- //Ok, there are samples - take the lock
- bufferLock->lock();
- yellowLED = 1;
-
- //Update buffer - remove oldest
- oldestIndex = (oldestIndex+1) % BUFFERSIZE;
- char cc = buffer[oldestIndex];
- pc.printf("\t\tTaking ASCII Character: %2Xh (%c) from buffer, %d bytes remaining\n", cc, cc, Nsamples-1);
-
- //Release lock
- bufferLock->unlock();
- yellowLED = 0;
-
- //Signal there is space in the buffer
- spaceAvailable->release();
-
- //return a copy of the result
- return cc;
-}
-
-void morseGenerator( const void* arg )
+void thread2( const void* arg )
{
+ pc.printf("Entering thread 2\n");
while (true) {
- //Are there samples available?
- char nextChar = takeCharacterFromQueue();
- nextChar = tolower(nextChar);
-
- //Look up morse code
-
- //Space between words - assumes only one
- if (nextChar == ' ') {
- Thread::wait(TWORD-TLETTER);
- continue;
- }
+ //Start critical section
+ lock2.lock();
- //Number?
- const char *nextString;
- if ((nextChar >= '0') && (nextChar <= '9')) {
- nextString = morseNumeric[nextChar - '0'];
- }
- //Character?
- else if ((nextChar >='a') && (nextChar <= 'z')) {
- nextString = morseAlpha[nextChar - 'a'];
- } else {
- //Invalid
- continue;
- }
+ sw2Count++;
+ printf("\nCount2 = %lu", sw2Count);
+
+ //Thread::wait(1); //1ms
- //Flash morse for this letter
- for (unsigned int n=0; n<strlen(nextString); n++) {
- char symb = nextString[n];
- greenLED = 1;
- switch (symb) {
- case '.':
- Thread::wait(TDOT);
- break;
- case '-':
- Thread::wait(TDASH);
- break;
- default:
- break;
- }
- greenLED = 0;
-
- //A gap between symbols
- Thread::wait(TGAP);
- }
+ if (SW2 == 1) {
+ redLED = 1;
+ lock1.lock();
+ sw1Count--;
+ lock1.unlock();
+ redLED = 0;
+ }
+ //End critical section
+ lock2.unlock();
- //Gap between letters
- Thread::wait(TLETTER-TGAP);
-
- }
+ Thread::wait(DELAY);
+ }
}
+
//Main thread
int main() {
redLED = 0;
yellowLED = 0;
greenLED = 0;
-
- //Semaphores
- bufferLock = new Mutex();
- spaceAvailable = new Semaphore(BUFFERSIZE);
- samplesInBuffer = new Semaphore(0);
-
-
+
//Main thread ID
tidMain = Thread::gettid();
-
- //Thread for outputting mors
- Thread writer(morseGenerator);
+ //Threads
+ Thread t1(thread1);
+ Thread t2(thread2);
- pc.printf("Type characters to send\n");
+ pc.printf("Main Thread\n");
while (true) {
- //Read keyboard (serial port)
- char c = pc.getc();
- addCharacterToQueue(c);
+ Thread::wait(osWaitForever);
}
}