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)72UINT _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