S5 / Mbed 2 deprecated APP2-Examen

Dependencies:   mbed-rtos mbed

main.cpp

Committer:
JosephMarinier
Date:
2017-02-03
Revision:
2:99e36af00b06
Parent:
1:a47e9e7852fd
Child:
3:f09f9670e40e

File content as of revision 2:99e36af00b06:

// becj2903 - Joseph Marinier

#include "mbed.h"
#include "rtos.h"

#define SIGNAL 1
#define ADDING_INGREDIENT 100 // ms
#define ADDING_4_INGREDIENTS 500 // ms

Semaphore ketchup(2);
Mutex relish;
Mutex mayonnaise;
Semaphore moutarde(2);
Mutex oignon;

Thread thread[4];

struct message_t {
    char text[6];
};

Queue<message_t, 4> queue;
MemoryPool<message_t, 4> pool;

void add_ingredient(Semaphore ingredient) { // in Semaphore
    ingredient.wait();
    
    wait_ms(ADDING_INGREDIENT);
    
    ingredient.release();
}

void add_ingredient(Mutex ingredient) { // in Mutex
    ingredient.lock();
    
    wait_ms(ADDING_INGREDIENT);
    
    ingredient.unlock();
}

void doing_hot_dog_1() {
    DigitalOut led(LED1);
    
    while(true) {
        Thread::signal_wait(SIGNAL); // every_2_seconds
        
        add_ingredient(ketchup);
        add_ingredient(relish);
        
        led = !led;
    }
}

void doing_hot_dog_2() {
    DigitalOut led(LED2);
    
    while(true) {
        Thread::signal_wait(SIGNAL); // every_2_seconds
        
        add_ingredient(moutarde);
        add_ingredient(oignon);
        add_ingredient(mayonnaise);
        
        led = !led;
    }
}

bool passing_to_4 = false;

void doing_hot_dog_3() {
    DigitalOut led(LED3);
    
    while(true) {
        Thread::signal_wait(SIGNAL); // every_2_seconds
        
        add_ingredient(ketchup);
        
        if(passing_to_4) {
            message_t *message = pool.alloc();
            message->text[0] = 'h';
            message->text[1] = 'o';
            message->text[2] = 't';
            message->text[3] = 'd';
            message->text[4] = 'o';
            message->text[5] = 'g';
            queue.put(message);
        } else {
            led = !led;
        }
    }
}

void doing_hot_dog_4() {
    DigitalOut led(LED4);
    
    while(true) {
        Thread::signal_wait(SIGNAL); // every_2_seconds
        
        osEvent evt = queue.get();
        if (evt.status == osEventMessage) {
            message_t *message = (message_t*)evt.value.p;
            printf("%s\r\n", message->text);
            
            pool.free(message);
            
            relish.lock();
            mayonnaise.lock();
            moutarde.wait();
            oignon.lock();
            
            wait_ms(ADDING_4_INGREDIENTS);
            
            oignon.unlock();
            moutarde.release();
            mayonnaise.unlock();
            relish.unlock();
            
            led = !led;
        }
    }
}

bool every_2_seconds = false;

void every_second() {
    //leds = i;
    //t = (t + 1) % period;
    
    thread[0].signal_set(SIGNAL);
    
    if(every_2_seconds) {
        thread[1].signal_set(SIGNAL);
        thread[2].signal_set(SIGNAL);
    }
    
    thread[3].signal_set(SIGNAL);
    
    every_2_seconds = !every_2_seconds;
}

int main() {
    //leds = 0b0000;
    
    //thread = &Thread();
    //thread->start(tick);
    
    //RTC::attach(hot_dog_3, RTC::Second);
    
    thread[0] = Thread(osPriorityRealtime);
    thread[0].start(doing_hot_dog_1); // Wow la phrase!
    
    thread[1] = Thread(osPriorityHigh);
    thread[1].start(doing_hot_dog_2); // Ho franchement, c'est cute!
    
    thread[2] = Thread(osPriorityNormal);
    thread[2].start(doing_hot_dog_3); // Hooo wow!
    
    thread[3] = Thread(osPriorityLow);
    thread[3].start(doing_hot_dog_4); // Wow wow wow!
    
    Ticker ticker;
    ticker.attach(&every_second, 1);
    
    Thread::wait(osWaitForever);
}