#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "app/app.h" #include "cell.h" #include "modem.h" typedef struct { uint32_t mem; EVEText text; EVEViewStack *stack; } VParam; static void key_down(void *p, int c) { EVEView *view = p; VParam *param = view->param; EVEText *text= ¶m->text; unsigned char *buf; uint16_t offset; int i; if (c == 0x11) { modem_close(view); return; } buf = eos_cell_uart_data_buffer(&offset); i = 1; if (c == '\n') { buf[0] = '\r'; buf[1] = '\n'; i++; } else { buf[0] = c; } eos_cell_send_buffer(buf, i, offset, 0); eve_text_scroll0(text); } static void handle_uart(unsigned char type) { int i, c; unsigned char *buf; uint16_t offset; c = eos_uart_getc(0); if (c == EOS_ERR_EMPTY) return; if (c == 0x11) { EVEView *view = app_search_view("main"); eve_select(); modem_close(view); eve_touch_clear_opt(); eve_window_root_draw(view->window->root); eve_deselect(); return; } buf = eos_cell_uart_data_buffer(&offset); buf[0] = c; i = 1; while ((c = eos_uart_getc(0)) != EOS_ERR_EMPTY) { buf[i++] = c; if (i == EOS_NET_SIZE_BUF - offset) break; } eos_cell_send_buffer(buf, i, offset, 0); eos_uart_rxwm_set(0); } static void handle_cell_msg(unsigned char type, unsigned char *buffer, uint16_t len) { EVEView *view; VParam *param; view = app_search_view("main"); param = view->param; if (type == EOS_CELL_MTYPE_UART_DATA) { EVEText *text = ¶m->text; int i; eve_select(); for (i=1; idirty) { text->dirty = 0; eve_window_root_draw(view->window->root); } eve_deselect(); eos_net_free(buffer, 0); } else { cell_msg_handler(type, buffer, len); } } static uint8_t modem_draw(EVEView *view, uint8_t tag0) { VParam *param = view->param; EVEText *text = ¶m->text; tag0 = eve_view_clear(view, tag0, 0); return eve_text_draw(text, tag0); } static int modem_touch(EVEView *view, EVETouch *touch, uint16_t evt, uint8_t tag0) { VParam *param = view->param; EVEText *text = ¶m->text; return eve_text_touch(text, touch, evt, tag0); } int modem_app(EVEWindow *window, EVEViewStack *stack) { unsigned char *buf; EVEWindowRoot *root = window->root; EVEKbd *kbd = eve_window_kbd(window); EVERect g = {0, 60, 480, 512}; EVEView *view; VParam *param; int rv; view = eve_malloc(sizeof(EVEView)); if (view == NULL) { rv = EVE_ERR_NOMEM; APP_LOG(APP_LOG_ERR, "OUT OF MEMORY\n"); return rv; } param = eve_malloc(sizeof(VParam)); if (param == NULL) { rv = EVE_ERR_NOMEM; eve_free(view); APP_LOG(APP_LOG_ERR, "OUT OF MEMORY\n"); return rv; } param->mem = root->mem_next; param->stack = stack; eve_text_init(¶m->text, &g, 30, 16, 200, root->mem_next, &root->mem_next); eve_view_init(view, window, modem_draw, modem_touch, NULL, param); eve_kbd_set_handler(kbd, key_down, view); eve_window_kbd_attach(window); eos_uart_flush_rx(); eos_uart_set_handler(EOS_UART_ETYPE_RX, handle_uart); eos_net_acquire_for_evt(EOS_EVT_UART | EOS_UART_ETYPE_RX, 1); eos_uart_rxwm_set(0); eos_cell_set_handler(EOS_CELL_MTYPE_DEV, handle_cell_msg); eos_cell_uart_take(NULL, 0); return EVE_OK; } void modem_close(EVEView *view) { VParam *param = view->param; EVEWindow *window = view->window; EVEWindowRoot *root = window->root; EVEKbd *kbd = eve_window_kbd(window); EVEViewStack *stack = param->stack; eos_cell_uart_give(NULL, 0); eos_uart_rxwm_clear(); eos_uart_set_handler(EOS_UART_ETYPE_RX, NULL); eos_net_acquire_for_evt(EOS_EVT_UART | EOS_UART_ETYPE_RX, 0); eos_cell_set_handler(EOS_CELL_MTYPE_DEV, cell_msg_handler); root->mem_next = param->mem; eve_window_kbd_detach(window); eve_kbd_set_handler(kbd, NULL, NULL); eve_free(param); eve_free(view); eve_stack_back(stack, window); }