BigW Consortium Gitlab

Commit b2f72d3f by Gabor Kiss-Vamosi

LV_INDEV_TYPE_BUTTON added

parent a676590e
...@@ -30,9 +30,11 @@ ...@@ -30,9 +30,11 @@
#if LV_INDEV_READ_PERIOD != 0 #if LV_INDEV_READ_PERIOD != 0
static void indev_proc_task(void * param); static void indev_proc_task(void * param);
static void indev_proc_point(lv_indev_proc_t * indev); static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data);
static void indev_proc_press(lv_indev_proc_t * info); static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data);
static void indev_proc_release(lv_indev_proc_t * state); static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data);
static void indev_proc_press(lv_indev_proc_t * proc);
static void indev_proc_release(lv_indev_proc_t * proc);
static lv_obj_t * indev_search_obj(const lv_indev_proc_t * indev, lv_obj_t * obj); static lv_obj_t * indev_search_obj(const lv_indev_proc_t * indev, lv_obj_t * obj);
static void indev_drag(lv_indev_proc_t * state); static void indev_drag(lv_indev_proc_t * state);
static void indev_drag_throw(lv_indev_proc_t * state); static void indev_drag_throw(lv_indev_proc_t * state);
...@@ -115,13 +117,13 @@ void lv_indev_enable(lv_hal_indev_type_t type, bool enable) ...@@ -115,13 +117,13 @@ void lv_indev_enable(lv_hal_indev_type_t type, bool enable)
} }
/** /**
* Set a cursor for a pointer input device * Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON)
* @param indev pointer to an input device (type: 'LV_INDEV_TYPE_POINTER') * @param indev pointer to an input device
* @param cur_obj pointer to an object to be used as cursor * @param cur_obj pointer to an object to be used as cursor
*/ */
void lv_indev_set_cursor(lv_indev_t *indev, lv_obj_t *cur_obj) void lv_indev_set_cursor(lv_indev_t *indev, lv_obj_t *cur_obj)
{ {
if(indev->driver.type != LV_INDEV_TYPE_POINTER) return; if(indev->driver.type != LV_INDEV_TYPE_POINTER && indev->driver.type != LV_INDEV_TYPE_BUTTON) return;
indev->cursor = cur_obj; indev->cursor = cur_obj;
lv_obj_set_parent(indev->cursor, lv_layer_sys()); lv_obj_set_parent(indev->cursor, lv_layer_sys());
...@@ -130,47 +132,69 @@ void lv_indev_set_cursor(lv_indev_t *indev, lv_obj_t *cur_obj) ...@@ -130,47 +132,69 @@ void lv_indev_set_cursor(lv_indev_t *indev, lv_obj_t *cur_obj)
#if USE_LV_GROUP #if USE_LV_GROUP
/** /**
* Set a destination group for a keypad input device * Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD)
* @param indev pointer to an input device (type: 'LV_INDEV_TYPE_KEYPAD') * @param indev pointer to an input device
* @param group point to a group * @param group point to a group
*/ */
void lv_indev_set_group(lv_indev_t *indev, lv_group_t *group) void lv_indev_set_group(lv_indev_t *indev, lv_group_t *group)
{ {
indev->group = group; if(indev->driver.type == LV_INDEV_TYPE_KEYPAD) indev->group = group;
} }
#endif #endif
/** /**
* Get the last point of an input device * Set the an array of points for LV_INDEV_TYPE_BUTTON.
* These points will be assigned to the buttons to press a specific point on the screen
* @param indev pointer to an input device
* @param group point to a group
*/
void lv_indev_set_button_points(lv_indev_t *indev, lv_point_t *points)
{
if(indev->driver.type == LV_INDEV_TYPE_BUTTON) indev->btn_points = points;
}
/**
* Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
* @param indev pointer to an input device * @param indev pointer to an input device
* @param point pointer to a point to store the result * @param point pointer to a point to store the result
*/ */
void lv_indev_get_point(lv_indev_t * indev, lv_point_t * point) void lv_indev_get_point(lv_indev_t * indev, lv_point_t * point)
{ {
if(indev->driver.type != LV_INDEV_TYPE_POINTER && indev->driver.type != LV_INDEV_TYPE_BUTTON) {
point->x = 0;
point->y = 0;
} else {
point->x = indev->proc.act_point.x; point->x = indev->proc.act_point.x;
point->y = indev->proc.act_point.y; point->y = indev->proc.act_point.y;
}
} }
/** /**
* Check if there is dragging with an input device or not * Check if there is dragging with an input device or not (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
* @param indev pointer to an input device * @param indev pointer to an input device
* @return true: drag is in progress * @return true: drag is in progress
*/ */
bool lv_indev_is_dragging(lv_indev_t * indev) bool lv_indev_is_dragging(lv_indev_t * indev)
{ {
if(indev == NULL) return false; if(indev == NULL) return false;
if(indev->driver.type != LV_INDEV_TYPE_POINTER && indev->driver.type != LV_INDEV_TYPE_BUTTON) return false;
return indev->proc.drag_in_prog == 0 ? false : true; return indev->proc.drag_in_prog == 0 ? false : true;
} }
/** /**
* Get the vector of dragging of an input device * Get the vector of dragging of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
* @param indev pointer to an input device * @param indev pointer to an input device
* @param point pointer to a point to store the vector * @param point pointer to a point to store the vector
*/ */
void lv_indev_get_vect(lv_indev_t * indev, lv_point_t * point) void lv_indev_get_vect(lv_indev_t * indev, lv_point_t * point)
{ {
if(indev->driver.type != LV_INDEV_TYPE_POINTER && indev->driver.type != LV_INDEV_TYPE_BUTTON) {
point->x = 0;
point->y = 0;
} else {
point->x = indev->proc.vect.x; point->x = indev->proc.vect.x;
point->y = indev->proc.vect.y; point->y = indev->proc.vect.y;
}
} }
/** /**
...@@ -248,41 +272,16 @@ static void indev_proc_task(void * param) ...@@ -248,41 +272,16 @@ static void indev_proc_task(void * param)
i->last_activity_time = lv_tick_get(); i->last_activity_time = lv_tick_get();
} }
/*Move the cursor if set and moved*/ if(i->driver.type == LV_INDEV_TYPE_POINTER) {
if(i->driver.type == LV_INDEV_TYPE_POINTER && indev_pointer_proc(i,&data);
i->cursor != NULL &&
(i->proc.last_point.x != data.point.x ||
i->proc.last_point.y != data.point.y))
{
lv_obj_set_pos(i->cursor, data.point.x, data.point.y);
}
if(i->driver.type == LV_INDEV_TYPE_POINTER)
{
i->proc.act_point.x = data.point.x;
i->proc.act_point.y = data.point.y;;
/*Process the current point*/
indev_proc_point(&i->proc);
}
else if (i->driver.type == LV_INDEV_TYPE_KEYPAD) {
#if USE_LV_GROUP
if(i->group != NULL && data.key != 0 &&
data.state == LV_INDEV_STATE_PR && i->proc.last_state == LV_INDEV_STATE_REL)
{
if(data.key == LV_GROUP_KEY_NEXT) {
lv_group_focus_next(i->group);
}
else if(data.key == LV_GROUP_KEY_PREV) {
lv_group_focus_prev(i->group);
}
else {
lv_group_send_data(i->group, data.key);
} }
else if(i->driver.type == LV_INDEV_TYPE_KEYPAD) {
indev_keypad_proc(i, &data);
} }
i->proc.last_state = data.state; else if(i->driver.type == LV_INDEV_TYPE_BUTTON) {
#endif indev_button_proc(i, &data);
} }
} }
/*Handle reset query if it happened in during processing*/ /*Handle reset query if it happened in during processing*/
...@@ -305,52 +304,120 @@ static void indev_proc_task(void * param) ...@@ -305,52 +304,120 @@ static void indev_proc_task(void * param)
indev_act = NULL; /*End of indev processing, so no act indev*/ indev_act = NULL; /*End of indev processing, so no act indev*/
} }
/** /**
* Process new points from a input device. indev->state.pressed has to be set * Process a new point from LV_INDEV_TYPE_POINTER input device
* @param indev pointer to an input device state * @param i pointer to an input device
* @param x x coordinate of the next point * @param data pointer to the data read from the input device
* @param y y coordinate of the next point
*/ */
static void indev_proc_point(lv_indev_proc_t * indev) static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data)
{ {
if(indev->state == LV_INDEV_STATE_PR){ /*Move the cursor if set and moved*/
if(i->cursor != NULL &&
(i->proc.last_point.x != data->point.x ||
i->proc.last_point.y != data->point.y))
{
lv_obj_set_pos(i->cursor, data->point.x, data->point.y);
}
i->proc.act_point.x = data->point.x;
i->proc.act_point.y = data->point.y;
if(i->proc.state == LV_INDEV_STATE_PR){
#if LV_INDEV_POINT_MARKER != 0
lv_area_t area;
area.x1 = i->proc.act_point.x - (LV_INDEV_POINT_MARKER >> 1);
area.y1 = i->proc.act_point.y - (LV_INDEV_POINT_MARKER >> 1);
area.x2 = i->proc.act_point.x + ((LV_INDEV_POINT_MARKER >> 1) | 0x1);
area.y2 = i->proc.act_point.y + ((LV_INDEV_POINT_MARKER >> 1) | 0x1);
lv_rfill(&area, NULL, LV_COLOR_MAKE(0xFF, 0, 0), LV_OPA_COVER);
#endif
indev_proc_press(&i->proc);
} else {
indev_proc_release(&i->proc);
}
i->proc.last_point.x = i->proc.act_point.x;
i->proc.last_point.y = i->proc.act_point.y;
}
/**
* Process a new point from LV_INDEV_TYPE_KEYPAD input device
* @param i pointer to an input device
* @param data pointer to the data read from the input device
*/
static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
{
#if USE_LV_GROUP
if(i->group != NULL && data->key != 0 &&
data->state == LV_INDEV_STATE_PR && i->proc.last_state == LV_INDEV_STATE_REL)
{
if(data->key == LV_GROUP_KEY_NEXT) {
lv_group_focus_next(i->group);
}
else if(data->key == LV_GROUP_KEY_PREV) {
lv_group_focus_prev(i->group);
}
else {
lv_group_send_data(i->group, data->key);
}
}
i->proc.last_state = data->state;
#endif
}
/**
* Process a new point from LV_INDEV_TYPE_BUTTON input device
* @param i pointer to an input device
* @param data pointer to the data read from the input device
*/
static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data)
{
i->proc.act_point.x = i->btn_points[data->btn].x;
i->proc.act_point.y = i->btn_points[data->btn].y;
/*Still the same point is pressed*/
if(i->proc.last_point.x == i->proc.act_point.x &&
i->proc.last_point.y == i->proc.act_point.y &&
data->state == LV_INDEV_STATE_PR) {
#if LV_INDEV_POINT_MARKER != 0 #if LV_INDEV_POINT_MARKER != 0
lv_area_t area; lv_area_t area;
area.x1 = indev->act_point.x - (LV_INDEV_POINT_MARKER >> 1); area.x1 = i->proc.act_point.x - (LV_INDEV_POINT_MARKER >> 1);
area.y1 = indev->act_point.y - (LV_INDEV_POINT_MARKER >> 1); area.y1 = i->proc.act_point.y - (LV_INDEV_POINT_MARKER >> 1);
area.x2 = indev->act_point.x + ((LV_INDEV_POINT_MARKER >> 1) | 0x1); area.x2 = i->proc.act_point.x + ((LV_INDEV_POINT_MARKER >> 1) | 0x1);
area.y2 = indev->act_point.y + ((LV_INDEV_POINT_MARKER >> 1) | 0x1); area.y2 = i->proc.act_point.y + ((LV_INDEV_POINT_MARKER >> 1) | 0x1);
lv_rfill(&area, NULL, LV_COLOR_MAKE(0xFF, 0, 0), LV_OPA_COVER); lv_rfill(&area, NULL, LV_COLOR_MAKE(0xFF, 0, 0), LV_OPA_COVER);
#endif #endif
indev_proc_press(indev); indev_proc_press(&i->proc);
} else { } else {
indev_proc_release(indev); /*If a new point comes always make a release*/
indev_proc_release(&i->proc);
} }
indev->last_point.x = indev->act_point.x; i->proc.last_point.x = i->proc.act_point.x;
indev->last_point.y = indev->act_point.y; i->proc.last_point.y = i->proc.act_point.y;
} }
/** /**
* Process the pressed state * Process the pressed state of LV_INDEV_TYPE_POINER input devices
* @param indev pointer to an input device state * @param indev pointer to an input device 'proc'
*/ */
static void indev_proc_press(lv_indev_proc_t * info) static void indev_proc_press(lv_indev_proc_t * proc)
{ {
lv_obj_t * pr_obj = info->act_obj; lv_obj_t * pr_obj = proc->act_obj;
if(info->wait_unil_release != 0) return; if(proc->wait_unil_release != 0) return;
/*If there is no last object then search*/ /*If there is no last object then search*/
if(info->act_obj == NULL) { if(proc->act_obj == NULL) {
pr_obj = indev_search_obj(info, lv_layer_top()); pr_obj = indev_search_obj(proc, lv_layer_top());
if(pr_obj == NULL) pr_obj = indev_search_obj(info, lv_scr_act()); if(pr_obj == NULL) pr_obj = indev_search_obj(proc, lv_scr_act());
} }
/*If there is last object but it is not dragged and not protected also search*/ /*If there is last object but it is not dragged and not protected also search*/
else if(info->drag_in_prog == 0 && else if(proc->drag_in_prog == 0 &&
lv_obj_is_protected(info->act_obj, LV_PROTECT_PRESS_LOST) == false) {/*Now act_obj != NULL*/ lv_obj_is_protected(proc->act_obj, LV_PROTECT_PRESS_LOST) == false) {/*Now act_obj != NULL*/
pr_obj = indev_search_obj(info, lv_layer_top()); pr_obj = indev_search_obj(proc, lv_layer_top());
if(pr_obj == NULL) pr_obj = indev_search_obj(info, lv_scr_act()); if(pr_obj == NULL) pr_obj = indev_search_obj(proc, lv_scr_act());
} }
/*If a dragable or a protected object was the last then keep it*/ /*If a dragable or a protected object was the last then keep it*/
else { else {
...@@ -358,26 +425,26 @@ static void indev_proc_press(lv_indev_proc_t * info) ...@@ -358,26 +425,26 @@ static void indev_proc_press(lv_indev_proc_t * info)
} }
/*If a new object was found reset some variables and send a pressed signal*/ /*If a new object was found reset some variables and send a pressed signal*/
if(pr_obj != info->act_obj) { if(pr_obj != proc->act_obj) {
info->last_point.x = info->act_point.x; proc->last_point.x = proc->act_point.x;
info->last_point.y = info->act_point.y; proc->last_point.y = proc->act_point.y;
/*If a new object found the previous was lost, so send a signal*/ /*If a new object found the previous was lost, so send a signal*/
if(info->act_obj != NULL) { if(proc->act_obj != NULL) {
info->act_obj->signal_func(info->act_obj, LV_SIGNAL_PRESS_LOST, indev_act); proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_PRESS_LOST, indev_act);
if(info->reset_query != 0) return; if(proc->reset_query != 0) return;
} }
if(pr_obj != NULL) { if(pr_obj != NULL) {
/* Save the time when the obj pressed. /* Save the time when the obj pressed.
* It is necessary to count the long press time.*/ * It is necessary to count the long press time.*/
info->pr_timestamp = lv_tick_get(); proc->pr_timestamp = lv_tick_get();
info->long_pr_sent = 0; proc->long_pr_sent = 0;
info->drag_range_out = 0; proc->drag_range_out = 0;
info->drag_in_prog = 0; proc->drag_in_prog = 0;
info->drag_sum.x = 0; proc->drag_sum.x = 0;
info->drag_sum.y = 0; proc->drag_sum.y = 0;
/*Search for 'top' attribute*/ /*Search for 'top' attribute*/
lv_obj_t * i = pr_obj; lv_obj_t * i = pr_obj;
...@@ -397,46 +464,46 @@ static void indev_proc_press(lv_indev_proc_t * info) ...@@ -397,46 +464,46 @@ static void indev_proc_press(lv_indev_proc_t * info)
/*Send a signal about the press*/ /*Send a signal about the press*/
pr_obj->signal_func(pr_obj, LV_SIGNAL_PRESSED, indev_act); pr_obj->signal_func(pr_obj, LV_SIGNAL_PRESSED, indev_act);
if(info->reset_query != 0) return; if(proc->reset_query != 0) return;
} }
} }
info->act_obj = pr_obj; /*Save the pressed object*/ proc->act_obj = pr_obj; /*Save the pressed object*/
info->last_obj = info->act_obj; /*Refresh the last_obj*/ proc->last_obj = proc->act_obj; /*Refresh the last_obj*/
/*Calculate the vector*/ /*Calculate the vector*/
info->vect.x = info->act_point.x - info->last_point.x; proc->vect.x = proc->act_point.x - proc->last_point.x;
info->vect.y = info->act_point.y - info->last_point.y; proc->vect.y = proc->act_point.y - proc->last_point.y;
/*If there is active object and it can be dragged run the drag*/ /*If there is active object and it can be dragged run the drag*/
if(info->act_obj != NULL) { if(proc->act_obj != NULL) {
info->act_obj->signal_func(info->act_obj, LV_SIGNAL_PRESSING, indev_act); proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_PRESSING, indev_act);
if(info->reset_query != 0) return; if(proc->reset_query != 0) return;
indev_drag(info); indev_drag(proc);
if(info->reset_query != 0) return; if(proc->reset_query != 0) return;
/*If there is no drag then check for long press time*/ /*If there is no drag then check for long press time*/
if(info->drag_in_prog == 0 && info->long_pr_sent == 0) { if(proc->drag_in_prog == 0 && proc->long_pr_sent == 0) {
/*Send a signal about the long press if enough time elapsed*/ /*Send a signal about the long press if enough time elapsed*/
if(lv_tick_elaps(info->pr_timestamp) > LV_INDEV_LONG_PRESS_TIME) { if(lv_tick_elaps(proc->pr_timestamp) > LV_INDEV_LONG_PRESS_TIME) {
pr_obj->signal_func(pr_obj, LV_SIGNAL_LONG_PRESS, indev_act); pr_obj->signal_func(pr_obj, LV_SIGNAL_LONG_PRESS, indev_act);
if(info->reset_query != 0) return; if(proc->reset_query != 0) return;
/*Mark the signal sending to do not send it again*/ /*Mark the signal sending to do not send it again*/
info->long_pr_sent = 1; proc->long_pr_sent = 1;
/*Save the long press time stamp for the long press repeat handler*/ /*Save the long press time stamp for the long press repeat handler*/
info->longpr_rep_timestamp = lv_tick_get(); proc->longpr_rep_timestamp = lv_tick_get();
} }
} }
/*Send long press repeated signal*/ /*Send long press repeated signal*/
if(info->drag_in_prog == 0 && info->long_pr_sent == 1) { if(proc->drag_in_prog == 0 && proc->long_pr_sent == 1) {
/*Send a signal about the long press repeate if enough time elapsed*/ /*Send a signal about the long press repeate if enough time elapsed*/
if(lv_tick_elaps(info->longpr_rep_timestamp) > LV_INDEV_LONG_PRESS_REP_TIME) { if(lv_tick_elaps(proc->longpr_rep_timestamp) > LV_INDEV_LONG_PRESS_REP_TIME) {
pr_obj->signal_func(pr_obj, LV_SIGNAL_LONG_PRESS_REP, indev_act); pr_obj->signal_func(pr_obj, LV_SIGNAL_LONG_PRESS_REP, indev_act);
if(info->reset_query != 0) return; if(proc->reset_query != 0) return;
info->longpr_rep_timestamp = lv_tick_get(); proc->longpr_rep_timestamp = lv_tick_get();
} }
} }
...@@ -444,33 +511,33 @@ static void indev_proc_press(lv_indev_proc_t * info) ...@@ -444,33 +511,33 @@ static void indev_proc_press(lv_indev_proc_t * info)
} }
/** /**
* Process the released state * Process the released state of LV_INDEV_TYPE_POINER input devices
* @param indev_proc_p pointer to an input device state * @param proc pointer to an input device 'proc'
*/ */
static void indev_proc_release(lv_indev_proc_t * state) static void indev_proc_release(lv_indev_proc_t * proc)
{ {
if(state->wait_unil_release != 0) { if(proc->wait_unil_release != 0) {
state->act_obj = NULL; proc->act_obj = NULL;
state->last_obj = NULL; proc->last_obj = NULL;
state->pr_timestamp = 0; proc->pr_timestamp = 0;
state->longpr_rep_timestamp = 0; proc->longpr_rep_timestamp = 0;
state->wait_unil_release = 0; proc->wait_unil_release = 0;
} }
/*Forgot the act obj and send a released signal */ /*Forgot the act obj and send a released signal */
if(state->act_obj != NULL) { if(proc->act_obj != NULL) {
state->act_obj->signal_func(state->act_obj, LV_SIGNAL_RELEASED, indev_act); proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_RELEASED, indev_act);
if(state->reset_query != 0) return; if(proc->reset_query != 0) return;
state->act_obj = NULL; proc->act_obj = NULL;
state->pr_timestamp = 0; proc->pr_timestamp = 0;
state->longpr_rep_timestamp = 0; proc->longpr_rep_timestamp = 0;
} }
/*The reset can be set in the signal function. /*The reset can be set in the signal function.
* In case of reset query ignore the remaining parts.*/ * In case of reset query ignore the remaining parts.*/
if(state->last_obj != NULL && state->reset_query == 0) { if(proc->last_obj != NULL && proc->reset_query == 0) {
indev_drag_throw(state); indev_drag_throw(proc);
if(state->reset_query != 0) return; if(proc->reset_query != 0) return;
} }
} }
......
...@@ -60,40 +60,49 @@ void lv_indev_reset_lpr(lv_indev_t * indev); ...@@ -60,40 +60,49 @@ void lv_indev_reset_lpr(lv_indev_t * indev);
void lv_indev_enable(lv_hal_indev_type_t type, bool enable); void lv_indev_enable(lv_hal_indev_type_t type, bool enable);
/** /**
* Set a cursor for a pointer input device * Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON)
* @param indev pointer to an input device (type: 'LV_INDEV_TYPE_POINTER') * @param indev pointer to an input device
* @param cur_obj pointer to an object to be used as cursor * @param cur_obj pointer to an object to be used as cursor
*/ */
void lv_indev_set_cursor(lv_indev_t *indev, lv_obj_t *cur_obj); void lv_indev_set_cursor(lv_indev_t *indev, lv_obj_t *cur_obj);
#if USE_LV_GROUP #if USE_LV_GROUP
/** /**
* Set a destination group for a keypad input device * Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD)
* @param indev pointer to an input device (type: 'LV_INDEV_TYPE_KEYPAD') * @param indev pointer to an input device
* @param group point to a group * @param group point to a group
*/ */
void lv_indev_set_group(lv_indev_t *indev, lv_group_t *group); void lv_indev_set_group(lv_indev_t *indev, lv_group_t *group);
#endif #endif
/**
* Set the an array of points for LV_INDEV_TYPE_BUTTON.
* These points will be assigned to the buttons to press a specific point on the screen
* @param indev pointer to an input device
* @param group point to a group
*/
void lv_indev_set_button_points(lv_indev_t *indev, lv_point_t *points);
/** /**
* Get the last point of an input device * Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
* @param indev pointer to an input device * @param indev pointer to an input device
* @param point pointer to a point to store the result * @param point pointer to a point to store the result
*/ */
void lv_indev_get_point(lv_indev_t * indev, lv_point_t * point); void lv_indev_get_point(lv_indev_t * indev, lv_point_t * point);
/** /**
* Check if there is dragging with an input device or not * Check if there is dragging with an input device or not (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
* @param indev pointer to an input device * @param indev pointer to an input device
* @return true: drag is in progress * @return true: drag is in progress
*/ */
bool lv_indev_is_dragging(lv_indev_t * indev); bool lv_indev_is_dragging(lv_indev_t * indev);
/** /**
* Get the vector of dragging of an input device * Get the vector of dragging of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON)
* @param indev pointer to an input device * @param indev pointer to an input device
* @param point pointer to a point to store the vector * @param point pointer to a point to store the vector
*/ */
void lv_indev_get_vect(lv_indev_t * indev, lv_point_t * point); void lv_indev_get_vect(lv_indev_t * indev, lv_point_t * point);
/** /**
* Get elapsed time since last press * Get elapsed time since last press
* @param indev pointer to an input device (NULL to get the overall smallest inactivity) * @param indev pointer to an input device (NULL to get the overall smallest inactivity)
......
...@@ -33,19 +33,21 @@ typedef enum { ...@@ -33,19 +33,21 @@ typedef enum {
LV_INDEV_TYPE_NONE, /*Show uninitialized state*/ LV_INDEV_TYPE_NONE, /*Show uninitialized state*/
LV_INDEV_TYPE_POINTER, /*Touch pad, mouse, external button*/ LV_INDEV_TYPE_POINTER, /*Touch pad, mouse, external button*/
LV_INDEV_TYPE_KEYPAD, /*Keypad or keyboard*/ LV_INDEV_TYPE_KEYPAD, /*Keypad or keyboard*/
LV_INDEV_TYPE_BUTTON, /*External (hardware button) which is assinged to a specific point of the screen*/
} lv_hal_indev_type_t; } lv_hal_indev_type_t;
/*States for input devices*/ /*States for input devices*/
typedef enum { typedef enum {
LV_INDEV_STATE_REL, LV_INDEV_STATE_REL = 0,
LV_INDEV_STATE_PR LV_INDEV_STATE_PR
}lv_indev_state_t; }lv_indev_state_t;
/*Data type when an input device is read */ /*Data type when an input device is read */
typedef struct { typedef struct {
union { union {
lv_point_t point; /*For INDEV_TYPE_POINTER*/ lv_point_t point; /*For LV_INDEV_TYPE_POINTER the currently pressed point*/
uint32_t key; /*For INDEV_TYPE_KEYPAD*/ uint32_t key; /*For LV_INDEV_TYPE_KEYPAD the currently pressed key*/
uint32_t btn; /*For LV_INDEV_TYPE_BUTTON the currently pressed button*/
}; };
lv_indev_state_t state; /*LV_INDEV_EVENT_REL or LV_INDEV_EVENT_PR*/ lv_indev_state_t state; /*LV_INDEV_EVENT_REL or LV_INDEV_EVENT_PR*/
void *user_data; /*'lv_indev_drv_t.priv' for this driver*/ void *user_data; /*'lv_indev_drv_t.priv' for this driver*/
...@@ -60,10 +62,11 @@ typedef struct { ...@@ -60,10 +62,11 @@ typedef struct {
struct _lv_obj_t; struct _lv_obj_t;
typedef struct _lv_indev_state_t { /*Run time data of input devices*/
typedef struct _lv_indev_proc_t {
lv_indev_state_t state; lv_indev_state_t state;
union { union {
struct { /*Pointer data*/ struct { /*Pointer and button data*/
lv_point_t act_point; lv_point_t act_point;
lv_point_t last_point; lv_point_t last_point;
lv_point_t vect; lv_point_t vect;
...@@ -94,13 +97,16 @@ typedef struct _lv_indev_state_t { ...@@ -94,13 +97,16 @@ typedef struct _lv_indev_state_t {
struct _lv_obj_t; struct _lv_obj_t;
struct _lv_group_t; struct _lv_group_t;
/*The main input device descriptor with driver, runtime data ('proc') and some additional information*/
typedef struct _lv_indev_t { typedef struct _lv_indev_t {
lv_indev_drv_t driver; lv_indev_drv_t driver;
lv_indev_proc_t proc; lv_indev_proc_t proc;
uint32_t last_activity_time; uint32_t last_activity_time;
union { union {
struct _lv_obj_t *cursor; struct _lv_obj_t *cursor; /*Cursor for LV_INPUT_TYPE_POINTER*/
struct _lv_group_t *group; /*Keypad destination group*/ struct _lv_group_t *group; /*Keypad destination group*/
lv_point_t * btn_points; /*Array points assigned to the button ()screen will be pressed here by the buttons*/
}; };
struct _lv_indev_t *next; struct _lv_indev_t *next;
} lv_indev_t; } lv_indev_t;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment