#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "app/app_root.h" #include "cam.h" #include static int cam_init = 0; static int cam_capture = 0; #define CHUNK_SIZE 512 #define CAM_W 640 #define CAM_H 480 static void transfer_chunk(uint8_t *fbuf, size_t size, int first, int last, uint32_t addr) { int rv; eos_cam_fbuf_read(fbuf, size, first); if (last) { eos_cam_fbuf_done(); eos_cam_capture(); } eos_spi_select(EOS_SPI_DEV_EVE); eve_cmd_burst_start(); if (first) eve_cmd(CMD_LOADIMAGE, "ww+", addr, EVE_OPT_NODL); eve_cmd_write(fbuf, size); if (last) eve_cmd_end(); eve_cmd_burst_end(); rv = eve_cmd_exec(last); if (rv) printf("CMD EXEC ERR\n"); if (!last) eos_spi_select(EOS_SPI_DEV_CAM); } static void transfer_img(uint32_t addr) { int i; uint32_t fb_size; uint32_t fb_div; uint32_t fb_mod; uint8_t fbuf[CHUNK_SIZE]; cam_capture = 1; fb_size = eos_cam_fbuf_size(); fb_div = fb_size / CHUNK_SIZE; fb_mod = fb_size % CHUNK_SIZE; for (i=0; imem_next; transfer_img(addr); eve_window_root_draw(root); } eos_spi_deselect(); eos_evtq_push(EOS_EVT_USER, NULL, 0); } static void image_draw(EVEFreeWidget *widget) { EVEWindowRoot *root = widget->w.page->v.window->root; uint32_t addr = root->mem_next; if (cam_capture) { // eve_freew_tag(widget); eve_cmd_dl(TAG_MASK(0)); eve_cmd_dl(BEGIN(EVE_BITMAPS)); // eve_cmd_dl(BITMAP_HANDLE(15)); eve_cmd_dl(BITMAP_SOURCE(addr)); eve_cmd_dl(BITMAP_LAYOUT(EVE_RGB565, CAM_W * 2, CAM_H)); eve_cmd_dl(BITMAP_LAYOUT_H(CAM_W * 2, CAM_H)); eve_cmd_dl(BITMAP_SIZE(EVE_NEAREST, EVE_BORDER, EVE_BORDER, CAM_H, CAM_W)); eve_cmd_dl(BITMAP_SIZE_H(CAM_H, CAM_W)); eve_cmd(CMD_LOADIDENTITY, ""); eve_cmd(CMD_TRANSLATE, "ww", CAM_H * 65536, 0); eve_cmd(CMD_ROTATE, "w", 90 * 65536 / 360); eve_cmd(CMD_SETMATRIX, ""); eve_cmd_dl(VERTEX2F(0, 0)); eve_cmd_dl(TAG_MASK(1)); } } static int image_touch(EVEFreeWidget *widget, EVETouch *touch, uint16_t evt) { return 0; } void fbuf_print(uint8_t *fbuf, size_t size) { int i; for (i=0; i