S5 / Mbed 2 deprecated APP2-Examen

Dependencies:   mbed-rtos mbed

Committer:
JosephMarinier
Date:
Fri Feb 03 17:49:39 2017 +0000
Revision:
2:99e36af00b06
Parent:
1:a47e9e7852fd
Child:
3:f09f9670e40e
Presque fini

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 2:99e36af00b06 22 Queue<message_t, 4> queue;
JosephMarinier 2:99e36af00b06 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 2:99e36af00b06 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 2:99e36af00b06 86 queue.put(message);
JosephMarinier 2:99e36af00b06 87 } else {
JosephMarinier 2:99e36af00b06 88 led = !led;
JosephMarinier 2:99e36af00b06 89 }
JosephMarinier 2:99e36af00b06 90 }
JosephMarinier 2:99e36af00b06 91 }
JosephMarinier 0:e581bdd1b2a6 92
JosephMarinier 2:99e36af00b06 93 void doing_hot_dog_4() {
JosephMarinier 2:99e36af00b06 94 DigitalOut led(LED4);
JosephMarinier 2:99e36af00b06 95
JosephMarinier 2:99e36af00b06 96 while(true) {
JosephMarinier 2:99e36af00b06 97 Thread::signal_wait(SIGNAL); // every_2_seconds
JosephMarinier 2:99e36af00b06 98
JosephMarinier 2:99e36af00b06 99 osEvent evt = queue.get();
JosephMarinier 2:99e36af00b06 100 if (evt.status == osEventMessage) {
JosephMarinier 2:99e36af00b06 101 message_t *message = (message_t*)evt.value.p;
JosephMarinier 2:99e36af00b06 102 printf("%s\r\n", message->text);
JosephMarinier 2:99e36af00b06 103
JosephMarinier 2:99e36af00b06 104 pool.free(message);
JosephMarinier 2:99e36af00b06 105
JosephMarinier 2:99e36af00b06 106 relish.lock();
JosephMarinier 2:99e36af00b06 107 mayonnaise.lock();
JosephMarinier 2:99e36af00b06 108 moutarde.wait();
JosephMarinier 2:99e36af00b06 109 oignon.lock();
JosephMarinier 2:99e36af00b06 110
JosephMarinier 2:99e36af00b06 111 wait_ms(ADDING_4_INGREDIENTS);
JosephMarinier 2:99e36af00b06 112
JosephMarinier 2:99e36af00b06 113 oignon.unlock();
JosephMarinier 2:99e36af00b06 114 moutarde.release();
JosephMarinier 2:99e36af00b06 115 mayonnaise.unlock();
JosephMarinier 2:99e36af00b06 116 relish.unlock();
JosephMarinier 2:99e36af00b06 117
JosephMarinier 2:99e36af00b06 118 led = !led;
JosephMarinier 2:99e36af00b06 119 }
JosephMarinier 2:99e36af00b06 120 }
JosephMarinier 2:99e36af00b06 121 }
JosephMarinier 0:e581bdd1b2a6 122
JosephMarinier 2:99e36af00b06 123 bool every_2_seconds = false;
JosephMarinier 2:99e36af00b06 124
JosephMarinier 2:99e36af00b06 125 void every_second() {
JosephMarinier 2:99e36af00b06 126 //leds = i;
JosephMarinier 2:99e36af00b06 127 //t = (t + 1) % period;
JosephMarinier 2:99e36af00b06 128
JosephMarinier 2:99e36af00b06 129 thread[0].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 130
JosephMarinier 2:99e36af00b06 131 if(every_2_seconds) {
JosephMarinier 2:99e36af00b06 132 thread[1].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 133 thread[2].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 134 }
JosephMarinier 2:99e36af00b06 135
JosephMarinier 2:99e36af00b06 136 thread[3].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 137
JosephMarinier 2:99e36af00b06 138 every_2_seconds = !every_2_seconds;
JosephMarinier 0:e581bdd1b2a6 139 }
JosephMarinier 0:e581bdd1b2a6 140
JosephMarinier 0:e581bdd1b2a6 141 int main() {
JosephMarinier 2:99e36af00b06 142 //leds = 0b0000;
JosephMarinier 2:99e36af00b06 143
JosephMarinier 2:99e36af00b06 144 //thread = &Thread();
JosephMarinier 2:99e36af00b06 145 //thread->start(tick);
JosephMarinier 1:a47e9e7852fd 146
JosephMarinier 2:99e36af00b06 147 //RTC::attach(hot_dog_3, RTC::Second);
JosephMarinier 2:99e36af00b06 148
JosephMarinier 2:99e36af00b06 149 thread[0] = Thread(osPriorityRealtime);
JosephMarinier 2:99e36af00b06 150 thread[0].start(doing_hot_dog_1); // Wow la phrase!
JosephMarinier 1:a47e9e7852fd 151
JosephMarinier 2:99e36af00b06 152 thread[1] = Thread(osPriorityHigh);
JosephMarinier 2:99e36af00b06 153 thread[1].start(doing_hot_dog_2); // Ho franchement, c'est cute!
JosephMarinier 2:99e36af00b06 154
JosephMarinier 2:99e36af00b06 155 thread[2] = Thread(osPriorityNormal);
JosephMarinier 2:99e36af00b06 156 thread[2].start(doing_hot_dog_3); // Hooo wow!
JosephMarinier 1:a47e9e7852fd 157
JosephMarinier 2:99e36af00b06 158 thread[3] = Thread(osPriorityLow);
JosephMarinier 2:99e36af00b06 159 thread[3].start(doing_hot_dog_4); // Wow wow wow!
JosephMarinier 2:99e36af00b06 160
JosephMarinier 2:99e36af00b06 161 Ticker ticker;
JosephMarinier 2:99e36af00b06 162 ticker.attach(&every_second, 1);
JosephMarinier 2:99e36af00b06 163
JosephMarinier 2:99e36af00b06 164 Thread::wait(osWaitForever);
JosephMarinier 0:e581bdd1b2a6 165 }