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