diff options
Diffstat (limited to 'src/libs/lvgl/src/lv_objx/lv_sw.c')
-rw-r--r-- | src/libs/lvgl/src/lv_objx/lv_sw.c | 403 |
1 files changed, 0 insertions, 403 deletions
diff --git a/src/libs/lvgl/src/lv_objx/lv_sw.c b/src/libs/lvgl/src/lv_objx/lv_sw.c deleted file mode 100644 index 428a4af1..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_sw.c +++ /dev/null @@ -1,403 +0,0 @@ -/** - * @file lv_sw.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_sw.h" - -#if LV_USE_SW != 0 - -/*Testing of dependencies*/ -#if LV_USE_SLIDER == 0 -#error "lv_sw: lv_slider is required. Enable it in lv_conf.h (LV_USE_SLIDER 1) " -#endif - -#include "../lv_core/lv_debug.h" -#include "../lv_themes/lv_theme.h" -#include "../lv_misc/lv_math.h" -#include "../lv_core/lv_indev.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_sw" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a switch objects - * @param par pointer to an object, it will be the parent of the new switch - * @param copy pointer to a switch object, if not NULL then the new object will be copied from it - * @return pointer to the created switch - */ -lv_obj_t * lv_sw_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("switch create started"); - - /*Create the ancestor of switch*/ - lv_obj_t * new_sw = lv_slider_create(par, copy); - LV_ASSERT_MEM(new_sw); - if(new_sw == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_sw); - - /*Allocate the switch type specific extended data*/ - lv_sw_ext_t * ext = lv_obj_allocate_ext_attr(new_sw, sizeof(lv_sw_ext_t)); - LV_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - /*Initialize the allocated 'ext' */ - ext->changed = 0; -#if LV_USE_ANIMATION - ext->anim_time = 0; -#endif - ext->style_knob_off = ext->slider.style_knob; - ext->style_knob_on = ext->slider.style_knob; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_sw, lv_sw_signal); - - /*Init the new switch switch*/ - if(copy == NULL) { - lv_obj_set_size(new_sw, 2 * LV_DPI / 3, LV_DPI / 3); - lv_slider_set_knob_in(new_sw, true); - lv_slider_set_range(new_sw, 0, LV_SW_MAX_VALUE); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_sw_set_style(new_sw, LV_SW_STYLE_BG, th->style.sw.bg); - lv_sw_set_style(new_sw, LV_SW_STYLE_INDIC, th->style.sw.indic); - lv_sw_set_style(new_sw, LV_SW_STYLE_KNOB_OFF, th->style.sw.knob_off); - lv_sw_set_style(new_sw, LV_SW_STYLE_KNOB_ON, th->style.sw.knob_on); - } else { - /*Let the slider' style*/ - } - - } - /*Copy an existing switch*/ - else { - lv_sw_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->style_knob_off = copy_ext->style_knob_off; - ext->style_knob_on = copy_ext->style_knob_on; -#if LV_USE_ANIMATION - ext->anim_time = copy_ext->anim_time; -#endif - - if(lv_sw_get_state(new_sw)) - lv_slider_set_style(new_sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on); - else - lv_slider_set_style(new_sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_sw); - } - - LV_LOG_INFO("switch created"); - - return new_sw; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Turn ON the switch - * @param sw pointer to a switch objec - * @param anim LV_ANOM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_sw_on(lv_obj_t * sw, lv_anim_enable_t anim) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - -#if LV_USE_ANIMATION == 0 - anim = LV_ANIM_OFF; -#endif - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - lv_slider_set_value(sw, LV_SW_MAX_VALUE, anim); - lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on); -} - -/** - * Turn OFF the switch - * @param sw pointer to a switch object - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_sw_off(lv_obj_t * sw, lv_anim_enable_t anim) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - -#if LV_USE_ANIMATION == 0 - anim = LV_ANIM_OFF; -#endif - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - lv_slider_set_value(sw, 0, anim); - lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off); -} - -/** - * Toggle the position of the switch - * @param sw pointer to a switch object - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - * @return resulting state of the switch. - */ -bool lv_sw_toggle(lv_obj_t * sw, lv_anim_enable_t anim) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - -#if LV_USE_ANIMATION == 0 - anim = LV_ANIM_OFF; -#endif - - bool state = lv_sw_get_state(sw); - if(state) - lv_sw_off(sw, anim); - else - lv_sw_on(sw, anim); - - return !state; -} - -/** - * Set a style of a switch - * @param sw pointer to a switch object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_sw_set_style(lv_obj_t * sw, lv_sw_style_t type, const lv_style_t * style) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - - switch(type) { - case LV_SLIDER_STYLE_BG: lv_slider_set_style(sw, LV_SLIDER_STYLE_BG, style); break; - case LV_SLIDER_STYLE_INDIC: lv_bar_set_style(sw, LV_SLIDER_STYLE_INDIC, style); break; - case LV_SW_STYLE_KNOB_OFF: - ext->style_knob_off = style; - if(lv_sw_get_state(sw) == 0) lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, style); - break; - case LV_SW_STYLE_KNOB_ON: - ext->style_knob_on = style; - if(lv_sw_get_state(sw) != 0) lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, style); - break; - } -} - -void lv_sw_set_anim_time(lv_obj_t * sw, uint16_t anim_time) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - -#if LV_USE_ANIMATION - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - ext->anim_time = anim_time; -#else - (void)sw; - (void)anim_time; -#endif -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get a style of a switch - * @param sw pointer to a switch object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_sw_get_style(const lv_obj_t * sw, lv_sw_style_t type) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - - const lv_style_t * style = NULL; - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - - switch(type) { - case LV_SW_STYLE_BG: style = lv_slider_get_style(sw, LV_SLIDER_STYLE_BG); break; - case LV_SW_STYLE_INDIC: style = lv_slider_get_style(sw, LV_SLIDER_STYLE_INDIC); break; - case LV_SW_STYLE_KNOB_OFF: style = ext->style_knob_off; break; - case LV_SW_STYLE_KNOB_ON: style = ext->style_knob_on; break; - default: style = NULL; break; - } - - return style; -} - -uint16_t lv_sw_get_anim_time(const lv_obj_t * sw) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - -#if LV_USE_ANIMATION - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - return ext->anim_time; -#else - (void)sw; /*Unused*/ - return 0; -#endif -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the switch - * @param sw pointer to a switch object - * @param sign a signal type from lv_signal_t enum - * @param param pointer to a signal specific variable - * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted - */ -static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param) -{ - lv_res_t res; - if(sign == LV_SIGNAL_GET_TYPE) { - res = ancestor_signal(sw, sign, param); - if(res != LV_RES_OK) return res; - return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); - } - - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - - /*Save the current (old) value before slider signal modifies it. It will be required in the - * later calculations*/ - int16_t old_val; - if(sign == LV_SIGNAL_PRESSING) - old_val = ext->slider.drag_value; - else - old_val = lv_slider_get_value(sw); - - /*Don't let the slider to call the action. Switch handles it differently*/ - lv_event_cb_t event_cb = sw->event_cb; - sw->event_cb = NULL; - - /* Include the ancient signal function */ - res = ancestor_signal(sw, sign, param); - if(res != LV_RES_OK) return res; - - sw->event_cb = event_cb; - - if(sign == LV_SIGNAL_CLEANUP) { - /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } else if(sign == LV_SIGNAL_PRESSED) { - - /*Save the x coordinate of the pressed point to see if the switch was slid*/ - lv_indev_t * indev = lv_indev_get_act(); - if(indev) { - lv_point_t p; - lv_indev_get_point(indev, &p); - ext->start_x = p.x; - } - ext->slided = 0; - ext->changed = 0; - } else if(sign == LV_SIGNAL_PRESSING) { - /*See if the switch was slid (moved at least a little)*/ - lv_indev_t * indev = lv_indev_get_act(); - if(indev) { - lv_point_t p = {0, 0}; - lv_indev_get_point(indev, &p); - if(LV_MATH_ABS(p.x - ext->start_x) > LV_INDEV_DEF_DRAG_LIMIT) ext->slided = 1; - } - - /*If didn't slide then revert the min/max value. So click without slide won't move the - * switch as a slider*/ - if(ext->slided == 0) { - if(lv_sw_get_state(sw)) - ext->slider.drag_value = LV_SW_MAX_VALUE; - else - ext->slider.drag_value = 0; - } - - /*If explicitly changed (by slide) don't need to be toggled on release*/ - int16_t threshold = LV_SW_MAX_VALUE / 2; - if((old_val < threshold && ext->slider.drag_value > threshold) || - (old_val > threshold && ext->slider.drag_value < threshold)) { - ext->changed = 1; - } - } else if(sign == LV_SIGNAL_PRESS_LOST) { - if(lv_sw_get_state(sw)) { - lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on); - lv_slider_set_value(sw, LV_SW_MAX_VALUE, LV_ANIM_ON); - if(res != LV_RES_OK) return res; - } else { - lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off); - lv_slider_set_value(sw, 0, LV_ANIM_ON); - if(res != LV_RES_OK) return res; - } - } else if(sign == LV_SIGNAL_RELEASED) { - /*If not dragged then toggle the switch*/ - if(ext->changed == 0) { - int32_t state; - if(lv_sw_get_state(sw)) { - lv_sw_off(sw, LV_ANIM_ON); - state = 0; - } else { - lv_sw_on(sw, LV_ANIM_ON); - state = 1; - } - - res = lv_event_send(sw, LV_EVENT_VALUE_CHANGED, &state); - if(res != LV_RES_OK) return res; - } - /*If the switch was dragged then calculate the new state based on the current position*/ - else { - int16_t v = lv_slider_get_value(sw); - int32_t state; - if(v > LV_SW_MAX_VALUE / 2) { - lv_sw_on(sw, LV_ANIM_ON); - state = 1; - } else { - lv_sw_off(sw, LV_ANIM_ON); - state = 0; - } - res = lv_event_send(sw, LV_EVENT_VALUE_CHANGED, &state); - if(res != LV_RES_OK) return res; - } - } else if(sign == LV_SIGNAL_CONTROL) { - char c = *((char *)param); - uint32_t state; - if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - lv_slider_set_value(sw, LV_SW_MAX_VALUE, true); - state = 1; - res = lv_event_send(sw, LV_EVENT_VALUE_CHANGED, &state); - if(res != LV_RES_OK) return res; - } else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - lv_slider_set_value(sw, 0, true); - state = 0; - res = lv_event_send(sw, LV_EVENT_VALUE_CHANGED, &state); - if(res != LV_RES_OK) return res; - } - } else if(sign == LV_SIGNAL_GET_EDITABLE) { - bool * editable = (bool *)param; - *editable = false; /*The ancestor slider is editable the switch is not*/ - } - - return res; -} - -#endif |