Queues

Dependencies:   ELEC350-Practicals-FZ429

Fork of Task631-mbedos54 by Nicholas Outram

main.cpp

Committer:
noutram
Date:
2019-11-15
Revision:
15:25f524c156ef
Parent:
14:1e4ce7eb6d1e

File content as of revision 15:25f524c156ef:

#include "mbed.h"
#include "sample_hardware.hpp"

#include "string.h"
#include <stdio.h>
#include <ctype.h>

#define SWITCH1_RELEASE 1

void thread1();
void thread2();
void switchISR();

//Threads
Thread t1;

//Queues - "A message can be a integer or pointer value  to a certain type T that is sent to a thread or interrupt service routine."
Queue<uint32_t, 5> queue;

// Call this on precise intervals
void adcISR() {
    
    //Option to starve the queue
    if (SW2 == 1) return;
    
    //Read sample - make a copy
    uint32_t sample = (uint32_t)(4095*adcIn.read());
    
    //Write to queue
    osStatus stat = queue.put((uint32_t*)sample);
    
    //Check if succesful
    if (stat == osErrorResource) {
        redLED = 1; 
        printf("queue->put() Error code: %4Xh, Resource not available\r\n", stat);   
    }
    
}

//Normal priority thread (consumer)
void thread1() 
{    
    while (true) {
        //Read queue - block (with timeout)
        osEvent evt = queue.get(5000);     //With timeout
        
        //Check status of get()
        switch (evt.status) { 
            case osEventMessage:
                //Normal status
                printf("value = %d\n\r", evt.value.v);
                greenLED = !greenLED;
                break;
            case osEventTimeout:
                //Timeout
                printf("queue.get() returned %02x status (timeout)\n\r", evt.status);
                break;
            default:
                //All other errors (see cmsis_os.h for meaning of error code)
                printf("queue.get() returned %02x status\n\r", evt.status);
                break;
        }
                
        //Block up consumer if switch is held down
        //Will fill the queue if held long enough
        while (SW1 == 1);
        
    } //end while
}


// Main thread
int main() {
    post();
           
    //Start message
    printf("Welcome\n");
           
    //Hook up timer interrupt   
    Ticker timer; 
    timer.attach(&adcISR, 1.0);
               
    //Threads
    t1.start(thread1);
    
    printf("Main Thread\n");
    while (true) {
        Thread::wait(5000);
        puts("Main Thread Alive");
    }
}