diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-11-12 19:14:09 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-11-12 19:14:09 +1100 |
| commit | 8a0a167adbf3d9b6f8b6f16aaf20ca39ad5549de (patch) | |
| tree | 02b6cf23f591915747ec2994381854a79979c4a0 /lib/luavgl/simulator/widgets/lv_pointer.c | |
| parent | 8471046a95ab9e00f7d42b56dbbc9ce3e5b424b9 (diff) | |
| download | tangara-fw-8a0a167adbf3d9b6f8b6f16aaf20ca39ad5549de.tar.gz | |
Convert the main menu screen to lua lol
Diffstat (limited to 'lib/luavgl/simulator/widgets/lv_pointer.c')
| -rw-r--r-- | lib/luavgl/simulator/widgets/lv_pointer.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/lib/luavgl/simulator/widgets/lv_pointer.c b/lib/luavgl/simulator/widgets/lv_pointer.c new file mode 100644 index 00000000..5fe8a103 --- /dev/null +++ b/lib/luavgl/simulator/widgets/lv_pointer.c @@ -0,0 +1,138 @@ +/********************* + * INCLUDES + *********************/ +#include "lv_pointer.h" + +#if LV_USE_POINTER + +/********************* + * DEFINES + *********************/ +#define MY_CLASS &lv_pointer_class + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_pointer_constructor(const lv_obj_class_t* class_p, + lv_obj_t* obj); +static void angle_update(lv_obj_t* obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_pointer_class = { + .constructor_cb = lv_pointer_constructor, + .instance_size = sizeof(lv_pointer_t), + .base_class = &lv_img_class, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t* lv_pointer_create(lv_obj_t* parent) +{ + lv_obj_t* obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + + /* pointer can rotate out of parent's area. */ + lv_obj_add_flag(parent, LV_OBJ_FLAG_OVERFLOW_VISIBLE); + return obj; +} + +void lv_pointer_set_value(lv_obj_t* obj, int value) +{ + lv_pointer_t* pointer = (lv_pointer_t*)obj; + if (pointer->value == value) { + return; + } + + pointer->value = value; + angle_update(obj); +} + +void lv_pointer_set_range(lv_obj_t* obj, int value_start, int value_range, + int angle_start, int angle_range) +{ + lv_pointer_t* pointer = (lv_pointer_t*)obj; + pointer->value_start = value_start; + pointer->value_range = value_range; + pointer->angle_start = angle_start; + pointer->angle_range = angle_range; + + /* update angle */ + angle_update(obj); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_pointer_constructor(const lv_obj_class_t* class_p, + lv_obj_t* obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + lv_pointer_t* pointer = (lv_pointer_t*)obj; + + /* set default range parameters */ + pointer->angle_start = 0; + pointer->angle_range = 360 * 10; + pointer->value_start = 0; + pointer->value_range = 100; + LV_TRACE_OBJ_CREATE("finished"); +} + +static void angle_update(lv_obj_t* obj) +{ + lv_pointer_t* pointer = (lv_pointer_t*)obj; + int angle = 0; + int value = pointer->value; + int value_start = pointer->value_start; + int value_range = pointer->value_range; + int angle_start = pointer->angle_start; + int angle_range = pointer->angle_range; + + if (value_range != 0) { + /* Check value overflow, overwrite angle if so. */ + int delta = value - value_start; + angle = angle_start; + angle += (delta * angle_range) / value_range; + + /* check overflow */ + if (value_range > 0) { + if (delta > value_range) + angle = angle_start + angle_range; + else if (value < value_start) + angle = angle_start; + } else { /* case of value_range < 0 */ + if (delta < value_range) + angle = angle_start + angle_range; + else if (value > value_start) + angle = angle_start; + } + + while (angle >= 3600) + angle -= 3600; + while (angle < 0) + angle += 3600; + } + + if (angle == lv_img_get_angle(obj)) { + /* not changed */ + return; + } + + lv_img_set_angle(obj, angle); +} + +#endif |
