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 /** GUIX Component                                                        */
17 /**                                                                       */
18 /**   Radial Slider Management (Slider)                                   */
19 /**                                                                       */
20 /**************************************************************************/
21 
22 #define GX_SOURCE_CODE
23 
24 
25 /* Include necessary system files.  */
26 
27 #include "gx_api.h"
28 #include "gx_radial_slider.h"
29 
30 /**************************************************************************/
31 /*                                                                        */
32 /*  FUNCTION                                               RELEASE        */
33 /*                                                                        */
34 /*    _gx_radial_slider_anchor_angle_calculate            PORTABLE C      */
35 /*                                                           6.1          */
36 /*  AUTHOR                                                                */
37 /*                                                                        */
38 /*    Kenneth Maxwell, Microsoft Corporation                              */
39 /*                                                                        */
40 /*  DESCRIPTION                                                           */
41 /*                                                                        */
42 /*    This service retrieves the nearest anchor angle for the specified   */
43 /*    angle value.                                                        */
44 /*                                                                        */
45 /*  INPUT                                                                 */
46 /*                                                                        */
47 /*    slider                                Radial slider control block   */
48 /*    angle_value                           Angle value whose neareast    */
49 /*                                            anchor angle is calculated  */
50 /*                                                                        */
51 /*  OUTPUT                                                                */
52 /*                                                                        */
53 /*    status                                Completion status             */
54 /*                                                                        */
55 /*  CALLS                                                                 */
56 /*                                                                        */
57 /*    None                                                                */
58 /*                                                                        */
59 /*  CALLED BY                                                             */
60 /*                                                                        */
61 /*    GUIX Internal Code                                                  */
62 /*                                                                        */
63 /*  RELEASE HISTORY                                                       */
64 /*                                                                        */
65 /*    DATE              NAME                      DESCRIPTION             */
66 /*                                                                        */
67 /*  05-19-2020     Kenneth Maxwell          Initial Version 6.0           */
68 /*  09-30-2020     Kenneth Maxwell          Modified comment(s),          */
69 /*                                            resulting in version 6.1    */
70 /*                                                                        */
71 /**************************************************************************/
_gx_radial_slider_anchor_angle_calculate(GX_RADIAL_SLIDER * slider,GX_VALUE * angle_value)72 UINT _gx_radial_slider_anchor_angle_calculate(GX_RADIAL_SLIDER *slider, GX_VALUE *angle_value)
73 {
74 INT                    index;
75 GX_VALUE               min_value;
76 GX_VALUE               max_value;
77 GX_VALUE               neareast_anchor_value;
78 GX_RADIAL_SLIDER_INFO *info = &slider -> gx_radial_slider_info;
79 
80     index = 0;
81 
82     /* Range angle value inside min/max angles. */
83     if (*angle_value <= info->gx_radial_slider_info_min_angle)
84     {
85         neareast_anchor_value = info->gx_radial_slider_info_min_angle;
86     }
87     else if (*angle_value >= info->gx_radial_slider_info_max_angle)
88     {
89         neareast_anchor_value = info->gx_radial_slider_info_max_angle;
90     }
91     else
92     {
93         neareast_anchor_value = *angle_value;
94     }
95 
96     if (info -> gx_radial_slider_info_angle_list)
97     {
98         /* If an angle list is supplied, set the target value to one of the values
99            in angle list that is nearest to the given value. */
100         while (index < info -> gx_radial_slider_info_list_count)
101         {
102             if (index == 0)
103             {
104                 min_value = info -> gx_radial_slider_info_angle_list[index];
105             }
106             else
107             {
108                 min_value = (GX_VALUE)((info -> gx_radial_slider_info_angle_list[index] + info -> gx_radial_slider_info_angle_list[index - 1]) >> 1);
109             }
110 
111             if (index == info -> gx_radial_slider_info_list_count - 1)
112             {
113                 max_value = info -> gx_radial_slider_info_angle_list[index];
114             }
115             else
116             {
117                 max_value = (GX_VALUE)((info -> gx_radial_slider_info_angle_list[index] + info -> gx_radial_slider_info_angle_list[index + 1]) >> 1);
118             }
119 
120             if (min_value > max_value)
121             {
122                 GX_SWAP_VALS(min_value, max_value);
123             }
124 
125             if ((neareast_anchor_value >= min_value) && (neareast_anchor_value <= max_value))
126             {
127                 neareast_anchor_value = info -> gx_radial_slider_info_angle_list[index];
128                 break;
129             }
130 
131             index++;
132         }
133     }
134 
135     (*angle_value) = neareast_anchor_value;
136 
137     return(GX_SUCCESS);
138 }
139 
140