1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 
12 /**************************************************************************/
13 /**************************************************************************/
14 /**                                                                       */
15 /** GUIX Component                                                        */
16 /**                                                                       */
17 /**   System Management (System)                                          */
18 /**                                                                       */
19 /**************************************************************************/
20 
21 #define GX_SOURCE_CODE
22 
23 
24 /* Include necessary system files.  */
25 
26 #include "gx_api.h"
27 #include "gx_system.h"
28 
29 
30 /**************************************************************************/
31 /*                                                                        */
32 /*  FUNCTION                                               RELEASE        */
33 /*                                                                        */
34 /*    _gx_system_timer_start                              PORTABLE C      */
35 /*                                                           6.1.7        */
36 /*  AUTHOR                                                                */
37 /*                                                                        */
38 /*    Kenneth Maxwell, Microsoft Corporation                              */
39 /*                                                                        */
40 /*  DESCRIPTION                                                           */
41 /*                                                                        */
42 /*    This service starts a timer for the specified widget.               */
43 /*                                                                        */
44 /*  INPUT                                                                 */
45 /*                                                                        */
46 /*    owner                                 Pointer to widget control     */
47 /*                                            block                       */
48 /*    timer_id                              ID of timer                   */
49 /*    initial ticks                         Initial expiration ticks      */
50 /*    reschedule_ticks                      Periodic expiration ticks     */
51 /*                                                                        */
52 /*  OUTPUT                                                                */
53 /*                                                                        */
54 /*    status                                Completion status             */
55 /*                                                                        */
56 /*  CALLS                                                                 */
57 /*                                                                        */
58 /*   tx_timer_activate                      start the ThreadX timer       */
59 /*   _gx_system_lock                        lock system mutex             */
60 /*   _gx_system_unlock                      unlock system mutex           */
61 /*                                                                        */
62 /*  CALLED BY                                                             */
63 /*                                                                        */
64 /*    GUIX Application                                                    */
65 /*    GUIX Internal Code                                                  */
66 /*                                                                        */
67 /*  RELEASE HISTORY                                                       */
68 /*                                                                        */
69 /*    DATE              NAME                      DESCRIPTION             */
70 /*                                                                        */
71 /*  05-19-2020     Kenneth Maxwell          Initial Version 6.0           */
72 /*  09-30-2020     Kenneth Maxwell          Modified comment(s),          */
73 /*                                            resulting in version 6.1    */
74 /*  12-31-2020     Kenneth Maxwell          Modified comment(s),          */
75 /*                                            added GX_DISABLE_THREADX_   */
76 /*                                            TIMER_SOURCE configuration, */
77 /*                                            resulting in version 6.1.3  */
78 /*  06-02-2021     Ting Zhu                 Modified comment(s),          */
79 /*                                            fixed compile warning when  */
80 /*                                            ThreadX timer is disabled,  */
81 /*                                            resulting in version 6.1.7  */
82 /*                                                                        */
83 /**************************************************************************/
_gx_system_timer_start(GX_WIDGET * owner,UINT timer_id,UINT initial_ticks,UINT reschedule_ticks)84 UINT  _gx_system_timer_start(GX_WIDGET *owner, UINT timer_id, UINT initial_ticks, UINT reschedule_ticks)
85 {
86 GX_TIMER *found;
87 
88 #ifdef GX_THREADX_BINDING
89 #ifndef GX_DISABLE_THREADX_TIMER_SOURCE
90 UINT tx_timer_active;
91 #endif
92 #endif
93 
94     /* check for bad widget pointer */
95     if (!owner)
96     {
97         return GX_PTR_ERROR;
98     }
99 
100     /* lock entering critical section */
101     GX_ENTER_CRITICAL
102 
103     /* check for already having this timer */
104     found = _gx_system_active_timer_list;
105 
106     while (found)
107     {
108         if (found -> gx_timer_id == timer_id &&
109             found -> gx_timer_owner == owner)
110         {
111             /* yes, this timer is already running */
112             /* reset the existing timer value and return */
113             found -> gx_timer_initial_ticks = initial_ticks;
114             found -> gx_timer_reschedule_ticks = reschedule_ticks;
115             GX_EXIT_CRITICAL
116             return GX_SUCCESS;
117         }
118         found = found -> gx_timer_next;
119     }
120 
121     /* check for having timer available */
122     if (!_gx_system_free_timer_list)
123     {
124         /* no timers available, unlock and return error */
125         GX_EXIT_CRITICAL
126         return GX_OUT_OF_TIMERS;
127     }
128 
129     /* we have a free timer, remove from free list */
130     found = _gx_system_free_timer_list;
131     _gx_system_free_timer_list = found -> gx_timer_next;
132 
133     /* initialize new timer */
134     found -> gx_timer_initial_ticks = initial_ticks;
135     found -> gx_timer_reschedule_ticks = reschedule_ticks;
136     found -> gx_timer_id = timer_id;
137     found -> gx_timer_owner = owner;
138 
139     /* link this timer at the head of the active list */
140     found -> gx_timer_next = _gx_system_active_timer_list;
141     _gx_system_active_timer_list = found;
142 
143 #ifdef GX_THREADX_BINDING
144 #ifndef GX_DISABLE_THREADX_TIMER_SOURCE
145     /* if the low-level timer is not active, start it */
146     tx_timer_info_get(&_gx_system_timer, (CHAR **)TX_NULL, &tx_timer_active,
147                       (ULONG *)TX_NULL, (ULONG *)TX_NULL, (TX_TIMER **)TX_NULL);
148 
149     if (!tx_timer_active)
150     {
151         tx_timer_activate(&_gx_system_timer);
152     }
153 #endif
154 #else
155     GX_TIMER_START;
156 #endif
157 
158     /* release our lock */
159     GX_EXIT_CRITICAL
160     return GX_SUCCESS;
161 }
162 
163