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@4:1c2925026e7a, 2017-02-04 (annotated)
- 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?
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 | 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 | } |