CARPLAY版本整理

This commit is contained in:
2025-01-21 16:49:37 +08:00
commit f0fb64e4e6
26542 changed files with 13719676 additions and 0 deletions

View 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;
}

View 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;
}

View File

@ -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*/

View File

@ -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

View File

@ -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

View File

@ -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* */

File diff suppressed because it is too large Load Diff

View 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 */

File diff suppressed because it is too large Load Diff