S5 / Mbed 2 deprecated APP2-Examen

Dependencies:   mbed-rtos mbed

Committer:
JosephMarinier
Date:
Fri Feb 03 22:55:07 2017 +0000
Revision:
3:f09f9670e40e
Parent:
2:99e36af00b06
Child:
4:1c2925026e7a
Final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JosephMarinier 2:99e36af00b06 1 // becj2903 - Joseph Marinier
JosephMarinier 2:99e36af00b06 2
JosephMarinier 0:e581bdd1b2a6 3 #include "mbed.h"
JosephMarinier 2:99e36af00b06 4 #include "rtos.h"
JosephMarinier 2:99e36af00b06 5
JosephMarinier 2:99e36af00b06 6 #define SIGNAL 1
JosephMarinier 2:99e36af00b06 7 #define ADDING_INGREDIENT 100 // ms
JosephMarinier 2:99e36af00b06 8 #define ADDING_4_INGREDIENTS 500 // ms
JosephMarinier 2:99e36af00b06 9
JosephMarinier 2:99e36af00b06 10 Semaphore ketchup(2);
JosephMarinier 2:99e36af00b06 11 Mutex relish;
JosephMarinier 2:99e36af00b06 12 Mutex mayonnaise;
JosephMarinier 2:99e36af00b06 13 Semaphore moutarde(2);
JosephMarinier 2:99e36af00b06 14 Mutex oignon;
JosephMarinier 2:99e36af00b06 15
JosephMarinier 2:99e36af00b06 16 Thread thread[4];
JosephMarinier 2:99e36af00b06 17
JosephMarinier 2:99e36af00b06 18 struct message_t {
JosephMarinier 2:99e36af00b06 19 char text[6];
JosephMarinier 2:99e36af00b06 20 };
JosephMarinier 2:99e36af00b06 21
JosephMarinier 3:f09f9670e40e 22 Queue<message_t, 4> *queue;
JosephMarinier 3:f09f9670e40e 23 MemoryPool<message_t, 4> *pool;
JosephMarinier 2:99e36af00b06 24
JosephMarinier 2:99e36af00b06 25 void add_ingredient(Semaphore ingredient) { // in Semaphore
JosephMarinier 2:99e36af00b06 26 ingredient.wait();
JosephMarinier 2:99e36af00b06 27
JosephMarinier 2:99e36af00b06 28 wait_ms(ADDING_INGREDIENT);
JosephMarinier 2:99e36af00b06 29
JosephMarinier 2:99e36af00b06 30 ingredient.release();
JosephMarinier 2:99e36af00b06 31 }
JosephMarinier 0:e581bdd1b2a6 32
JosephMarinier 2:99e36af00b06 33 void add_ingredient(Mutex ingredient) { // in Mutex
JosephMarinier 2:99e36af00b06 34 ingredient.lock();
JosephMarinier 2:99e36af00b06 35
JosephMarinier 2:99e36af00b06 36 wait_ms(ADDING_INGREDIENT);
JosephMarinier 2:99e36af00b06 37
JosephMarinier 2:99e36af00b06 38 ingredient.unlock();
JosephMarinier 2:99e36af00b06 39 }
JosephMarinier 0:e581bdd1b2a6 40
JosephMarinier 2:99e36af00b06 41 void doing_hot_dog_1() {
JosephMarinier 2:99e36af00b06 42 DigitalOut led(LED1);
JosephMarinier 2:99e36af00b06 43
JosephMarinier 2:99e36af00b06 44 while(true) {
JosephMarinier 2:99e36af00b06 45 Thread::signal_wait(SIGNAL); // every_2_seconds
JosephMarinier 2:99e36af00b06 46
JosephMarinier 2:99e36af00b06 47 add_ingredient(ketchup);
JosephMarinier 2:99e36af00b06 48 add_ingredient(relish);
JosephMarinier 2:99e36af00b06 49
JosephMarinier 2:99e36af00b06 50 led = !led;
JosephMarinier 2:99e36af00b06 51 }
JosephMarinier 2:99e36af00b06 52 }
JosephMarinier 0:e581bdd1b2a6 53
JosephMarinier 2:99e36af00b06 54 void doing_hot_dog_2() {
JosephMarinier 2:99e36af00b06 55 DigitalOut led(LED2);
JosephMarinier 2:99e36af00b06 56
JosephMarinier 2:99e36af00b06 57 while(true) {
JosephMarinier 2:99e36af00b06 58 Thread::signal_wait(SIGNAL); // every_2_seconds
JosephMarinier 2:99e36af00b06 59
JosephMarinier 2:99e36af00b06 60 add_ingredient(moutarde);
JosephMarinier 2:99e36af00b06 61 add_ingredient(oignon);
JosephMarinier 2:99e36af00b06 62 add_ingredient(mayonnaise);
JosephMarinier 2:99e36af00b06 63
JosephMarinier 2:99e36af00b06 64 led = !led;
JosephMarinier 2:99e36af00b06 65 }
JosephMarinier 2:99e36af00b06 66 }
JosephMarinier 2:99e36af00b06 67
JosephMarinier 2:99e36af00b06 68 bool passing_to_4 = false;
JosephMarinier 1:a47e9e7852fd 69
JosephMarinier 2:99e36af00b06 70 void doing_hot_dog_3() {
JosephMarinier 2:99e36af00b06 71 DigitalOut led(LED3);
JosephMarinier 2:99e36af00b06 72
JosephMarinier 2:99e36af00b06 73 while(true) {
JosephMarinier 2:99e36af00b06 74 Thread::signal_wait(SIGNAL); // every_2_seconds
JosephMarinier 2:99e36af00b06 75
JosephMarinier 2:99e36af00b06 76 add_ingredient(ketchup);
JosephMarinier 2:99e36af00b06 77
JosephMarinier 2:99e36af00b06 78 if(passing_to_4) {
JosephMarinier 3:f09f9670e40e 79 message_t *message = pool->alloc();
JosephMarinier 2:99e36af00b06 80 message->text[0] = 'h';
JosephMarinier 2:99e36af00b06 81 message->text[1] = 'o';
JosephMarinier 2:99e36af00b06 82 message->text[2] = 't';
JosephMarinier 2:99e36af00b06 83 message->text[3] = 'd';
JosephMarinier 2:99e36af00b06 84 message->text[4] = 'o';
JosephMarinier 2:99e36af00b06 85 message->text[5] = 'g';
JosephMarinier 3:f09f9670e40e 86 queue->put(message);
JosephMarinier 2:99e36af00b06 87 } else {
JosephMarinier 2:99e36af00b06 88 led = !led;
JosephMarinier 2:99e36af00b06 89 }
JosephMarinier 3:f09f9670e40e 90
JosephMarinier 3:f09f9670e40e 91 passing_to_4 = !passing_to_4;
JosephMarinier 2:99e36af00b06 92 }
JosephMarinier 2:99e36af00b06 93 }
JosephMarinier 0:e581bdd1b2a6 94
JosephMarinier 2:99e36af00b06 95 void doing_hot_dog_4() {
JosephMarinier 2:99e36af00b06 96 DigitalOut led(LED4);
JosephMarinier 2:99e36af00b06 97
JosephMarinier 2:99e36af00b06 98 while(true) {
JosephMarinier 2:99e36af00b06 99 Thread::signal_wait(SIGNAL); // every_2_seconds
JosephMarinier 2:99e36af00b06 100
JosephMarinier 3:f09f9670e40e 101 osEvent evt = queue->get();
JosephMarinier 2:99e36af00b06 102 if (evt.status == osEventMessage) {
JosephMarinier 2:99e36af00b06 103 message_t *message = (message_t*)evt.value.p;
JosephMarinier 3:f09f9670e40e 104 printf("\"%s\" should be \"hotdog\"\r\n", message->text);
JosephMarinier 3:f09f9670e40e 105 pool->free(message);
JosephMarinier 2:99e36af00b06 106
JosephMarinier 2:99e36af00b06 107 relish.lock();
JosephMarinier 2:99e36af00b06 108 mayonnaise.lock();
JosephMarinier 2:99e36af00b06 109 moutarde.wait();
JosephMarinier 2:99e36af00b06 110 oignon.lock();
JosephMarinier 2:99e36af00b06 111
JosephMarinier 2:99e36af00b06 112 wait_ms(ADDING_4_INGREDIENTS);
JosephMarinier 2:99e36af00b06 113
JosephMarinier 2:99e36af00b06 114 oignon.unlock();
JosephMarinier 2:99e36af00b06 115 moutarde.release();
JosephMarinier 2:99e36af00b06 116 mayonnaise.unlock();
JosephMarinier 2:99e36af00b06 117 relish.unlock();
JosephMarinier 2:99e36af00b06 118
JosephMarinier 2:99e36af00b06 119 led = !led;
JosephMarinier 2:99e36af00b06 120 }
JosephMarinier 2:99e36af00b06 121 }
JosephMarinier 2:99e36af00b06 122 }
JosephMarinier 0:e581bdd1b2a6 123
JosephMarinier 2:99e36af00b06 124 bool every_2_seconds = false;
JosephMarinier 3:f09f9670e40e 125 bool every_4_seconds = false;
JosephMarinier 2:99e36af00b06 126
JosephMarinier 2:99e36af00b06 127 void every_second() {
JosephMarinier 2:99e36af00b06 128 thread[0].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 129
JosephMarinier 2:99e36af00b06 130 if(every_2_seconds) {
JosephMarinier 2:99e36af00b06 131 thread[1].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 132 thread[2].signal_set(SIGNAL);
JosephMarinier 3:f09f9670e40e 133
JosephMarinier 3:f09f9670e40e 134 if(every_4_seconds) {
JosephMarinier 3:f09f9670e40e 135 thread[3].signal_set(SIGNAL);
JosephMarinier 3:f09f9670e40e 136 }
JosephMarinier 3:f09f9670e40e 137 every_4_seconds = !every_4_seconds;
JosephMarinier 2:99e36af00b06 138 }
JosephMarinier 2:99e36af00b06 139
JosephMarinier 2:99e36af00b06 140 every_2_seconds = !every_2_seconds;
JosephMarinier 0:e581bdd1b2a6 141 }
JosephMarinier 0:e581bdd1b2a6 142
JosephMarinier 0:e581bdd1b2a6 143 int main() {
JosephMarinier 3:f09f9670e40e 144 queue = &Queue<message_t, 4>();
JosephMarinier 3:f09f9670e40e 145 pool = &MemoryPool<message_t, 4>();
JosephMarinier 3:f09f9670e40e 146
JosephMarinier 2:99e36af00b06 147 thread[0] = Thread(osPriorityRealtime);
JosephMarinier 2:99e36af00b06 148 thread[0].start(doing_hot_dog_1); // Wow la phrase!
JosephMarinier 1:a47e9e7852fd 149
JosephMarinier 2:99e36af00b06 150 thread[1] = Thread(osPriorityHigh);
JosephMarinier 2:99e36af00b06 151 thread[1].start(doing_hot_dog_2); // Ho franchement, c'est cute!
JosephMarinier 2:99e36af00b06 152
JosephMarinier 2:99e36af00b06 153 thread[2] = Thread(osPriorityNormal);
JosephMarinier 2:99e36af00b06 154 thread[2].start(doing_hot_dog_3); // Hooo wow!
JosephMarinier 1:a47e9e7852fd 155
JosephMarinier 2:99e36af00b06 156 thread[3] = Thread(osPriorityLow);
JosephMarinier 2:99e36af00b06 157 thread[3].start(doing_hot_dog_4); // Wow wow wow!
JosephMarinier 2:99e36af00b06 158
JosephMarinier 2:99e36af00b06 159 Ticker ticker;
JosephMarinier 2:99e36af00b06 160 ticker.attach(&every_second, 1);
JosephMarinier 2:99e36af00b06 161
JosephMarinier 2:99e36af00b06 162 Thread::wait(osWaitForever);
JosephMarinier 0:e581bdd1b2a6 163 }