1 /*
2  * Copyright (c) 2018 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <kernel.h>
8 #include <cmsis_os.h>
9 
10 /**
11  * @brief Create and Initialize Message queue.
12  */
osMessageCreate(const osMessageQDef_t * queue_def,osThreadId thread_id)13 osMessageQId osMessageCreate(const osMessageQDef_t *queue_def,
14 				osThreadId thread_id)
15 {
16 	if (queue_def == NULL) {
17 		return NULL;
18 	}
19 
20 	if (k_is_in_isr()) {
21 		return NULL;
22 	}
23 
24 	k_msgq_init(queue_def->msgq, queue_def->pool,
25 			queue_def->item_sz, queue_def->queue_sz);
26 	return (osMessageQId)(queue_def);
27 }
28 
29 /**
30  * @brief Put a message to a Queue.
31  */
osMessagePut(osMessageQId queue_id,uint32_t info,uint32_t millisec)32 osStatus osMessagePut(osMessageQId queue_id, uint32_t info, uint32_t millisec)
33 {
34 	osMessageQDef_t *queue_def = (osMessageQDef_t *)queue_id;
35 	int retval;
36 
37 	if (queue_def == NULL) {
38 		return osErrorParameter;
39 	}
40 
41 	if (millisec == 0U) {
42 		retval = k_msgq_put(queue_def->msgq, (void *)&info, K_NO_WAIT);
43 	} else if (millisec == osWaitForever) {
44 		retval = k_msgq_put(queue_def->msgq, (void *)&info, K_FOREVER);
45 	} else {
46 		retval = k_msgq_put(queue_def->msgq, (void *)&info,
47 				    K_MSEC(millisec));
48 	}
49 
50 	if (retval == 0) {
51 		return osOK;
52 	} else if (retval == -EAGAIN) {
53 		return osErrorTimeoutResource;
54 	} else {
55 		return osErrorResource;
56 	}
57 }
58 
59 /**
60  * @brief Get a message or Wait for a Message from a Queue.
61  */
osMessageGet(osMessageQId queue_id,uint32_t millisec)62 osEvent osMessageGet(osMessageQId queue_id, uint32_t millisec)
63 {
64 	osMessageQDef_t *queue_def = (osMessageQDef_t *)queue_id;
65 	uint32_t info;
66 	osEvent evt = {0};
67 	int retval;
68 
69 	if (queue_def == NULL) {
70 		evt.status = osErrorParameter;
71 		return evt;
72 	}
73 
74 	if (millisec == 0U) {
75 		retval = k_msgq_get(queue_def->msgq, &info, K_NO_WAIT);
76 	} else if (millisec == osWaitForever) {
77 		retval = k_msgq_get(queue_def->msgq, &info, K_FOREVER);
78 	} else {
79 		retval = k_msgq_get(queue_def->msgq, &info, K_MSEC(millisec));
80 	}
81 
82 	if (retval == 0) {
83 		evt.status = osEventMessage;
84 		evt.value.v = info;
85 	} else if (retval == -EAGAIN) {
86 		evt.status = osEventTimeout;
87 	} else if (retval == -ENOMSG) {
88 		evt.status = osOK;
89 	}
90 
91 	evt.def.message_id = queue_id;
92 
93 	return evt;
94 }
95