]> git.donarmstrong.com Git - qmk_firmware.git/blob - tool/mbed/mbed-sdk/libraries/tests/rtos/mbed/queue/main.cpp
Squashed 'tmk_core/' changes from 7967731..b9e0ea0
[qmk_firmware.git] / tool / mbed / mbed-sdk / libraries / tests / rtos / mbed / queue / main.cpp
1 #include "mbed.h"
2 #include "test_env.h"
3 #include "rtos.h"
4
5 typedef struct {
6     float    voltage;   /* AD result of measured voltage */
7     float    current;   /* AD result of measured current */
8     uint32_t counter;   /* A counter value               */
9 } message_t;
10
11 #define CREATE_VOLTAGE(COUNTER) (COUNTER * 0.1) * 33
12 #define CREATE_CURRENT(COUNTER) (COUNTER * 0.1) * 11
13 #define QUEUE_SIZE       16
14 #define QUEUE_PUT_DELAY  100
15
16 /*
17  * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and
18  * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes
19  * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize.
20  */
21 #if defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)
22     #define STACK_SIZE DEFAULT_STACK_SIZE/4
23 #else
24     #define STACK_SIZE DEFAULT_STACK_SIZE
25 #endif
26
27 MemoryPool<message_t, QUEUE_SIZE> mpool;
28 Queue<message_t, QUEUE_SIZE> queue;
29
30 /* Send Thread */
31 void send_thread (void const *argument) {
32     static uint32_t i = 10;
33     while (true) {
34         i++; // Fake data update
35         message_t *message = mpool.alloc();
36         message->voltage = CREATE_VOLTAGE(i);
37         message->current = CREATE_CURRENT(i);
38         message->counter = i;
39         queue.put(message);
40         Thread::wait(QUEUE_PUT_DELAY);
41     }
42 }
43
44 int main (void) {
45     MBED_HOSTTEST_TIMEOUT(20);
46     MBED_HOSTTEST_SELECT(default_auto);
47     MBED_HOSTTEST_DESCRIPTION(Queue messaging);
48     MBED_HOSTTEST_START("RTOS_5");
49
50     Thread thread(send_thread, NULL, osPriorityNormal, STACK_SIZE);
51     bool result = true;
52     int result_counter = 0;
53
54     while (true) {
55         osEvent evt = queue.get();
56         if (evt.status == osEventMessage) {
57             message_t *message = (message_t*)evt.value.p;
58             const float expected_voltage = CREATE_VOLTAGE(message->counter);
59             const float expected_current = CREATE_CURRENT(message->counter);
60             // Check using macros if received values correspond to values sent via queue
61             bool expected_values = (expected_voltage == message->voltage) &&
62                                    (expected_current == message->current);
63             result = result && expected_values;
64             const char *result_msg = expected_values ? "OK" : "FAIL";
65             printf("%3d %.2fV %.2fA ... [%s]\r\n", message->counter,
66                                                    message->voltage,
67                                                    message->current,
68                                                    result_msg);
69             mpool.free(message);
70             if (result == false || ++result_counter == QUEUE_SIZE) {
71                 break;
72             }
73         }
74     }
75     MBED_HOSTTEST_RESULT(result);
76     return 0;
77 }