1 /**************************************************************************/
2 /* */
3 /* Copyright (c) Microsoft Corporation. All rights reserved. */
4 /* */
5 /* This software is licensed under the Microsoft Software License */
6 /* Terms for Microsoft Azure RTOS. Full text of the license can be */
7 /* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
8 /* and in the root directory of this software. */
9 /* */
10 /**************************************************************************/
11
12
13 /**************************************************************************/
14 /**************************************************************************/
15 /** */
16 /** ThreadX Component */
17 /** */
18 /** Module Manager */
19 /** */
20 /**************************************************************************/
21 /**************************************************************************/
22
23 #define TX_SOURCE_CODE
24
25 #include "tx_api.h"
26 #include "tx_queue.h"
27 #include "tx_thread.h"
28 #include "txm_module.h"
29
30
31 /**************************************************************************/
32 /* */
33 /* FUNCTION RELEASE */
34 /* */
35 /* _txm_module_manager_callback_request PORTABLE C */
36 /* 6.1 */
37 /* AUTHOR */
38 /* */
39 /* Scott Larson, Microsoft Corporation */
40 /* */
41 /* DESCRIPTION */
42 /* */
43 /* This function sends a notification callback function request to */
44 /* the associated module. */
45 /* */
46 /* INPUT */
47 /* */
48 /* module_callback_queue Module callback request queue */
49 /* callback_request Callback request */
50 /* */
51 /* OUTPUT */
52 /* */
53 /* None */
54 /* */
55 /* CALLS */
56 /* */
57 /* tx_queue_send Send module callback request */
58 /* */
59 /* CALLED BY */
60 /* */
61 /* ThreadX */
62 /* */
63 /* RELEASE HISTORY */
64 /* */
65 /* DATE NAME DESCRIPTION */
66 /* */
67 /* 09-30-2020 Scott Larson Initial Version 6.1 */
68 /* */
69 /**************************************************************************/
_txm_module_manager_callback_request(TX_QUEUE * module_callback_queue,TXM_MODULE_CALLBACK_MESSAGE * callback_message)70 VOID _txm_module_manager_callback_request(TX_QUEUE *module_callback_queue, TXM_MODULE_CALLBACK_MESSAGE *callback_message)
71 {
72
73 TX_INTERRUPT_SAVE_AREA
74
75 TXM_MODULE_CALLBACK_MESSAGE *queued_message;
76 UINT enqueued;
77 UINT found;
78 UINT status;
79
80
81 /* Lockout interrupts. */
82 TX_DISABLE
83
84 /* Determine if the queue is valid. */
85 if ((module_callback_queue) && (module_callback_queue -> tx_queue_id == TX_QUEUE_ID))
86 {
87
88 /* Yes, the queue is valid. */
89
90 /* Pickup the current callback request in the queue. */
91 queued_message = (TXM_MODULE_CALLBACK_MESSAGE *) module_callback_queue -> tx_queue_read;
92
93 /* Pickup the number of items enqueued. */
94 enqueued = module_callback_queue -> tx_queue_enqueued;
95
96 /* Set the found flag to false. */
97 found = TX_FALSE;
98
99 /* Loop to look for duplicates in the queue. */
100 while (enqueued != 0)
101 {
102
103 /* Does this entry match the new callback message? */
104 if ((queued_message -> txm_module_callback_message_application_function == callback_message -> txm_module_callback_message_application_function) &&
105 (queued_message -> txm_module_callback_message_param_1 == callback_message -> txm_module_callback_message_param_1) &&
106 (queued_message -> txm_module_callback_message_param_2 == callback_message -> txm_module_callback_message_param_2) &&
107 (queued_message -> txm_module_callback_message_param_3 == callback_message -> txm_module_callback_message_param_3) &&
108 (queued_message -> txm_module_callback_message_param_4 == callback_message -> txm_module_callback_message_param_4) &&
109 (queued_message -> txm_module_callback_message_param_5 == callback_message -> txm_module_callback_message_param_5) &&
110 (queued_message -> txm_module_callback_message_param_6 == callback_message -> txm_module_callback_message_param_6) &&
111 (queued_message -> txm_module_callback_message_param_7 == callback_message -> txm_module_callback_message_param_7) &&
112 (queued_message -> txm_module_callback_message_param_8 == callback_message -> txm_module_callback_message_param_8) &&
113 (queued_message -> txm_module_callback_message_reserved1 == callback_message -> txm_module_callback_message_reserved1) &&
114 (queued_message -> txm_module_callback_message_reserved2 == callback_message -> txm_module_callback_message_reserved2))
115 {
116
117 /* Update the activation count in the queued request. */
118 queued_message -> txm_module_callback_message_activation_count++;
119
120 /* Set the found flag to true. */
121 found = TX_TRUE;
122
123 /* Get out of the loop. */
124 break;
125 }
126
127 /* Decrease the number of messages to examine. */
128 enqueued--;
129
130 /* Move the callback message to the next message. */
131 queued_message++;
132
133 /* Check for wrap? */
134 if (((ULONG *) queued_message) >= module_callback_queue -> tx_queue_end)
135 {
136
137 /* Yes, set the queued message to the beginning of the queue. */
138 queued_message = (TXM_MODULE_CALLBACK_MESSAGE *) module_callback_queue -> tx_queue_start;
139 }
140 }
141
142 /* Restore interrupts. */
143 TX_RESTORE
144
145 /* Determine if we need to send the new callback request. */
146 if (found == TX_FALSE)
147 {
148
149 /* Yes, send the message. */
150 status = _tx_queue_send(module_callback_queue, (VOID *) callback_message, TX_NO_WAIT);
151
152 /* Determine if an error was detected. */
153 if (status != TX_SUCCESS)
154 {
155
156 /* Error, increment the error counter and return. */
157 _txm_module_manager_callback_error_count++;
158 }
159 }
160
161 /* Increment the total number of callbacks. */
162 _txm_module_manager_callback_total_count++;
163 }
164 else
165 {
166
167 /* Module instance is not valid. */
168
169 /* Error, increment the error counter and return. */
170 _txm_module_manager_callback_error_count++;
171
172 /* Restore interrupts. */
173 TX_RESTORE
174 }
175 }
176
177