S5 / Mbed 2 deprecated APP2-Examen

Dependencies:   mbed-rtos mbed

Committer:
JosephMarinier
Date:
Sat Feb 04 00:29:53 2017 +0000
Revision:
4:1c2925026e7a
Parent:
3:f09f9670e40e
Child:
5:8ea85b4fbc76
Am?liorations post?rieures

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 4:1c2925026e7a 22 Queue<char, 4> *queue;
JosephMarinier 4:1c2925026e7a 23 MemoryPool<long, 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 4:1c2925026e7a 79 char *message = (char *)pool->alloc();
JosephMarinier 4:1c2925026e7a 80 message[0] = 'h';
JosephMarinier 4:1c2925026e7a 81 message[1] = 'o';
JosephMarinier 4:1c2925026e7a 82 message[2] = 't';
JosephMarinier 4:1c2925026e7a 83 message[3] = 'd';
JosephMarinier 4:1c2925026e7a 84 message[4] = 'o';
JosephMarinier 4:1c2925026e7a 85 message[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 3:f09f9670e40e 99 osEvent evt = queue->get();
JosephMarinier 2:99e36af00b06 100 if (evt.status == osEventMessage) {
JosephMarinier 4:1c2925026e7a 101 char *message = (char *)evt.value.p;
JosephMarinier 4:1c2925026e7a 102 printf("\"%s\" should be \"hotdog\"\r\n", message);
JosephMarinier 4:1c2925026e7a 103 pool->free((long *)message);
JosephMarinier 2:99e36af00b06 104
JosephMarinier 2:99e36af00b06 105 relish.lock();
JosephMarinier 2:99e36af00b06 106 mayonnaise.lock();
JosephMarinier 2:99e36af00b06 107 moutarde.wait();
JosephMarinier 2:99e36af00b06 108 oignon.lock();
JosephMarinier 2:99e36af00b06 109
JosephMarinier 2:99e36af00b06 110 wait_ms(ADDING_4_INGREDIENTS);
JosephMarinier 2:99e36af00b06 111
JosephMarinier 2:99e36af00b06 112 oignon.unlock();
JosephMarinier 2:99e36af00b06 113 moutarde.release();
JosephMarinier 2:99e36af00b06 114 mayonnaise.unlock();
JosephMarinier 2:99e36af00b06 115 relish.unlock();
JosephMarinier 2:99e36af00b06 116
JosephMarinier 2:99e36af00b06 117 led = !led;
JosephMarinier 2:99e36af00b06 118 }
JosephMarinier 2:99e36af00b06 119 }
JosephMarinier 2:99e36af00b06 120 }
JosephMarinier 0:e581bdd1b2a6 121
JosephMarinier 2:99e36af00b06 122 bool every_2_seconds = false;
JosephMarinier 2:99e36af00b06 123
JosephMarinier 2:99e36af00b06 124 void every_second() {
JosephMarinier 2:99e36af00b06 125 thread[0].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 126
JosephMarinier 2:99e36af00b06 127 if(every_2_seconds) {
JosephMarinier 2:99e36af00b06 128 thread[1].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 129 thread[2].signal_set(SIGNAL);
JosephMarinier 2:99e36af00b06 130 }
JosephMarinier 2:99e36af00b06 131
JosephMarinier 2:99e36af00b06 132 every_2_seconds = !every_2_seconds;
JosephMarinier 0:e581bdd1b2a6 133 }
JosephMarinier 0:e581bdd1b2a6 134
JosephMarinier 0:e581bdd1b2a6 135 int main() {
JosephMarinier 4:1c2925026e7a 136 queue = &Queue<char, 4>();
JosephMarinier 4:1c2925026e7a 137 pool = &MemoryPool<long, 4>();
JosephMarinier 3:f09f9670e40e 138
JosephMarinier 2:99e36af00b06 139 thread[0] = Thread(osPriorityRealtime);
JosephMarinier 2:99e36af00b06 140 thread[0].start(doing_hot_dog_1); // Wow la phrase!
JosephMarinier 1:a47e9e7852fd 141
JosephMarinier 2:99e36af00b06 142 thread[1] = Thread(osPriorityHigh);
JosephMarinier 2:99e36af00b06 143 thread[1].start(doing_hot_dog_2); // Ho franchement, c'est cute!
JosephMarinier 2:99e36af00b06 144
JosephMarinier 2:99e36af00b06 145 thread[2] = Thread(osPriorityNormal);
JosephMarinier 2:99e36af00b06 146 thread[2].start(doing_hot_dog_3); // Hooo wow!
JosephMarinier 1:a47e9e7852fd 147
JosephMarinier 2:99e36af00b06 148 thread[3] = Thread(osPriorityLow);
JosephMarinier 2:99e36af00b06 149 thread[3].start(doing_hot_dog_4); // Wow wow wow!
JosephMarinier 2:99e36af00b06 150
JosephMarinier 2:99e36af00b06 151 Ticker ticker;
JosephMarinier 2:99e36af00b06 152 ticker.attach(&every_second, 1);
JosephMarinier 2:99e36af00b06 153
JosephMarinier 2:99e36af00b06 154 Thread::wait(osWaitForever);
JosephMarinier 0:e581bdd1b2a6 155 }