University of Plymouth - Stages 1, 2 and 3
/
Task616-mbedos-F429
Task 616
Fork of Task616-mbedos54 by
Diff: main.cpp
- Revision:
- 5:929a37a18808
- Parent:
- 4:1c9fde2d3d2d
--- a/main.cpp Thu Mar 30 14:28:41 2017 +0000 +++ b/main.cpp Tue Nov 07 11:56:12 2017 +0000 @@ -1,238 +1,34 @@ #include "mbed.h" - -#include "string.h" -#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 -}; - -//Digital outputs -DigitalOut onBoardLED(LED1); -DigitalOut redLED(D7); -DigitalOut yellowLED(D6); -DigitalOut greenLED(D5); - -//Serial Interface -Serial pc(USBTX, USBRX); - -//Digital inputs -DigitalIn onBoardSwitch(USER_BUTTON); -DigitalIn SW1(D4); -DigitalIn SW2(D3); +#include "sample_buffer.hpp" +#include "morse_generator.hpp" +#include "sample_hardware.hpp" //Thread ID for the Main function (CMSIS API) 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; - - -//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; - - //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(); -} - -//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() -{ - 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; - } - - //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; - } - - //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); - } - - //Gap between letters - Thread::wait(TLETTER-TGAP); - - } -} //Main thread int main() { Thread writer; - redLED = 0; - yellowLED = 0; - greenLED = 0; - - //Semaphores - bufferLock = new Mutex(); - spaceAvailable = new Semaphore(BUFFERSIZE); - samplesInBuffer = new Semaphore(0); - - + //Power On Test - check PuTTY and the LEDs + pot(); + //Main thread ID tidMain = Thread::gettid(); - //Thread for outputting mors writer.start(morseGenerator); - pc.printf("Type characters to send\n"); + printf("Type characters to send\n"); while (true) { //Read keyboard (serial port) - char c = pc.getc(); + char c = getchar(); addCharacterToQueue(c); } } + +