1 /* USER CODE BEGIN Header */
2 /**
3   ******************************************************************************
4   * @file    stm_list.c
5   * @author  MCD Application Team
6   * @brief   TCircular Linked List Implementation.
7   ******************************************************************************
8   * @attention
9   *
10   * Copyright (c) 2024 STMicroelectronics.
11   * All rights reserved.
12   *
13   * This software is licensed under terms that can be found in the LICENSE file
14   * in the root directory of this software component.
15   * If no LICENSE file comes with this software, it is provided AS-IS.
16   *
17   ******************************************************************************
18   */
19 /* USER CODE END Header */
20 
21 /******************************************************************************
22  * Include Files
23  ******************************************************************************/
24 #include "stm_list.h"
25 
26 /******************************************************************************
27  * Function Definitions
28  ******************************************************************************/
LST_init_head(tListNode * listHead)29 void LST_init_head (tListNode * listHead)
30 {
31   listHead->next = listHead;
32   listHead->prev = listHead;
33 }
34 
LST_is_empty(tListNode * listHead)35 uint8_t LST_is_empty (tListNode * listHead)
36 {
37   uint32_t primask_bit;
38   uint8_t return_value;
39 
40   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
41   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
42   if(listHead->next == listHead)
43   {
44     return_value = TRUE;
45   }
46   else
47   {
48     return_value = FALSE;
49   }
50   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
51 
52   return return_value;
53 }
54 
LST_insert_head(tListNode * listHead,tListNode * node)55 void LST_insert_head (tListNode * listHead, tListNode * node)
56 {
57   uint32_t primask_bit;
58 
59   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
60   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
61 
62   node->next = listHead->next;
63   node->prev = listHead;
64   listHead->next = node;
65   (node->next)->prev = node;
66 
67   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
68 }
69 
LST_insert_tail(tListNode * listHead,tListNode * node)70 void LST_insert_tail (tListNode * listHead, tListNode * node)
71 {
72   uint32_t primask_bit;
73 
74   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
75   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
76 
77   node->next = listHead;
78   node->prev = listHead->prev;
79   listHead->prev = node;
80   (node->prev)->next = node;
81 
82   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
83 }
84 
LST_remove_node(tListNode * node)85 void LST_remove_node (tListNode * node)
86 {
87   uint32_t primask_bit;
88 
89   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
90   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
91 
92   (node->prev)->next = node->next;
93   (node->next)->prev = node->prev;
94 
95   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
96 }
97 
LST_remove_head(tListNode * listHead,tListNode ** node)98 void LST_remove_head (tListNode * listHead, tListNode ** node )
99 {
100   uint32_t primask_bit;
101 
102   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
103   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
104 
105   *node = listHead->next;
106   LST_remove_node (listHead->next);
107 
108   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
109 }
110 
LST_remove_tail(tListNode * listHead,tListNode ** node)111 void LST_remove_tail (tListNode * listHead, tListNode ** node )
112 {
113   uint32_t primask_bit;
114 
115   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
116   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
117 
118   *node = listHead->prev;
119   LST_remove_node (listHead->prev);
120 
121   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
122 }
123 
LST_insert_node_after(tListNode * node,tListNode * ref_node)124 void LST_insert_node_after (tListNode * node, tListNode * ref_node)
125 {
126   uint32_t primask_bit;
127 
128   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
129   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
130 
131   node->next = ref_node->next;
132   node->prev = ref_node;
133   ref_node->next = node;
134   (node->next)->prev = node;
135 
136   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
137 }
138 
LST_insert_node_before(tListNode * node,tListNode * ref_node)139 void LST_insert_node_before (tListNode * node, tListNode * ref_node)
140 {
141   uint32_t primask_bit;
142 
143   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
144   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
145 
146   node->next = ref_node;
147   node->prev = ref_node->prev;
148   ref_node->prev = node;
149   (node->prev)->next = node;
150 
151   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
152 }
153 
LST_get_size(tListNode * listHead)154 int LST_get_size (tListNode * listHead)
155 {
156   int size = 0;
157   tListNode * temp;
158   uint32_t primask_bit;
159 
160   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
161   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
162 
163   temp = listHead->next;
164   while (temp != listHead)
165   {
166     size++;
167     temp = temp->next;
168   }
169 
170   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
171 
172   return (size);
173 }
174 
LST_get_next_node(tListNode * ref_node,tListNode ** node)175 void LST_get_next_node (tListNode * ref_node, tListNode ** node)
176 {
177   uint32_t primask_bit;
178 
179   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
180   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
181 
182   *node = ref_node->next;
183 
184   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
185 }
186 
LST_get_prev_node(tListNode * ref_node,tListNode ** node)187 void LST_get_prev_node (tListNode * ref_node, tListNode ** node)
188 {
189   uint32_t primask_bit;
190 
191   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
192   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
193 
194   *node = ref_node->prev;
195 
196   __set_PRIMASK(primask_bit);      /**< Restore PRIMASK bit*/
197 }
198