summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/eve
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/eve')
-rw-r--r--fw/fe310/eos/eve/eve.c176
-rw-r--r--fw/fe310/eos/eve/eve.h26
-rw-r--r--fw/fe310/eos/eve/eve_font.c52
-rw-r--r--fw/fe310/eos/eve/eve_font.h2
-rw-r--r--fw/fe310/eos/eve/eve_kbd.c12
-rw-r--r--fw/fe310/eos/eve/eve_kbd.h2
-rw-r--r--fw/fe310/eos/eve/eve_phy.c40
-rw-r--r--fw/fe310/eos/eve/eve_phy.h14
-rw-r--r--fw/fe310/eos/eve/eve_platform.c33
-rw-r--r--fw/fe310/eos/eve/eve_platform.h48
-rw-r--r--fw/fe310/eos/eve/eve_text.c17
-rw-r--r--fw/fe310/eos/eve/eve_text.h2
-rw-r--r--fw/fe310/eos/eve/eve_touch.c160
-rw-r--r--fw/fe310/eos/eve/eve_touch.h57
-rw-r--r--fw/fe310/eos/eve/eve_touch_engine.c48
-rw-r--r--fw/fe310/eos/eve/eve_touch_engine.h13
-rw-r--r--fw/fe310/eos/eve/eve_vtrack.c72
-rw-r--r--fw/fe310/eos/eve/eve_vtrack.h23
-rw-r--r--fw/fe310/eos/eve/screen/form.c70
-rw-r--r--fw/fe310/eos/eve/screen/form.h6
-rw-r--r--fw/fe310/eos/eve/screen/page.c421
-rw-r--r--fw/fe310/eos/eve/screen/page.h22
-rw-r--r--fw/fe310/eos/eve/screen/uievt.h8
-rw-r--r--fw/fe310/eos/eve/screen/view.c137
-rw-r--r--fw/fe310/eos/eve/screen/view.h38
-rw-r--r--fw/fe310/eos/eve/screen/window.c125
-rw-r--r--fw/fe310/eos/eve/screen/window.h20
-rw-r--r--fw/fe310/eos/eve/widget/freew.c60
-rw-r--r--fw/fe310/eos/eve/widget/freew.h11
-rw-r--r--fw/fe310/eos/eve/widget/label.c19
-rw-r--r--fw/fe310/eos/eve/widget/label.h4
-rw-r--r--fw/fe310/eos/eve/widget/pagew.c18
-rw-r--r--fw/fe310/eos/eve/widget/pagew.h2
-rw-r--r--fw/fe310/eos/eve/widget/selectw.c78
-rw-r--r--fw/fe310/eos/eve/widget/selectw.h3
-rw-r--r--fw/fe310/eos/eve/widget/spacerw.c9
-rw-r--r--fw/fe310/eos/eve/widget/spacerw.h2
-rw-r--r--fw/fe310/eos/eve/widget/strw.c104
-rw-r--r--fw/fe310/eos/eve/widget/strw.h2
-rw-r--r--fw/fe310/eos/eve/widget/textw.c90
-rw-r--r--fw/fe310/eos/eve/widget/textw.h2
-rw-r--r--fw/fe310/eos/eve/widget/togglew.c27
-rw-r--r--fw/fe310/eos/eve/widget/togglew.h6
-rw-r--r--fw/fe310/eos/eve/widget/widget.c8
-rw-r--r--fw/fe310/eos/eve/widget/widget.h3
45 files changed, 1186 insertions, 906 deletions
diff --git a/fw/fe310/eos/eve/eve.c b/fw/fe310/eos/eve/eve.c
index 45ac886..e5c5f80 100644
--- a/fw/fe310/eos/eve/eve.c
+++ b/fw/fe310/eos/eve/eve.c
@@ -12,86 +12,86 @@ static uint16_t cmd_offset;
static char dl_burst;
static uint32_t dl_addr;
-static uint8_t power_state;
+static uint8_t power_state = EVE_PSTATE_ACTIVE;
static int lcd_absent = 0;
void eve_command(uint8_t command, uint8_t parameter) {
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg24(((uint32_t)command << 16) | ((uint32_t)parameter << 8), 0);
- eve_spi_cs_clear();
+ eve_spi_clear_cs();
}
uint8_t eve_read8(uint32_t addr) {
- uint8_t r;
- eve_spi_cs_set();
+ uint8_t rv;
+ eve_spi_set_cs();
eve_spi_xchg32(addr << 8, 0);
- r = eve_spi_xchg8(0, EVE_SPI_FLAG_BSWAP);
- eve_spi_cs_clear();
+ rv = eve_spi_xchg8(0, EVE_SPI_FLAG_BSWAP);
+ eve_spi_clear_cs();
- return r;
+ return rv;
}
uint16_t eve_read16(uint32_t addr) {
- uint16_t r;
- eve_spi_cs_set();
+ uint16_t rv;
+ eve_spi_set_cs();
eve_spi_xchg32(addr << 8, 0);
- r = eve_spi_xchg16(0, EVE_SPI_FLAG_BSWAP);
- eve_spi_cs_clear();
+ rv = eve_spi_xchg16(0, EVE_SPI_FLAG_BSWAP);
+ eve_spi_clear_cs();
- return r;
+ return rv;
}
uint32_t eve_read32(uint32_t addr) {
- uint32_t r;
- eve_spi_cs_set();
+ uint32_t rv;
+ eve_spi_set_cs();
eve_spi_xchg32(addr << 8, 0);
- r = eve_spi_xchg32(0, EVE_SPI_FLAG_BSWAP);
- eve_spi_cs_clear();
+ rv = eve_spi_xchg32(0, EVE_SPI_FLAG_BSWAP);
+ eve_spi_clear_cs();
- return r;
+ return rv;
}
void eve_write8(uint32_t addr, uint8_t data) {
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg24(addr | EVE_MEM_WRITE, 0);
eve_spi_xchg8(data, EVE_SPI_FLAG_BSWAP);
- eve_spi_cs_clear();
+ eve_spi_clear_cs();
}
void eve_write16(uint32_t addr, uint16_t data) {
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg24(addr | EVE_MEM_WRITE, 0);
eve_spi_xchg16(data, EVE_SPI_FLAG_BSWAP);
- eve_spi_cs_clear();
+ eve_spi_clear_cs();
}
void eve_write32(uint32_t addr, uint32_t data) {
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg24(addr | EVE_MEM_WRITE, 0);
eve_spi_xchg32(data, EVE_SPI_FLAG_BSWAP);
- eve_spi_cs_clear();
+ eve_spi_clear_cs();
}
void eve_readb(uint32_t addr, uint8_t *buf, size_t size) {
int i;
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg32(addr << 8, 0);
for (i=0; i<size; i++) {
buf[i] = eve_spi_xchg8(0, 0);
}
- eve_spi_cs_clear();
+ eve_spi_clear_cs();
}
void eve_writeb(uint32_t addr, uint8_t *buf, size_t size) {
int i;
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg24(addr | EVE_MEM_WRITE, 0);
for (i=0; i<size; i++) {
eve_spi_xchg8(buf[i], 0);
}
- eve_spi_cs_clear();
+ eve_spi_clear_cs();
}
static void dl_inc(uint32_t i) {
@@ -102,8 +102,7 @@ void eve_dl_start(uint32_t addr, char burst) {
dl_addr = addr;
dl_burst = burst;
if (burst) {
- eve_spi_lock();
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg24(addr | EVE_MEM_WRITE, EVE_SPI_FLAG_TX);
}
}
@@ -120,8 +119,7 @@ void eve_dl_write(uint32_t dl) {
void eve_dl_end(void) {
if (dl_burst) {
eve_spi_flush();
- eve_spi_cs_clear();
- eve_spi_unlock();
+ eve_spi_clear_cs();
dl_burst = 0;
}
}
@@ -142,7 +140,7 @@ static void cmd_inc(uint16_t i) {
static void cmd_begin(uint32_t command, uint8_t flags) {
if (!cmd_burst) {
uint32_t addr = EVE_RAM_CMD + cmd_offset;
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg24(addr | EVE_MEM_WRITE, 0);
}
eve_spi_xchg32(command, flags);
@@ -150,7 +148,7 @@ static void cmd_begin(uint32_t command, uint8_t flags) {
}
static void cmd_end(void) {
- if (!cmd_burst) eve_spi_cs_clear();
+ if (!cmd_burst) eve_spi_clear_cs();
}
static void cmd_string(const char *str, uint8_t flags) {
@@ -256,44 +254,51 @@ void eve_cmd_dl(uint32_t dl) {
}
int eve_cmd_done(void) {
- uint16_t r = eve_read16(REG_CMD_READ);
+ uint16_t rd = eve_read16(REG_CMD_READ);
- if (r == 0xfff) {
+ if (rd == 0xfff) {
eve_copro_reset();
return EVE_ERR;
}
- return (r == cmd_offset);
+ return (rd == cmd_offset);
}
int eve_cmd_exec(int w) {
eve_write16(REG_CMD_WRITE, cmd_offset);
if (w) {
- int r;
+ int rv;
+ uint32_t start;
+
+ start = eve_get_tick();
do {
- r = eve_cmd_done();
- if (r < 0) break;
- } while (!r);
- if (r < 0) return EVE_ERR;
+ rv = eve_cmd_done();
+ if (rv < 0) break;
+ if (eve_tdelta_ms(start) > EVE_CMD_EXEC_TO) break;
+ } while (!rv);
+ if (eve_tdelta_ms(start) > EVE_CMD_EXEC_TO) return EVE_ERR_TIMEOUT;
+ if (rv < 0) return EVE_ERR;
}
return EVE_OK;
}
+void eve_cmd_set_offset(void) {
+ cmd_offset = eve_read16(REG_CMD_READ);
+}
+
void eve_cmd_burst_start(void) {
uint32_t addr = EVE_RAM_CMD + cmd_offset;
- eve_spi_lock();
- eve_spi_cs_set();
+ eve_spi_set_cs();
eve_spi_xchg24(addr | EVE_MEM_WRITE, EVE_SPI_FLAG_TX);
cmd_burst = 1;
}
void eve_cmd_burst_end(void) {
eve_spi_flush();
- eve_spi_cs_clear();
- eve_spi_unlock();
+ eve_spi_clear_cs();
cmd_burst = 0;
}
@@ -363,6 +368,7 @@ int eve_init(void) {
eve_write8(REG_VOL_PB, 0x00); /* turn recorded audio volume off */
/* configure interrupts */
+ eve_write8(REG_INT_EN, 0);
eve_write16(REG_INT_MASK, 0);
/* write a basic display-list to get things started */
@@ -378,28 +384,22 @@ int eve_init(void) {
#endif
/* nothing is being displayed yet... the pixel clock is still 0x00 */
+ power_state = EVE_PSTATE_ACTIVE;
+
return EVE_OK;
}
void eve_clk_start(void) {
- uint16_t gpiox;
-
eve_write8(REG_PCLK, EVE_PCLK); /* start clocking data to the LCD panel */
- gpiox = eve_read16(REG_GPIOX) | 0x8000;
- eve_write16(REG_GPIOX, gpiox); /* enable the DISP signal to the LCD panel, it is set to output in REG_GPIOX_DIR */
}
void eve_clk_stop(void) {
- uint16_t gpiox;
-
- gpiox = eve_read16(REG_GPIOX) & ~0x8000;
- eve_write16(REG_GPIOX, gpiox);
eve_write8(REG_PCLK, 0);
}
void eve_intr_enable(void) {
- eve_write8(REG_INT_EN, 0x01);
while(eve_read8(REG_INT_FLAGS));
+ eve_write8(REG_INT_EN, 0x01);
}
void eve_intr_disable(void) {
@@ -408,8 +408,27 @@ void eve_intr_disable(void) {
}
void eve_activate(void) {
+ if (power_state == EVE_PSTATE_ACTIVE) return;
+
eve_command(EVE_ACTIVE, 0);
- eve_sleep(40);
+ if (power_state == EVE_PSTATE_SLEEP) {
+ eve_sleep(20);
+ }
+}
+
+void eve_deactivate(void) {
+ switch (power_state) {
+ case EVE_PSTATE_ACTIVE:
+ return;
+
+ case EVE_PSTATE_STANDBY:
+ eve_command(EVE_STANDBY, 0);
+ break;
+
+ case EVE_PSTATE_SLEEP:
+ eve_command(EVE_SLEEP, 0);
+ break;
+ }
}
void eve_pwr_standby(void) {
@@ -423,9 +442,6 @@ void eve_pwr_standby(void) {
void eve_pwr_sleep(void) {
if (power_state != EVE_PSTATE_ACTIVE) return;
- eve_clk_stop();
- eve_intr_disable();
-
eve_command(EVE_SLEEP, 0);
power_state = EVE_PSTATE_SLEEP;
@@ -434,14 +450,17 @@ void eve_pwr_sleep(void) {
void eve_pwr_wake(void) {
eve_activate();
- if (power_state == EVE_PSTATE_SLEEP) {
- eve_intr_enable();
- eve_clk_start();
- }
-
power_state = EVE_PSTATE_ACTIVE;
}
+void eve_pwr_set_state(uint8_t state) {
+ power_state = state;
+}
+
+uint8_t eve_pwr_state(void) {
+ return power_state;
+}
+
int eve_gpio_get(int gpio) {
uint16_t reg = eve_read16(REG_GPIOX);
@@ -456,17 +475,33 @@ void eve_gpio_set(int gpio, int val) {
eve_write16(REG_GPIOX, reg);
}
-uint8_t eve_gpio_get_dir(void) {
+uint16_t eve_gpio_read(void) {
+ uint16_t reg = eve_read16(REG_GPIOX);
+
+ return reg & EVE_GPIO_MASK;
+}
+
+void eve_gpio_write(uint16_t gpio) {
+ uint16_t reg = eve_read16(REG_GPIOX);
+
+ gpio &= EVE_GPIO_MASK;
+ reg &= ~EVE_GPIO_MASK;
+ reg |= gpio;
+ eve_write16(REG_GPIOX, reg);
+}
+
+uint16_t eve_gpio_read_dir(void) {
uint16_t reg = eve_read16(REG_GPIOX_DIR);
- return reg & 0x000f;
+ return reg & EVE_GPIO_MASK;
}
-void eve_gpio_set_dir(uint8_t dir) {
+void eve_gpio_write_dir(uint16_t dir) {
uint16_t reg = eve_read16(REG_GPIOX_DIR);
- reg &= 0xfff0;
- reg |= dir & 0x0f;
+ dir &= EVE_GPIO_MASK;
+ reg &= ~EVE_GPIO_MASK;
+ reg |= dir;
eve_write16(REG_GPIOX_DIR, reg);
}
@@ -490,5 +525,8 @@ void eve_copro_reset(void) {
eve_write16(REG_CMD_DL, 0);
eve_write8(REG_CPURESET, 0);
eve_write16(REG_COPRO_PATCH_PTR, ptr);
+ /* From programming guide:
+ To enable coprocessor access flash content, send commands CMD_FLASHATTACH following CMD_FLASHFAST.
+ It will make sure flash enters full speed mode.*/
eve_write8(REG_PCLK, EVE_PCLK);
}
diff --git a/fw/fe310/eos/eve/eve.h b/fw/fe310/eos/eve/eve.h
index ea4ec71..02388bb 100644
--- a/fw/fe310/eos/eve/eve.h
+++ b/fw/fe310/eos/eve/eve.h
@@ -6,17 +6,16 @@
#include "eve_vtrack.h"
#include "eve_platform.h"
-#define EVE_OK 0
-#define EVE_ERR -1
-
-#define EVE_ERR_FULL -10
-#define EVE_ERR_EMPTY -11
-
-#define EVE_ERR_NOMEM -100
+/* defined in eve_platform.h */
+#define EVE_GPIO_MASK 0x800f
+#define EVE_GPIO_DISP 15
#define EVE_PSTATE_ACTIVE 0
#define EVE_PSTATE_STANDBY 1
-#define EVE_PSTATE_SLEEP 3
+#define EVE_PSTATE_SLEEP 2
+#define EVE_PSTATE_PDOWN 3
+
+#define EVE_CMD_EXEC_TO 1000 // 1s
#define COLOR_RGBC(c) ((4UL<<24)|((c)&16777215UL))
#define CLEAR_COLOR_RGBC(c) ((2UL<<24)|((c)&16777215UL))
@@ -53,6 +52,7 @@ uint32_t eve_cmd_result(uint16_t offset);
void eve_cmd_dl(uint32_t dl);
int eve_cmd_done(void);
int eve_cmd_exec(int w);
+void eve_cmd_set_offset(void);
void eve_cmd_burst_start(void);
void eve_cmd_burst_end(void);
@@ -65,14 +65,20 @@ void eve_intr_enable(void);
void eve_intr_disable(void);
void eve_activate(void);
+void eve_deactivate(void);
void eve_pwr_standby(void);
void eve_pwr_sleep(void);
void eve_pwr_wake(void);
+void eve_pwr_set_state(uint8_t state);
+
+uint8_t eve_pwr_state(void);
int eve_gpio_get(int gpio);
void eve_gpio_set(int gpio, int val);
-uint8_t eve_gpio_get_dir(void);
-void eve_gpio_set_dir(uint8_t dir);
+uint16_t eve_gpio_read(void);
+void eve_gpio_write(uint16_t gpio);
+uint16_t eve_gpio_read_dir(void);
+void eve_gpio_write_dir(uint16_t dir);
void eve_brightness(uint8_t b);
void eve_lcd_absent(void);
diff --git a/fw/fe310/eos/eve/eve_font.c b/fw/fe310/eos/eve/eve_font.c
index 8f272bc..803c0d2 100644
--- a/fw/fe310/eos/eve/eve_font.c
+++ b/fw/fe310/eos/eve/eve_font.c
@@ -1,4 +1,5 @@
#include <stdlib.h>
+#include <string.h>
#include "eve.h"
#include "eve_font.h"
@@ -19,57 +20,62 @@ int eve_font_ch_w(EVEFont *font, ucp_t ch) {
return EVE_ERR;
}
-static int font_str_w(EVEFont *font, utf8_t *str, int *_str_w, size_t *_str_len) {
- uint16_t r = 0;
- size_t len = 0;
+static int font_str_w(EVEFont *font, utf8_t *str, int *_str_w, size_t *_str_l) {
+ uint16_t w = 0;
+ size_t l = 0;
ucp_t ch;
int ch_w;
int ch_l;
- while (str[len]) {
- ch_l = utf8_dec(str + len, &ch);
+ while (str[l]) {
+ ch_l = utf8_dec(str + l, &ch);
ch_w = eve_font_ch_w(font, ch);
if (ch_w < 0) {
- if (_str_w) *_str_w = r;
- if (_str_len) *_str_len = len;
+ if (_str_w) *_str_w = w;
+ if (_str_l) *_str_l = l;
return EVE_ERR;
}
- r += ch_w;
- len += ch_l;
+ w += ch_w;
+ l += ch_l;
}
- if (_str_w) *_str_w = r;
- if (_str_len) *_str_len = len;
+ if (_str_w) *_str_w = w;
+ if (_str_l) *_str_l = l;
return EVE_OK;
}
-static int font_buf_w(EVEFont *font, utf8_t *buf, size_t buf_len, int *_buf_w, size_t *_buf_len) {
- uint16_t r = 0;
- size_t len = 0;
+static int font_buf_w(EVEFont *font, utf8_t *buf, size_t buf_len, int *_buf_w, size_t *_buf_l) {
+ uint16_t w = 0;
+ size_t l = 0;
ucp_t ch;
int ch_w;
int ch_l;
- while (len < buf_len) {
- ch_l = utf8_dec(buf + len, &ch);
+ while (l < buf_len) {
+ ch_l = utf8_dec(buf + l, &ch);
ch_w = eve_font_ch_w(font, ch);
if (ch_w < 0) {
- if (_buf_w) *_buf_w = r;
- if (_buf_len) *_buf_len = len;
+ if (_buf_w) *_buf_w = w;
+ if (_buf_l) *_buf_l = l;
return EVE_ERR;
}
- r += ch_w;
- len += ch_l;
+ w += ch_w;
+ l += ch_l;
}
- if (_buf_w) *_buf_w = r;
- if (_buf_len) *_buf_len = len;
+ if (_buf_w) *_buf_w = w;
+ if (_buf_l) *_buf_l = l;
return EVE_OK;
}
-int eve_font_verify(EVEFont *font, utf8_t *str, int *str_w, size_t *str_len) {
+int eve_font_verify(EVEFont *font, utf8_t *str, size_t str_size, int *str_w, size_t *str_len) {
int rv;
+ if (str_size == 0) str_size = strlen(str) + 1;
+
+ rv = utf8_verify(str, str_size, str_len);
+ if (rv) return EVE_ERR;
+
rv = font_str_w(font, str, str_w, str_len);
return rv;
}
diff --git a/fw/fe310/eos/eve/eve_font.h b/fw/fe310/eos/eve/eve_font.h
index 7629106..57715ac 100644
--- a/fw/fe310/eos/eve/eve_font.h
+++ b/fw/fe310/eos/eve/eve_font.h
@@ -11,7 +11,7 @@ typedef struct EVEFont {
void eve_font_init(EVEFont *font, uint8_t font_id);
int eve_font_ch_w(EVEFont *font, ucp_t ch);
-int eve_font_verify(EVEFont *font, utf8_t *str, int *str_w, size_t *str_len);
+int eve_font_verify(EVEFont *font, utf8_t *str, size_t str_size, int *str_w, size_t *str_len);
int eve_font_str_w(EVEFont *font, utf8_t *str);
int eve_font_buf_w(EVEFont *font, utf8_t *buf, size_t buf_len);
uint8_t eve_font_h(EVEFont *font);
diff --git a/fw/fe310/eos/eve/eve_kbd.c b/fw/fe310/eos/eve/eve_kbd.c
index c8c1362..787e941 100644
--- a/fw/fe310/eos/eve/eve_kbd.c
+++ b/fw/fe310/eos/eve/eve_kbd.c
@@ -61,10 +61,10 @@ void eve_kbd_set_handler(EVEKbd *kbd, eve_kbd_input_handler_t putc, void *param)
kbd->param = param;
}
-int eve_kbd_touch(EVEKbd *kbd, EVETouch *touch, uint16_t evt, uint8_t tag0) {
- int ret;
+int eve_kbd_touch(EVEKbd *kbd, EVETouch *touch, uint16_t evt) {
+ int rv;
- evt = eve_touch_evt(touch, evt, tag0, 1, 126);
+ evt = eve_touch_evt(touch, evt, 1, 126);
if (touch && evt) {
int8_t touch_idx = eve_touch_get_idx(touch);
@@ -118,12 +118,12 @@ int eve_kbd_touch(EVEKbd *kbd, EVETouch *touch, uint16_t evt, uint8_t tag0) {
}
}
}
- ret = 1;
+ rv = 1;
} else {
- ret = 0;
+ rv = 0;
}
- return ret;
+ return rv;
}
uint8_t eve_kbd_draw(EVEKbd *kbd) {
diff --git a/fw/fe310/eos/eve/eve_kbd.h b/fw/fe310/eos/eve/eve_kbd.h
index b4f9874..a1f8abc 100644
--- a/fw/fe310/eos/eve/eve_kbd.h
+++ b/fw/fe310/eos/eve/eve_kbd.h
@@ -19,5 +19,5 @@ typedef struct EVEKbd {
void eve_kbd_init(EVEKbd *kbd, EVERect *g, uint32_t mem_addr, uint32_t *mem_next);
void eve_kbd_close(EVEKbd *kbd);
void eve_kbd_set_handler(EVEKbd *kbd, eve_kbd_input_handler_t putc, void *param);
-int eve_kbd_touch(EVEKbd *kbd, EVETouch *touch, uint16_t evt, uint8_t tag0);
+int eve_kbd_touch(EVEKbd *kbd, EVETouch *touch, uint16_t evt);
uint8_t eve_kbd_draw(EVEKbd *kbd);
diff --git a/fw/fe310/eos/eve/eve_phy.c b/fw/fe310/eos/eve/eve_phy.c
index cfddc80..8f170ba 100644
--- a/fw/fe310/eos/eve/eve_phy.c
+++ b/fw/fe310/eos/eve/eve_phy.c
@@ -11,69 +11,67 @@ void eve_phy_acc_init(EVEPhyAcc *param, int a) {
int eve_phy_acc_start(EVEPhyAcc *param, int x0, int y0, uint32_t t0, int v0x, int v0y) {
double v0;
- uint32_t dt = eve_get_tick() - t0;
v0 = sqrt(v0x * v0x + v0y * v0y);
param->k = 2 * v0 / param->a * EVE_RTC_FREQ;
- if ((param->k < 0) && (dt >= -param->k / 2)) {
+ if (param->k == 0) {
return 0;
}
param->x0 = x0;
param->y0 = y0;
+ param->t0 = t0;
param->v0x = v0x;
param->v0y = v0y;
return 1;
}
-int eve_phy_acc_tick(EVEPhyAcc *param, uint32_t dt, int *x, int *y) {
+int eve_phy_acc_tick(void *_param, int *x, int *y) {
+ EVEPhyAcc *param = (EVEPhyAcc *)_param;
int k = param->k;
int x0 = param->x0;
int y0 = param->y0;
int v0x = param->v0x;
int v0y = param->v0y;
- int _dt = dt;
+ uint32_t dt = eve_get_tick() - param->t0;
int more = 1;
- if (k == 0) {
- if (x) *x = x0;
- if (y) *y = y0;
- return 0;
- }
-
if ((k < 0) && (dt >= -k / 2)) {
dt = -k / 2;
more = 0;
}
- if (x) *x = x0 + (v0x * _dt + v0x * _dt / k * _dt) / EVE_RTC_FREQ;
- if (y) *y = y0 + (v0y * _dt + v0y * _dt / k * _dt) / EVE_RTC_FREQ;
+ if (x) *x = x0 + (v0x * (int)dt + v0x * (int)dt / k * (int)dt) / EVE_RTC_FREQ;
+ if (y) *y = y0 + (v0y * (int)dt + v0y * (int)dt / k * (int)dt) / EVE_RTC_FREQ;
return more;
}
/* Linear harmonic oscillator */
-void eve_phy_lho_init(EVEPhyLHO *param, int x, int y, uint32_t T, double d, uint32_t t_max) {
+void eve_phy_lho_init(EVEPhyLHO *param, uint32_t T, double d, uint32_t t_max) {
double f0 = 2 * M_PI / (T * EVE_RTC_FREQ / 1000);
if (d < 0) d = 0;
if (d > 1) d = 1;
- param->x = x;
- param->y = y;
param->f = f0 * sqrt(1 - d * d);
param->a = -d * f0;
param->t_max = t_max * EVE_RTC_FREQ / 1000;
}
-int eve_phy_lho_start(EVEPhyLHO *param, int x0, int y0) {
+int eve_phy_lho_start(EVEPhyLHO *param, int pivot_x, int pivot_y, int x0, int y0, uint32_t t0) {
+ param->pivot_x = pivot_x;
+ param->pivot_y = pivot_y;
param->x0 = x0;
param->y0 = y0;
+ param->t0 = t0;
return 1;
}
-int eve_phy_lho_tick(EVEPhyLHO *param, uint32_t dt, int *x, int *y) {
- int ax = param->x0 - param->x;
- int ay = param->y0 - param->y;
+int eve_phy_lho_tick(void *_param, int *x, int *y) {
+ EVEPhyLHO *param = (EVEPhyLHO *)_param;
+ int ax = param->x0 - param->pivot_x;
+ int ay = param->y0 - param->pivot_y;
+ uint32_t dt = eve_get_tick() - param->t0;
int more = 1;
if (param->t_max && (dt >= param->t_max)) {
@@ -86,8 +84,8 @@ int eve_phy_lho_tick(EVEPhyLHO *param, uint32_t dt, int *x, int *y) {
ay = ay * e;
if ((ax == 0) && (ay == 0)) more = 0;
}
- if (x) *x = param->x + ax * cos(param->f * dt);
- if (y) *y = param->y + ay * cos(param->f * dt);
+ if (x) *x = param->pivot_x + ax * cos(param->f * dt);
+ if (y) *y = param->pivot_y + ay * cos(param->f * dt);
return more;
}
diff --git a/fw/fe310/eos/eve/eve_phy.h b/fw/fe310/eos/eve/eve_phy.h
index e747b44..59f6299 100644
--- a/fw/fe310/eos/eve/eve_phy.h
+++ b/fw/fe310/eos/eve/eve_phy.h
@@ -5,24 +5,26 @@ typedef struct EVEPhyAcc {
int k;
int x0;
int y0;
+ uint32_t t0;
int v0x;
int v0y;
} EVEPhyAcc;
void eve_phy_acc_init(EVEPhyAcc *param, int a);
int eve_phy_acc_start(EVEPhyAcc *param, int x0, int y0, uint32_t t0, int v0x, int v0y);
-int eve_phy_acc_tick(EVEPhyAcc *param, uint32_t dt, int *x, int *y);
+int eve_phy_acc_tick(void *_param, int *x, int *y);
typedef struct EVEPhyLHO {
- int x;
- int y;
double f;
double a;
uint32_t t_max;
+ int pivot_x;
+ int pivot_y;
int x0;
int y0;
+ uint32_t t0;
} EVEPhyLHO;
-void eve_phy_lho_init(EVEPhyLHO *param, int x, int y, uint32_t T, double d, uint32_t t_max);
-int eve_phy_lho_start(EVEPhyLHO *param, int x0, int y0);
-int eve_phy_lho_tick(EVEPhyLHO *param, uint32_t dt, int *x, int *y); \ No newline at end of file
+void eve_phy_lho_init(EVEPhyLHO *param, uint32_t T, double d, uint32_t t_max);
+int eve_phy_lho_start(EVEPhyLHO *param, int x, int y, int x0, int y0, uint32_t t0);
+int eve_phy_lho_tick(void *_param, int *x, int *y); \ No newline at end of file
diff --git a/fw/fe310/eos/eve/eve_platform.c b/fw/fe310/eos/eve/eve_platform.c
index 4c0d551..916b132 100644
--- a/fw/fe310/eos/eve/eve_platform.c
+++ b/fw/fe310/eos/eve/eve_platform.c
@@ -1,46 +1,35 @@
#include <stdlib.h>
-#include <stdio.h>
-#include "eos.h"
-
-#include "eve.h"
#include "eve_platform.h"
+// #ifdef EVE_DEBUG
+#if 0
+
void *eve_malloc(size_t size) {
void *p = malloc(size);
- printf("MALLOC:%p %d\n", p, size);
+ EVE_LOG(EVE_LOG_INFO, "MALLOC:%p %d\n", p, size);
return p;
}
void eve_free(void *p) {
- printf("FREE:%p\n", p);
+ EVE_LOG(EVE_LOG_INFO, "FREE:%p\n", p);
free(p);
}
+#endif
+
void eve_sleep(uint32_t ms) {
- eos_time_sleep(ms);
+ eos_sleep(ms);
}
uint32_t eve_get_tick(void) {
- return eos_time_get_tick();
+ return eos_get_tick();
}
-void eve_sys_timer_set(uint32_t ms) {
+void eve_ostimer_set(uint32_t ms) {
eos_timer_set(EOS_TIMER_ETYPE_UI, ms);
}
-void eve_sys_timer_clear(void) {
+void eve_ostimer_clear(void) {
eos_timer_clear(EOS_TIMER_ETYPE_UI);
}
-
-void eve_select(void) {
- eos_spi_select(EOS_SPI_DEV_EVE);
-}
-
-void eve_deselect(void) {
- eos_spi_deselect();
-}
-
-int eve_selected(void) {
- return (eos_spi_dev() == EOS_SPI_DEV_EVE);
-}
diff --git a/fw/fe310/eos/eve/eve_platform.h b/fw/fe310/eos/eve/eve_platform.h
index cae7222..6f34b81 100644
--- a/fw/fe310/eos/eve/eve_platform.h
+++ b/fw/fe310/eos/eve/eve_platform.h
@@ -1,38 +1,56 @@
#include <stdint.h>
#include <stdlib.h>
+/* included from eve.h - needs relative includes */
+#include "../eos.h"
+#include "../log.h"
#include "../soc/timer.h"
#include "../soc/spi.h"
-#include "../dev/spi.h"
-#define EVE_ETYPE_INTR 1
+#ifdef EOS_DEBUG
+#define EVE_DEBUG 1
+#endif
#define EVE_RTC_FREQ EOS_TIMER_RTC_FREQ
#define EVE_SPI_FLAG_BSWAP EOS_SPI_FLAG_BSWAP
#define EVE_SPI_FLAG_TX EOS_SPI_FLAG_TX
-void *eve_malloc(size_t);
-void eve_free(void *);
+#define EVE_OK EOS_OK
+#define EVE_ERR EOS_ERR
+#define EVE_ERR_TIMEOUT EOS_ERR_TIMEOUT
+
+#define EVE_ERR_FULL EOS_ERR_FULL
+#define EVE_ERR_EMPTY EOS_ERR_EMPTY
-//#define eve_malloc malloc
-//#define eve_free free
+#define EVE_ERR_NOMEM EOS_ERR_NOMEM
-void eve_select(void);
-void eve_deselect(void);
-int eve_selected(void);
+#define EVE_LOG_DEBUG EOS_LOG_DEBUG
+#define EVE_LOG_INFO EOS_LOG_INFO
+#define EVE_LOG_ERR EOS_LOG_ERR
+#define EVE_LOG_NONE EOS_LOG_NONE
+#define EVE_LOG_LEVEL EOS_LOG_LEVEL
+#define EVE_LOG(l, ...) EOS_LOG(l, __VA_ARGS__)
-#define eve_spi_cs_set eos_spi_cs_set
-#define eve_spi_cs_clear eos_spi_cs_clear
+// #ifdef EVE_DEBUG
+#if 0
+void *eve_malloc(size_t);
+void eve_free(void *);
+#else
+#define eve_malloc malloc
+#define eve_free free
+#endif
+
+#define eve_tdelta_ms eos_tdelta_ms
+#define eve_spi_set_cs eos_spi_set_cs
+#define eve_spi_clear_cs eos_spi_clear_cs
#define eve_spi_flush eos_spi_flush
#define eve_spi_xchg8 eos_spi_xchg8
#define eve_spi_xchg16 eos_spi_xchg16
#define eve_spi_xchg24 eos_spi_xchg24
#define eve_spi_xchg32 eos_spi_xchg32
-#define eve_spi_lock eos_spi_lock
-#define eve_spi_unlock eos_spi_unlock
void eve_sleep(uint32_t ms);
uint32_t eve_get_tick(void);
-void eve_sys_timer_set(uint32_t ms);
-void eve_sys_timer_clear(void);
+void eve_ostimer_set(uint32_t ms);
+void eve_ostimer_clear(void);
diff --git a/fw/fe310/eos/eve/eve_text.c b/fw/fe310/eos/eve/eve_text.c
index b52678d..e31195a 100644
--- a/fw/fe310/eos/eve/eve_text.c
+++ b/fw/fe310/eos/eve/eve_text.c
@@ -119,8 +119,8 @@ void eve_text_scroll0(EVEText *box) {
}
}
-int eve_text_touch(EVEText *box, EVETouch *touch, uint16_t evt, uint8_t tag0) {
- evt = eve_touch_evt(touch, evt, tag0, box->tag, 1);
+int eve_text_touch(EVEText *box, EVETouch *touch, uint16_t evt) {
+ evt = eve_touch_evt(touch, evt, box->tag, 1);
if (touch && evt) {
if ((evt & EVE_TOUCH_ETYPE_TRACK_START) && (box->line_top < 0)) {
box->line_top = box->line0;
@@ -148,7 +148,7 @@ uint8_t eve_text_draw(EVEText *box, uint8_t tag) {
box->tag = tag;
if (tag != EVE_NOTAG) {
eve_cmd_dl(TAG(tag));
- eve_touch_set_opt(tag, EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_EXT_Y);
+ eve_tag_set_opt(tag, EVE_TOUCH_OPT_TRACK_Y | EVE_TOUCH_OPT_TRACK_EXT_Y);
tag++;
}
eve_cmd(CMD_APPEND, "ww", box->mem_addr + box->w * 2 * box->line_size, box->dl_size * 4);
@@ -161,14 +161,18 @@ void eve_text_putc(EVEText *box, int c) {
int line_c, line_n;
switch (c) {
- case '\b':
+ case '\b': {
eve_text_backspace(box);
break;
+ }
+
case '\r':
- case '\n':
+ case '\n': {
eve_text_newline(box);
break;
- default:
+ }
+
+ default: {
line_c = box->ch_idx / 2 / box->w;
eve_write16(box->mem_addr + box->ch_idx, 0x0200 | (c & 0xff));
@@ -178,6 +182,7 @@ void eve_text_putc(EVEText *box, int c) {
line_n = box->ch_idx / 2 / box->w;
if ((line_c != line_n) && (LINE_IDX_DIFF(line_n, box->line0, box->line_size) == box->h)) scroll1(box);
break;
+ }
}
}
diff --git a/fw/fe310/eos/eve/eve_text.h b/fw/fe310/eos/eve/eve_text.h
index 3b282c9..6a160ad 100644
--- a/fw/fe310/eos/eve/eve_text.h
+++ b/fw/fe310/eos/eve/eve_text.h
@@ -23,7 +23,7 @@ void eve_text_init(EVEText *box, EVERect *g, uint16_t w, uint16_t h, uint16_t li
void eve_text_update(EVEText *box);
void eve_text_scroll0(EVEText *box);
-int eve_text_touch(EVEText *box, EVETouch *touch, uint16_t evt, uint8_t tag0);
+int eve_text_touch(EVEText *box, EVETouch *touch, uint16_t evt);
uint8_t eve_text_draw(EVEText *box, uint8_t tag);
void eve_text_putc(EVEText *box, int c);
diff --git a/fw/fe310/eos/eve/eve_touch.c b/fw/fe310/eos/eve/eve_touch.c
index a729346..d4e5cea 100644
--- a/fw/fe310/eos/eve/eve_touch.c
+++ b/fw/fe310/eos/eve/eve_touch.c
@@ -4,10 +4,9 @@
#include "eve.h"
#include "eve_touch_engine.h"
-static uint8_t touch_tag0;
-
static EVETouch touch_obj[EVE_MAX_TOUCH];
static EVETouchTimer touch_timer;
+static EVEPhyAcc touch_acc;
static eve_touch_handler_t touch_handler;
static void *touch_handler_param;
@@ -16,7 +15,6 @@ static uint8_t touch_tag_opt[256];
void eve_touch_init(void) {
int i;
- touch_tag0 = 0;
memset(&touch_timer, 0, sizeof(touch_timer));
for (i=0; i<EVE_MAX_TOUCH; i++) {
EVETouch *touch = &touch_obj[i];
@@ -24,7 +22,7 @@ void eve_touch_init(void) {
memset(&touch_obj[i], 0, sizeof(EVETouch));
touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH;
}
- eve_vtrack_init();
+ eve_phy_acc_init(&touch_acc, -EVE_TOUCH_ACC_A);
}
void eve_handle_touch(uint16_t intr_flags) {
@@ -68,23 +66,17 @@ void eve_handle_touch(uint16_t intr_flags) {
}
}
if (timer_evt & EVE_TOUCH_ETYPE_TRACK) {
- EVEVTrack *vtrack = eve_vtrack_get();
-
_eevt |= EVE_TOUCH_EETYPE_TRACK_ABORT;
_touch_evt |= (EVE_TOUCH_ETYPE_TRACK_STOP | EVE_TOUCH_ETYPE_TRACK_ABORT);
- if (vtrack->stop) vtrack->stop(touch, vtrack->param);
- }
- if (timer_evt & EVE_TOUCH_ETYPE_TIMER) {
- _eevt |= EVE_TOUCH_EETYPE_TIMER_ABORT;
- _touch_evt |= EVE_TOUCH_ETYPE_TIMER_ABORT;
+ eve_vtrack_stop();
}
if (touch_handler && _touch_evt) {
- touch_handler(touch_timer.touch, _touch_evt, touch_timer.tag0, touch_handler_param);
+ touch_handler(touch_timer.touch, _touch_evt, touch_handler_param);
}
eve_timer_clear(touch);
}
- touch_evt |= EVE_TOUCH_ETYPE_POINT | _evt;
+ touch_evt = EVE_TOUCH_ETYPE_POINT0 | _evt;
touch->eevt = _eevt;
touch->tag0 = 0;
touch->tag = 0;
@@ -104,10 +96,10 @@ void eve_handle_touch(uint16_t intr_flags) {
touch->vx = vx;
touch->vy = vy;
- touch->t = now;
}
touch->x = touch_x;
touch->y = touch_y;
+ touch->t = now;
timer_evt = eve_timer_get_evt(touch);
check_track = touch->tracker.tag && !touch->tracker.track;
@@ -120,38 +112,31 @@ void eve_handle_touch(uint16_t intr_flags) {
dx = dx < 0 ? -dx : dx;
dy = dy < 0 ? -dy : dy;
if (check_track) {
- if ((dx > EVE_TOUCH_THRESHOLD_X) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_X)) {
- touch->tracker.tag = 0;
- }
- if ((dy > EVE_TOUCH_THRESHOLD_Y) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_Y)) {
+ if (((dx > EVE_TOUCH_THRESHOLD_X) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_X)) ||
+ ((dy > EVE_TOUCH_THRESHOLD_Y) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_Y))) {
touch->tracker.tag = 0;
}
if (touch->tracker.tag && ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y))) {
- int track_x = 0;
-
- if ((dx > EVE_TOUCH_THRESHOLD_X) && (dx > EVE_TOUCH_THRESHOLD_Y) && ((touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY) == EVE_TOUCH_OPT_TRACK_XY)) {
- if (dx > dy) {
- track_x = 1;
- }
- } else if (dx > EVE_TOUCH_THRESHOLD_X) {
- track_x = 1;
- }
- if (track_x) {
- touch->eevt |= touch->x > touch->x0 ? EVE_TOUCH_EETYPE_TRACK_RIGHT : EVE_TOUCH_EETYPE_TRACK_LEFT;
- } else {
- touch->eevt |= touch->y > touch->y0 ? EVE_TOUCH_EETYPE_TRACK_DOWN : EVE_TOUCH_EETYPE_TRACK_UP;
- }
+ int track_x, track_y;
+
+ track_x = 0;
+ track_y = 0;
+ if ((touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_X) && (dx > EVE_TOUCH_THRESHOLD_X)) track_x = 1;
+ if ((touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_Y) && (dy > EVE_TOUCH_THRESHOLD_Y)) track_y = 1;
+
+ if (track_x) touch->eevt |= touch->x > touch->x0 ? EVE_TOUCH_EETYPE_TRACK_RIGHT : EVE_TOUCH_EETYPE_TRACK_LEFT;
+ if (track_y) touch->eevt |= touch->y > touch->y0 ? EVE_TOUCH_EETYPE_TRACK_DOWN : EVE_TOUCH_EETYPE_TRACK_UP;
+
touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
touch->tracker.track = 1;
- touch->t = now;
}
}
if (check_timer && ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y))) {
eve_timer_set_evt(touch, timer_evt & ~(EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP2));
}
}
- if (touch->tracker.tag && touch->tracker.track) {
- if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK) touch_evt |= EVE_TOUCH_ETYPE_TRACK;
+ if (touch->tracker.track) {
+ if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY) touch_evt |= EVE_TOUCH_ETYPE_TRACK;
if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_REG) touch_evt |= EVE_TOUCH_ETYPE_TRACK_REG;
}
if (touch_evt & EVE_TOUCH_ETYPE_TRACK_REG) {
@@ -171,19 +156,17 @@ void eve_handle_touch(uint16_t intr_flags) {
if (timer_evt & EVE_TOUCH_ETYPE_LPRESS) {
eve_timer_set_evt(touch, timer_evt & ~EVE_TOUCH_ETYPE_LPRESS);
}
- if (touch->tracker.tag && touch->tracker.track) {
+ if (touch->tracker.track) {
int start = 0;
uint8_t opt = touch_tag_opt[touch->tracker.tag];
uint8_t track_ext = ((opt & EVE_TOUCH_OPT_TRACK_EXT_X) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_X)) ||
((opt & EVE_TOUCH_OPT_TRACK_EXT_Y) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_Y));
if (!eve_timer_get_evt(NULL) && track_ext) {
- EVEVTrack *vtrack = eve_vtrack_get();
-
- if (vtrack->start) start = vtrack->start(touch, vtrack->param);
+ start = eve_phy_acc_start(&touch_acc, touch->x, touch->y, touch->t, touch->vx, touch->vy);
}
if (start) {
- eve_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, touch_tag0, EVE_TOUCH_TIMEOUT_TRACK);
+ eos_vtrack_cont(&touch_acc, eve_phy_acc_tick, EVE_TOUCH_TIMEOUT_TRACK, touch);
} else {
touch_evt |= EVE_TOUCH_ETYPE_TRACK_STOP;
}
@@ -196,23 +179,22 @@ void eve_handle_touch(uint16_t intr_flags) {
if (touch_tag != touch->tag) {
if (touch_tag) {
- if (!touch_tag0) touch_tag0 = touch_tag;
if (!touch->tag0) {
+ touch_evt |= EVE_TOUCH_ETYPE_POINT;
touch->tag0 = touch_tag;
- if (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_REG)) {
+ if (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_REG)) {
touch->tracker.tag = touch_tag;
}
if (touch->tracker.tag && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY)) {
touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
touch->tracker.track = 1;
- touch->t = now;
}
if (!eve_timer_get_evt(NULL) && (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_LPRESS | EVE_TOUCH_OPT_TAP2))) {
uint16_t _evt = 0;
if (touch_tag_opt[touch_tag] & EVE_TOUCH_OPT_LPRESS) _evt |= EVE_TOUCH_ETYPE_LPRESS;
if (touch_tag_opt[touch_tag] & EVE_TOUCH_OPT_TAP2) _evt |= EVE_TOUCH_ETYPE_TAP2;
- eve_timer_set(touch, _evt, touch_tag0, EVE_TOUCH_TIMEOUT_TAP);
+ eve_timer_set(touch, _evt, EVE_TOUCH_TIMEOUT_TAP);
}
}
}
@@ -224,7 +206,7 @@ void eve_handle_touch(uint16_t intr_flags) {
}
if (touch_handler && touch_evt) {
- touch_handler(touch, touch_evt, touch_tag0, touch_handler_param);
+ touch_handler(touch, touch_evt, touch_handler_param);
}
}
}
@@ -244,30 +226,19 @@ void eve_handle_time(void) {
touch_evt |= EVE_TOUCH_ETYPE_TAP1;
}
if (touch_timer.evt & EVE_TOUCH_ETYPE_TRACK) {
- EVEVTrack *vtrack = eve_vtrack_get();
-
- if (vtrack->tick) {
- touch_evt |= EVE_TOUCH_ETYPE_TRACK;
- more = vtrack->tick(touch, vtrack->param);
- }
+ touch_evt |= EVE_TOUCH_ETYPE_TRACK;
+ more = eve_vtrack_tick(&touch_evt);
if (!more) {
touch_evt |= EVE_TOUCH_ETYPE_TRACK_STOP;
- if (vtrack->stop) vtrack->stop(touch, vtrack->param);
}
}
- if (touch_timer.evt & EVE_TOUCH_ETYPE_TIMER) {
- touch_evt |= EVE_TOUCH_ETYPE_TIMER;
- more = 1;
- }
- if (more) {
- eve_sys_timer_set(touch_timer.to);
- } else {
- touch_timer.evt = 0;
+ if (!more) {
+ eve_timer_reset();
}
if (touch_handler && touch_evt) {
- touch_handler(touch, touch_evt, touch_timer.tag0, touch_handler_param);
+ touch_handler(touch, touch_evt, touch_handler_param);
}
}
}
@@ -286,20 +257,17 @@ int8_t eve_touch_get_idx(EVETouch *touch) {
return touch - touch_obj;
}
-uint16_t eve_touch_evt(EVETouch *touch, uint16_t evt, uint8_t tag0, uint8_t tag_min, uint8_t tag_n) {
+uint16_t eve_touch_evt(EVETouch *touch, uint16_t evt, uint8_t tag_min, uint8_t tag_n) {
int tag_max;
uint8_t _tag;
uint16_t _evt;
if (tag_min == EVE_NOTAG) return 0;
+ if (evt & EVE_TOUCH_ETYPE_EXT) return 0;
tag_max = tag_min + tag_n;
- if ((tag0 < tag_min) || (tag0 >= tag_max)) return 0;
+ if ((touch->tag0 < tag_min) || (touch->tag0 >= tag_max)) return 0;
- _evt = evt & (EVE_TOUCH_ETYPE_TIMER_MASK | EVE_TOUCH_ETYPE_USR_MASK);
- if (touch == NULL) return _evt;
-
- _evt |= evt & EVE_TOUCH_ETYPE_POINT_MASK;
if (evt & EVE_TOUCH_ETYPE_TAG) {
_tag = touch->tag;
if ((_tag >= tag_min) && (_tag < tag_max)) _evt |= EVE_TOUCH_ETYPE_TAG;
@@ -312,79 +280,57 @@ uint16_t eve_touch_evt(EVETouch *touch, uint16_t evt, uint8_t tag0, uint8_t tag_
_tag = touch->tracker.tag;
if ((_tag >= tag_min) && (_tag < tag_max)) _evt |= evt & EVE_TOUCH_ETYPE_TRACK_MASK;
}
- if (evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP1 | EVE_TOUCH_ETYPE_TAP2)) {
- _tag = touch->tag0;
- if ((_tag >= tag_min) && (_tag < tag_max)) _evt |= evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP1 | EVE_TOUCH_ETYPE_TAP2);
+ if (evt & (EVE_TOUCH_ETYPE_POINT_MASK | EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP1 | EVE_TOUCH_ETYPE_TAP2 | EVE_TOUCH_ETYPE_USR_MASK)) {
+ _evt |= evt & (EVE_TOUCH_ETYPE_POINT_MASK | EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TAP1 | EVE_TOUCH_ETYPE_TAP2 | EVE_TOUCH_ETYPE_USR_MASK);
}
return _evt;
}
-void eve_touch_set_opt(uint8_t tag, uint8_t opt) {
+void eve_tag_set_opt(uint8_t tag, uint8_t opt) {
+ if (tag == EVE_NOTAG) return;
touch_tag_opt[tag] = opt;
}
-uint8_t eve_touch_get_opt(uint8_t tag) {
+uint8_t eve_tag_get_opt(uint8_t tag) {
+ if (tag == EVE_NOTAG) return 0;
return touch_tag_opt[tag];
}
-void eve_touch_clear_opt(void) {
+void eve_tag_clear_opt(void) {
memset(touch_tag_opt, 0, sizeof(touch_tag_opt));
}
-void eve_timer_set(EVETouch *touch, uint16_t evt, uint8_t tag0, uint32_t to) {
+void eve_timer_set(EVETouch *touch, uint16_t evt, uint32_t tick_ms) {
touch_timer.touch = touch;
touch_timer.evt = evt;
- touch_timer.tag0 = tag0;
- touch_timer.to = to;
- eve_sys_timer_set(to);
+ eve_ostimer_set(tick_ms);
}
void eve_timer_clear(EVETouch *touch) {
eve_timer_set_evt(touch, 0);
}
+void eve_timer_reset(void) {
+ touch_timer.touch = NULL;
+ touch_timer.evt = 0;
+}
+
void eve_timer_set_evt(EVETouch *touch, uint16_t evt) {
if ((touch == NULL) || (touch == touch_timer.touch)) {
touch_timer.evt = evt;
- } else if (touch_timer.touch == NULL) {
- touch_timer.evt = evt;
}
if (!touch_timer.evt) {
- eve_sys_timer_clear();
+ eve_ostimer_clear();
touch_timer.touch = NULL;
- touch_timer.tag0 = 0;
- touch_timer.to = 0;
}
}
uint16_t eve_timer_get_evt(EVETouch *touch) {
- uint16_t ret = 0;
+ uint16_t rv = 0;
if ((touch == NULL) || (touch_timer.touch == touch)) {
- ret = touch_timer.evt;
- } else if (touch_timer.touch == NULL) {
- ret = touch_timer.evt;
+ rv = touch_timer.evt;
}
- return ret;
-}
-
-EVETouchTimer *eve_timer_get_obj(void) {
- return &touch_timer;
-}
-
-void eve_timer_start(uint8_t tag0, uint32_t to) {
- if (!touch_timer.evt) eve_timer_set(NULL, EVE_TOUCH_ETYPE_TIMER, tag0, to);
-}
-
-void eve_timer_stop(void) {
- if (touch_timer.touch == NULL) eve_timer_clear(NULL);
-}
-
-int eve_timer_running(void) {
- return (touch_timer.evt == EVE_TOUCH_ETYPE_TIMER);
-}
-
-void eve_touch_clear_tag0(void) {
- touch_tag0 = 0;
+ return rv;
}
diff --git a/fw/fe310/eos/eve/eve_touch.h b/fw/fe310/eos/eve/eve_touch.h
index 8ec6e0e..1f639b3 100644
--- a/fw/fe310/eos/eve/eve_touch.h
+++ b/fw/fe310/eos/eve/eve_touch.h
@@ -1,5 +1,7 @@
#include <stdint.h>
+#define EVE_TOUCH_ACC_A 10000
+
#define EVE_TOUCH_TIMEOUT_TAP 1000
#define EVE_TOUCH_TIMEOUT_TRACK 20
@@ -13,23 +15,22 @@
/* events */
#define EVE_TOUCH_ETYPE_TAG 0x0001
#define EVE_TOUCH_ETYPE_TAG_UP 0x0002
-#define EVE_TOUCH_ETYPE_POINT 0x0004
-#define EVE_TOUCH_ETYPE_POINT_UP 0x0008
-#define EVE_TOUCH_ETYPE_TRACK 0x0010
-#define EVE_TOUCH_ETYPE_TRACK_START 0x0020
-#define EVE_TOUCH_ETYPE_TRACK_STOP 0x0040
-#define EVE_TOUCH_ETYPE_TRACK_ABORT 0x0080
-#define EVE_TOUCH_ETYPE_TIMER 0x0100
-#define EVE_TOUCH_ETYPE_TIMER_ABORT 0x0200
-#define EVE_TOUCH_ETYPE_TRACK_REG 0x0400
-#define EVE_TOUCH_ETYPE_LPRESS 0x0800
-#define EVE_TOUCH_ETYPE_TAP1 0x1000
-#define EVE_TOUCH_ETYPE_TAP2 0x2000
-#define EVE_TOUCH_ETYPE_USR 0x4000
-#define EVE_TOUCH_ETYPE_USR1 0x8000
+#define EVE_TOUCH_ETYPE_POINT0 0x0004 /* emitted without tag0, possibly useless */
+#define EVE_TOUCH_ETYPE_POINT 0x0008
+#define EVE_TOUCH_ETYPE_POINT_UP 0x0010
+#define EVE_TOUCH_ETYPE_TRACK 0x0020
+#define EVE_TOUCH_ETYPE_TRACK_START 0x0040
+#define EVE_TOUCH_ETYPE_TRACK_STOP 0x0080
+#define EVE_TOUCH_ETYPE_TRACK_ABORT 0x0100
+#define EVE_TOUCH_ETYPE_TRACK_REG 0x0200
+#define EVE_TOUCH_ETYPE_LPRESS 0x0400
+#define EVE_TOUCH_ETYPE_TAP1 0x0800
+#define EVE_TOUCH_ETYPE_TAP2 0x1000
+#define EVE_TOUCH_ETYPE_USR 0x2000
+#define EVE_TOUCH_ETYPE_USR1 0x4000
+#define EVE_TOUCH_ETYPE_EXT 0x8000 /* events emitted outside of eve_touch scope */
#define EVE_TOUCH_ETYPE_TRACK_MASK (EVE_TOUCH_ETYPE_TRACK | EVE_TOUCH_ETYPE_TRACK_START | EVE_TOUCH_ETYPE_TRACK_STOP | EVE_TOUCH_ETYPE_TRACK_ABORT | EVE_TOUCH_ETYPE_TRACK_REG)
-#define EVE_TOUCH_ETYPE_TIMER_MASK (EVE_TOUCH_ETYPE_TIMER | EVE_TOUCH_ETYPE_TIMER_ABORT)
#define EVE_TOUCH_ETYPE_POINT_MASK (EVE_TOUCH_ETYPE_POINT | EVE_TOUCH_ETYPE_POINT_UP)
#define EVE_TOUCH_ETYPE_USR_MASK (EVE_TOUCH_ETYPE_USR | EVE_TOUCH_ETYPE_USR1)
@@ -44,7 +45,6 @@
#define EVE_TOUCH_EETYPE_TRACK_DOWN 0x0080
#define EVE_TOUCH_EETYPE_TRACK_ABORT 0x0100
-#define EVE_TOUCH_EETYPE_TIMER_ABORT 0x0200
#define EVE_TOUCH_EETYPE_USR 0x1000
#define EVE_TOUCH_EETYPE_USR1 0x2000
@@ -54,11 +54,9 @@
#define EVE_TOUCH_EETYPE_TRACK_X (EVE_TOUCH_EETYPE_TRACK_LEFT | EVE_TOUCH_EETYPE_TRACK_RIGHT)
#define EVE_TOUCH_EETYPE_TRACK_Y (EVE_TOUCH_EETYPE_TRACK_UP | EVE_TOUCH_EETYPE_TRACK_DOWN)
#define EVE_TOUCH_EETYPE_TRACK_XY (EVE_TOUCH_EETYPE_TRACK_X | EVE_TOUCH_EETYPE_TRACK_Y)
-#define EVE_TOUCH_EETYPE_ABORT (EVE_TOUCH_EETYPE_TRACK_ABORT | EVE_TOUCH_EETYPE_TIMER_ABORT)
/* tag options */
-#define EVE_TOUCH_OPT_TRACK 0x01
-#define EVE_TOUCH_OPT_TRACK_REG 0x02
+#define EVE_TOUCH_OPT_TRACK_REG 0x01
#define EVE_TOUCH_OPT_TRACK_X 0x04
#define EVE_TOUCH_OPT_TRACK_Y 0x08
#define EVE_TOUCH_OPT_TRACK_EXT_X 0x10
@@ -90,12 +88,10 @@ typedef struct EVETouch {
typedef struct EVETouchTimer {
EVETouch *touch;
- uint32_t to;
uint16_t evt;
- uint8_t tag0;
} EVETouchTimer;
-typedef void (*eve_touch_handler_t) (EVETouch *, uint16_t, uint8_t, void *);
+typedef void (*eve_touch_handler_t) (EVETouch *, uint16_t, void *);
void eve_touch_init(void);
void eve_handle_touch(uint16_t intr_flags);
@@ -104,19 +100,14 @@ void eve_handle_time(void);
void eve_touch_set_handler(eve_touch_handler_t handler, void *handler_param);
EVETouch *eve_touch_get_obj(int i);
int8_t eve_touch_get_idx(EVETouch *touch);
-uint16_t eve_touch_evt(EVETouch *touch, uint16_t evt, uint8_t tag0, uint8_t tag_min, uint8_t tag_n);
+uint16_t eve_touch_evt(EVETouch *touch, uint16_t evt, uint8_t tag_min, uint8_t tag_n);
-void eve_touch_set_opt(uint8_t tag, uint8_t opt);
-uint8_t eve_touch_get_opt(uint8_t tag);
-void eve_touch_clear_opt(void);
+void eve_tag_set_opt(uint8_t tag, uint8_t opt);
+uint8_t eve_tag_get_opt(uint8_t tag);
+void eve_tag_clear_opt(void);
-void eve_timer_set(EVETouch *touch, uint16_t evt, uint8_t tag0, uint32_t to);
+void eve_timer_set(EVETouch *touch, uint16_t evt, uint32_t to);
void eve_timer_clear(EVETouch *touch);
+void eve_timer_reset(void);
void eve_timer_set_evt(EVETouch *touch, uint16_t evt);
uint16_t eve_timer_get_evt(EVETouch *touch);
-EVETouchTimer *eve_timer_get_obj(void);
-
-void eve_timer_start(uint8_t tag0, uint32_t to);
-void eve_timer_stop(void);
-int eve_timer_running(void);
-void eve_touch_clear_tag0(void);
diff --git a/fw/fe310/eos/eve/eve_touch_engine.c b/fw/fe310/eos/eve/eve_touch_engine.c
index 2c75ca0..7c5b39f 100644
--- a/fw/fe310/eos/eve/eve_touch_engine.c
+++ b/fw/fe310/eos/eve/eve_touch_engine.c
@@ -26,36 +26,66 @@ static const uint32_t _reg_track[] = {
REG_TRACKER_4
};
-void eve_touch_init_engine(void) {
+void eve_touch_init_engine(uint16_t engine) {
/* configure touch */
eve_write8(REG_CPURESET, 2); /* touch engine reset */
- eve_write16(REG_TOUCH_CONFIG, 0x4000); /* host mode multi touch */
+ eve_write16(REG_TOUCH_CONFIG, engine); /* set touch engine */
eve_write8(REG_CTOUCH_EXTENDED, 0x00); /* set extended mode */
eve_write8(REG_CPURESET, 0); /* clear reset */
- eve_touch_ehost_enter(0, 0x8000, 0x8000);
- eve_touch_ehost_end();
+ if (engine == EVE_TOUCH_ENGINE_HOST) {
+ eve_touch_ehost_enter(0, 0x8000, 0x8000);
+ eve_touch_ehost_end();
+ }
}
-void eve_touch_start(void) {
+uint16_t eve_touch_get_engine(void) {
+ return (eve_read16(REG_TOUCH_CONFIG) & EVE_TOUCH_ENGINE_MASK);
+}
+
+void eve_touch_set_engine(uint16_t engine) {
+ uint16_t reg = eve_read16(REG_TOUCH_CONFIG);
+
+ reg &= ~EVE_TOUCH_ENGINE_MASK;
+ reg |= engine;
+
+ eve_write8(REG_CPURESET, 2); /* touch engine reset */
+ eve_write8(REG_TOUCH_CONFIG, reg); /* set touch engine */
+ eve_write8(REG_CPURESET, 0); /* clear reset */
+
+ if (engine == EVE_TOUCH_ENGINE_HOST) {
+ eve_touch_ehost_enter(0, 0x8000, 0x8000);
+ eve_touch_ehost_end();
+ }
+}
+
+void eve_touch_intr_enable(void) {
uint16_t intr_mask;
intr_mask = eve_read16(REG_INT_MASK);
eve_write16(REG_INT_MASK, intr_mask | (EVE_INT_CONVCOMPLETE | EVE_INT_TAG));
-
- eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS);
}
-void eve_touch_stop(void) {
+void eve_touch_intr_disable(void) {
uint16_t intr_mask;
intr_mask = eve_read16(REG_INT_MASK);
eve_write16(REG_INT_MASK, intr_mask & ~(EVE_INT_CONVCOMPLETE | EVE_INT_TAG));
- eve_timer_clear(NULL);
+}
+void eve_touch_start(void) {
+ eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS);
+}
+
+void eve_touch_stop(void) {
+ eve_timer_clear(NULL);
eve_write8(REG_TOUCH_MODE, EVE_TMODE_OFF);
}
+int eve_touch_get_extended(void) {
+ return !eve_read8(REG_CTOUCH_EXTENDED);
+}
+
void eve_touch_set_extended(int extended) {
eve_write8(REG_CPURESET, 2); /* touch engine reset */
eve_write8(REG_CTOUCH_EXTENDED, !extended); /* set / clear extended mode */
diff --git a/fw/fe310/eos/eve/eve_touch_engine.h b/fw/fe310/eos/eve/eve_touch_engine.h
index 3a7508f..8eb7333 100644
--- a/fw/fe310/eos/eve/eve_touch_engine.h
+++ b/fw/fe310/eos/eve/eve_touch_engine.h
@@ -1,9 +1,20 @@
#include <stdint.h>
-void eve_touch_init_engine(void);
+#define EVE_TOUCH_ENGINE_HOST 0x4000
+#define EVE_TOUCH_ENGINE_FOCALTECH 0x0380
+#define EVE_TOUCH_ENGINE_GOODIX 0x05D0
+
+#define EVE_TOUCH_ENGINE_MASK 0x4FF0
+
+void eve_touch_init_engine(uint16_t engine);
+uint16_t eve_touch_get_engine(void);
+void eve_touch_set_engine(uint16_t engine);
+void eve_touch_intr_enable(void);
+void eve_touch_intr_disable(void);
void eve_touch_start(void);
void eve_touch_stop(void);
+int eve_touch_get_extended(void);
void eve_touch_set_extended(int extended);
void eve_touch_get_matrix(uint32_t *touch_matrix);
void eve_touch_set_matrix(const uint32_t *touch_matrix);
diff --git a/fw/fe310/eos/eve/eve_vtrack.c b/fw/fe310/eos/eve/eve_vtrack.c
index a7619fb..6cc3c76 100644
--- a/fw/fe310/eos/eve/eve_vtrack.c
+++ b/fw/fe310/eos/eve/eve_vtrack.c
@@ -4,53 +4,63 @@
#include "eve.h"
static EVEVTrack vtrack;
-static EVEPhyAcc vtrack_acc;
void eve_vtrack_init(void) {
- eve_phy_acc_init(&vtrack_acc, -EVE_VTRACK_ACC_A);
eve_vtrack_reset();
}
-EVEVTrack *eve_vtrack_get(void) {
- return &vtrack;
+void eve_vtrack_reset(void) {
+ vtrack.param = NULL;
+ vtrack.tick_f = NULL;
+ vtrack.tick_ms = 0;
+ vtrack.touch = NULL;
}
-void eve_vtrack_set(eve_vtrack_start_t start, eve_vtrack_tick_t tick, eve_vtrack_stop_t stop, void *param) {
- vtrack.start = start;
- vtrack.tick = tick;
- vtrack.stop = stop;
+static void vtrack_start(void *param, eve_vtrack_tick_t tick_f, uint32_t tick_ms, EVETouch *touch, uint8_t tag) {
+ eve_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, tick_ms);
vtrack.param = param;
+ vtrack.tick_f = tick_f;
+ vtrack.tick_ms = tick_ms;
+ vtrack.touch = touch;
+ if (tag != EVE_NOTAG) {
+ touch->tracker.tag = tag;
+ touch->tracker.track = 1;
+ }
}
-void eve_vtrack_reset(void) {
- eve_vtrack_set(eve_vtrack_acc_start, eve_vtrack_acc_tick, NULL, &vtrack_acc);
-}
-
-int eve_vtrack_start(EVETouch *touch, uint8_t tag0, uint32_t to) {
- if (vtrack.start) {
- int start;
-
- start = vtrack.start(touch, vtrack.param);
- if (start) eve_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, tag0, to);
+void eve_vtrack_start(void *param, eve_vtrack_tick_t tick_f, uint32_t tick_ms, EVETouch *touch, uint8_t tag) {
+ vtrack_start(param, tick_f, tick_ms, touch, tag);
- return start;
- }
- return 0;
+ /* ensure that track start event is emitted on first vtrack tick */
+ touch->eevt &= ~EVE_TOUCH_EETYPE_TRACK_XY;
}
-void eve_vtrack_stop(EVETouch *touch) {
- eve_timer_clear(touch);
- eve_vtrack_reset();
+void eos_vtrack_cont(void *param, eve_vtrack_tick_t tick_f, uint32_t tick_ms, EVETouch *touch) {
+ vtrack_start(param, tick_f, tick_ms, touch, EVE_NOTAG);
}
-int eve_vtrack_acc_start(EVETouch *touch, void *p) {
- EVEPhyAcc *param = (EVEPhyAcc *)p;
+int eve_vtrack_tick(uint16_t *touch_evt) {
+ EVETouch *touch = vtrack.touch;
+ int more = 0;
- return eve_phy_acc_start(param, touch->x, touch->y, touch->t, touch->vx, touch->vy);
-}
+ if (vtrack.tick_f) {
+ more = vtrack.tick_f(vtrack.param, &touch->x, &touch->y);
+ }
+ if (more) {
+ eve_ostimer_set(vtrack.tick_ms);
+ if (!(touch->eevt & EVE_TOUCH_EETYPE_TRACK_XY)) {
+ if ((eve_tag_get_opt(touch->tracker.tag) & EVE_TOUCH_OPT_TRACK_X) && (touch->x != touch->x0)) touch->eevt |= touch->x > touch->x0 ? EVE_TOUCH_EETYPE_TRACK_RIGHT : EVE_TOUCH_EETYPE_TRACK_LEFT;
+ if ((eve_tag_get_opt(touch->tracker.tag) & EVE_TOUCH_OPT_TRACK_Y) && (touch->y != touch->y0)) touch->eevt |= touch->y > touch->y0 ? EVE_TOUCH_EETYPE_TRACK_DOWN : EVE_TOUCH_EETYPE_TRACK_UP;
+ *touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
+ }
+ } else {
+ eve_timer_reset();
+ eve_vtrack_reset();
+ }
-int eve_vtrack_acc_tick(EVETouch *touch, void *p) {
- EVEPhyAcc *param = (EVEPhyAcc *)p;
+ return more;
+}
- return eve_phy_acc_tick(param, eve_get_tick() - touch->t, &touch->x, &touch->y);
+void eve_vtrack_stop(void) {
+ eve_vtrack_reset();
}
diff --git a/fw/fe310/eos/eve/eve_vtrack.h b/fw/fe310/eos/eve/eve_vtrack.h
index 8455502..142d77b 100644
--- a/fw/fe310/eos/eve/eve_vtrack.h
+++ b/fw/fe310/eos/eve/eve_vtrack.h
@@ -1,24 +1,17 @@
#include <stdint.h>
-#define EVE_VTRACK_ACC_A 10000
-
-typedef int (*eve_vtrack_start_t) (EVETouch *, void *);
-typedef int (*eve_vtrack_tick_t) (EVETouch *, void *);
-typedef void (*eve_vtrack_stop_t) (EVETouch *, void *);
+typedef int (*eve_vtrack_tick_t) (void *, int *, int *);
typedef struct EVEVTrack {
- eve_vtrack_start_t start;
- eve_vtrack_tick_t tick;
- eve_vtrack_stop_t stop;
void *param;
+ eve_vtrack_tick_t tick_f;
+ uint32_t tick_ms;
+ EVETouch *touch;
} EVEVTrack;
void eve_vtrack_init(void);
-EVEVTrack *eve_vtrack_get(void);
-void eve_vtrack_set(eve_vtrack_start_t start, eve_vtrack_tick_t tick, eve_vtrack_stop_t stop, void *param);
void eve_vtrack_reset(void);
-int eve_vtrack_start(EVETouch *touch, uint8_t tag0, uint32_t to);
-void eve_vtrack_stop(EVETouch *touch);
-
-int eve_vtrack_acc_start(EVETouch *touch, void *p);
-int eve_vtrack_acc_tick(EVETouch *touch, void *p); \ No newline at end of file
+void eve_vtrack_start(void *param, eve_vtrack_tick_t tick_f, uint32_t tick_ms, EVETouch *touch, uint8_t tag);
+void eos_vtrack_cont(void *param, eve_vtrack_tick_t tick_f, uint32_t tick_ms, EVETouch *touch);
+int eve_vtrack_tick(uint16_t *touch_evt);
+void eve_vtrack_stop(void); \ No newline at end of file
diff --git a/fw/fe310/eos/eve/screen/form.c b/fw/fe310/eos/eve/screen/form.c
index 3e5b97c..de03bfd 100644
--- a/fw/fe310/eos/eve/screen/form.c
+++ b/fw/fe310/eos/eve/screen/form.c
@@ -12,7 +12,8 @@
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
-static void widgets_destroy(EVEWidget *widget, uint16_t widget_size) {
+static void widgets_destroy(EVEWidget *widgets, uint16_t widget_size) {
+ EVEWidget *widget = widgets;
int i;
for (i=0; i<widget_size; i++) {
@@ -20,65 +21,60 @@ static void widgets_destroy(EVEWidget *widget, uint16_t widget_size) {
eve_widget_destroy(widget);
widget = eve_widget_next(widget);
}
+ eve_free(widgets);
}
-EVEPage *eve_form_create(EVEWindow *window, EVEViewStack *stack, EVEFormSpec spec[], uint16_t spec_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor) {
+int eve_form_create(EVEPage *page, EVEWindow *window, EVEVStack *stack, EVEFormSpec spec[], uint16_t spec_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor) {
EVEWidget *widgets;
EVEWidget *widget;
EVELabel *label;
- EVEPage *page;
int w_size = 0;
- int i, r;
+ int i, rv;
if (uievt == NULL) uievt = eve_form_uievt;
if (destructor == NULL) destructor = eve_form_destroy;
- page = eve_malloc(sizeof(EVEPage));
- if (page == NULL) {
- return NULL;
- }
- eve_form_init(page, window, stack, NULL, 0, uievt, destructor);
for (i=0; i<spec_size; i++) {
w_size += eve_widget_size(spec[i].widget.type);
}
widgets = eve_malloc(w_size);
if (widgets == NULL) {
- eve_free(page);
- return NULL;
+ return EVE_ERR_NOMEM;
}
+ eve_form_init(page, window, stack, NULL, 0, uievt, destructor);
+
widget = widgets;
for (i=0; i<spec_size; i++) {
- r = eve_widget_create(widget, &spec[i].widget, page);
- if (r) {
+ rv = eve_widget_create(widget, &spec[i].widget, page);
+ if (rv) {
widgets_destroy(widgets, i);
- eve_free(widgets);
- eve_free(page);
- return NULL;
+ return rv;
}
if (spec[i].label.title) {
+ rv = EVE_OK;
label = eve_malloc(sizeof(EVELabel));
- if (label == NULL) {
+ if (label) rv = eve_label_create(label, &spec[i].label, page);
+ if ((label == NULL) || rv) {
+ if (label) eve_free(label);
eve_widget_destroy(widget);
widgets_destroy(widgets, i);
- eve_free(widgets);
- eve_free(page);
- return NULL;
+ return label ? rv : EVE_ERR_NOMEM;
}
- eve_label_create(label, &spec[i].label, page);
eve_widget_set_label(widget, label);
}
- if (widget->g.w == 0) widget->g.w = window->g.w - (widget->label ? widget->label->g.w : 0);
+ if ((widget->g.w == 0) && widget->label) widget->g.w = window->g.w - widget->label->g.w;
+ if (widget->g.w == 0) widget->g.w = window->g.w;
widget = eve_widget_next(widget);
}
eve_form_set_widget(page, widgets, spec_size);
- return page;
+ return EVE_OK;
}
-void eve_form_init(EVEPage *page, EVEWindow *window, EVEViewStack *stack, EVEWidget *widget, uint16_t widget_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor) {
- eve_page_init(page, window, stack, NULL, 0, EVE_PAGE_OPT_SCROLL_Y | EVE_PAGE_OPT_SCROLL_BACK | EVE_PAGE_OPT_TRACK_EXT_Y, eve_page_draw, eve_page_touch, uievt, destructor);
- if (widget) eve_form_set_widget(page, widget, widget_size);
+void eve_form_init(EVEPage *page, EVEWindow *window, EVEVStack *stack, EVEWidget *widget, uint16_t widget_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor) {
+ eve_page_init(page, window, stack, widget, widget_size, EVE_PAGE_OPT_SCROLL_Y | EVE_PAGE_OPT_SCROLL_BACK | EVE_PAGE_OPT_TRACK_EXT_Y, eve_page_draw, eve_page_touch, uievt, destructor);
+ if (widget) eve_form_update_g(page, NULL);
}
void eve_form_set_widget(EVEPage *page, EVEWidget *widget, uint16_t widget_size) {
@@ -88,42 +84,24 @@ void eve_form_set_widget(EVEPage *page, EVEWidget *widget, uint16_t widget_size)
void eve_form_destroy(EVEPage *page) {
widgets_destroy(page->widget, page->widget_size);
- eve_free(page->widget);
- eve_free(page);
}
-int eve_form_uievt(EVEPage *page, uint16_t evt, void *param) {
+void eve_form_uievt(EVEPage *page, uint16_t evt, void *param) {
switch (evt) {
case EVE_UIEVT_WIDGET_UPDATE_G:
eve_form_update_g(page, (EVEWidget *)param);
break;
- case EVE_UIEVT_WIDGET_FOCUS_IN:
- break;
-
- case EVE_UIEVT_WIDGET_FOCUS_OUT:
- break;
-
- case EVE_UIEVT_GEST_SCROLL_START:
- break;
-
- case EVE_UIEVT_GEST_SCROLL_STOP:
- break;
-
- case EVE_UIEVT_GEST_TRACK_START:
- break;
-
case EVE_UIEVT_GEST_TRACK_STOP: {
EVEUIEvtTouch *touch_p = (EVEUIEvtTouch *)param;
if (touch_p->touch->eevt & EVE_TOUCH_EETYPE_TRACK_RIGHT) {
eve_page_close(page);
- return 1;
+ return;
}
break;
}
}
- return 0;
}
void eve_form_update_g(EVEPage *page, EVEWidget *_widget) {
diff --git a/fw/fe310/eos/eve/screen/form.h b/fw/fe310/eos/eve/screen/form.h
index bc81d2d..c4b8493 100644
--- a/fw/fe310/eos/eve/screen/form.h
+++ b/fw/fe310/eos/eve/screen/form.h
@@ -7,10 +7,10 @@ typedef struct EVEFormSpec {
EVEWidgetSpec widget;
} EVEFormSpec;
-EVEPage *eve_form_create(EVEWindow *window, EVEViewStack *stack, EVEFormSpec spec[], uint16_t spec_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor);
-void eve_form_init(EVEPage *page, EVEWindow *window, EVEViewStack *stack, EVEWidget *widget, uint16_t widget_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor);
+int eve_form_create(EVEPage *page, EVEWindow *window, EVEVStack *stack, EVEFormSpec spec[], uint16_t spec_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor);
+void eve_form_init(EVEPage *page, EVEWindow *window, EVEVStack *stack, EVEWidget *widget, uint16_t widget_size, eve_page_uievt_t uievt, eve_page_destructor_t destructor);
void eve_form_set_widget(EVEPage *page, EVEWidget *widget, uint16_t widget_size);
void eve_form_destroy(EVEPage *page);
-int eve_form_uievt(EVEPage *page, uint16_t evt, void *param);
+void eve_form_uievt(EVEPage *page, uint16_t evt, void *param);
void eve_form_update_g(EVEPage *page, EVEWidget *_widget);
diff --git a/fw/fe310/eos/eve/screen/page.c b/fw/fe310/eos/eve/screen/page.c
index 93b81c5..8c02538 100644
--- a/fw/fe310/eos/eve/screen/page.c
+++ b/fw/fe310/eos/eve/screen/page.c
@@ -14,15 +14,36 @@
#define PAGE_TMODE_TRACK 1
#define PAGE_TMODE_SCROLL 2
-void eve_page_init(EVEPage *page, EVEWindow *window, EVEViewStack *stack, EVEWidget *widget, uint16_t widget_size, uint8_t opt, eve_page_draw_t draw, eve_page_touch_t touch, eve_page_uievt_t uievt, eve_page_destructor_t destructor) {
+void eve_page_init(EVEPage *page, EVEWindow *window, EVEVStack *stack, EVEWidget *widget, uint16_t widget_size, uint8_t opt, eve_page_draw_t draw, eve_page_touch_t touch, eve_page_uievt_t uievt, eve_page_destructor_t destructor) {
memset(page, 0, sizeof(EVEPage));
eve_view_init(&page->v, window, (eve_view_draw_t)draw, (eve_view_touch_t)touch, (eve_view_uievt_t)uievt, NULL);
+ eve_phy_lho_init(&page->lho, 100, 0.5, 0);
page->stack = stack;
page->opt = opt;
page->destructor = destructor;
eve_page_set_widget(page, widget, widget_size);
}
+void eve_page_attach(EVEPage *page, EVEWindow *window, void *page_id) {
+ eve_view_attach(&page->v, window, page_id);
+}
+
+void eve_page_detach(EVEPage *page) {
+ eve_view_detach(&page->v);
+}
+
+void eve_page_set_param(EVEPage *page, void *param) {
+ eve_view_set_param(&page->v, param);
+}
+
+EVEView *eve_page_view(EVEPage *page) {
+ return &page->v;
+}
+
+EVEPage *eve_page_from_view(EVEView *view) {
+ return (EVEPage *)view;
+}
+
EVEWidget *eve_page_widget(EVEPage *page, uint16_t _idx) {
EVEWidget *w = page->widget;
int i, idx;
@@ -62,53 +83,81 @@ void eve_page_set_widget(EVEPage *page, EVEWidget *widget, uint16_t widget_size)
page->widget_size = widget_size;
}
-void eve_page_open(EVEPage *parent, eve_view_constructor_t constructor) {
- EVEWindow *window = parent->v.window;
- EVEViewStack *stack = parent->stack;
- eve_page_destructor_t destructor = parent->destructor;
-
- eve_page_set_focus(parent, NULL);
- if (destructor) destructor(parent);
- eve_stack_create_view(stack, window, constructor);
-}
-
-void eve_page_close(EVEPage *page) {
+static void page_destroy(EVEPage *page) {
EVEWindow *window = page->v.window;
- EVEViewStack *stack = page->stack;
eve_page_destructor_t destructor = page->destructor;
- if (stack->level <= 1) return;
-
eve_page_set_focus(page, NULL);
- if (eve_timer_running()) {
- eve_timer_stop();
- }
- if (eve_window_scroll(window->root, NULL) == window) {
+ if (eve_window_scroll(window, NULL) == window) {
eve_window_scroll_stop(window);
}
eve_window_kbd_detach(window);
+ eve_page_detach(page);
+
if (destructor) destructor(page);
- eve_stack_back(stack, window);
+}
+
+void eve_page_open(EVEPage *parent, eve_view_constructor_t constructor) {
+ EVEWindow *window = parent->v.window;
+ EVEVStack *stack = parent->stack;
+ int rv;
+
+ if (eve_vstack_full(stack)) return;
+
+ page_destroy(parent);
+ rv = eve_vstack_create_view(stack, window, constructor);
+ if (rv) {
+ EVEView *view = NULL;
+
+ do {
+ constructor = eve_vstack_get(stack);
+ if (constructor) view = constructor(window, stack);
+ if (view == NULL) eve_vstack_pull(stack);
+ } while ((view == NULL) && constructor);
+ if (view) eve_view_attach(view, window, constructor);
+ }
+}
+
+void eve_page_close(EVEPage *page) {
+ EVEWindow *window = page->v.window;
+ EVEVStack *stack = page->stack;
+ int rv;
+
+ if (eve_vstack_level(stack) == 1) return;
+
+ page_destroy(page);
+ rv = eve_vstack_back(stack, window);
+ if (rv) {
+ eve_view_constructor_t constructor;
+ EVEView *view = NULL;
+
+ do {
+ eve_vstack_pull(stack);
+ constructor = eve_vstack_get(stack);
+ if (constructor) view = constructor(window, stack);
+ } while ((view == NULL) && constructor);
+ if (view) eve_view_attach(view, window, constructor);
+ }
}
/* Screen to page coordinates */
int16_t eve_page_x(EVEPage *page, int16_t x) {
- return x + page->g.x - page->v.window->g.x;
+ return x - page->g.x - page->v.window->g.x;
}
int16_t eve_page_y(EVEPage *page, int16_t y) {
- return y + page->g.y - page->v.window->g.y;
+ return y - page->g.y - page->v.window->g.y;
}
/* Page to window coordinates */
int16_t eve_page_win_x(EVEPage *page, int16_t x) {
- return x - page->g.x;
+ return x + page->g.x;
}
int16_t eve_page_win_y(EVEPage *page, int16_t y) {
- return y - page->g.y;
+ return y + page->g.y;
}
/* Page to screen coordinates */
@@ -120,49 +169,57 @@ int16_t eve_page_scr_y(EVEPage *page, int16_t y) {
return eve_page_win_y(page, y) + page->v.window->g.y;
}
-int eve_page_rect_visible(EVEPage *page, EVERect *g) {
- uint16_t w = page->v.window->g.w;
- uint16_t h = page->v.window->g.h;
+int eve_page_rect_visible(EVEPage *page, EVERect *rect) {
+ EVERect win_g;
- if (((g->x + g->w) >= page->g.x) && ((g->y + g->h) >= page->g.y) && (g->x <= (page->g.x + w)) && (g->y <= (page->g.y + h))) return 1;
- return 0;
+ eve_window_visible_g(page->v.window, &win_g);
+ win_g.x -= page->v.window->g.x;
+ win_g.y -= page->v.window->g.y;
+
+ if ((page->g.x + rect->x + rect->w < win_g.x) ||
+ (page->g.y + rect->y + rect->h < win_g.y) ||
+ (page->g.x + rect->x > win_g.x + win_g.w) ||
+ (page->g.y + rect->y > win_g.y + win_g.h)) return 0;
+
+ return 1;
}
void eve_page_show_rect(EVEPage *page, EVERect *rect) {
- EVERect g;
+ EVERect win_g;
- eve_window_visible_g(page->v.window, &g);
- g.x -= page->v.window->g.x;
- g.y -= page->v.window->g.y;
+ eve_window_visible_g(page->v.window, &win_g);
+ win_g.x -= page->v.window->g.x;
+ win_g.y -= page->v.window->g.y;
- if (rect->x < page->g.x + g.x) {
- page->g.x = rect->x - g.x;
+ if (page->g.x + rect->x < win_g.x) {
+ page->g.x = win_g.x - rect->x;
}
- if (rect->y < page->g.y + g.y) {
- page->g.y = rect->y - g.y;
+ if (page->g.y + rect->y < win_g.y) {
+ page->g.y = win_g.y - rect->y;
}
- if ((rect->x + rect->w) > (page->g.x + g.x + g.w)) {
- page->g.x = (rect->x + rect->w) - (g.x + g.w);
+
+ if (page->g.x + rect->x + rect->w > win_g.x + win_g.w) {
+ page->g.x = win_g.x + win_g.w - (rect->x + rect->w);
}
- if ((rect->y + rect->h) > (page->g.y + g.y + g.h)) {
- page->g.y = (rect->y + rect->h) - (g.y + g.h);
+ if (page->g.y + rect->y + rect->h > win_g.y + win_g.h) {
+ page->g.y = win_g.y + win_g.h - (rect->y + rect->h);
}
}
/* returns true if x or y are out of page bounds for window */
-int eve_page_oob(EVEPage *page, int *_max_x, int *_max_y) {
- int max_x, max_y;
- EVERect vg;
+int eve_page_oob(EVEPage *page, int *min_x, int *min_y) {
+ int _min_x, _min_y;
+ EVERect win_g;
- eve_window_visible_g(page->v.window, &vg);
- max_x = page->g.w > vg.w ? page->g.w - vg.w : 0;
- max_y = page->g.h > vg.h ? page->g.h - vg.h : 0;
+ eve_window_visible_g(page->v.window, &win_g);
+ _min_x = -(page->g.w > win_g.w ? page->g.w - win_g.w : 0);
+ _min_y = -(page->g.h > win_g.h ? page->g.h - win_g.h : 0);
- if (_max_x) *_max_x = max_x;
- if (_max_y) *_max_y = max_y;
+ if (min_x) *min_x = _min_x;
+ if (min_y) *min_y = _min_y;
- return ((page->g.x < 0) || (page->g.x > max_x) ||
- (page->g.y < 0) || (page->g.y > max_y));
+ return ((page->g.x > 0) || (page->g.x < _min_x) ||
+ (page->g.y > 0) || (page->g.y < _min_y));
}
EVEWidget *eve_page_focus(EVEPage *page) {
@@ -174,159 +231,150 @@ void eve_page_set_focus(EVEPage *page, EVEWidget *widget) {
EVEWindow *window = page->v.window;
EVEWidget *widget_f = page->widget_f;
- if (widget_f && widget_f->putc) {
- widget_f->putc(widget_f, EVE_PAGE_KBDCH_CLOSE);
- if (!(widget && widget->putc)) eve_window_kbd_detach(window);
+ if ((widget_f && widget_f->putc) && !(widget && widget->putc)) {
+ eve_window_kbd_detach(window);
}
if (widget && widget->putc) {
EVEKbd *kbd = eve_window_kbd(window);
if (kbd) eve_kbd_set_handler(kbd, widget->putc, widget);
- if (!(widget_f && widget_f->putc)) eve_window_kbd_attach(window);
+ if (!(widget_f && widget_f->putc)) {
+ eve_window_kbd_attach(window);
+ eve_page_show_rect(page, &widget->g);
+ }
+ }
+ if (widget_f) {
+ eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_FOCUS_OUT, widget_f);
+ widget_f->touch(widget_f, NULL, EVE_TOUCH_ETYPE_EXT | EVE_UIEVT_WIDGET_FOCUS_OUT);
}
- if (page->widget_f) eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_FOCUS_OUT, page->widget_f);
page->widget_f = widget;
- if (page->widget_f) eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_FOCUS_IN, page->widget_f);
+ if (widget) {
+ eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_FOCUS_IN, widget);
+ widget->touch(widget, NULL, EVE_TOUCH_ETYPE_EXT | EVE_UIEVT_WIDGET_FOCUS_IN);
+ }
}
}
-static int page_touch(EVEPage *page, EVETouch *touch, uint16_t evt, uint8_t tag0) {
+static int page_touch(EVEPage *page, EVETouch *touch, uint16_t evt) {
EVEView *view = &page->v;
EVEWindow *window = view->window;
int scroll_x = 0, scroll_y = 0, scroll;
- int ret = 0;
-
- if (touch) {
- if ((page->opt & EVE_PAGE_OPT_SCROLL_XY) == EVE_PAGE_OPT_SCROLL_XY) {
- scroll_x = scroll_y = (touch->eevt & EVE_TOUCH_EETYPE_TRACK_XY);
- } else if (page->opt & EVE_PAGE_OPT_SCROLL_X) {
- scroll_x = (touch->eevt & EVE_TOUCH_EETYPE_TRACK_X);
- } else if (page->opt & EVE_PAGE_OPT_SCROLL_Y) {
- scroll_y = (touch->eevt & EVE_TOUCH_EETYPE_TRACK_Y);
- }
+ int rv = 0;
+
+ if ((page->opt & EVE_PAGE_OPT_SCROLL_XY) == EVE_PAGE_OPT_SCROLL_XY) {
+ scroll_x = scroll_y = (touch->eevt & EVE_TOUCH_EETYPE_TRACK_XY);
+ } else if (page->opt & EVE_PAGE_OPT_SCROLL_X) {
+ scroll_x = (touch->eevt & EVE_TOUCH_EETYPE_TRACK_X);
+ } else if (page->opt & EVE_PAGE_OPT_SCROLL_Y) {
+ scroll_y = (touch->eevt & EVE_TOUCH_EETYPE_TRACK_Y);
+ }
- scroll = scroll_x || scroll_y;
+ scroll = scroll_x || scroll_y;
- if ((tag0 == page->v.tag) && (evt & EVE_TOUCH_ETYPE_POINT_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_ABORT))) {
- int _ret = 0;
+ if ((touch->tag0 == page->v.tag) && (evt & EVE_TOUCH_ETYPE_POINT_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_TRACK_ABORT))) {
+ eve_page_set_focus(page, NULL);
+ eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_TOUCH, touch, evt);
+ if (eve_window_dirty(window)) return 1;
+ rv = 1;
+ }
- eve_page_set_focus(page, NULL);
- _ret = eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_TOUCH, touch, evt, tag0);
- if (_ret) return _ret;
- ret = 1;
+ /* Scroll / track start */
+ if (evt & EVE_TOUCH_ETYPE_TRACK_START) {
+ if (page->track_mode == PAGE_TMODE_NONE) {
+ if (scroll) {
+ page->track_mode = PAGE_TMODE_SCROLL;
+ eve_window_scroll_start(window, touch->tag0);
+ eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_SCROLL_START, touch, evt);
+ } else {
+ page->track_mode = PAGE_TMODE_TRACK;
+ eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_TRACK_START, touch, evt);
+ }
+ if (eve_window_dirty(window)) return 1;
+ }
+ if (scroll_x) {
+ page->x0 = touch->x0 - page->g.x;
+ }
+ if (scroll_y) {
+ page->y0 = touch->y0 - page->g.y;
}
+ rv = 1;
+ }
- /* Scroll / track start */
- if (evt & EVE_TOUCH_ETYPE_TRACK_START) {
- int _ret = 0;
-
- if (!(touch->eevt & EVE_TOUCH_EETYPE_ABORT)) {
- if (scroll) {
- page->track_mode = PAGE_TMODE_SCROLL;
- eve_window_scroll_start(window, touch->tracker.tag);
- _ret = eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_SCROLL_START, touch, evt, tag0);
- } else {
- page->track_mode = PAGE_TMODE_TRACK;
- _ret = eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_TRACK_START, touch, evt, tag0);
- }
- if (_ret) return _ret;
- }
- if (scroll_x) {
- page->x0 = page->g.x;
- }
- if (scroll_y) {
- page->y0 = page->g.y;
- }
- ret = 1;
+ if ((evt & EVE_TOUCH_ETYPE_TRACK) && (page->track_mode == PAGE_TMODE_SCROLL)) {
+ if (scroll_x) {
+ page->g.x = touch->x - page->x0;
}
+ if (scroll_y) {
+ page->g.y = touch->y - page->y0;
+ }
+ rv = 1;
+ }
- /* Scroll / track stop */
- if (((evt & EVE_TOUCH_ETYPE_TRACK_STOP) && !(evt & EVE_TOUCH_ETYPE_TRACK_ABORT)) ||
- ((evt & EVE_TOUCH_ETYPE_POINT_UP) && (touch->eevt & EVE_TOUCH_EETYPE_ABORT) && !(touch->eevt & EVE_TOUCH_EETYPE_TRACK_XY))) {
- if ((page->track_mode == PAGE_TMODE_SCROLL) && (page->opt & EVE_PAGE_OPT_SCROLL_BACK)) {
- int max_x, max_y;
- int oob;
-
- oob = eve_page_oob(page, &max_x, &max_y);
- if (oob) {
- int lho_x, lho_y;
- uint8_t _tag;
- EVEPhyLHO *lho = &page->lho;
-
- lho_x = page->g.x < 0 ? 0 : max_x;
- lho_y = page->g.y < 0 ? 0 : max_y;
- eve_window_scroll(window->root, &_tag);
-
- page->lho_t0 = eve_get_tick();
- eve_phy_lho_init(lho, lho_x, lho_y, 100, 0.5, 0);
- eve_phy_lho_start(lho, page->g.x, page->g.y);
- eve_timer_start(_tag, 20);
+ /* Scroll / track stop */
+ if (((evt & EVE_TOUCH_ETYPE_TRACK_STOP) && !(evt & EVE_TOUCH_ETYPE_TRACK_ABORT)) ||
+ ((evt & EVE_TOUCH_ETYPE_POINT_UP) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_ABORT) && !(touch->eevt & EVE_TOUCH_EETYPE_TRACK_XY))) {
+ int start = 0;
+
+ if ((page->track_mode == PAGE_TMODE_SCROLL) && (page->opt & EVE_PAGE_OPT_SCROLL_BACK)) {
+ int min_gx, min_gy;
+ int oob;
+
+ oob = eve_page_oob(page, &min_gx, &min_gy);
+ if (oob) {
+ int pivot_x, pivot_y, x0, y0;
+ int scroll_x, scroll_y;
+ EVEPhyLHO *lho = &page->lho;
+ uint8_t scroll_tag;
+
+ pivot_x = touch->x0 - page->g.x + (page->g.x < min_gx ? min_gx : 0);
+ pivot_y = touch->y0 - page->g.y + (page->g.y < min_gy ? min_gy : 0);
+ x0 = touch->x0;
+ y0 = touch->y0;
+
+ scroll_x = page->opt & EVE_PAGE_OPT_SCROLL_X;
+ scroll_y = page->opt & EVE_PAGE_OPT_SCROLL_Y;
+ if (!scroll_x) pivot_x = x0;
+ if (!scroll_y) pivot_y = y0;
+
+ eve_window_scroll(window, &scroll_tag);
+ start = eve_phy_lho_start(lho, pivot_x, pivot_y, x0, y0, eve_get_tick());
+ if (start) {
+ eve_vtrack_start(lho, eve_phy_lho_tick, EVE_TOUCH_TIMEOUT_TRACK, touch, scroll_tag);
}
}
+ }
- if (!eve_timer_running()) {
- int _ret = 0;
-
- switch (page->track_mode) {
- case PAGE_TMODE_SCROLL: {
- page->track_mode = PAGE_TMODE_NONE;
- eve_window_scroll_stop(window);
- _ret = eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_SCROLL_STOP, touch, evt, tag0);
- break;
- }
-
- case PAGE_TMODE_TRACK: {
- page->track_mode = PAGE_TMODE_NONE;
- _ret = eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_TRACK_STOP, touch, evt, tag0);
- break;
- }
+ if (!start) {
+ switch (page->track_mode) {
+ case PAGE_TMODE_SCROLL: {
+ page->track_mode = PAGE_TMODE_NONE;
+ eve_window_scroll_stop(window);
+ eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_SCROLL_STOP, touch, evt);
+ break;
}
- if (_ret) return _ret;
- }
- ret = 1;
- }
- if ((evt & EVE_TOUCH_ETYPE_TRACK) && (page->track_mode == PAGE_TMODE_SCROLL)) {
- if (scroll_x) {
- page->g.x = page->x0 + touch->x0 - touch->x;
- }
- if (scroll_y) {
- page->g.y = page->y0 + touch->y0 - touch->y;
+ case PAGE_TMODE_TRACK: {
+ page->track_mode = PAGE_TMODE_NONE;
+ eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_TRACK_STOP, touch, evt);
+ break;
+ }
}
- ret = 1;
- }
- } else if ((evt & EVE_TOUCH_ETYPE_TIMER) && (page->track_mode == PAGE_TMODE_SCROLL) && (page->opt & EVE_PAGE_OPT_SCROLL_BACK)) {
- EVEPhyLHO *lho = &page->lho;
- int scroll_x = page->opt & EVE_PAGE_OPT_SCROLL_X;
- int scroll_y = page->opt & EVE_PAGE_OPT_SCROLL_Y;
- int x, y, more;
-
- more = eve_phy_lho_tick(lho, eve_get_tick() - page->lho_t0, scroll_x ? &x : NULL, scroll_y ? &y : NULL);
- if (scroll_x) page->g.x = x;
- if (scroll_y) page->g.y = y;
- if (!more) {
- int _ret = 0;
-
- page->track_mode = PAGE_TMODE_NONE;
- eve_timer_stop();
- eve_window_scroll_stop(window);
- _ret = eve_view_uievt_push_gest(view, EVE_UIEVT_GEST_SCROLL_STOP, touch, evt, tag0);
- if (_ret) return _ret;
+ if (eve_window_dirty(window)) return 1;
}
- ret = 1;
+ rv = 1;
}
- return ret;
+ return rv;
}
uint8_t eve_page_draw(EVEPage *page, uint8_t tag0) {
EVEView *view = &page->v;
EVEWidget *widget = page->widget;
int i;
- uint8_t tagN = tag0;
+ uint8_t tagN;
uint8_t tag_opt;
- tag_opt = EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY;
+ tag_opt = EVE_TOUCH_OPT_TRACK_XY;
if (page->opt & EVE_PAGE_OPT_TRACK_EXT_X) tag_opt |= EVE_TOUCH_OPT_TRACK_EXT_X;
if (page->opt & EVE_PAGE_OPT_TRACK_EXT_Y) tag_opt |= EVE_TOUCH_OPT_TRACK_EXT_Y;
@@ -354,52 +402,41 @@ draw_nextw:
eve_cmd_dl(RESTORE_CONTEXT());
for (i=tag0; i<tagN; i++) {
- if (i != EVE_NOTAG) eve_touch_set_opt(i, eve_touch_get_opt(i) | tag_opt);
+ if (i != EVE_NOTAG) eve_tag_set_opt(i, eve_tag_get_opt(i) | tag_opt);
}
return tagN;
}
-int eve_page_touch(EVEPage *page, EVETouch *touch, uint16_t evt, uint8_t tag0) {
+int eve_page_touch(EVEPage *page, EVETouch *touch, uint16_t evt) {
EVEWidget *widget = page->widget;
- EVEViewStack *stack = page->stack;
+ EVEWindow *window = page->v.window;
int8_t touch_idx = eve_touch_get_idx(touch);
uint16_t _evt;
- int i, ret;
+ int i, rv;
if (touch_idx > 0) return 0;
- _evt = eve_touch_evt(touch, evt, tag0, page->v.tag, 1);
+ _evt = eve_touch_evt(touch, evt, page->v.tag, 1);
if (_evt) {
- ret = page_touch(page, touch, _evt, tag0);
- if (stack->dirty) {
- stack->dirty = 0;
- return 1;
- }
- if (ret) return 1;
+ rv = page_touch(page, touch, _evt);
+ if (rv || eve_window_dirty(window)) return 1;
}
for (i=0; i<page->widget_size; i++) {
if (!eve_page_rect_visible(page, &widget->g) || (widget->flags & (EVE_WIDGET_FLAG_SKIP | EVE_WIDGET_FLAG_RO | EVE_WIDGET_FLAG_HIDDEN))) goto touch_nextw;
- _evt = eve_touch_evt(touch, evt, tag0, widget->tag0, widget->tagN - widget->tag0);
+ _evt = eve_touch_evt(touch, evt, widget->tag0, widget->tagN - widget->tag0);
if (_evt) {
if (page->track_mode == PAGE_TMODE_NONE) {
- ret = widget->touch(widget, touch, _evt);
- if (stack->dirty) {
- stack->dirty = 0;
+ rv = widget->touch(widget, touch, _evt);
+ if (eve_window_dirty(window)) return 1;
+ if (rv) {
+ eve_page_set_focus(page, widget);
return 1;
}
- if (ret) {
- eve_widget_set_focus(widget);
- return 1;
- }
- }
- ret = page_touch(page, touch, _evt, tag0);
- if (stack->dirty) {
- stack->dirty = 0;
- return 1;
}
- if (ret) return 1;
+ rv = page_touch(page, touch, _evt);
+ if (rv || eve_window_dirty(window)) return 1;
}
touch_nextw:
diff --git a/fw/fe310/eos/eve/screen/page.h b/fw/fe310/eos/eve/screen/page.h
index 6874a2d..067565b 100644
--- a/fw/fe310/eos/eve/screen/page.h
+++ b/fw/fe310/eos/eve/screen/page.h
@@ -1,7 +1,5 @@
#include <stdint.h>
-#define EVE_PAGE_KBDCH_CLOSE 0x1a
-
#define EVE_PAGE_OPT_SCROLL_X 0x01
#define EVE_PAGE_OPT_SCROLL_Y 0x02
#define EVE_PAGE_OPT_SCROLL_BACK 0x04
@@ -15,8 +13,8 @@ struct EVEWidget;
struct EVEPage;
typedef uint8_t (*eve_page_draw_t) (struct EVEPage *, uint8_t);
-typedef int (*eve_page_touch_t) (struct EVEPage *, EVETouch *, uint16_t, uint8_t);
-typedef int (*eve_page_uievt_t) (struct EVEPage *, uint16_t, void *);
+typedef int (*eve_page_touch_t) (struct EVEPage *, EVETouch *, uint16_t);
+typedef void (*eve_page_uievt_t) (struct EVEPage *, uint16_t, void *);
typedef void (*eve_page_destructor_t) (struct EVEPage *);
typedef struct EVEPage {
@@ -24,19 +22,23 @@ typedef struct EVEPage {
EVERect g;
int16_t x0;
int16_t y0;
- EVEViewStack *stack;
+ EVEVStack *stack;
eve_page_destructor_t destructor;
struct EVEWidget *widget;
uint16_t widget_size;
struct EVEWidget *widget_f;
EVEPhyLHO lho;
- uint32_t lho_t0;
uint8_t track_mode;
uint8_t opt;
} EVEPage;
-void eve_page_init(EVEPage *page, EVEWindow *window, EVEViewStack *stack, struct EVEWidget *widget, uint16_t widget_size, uint8_t opt, eve_page_draw_t draw, eve_page_touch_t touch, eve_page_uievt_t uievt, eve_page_destructor_t destructor);
+void eve_page_init(EVEPage *page, EVEWindow *window, EVEVStack *stack, struct EVEWidget *widget, uint16_t widget_size, uint8_t opt, eve_page_draw_t draw, eve_page_touch_t touch, eve_page_uievt_t uievt, eve_page_destructor_t destructor);
+void eve_page_attach(EVEPage *page, EVEWindow *window, void *page_id);
+void eve_page_detach(EVEPage *page);
+void eve_page_set_param(EVEPage *page, void *param);
+EVEView *eve_page_view(EVEPage *page);
+EVEPage *eve_page_from_view(EVEView *view);
struct EVEWidget *eve_page_widget(EVEPage *page, uint16_t idx);
struct EVEWidget *eve_page_widget_search(EVEPage *page, char *label);
void eve_page_set_widget(EVEPage *page, struct EVEWidget *widget, uint16_t widget_size);
@@ -53,12 +55,12 @@ int16_t eve_page_win_y(EVEPage *page, int16_t y);
/* Page to screen coordinates */
int16_t eve_page_scr_x(EVEPage *page, int16_t x);
int16_t eve_page_scr_y(EVEPage *page, int16_t y);
-int eve_page_rect_visible(EVEPage *page, EVERect *g);
+int eve_page_rect_visible(EVEPage *page, EVERect *rect);
void eve_page_show_rect(EVEPage *page, EVERect *rect);
-int eve_page_oob(EVEPage *page, int *_max_x, int *_max_y);
+int eve_page_oob(EVEPage *page, int *min_x, int *min_y);
struct EVEWidget *eve_page_focus(EVEPage *page);
void eve_page_set_focus(EVEPage *page, struct EVEWidget *widget);
uint8_t eve_page_draw(EVEPage *page, uint8_t tag0);
-int eve_page_touch(EVEPage *page, EVETouch *touch, uint16_t evt, uint8_t tag0);
+int eve_page_touch(EVEPage *page, EVETouch *touch, uint16_t evt);
diff --git a/fw/fe310/eos/eve/screen/uievt.h b/fw/fe310/eos/eve/screen/uievt.h
index 8e1e682..e40624a 100644
--- a/fw/fe310/eos/eve/screen/uievt.h
+++ b/fw/fe310/eos/eve/screen/uievt.h
@@ -5,12 +5,12 @@
#define EVE_UIEVT_GEST_TRACK_STOP 5
#define EVE_UIEVT_WIN_UPDATE_G 6
#define EVE_UIEVT_PAGE_UPDATE_G 7
-#define EVE_UIEVT_WIDGET_UPDATE_G 8
-#define EVE_UIEVT_WIDGET_FOCUS_IN 9
-#define EVE_UIEVT_WIDGET_FOCUS_OUT 10
+#define EVE_UIEVT_WIDGET_UPDATE 8
+#define EVE_UIEVT_WIDGET_UPDATE_G 9
+#define EVE_UIEVT_WIDGET_FOCUS_IN 10
+#define EVE_UIEVT_WIDGET_FOCUS_OUT 11
typedef struct EVEUIEvtTouch {
EVETouch *touch;
uint16_t evt;
- uint8_t tag0;
} EVEUIEvtTouch;
diff --git a/fw/fe310/eos/eve/screen/view.c b/fw/fe310/eos/eve/screen/view.c
index d6e9ede..a1290f0 100644
--- a/fw/fe310/eos/eve/screen/view.c
+++ b/fw/fe310/eos/eve/screen/view.c
@@ -15,7 +15,19 @@ void eve_view_init(EVEView *view, EVEWindow *window, eve_view_draw_t draw, eve_v
view->window = window;
view->color_bg = 0x000000;
view->color_fg = 0xffffff;
- window->view = view;
+}
+
+void eve_view_attach(EVEView *view, EVEWindow *window, void *view_id) {
+ view->window = window;
+ eve_window_attach_view(window, view, view_id);
+}
+
+void eve_view_detach(EVEView *view) {
+ eve_window_detach_view(view->window);
+}
+
+void eve_view_set_param(EVEView *view, void *param) {
+ view->param = param;
}
void eve_view_set_color_bg(EVEView *view, uint8_t r, uint8_t g, uint8_t b) {
@@ -29,78 +41,121 @@ void eve_view_set_color_fg(EVEView *view, uint8_t r, uint8_t g, uint8_t b) {
uint8_t eve_view_clear(EVEView *view, uint8_t tag0, uint8_t tag_opt) {
EVEWindow *win_scroll = NULL;
EVEWindow *window = view->window;
- uint8_t _tag;
+ uint8_t scroll_tag;
- win_scroll = eve_window_scroll(window->root, &_tag);
+ win_scroll = eve_window_scroll(window, &scroll_tag);
eve_cmd_dl(CLEAR_COLOR_RGBC(view->color_bg));
eve_cmd_dl(COLOR_RGBC(view->color_fg));
if (win_scroll == window) {
- view->tag = _tag;
- eve_touch_set_opt(view->tag, tag_opt);
- eve_cmd_dl(TAG(view->tag));
- eve_cmd_dl(CLEAR_TAG(view->tag));
+ view->tag = scroll_tag;
} else if (win_scroll) {
view->tag = EVE_NOTAG;
- eve_cmd_dl(TAG(view->tag));
- eve_cmd_dl(CLEAR_TAG(view->tag));
} else {
view->tag = tag0;
if (tag0 != EVE_NOTAG) {
- eve_touch_set_opt(tag0, tag_opt);
- eve_cmd_dl(CLEAR_TAG(tag0));
+ eve_tag_set_opt(tag0, tag_opt);
tag0++;
}
}
+ eve_cmd_dl(CLEAR_TAG(view->tag));
eve_cmd_dl(CLEAR(1,1,1));
return tag0;
}
-int eve_view_uievt_push(EVEView *view, uint16_t evt, void *param) {
- if (view->uievt) return view->uievt(view, evt, param);
- return 0;
+uint8_t eve_view_tag(EVEView *view, uint8_t tag, uint8_t tag_opt) {
+ if (tag != EVE_NOTAG) {
+ eve_tag_set_opt(tag, tag_opt);
+ eve_cmd_dl(TAG(tag));
+ tag++;
+ }
+ return tag;
}
-int eve_view_uievt_push_gest(EVEView *view, uint16_t evt, EVETouch *touch, uint16_t t_evt, uint8_t tag0) {
- if (view->uievt) {
- EVEUIEvtTouch param;
+void eve_view_uievt_push(EVEView *view, uint16_t evt, void *param) {
+ if (view->uievt) view->uievt(view, evt, param);
+}
- param.touch = touch;
- param.evt = t_evt;
- param.tag0 = tag0;
- return view->uievt(view, evt, &param);
- }
- return 0;
+void eve_view_uievt_push_gest(EVEView *view, uint16_t evt, EVETouch *touch, uint16_t t_evt) {
+ EVEUIEvtTouch param;
+
+ if (view->uievt == NULL) return;
+
+ param.touch = touch;
+ param.evt = t_evt;
+ view->uievt(view, evt, &param);
}
-void eve_stack_init(EVEViewStack *stack) {
- memset(stack, 0, sizeof(EVEViewStack));
+void eve_vstack_init(EVEVStack *stack) {
+ memset(stack, 0, sizeof(EVEVStack));
}
-void eve_stack_create_view(EVEViewStack *stack, EVEWindow *window, eve_view_constructor_t constructor) {
- int rv;
+int eve_vstack_push(EVEVStack *stack, eve_view_constructor_t constructor) {
+ if (stack->level == EVE_VIEW_SIZE_STACK) return EVE_ERR_FULL;
- stack->dirty = 1;
- if (stack->level < EVE_VIEW_SIZE_STACK - 1) {
- stack->constructor[stack->level] = constructor;
- stack->level++;
- rv = constructor(window, stack);
- if (rv) eve_stack_back(stack, window);
- }
+ stack->constructor[stack->level] = constructor;
+ stack->level++;
+
+ return EVE_OK;
}
-void eve_stack_back(EVEViewStack *stack, EVEWindow *window) {
+eve_view_constructor_t eve_vstack_pull(EVEVStack *stack) {
eve_view_constructor_t constructor;
- int rv = 1;
- stack->dirty = 1;
- while ((stack->level > 1) && rv) {
+ constructor = eve_vstack_get(stack);
+ if (stack->level) {
stack->level--;
- constructor = stack->constructor[stack->level - 1];
- rv = constructor(window, stack);
+ stack->constructor[stack->level] = NULL;
}
+ return constructor;
}
-eve_view_constructor_t eve_stack_get(EVEViewStack *stack) {
+eve_view_constructor_t eve_vstack_get(EVEVStack *stack) {
if (stack->level) return stack->constructor[stack->level - 1];
return NULL;
}
+
+int eve_vstack_empty(EVEVStack *stack) {
+ return (stack->level == 0);
+}
+
+int eve_vstack_full(EVEVStack *stack) {
+ return (stack->level == EVE_VIEW_SIZE_STACK);
+}
+
+int eve_vstack_level(EVEVStack *stack) {
+ return stack->level;
+}
+
+int eve_vstack_create_view(EVEVStack *stack, EVEWindow *window, eve_view_constructor_t constructor) {
+ EVEView *view;
+ int rv;
+
+ rv = eve_vstack_push(stack, constructor);
+ if (rv) return rv;
+
+ view = constructor(window, stack);
+ if (view == NULL) {
+ eve_vstack_pull(stack);
+ return EVE_ERR;
+ }
+
+ eve_view_attach(view, window, constructor);
+
+ return EVE_OK;
+}
+
+int eve_vstack_back(EVEVStack *stack, EVEWindow *window) {
+ EVEView *view;
+ eve_view_constructor_t constructor;
+
+ eve_vstack_pull(stack);
+ constructor = eve_vstack_get(stack);
+ if (constructor == NULL) return EVE_ERR_EMPTY;
+
+ view = constructor(window, stack);
+ if (view == NULL) return EVE_ERR;
+
+ eve_view_attach(view, window, constructor);
+
+ return EVE_OK;
+}
diff --git a/fw/fe310/eos/eve/screen/view.h b/fw/fe310/eos/eve/screen/view.h
index 3e8c0a0..c40a620 100644
--- a/fw/fe310/eos/eve/screen/view.h
+++ b/fw/fe310/eos/eve/screen/view.h
@@ -5,13 +5,13 @@
#define EVE_VIEW_SIZE_STACK 16
struct EVEView;
-struct EVEViewStack;
+struct EVEVStack;
struct EVEWindow;
typedef uint8_t (*eve_view_draw_t) (struct EVEView *, uint8_t);
-typedef int (*eve_view_touch_t) (struct EVEView *, EVETouch *, uint16_t, uint8_t);
-typedef int (*eve_view_uievt_t) (struct EVEView *, uint16_t, void *);
-typedef int (*eve_view_constructor_t) (struct EVEWindow *window, struct EVEViewStack *);
+typedef int (*eve_view_touch_t) (struct EVEView *, EVETouch *, uint16_t);
+typedef void (*eve_view_uievt_t) (struct EVEView *, uint16_t, void *);
+typedef struct EVEView *(*eve_view_constructor_t) (struct EVEWindow *window, struct EVEVStack *);
typedef struct EVEView {
eve_view_draw_t draw;
@@ -24,21 +24,29 @@ typedef struct EVEView {
uint8_t tag;
} EVEView;
-typedef struct EVEViewStack {
+typedef struct EVEVStack {
eve_view_constructor_t constructor[EVE_VIEW_SIZE_STACK];
uint8_t level;
- uint8_t dirty;
-} EVEViewStack;
+} EVEVStack;
void eve_view_init(EVEView *view, struct EVEWindow *window, eve_view_draw_t draw, eve_view_touch_t touch, eve_view_uievt_t uievt, void *param);
+void eve_view_attach(EVEView *view, struct EVEWindow *window, void *view_id);
+void eve_view_detach(EVEView *view);
+void eve_view_set_param(EVEView *view, void *param);
void eve_view_set_color_bg(EVEView *view, uint8_t r, uint8_t g, uint8_t b);
void eve_view_set_color_fg(EVEView *view, uint8_t r, uint8_t g, uint8_t b);
uint8_t eve_view_clear(EVEView *view, uint8_t tag0, uint8_t tag_opt);
-
-int eve_view_uievt_push(EVEView *view, uint16_t evt, void *param);
-int eve_view_uievt_push_gest(EVEView *view, uint16_t evt, EVETouch *touch, uint16_t t_evt, uint8_t tag0);
-
-void eve_stack_init(EVEViewStack *stack);
-void eve_stack_create_view(EVEViewStack *stack, struct EVEWindow *window, eve_view_constructor_t constructor);
-void eve_stack_back(EVEViewStack *stack, struct EVEWindow *window);
-eve_view_constructor_t eve_stack_get(EVEViewStack *stack); \ No newline at end of file
+uint8_t eve_view_tag(EVEView *view, uint8_t tag, uint8_t tag_opt);
+
+void eve_view_uievt_push(EVEView *view, uint16_t evt, void *param);
+void eve_view_uievt_push_gest(EVEView *view, uint16_t evt, EVETouch *touch, uint16_t t_evt);
+
+void eve_vstack_init(EVEVStack *stack);
+int eve_vstack_push(EVEVStack *stack, eve_view_constructor_t constructor);
+eve_view_constructor_t eve_vstack_pull(EVEVStack *stack);
+eve_view_constructor_t eve_vstack_get(EVEVStack *stack);
+int eve_vstack_empty(EVEVStack *stack);
+int eve_vstack_full(EVEVStack *stack);
+int eve_vstack_level(EVEVStack *stack);
+int eve_vstack_create_view(EVEVStack *stack, struct EVEWindow *window, eve_view_constructor_t constructor);
+int eve_vstack_back(EVEVStack *stack, struct EVEWindow *window);
diff --git a/fw/fe310/eos/eve/screen/window.c b/fw/fe310/eos/eve/screen/window.c
index 34d265a..90f4e20 100644
--- a/fw/fe310/eos/eve/screen/window.c
+++ b/fw/fe310/eos/eve/screen/window.c
@@ -1,6 +1,5 @@
#include <stdlib.h>
#include <string.h>
-#include <stdio.h>
#include "eve.h"
#include "eve_kbd.h"
@@ -28,7 +27,7 @@ void eve_window_init_root(EVEWindowRoot *root, EVERect *g, char *name, EVEFont *
root->font = font;
root->win_kbd = NULL;
root->win_scroll = NULL;
- root->tag0 = EVE_NOTAG;
+ root->tag_scroll = EVE_NOTAG;
eve_touch_set_handler(eve_window_root_touch, root);
}
@@ -41,10 +40,10 @@ static uint8_t kbd_draw(EVEView *view, uint8_t tag0) {
return tag0;
}
-static int kbd_touch(EVEView *view, EVETouch *touch, uint16_t evt, uint8_t tag0) {
+static int kbd_touch(EVEView *view, EVETouch *touch, uint16_t evt) {
EVEKbd *kbd = view->param;
- return eve_kbd_touch(kbd, touch, evt, tag0);
+ return eve_kbd_touch(kbd, touch, evt);
}
void eve_window_init_kbd(EVEWindowKbd *win_kbd, EVERect *g, EVEWindowRoot *root, char *name, EVEKbd *kbd) {
@@ -55,6 +54,7 @@ void eve_window_init_kbd(EVEWindowKbd *win_kbd, EVERect *g, EVEWindowRoot *root,
win_kbd->kbd = kbd;
root->win_kbd = win_kbd;
eve_view_init(&win_kbd->v, _window, kbd_draw, kbd_touch, NULL, kbd);
+ eve_view_attach(&win_kbd->v, _window, NULL);
}
void eve_window_set_parent(EVEWindow *window, EVEWindow *parent) {
@@ -62,6 +62,26 @@ void eve_window_set_parent(EVEWindow *window, EVEWindow *parent) {
window->root = parent->root;
}
+void eve_window_attach_view(EVEWindow *window, EVEView *view, void *view_id) {
+ if (window->view) window->dirty = 1;
+ window->view = view;
+ window->view_id = view_id;
+}
+
+void eve_window_detach_view(EVEWindow *window) {
+ if (window->view) window->dirty = 1;
+ window->view = NULL;
+ window->view_id = NULL;
+}
+
+int eve_window_dirty(EVEWindow *window) {
+ return window->dirty;
+}
+
+void eve_window_clean(EVEWindow *window) {
+ window->dirty = 0;
+}
+
int eve_window_visible(EVEWindow *window) {
if (window->g.x >= window->root->w.g.w) return 0;
if (window->g.y >= window->root->w.g.h) return 0;
@@ -70,31 +90,32 @@ int eve_window_visible(EVEWindow *window) {
return 1;
}
-static void window_visible_g(EVEWindow *w, EVERect *g) {
- while (w) {
- if (eve_window_visible(w)) {
- if (w->g.x > g->x) g->w = MIN(g->w, w->g.x - g->x);
- if (w->g.y > g->y) g->h = MIN(g->h, w->g.y - g->y);
- if (w->g.x + w->g.w < g->x + g->w) {
- uint16_t x0 = g->w - MIN(g->w, (g->x + g->w) - (w->g.x + w->g.w));
- g->x += x0;
- g->w -= x0;
+static void window_visible_g(EVEWindow *win, EVERect *rect) {
+ while (win) {
+ if (eve_window_visible(win)) {
+ if (win->g.x > rect->x) rect->w = MIN(rect->w, win->g.x - rect->x);
+ if (win->g.y > rect->y) rect->h = MIN(rect->h, win->g.y - rect->y);
+ if (win->g.x + win->g.w < rect->x + rect->w) {
+ uint16_t x0 = rect->w - MIN(rect->w, (rect->x + rect->w) - (win->g.x + win->g.w));
+ rect->x += x0;
+ rect->w -= x0;
}
- if (w->g.y + w->g.h < g->y + g->h) {
- uint16_t y0 = g->h - MIN(g->h, (g->y + g->h) - (w->g.y + w->g.h));
- g->y += y0;
- g->h -= y0;
+ if (win->g.y + win->g.h < rect->y + rect->h) {
+ uint16_t y0 = rect->h - MIN(rect->h, (rect->y + rect->h) - (win->g.y + win->g.h));
+ rect->y += y0;
+ rect->h -= y0;
}
+ if ((rect->w == 0) || (rect->h == 0)) return;
}
- if (w->child_head) window_visible_g(w->child_head, g);
- w = w->next;
+ if (win->child_head) window_visible_g(win->child_head, rect);
+ win = win->next;
}
}
-void eve_window_visible_g(EVEWindow *window, EVERect *g) {
- *g = window->g;
- if (window->child_head) window_visible_g(window->child_head, g);
- window_visible_g(window->next, g);
+void eve_window_visible_g(EVEWindow *window, EVERect *rect) {
+ *rect = window->g;
+ if (window->child_head) window_visible_g(window->child_head, rect);
+ window_visible_g(window->next, rect);
}
void eve_window_append(EVEWindow *window) {
@@ -160,8 +181,8 @@ EVEWindow *eve_window_search(EVEWindow *window, char *name) {
while (window) {
if (window->name && (strcmp(name, window->name) == 0)) return window;
if (window->child_head) {
- EVEWindow *ret = eve_window_search(window->child_head, name);
- if (ret) return ret;
+ EVEWindow *rv = eve_window_search(window->child_head, name);
+ if (rv) return rv;
}
window = window->next;
}
@@ -198,17 +219,18 @@ uint8_t eve_window_draw(EVEWindow *window, uint8_t tag0) {
return tag0;
}
-int eve_window_touch(EVEWindow *window, EVETouch *touch, uint16_t evt, uint8_t tag0) {
- int ret = 0;
+int eve_window_touch(EVEWindow *window, EVETouch *touch, uint16_t evt) {
+ int rv = 0;
while (window) {
if (window->child_tail) {
- ret = eve_window_touch(window->child_tail, touch, evt, tag0);
- if (ret) return 1;
+ rv = eve_window_touch(window->child_tail, touch, evt);
+ if (rv) return 1;
}
if (eve_window_visible(window) && window->view) {
- ret = window->view->touch(window->view, touch, evt, tag0);
- if (ret) return 1;
+ rv = window->view->touch(window->view, touch, evt);
+ window->dirty = 0;
+ if (rv) return 1;
}
window = window->prev;
}
@@ -223,24 +245,31 @@ void eve_window_root_draw(EVEWindowRoot *root) {
eve_cmd_burst_start();
eve_cmd_dl(CMD_DLSTART);
- if (root->tag0 != EVE_NOTAG) tag0 = EVE_NOTAG;
+ if (root->tag_scroll != EVE_NOTAG) tag0 = EVE_NOTAG;
eve_window_draw(&root->w, tag0);
eve_cmd_dl(DISPLAY());
eve_cmd_dl(CMD_SWAP);
eve_cmd_burst_end();
rv = eve_cmd_exec(1);
- if (rv) printf("EVE EXEC ERR\n");
+ if (rv) EVE_LOG(EVE_LOG_ERR, "EVE CMD EXEC ERR:%d\n", rv);
}
-void eve_window_root_touch(EVETouch *touch, uint16_t evt, uint8_t tag0, void *win) {
+void eve_window_root_touch(EVETouch *touch, uint16_t evt, void *win) {
EVEWindowRoot *root = (EVEWindowRoot *)win;
- int ret;
+ int rv;
- if (root->tag0 != EVE_NOTAG) tag0 = root->tag0;
- ret = eve_window_touch(&root->w, touch, evt, tag0);
- if (ret) {
- eve_touch_clear_opt();
+ rv = eve_window_touch(&root->w, touch, evt);
+ if (rv) {
+ uint8_t tag_opt = 0;
+
+ if (root->tag_scroll != EVE_NOTAG) {
+ tag_opt = eve_tag_get_opt(root->tag_scroll);
+ }
+ eve_tag_clear_opt();
+ if (root->tag_scroll != EVE_NOTAG) {
+ eve_tag_set_opt(root->tag_scroll, tag_opt);
+ }
eve_window_root_draw(root);
}
}
@@ -275,14 +304,10 @@ void eve_window_kbd_detach(EVEWindow *window) {
}
}
-EVEFont *eve_window_font(EVEWindow *window) {
+EVEWindow *eve_window_scroll(EVEWindow *window, uint8_t *tag) {
EVEWindowRoot *root = window->root;
- return root->font;
-}
-
-EVEWindow *eve_window_scroll(EVEWindowRoot *root, uint8_t *tag) {
- if (tag) *tag = root->tag0;
+ if (tag) *tag = root->tag_scroll;
return root->win_scroll;
}
@@ -290,12 +315,18 @@ void eve_window_scroll_start(EVEWindow *window, uint8_t tag) {
EVEWindowRoot *root = window->root;
root->win_scroll = window;
- root->tag0 = tag;
+ root->tag_scroll = tag;
}
void eve_window_scroll_stop(EVEWindow *window) {
EVEWindowRoot *root = window->root;
root->win_scroll = NULL;
- root->tag0 = EVE_NOTAG;
+ root->tag_scroll = EVE_NOTAG;
+}
+
+EVEFont *eve_window_font(EVEWindow *window) {
+ EVEWindowRoot *root = window->root;
+
+ return root->font;
}
diff --git a/fw/fe310/eos/eve/screen/window.h b/fw/fe310/eos/eve/screen/window.h
index 27465c4..ac52fb8 100644
--- a/fw/fe310/eos/eve/screen/window.h
+++ b/fw/fe310/eos/eve/screen/window.h
@@ -8,12 +8,14 @@ typedef struct EVEWindow {
EVERect g;
char *name;
EVEView *view;
+ void *view_id;
struct EVEWindowRoot *root;
struct EVEWindow *parent;
struct EVEWindow *next;
struct EVEWindow *prev;
struct EVEWindow *child_head;
struct EVEWindow *child_tail;
+ int dirty;
} EVEWindow;
typedef struct EVEWindowKbd {
@@ -28,7 +30,7 @@ typedef struct EVEWindowRoot {
EVEFont *font;
EVEWindowKbd *win_kbd;
EVEWindow *win_scroll;
- uint8_t tag0;
+ uint8_t tag_scroll;
} EVEWindowRoot;
void eve_window_init(EVEWindow *window, EVERect *g, EVEWindow *parent, char *name);
@@ -36,8 +38,13 @@ void eve_window_init_root(EVEWindowRoot *root, EVERect *g, char *name, EVEFont *
void eve_window_init_kbd(EVEWindowKbd *win_kbd, EVERect *g, EVEWindowRoot *root, char *name, EVEKbd *kbd);
void eve_window_set_parent(EVEWindow *window, EVEWindow *parent);
+void eve_window_attach_view(EVEWindow *window, EVEView *view, void *view_id);
+void eve_window_detach_view(EVEWindow *window);
+int eve_window_dirty(EVEWindow *window);
+void eve_window_clean(EVEWindow *window);
+
int eve_window_visible(EVEWindow *window);
-void eve_window_visible_g(EVEWindow *window, EVERect *g);
+void eve_window_visible_g(EVEWindow *window, EVERect *rect);
void eve_window_append(EVEWindow *window);
void eve_window_insert_above(EVEWindow *window, EVEWindow *win_prev);
@@ -46,15 +53,16 @@ void eve_window_remove(EVEWindow *window);
EVEWindow *eve_window_search(EVEWindow *window, char *name);
uint8_t eve_window_draw(EVEWindow *window, uint8_t tag0);
-int eve_window_touch(EVEWindow *window, EVETouch *touch, uint16_t evt, uint8_t tag0);
+int eve_window_touch(EVEWindow *window, EVETouch *touch, uint16_t evt);
void eve_window_root_draw(EVEWindowRoot *root);
-void eve_window_root_touch(EVETouch *touch, uint16_t evt, uint8_t tag0, void *win);
+void eve_window_root_touch(EVETouch *touch, uint16_t evt, void *win);
EVEKbd *eve_window_kbd(EVEWindow *window);
void eve_window_kbd_attach(EVEWindow *window);
void eve_window_kbd_detach(EVEWindow *window);
-EVEFont *eve_window_font(EVEWindow *window);
-EVEWindow *eve_window_scroll(EVEWindowRoot *root, uint8_t *tag);
+EVEWindow *eve_window_scroll(EVEWindow *window, uint8_t *tag);
void eve_window_scroll_start(EVEWindow *window, uint8_t tag);
void eve_window_scroll_stop(EVEWindow *window);
+
+EVEFont *eve_window_font(EVEWindow *window);
diff --git a/fw/fe310/eos/eve/widget/freew.c b/fw/fe310/eos/eve/widget/freew.c
index 11b8e50..f88f81e 100644
--- a/fw/fe310/eos/eve/widget/freew.c
+++ b/fw/fe310/eos/eve/widget/freew.c
@@ -10,22 +10,28 @@
#include "widget.h"
-void eve_freew_init(EVEFreeWidget *widget, EVERect *g, EVEPage *page, eve_freew_draw_t draw, eve_freew_touch_t touch, eve_kbd_input_handler_t putc) {
+int eve_freew_init(EVEFreeWidget *widget, EVERect *g, EVEPage *page, eve_freew_draw_t draw, eve_freew_touch_t touch, eve_kbd_input_handler_t putc) {
EVEWidget *_widget = &widget->w;
memset(widget, 0, sizeof(EVEFreeWidget));
eve_widget_init(_widget, EVE_WIDGET_TYPE_FREE, g, page, eve_freew_draw, eve_freew_touch, putc);
widget->_draw = draw;
widget->_touch = touch;
+
+ return EVE_OK;
+}
+
+void eve_freew_set_uievt_handler(EVEFreeWidget *widget, eve_freew_uievt_t handler) {
+ widget->_uievt = handler;
}
int eve_freew_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
EVEFreeWidget *widget = (EVEFreeWidget *)_widget;
EVEFreeSpec *tspec = &spec->tspec.free;
+ int rv;
- eve_freew_init(widget, &spec->g, page, tspec->draw, tspec->touch, tspec->putc);
-
- return EVE_OK;
+ rv = eve_freew_init(widget, &spec->g, page, tspec->draw, tspec->touch, tspec->putc);
+ return rv;
}
uint8_t eve_freew_draw(EVEWidget *_widget, uint8_t tag0) {
@@ -42,27 +48,53 @@ uint8_t eve_freew_draw(EVEWidget *_widget, uint8_t tag0) {
int eve_freew_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
EVEFreeWidget *widget = (EVEFreeWidget *)_widget;
- int ret;
+ int rv;
+
+ /* widget received non-touch event */
+ if (evt & EVE_TOUCH_ETYPE_EXT) {
+ evt &= ~EVE_TOUCH_ETYPE_EXT;
+ if (widget->_uievt) widget->_uievt(widget, evt);
- ret = widget->_touch(widget, touch, evt);
- return ret;
+ /* always return 0 for non-touch events */
+ return 0;
+ }
+
+ rv = widget->_touch(widget, touch, evt);
+ return rv;
}
-uint8_t eve_freew_tag(EVEFreeWidget *widget) {
+uint8_t eve_freew_tag0(EVEFreeWidget *widget) {
+ EVEWidget *_widget = &widget->w;
+
+ return _widget->tag0;
+}
+
+void eve_freew_tag(EVEFreeWidget *widget, uint8_t tag_opt) {
EVEWidget *_widget = &widget->w;
- uint8_t ret = EVE_NOTAG;
if (_widget->tagN != EVE_NOTAG) {
- ret = _widget->tagN;
- eve_cmd_dl(TAG(ret));
+ eve_tag_set_opt(_widget->tagN, tag_opt);
+ eve_cmd_dl(TAG(_widget->tagN));
_widget->tagN++;
}
+}
- return ret;
+void eve_freew_tag_idx(EVEFreeWidget *widget, uint8_t i) {
+ EVEWidget *_widget = &widget->w;
+ uint8_t tag = _widget->tag0;
+
+ if (tag != EVE_NOTAG) {
+ tag += i;
+
+ /* prevents overflow */
+ if ((tag >= _widget->tag0) && (tag < _widget->tagN)) {
+ eve_cmd_dl(TAG(tag));
+ }
+ }
}
-uint8_t eve_widget_tag_index(EVEFreeWidget *widget, uint8_t tag) {
+uint8_t eve_freew_get_tag_idx(EVEFreeWidget *widget, uint8_t tag) {
EVEWidget *_widget = &widget->w;
return tag - _widget->tag0;
-} \ No newline at end of file
+}
diff --git a/fw/fe310/eos/eve/widget/freew.h b/fw/fe310/eos/eve/widget/freew.h
index cbcd08b..82038c4 100644
--- a/fw/fe310/eos/eve/widget/freew.h
+++ b/fw/fe310/eos/eve/widget/freew.h
@@ -5,11 +5,13 @@ struct EVEWidgetSpec;
typedef void (*eve_freew_draw_t) (struct EVEFreeWidget *);
typedef int (*eve_freew_touch_t) (struct EVEFreeWidget *, EVETouch *, uint16_t);
+typedef void (*eve_freew_uievt_t) (struct EVEFreeWidget *, uint16_t);
typedef struct EVEFreeWidget {
EVEWidget w;
eve_freew_draw_t _draw;
eve_freew_touch_t _touch;
+ eve_freew_uievt_t _uievt;
} EVEFreeWidget;
typedef struct EVEFreeSpec {
@@ -18,11 +20,14 @@ typedef struct EVEFreeSpec {
eve_kbd_input_handler_t putc;
} EVEFreeSpec;
-void eve_freew_init(EVEFreeWidget *widget, EVERect *g, EVEPage *page, eve_freew_draw_t draw, eve_freew_touch_t touch, eve_kbd_input_handler_t putc);
+int eve_freew_init(EVEFreeWidget *widget, EVERect *g, EVEPage *page, eve_freew_draw_t draw, eve_freew_touch_t touch, eve_kbd_input_handler_t putc);
+void eve_freew_set_uievt_handler(EVEFreeWidget *widget, eve_freew_uievt_t handler);
int eve_freew_create(EVEWidget *_widget, struct EVEWidgetSpec *spec, EVEPage *page);
uint8_t eve_freew_draw(EVEWidget *_widget, uint8_t tag0);
int eve_freew_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt);
-uint8_t eve_freew_tag(EVEFreeWidget *widget);
-uint8_t eve_widget_tag_index(EVEFreeWidget *widget, uint8_t tag); \ No newline at end of file
+uint8_t eve_freew_tag0(EVEFreeWidget *widget);
+void eve_freew_tag(EVEFreeWidget *widget, uint8_t tag_opt);
+void eve_freew_tag_idx(EVEFreeWidget *widget, uint8_t i);
+uint8_t eve_freew_get_tag_idx(EVEFreeWidget *widget, uint8_t tag);
diff --git a/fw/fe310/eos/eve/widget/label.c b/fw/fe310/eos/eve/widget/label.c
index 43c710c..d596677 100644
--- a/fw/fe310/eos/eve/widget/label.c
+++ b/fw/fe310/eos/eve/widget/label.c
@@ -10,26 +10,31 @@
#include "label.h"
-void eve_label_init(EVELabel *label, EVERect *g, EVEFont *font, char *title) {
+int eve_label_init(EVELabel *label, EVERect *g, EVEFont *font, char *title) {
size_t title_len;
int title_w, rv;
- memset(label, 0, sizeof(EVELabel));
- if (g) label->g = *g;
+ if (font == NULL) return EVE_ERR;
- rv = eve_font_verify(font, label->title, &title_w, &title_len);
- if (rv) title[title_len] = '\0';
+ rv = eve_font_verify(font, title, 0, &title_w, &title_len);
+ if (rv) return rv;
+ memset(label, 0, sizeof(EVELabel));
+ if (g) label->g = *g;
label->font = font;
label->title = title;
if (label->g.h == 0) label->g.h = eve_font_h(font);
if (label->g.w == 0) label->g.w = title_w + EVE_LABEL_MARGIN;
+
+ return EVE_OK;
}
-void eve_label_create(EVELabel *label, EVELabelSpec *spec, EVEPage *page) {
+int eve_label_create(EVELabel *label, EVELabelSpec *spec, EVEPage *page) {
EVEFont *font = spec->font ? spec->font : eve_window_font(page->v.window);
+ int rv;
- eve_label_init(label, &spec->g, font, spec->title);
+ rv = eve_label_init(label, &spec->g, font, spec->title);
+ return rv;
}
void eve_label_draw(EVELabel *label) {
diff --git a/fw/fe310/eos/eve/widget/label.h b/fw/fe310/eos/eve/widget/label.h
index 9992f8c..f9c192b 100644
--- a/fw/fe310/eos/eve/widget/label.h
+++ b/fw/fe310/eos/eve/widget/label.h
@@ -15,7 +15,7 @@ typedef struct EVELabelSpec {
int16_t margin;
} EVELabelSpec;
-void eve_label_init(EVELabel *label, EVERect *g, EVEFont *font, char *title);
+int eve_label_init(EVELabel *label, EVERect *g, EVEFont *font, char *title);
-void eve_label_create(EVELabel *label, EVELabelSpec *spec, EVEPage *page);
+int eve_label_create(EVELabel *label, EVELabelSpec *spec, EVEPage *page);
void eve_label_draw(EVELabel *label); \ No newline at end of file
diff --git a/fw/fe310/eos/eve/widget/pagew.c b/fw/fe310/eos/eve/widget/pagew.c
index 77e8f01..0ce4e82 100644
--- a/fw/fe310/eos/eve/widget/pagew.c
+++ b/fw/fe310/eos/eve/widget/pagew.c
@@ -10,8 +10,12 @@
#include "widget.h"
-void eve_pagew_init(EVEPageWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, char *title, eve_view_constructor_t constructor) {
+int eve_pagew_init(EVEPageWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, char *title, eve_view_constructor_t constructor) {
EVEWidget *_widget = &widget->w;
+ int title_w, rv;
+
+ rv = eve_font_verify(font, title, 0, &title_w, NULL);
+ if (rv) return rv;
memset(widget, 0, sizeof(EVEPageWidget));
eve_widget_init(_widget, EVE_WIDGET_TYPE_PAGE, g, page, eve_pagew_draw, eve_pagew_touch, NULL);
@@ -19,16 +23,19 @@ void eve_pagew_init(EVEPageWidget *widget, EVERect *g, EVEPage *page, EVEFont *f
widget->title = title;
widget->constructor = constructor;
if (_widget->g.h == 0) _widget->g.h = eve_font_h(widget->font);
+ if (_widget->g.w == 0) _widget->g.w = title_w;
+
+ return EVE_OK;
}
int eve_pagew_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
EVEPageWidget *widget = (EVEPageWidget *)_widget;
EVEPageSpec *tspec = &spec->tspec.page;
EVEFont *font = tspec->font ? tspec->font : eve_window_font(page->v.window);
+ int rv;
- eve_pagew_init(widget, &spec->g, page, font, tspec->title, tspec->constructor);
-
- return EVE_OK;
+ rv = eve_pagew_init(widget, &spec->g, page, font, tspec->title, tspec->constructor);
+ return rv;
}
uint8_t eve_pagew_draw(EVEWidget *_widget, uint8_t tag0) {
@@ -50,6 +57,9 @@ int eve_pagew_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
EVEPage *parent = _widget->page;
EVEPageWidget *widget = (EVEPageWidget *)_widget;
+ /* widget received non-touch event, always return 0 */
+ if (evt & EVE_TOUCH_ETYPE_EXT) return 0;
+
if (evt & EVE_TOUCH_ETYPE_TAG_UP) {
eve_page_open(parent, widget->constructor);
return 1;
diff --git a/fw/fe310/eos/eve/widget/pagew.h b/fw/fe310/eos/eve/widget/pagew.h
index b1a91b2..9a1f1a1 100644
--- a/fw/fe310/eos/eve/widget/pagew.h
+++ b/fw/fe310/eos/eve/widget/pagew.h
@@ -15,7 +15,7 @@ typedef struct EVEPageSpec {
eve_view_constructor_t constructor;
} EVEPageSpec;
-void eve_pagew_init(EVEPageWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, char *title, eve_view_constructor_t constructor);
+int eve_pagew_init(EVEPageWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, char *title, eve_view_constructor_t constructor);
int eve_pagew_create(EVEWidget *_widget, struct EVEWidgetSpec *spec, EVEPage *page);
uint8_t eve_pagew_draw(EVEWidget *_widget, uint8_t tag0);
diff --git a/fw/fe310/eos/eve/widget/selectw.c b/fw/fe310/eos/eve/widget/selectw.c
index f0dfed9..c0e2bfe 100644
--- a/fw/fe310/eos/eve/widget/selectw.c
+++ b/fw/fe310/eos/eve/widget/selectw.c
@@ -14,19 +14,26 @@
#define DIVC(x,y) ((x) / (y) + ((x) % (y) != 0))
-static int selectw_verify(utf8_t *option, uint16_t option_size) {
+static int selectw_verify(utf8_t *option, uint16_t option_size, EVEFont *font, size_t *_o_len) {
size_t o_len;
uint16_t o_curr;
int rv;
o_curr = 0;
while (o_curr < option_size) {
- rv = utf8_verify(option + o_curr, option_size - o_curr, &o_len);
- if (rv) return EVE_ERR;
- if (o_len == 0) return EVE_OK;
+ rv = eve_font_verify(font, option + o_curr, option_size - o_curr, NULL, &o_len);
+ if (rv) {
+ if (_o_len) *_o_len = o_curr;
+ return rv;
+ }
o_curr += o_len + 1;
+ if (o_len == 0) {
+ if (_o_len) *_o_len = o_curr;
+ return EVE_OK;
+ }
}
+ if (_o_len) *_o_len = o_curr;
return EVE_OK;
}
@@ -57,28 +64,32 @@ static void selectw_update_sz(EVESelectWidget *widget, int uievt) {
if (uievt) eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_UPDATE_G, _widget);
}
-void eve_selectw_init(EVESelectWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *option, uint16_t option_size, uint8_t multi) {
+int eve_selectw_init(EVESelectWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *option, uint16_t option_size, uint8_t multi) {
EVEWidget *_widget = &widget->w;
int rv;
+ rv = selectw_verify(option, option_size, font, NULL);
+ if (rv) return rv;
+
memset(widget, 0, sizeof(EVESelectWidget));
eve_widget_init(_widget, EVE_WIDGET_TYPE_SELECT, g, page, eve_selectw_draw, eve_selectw_touch, NULL);
+
widget->font = font;
- rv = selectw_verify(option, option_size);
- if (rv == EVE_OK) {
- widget->option = option;
- widget->option_size = option_size;
- widget->option_count = selectw_count(widget);
- selectw_update_sz(widget, 0);
- }
+ widget->option = option;
+ widget->option_size = option_size;
+ widget->option_count = selectw_count(widget);
+ selectw_update_sz(widget, 0);
+
widget->multi = multi;
widget->select = widget->multi ? 0 : SELECTW_NOSELECT;
+
+ return EVE_OK;
}
int eve_selectw_update(EVESelectWidget *widget) {
int rv, i;
- rv = selectw_verify(widget->option, widget->option_size);
+ rv = selectw_verify(widget->option, widget->option_size, widget->font, NULL);
if (rv) return rv;
widget->option_count = selectw_count(widget);
@@ -92,6 +103,7 @@ int eve_selectw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
EVESelectSpec *tspec = &spec->tspec.select;
EVEFont *font = tspec->font ? tspec->font : eve_window_font(page->v.window);
utf8_t *option;
+ int rv;
option = eve_malloc(tspec->option_size);
if (option == NULL) {
@@ -99,9 +111,8 @@ int eve_selectw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
}
memset(option, 0, tspec->option_size);
- eve_selectw_init(widget, &spec->g, page, font, option, tspec->option_size, tspec->multi);
-
- return EVE_OK;
+ rv = eve_selectw_init(widget, &spec->g, page, font, option, tspec->option_size, tspec->multi);
+ return rv;
}
void eve_selectw_destroy(EVEWidget *_widget) {
@@ -172,6 +183,10 @@ uint8_t eve_selectw_draw(EVEWidget *_widget, uint8_t tag0) {
int eve_selectw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
EVESelectWidget *widget = (EVESelectWidget *)_widget;
+ EVEPage *page = _widget->page;
+
+ /* widget received non-touch event, always return 0 */
+ if (evt & EVE_TOUCH_ETYPE_EXT) return 0;
if (evt & EVE_TOUCH_ETYPE_TAG_UP) {
int i = touch->tag0 - _widget->tag0 + widget->line0;
@@ -192,6 +207,8 @@ int eve_selectw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
}
}
+ eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_UPDATE, _widget);
+
return 1;
}
@@ -226,8 +243,8 @@ int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option) {
int o_curr;
int rv, i;
- rv = utf8_verify(option, strlen(option) + 1, NULL);
- if (rv) return EVE_ERR;
+ rv = eve_font_verify(widget->font, option, 0, NULL, NULL);
+ if (rv) return rv;
o_curr = 0;
i = 0;
@@ -252,10 +269,11 @@ int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option) {
int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size) {
int rv, i;
- rv = selectw_verify(option, option_size);
- if (rv) return rv;
if (option_size > widget->option_size) return EVE_ERR_FULL;
+ rv = selectw_verify(option, option_size, widget->font, NULL);
+ if (rv) return rv;
+
memcpy(widget->option, option, option_size);
memset(widget->option + option_size, 0, widget->option_size - option_size);
@@ -264,3 +282,23 @@ int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t opt
return EVE_OK;
}
+
+void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size) {
+ size_t good_l, bad_l;
+ int rv;
+
+ do {
+ rv = selectw_verify(option, option_size, widget->font, &good_l);
+ if (rv == EVE_OK) return;
+
+ option += good_l;
+ option_size -= good_l;
+
+ bad_l = strnlen(option, option_size);
+ if (bad_l != option_size) {
+ bad_l++;
+ }
+ memmove(option, option + bad_l, option_size - bad_l);
+ memset(option + option_size - bad_l, 0, bad_l);
+ } while (bad_l != option_size);
+}
diff --git a/fw/fe310/eos/eve/widget/selectw.h b/fw/fe310/eos/eve/widget/selectw.h
index aa49866..185d787 100644
--- a/fw/fe310/eos/eve/widget/selectw.h
+++ b/fw/fe310/eos/eve/widget/selectw.h
@@ -19,7 +19,7 @@ typedef struct EVESelectSpec {
uint8_t multi;
} EVESelectSpec;
-void eve_selectw_init(EVESelectWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *option, uint16_t option_size, uint8_t multi);
+int eve_selectw_init(EVESelectWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *option, uint16_t option_size, uint8_t multi);
int eve_selectw_update(EVESelectWidget *widget);
int eve_selectw_create(EVEWidget *_widget, struct EVEWidgetSpec *spec, EVEPage *page);
@@ -31,3 +31,4 @@ utf8_t *eve_selectw_option(EVESelectWidget *widget, int idx);
utf8_t *eve_selectw_option_selected(EVESelectWidget *widget);
int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option);
int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size);
+void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size);
diff --git a/fw/fe310/eos/eve/widget/spacerw.c b/fw/fe310/eos/eve/widget/spacerw.c
index aa5bec1..f597a2d 100644
--- a/fw/fe310/eos/eve/widget/spacerw.c
+++ b/fw/fe310/eos/eve/widget/spacerw.c
@@ -10,15 +10,18 @@
#include "widget.h"
-void eve_spacerw_init(EVEWidget *widget, EVERect *g, EVEPage *page) {
+int eve_spacerw_init(EVEWidget *widget, EVERect *g, EVEPage *page) {
memset(widget, 0, sizeof(EVEWidget));
eve_widget_init(widget, EVE_WIDGET_TYPE_SPACER, g, page, eve_spacerw_draw, eve_spacerw_touch, NULL);
+
+ return EVE_OK;
}
int eve_spacerw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
- eve_spacerw_init(_widget, &spec->g, page);
+ int rv;
- return EVE_OK;
+ rv = eve_spacerw_init(_widget, &spec->g, page);
+ return rv;
}
uint8_t eve_spacerw_draw(EVEWidget *_widget, uint8_t tag0) {
diff --git a/fw/fe310/eos/eve/widget/spacerw.h b/fw/fe310/eos/eve/widget/spacerw.h
index 621b45b..ae97479 100644
--- a/fw/fe310/eos/eve/widget/spacerw.h
+++ b/fw/fe310/eos/eve/widget/spacerw.h
@@ -2,7 +2,7 @@
struct EVEWidgetSpec;
-void eve_spacerw_init(EVEWidget *widget, EVERect *g, EVEPage *page);
+int eve_spacerw_init(EVEWidget *widget, EVERect *g, EVEPage *page);
int eve_spacerw_create(EVEWidget *_widget, struct EVEWidgetSpec *spec, EVEPage *page);
uint8_t eve_spacerw_draw(EVEWidget *_widget, uint8_t tag0);
diff --git a/fw/fe310/eos/eve/widget/strw.c b/fw/fe310/eos/eve/widget/strw.c
index 6a2692b..847de49 100644
--- a/fw/fe310/eos/eve/widget/strw.c
+++ b/fw/fe310/eos/eve/widget/strw.c
@@ -12,7 +12,7 @@
#include "widget.h"
-#define STRW_TOUCH_OPT EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_X | EVE_TOUCH_OPT_TRACK_EXT_X | EVE_TOUCH_OPT_LPRESS
+#define STRW_TOUCH_OPT EVE_TOUCH_OPT_TRACK_X | EVE_TOUCH_OPT_TRACK_EXT_X | EVE_TOUCH_OPT_LPRESS
#define STRW_TMODE_NONE 0
#define STRW_TMODE_CRSR 1
@@ -27,37 +27,33 @@
#define CHAR_VALID_INPUT(c) ((c >= 0x20) && (c < 0x7f))
-void eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *str, uint16_t str_size) {
+int eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *str, uint16_t str_size) {
EVEWidget *_widget = &widget->w;
size_t str_len;
int str_w, rv;
+ rv = eve_font_verify(font, str, str_size, &str_w, &str_len);
+ if (rv) return rv;
+
memset(widget, 0, sizeof(EVEStrWidget));
eve_widget_init(_widget, EVE_WIDGET_TYPE_STR, g, page, eve_strw_draw, eve_strw_touch, eve_strw_putc);
- rv = utf8_verify(str, str_size, &str_len);
- if (rv) str[str_len] = '\0';
-
- rv = eve_font_verify(font, str, &str_w, &str_len);
- if (rv) str[str_len] = '\0';
-
widget->font = font;
widget->str = str;
widget->str_size = str_size;
widget->str_len = str_len;
widget->str_g.w = str_w;
if (_widget->g.h == 0) _widget->g.h = eve_font_h(widget->font);
+
+ return EVE_OK;
}
int eve_strw_update(EVEStrWidget *widget) {
size_t str_len;
int str_w, rv;
- rv = utf8_verify(widget->str, widget->str_size, &str_len);
- if (rv) widget->str[str_len] = '\0';
-
- rv = eve_font_verify(widget->font, widget->str, &str_w, &str_len);
- if (rv) widget->str[str_len] = '\0';
+ rv = eve_font_verify(widget->font, widget->str, widget->str_size, &str_w, &str_len);
+ if (rv) return rv;
widget->str_len = str_len;
widget->str_g.w = str_w;
@@ -71,14 +67,15 @@ int eve_strw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
EVEFont *font = tspec->font ? tspec->font : eve_window_font(page->v.window);
utf8_t *str;
uint16_t *line;
+ int rv;
str = eve_malloc(tspec->str_size);
if (str == NULL) return EVE_ERR_NOMEM;
str[0] = '\0';
- eve_strw_init(widget, &spec->g, page, font, str, tspec->str_size);
-
- return EVE_OK;
+ rv = eve_strw_init(widget, &spec->g, page, font, str, tspec->str_size);
+ if (rv) eve_free(str);
+ return rv;
}
void eve_strw_destroy(EVEWidget *_widget) {
@@ -87,15 +84,20 @@ void eve_strw_destroy(EVEWidget *_widget) {
eve_free(widget->str);
}
-static void show_rect(EVEStrWidget *widget) {
+static void show_text(EVEStrWidget *widget, EVEStrCursor *cursor, int del_w) {
EVEWidget *_widget = &widget->w;
- EVERect focus;
+ int w0 = widget->font->w;
+ int w1 = _widget->g.w - widget->font->w;
- focus.x = _widget->g.x;
- focus.y = _widget->g.y;
- focus.w = _widget->g.w;
- focus.h = 2 * widget->font->h;
- eve_page_show_rect(_widget->page, &focus);
+ if (del_w && (widget->str_g.w - widget->str_g.x < w1)) {
+ widget->str_g.x = (widget->str_g.x > del_w ? widget->str_g.x - del_w : 0);
+ }
+ if (cursor->x - widget->str_g.x < w0) {
+ widget->str_g.x = (cursor->x > w0 ? cursor->x - w0 : 0);
+ }
+ if (cursor->x - widget->str_g.x > w1) {
+ widget->str_g.x = cursor->x - w1;
+ }
}
static EVEStrCursor *cursor_prox(EVEStrWidget *widget, EVEStrCursor *cursor, EVETouch *touch, short *dx) {
@@ -156,7 +158,7 @@ uint8_t eve_strw_draw(EVEWidget *_widget, uint8_t tag0) {
_widget->tag0 = tag0;
if (tag0 != EVE_NOTAG) {
eve_cmd_dl(TAG(tag0));
- eve_touch_set_opt(tag0, STRW_TOUCH_OPT);
+ eve_tag_set_opt(tag0, STRW_TOUCH_OPT);
tag0++;
}
_widget->tagN = tag0;
@@ -228,7 +230,22 @@ int eve_strw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
EVEPage *page = _widget->page;
EVEStrCursor *t_cursor = NULL;
short dx;
- int ret = 0;
+ int rv = 0;
+
+ /* widget received non-touch event */
+ if (evt & EVE_TOUCH_ETYPE_EXT) {
+ evt &= ~EVE_TOUCH_ETYPE_EXT;
+ switch (evt) {
+ case EVE_UIEVT_WIDGET_FOCUS_OUT: {
+ if (widget->cursor1.on) eve_strw_cursor_clear(widget, &widget->cursor1);
+ if (widget->cursor2.on) eve_strw_cursor_clear(widget, &widget->cursor2);
+ break;
+ }
+ }
+
+ /* always return 0 for non-touch events */
+ return 0;
+ }
if (evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TRACK_START)) {
if (widget->cursor2.on) {
@@ -266,10 +283,11 @@ int eve_strw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
case STRW_TMODE_CRSR:
eve_strw_cursor_set(widget, widget->track.cursor, eve_page_x(page, touch->x) + widget->track.dx);
+ show_text(widget, widget->track.cursor, 0);
break;
}
}
- ret = 1;
+ rv = 1;
} else {
if (evt & EVE_TOUCH_ETYPE_LPRESS) {
if (widget->cursor2.on) {
@@ -283,13 +301,12 @@ int eve_strw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
} else {
// select
}
- ret = 1;
+ rv = 1;
}
- if ((evt & EVE_TOUCH_ETYPE_POINT_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_ABORT | EVE_TOUCH_EETYPE_LPRESS))) {
+ if ((evt & EVE_TOUCH_ETYPE_POINT_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_TRACK_ABORT | EVE_TOUCH_EETYPE_LPRESS))) {
eve_strw_cursor_set(widget, &widget->cursor1, eve_page_x(page, touch->x0));
if (widget->cursor2.on) eve_strw_cursor_clear(widget, &widget->cursor2);
- show_rect(widget);
- ret = 1;
+ rv = 1;
}
}
@@ -299,7 +316,7 @@ int eve_strw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
widget->track.dx = 0;
}
- return ret;
+ return rv;
}
void eve_strw_putc(void *w, int c) {
@@ -309,19 +326,18 @@ void eve_strw_putc(void *w, int c) {
EVEStrCursor *cursor2 = &widget->cursor2;
utf8_t *str;
utf8_t *clipb = NULL;
- int w0 = widget->font->w;
- int w1 = _widget->g.w - widget->font->w;
int ins_c = 0, del_c = 0;
int ins_w = 0, del_w = 0;
- if (c == EVE_PAGE_KBDCH_CLOSE) {
- if (cursor1->on) eve_strw_cursor_clear(widget, cursor1);
- if (cursor2->on) eve_strw_cursor_clear(widget, cursor2);
+ if (!cursor1->on) return;
+
+ if (c == '\n') {
+ EVEPage *page = _widget->page;
+
+ eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_UPDATE, _widget);
return;
}
- if (!cursor1->on) return;
-
if (!cursor2->on && ((c == CH_BS) || (c == CH_DEL))) {
ucp_t uc;
@@ -349,10 +365,6 @@ void eve_strw_putc(void *w, int c) {
}
break;
}
- if (widget->str_g.w - widget->str_g.x < w1) {
- widget->str_g.x -= del_w;
- if (widget->str_g.x < 0) widget->str_g.x = 0;
- }
} else {
EVEStrCursor *c1 = cursor1;
EVEStrCursor *c2 = cursor1;
@@ -387,9 +399,8 @@ void eve_strw_putc(void *w, int c) {
clipb = eve_clipb_get();
if (clipb) {
- rv = utf8_verify(clipb, EVE_CLIPB_SIZE_BUF, &clipb_len);
- if (!rv) ins_w = eve_font_str_w(widget->font, clipb);
- if (rv || (ins_w < 0)) {
+ rv = eve_font_verify(widget->font, clipb, EVE_CLIPB_SIZE_BUF, &ins_w, &clipb_len);
+ if (rv) {
clipb = NULL;
clipb_len = 0;
ins_w = 0;
@@ -419,8 +430,7 @@ void eve_strw_putc(void *w, int c) {
if (cursor2->on) eve_strw_cursor_clear(widget, cursor2);
}
- if (cursor1->x - widget->str_g.x < w0) widget->str_g.x = cursor1->x > w0 ? cursor1->x - w0 : 0;
- if (cursor1->x - widget->str_g.x > w1) widget->str_g.x = cursor1->x - w1;
+ show_text(widget, cursor1, del_w);
}
void eve_strw_cursor_set(EVEStrWidget *widget, EVEStrCursor *cursor, int16_t x) {
diff --git a/fw/fe310/eos/eve/widget/strw.h b/fw/fe310/eos/eve/widget/strw.h
index acfd74b..a2817d0 100644
--- a/fw/fe310/eos/eve/widget/strw.h
+++ b/fw/fe310/eos/eve/widget/strw.h
@@ -33,7 +33,7 @@ typedef struct EVEStrSpec {
uint16_t str_size;
} EVEStrSpec;
-void eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *str, uint16_t str_size);
+int eve_strw_init(EVEStrWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *str, uint16_t str_size);
int eve_strw_update(EVEStrWidget *widget);
int eve_strw_create(EVEWidget *_widget, struct EVEWidgetSpec *spec, EVEPage *page);
diff --git a/fw/fe310/eos/eve/widget/textw.c b/fw/fe310/eos/eve/widget/textw.c
index 7998e75..0a6a700 100644
--- a/fw/fe310/eos/eve/widget/textw.c
+++ b/fw/fe310/eos/eve/widget/textw.c
@@ -12,7 +12,7 @@
#include "widget.h"
-#define TEXTW_TOUCH_OPT EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT_XY | EVE_TOUCH_OPT_LPRESS
+#define TEXTW_TOUCH_OPT EVE_TOUCH_OPT_TRACK_XY | EVE_TOUCH_OPT_TRACK_EXT_XY | EVE_TOUCH_OPT_LPRESS
#define CH_BS 0x08
#define CH_DEL 0x7f
@@ -30,20 +30,17 @@
#define DIVC(x,y) ((x) / (y) + ((x) % (y) != 0))
-void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size) {
+int eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size) {
EVEWidget *_widget = &widget->w;
size_t text_len;
int rv;
+ rv = eve_font_verify(font, text, text_size, NULL, &text_len);
+ if (rv) return rv;
+
memset(widget, 0, sizeof(EVETextWidget));
eve_widget_init(_widget, EVE_WIDGET_TYPE_TEXT, g, page, eve_textw_draw, eve_textw_touch, eve_textw_putc);
- rv = utf8_verify(text, text_size, &text_len);
- if (rv) text[text_len] = '\0';
-
- rv = eve_font_verify(font, text, NULL, &text_len);
- if (rv) text[text_len] = '\0';
-
widget->font = font;
widget->text = text;
widget->text_size = text_size;
@@ -52,17 +49,16 @@ void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *f
widget->line_size = line_size;
memset(widget->line, 0xff, line_size * sizeof(uint16_t));
eve_textw_text_update(widget, 0, 0);
+
+ return EVE_OK;
}
int eve_textw_update(EVETextWidget *widget) {
size_t text_len;
int rv;
- rv = utf8_verify(widget->text, widget->text_size, &text_len);
- if (rv) widget->text[text_len] = '\0';
-
- rv = eve_font_verify(widget->font, widget->text, NULL, &text_len);
- if (rv) widget->text[text_len] = '\0';
+ rv = eve_font_verify(widget->font, widget->text, widget->text_size, NULL, &text_len);
+ if (rv) return rv;
widget->text_len = text_len;
memset(widget->line, 0xff, widget->line_size * sizeof(uint16_t));
@@ -77,6 +73,7 @@ int eve_textw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
EVEFont *font = tspec->font ? tspec->font : eve_window_font(page->v.window);
utf8_t *text;
uint16_t *line;
+ int rv;
text = eve_malloc(tspec->text_size);
if (text == NULL) {
@@ -89,9 +86,12 @@ int eve_textw_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
return EVE_ERR_NOMEM;
}
- eve_textw_init(widget, &spec->g, page, font, text, tspec->text_size, line, tspec->line_size);
-
- return EVE_OK;
+ rv = eve_textw_init(widget, &spec->g, page, font, text, tspec->text_size, line, tspec->line_size);
+ if (rv) {
+ eve_free(line);
+ eve_free(text);
+ }
+ return rv;
}
void eve_textw_destroy(EVEWidget *_widget) {
@@ -214,7 +214,7 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) {
for (i=line0; i<lineN; i++) {
if (_widget->tagN != EVE_NOTAG) {
eve_cmd_dl(TAG(_widget->tagN));
- eve_touch_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
+ eve_tag_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
_widget->tagN++;
}
if (!s && c1 && (c1->line == i)) {
@@ -257,7 +257,7 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) {
if (lineNvisible) {
if (_widget->tagN != EVE_NOTAG) {
eve_cmd_dl(TAG(_widget->tagN));
- eve_touch_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
+ eve_tag_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
_widget->tagN++;
}
draw_line(widget, lineN, 0, 0, 0, _widget->g.w, 0);
@@ -276,7 +276,27 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
EVEPage *page = _widget->page;
EVETextCursor *t_cursor = NULL;
short dx, dl;
- int ret = 0;
+ int rv = 0;
+
+ /* widget received non-touch event */
+ if (evt & EVE_TOUCH_ETYPE_EXT) {
+ evt &= ~EVE_TOUCH_ETYPE_EXT;
+ switch (evt) {
+ case EVE_UIEVT_WIDGET_FOCUS_IN: {
+ if (widget->cursor1.on) show_rect(widget, &widget->cursor1);
+ break;
+ }
+
+ case EVE_UIEVT_WIDGET_FOCUS_OUT: {
+ if (widget->cursor1.on) eve_textw_cursor_clear(widget, &widget->cursor1);
+ if (widget->cursor2.on) eve_textw_cursor_clear(widget, &widget->cursor2);
+ break;
+ }
+ }
+
+ /* always return 0 for non-touch events */
+ return 0;
+ }
if (evt & (EVE_TOUCH_ETYPE_LPRESS | EVE_TOUCH_ETYPE_TRACK_START)) {
if (widget->cursor2.on) {
@@ -294,7 +314,7 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
if (widget->track.cursor) {
if (evt & EVE_TOUCH_ETYPE_TRACK) eve_textw_cursor_set(widget, widget->track.cursor, touch->tag + widget->track.dl, eve_page_x(page, touch->x) + widget->track.dx);
- ret = 1;
+ rv = 1;
} else {
if (evt & EVE_TOUCH_ETYPE_LPRESS) {
if (widget->cursor2.on) {
@@ -308,13 +328,12 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
} else {
// select
}
- ret = 1;
+ rv = 1;
}
- if ((evt & EVE_TOUCH_ETYPE_TAG_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_ABORT | EVE_TOUCH_EETYPE_LPRESS))) {
+ if ((evt & EVE_TOUCH_ETYPE_TAG_UP) && !(touch->eevt & (EVE_TOUCH_EETYPE_TRACK_XY | EVE_TOUCH_EETYPE_TRACK_ABORT | EVE_TOUCH_EETYPE_LPRESS))) {
eve_textw_cursor_set(widget, &widget->cursor1, touch->tag_up, eve_page_x(page, touch->x0));
if (widget->cursor2.on) eve_textw_cursor_clear(widget, &widget->cursor2);
- show_rect(widget, &widget->cursor1);
- ret = 1;
+ rv = 1;
}
}
@@ -324,7 +343,7 @@ int eve_textw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
widget->track.dl = 0;
}
- return ret;
+ return rv;
}
void eve_textw_putc(void *w, int c) {
@@ -334,16 +353,10 @@ void eve_textw_putc(void *w, int c) {
EVETextCursor *cursor2 = &widget->cursor2;
utf8_t *text;
utf8_t *clipb = NULL;
- int i, r;
+ int i, line;
int ins_c = 0, del_c = 0;
int ch_w = 0;
- if (c == EVE_PAGE_KBDCH_CLOSE) {
- if (cursor1->on) eve_textw_cursor_clear(widget, cursor1);
- if (cursor2->on) eve_textw_cursor_clear(widget, cursor2);
- return;
- }
-
if (!cursor1->on) return;
if (!cursor2->on && ((c == CH_BS) || (c == CH_DEL))) {
@@ -401,9 +414,8 @@ void eve_textw_putc(void *w, int c) {
clipb = eve_clipb_get();
if (clipb) {
- rv = utf8_verify(clipb, EVE_CLIPB_SIZE_BUF, &clipb_len);
- if (!rv) ch_w = eve_font_str_w(widget->font, clipb);
- if (rv || (ch_w < 0)) {
+ rv = eve_font_verify(widget->font, clipb, EVE_CLIPB_SIZE_BUF, &ch_w, &clipb_len);
+ if (rv) {
clipb = NULL;
clipb_len = 0;
ch_w = 0;
@@ -437,9 +449,9 @@ void eve_textw_putc(void *w, int c) {
widget->line[i] += ins_c - del_c;
}
- r = cursor1->line;
- if (cursor1->line) r = eve_textw_text_update(widget, cursor1->line - 1, 1);
- if (r == cursor1->line) eve_textw_text_update(widget, cursor1->line, 1);
+ line = cursor1->line;
+ if (cursor1->line) line = eve_textw_text_update(widget, cursor1->line - 1, 1);
+ if (line == cursor1->line) eve_textw_text_update(widget, cursor1->line, 1);
if (cursor1->line && (cursor1->ch < LINE_START(widget, cursor1->line))) {
while (cursor1->line && (cursor1->ch < LINE_START(widget, cursor1->line))) cursor1->line--;
@@ -449,7 +461,7 @@ void eve_textw_putc(void *w, int c) {
while ((cursor1->line != widget->line_len - 1) && (cursor1->ch > LINE_END(widget, cursor1->line))) cursor1->line++;
eve_textw_cursor_update(widget, cursor1);
show_rect(widget, cursor1);
- } else if ((cursor1->line) && (r != cursor1->line)) {
+ } else if ((cursor1->line) && (line != cursor1->line)) {
eve_textw_cursor_update(widget, cursor1);
} else {
cursor1->x += ch_w;
diff --git a/fw/fe310/eos/eve/widget/textw.h b/fw/fe310/eos/eve/widget/textw.h
index 0fb3505..d3d544b 100644
--- a/fw/fe310/eos/eve/widget/textw.h
+++ b/fw/fe310/eos/eve/widget/textw.h
@@ -34,7 +34,7 @@ typedef struct EVETextSpec {
uint16_t line_size;
} EVETextSpec;
-void eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size);
+int eve_textw_init(EVETextWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, utf8_t *text, uint16_t text_size, uint16_t *line, uint16_t line_size);
int eve_textw_update(EVETextWidget *widget);
int eve_textw_create(EVEWidget *_widget, struct EVEWidgetSpec *spec, EVEPage *page);
diff --git a/fw/fe310/eos/eve/widget/togglew.c b/fw/fe310/eos/eve/widget/togglew.c
index c68e191..06d5fc3 100644
--- a/fw/fe310/eos/eve/widget/togglew.c
+++ b/fw/fe310/eos/eve/widget/togglew.c
@@ -10,7 +10,7 @@
#include "widget.h"
-void eve_togglew_init(EVEToggleWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, char *labels) {
+int eve_togglew_init(EVEToggleWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, char *labels) {
EVEWidget *_widget = &widget->w;
memset(widget, 0, sizeof(EVEToggleWidget));
@@ -18,16 +18,18 @@ void eve_togglew_init(EVEToggleWidget *widget, EVERect *g, EVEPage *page, EVEFon
widget->font = font;
widget->labels = labels;
if (_widget->g.h == 0) _widget->g.h = eve_font_h(widget->font);
+
+ return EVE_OK;
}
int eve_togglew_create(EVEWidget *_widget, EVEWidgetSpec *spec, EVEPage *page) {
EVEToggleWidget *widget = (EVEToggleWidget *)_widget;
EVEToggleSpec *tspec = &spec->tspec.toggle;
EVEFont *font = tspec->font ? tspec->font : eve_window_font(page->v.window);
+ int rv;
- eve_togglew_init(widget, &spec->g, page, font, tspec->labels);
-
- return EVE_OK;
+ rv = eve_togglew_init(widget, &spec->g, page, font, tspec->labels);
+ return rv;
}
uint8_t eve_togglew_draw(EVEWidget *_widget, uint8_t tag0) {
@@ -46,23 +48,30 @@ uint8_t eve_togglew_draw(EVEWidget *_widget, uint8_t tag0) {
int eve_togglew_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
EVEToggleWidget *widget = (EVEToggleWidget *)_widget;
+ EVEPage *page = _widget->page;
+
+ /* widget received non-touch event, always return 0 */
+ if (evt & EVE_TOUCH_ETYPE_EXT) return 0;
if (evt & EVE_TOUCH_ETYPE_TAG_UP) {
widget->state = !widget->state;
+
+ eve_view_uievt_push(&page->v, EVE_UIEVT_WIDGET_UPDATE, _widget);
+
return 1;
}
return 0;
}
+uint8_t eve_togglew_get(EVEToggleWidget *widget) {
+ return widget->state;
+}
+
void eve_togglew_set(EVEToggleWidget *widget) {
widget->state = 1;
}
-void eve_togglew_clr(EVEToggleWidget *widget) {
+void eve_togglew_clear(EVEToggleWidget *widget) {
widget->state = 0;
}
-
-uint8_t eve_togglew_get(EVEToggleWidget *widget) {
- return widget->state;
-} \ No newline at end of file
diff --git a/fw/fe310/eos/eve/widget/togglew.h b/fw/fe310/eos/eve/widget/togglew.h
index aa5485d..af37672 100644
--- a/fw/fe310/eos/eve/widget/togglew.h
+++ b/fw/fe310/eos/eve/widget/togglew.h
@@ -17,12 +17,12 @@ typedef struct EVEToggleSpec {
uint8_t state;
} EVEToggleSpec;
-void eve_togglew_init(EVEToggleWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, char *labels);
+int eve_togglew_init(EVEToggleWidget *widget, EVERect *g, EVEPage *page, EVEFont *font, char *labels);
int eve_togglew_create(EVEWidget *_widget, struct EVEWidgetSpec *spec, EVEPage *page);
uint8_t eve_togglew_draw(EVEWidget *_widget, uint8_t tag0);
int eve_togglew_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt);
+uint8_t eve_togglew_get(EVEToggleWidget *widget);
void eve_togglew_set(EVEToggleWidget *widget);
-void eve_togglew_clr(EVEToggleWidget *widget);
-uint8_t eve_togglew_get(EVEToggleWidget *widget); \ No newline at end of file
+void eve_togglew_clear(EVEToggleWidget *widget);
diff --git a/fw/fe310/eos/eve/widget/widget.c b/fw/fe310/eos/eve/widget/widget.c
index 88b90a9..8b0a2e4 100644
--- a/fw/fe310/eos/eve/widget/widget.c
+++ b/fw/fe310/eos/eve/widget/widget.c
@@ -49,16 +49,10 @@ void eve_widget_destroy(EVEWidget *widget) {
if (_eve_widget_destroy[widget->type]) _eve_widget_destroy[widget->type](widget);
}
-void eve_widget_set_focus(EVEWidget *widget) {
- EVEPage *page = widget->page;
-
- eve_page_set_focus(page, widget);
-}
-
void eve_widget_set_flags(EVEWidget *widget, uint8_t flags) {
widget->flags |= flags;
}
-void eve_widget_clr_flags(EVEWidget *widget, uint8_t flags) {
+void eve_widget_clear_flags(EVEWidget *widget, uint8_t flags) {
widget->flags &= ~flags;
}
diff --git a/fw/fe310/eos/eve/widget/widget.h b/fw/fe310/eos/eve/widget/widget.h
index a565b53..e7ab2f2 100644
--- a/fw/fe310/eos/eve/widget/widget.h
+++ b/fw/fe310/eos/eve/widget/widget.h
@@ -45,6 +45,5 @@ size_t eve_widget_size(uint8_t type);
void eve_widget_set_label(EVEWidget *widget, EVELabel *label);
EVEWidget *eve_widget_next(EVEWidget *widget);
-void eve_widget_set_focus(EVEWidget *widget);
void eve_widget_set_flags(EVEWidget *widget, uint8_t flags);
-void eve_widget_clr_flags(EVEWidget *widget, uint8_t flags); \ No newline at end of file
+void eve_widget_clear_flags(EVEWidget *widget, uint8_t flags); \ No newline at end of file