Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@2:99e36af00b06, 2017-02-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |