1 /**
2  * @file lv_monkey.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "lv_monkey_private.h"
10 
11 #if LV_USE_MONKEY != 0
12 
13 #include "../../misc/lv_math.h"
14 #include "../../misc/lv_assert.h"
15 #include "../../stdlib/lv_mem.h"
16 #include "../../display/lv_display.h"
17 
18 /*********************
19  *      DEFINES
20  *********************/
21 #define MONKEY_PERIOD_RANGE_MIN_DEF    100
22 #define MONKEY_PERIOD_RANGE_MAX_DEF    1000
23 
24 /**********************
25  *      TYPEDEFS
26  **********************/
27 struct _lv_monkey_t {
28     lv_monkey_config_t config;
29     lv_indev_data_t indev_data;
30     lv_indev_t * indev;
31     lv_timer_t * timer;
32     void * user_data;
33 };
34 
35 static const lv_key_t lv_key_map[] = {
36     LV_KEY_UP,
37     LV_KEY_DOWN,
38     LV_KEY_RIGHT,
39     LV_KEY_LEFT,
40     LV_KEY_ESC,
41     LV_KEY_DEL,
42     LV_KEY_BACKSPACE,
43     LV_KEY_ENTER,
44     LV_KEY_NEXT,
45     LV_KEY_PREV,
46     LV_KEY_HOME,
47     LV_KEY_END,
48 };
49 
50 /**********************
51  *  STATIC PROTOTYPES
52  **********************/
53 
54 static void lv_monkey_read_cb(lv_indev_t * indev, lv_indev_data_t * data);
55 static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig);
56 static void lv_monkey_timer_cb(lv_timer_t * timer);
57 
58 /**********************
59  *   GLOBAL FUNCTIONS
60  **********************/
61 
lv_monkey_config_init(lv_monkey_config_t * config)62 void lv_monkey_config_init(lv_monkey_config_t * config)
63 {
64     lv_memzero(config, sizeof(lv_monkey_config_t));
65     config->type = LV_INDEV_TYPE_POINTER;
66     config->period_range.min = MONKEY_PERIOD_RANGE_MIN_DEF;
67     config->period_range.max = MONKEY_PERIOD_RANGE_MAX_DEF;
68 }
69 
lv_monkey_create(const lv_monkey_config_t * config)70 lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config)
71 {
72     lv_monkey_t * monkey = lv_malloc_zeroed(sizeof(lv_monkey_t));
73     LV_ASSERT_MALLOC(monkey);
74 
75     monkey->config = *config;
76     monkey->timer = lv_timer_create(lv_monkey_timer_cb, monkey->config.period_range.min, monkey);
77     lv_timer_pause(monkey->timer);
78 
79     monkey->indev = lv_indev_create();
80     lv_indev_set_type(monkey->indev, config->type);
81     lv_indev_set_read_cb(monkey->indev, lv_monkey_read_cb);
82     lv_indev_set_user_data(monkey->indev, monkey);
83     return monkey;
84 }
85 
lv_monkey_get_indev(lv_monkey_t * monkey)86 lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey)
87 {
88     LV_ASSERT_NULL(monkey);
89     return monkey->indev;
90 }
91 
lv_monkey_set_enable(lv_monkey_t * monkey,bool en)92 void lv_monkey_set_enable(lv_monkey_t * monkey, bool en)
93 {
94     LV_ASSERT_NULL(monkey);
95     en ? lv_timer_resume(monkey->timer) : lv_timer_pause(monkey->timer);
96 }
97 
lv_monkey_get_enable(lv_monkey_t * monkey)98 bool lv_monkey_get_enable(lv_monkey_t * monkey)
99 {
100     LV_ASSERT_NULL(monkey);
101     return !lv_timer_get_paused(monkey->timer);
102 }
103 
lv_monkey_set_user_data(lv_monkey_t * monkey,void * user_data)104 void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data)
105 {
106     LV_ASSERT_NULL(monkey);
107     monkey->user_data = user_data;
108 }
109 
lv_monkey_get_user_data(lv_monkey_t * monkey)110 void * lv_monkey_get_user_data(lv_monkey_t * monkey)
111 {
112     LV_ASSERT_NULL(monkey);
113     return monkey->user_data;
114 }
115 
lv_monkey_delete(lv_monkey_t * monkey)116 void lv_monkey_delete(lv_monkey_t * monkey)
117 {
118     LV_ASSERT_NULL(monkey);
119 
120     lv_timer_delete(monkey->timer);
121     lv_indev_delete(monkey->indev);
122     lv_free(monkey);
123 }
124 
125 /**********************
126  *   STATIC FUNCTIONS
127  **********************/
128 
lv_monkey_read_cb(lv_indev_t * indev,lv_indev_data_t * data)129 static void lv_monkey_read_cb(lv_indev_t * indev, lv_indev_data_t * data)
130 {
131     lv_monkey_t * monkey = lv_indev_get_user_data(indev);
132 
133     data->btn_id = monkey->indev_data.btn_id;
134     data->point = monkey->indev_data.point;
135     data->enc_diff = monkey->indev_data.enc_diff;
136     data->state = monkey->indev_data.state;
137 }
138 
lv_monkey_random(int32_t howsmall,int32_t howbig)139 static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig)
140 {
141     if(howsmall >= howbig) {
142         return howsmall;
143     }
144     int32_t diff = howbig - howsmall;
145     return (int32_t)lv_rand(0, diff) + howsmall;
146 }
147 
lv_monkey_timer_cb(lv_timer_t * timer)148 static void lv_monkey_timer_cb(lv_timer_t * timer)
149 {
150     lv_monkey_t * monkey = lv_timer_get_user_data(timer);
151     lv_indev_data_t * data = &monkey->indev_data;
152 
153     switch(lv_indev_get_type(monkey->indev)) {
154         case LV_INDEV_TYPE_POINTER:
155             data->point.x = (int32_t)lv_monkey_random(0, LV_HOR_RES - 1);
156             data->point.y = (int32_t)lv_monkey_random(0, LV_VER_RES - 1);
157             break;
158         case LV_INDEV_TYPE_ENCODER:
159             data->enc_diff = (int16_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max);
160             break;
161         case LV_INDEV_TYPE_BUTTON:
162             data->btn_id = (uint32_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max);
163             break;
164         case LV_INDEV_TYPE_KEYPAD: {
165                 int32_t index = lv_monkey_random(0, sizeof(lv_key_map) / sizeof(lv_key_map[0]) - 1);
166                 data->key = lv_key_map[index];
167                 break;
168             }
169         default:
170             break;
171     }
172 
173     data->state = lv_monkey_random(0, 100) < 50 ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED;
174 
175     lv_timer_set_period(monkey->timer, lv_monkey_random(monkey->config.period_range.min, monkey->config.period_range.max));
176 }
177 
178 #endif /*LV_USE_MONKEY*/
179