Task 641

Dependencies:   ELEC350-Practicals-FZ429

Fork of Task641-mbedos54 by Nicholas Outram

main.cpp

Committer:
noutram
Date:
2017-11-23
Revision:
12:cfdead107f43
Parent:
11:09fc22b7f251

File content as of revision 12:cfdead107f43:

#include "mbed.h"
#include "string.h"
#include <stdio.h>
#include <ctype.h>
#include "sample_hardware.hpp"

#define SWITCH1_RELEASE 1

void getSample();
void thread1();
void switchISR();

//Threads
Thread samplingThread(osPriorityRealtime);
Thread t1;


//Class type
class message_t {
public:    
    float adcValue;    
    int sw1State;
    int sw2State;
    
    //Constructor
    message_t(float f, int s1, int s2) {
        adcValue = f;
        sw1State = s1;
        sw2State = s2;    
    }
};
 
//Memory Pool - with capacity for 16 message_t types
MemoryPool<message_t, 16> mpool;

//Message queue - matched to the memory pool
Queue<message_t, 16> queue;


// Call this on precise intervals
void adcISR() {
    //This is going to be brief ;)
    samplingThread.signal_set(1);
}

//High priority thread dedicated to sampling
void getSample() {
    
    while(1) {
        //Waiting for ISR in WAITING state
        Thread::signal_wait(1);
        
        //Read sample - make a copy
        float sample = adcIn;
        //Grab switch state
        uint32_t switch1State = SW1;
        uint32_t switch2State = SW2;
        
        //Allocate a block from the memory pool
        message_t *message = mpool.alloc();
        if (message == NULL) {
            //Out of memory
            redLED = 1;
            return;   
        }
        
        //Fill in the data
        message->adcValue = sample;
        message->sw1State = switch1State;
        message->sw2State = switch2State;
        
        //Write to queue
        osStatus stat = queue.put(message);    //Note we are sending the "pointer"
        
        //Check if succesful
        if (stat == osErrorResource) {
            redLED = 1; 
            printf("queue.put() Error code: %4Xh, Resource not available\r\n", stat);   
            mpool.free(message);
            return;
        }        
    } //end while
}



//Normal priority thread (consumer)
void thread1() 
{      
    while (true) {
        //Block on the queue
        osEvent evt = queue.get();
        
        //Check status
        if (evt.status == osEventMessage) {
            message_t *pMessage = (message_t*)evt.value.p;  //This is the pointer (address)
            //Construct a COPY
            message_t msg(pMessage->adcValue, pMessage->sw1State, pMessage->sw2State);
            //We are done with this, so give back the memory to the pool
            mpool.free(pMessage);
            
            //Echo to the terminal
            printf("ADC Value: %.2f\t",    msg.adcValue);
            printf("SW1: %u\t",            msg.sw1State);
            printf("SW2: %u\t\r",          msg.sw2State);
        }

             
    } //end while
}


// Main thread
int main() {
    redLED    = 0;
    yellowLED = 0;
    greenLED  = 0;
           
    //Start message
    printf("Welcome\n");           
   
    //Hook up timer interrupt   
    Ticker timer; 
    timer.attach(&adcISR, 0.1);
               
    //Threads
    samplingThread.start(getSample);
    t1.start(thread1); 
    
    printf("Main Thread\n");
    while (true) {
        Thread::wait(5000);
        puts("Main Thread Alive");
    }
}