diff options
Diffstat (limited to 'fw/fe310/eos/eve')
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, ¶m); -    } -    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, ¶m);  } -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  | 
