CARPLAY版本整理
This commit is contained in:
234
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/main_loop_xm.c
Normal file
234
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/main_loop_xm.c
Normal file
@ -0,0 +1,234 @@
|
||||
/**
|
||||
* File: main_loop_xm.c
|
||||
* Author: ZhuoYongHong
|
||||
* Brief: XM implemented main_loop interface
|
||||
*
|
||||
* Copyright (c) 2021 - 2025 ShenZhen ExceedSpace Electronics Co.,Ltd.
|
||||
*
|
||||
* this program is distributed in the hope that it will be useful,
|
||||
* but without any warranty; without even the implied warranty of
|
||||
* merchantability or fitness for a particular purpose. see the
|
||||
* license file for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* history:
|
||||
* ================================================================
|
||||
* 2021-04-17 ZhuoYongHong created
|
||||
*
|
||||
*/
|
||||
|
||||
#include "native_window_xm.h"
|
||||
#include "main_loop/main_loop_simple.h"
|
||||
#include "main_loop_xm.h"
|
||||
#include "base/window_manager.h"
|
||||
#include "base/font_manager.h"
|
||||
//#include "lcd/lcd_xm.h"
|
||||
#include "base/idle.h"
|
||||
#include "base/events.h"
|
||||
#include "base/timer.h"
|
||||
#include "base/system_info.h"
|
||||
|
||||
#include <xm.h>
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include "awtk_global.h"
|
||||
#include "tkc/time_now.h"
|
||||
#include "base/input_method.h"
|
||||
#include <XM_event.h>
|
||||
|
||||
|
||||
|
||||
static ret_t main_loop_xm_dispatch_tp_event(main_loop_simple_t* loop, XM_EVENT* xm_event) {
|
||||
pointer_event_t event;
|
||||
int type = xm_event->type;
|
||||
widget_t* widget = loop->base.wm;
|
||||
|
||||
memset(&event, 0x00, sizeof(event));
|
||||
switch (type) {
|
||||
case XM_EVENT_TOUCHDOWN: {
|
||||
{
|
||||
loop->pressed = 1;
|
||||
pointer_event_init(&event, EVT_POINTER_DOWN, widget, xm_event->tp.x,
|
||||
xm_event->tp.y);
|
||||
event.button = 0;
|
||||
event.pressed = loop->pressed;
|
||||
event.e.native_window_handle = 0;//SDL_GetWindowFromID(xm_event->button.windowID);
|
||||
if (xm_event->tp.timestamp)
|
||||
event.e.time = xm_event->tp.timestamp;
|
||||
|
||||
//SDL_CaptureMouse(TRUE);
|
||||
window_manager_dispatch_input_event(widget, (event_t*)&event);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case XM_EVENT_TOUCHUP: {
|
||||
{
|
||||
//SDL_CaptureMouse(FALSE);
|
||||
pointer_event_init(&event, EVT_POINTER_UP, widget, xm_event->tp.x,
|
||||
xm_event->tp.y);
|
||||
event.button = 0;
|
||||
event.pressed = loop->pressed;
|
||||
event.e.native_window_handle = 0;//SDL_GetWindowFromID(xm_event->button.windowID);
|
||||
if (xm_event->tp.timestamp)
|
||||
event.e.time = xm_event->tp.timestamp;
|
||||
|
||||
#ifdef ENABLE_TOUCH_UP_LONG_PERIOD_RESPONSE
|
||||
// 当快速触摸时,因为按下/释放的间隔时间过短, 按下的效果无法在LCD显示出来.
|
||||
// 使能ENABLE_TOUCH_UP_LONG_PERIOD_RESPONSE可以显示明显的Touch Down按下响应
|
||||
sleep_ms(30);
|
||||
#endif
|
||||
window_manager_dispatch_input_event(widget, (event_t*)&event);
|
||||
loop->pressed = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case XM_EVENT_TOUCHMOVE: {
|
||||
pointer_event_init(&event, EVT_POINTER_MOVE, widget, xm_event->tp.x,
|
||||
xm_event->tp.y);
|
||||
event.button = 0;
|
||||
event.pressed = loop->pressed;
|
||||
event.e.native_window_handle = 0;//SDL_GetWindowFromID(xm_event->button.windowID);
|
||||
if (xm_event->tp.timestamp)
|
||||
event.e.time = xm_event->tp.timestamp;
|
||||
|
||||
window_manager_dispatch_input_event(widget, (event_t*)&event);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static ret_t main_loop_xm_dispatch_key_event(main_loop_simple_t* loop, XM_EVENT* xm_event) {
|
||||
key_event_t event;
|
||||
int type = xm_event->type;
|
||||
widget_t* widget = loop->base.wm;
|
||||
|
||||
memset(&event, 0x00, sizeof(event));
|
||||
switch (type) {
|
||||
case XM_EVENT_KEYDOWN: {
|
||||
{
|
||||
//if(xm_event->key.repeat)
|
||||
// key_event_init(&event, EVT_KEY_REPEAT, widget, xm_event->key.scancode);
|
||||
//else
|
||||
key_event_init(&event, EVT_KEY_DOWN, widget, xm_event->key.scancode);
|
||||
event.e.native_window_handle = 0;
|
||||
if (xm_event->tp.timestamp)
|
||||
event.e.time = xm_event->tp.timestamp;
|
||||
|
||||
window_manager_dispatch_input_event(widget, (event_t*)&event);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case XM_EVENT_KEYUP: {
|
||||
{
|
||||
key_event_init(&event, EVT_KEY_UP, widget, xm_event->key.scancode);
|
||||
event.e.native_window_handle = 0;
|
||||
if (xm_event->tp.timestamp)
|
||||
event.e.time = xm_event->tp.timestamp;
|
||||
|
||||
window_manager_dispatch_input_event(widget, (event_t*)&event);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static ret_t main_loop_xm_dispatch_text_input(main_loop_simple_t* loop, XM_EVENT* xm_event) {
|
||||
im_commit_event_t event;
|
||||
XM_TextInputEvent* text_input_event = (XM_TextInputEvent*)&xm_event->text;
|
||||
|
||||
memset(&event, 0x00, sizeof(event));
|
||||
event.e = event_init(EVT_IM_COMMIT, NULL);
|
||||
event.text = text_input_event->text;
|
||||
|
||||
return input_method_dispatch_to_widget(input_method(), &(event.e));
|
||||
}
|
||||
|
||||
#ifdef NINE
|
||||
#include <nine\nine_event.h>
|
||||
static ret_t main_loop_xm_dispatch_nine_event(main_loop_simple_t* loop, XM_EVENT* xm_event) {
|
||||
event_t nine_event;
|
||||
widget_t* widget = loop->base.wm;
|
||||
nine_event = event_init(EVT_NINE_EVT, NULL);
|
||||
memcpy(&xm_event->nine.event.e, &nine_event, sizeof(event_t));
|
||||
return widget_dispatch_recursive(window_manager(), &xm_event->nine.event.e);
|
||||
//return widget_dispatch(window_manager(), &nine_event);
|
||||
//window_manager_dispatch_input_event(widget, (event_t*)&xm_event->nine.event.e);
|
||||
}
|
||||
#endif
|
||||
|
||||
static ret_t main_loop_xm_dispatch(main_loop_simple_t* loop) {
|
||||
XM_EVENT event;
|
||||
ret_t ret = RET_OK;
|
||||
|
||||
while(XM_WaitEvent(&event, 1) && loop->base.running) {
|
||||
switch (event.type)
|
||||
{
|
||||
case XM_EVENT_TOUCHDOWN:
|
||||
case XM_EVENT_TOUCHUP:
|
||||
case XM_EVENT_TOUCHMOVE:
|
||||
ret = main_loop_xm_dispatch_tp_event(loop, &event);
|
||||
// 改善触摸事件的响应速度
|
||||
if (ret == RET_OK)
|
||||
return ret;
|
||||
break;
|
||||
case XM_EVENT_KEYDOWN:
|
||||
case XM_EVENT_KEYUP:
|
||||
ret = main_loop_xm_dispatch_key_event(loop, &event);
|
||||
break;
|
||||
case XM_EVENT_TEXTINPUT:
|
||||
ret = main_loop_xm_dispatch_text_input(loop, &event);
|
||||
break;
|
||||
#ifdef NINE
|
||||
case XM_EVENT_NINE:
|
||||
ret = main_loop_xm_dispatch_nine_event(loop, &event);
|
||||
if (ret == RET_OK)
|
||||
return ret;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ret_t main_loop_xm_destroy(main_loop_t* l) {
|
||||
main_loop_simple_t* loop = (main_loop_simple_t*)l;
|
||||
main_loop_simple_reset(loop);
|
||||
native_window_xm_deinit();
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static ret_t main_loop_xm_init_canvas(uint32_t w, uint32_t h) {
|
||||
//lcd_t* lcd = platform_create_lcd(w, h);
|
||||
|
||||
// return_value_if_fail(lcd != NULL, RET_OOM);
|
||||
native_window_xm_init(TRUE, w, h);
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
main_loop_t* main_loop_init(int w, int h) {
|
||||
main_loop_simple_t* loop = NULL;
|
||||
return_value_if_fail(main_loop_xm_init_canvas(w, h) == RET_OK, NULL);
|
||||
|
||||
loop = main_loop_simple_init(w, h, NULL, NULL);
|
||||
return_value_if_fail(loop != NULL, NULL);
|
||||
|
||||
loop->base.destroy = main_loop_xm_destroy;
|
||||
loop->dispatch_input = main_loop_xm_dispatch;
|
||||
|
||||
return (main_loop_t*)loop;
|
||||
}
|
318
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/native_window_xm.c
Normal file
318
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/native_window_xm.c
Normal file
@ -0,0 +1,318 @@
|
||||
/**
|
||||
* File: native_window_xm.c
|
||||
* Author: zhuoyonghong
|
||||
* Brief: native window xm
|
||||
*
|
||||
* Copyright (c) 2019 - 2021 zhuoyonghong
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* License file for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* History:
|
||||
* ================================================================
|
||||
* 2021-04-10 zhuoyonghong created
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef XM_WINDOWS_HOST
|
||||
#include "xm_windows_host.h"
|
||||
#elif defined(XM_HMI_HOST)
|
||||
#include "xm_hmi_host.h"
|
||||
#endif
|
||||
|
||||
#include "base/system_info.h"
|
||||
#include "base/window_manager.h"
|
||||
|
||||
#include "lcd/lcd_nanovg.h"
|
||||
#include "base/native_window.h"
|
||||
#include "openvg.h"
|
||||
#include "vgext.h"
|
||||
|
||||
typedef struct _native_window_xm_t {
|
||||
native_window_t native_window;
|
||||
void *vg_context;
|
||||
void *vg_surface;
|
||||
//void *handle;
|
||||
|
||||
void *window; // win32<33><32><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
|
||||
|
||||
void *lcd;
|
||||
|
||||
canvas_t canvas;
|
||||
} native_window_xm_t;
|
||||
|
||||
static native_window_t* s_shared_win = NULL;
|
||||
|
||||
#define NATIVE_WINDOW_XM(win) ((native_window_xm_t*)(win))
|
||||
|
||||
static ret_t native_window_xm_move(native_window_t* win, xy_t x, xy_t y) {
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static ret_t native_window_xm_resize(native_window_t* win, wh_t w, wh_t h) {
|
||||
win->rect.w = w;
|
||||
win->rect.h = h;
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
static canvas_t* native_window_xm_get_canvas(native_window_t* win) {
|
||||
native_window_xm_t* xm = NATIVE_WINDOW_XM(win);
|
||||
|
||||
return &(xm->canvas);
|
||||
}
|
||||
|
||||
#ifdef WITH_VGCANVAS
|
||||
void *vgcanvas_get_current_surface(void);
|
||||
|
||||
static ret_t native_window_xm_swap_buffer(native_window_t* win)
|
||||
{
|
||||
native_window_xm_t* xm = NATIVE_WINDOW_XM(win);
|
||||
//lcd_vgcanvas_t* lcd = (lcd_vgcanvas_t*)xm->lcd;
|
||||
(void)(xm);
|
||||
void *surface = vgcanvas_get_current_surface();
|
||||
void* surfacePixels = (void*)vgGetSurfacePixels(surface);
|
||||
#ifdef XM_WINDOWS_HOST
|
||||
XM_WinHost_WindowBuffersSwap(surfacePixels, win->rect.w, win->rect.h, 32);
|
||||
#elif defined(XM_HMI_HOST)
|
||||
//vgFinish();
|
||||
XM_HmiHost_WindowBuffersSwap(surfacePixels, win->rect.w, win->rect.h, 32);
|
||||
#endif
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
#else
|
||||
#include "board.h"
|
||||
#include "pxp.h"
|
||||
#include "lcd.h"
|
||||
#include "cp15/cp15.h"
|
||||
#include "lcd/lcd_mem_bgr565.h"
|
||||
#include "lcd/lcd_mem_bgra8888.h"
|
||||
|
||||
static ret_t lcd_mem_swap(lcd_t* lcd)
|
||||
{
|
||||
lcd_mem_t* mem = (lcd_mem_t*)lcd;
|
||||
uint8_t* offline_fb = mem->offline_fb;
|
||||
uint32_t cur_addr;
|
||||
CP15_clean_dcache_for_dma((uint32_t)offline_fb, (uint32_t)offline_fb + FB_SIZE);
|
||||
if (ark_lcd_get_fb_addr(2) != NULL) {
|
||||
LcdOsdInfo info = {0};
|
||||
uint32_t width, height;
|
||||
ark_lcs_get_osd_area(&width,&height);
|
||||
ark_lcd_get_osd_yaddr(LCD_UI_LAYER, &cur_addr);
|
||||
if (!ark_lcd_get_osd_info_atomic_isactive(LCD_UI_LAYER) && cur_addr == (uint32_t)mem->next_fb)
|
||||
ark_lcd_wait_for_vsync();
|
||||
|
||||
info.width = width;
|
||||
info.height = height;
|
||||
#if LCD_ROTATE_ANGLE != LCD_ROTATE_ANGLE_0
|
||||
int ret;
|
||||
uint32_t src_format,dst_format;
|
||||
#if LCD_BPP == 16
|
||||
src_format = PXP_SRC_FMT_RGB565;
|
||||
dst_format = PXP_OUT_FMT_RGB565;
|
||||
#else
|
||||
src_format = PXP_SRC_FMT_RGB888;
|
||||
dst_format = PXP_OUT_FMT_ARGB8888;
|
||||
#endif
|
||||
|
||||
#if LCD_ROTATE_ANGLE != LCD_ROTATE_ANGLE_180
|
||||
info.width = height;
|
||||
info.height = width;
|
||||
#endif
|
||||
ret = pxp_scaler_rotate((uint32_t)offline_fb, 0, 0, src_format, width, height,
|
||||
(uint32_t)mem->next_fb, 0, dst_format, info.width, info.height, LCD_ROTATE_ANGLE);
|
||||
if(ret < 0){
|
||||
printf("%s pxp_scaler_rotate failed\n", __func__);
|
||||
//...
|
||||
}
|
||||
#else
|
||||
mem->next_fb = (uint8_t*)offline_fb;
|
||||
#endif
|
||||
info.yaddr = (uint32_t)mem->next_fb;
|
||||
#if LCD_BPP == 16
|
||||
info.format = LCD_OSD_FORAMT_RGB565;
|
||||
#else
|
||||
info.format = LCD_OSD_FORAMT_ARGB888;
|
||||
#endif
|
||||
ark_lcd_set_osd_info_atomic(LCD_UI_LAYER,&info);
|
||||
lcd_mem_set_offline_fb(mem, mem->online_fb);
|
||||
lcd_mem_set_online_fb(mem, offline_fb);
|
||||
} else {
|
||||
ark_lcd_set_osd_yaddr(LCD_UI_LAYER, (unsigned int)offline_fb);
|
||||
ark_lcd_set_osd_sync(LCD_UI_LAYER);
|
||||
/* wait vsync */
|
||||
ark_lcd_wait_for_vsync();
|
||||
lcd_mem_set_offline_fb(mem, mem->online_fb);
|
||||
lcd_mem_set_online_fb(mem, offline_fb);
|
||||
}
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
lcd_t* platform_create_lcd(wh_t w, wh_t h) {
|
||||
lcd_t* lcd = NULL;
|
||||
|
||||
#if LCD_BPP == 16
|
||||
if (ark_lcd_get_fb_addr(2) != NULL) {
|
||||
lcd = lcd_mem_bgr565_create_three_fb(w, h, ark_lcd_get_fb_addr(0),
|
||||
ark_lcd_get_fb_addr(1), ark_lcd_get_fb_addr(2));
|
||||
}
|
||||
else
|
||||
lcd = lcd_mem_bgr565_create_double_fb(w, h, ark_lcd_get_fb_addr(0),
|
||||
ark_lcd_get_fb_addr(1));
|
||||
#elif LCD_BPP == 32
|
||||
if (ark_lcd_get_fb_addr(2) != NULL) {
|
||||
lcd = lcd_mem_bgra8888_create_three_fb(w, h, ark_lcd_get_fb_addr(0),
|
||||
ark_lcd_get_fb_addr(1), ark_lcd_get_fb_addr(2));
|
||||
}
|
||||
else
|
||||
lcd = lcd_mem_bgra8888_create_double_fb(w, h, ark_lcd_get_fb_addr(0),
|
||||
ark_lcd_get_fb_addr(1));
|
||||
#endif
|
||||
|
||||
lcd->swap = lcd_mem_swap;
|
||||
lcd->support_dirty_rect = 0;
|
||||
|
||||
return lcd;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern ret_t tk_quit();
|
||||
|
||||
|
||||
|
||||
static ret_t native_window_xm_get_info(native_window_t* win, native_window_info_t* info) {
|
||||
|
||||
native_window_xm_t* xm = NATIVE_WINDOW_XM(win);
|
||||
int w, h;
|
||||
(void)(xm);
|
||||
|
||||
info->x = 0;
|
||||
info->y = 0;
|
||||
info->ratio = 1;
|
||||
//info->ratio = xm->canvas.lcd->ratio;
|
||||
XM_GetWidowSize(&w, &h);
|
||||
info->w = w;
|
||||
info->h = h;
|
||||
|
||||
win->rect.x = 0;
|
||||
win->rect.y = 0;
|
||||
win->rect.w = w;
|
||||
win->rect.h = h;
|
||||
win->ratio = info->ratio;
|
||||
|
||||
log_debug("ratio=%f %d %d\n", info->ratio, info->w, info->h);
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static const native_window_vtable_t s_native_window_vtable = {
|
||||
.type = "native_window_xm",
|
||||
.resize = native_window_xm_resize,
|
||||
.get_info = native_window_xm_get_info,
|
||||
#ifdef WITH_VGCANVAS
|
||||
.swap_buffer = native_window_xm_swap_buffer,
|
||||
#endif
|
||||
.get_canvas = native_window_xm_get_canvas,
|
||||
};
|
||||
|
||||
static ret_t native_window_xm_on_destroy(object_t* obj) {
|
||||
log_debug("Close native window.\n");
|
||||
//native_window_sdl_close(NATIVE_WINDOW(obj));
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
static ret_t native_window_xm_exec(object_t* obj, const char* cmd, const char* args) {
|
||||
|
||||
return RET_NOT_FOUND;
|
||||
}
|
||||
|
||||
static const object_vtable_t s_native_window_xm_vtable = {
|
||||
.type = "native_window_xm",
|
||||
.desc = "native_window_xm",
|
||||
.size = sizeof(native_window_xm_t),
|
||||
.exec = native_window_xm_exec,
|
||||
.on_destroy = native_window_xm_on_destroy};
|
||||
|
||||
static native_window_t* native_window_create_internal(uint32_t w, uint32_t h) {
|
||||
lcd_t* lcd = NULL;
|
||||
object_t* obj = object_create(&s_native_window_xm_vtable);
|
||||
native_window_t* win = NATIVE_WINDOW(obj);
|
||||
native_window_xm_t* xm = NATIVE_WINDOW_XM(win);
|
||||
return_value_if_fail(xm != NULL, NULL);
|
||||
|
||||
#ifdef XM_WINDOWS_HOST
|
||||
xm->window = XM_WinHost_WindowCreate("XM", w, h);
|
||||
#elif defined(XM_HMI_HOST)
|
||||
xm->window = XM_HmiHost_WindowCreate("XM", w, h);
|
||||
#endif
|
||||
|
||||
canvas_t* c = &(xm->canvas);
|
||||
|
||||
win->shared = TRUE;
|
||||
win->handle = xm->window;
|
||||
win->vt = &s_native_window_vtable;
|
||||
win->rect = rect_init(0, 0, w, h);
|
||||
|
||||
#ifdef WITH_VGCANVAS
|
||||
lcd = lcd_nanovg_init(win);
|
||||
#else
|
||||
lcd = platform_create_lcd(w, h);
|
||||
#endif
|
||||
xm->lcd = lcd;
|
||||
|
||||
canvas_init(c, lcd, font_manager());
|
||||
|
||||
|
||||
return win;
|
||||
}
|
||||
|
||||
native_window_t* native_window_create(widget_t* widget) {
|
||||
native_window_t* nw = s_shared_win;
|
||||
return_value_if_fail(nw != NULL, NULL);
|
||||
|
||||
widget_set_prop_pointer(widget, WIDGET_PROP_NATIVE_WINDOW, nw);
|
||||
|
||||
return nw;
|
||||
}
|
||||
|
||||
|
||||
|
||||
ret_t native_window_xm_init(bool_t shared, uint32_t w, uint32_t h) {
|
||||
|
||||
(void)(shared);
|
||||
|
||||
#ifdef XM_WINDOWS_HOST
|
||||
//if(!XM_WinHost_WindowCreate ("VG", w, h))
|
||||
// return RET_FAIL;
|
||||
#endif
|
||||
|
||||
|
||||
s_shared_win = native_window_create_internal(w, h);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
ret_t native_window_xm_deinit(void) {
|
||||
if (s_shared_win != NULL) {
|
||||
object_unref(OBJECT(s_shared_win));
|
||||
s_shared_win = NULL;
|
||||
}
|
||||
|
||||
#ifdef XM_WINDOWS_HOST
|
||||
XM_WinHost_WindowDestroy();
|
||||
#elif defined(XM_HMI_HOST)
|
||||
XM_HmiHost_WindowDestroy();
|
||||
#endif
|
||||
|
||||
return RET_OK;
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
/**
|
||||
* File: native_window_xm.h
|
||||
* Author: ShenZhen ExceedSpace
|
||||
* Brief: native window xm
|
||||
*
|
||||
* Copyright (c) 2019 - 2021 ShenZhen ExceedSpace Co.,Ltd.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* License file for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* History:
|
||||
* ================================================================
|
||||
* 2021-07-01 ZhuoYongHong created
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef TK_NATIVE_WINDOW_XM_H
|
||||
#define TK_NATIVE_WINDOW_XM_H
|
||||
|
||||
#include "base/native_window.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
ret_t native_window_xm_deinit(void);
|
||||
ret_t native_window_xm_init(bool_t shared, uint32_t w, uint32_t h);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /*TK_NATIVE_WINDOW_XM_H*/
|
@ -0,0 +1,174 @@
|
||||
#ifndef _AT_AUTOTEST_TAG_H_
|
||||
#define _AT_AUTOTEST_TAG_H_
|
||||
|
||||
#define MAX_TAG_NAME 48
|
||||
|
||||
typedef struct _AT_TAG {
|
||||
char tag_name[MAX_TAG_NAME]; // tag name
|
||||
int tag_id; // tag identifier
|
||||
// char xml_name[MAX_TAG_NAME]; // XML Tag Name
|
||||
} AT_TAG, *PAT_TAG;
|
||||
|
||||
#define AT_UNDEF_TAG 0 // 未定义TAG
|
||||
#define AT_POINTER 1
|
||||
#define AT_UTF8_STRING 2
|
||||
#define AT_INT_CONST 3
|
||||
#define AT_FLOAT_CONST 4
|
||||
#define AT_DELAY 5 // 延时
|
||||
#define AT_IntervalTime 6 // 定义每条指令之间的间隙
|
||||
#define AT_loop 7
|
||||
#define AT_endloop 8
|
||||
#define AT_include 9
|
||||
#define AT_randi 10
|
||||
#define AT_randf 11
|
||||
|
||||
|
||||
enum {
|
||||
AT_NINE_EVENT_VCU_IDLE = 201,
|
||||
AT_NINE_EVENT_VCU_PHONE_CONNECTED,
|
||||
AT_NINE_EVENT_VCU_NOT_READY,
|
||||
|
||||
AT_NINE_EVENT_VCU_READY,
|
||||
AT_PACK_UP_TEMPLE,
|
||||
AT_SIT_SIT_BARRELS,
|
||||
AT_PACK_UP_TEMPLE_AND_SIT_SIT_BARRELS,
|
||||
AT_NINE_EVENT_VCU_CYCLING_MODE,
|
||||
AT_NONE,
|
||||
AT_HELP_MOVE,
|
||||
AT_BACK_CAR,
|
||||
AT_NINE_EVENT_VCU_UNLOCK_MODE,
|
||||
AT_NINE_EVENT_VCU_RUNNING_STATUS,
|
||||
AT_POWER_OUTPUT,
|
||||
AT_SPEED,
|
||||
AT_STEERING_ANGLE,
|
||||
AT_NINE_EVENT_VCU_GEAR,
|
||||
AT_GEAR_ASSIT,
|
||||
AT_GEAR_ECO,
|
||||
AT_GEAR_COAST,
|
||||
AT_GEAR_FURIOUS,
|
||||
AT_NINE_EVENT_VCU_BLE_UPDATE_SYSTEM,
|
||||
AT_NINE_EVENT_WIFI_CONNECT,
|
||||
AT_STATE_DISCONNECT,
|
||||
AT_STATE_CONNECTING,
|
||||
AT_STATE_CONNECTED,
|
||||
AT_NINE_EVENT_UPDATE_PROCESS,
|
||||
AT_NINE_EVENT_UPDATE_FINISH,
|
||||
AT_NINE_EVENT_BASIC_ERROR_DETAILS,
|
||||
AT_code,
|
||||
AT_NINE_EVENT_BASIC_ERROR_CLOSE,
|
||||
AT_NINE_EVENT_WEATHER_DETAILS,
|
||||
AT_INTERVAL,
|
||||
AT_SIGN,
|
||||
AT_TEMP,
|
||||
AT_SCALE,
|
||||
AT_ALERT,
|
||||
AT_TYPE,
|
||||
AT_TIME,
|
||||
AT_TITLE, // 标题, 允许多条
|
||||
AT_text,
|
||||
AT_NINE_EVENT_WEATHER_CLOSE,
|
||||
AT_NINE_EVENT_LOW_BATTERY,
|
||||
AT_NINE_EVENT_KEY_AUTO, // auto键
|
||||
AT_NINE_EVENT_KEY_LONG_AUTO, // 长按auto键, 读取剩余锁定时间
|
||||
AT_NINE_EVENT_KEY_TRIGGER,
|
||||
AT_NINE_EVENT_KEY_WHEEL,
|
||||
AT_NINE_EVENT_KEY_BREAK, // 刹车键
|
||||
AT_NINE_EVENT_KEY_ADD, // +键
|
||||
AT_NINE_EVENT_KEY_SUB, // -键
|
||||
AT_NINE_EVENT_KEY_USER, // 自定义键
|
||||
AT_NINE_EVENT_POWER_DISSIPATION,
|
||||
AT_data,
|
||||
AT_index,
|
||||
AT_NINE_EVENT_POWER_DISSIPATION_REALTIME,
|
||||
AT_value,
|
||||
AT_NINE_EVENT_TRAFFIC_DATA,
|
||||
AT_distance,
|
||||
AT_NINE_EVENT_NAVIGATION,
|
||||
AT_totalDistance,
|
||||
AT_retainDistance,
|
||||
AT_retainTime,
|
||||
AT_iconType,
|
||||
AT_curStepRetainDis,
|
||||
AT_trafficLightNum,
|
||||
AT_gpsStrength,
|
||||
AT_currentRoadName,
|
||||
AT_nextRoadName,
|
||||
AT_NavigationText,
|
||||
AT_NINE_EVENT_HIGH_BEAM,
|
||||
AT_on,
|
||||
AT_off,
|
||||
AT_NINE_EVENT_LOW_BEAM,
|
||||
AT_NINE_EVENT_LEFT_TURN,
|
||||
AT_NINE_EVENT_RIGHT_TURN,
|
||||
AT_NINE_EVENT_ABS,
|
||||
AT_NINE_EVENT_CRUISE_CONTROL,
|
||||
AT_NINE_EVENT_READY_HINT,
|
||||
AT_NINE_EVENT_GSM,
|
||||
AT_no_signal,
|
||||
AT_one,
|
||||
AT_two,
|
||||
AT_full,
|
||||
AT_NINE_EVENT_GPS,
|
||||
AT_strong,
|
||||
AT_weak,
|
||||
AT_NINE_EVENT_BLE1,
|
||||
AT_NINE_EVENT_BLE2,
|
||||
AT_NINE_EVENT_DATETIME,
|
||||
AT_msec,
|
||||
AT_second,
|
||||
AT_minute,
|
||||
AT_hour,
|
||||
AT_day,
|
||||
AT_wday,
|
||||
AT_month,
|
||||
AT_year,
|
||||
AT_NINE_EVENT_ODO,
|
||||
AT_NINE_EVENT_TRIP,
|
||||
AT_NINE_EVENT_LIGHT_SWITCH, // 光敏日夜切换
|
||||
AT_night,
|
||||
AT_NINE_EVENT_THEME_SWITCH, // 主题切换
|
||||
AT_NINE_EVENT_PASSWORD, // 密码校验
|
||||
AT_NINE_EVENT_PAGE_SWITCH,
|
||||
AT_NINE_EVENT_REMAINING_MILEAGE, // 电池剩余里程
|
||||
AT_NINE_EVENT_CHARGE_TIME, // 剩余充电事件及百分比
|
||||
AT_remaining_time,
|
||||
AT_percent,
|
||||
};
|
||||
|
||||
|
||||
|
||||
typedef struct _TOKEN {
|
||||
char *string; // string offset
|
||||
int count; // string count
|
||||
int id; // token id
|
||||
int value; // 数字的值
|
||||
float f_value; // 浮点值
|
||||
} TOKEN, *PTOKEN ;
|
||||
|
||||
typedef struct _AT_TAG_STRUCT *PAT_TAG_STRUCT;
|
||||
/* tag's structure */
|
||||
typedef struct _AT_TAG_STRUCT {
|
||||
int id;
|
||||
char *string; // string offset
|
||||
int count; // string count
|
||||
|
||||
PAT_TAG_STRUCT tag_parent; // pointer to parent
|
||||
PAT_TAG_STRUCT tag_child; // pointer to first child
|
||||
PAT_TAG_STRUCT tag_sibling; // pointer to next sibling
|
||||
} AT_TAG_STRUCT;
|
||||
|
||||
void at_init_parser (unsigned char *data_to_parser);
|
||||
|
||||
TOKEN* AT_NextToken(void);
|
||||
AT_TAG_STRUCT* AddChild (AT_TAG_STRUCT *parent, AT_TAG_STRUCT *child);
|
||||
AT_TAG_STRUCT *AT_NewTag (TOKEN *token);
|
||||
int nine_AT_Define(void);
|
||||
char *GetIspTagName (int tag_id);
|
||||
|
||||
extern TOKEN *curr_token;
|
||||
|
||||
#define CurrToken(token) \
|
||||
curr_token = token;
|
||||
|
||||
|
||||
#endif
|
@ -0,0 +1,524 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include "nine_autotest_id.h"
|
||||
|
||||
enum CHAR_CLASSES { F_END, OTHER, SPACE, DIGIT, LETTER, ENTER};
|
||||
|
||||
static const unsigned char charclass[] = {
|
||||
F_END, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // .......
|
||||
OTHER, SPACE, ENTER, OTHER, OTHER, SPACE, OTHER, OTHER, // . _
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // ........
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // .. .....
|
||||
SPACE, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // !"#$%&'
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, // ()*+,-./
|
||||
DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, // 01234567
|
||||
DIGIT, DIGIT, OTHER, SPACE, OTHER, OTHER, OTHER, LETTER, // 89:;<=>?
|
||||
OTHER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, // @ABCDEFG
|
||||
LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, // HIJKLMNO
|
||||
LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, // PQRSTUVW
|
||||
LETTER, LETTER, LETTER, OTHER, OTHER, OTHER, OTHER, LETTER, // XYZ[\]^_
|
||||
OTHER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, // `abcdefg
|
||||
LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, // hijklmno
|
||||
LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, // pqrstuvw
|
||||
LETTER, LETTER, LETTER, OTHER, OTHER, OTHER, OTHER, OTHER, // xyz{|}~
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER,
|
||||
};
|
||||
|
||||
|
||||
static AT_TAG at_tag[] = {
|
||||
|
||||
"loop", AT_loop,
|
||||
"endloop", AT_endloop,
|
||||
"include", AT_include,
|
||||
"randi", AT_randi,
|
||||
"randf", AT_randf,
|
||||
|
||||
|
||||
"VCU_IDLE", AT_NINE_EVENT_VCU_IDLE,
|
||||
"VCU_PHONE_CONNECTED", AT_NINE_EVENT_VCU_PHONE_CONNECTED,
|
||||
"VCU_NOT_READY", AT_NINE_EVENT_VCU_NOT_READY,
|
||||
"VCU_READY", AT_NINE_EVENT_VCU_READY,
|
||||
"PACK_UP_TEMPLE", AT_PACK_UP_TEMPLE,
|
||||
"SIT_SIT_BARRELS", AT_SIT_SIT_BARRELS,
|
||||
"PACK_UP_TEMPLE_AND_SIT_SIT_BARRELS", AT_PACK_UP_TEMPLE_AND_SIT_SIT_BARRELS,
|
||||
"VCU_CYCLING_MODE", AT_NINE_EVENT_VCU_CYCLING_MODE,
|
||||
"NONE", AT_NONE,
|
||||
"HELP_MOVE", AT_HELP_MOVE,
|
||||
"BACK_CAR", AT_BACK_CAR,
|
||||
"VCU_UNLOCK_MODE", AT_NINE_EVENT_VCU_UNLOCK_MODE,
|
||||
"VCU_RUNNING_STATUS", AT_NINE_EVENT_VCU_RUNNING_STATUS,
|
||||
"POWER_OUTPUT", AT_POWER_OUTPUT,
|
||||
"SPEED", AT_SPEED,
|
||||
"STEERING_ANGLE", AT_STEERING_ANGLE,
|
||||
"VCU_GEAR", AT_NINE_EVENT_VCU_GEAR,
|
||||
"ASSIT", AT_GEAR_ASSIT,
|
||||
"ECO", AT_GEAR_ECO,
|
||||
"COAST", AT_GEAR_COAST,
|
||||
"FURIOUS", AT_GEAR_FURIOUS,
|
||||
"VCU_BLE_UPDATE_SYSTEM", AT_NINE_EVENT_VCU_BLE_UPDATE_SYSTEM,
|
||||
"WIFI_CONNECT", AT_NINE_EVENT_WIFI_CONNECT,
|
||||
"DISCONNECT", AT_STATE_DISCONNECT,
|
||||
"CONNECTING", AT_STATE_CONNECTING,
|
||||
"CONNECTED", AT_STATE_CONNECTED,
|
||||
"UPDATE_PROCESS", AT_NINE_EVENT_UPDATE_PROCESS,
|
||||
"UPDATE_FINISH", AT_NINE_EVENT_UPDATE_FINISH,
|
||||
"BASIC_ERROR_DETAILS", AT_NINE_EVENT_BASIC_ERROR_DETAILS,
|
||||
"code", AT_code,
|
||||
"BASIC_ERROR_CLOSE", AT_NINE_EVENT_BASIC_ERROR_CLOSE,
|
||||
"WEATHER_DETAILS", AT_NINE_EVENT_WEATHER_DETAILS,
|
||||
"INTERVAL", AT_INTERVAL,
|
||||
"SIGN", AT_SIGN,
|
||||
"TEMP", AT_TEMP,
|
||||
"SCALE", AT_SCALE,
|
||||
"ALERT", AT_ALERT,
|
||||
"TYPE", AT_TYPE,
|
||||
"TIME", AT_TIME,
|
||||
"text", AT_text,
|
||||
"WEATHER_CLOSE", AT_NINE_EVENT_WEATHER_CLOSE,
|
||||
"LOW_BATTERY", AT_NINE_EVENT_LOW_BATTERY,
|
||||
"KEY_AUTO", AT_NINE_EVENT_KEY_AUTO,
|
||||
"KEY_LONG_AUTO", AT_NINE_EVENT_KEY_LONG_AUTO,
|
||||
"KEY_TRIGGER", AT_NINE_EVENT_KEY_TRIGGER,
|
||||
"KEY_WHEEL", AT_NINE_EVENT_KEY_WHEEL,
|
||||
"KEY_BREAK", AT_NINE_EVENT_KEY_BREAK,
|
||||
"KEY_ADD", AT_NINE_EVENT_KEY_ADD,
|
||||
"KEY_SUB", AT_NINE_EVENT_KEY_SUB,
|
||||
"KEY_USER", AT_NINE_EVENT_KEY_USER,
|
||||
"POWER_DISSIPATION", AT_NINE_EVENT_POWER_DISSIPATION,
|
||||
"data", AT_data,
|
||||
"POWER_DISSIPATION_REALTIME", AT_NINE_EVENT_POWER_DISSIPATION_REALTIME,
|
||||
"value", AT_value,
|
||||
"NAVIGATION", AT_NINE_EVENT_NAVIGATION,
|
||||
"totalDistance", AT_totalDistance,
|
||||
"retainDistance", AT_retainDistance,
|
||||
"retainTime", AT_retainTime,
|
||||
"iconType", AT_iconType,
|
||||
"curStepRetainDis", AT_curStepRetainDis,
|
||||
"trafficLightNum", AT_trafficLightNum,
|
||||
"gpsStrength", AT_gpsStrength,
|
||||
"currentRoadName", AT_currentRoadName,
|
||||
"nextRoadName", AT_nextRoadName,
|
||||
"NavigationText", AT_NavigationText,
|
||||
"HIGH_BEAM", AT_NINE_EVENT_HIGH_BEAM,
|
||||
"on", AT_on,
|
||||
"off", AT_off,
|
||||
"LOW_BEAM", AT_NINE_EVENT_LOW_BEAM,
|
||||
"LEFT_TURN", AT_NINE_EVENT_LEFT_TURN,
|
||||
"RIGHT_TURN", AT_NINE_EVENT_RIGHT_TURN,
|
||||
"ABS", AT_NINE_EVENT_ABS,
|
||||
"CRUISE_CONTROL", AT_NINE_EVENT_CRUISE_CONTROL,
|
||||
"READY_HINT", AT_NINE_EVENT_READY_HINT,
|
||||
"GSM", AT_NINE_EVENT_GSM,
|
||||
"no_signal", AT_no_signal,
|
||||
"one", AT_one,
|
||||
"two", AT_two,
|
||||
"full", AT_full,
|
||||
"GPS", AT_NINE_EVENT_GPS,
|
||||
"strong", AT_strong,
|
||||
"weak", AT_weak,
|
||||
"BLE1", AT_NINE_EVENT_BLE1,
|
||||
"BLE2", AT_NINE_EVENT_BLE2,
|
||||
"Delay", AT_DELAY,
|
||||
"IntervalTime", AT_IntervalTime,
|
||||
"DATETIME", AT_NINE_EVENT_DATETIME,
|
||||
"msec", AT_msec,
|
||||
"second", AT_second,
|
||||
"minute", AT_minute,
|
||||
"hour", AT_hour,
|
||||
"day", AT_day,
|
||||
"wday", AT_wday,
|
||||
"month", AT_month,
|
||||
"year", AT_year,
|
||||
"ODO", AT_NINE_EVENT_ODO,
|
||||
"TRIP", AT_NINE_EVENT_TRIP,
|
||||
"LIGHT_SWITCH", AT_NINE_EVENT_LIGHT_SWITCH,
|
||||
"night", AT_night,
|
||||
"THEME_SWITCH", AT_NINE_EVENT_THEME_SWITCH,
|
||||
"TRAFFIC_DATA", AT_NINE_EVENT_TRAFFIC_DATA,
|
||||
"distance", AT_distance,
|
||||
"PASSWORD", AT_NINE_EVENT_PASSWORD,
|
||||
"PAGE_SWITCH", AT_NINE_EVENT_PAGE_SWITCH,
|
||||
"TITLE", AT_TITLE,
|
||||
"index", AT_index,
|
||||
"REMAINING_MILEAGE", AT_NINE_EVENT_REMAINING_MILEAGE,
|
||||
"CHARGE_TIME", AT_NINE_EVENT_CHARGE_TIME,
|
||||
"remaining_time", AT_remaining_time,
|
||||
"percent", AT_percent,
|
||||
"", 0,
|
||||
};
|
||||
|
||||
static TOKEN token;
|
||||
TOKEN *curr_token;
|
||||
static unsigned char *NextChar;
|
||||
|
||||
|
||||
//#define stricmp strcasecmp
|
||||
static int AtTagComp (const void* a, const void* b)
|
||||
{
|
||||
return stricmp (((AT_TAG *) a)->tag_name, ((AT_TAG *) b)->tag_name);
|
||||
}
|
||||
|
||||
void AT_SortKeyword(void)
|
||||
{
|
||||
qsort (at_tag, sizeof(at_tag)/sizeof(at_tag[0]), sizeof (at_tag[0]), AtTagComp);
|
||||
}
|
||||
|
||||
void at_init_parser (unsigned char *data_to_parser)
|
||||
{
|
||||
curr_token = NULL;
|
||||
NextChar = data_to_parser;
|
||||
|
||||
AT_SortKeyword();
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int GetAtTagID (char *name, int len)
|
||||
{
|
||||
int cc, lo, mid, hi;
|
||||
AT_TAG *Ip;
|
||||
char str[MAX_TAG_NAME+1];
|
||||
int size;
|
||||
|
||||
size = len;
|
||||
if(size > MAX_TAG_NAME)
|
||||
size = MAX_TAG_NAME;
|
||||
|
||||
strncpy (str, name, size);
|
||||
str[size] = 0;
|
||||
|
||||
|
||||
// Binary search.
|
||||
lo = 0;
|
||||
hi = sizeof(at_tag)/sizeof(at_tag[0]) - 1;
|
||||
|
||||
while (lo <= hi)
|
||||
{
|
||||
mid = (lo + hi) / 2;
|
||||
Ip = &at_tag[mid];
|
||||
cc = stricmp (str, Ip->tag_name);
|
||||
|
||||
if (!cc)
|
||||
return Ip->tag_id;
|
||||
else if (cc < 0)
|
||||
hi = mid - 1;
|
||||
else
|
||||
lo = mid + 1;
|
||||
}
|
||||
|
||||
printf ("GetAtTagID %s\n", str);
|
||||
//assert (0);
|
||||
return AT_UNDEF_TAG; // Not found.
|
||||
}
|
||||
|
||||
|
||||
// 获取下一个语法基本单元TOKEN
|
||||
TOKEN* AT_NextToken(void)
|
||||
{
|
||||
int sign = 1; // 符号位 +1, -1
|
||||
|
||||
if(curr_token)
|
||||
{
|
||||
TOKEN *temp = curr_token;
|
||||
curr_token = NULL;
|
||||
return temp;
|
||||
}
|
||||
//curr_token = NULL;
|
||||
while ( 1 )
|
||||
{
|
||||
// 过滤连续的空格字符
|
||||
while(charclass[*NextChar] == SPACE)
|
||||
{
|
||||
NextChar ++;
|
||||
}
|
||||
|
||||
/* end of file */
|
||||
if (*NextChar == 0)
|
||||
{
|
||||
return (0);
|
||||
} /* end if (c==EOF) */
|
||||
|
||||
if(*NextChar == '\n')
|
||||
{
|
||||
token.id = '\n';
|
||||
token.string = (char *)NextChar;
|
||||
token.count = 1;
|
||||
NextChar ++;
|
||||
return &token;
|
||||
}
|
||||
|
||||
// 处理注释
|
||||
if (*NextChar == '/' && *(NextChar+1) == '/')
|
||||
{
|
||||
// 注释行直到行尾
|
||||
NextChar += 2;
|
||||
while( *NextChar && *NextChar != '\r' && *NextChar != '\n' )
|
||||
NextChar ++;
|
||||
if(*NextChar == '\r')
|
||||
NextChar ++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (*NextChar == '/' && *(NextChar+1) == ' ')
|
||||
{
|
||||
NextChar += 2;
|
||||
}
|
||||
|
||||
if (*NextChar == '=' && *(NextChar+1) == '=' && *(NextChar+2) == '=')
|
||||
{
|
||||
// 注释行直到行尾
|
||||
NextChar += 3;
|
||||
while( *NextChar && *NextChar != '\r' && *NextChar != '\n' )
|
||||
NextChar ++;
|
||||
if(*NextChar == '\r')
|
||||
NextChar ++;
|
||||
continue;
|
||||
}
|
||||
if (*NextChar == '(')
|
||||
{
|
||||
NextChar += 1;
|
||||
while( *NextChar && *NextChar != '\r' && *NextChar != '\n' )
|
||||
NextChar ++;
|
||||
if(*NextChar == '\r')
|
||||
NextChar ++;
|
||||
continue;
|
||||
}
|
||||
if (*NextChar == ';')
|
||||
{
|
||||
NextChar += 1;
|
||||
while( *NextChar && *NextChar != '\r' && *NextChar != '\n' )
|
||||
NextChar ++;
|
||||
if(*NextChar == '\r')
|
||||
NextChar ++;
|
||||
continue;
|
||||
}
|
||||
if(*NextChar == '=' && *(NextChar+1) == '>')
|
||||
{
|
||||
NextChar += 2;
|
||||
while( *NextChar && *NextChar != '\r' && *NextChar != '\n' )
|
||||
NextChar ++;
|
||||
if(*NextChar == '\r')
|
||||
NextChar ++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// 处理操作符
|
||||
if(*NextChar == ':')
|
||||
{
|
||||
token.id = ':';
|
||||
token.string = (char *)NextChar;
|
||||
token.count = 1;
|
||||
NextChar ++;
|
||||
return &token;
|
||||
}
|
||||
else if(*NextChar == '=')
|
||||
{
|
||||
token.id = '=';
|
||||
token.string = (char *)NextChar;
|
||||
token.count = 1;
|
||||
NextChar ++;
|
||||
return &token;
|
||||
}
|
||||
else if(*NextChar == '.')
|
||||
{
|
||||
token.id = '.';
|
||||
token.string = (char *)NextChar;
|
||||
token.count = 1;
|
||||
NextChar ++;
|
||||
return &token;
|
||||
}
|
||||
else if(*NextChar == ',')
|
||||
{
|
||||
token.id = ',';
|
||||
token.string = (char *)NextChar;
|
||||
token.count = 1;
|
||||
NextChar ++;
|
||||
return &token;
|
||||
}
|
||||
else if(*NextChar == '[' || *NextChar == ']')
|
||||
{
|
||||
token.id = *NextChar;
|
||||
token.string = (char *)NextChar;
|
||||
token.count = 1;
|
||||
NextChar ++;
|
||||
return &token;
|
||||
}
|
||||
else if(*NextChar == '-')
|
||||
{
|
||||
if( *(NextChar+1) == '>')
|
||||
{
|
||||
token.id = AT_POINTER;
|
||||
token.string = (char *)NextChar;
|
||||
token.count = 2;
|
||||
NextChar += 2;
|
||||
return &token;
|
||||
}
|
||||
else
|
||||
{
|
||||
token.id = '-'; // 负数
|
||||
token.string = (char *)NextChar;
|
||||
token.count = 1;
|
||||
NextChar += 1;
|
||||
|
||||
// 过滤连续的空格字符
|
||||
while(charclass[*NextChar] == SPACE)
|
||||
{
|
||||
NextChar ++;
|
||||
}
|
||||
|
||||
if(charclass[*NextChar] == DIGIT)
|
||||
{
|
||||
sign = -1;
|
||||
goto negative_number_process;
|
||||
}
|
||||
|
||||
return &token;
|
||||
}
|
||||
}
|
||||
else if(*NextChar == '\\')
|
||||
{
|
||||
NextChar += 1;
|
||||
while( *NextChar && *NextChar != '\r' && *NextChar != '\n' )
|
||||
NextChar ++;
|
||||
if(*NextChar == '\r')
|
||||
NextChar ++;
|
||||
continue;
|
||||
}
|
||||
else if(*NextChar == '@')
|
||||
{
|
||||
// UTF8 字符串
|
||||
NextChar += 1;
|
||||
char *str = (char *)NextChar;
|
||||
while( *NextChar && *NextChar != '\r' && *NextChar != '\n' )
|
||||
NextChar ++;
|
||||
token.id = AT_UTF8_STRING;
|
||||
token.string = str;
|
||||
token.count = (char *)NextChar - str;
|
||||
return &token;
|
||||
|
||||
}
|
||||
|
||||
|
||||
if(*NextChar == '0' && (*(NextChar+1) == 'x' || *(NextChar+1) == 'X') )
|
||||
{
|
||||
// 0x816c68a0
|
||||
unsigned int value = 0;
|
||||
char *str = (char *)NextChar;
|
||||
NextChar += 2;
|
||||
while(*NextChar && ( (*NextChar >= '0' && *NextChar <= '9') || (*NextChar >= 'a' && *NextChar <= 'f') || (*NextChar >= 'A' && *NextChar <= 'F')) )
|
||||
{
|
||||
value = value * 16 + ((*NextChar <= '9') ? (*NextChar - '0') : (toupper(*NextChar) - 'A' + 10));
|
||||
NextChar ++;
|
||||
}
|
||||
|
||||
token.id = AT_INT_CONST;
|
||||
token.value = value;
|
||||
token.string = str;
|
||||
token.count = (char *)NextChar - str;
|
||||
return &token;
|
||||
}
|
||||
|
||||
if(charclass[*NextChar] == DIGIT)
|
||||
{
|
||||
// 正整数
|
||||
unsigned int value;
|
||||
char *str;
|
||||
|
||||
sign = 1;
|
||||
|
||||
negative_number_process:
|
||||
|
||||
value = 0;
|
||||
str = (char *)NextChar;
|
||||
while(*NextChar && (*NextChar >= '0' && *NextChar <= '9'))
|
||||
{
|
||||
value = value * 10 + *NextChar - '0';
|
||||
NextChar ++;
|
||||
}
|
||||
|
||||
if(*NextChar == '.') // 小数点
|
||||
{
|
||||
// 浮点数
|
||||
float f_value = (float)value;
|
||||
float f_base = 0.1f;
|
||||
NextChar ++;
|
||||
while(*NextChar && (*NextChar >= '0' && *NextChar <= '9'))
|
||||
{
|
||||
f_value = f_value + (*NextChar - '0') * f_base;
|
||||
NextChar ++;
|
||||
f_base = (float)(f_base / 10.0);
|
||||
}
|
||||
token.id = AT_FLOAT_CONST;
|
||||
token.f_value = sign * f_value;
|
||||
token.string = str;
|
||||
token.count = (char *)NextChar - str;
|
||||
return &token;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// 正整数
|
||||
token.id = AT_INT_CONST;
|
||||
token.value = sign * value;
|
||||
token.string = str;
|
||||
token.count = (char *)NextChar - str;
|
||||
return &token;
|
||||
}
|
||||
}
|
||||
|
||||
if(charclass[*NextChar] == LETTER)
|
||||
{
|
||||
// 关键字
|
||||
char key[128];
|
||||
int len = 0;
|
||||
key[len ++] = *NextChar;
|
||||
NextChar ++;
|
||||
while( *NextChar && (charclass[*NextChar] == LETTER || charclass[*NextChar] == DIGIT || *NextChar == '_') )
|
||||
{
|
||||
key[len ++] = *NextChar;
|
||||
NextChar ++;
|
||||
}
|
||||
key[len] = 0;
|
||||
token.id = GetAtTagID (key, len);
|
||||
token.string = (char *)NextChar - len;
|
||||
token.count = len;
|
||||
return &token;
|
||||
}
|
||||
|
||||
// 非法字符
|
||||
NextChar++;
|
||||
|
||||
}
|
||||
//return 0;
|
||||
}
|
||||
|
||||
char *AT_GetAtTagName (int tag_id)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < sizeof(at_tag)/sizeof(at_tag[0]); i++)
|
||||
if(at_tag[i].tag_id == tag_id)
|
||||
return at_tag[i].tag_name;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,55 @@
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../include/XM_scancode.h"
|
||||
|
||||
/* Windows scancode to XM scancode mapping table */
|
||||
/* derived from Microsoft scan code document, http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc */
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
static const XM_Scancode windows_scancode_table[] =
|
||||
{
|
||||
/* 0 1 2 3 4 5 6 7 */
|
||||
/* 8 9 A B C D E F */
|
||||
XM_SCANCODE_UNKNOWN, XM_SCANCODE_ESCAPE, XM_SCANCODE_1, XM_SCANCODE_2, XM_SCANCODE_3, XM_SCANCODE_4, XM_SCANCODE_5, XM_SCANCODE_6, /* 0 */
|
||||
XM_SCANCODE_7, XM_SCANCODE_8, XM_SCANCODE_9, XM_SCANCODE_0, XM_SCANCODE_MINUS, XM_SCANCODE_EQUALS, XM_SCANCODE_BACKSPACE, XM_SCANCODE_TAB, /* 0 */
|
||||
|
||||
XM_SCANCODE_Q, XM_SCANCODE_W, XM_SCANCODE_E, XM_SCANCODE_R, XM_SCANCODE_T, XM_SCANCODE_Y, XM_SCANCODE_U, XM_SCANCODE_I, /* 1 */
|
||||
XM_SCANCODE_O, XM_SCANCODE_P, XM_SCANCODE_LEFTBRACKET, XM_SCANCODE_RIGHTBRACKET, XM_SCANCODE_RETURN, XM_SCANCODE_LCTRL, XM_SCANCODE_A, XM_SCANCODE_S, /* 1 */
|
||||
|
||||
XM_SCANCODE_D, XM_SCANCODE_F, XM_SCANCODE_G, XM_SCANCODE_H, XM_SCANCODE_J, XM_SCANCODE_K, XM_SCANCODE_L, XM_SCANCODE_SEMICOLON, /* 2 */
|
||||
XM_SCANCODE_APOSTROPHE, XM_SCANCODE_GRAVE, XM_SCANCODE_LSHIFT, XM_SCANCODE_BACKSLASH, XM_SCANCODE_Z, XM_SCANCODE_X, XM_SCANCODE_C, XM_SCANCODE_V, /* 2 */
|
||||
|
||||
XM_SCANCODE_B, XM_SCANCODE_N, XM_SCANCODE_M, XM_SCANCODE_COMMA, XM_SCANCODE_PERIOD, XM_SCANCODE_SLASH, XM_SCANCODE_RSHIFT, XM_SCANCODE_PRINTSCREEN,/* 3 */
|
||||
XM_SCANCODE_LALT, XM_SCANCODE_SPACE, XM_SCANCODE_CAPSLOCK, XM_SCANCODE_F1, XM_SCANCODE_F2, XM_SCANCODE_F3, XM_SCANCODE_F4, XM_SCANCODE_F5, /* 3 */
|
||||
|
||||
XM_SCANCODE_F6, XM_SCANCODE_F7, XM_SCANCODE_F8, XM_SCANCODE_F9, XM_SCANCODE_F10, XM_SCANCODE_NUMLOCKCLEAR, XM_SCANCODE_SCROLLLOCK, XM_SCANCODE_HOME, /* 4 */
|
||||
XM_SCANCODE_UP, XM_SCANCODE_PAGEUP, XM_SCANCODE_KP_MINUS, XM_SCANCODE_LEFT, XM_SCANCODE_KP_5, XM_SCANCODE_RIGHT, XM_SCANCODE_KP_PLUS, XM_SCANCODE_END, /* 4 */
|
||||
|
||||
XM_SCANCODE_DOWN, XM_SCANCODE_PAGEDOWN, XM_SCANCODE_INSERT, XM_SCANCODE_DELETE, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_NONUSBACKSLASH,XM_SCANCODE_F11, /* 5 */
|
||||
XM_SCANCODE_F12, XM_SCANCODE_PAUSE, XM_SCANCODE_UNKNOWN, XM_SCANCODE_LGUI, XM_SCANCODE_RGUI, XM_SCANCODE_APPLICATION, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, /* 5 */
|
||||
|
||||
XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_F13, XM_SCANCODE_F14, XM_SCANCODE_F15, XM_SCANCODE_F16, /* 6 */
|
||||
XM_SCANCODE_F17, XM_SCANCODE_F18, XM_SCANCODE_F19, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, /* 6 */
|
||||
|
||||
XM_SCANCODE_INTERNATIONAL2, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_INTERNATIONAL1, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN, /* 7 */
|
||||
XM_SCANCODE_UNKNOWN, XM_SCANCODE_INTERNATIONAL4, XM_SCANCODE_UNKNOWN, XM_SCANCODE_INTERNATIONAL5, XM_SCANCODE_UNKNOWN, XM_SCANCODE_INTERNATIONAL3, XM_SCANCODE_UNKNOWN, XM_SCANCODE_UNKNOWN /* 7 */
|
||||
};
|
||||
/* *INDENT-ON* */
|
1229
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/vgcanvas_nanovg_vg.c
Normal file
1229
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/vgcanvas_nanovg_vg.c
Normal file
File diff suppressed because it is too large
Load Diff
376
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/xm_hmi_host.c
Normal file
376
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/xm_hmi_host.c
Normal file
@ -0,0 +1,376 @@
|
||||
|
||||
// ??Hmi??
|
||||
#if XM_HMI_HOST
|
||||
|
||||
#include "xm_hmi_host.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <VG/openvg.h>
|
||||
#include <VG/vgu.h>
|
||||
#include <VG/vgext.h>
|
||||
#include "rtos.h"
|
||||
#include "xm_event.h"
|
||||
#include "xm_user.h"
|
||||
#include "vg_lcdc.h"
|
||||
#include <tkc/fs.h>
|
||||
#include <tkc/platform.h>
|
||||
#include "tkc/mem.h"
|
||||
#include "board.h"
|
||||
#include "pxp.h"
|
||||
#include "lcd.h"
|
||||
|
||||
|
||||
|
||||
#define CLASS_NAME "XM_VG"
|
||||
#define WINDOW_TITLE "XM_VG"
|
||||
|
||||
#define EnterCriticalSection OS_Use
|
||||
#define LeaveCriticalSection OS_Unuse
|
||||
#define DeleteCriticalSection OS_DeleteRSema
|
||||
#define InitializeCriticalSection OS_CREATERSEMA
|
||||
#define CRITICAL_SECTION OS_RSEMA
|
||||
|
||||
extern int OS_WaitCSemaTimed (OS_CSEMA* pCSema, int TimeOut);
|
||||
extern unsigned long XM_GetTickCount (void);
|
||||
extern void vgScanVideoMemoryUsage (
|
||||
VGuint* TotalFreeBytes, /* VideoMemory????????? */
|
||||
VGuint* MaximumAllocateBytes /* VideoMemory??????????? */
|
||||
);
|
||||
|
||||
static void init_pc_autotest(void); // ?????????????
|
||||
|
||||
static CRITICAL_SECTION event_critical_section;
|
||||
static OS_CSEMA event_csema;
|
||||
|
||||
#define MAX_BUFFER_SIZE 0x3F
|
||||
|
||||
static XM_EVENT eventBuffer[MAX_BUFFER_SIZE+1]; // ????
|
||||
static volatile int eventBPos; // ??????
|
||||
static volatile int eventEPos; // ??????
|
||||
|
||||
// ????
|
||||
static unsigned int win_width;
|
||||
static unsigned int win_height;
|
||||
|
||||
static int tp_clicked = 0;
|
||||
|
||||
|
||||
static float dpi_ratio = 1.0;
|
||||
|
||||
// ?????????????
|
||||
// ?????
|
||||
// 1 ?????????????
|
||||
// 0 ?????????????
|
||||
int XM_TpEventProc (unsigned int tp_event, unsigned int xPos, unsigned int yPos, unsigned int ticket)
|
||||
{
|
||||
int ret;
|
||||
if(win_width == 0 || win_height == 0)
|
||||
return 0;
|
||||
|
||||
EnterCriticalSection (&event_critical_section);
|
||||
if(ticket == 0)
|
||||
ticket = XM_GetTickCount();
|
||||
do {
|
||||
// ??????????
|
||||
if( ((eventEPos + 1) & MAX_BUFFER_SIZE) == (eventBPos & MAX_BUFFER_SIZE) )
|
||||
{
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
XM_EVENT *event;
|
||||
if (tp_event == XM_EVENT_TOUCHDOWN)
|
||||
{
|
||||
if (tp_clicked)
|
||||
{
|
||||
// TOUCHUP????, ?????
|
||||
break;
|
||||
}
|
||||
tp_clicked = 1;
|
||||
}
|
||||
else if(tp_event == XM_EVENT_TOUCHUP)
|
||||
{
|
||||
// ?????TOUCHUP
|
||||
if(tp_clicked == 0)
|
||||
break;
|
||||
tp_clicked = 0;
|
||||
}
|
||||
// ??????????????
|
||||
event = eventBuffer + (eventEPos & MAX_BUFFER_SIZE);
|
||||
memset (event, 0, sizeof(XM_TouchEvent));
|
||||
event->type = tp_event;
|
||||
event->tp.timestamp = ticket;
|
||||
event->tp.type = tp_event;
|
||||
event->tp.x = xPos;
|
||||
event->tp.y = yPos;
|
||||
|
||||
eventEPos ++;
|
||||
|
||||
// ?????
|
||||
OS_SignalCSema (&event_csema);
|
||||
|
||||
ret = 1;
|
||||
}
|
||||
} while (0);
|
||||
|
||||
LeaveCriticalSection (&event_critical_section);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef NINE
|
||||
// ??NINE?????????
|
||||
// nine_event nine??
|
||||
// ticket ?????
|
||||
// ?????
|
||||
// 1 ?????????????
|
||||
// 0 ?????????????
|
||||
int XM_NineEventProc(nine_event_t *nine_event, unsigned int ticket)
|
||||
{
|
||||
int ret;
|
||||
EnterCriticalSection(&event_critical_section);
|
||||
// ??????????
|
||||
if (((eventEPos + 1) & MAX_BUFFER_SIZE) == (eventBPos & MAX_BUFFER_SIZE))
|
||||
{
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
XM_EVENT *event;
|
||||
// ??????????????
|
||||
event = eventBuffer + (eventEPos & MAX_BUFFER_SIZE);
|
||||
memset(event, 0, sizeof(XM_NineEvent));
|
||||
event->type = XM_EVENT_NINE;
|
||||
event->nine.type = XM_EVENT_NINE;
|
||||
event->nine.timestamp = ticket;
|
||||
memcpy(&event->nine.event, nine_event, sizeof(nine_event_t));
|
||||
|
||||
eventEPos++;
|
||||
|
||||
// ?????
|
||||
OS_SignalCSema (&event_csema);
|
||||
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&event_critical_section);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
// ??????
|
||||
int XM_WaitEvent (XM_EVENT *event, unsigned int timeout)
|
||||
{
|
||||
int ret = 0;
|
||||
if(OS_WaitCSemaTimed (&event_csema, timeout) == 0)
|
||||
{
|
||||
EnterCriticalSection (&event_critical_section);
|
||||
if( eventBPos != eventEPos )
|
||||
{
|
||||
memcpy (event, eventBuffer + (eventBPos & MAX_BUFFER_SIZE), sizeof(XM_EVENT));
|
||||
eventBPos ++;
|
||||
ret = 1;
|
||||
}
|
||||
LeaveCriticalSection (&event_critical_section);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
float XM_GetWindowDpiRatio(void)
|
||||
{
|
||||
dpi_ratio = 1.0f;
|
||||
return dpi_ratio;
|
||||
}
|
||||
|
||||
|
||||
static void windowDestroy(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void XM_HmiHost_WindowDestroy(void)
|
||||
{
|
||||
DeleteCriticalSection (&event_critical_section);
|
||||
OS_DeleteCSema (&event_csema);
|
||||
windowDestroy ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void * XM_HmiHost_WindowCreate(const char* title,
|
||||
const unsigned int width,
|
||||
const unsigned int height)
|
||||
{
|
||||
OS_CreateCSema (&event_csema, 0);
|
||||
InitializeCriticalSection (&event_critical_section);
|
||||
eventBPos = eventEPos = 0;
|
||||
win_width = width;
|
||||
win_height = height;
|
||||
tp_clicked = 0;
|
||||
|
||||
init_pc_autotest ();
|
||||
return (void *)1;
|
||||
}
|
||||
|
||||
//extern uint64_t get_time_ms64(void);
|
||||
|
||||
void XM_HmiHost_WindowBuffersSwap(char *surface_pixels, unsigned int width, unsigned int height, unsigned int bpp)
|
||||
{
|
||||
void xm_vg_release_gpu_fb (void);
|
||||
//unsigned int t1 = (unsigned int) get_time_ms64();
|
||||
unsigned int lcd_buffer = (unsigned int)xm_vg_require_gpu_fb();
|
||||
|
||||
//lcd_buffer += xm_vg_get_osd_stride() * (xm_vg_get_height() - 1);
|
||||
bpp = xm_vg_get_bpp ();
|
||||
// 630H ???ARGB8888?RGB565??
|
||||
#ifdef ENABLE_FB_DIRTY_RECTS_COPY
|
||||
extern int vg_surface_sync(unsigned int lcd_buffer, unsigned int width, unsigned int height);
|
||||
// ??????????????LCD??FB
|
||||
if (vg_surface_sync(lcd_buffer, width, height))
|
||||
{
|
||||
// ????
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
#if LCD_ROTATE_ANGLE != LCD_ROTATE_ANGLE_0
|
||||
unsigned int lcd_tmp_buf = ark_lcd_get_virt_addr();
|
||||
int src_width = xm_vg_get_width();
|
||||
int src_height = xm_vg_get_height();
|
||||
int dst_width = src_width;
|
||||
int dst_height = src_height;
|
||||
int src_format, dst_format, lcd_format;
|
||||
static int lcd_first_show = 0;
|
||||
int ret;
|
||||
|
||||
#if ((LCD_ROTATE_ANGLE == LCD_ROTATE_ANGLE_90) || (LCD_ROTATE_ANGLE == LCD_ROTATE_ANGLE_270))
|
||||
dst_width = src_height;
|
||||
dst_height = src_width;
|
||||
#endif
|
||||
if (bpp == 32)
|
||||
{
|
||||
src_format = PXP_SRC_FMT_RGB888;
|
||||
dst_format = PXP_OUT_FMT_ARGB8888;
|
||||
lcd_format = LCD_OSD_FORAMT_ARGB888;
|
||||
vgReadPixels((void *)lcd_tmp_buf, xm_vg_get_osd_stride(), VG_sARGB_8888, 0, 0, src_width, src_height);
|
||||
}
|
||||
else
|
||||
{
|
||||
src_format = PXP_SRC_FMT_RGB565;
|
||||
dst_format = PXP_OUT_FMT_RGB565;
|
||||
lcd_format = LCD_OSD_FORAMT_RGB565;
|
||||
vgReadPixels((void *)lcd_tmp_buf, xm_vg_get_osd_stride(), VG_sRGB_565, 0, 0, src_width, src_height);
|
||||
}
|
||||
ret = pxp_scaler_rotate(lcd_tmp_buf, 0, 0, src_format, src_width, src_height,
|
||||
(uint32_t)lcd_buffer, 0, dst_format, dst_width, dst_height, LCD_ROTATE_ANGLE);
|
||||
if(ret < 0)
|
||||
{
|
||||
printf("%s pxp_scaler_rotate failed\n", __func__);
|
||||
//...
|
||||
}
|
||||
if(!lcd_first_show)
|
||||
{
|
||||
ark_lcd_set_osd_size(LCD_UI_LAYER, dst_width, dst_height);
|
||||
ark_lcd_set_osd_format(LCD_UI_LAYER, lcd_format);
|
||||
lcd_first_show = 1;
|
||||
}
|
||||
#else
|
||||
if (bpp == 32)
|
||||
{
|
||||
vgReadPixels((void *)lcd_buffer, xm_vg_get_osd_stride(), VG_sARGB_8888, 0, 0, xm_vg_get_width(), xm_vg_get_height());
|
||||
}
|
||||
else
|
||||
{
|
||||
vgReadPixels((void *)lcd_buffer, xm_vg_get_osd_stride(), VG_sRGB_565, 0, 0, xm_vg_get_width(), xm_vg_get_height());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//unsigned int t2 = (unsigned int) get_time_ms64();
|
||||
//unsigned int t3 = (unsigned int)get_time_ms64();
|
||||
//printf("ReadPixel = %d, rel = %d ms\r\n", t2 - t1, t3 - t2);
|
||||
xm_vg_release_gpu_fb ();
|
||||
|
||||
//VGuint TotalFreeBytes, MaximumAllocateBytes;
|
||||
//vgScanVideoMemoryUsage (&TotalFreeBytes, &MaximumAllocateBytes);
|
||||
//printf ("TotalFreeBytes=%d, MaximumAllocateBytes=%d\n",TotalFreeBytes, MaximumAllocateBytes);
|
||||
}
|
||||
|
||||
void XM_GetWidowSize(int *w, int *h)
|
||||
{
|
||||
*w = win_width;
|
||||
*h = win_height;
|
||||
}
|
||||
|
||||
void XM_GetDrawableSize(int *w, int *h)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
extern int nine_at_define(unsigned char *script_data);
|
||||
|
||||
#define AT_FILE_NAME "./autotest.at"
|
||||
static int run_at_script(void)
|
||||
{
|
||||
int32_t file_size;
|
||||
unsigned char *script = NULL;
|
||||
do {
|
||||
file_size = file_get_size (AT_FILE_NAME);
|
||||
if(file_size < 0)
|
||||
return -1;
|
||||
|
||||
script = (unsigned char *)TKMEM_ZALLOCN(unsigned char, file_size + 1);
|
||||
if (script) {
|
||||
file_read_part (AT_FILE_NAME, script, file_size, 0);
|
||||
printf("run AT script file(%s) ...\n", AT_FILE_NAME);
|
||||
nine_at_define((unsigned char *)script);
|
||||
printf("run AT script file(%s) finish\n", AT_FILE_NAME);
|
||||
TKMEM_FREE(script);
|
||||
}
|
||||
|
||||
} while (0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pc_autotest_task(void)
|
||||
{
|
||||
int fs_size = -1;
|
||||
while(1)
|
||||
{
|
||||
// ??SD????????
|
||||
int32_t size = file_get_size (AT_FILE_NAME);
|
||||
if(fs_size != size && size > 0)
|
||||
{
|
||||
fs_size = size;
|
||||
run_at_script ();
|
||||
}
|
||||
else
|
||||
{
|
||||
fs_size = -1;
|
||||
}
|
||||
sleep_ms (1000);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static OS_TASK pc_autotest_os_task;
|
||||
static unsigned int pc_autotest_stack[0x4000 / 4];
|
||||
static void init_pc_autotest(void)
|
||||
{
|
||||
#ifdef NINE
|
||||
OS_CREATETASK(
|
||||
&pc_autotest_os_task,
|
||||
"pc_autotest",
|
||||
pc_autotest_task,
|
||||
200,
|
||||
pc_autotest_stack
|
||||
);
|
||||
//hAutotestThread = CreateThread(NULL, 0x10000, pc_autotest_task, NULL, 0, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* XM_HMI_HOST */
|
||||
|
||||
|
1053
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/xm_windows_host.c
Normal file
1053
MXC_A27-PCB4.5-270T/lib/awtk/awtk/3rd/xm/src/xm_windows_host.c
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user