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@3:f09f9670e40e, 2017-02-03 (annotated)
- 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?
| 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 | 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 | } |