linuxOS_MC3302/sdk/X-AIOS-LT00-V1.0.4/build/script/common/mkproj.py
2026-01-30 16:53:24 +08:00

193 lines
6.0 KiB
Python
Executable File

import os
import sys
def create_directories(base_dir, dirs):
os.makedirs(base_dir, exist_ok=True)
print(f"create dir: {base_dir}");
for directory in dirs:
path = os.path.join(base_dir, directory)
os.makedirs(path, exist_ok=True)
print(f"Created directory: {path}")
def create_file(filepath, content):
with open(filepath, 'w') as f:
f.write(content)
print(f"Created file: {filepath}")
def modify_file(filepath, insert_lines, search_keyword=None):
with open(filepath, 'r') as f:
lines = f.readlines()
if search_keyword:
for i, line in enumerate(lines):
if search_keyword in line:
lines.insert(i, insert_lines)
break
else:
lines.append(insert_lines)
with open(filepath, 'w') as f:
f.writelines(lines)
print(f"Modified file: {filepath}")
def create_project(project_name):
# Step 1: Create directories under ./core/res/XXX/
core_res_dir = f'./core/res/{project_name}'
create_directories(core_res_dir, ['skin', 'video', 'ttf', 'string'])
# Step 2: Create project_XXX_conf.mk in ./product/XXX/
product_dir = f'./product/{project_name}'
create_directories(product_dir, [])
mk_content = f"""export CONFIG_XOS_PROJECT_TYPE={project_name}
export CONFIG_XOS_USE_APP_{project_name.upper()}=true
export CONFIG_XOS_FWK_EFFECTS=true
export CONFIG_XOS_USE_PLAYER=true
export CONFIG_LVGL_VERSION=lvgl-v9
"""
create_file(os.path.join(product_dir, f'project_{project_name}_conf.mk'), mk_content)
# Step 3: Modify ./build/make/qsub/apps.mk
apps_mk_path = './build/make/qsub/apps.mk'
apps_mk_content = f"""ifeq ($(CONFIG_XOS_USE_APP_{project_name.upper()}),true)
APPS_CSRCS += $(shell find -L $(XOS_DIR)/$(XOS_APPS_DIR_NAME)/{project_name} -name "*.c")
endif
"""
modify_file(apps_mk_path, apps_mk_content, "CSRCS += $(APPS_CSRCS)")
# Step 3.1: Modify ./build/make/qsub/apps.mk
appsmain_path = './core/apps/src/appsmain.c'
appsmain_content = f"""#ifdef CONFIG_XOS_USE_APP_{project_name.upper()}
extern void {project_name}_init(void);
{project_name}_init();
#endif
"""
modify_file(appsmain_path, appsmain_content, "//app register")
# Step 4: Modify ./product/common/projflag.mk
projflag_mk_path = './product/common/projflag.mk'
projflag_mk_content = f"""
ifeq ($(CONFIG_XOS_USE_APP_{project_name.upper()}),true)
CFLAGS += -DCONFIG_XOS_USE_APP_{project_name.upper()}=1
endif
"""
modify_file(projflag_mk_path, projflag_mk_content)
# Step 5: Create directories and files under ./core/apps/XXX/
core_apps_dir = f'./core/apps/{project_name}'
create_directories(core_apps_dir, ['view', 'ctrl', 'config', 'model'])
model_h_content = f"""#ifndef _{project_name.upper()}_HOME_OBJS_MODEL_H
#define _{project_name.upper()}_HOME_OBJS_MODEL_H
#include "lvgl/lvgl.h"
typedef struct {{
lv_obj_t *s_container;
}} {project_name}_home_objs;
#endif //_XXX_HOME_OBJS_MODEL_H
"""
create_file(os.path.join(core_apps_dir, 'model', f'{project_name}_home_objs_model.h'), model_h_content)
view_h_content = f"""#ifndef _{project_name.upper()}_HOME_PAGE_H_
#define _{project_name.upper()}_HOME_PAGE_H_
//
void xos_{project_name}_wakeup(void);
void xos_{project_name}_sleep(void);
void los_{project_name}_entry(void);
//
void {project_name}_init(void);
#endif //_{project_name.upper()}_HOME_PAGE_H_
"""
create_file(os.path.join(core_apps_dir, 'view', f'{project_name}_home_page.h'), view_h_content)
view_c_content = f"""#include "{project_name}_home_page.h"
#include "lvgl/lvgl.h"
#include "appcommon.h"
#include "appmanager.h"
#include "qua_font.h"
#include "qm_lv_obj.h"
#include "../model/{project_name}_home_objs_model.h"
//declare
static void button_event_cb(lv_event_t * e);
static lv_obj_t * create_ui(lv_obj_t *p);
//variable:
static {project_name}_home_objs s_home_objs = {{0}};
//implements:
void xos_{project_name}_wakeup(void)
{{
}}
void xos_{project_name}_sleep(void)
{{
}}
static app_data_ptr xos_{project_name}_oncreate(void *p)
{{
(void)p;
los_{project_name}_entry();
return NULL;
}}
void {project_name}_init(void) {{
qua_app_ops *ops = malloc(sizeof(qua_app_ops));
if (ops) {{
memset(ops, 0x0, sizeof(qua_app_ops));
ops->on_create = xos_{project_name}_oncreate;
ops->on_sleep = xos_{project_name}_sleep;
ops->on_wakeup = xos_{project_name}_wakeup;
app_manager_register("{project_name}", ops);
}}
}}
//implements
void los_{project_name}_entry(void)
{{
lv_obj_t * p = lv_scr_act();
qua_los_ft_font_init();
s_home_objs.s_container = create_ui(p);
}}
static lv_obj_t * create_ui(lv_obj_t *p)
{{
lv_obj_t * bg_wnd = qm_lv_obj_create(p);
lv_obj_set_size(bg_wnd, LV_USE_HOR_SIZE, LV_USE_VER_SIZE);
lv_obj_set_style_bg_color(bg_wnd, lv_color_white(), LV_PART_MAIN);
lv_obj_align(bg_wnd, LV_ALIGN_CENTER, 0, 0);
//create button
lv_obj_t * button = lv_button_create(bg_wnd);
lv_obj_align(button, LV_ALIGN_LEFT_MID, 0, 0);
lv_obj_set_size(button, 100, 50);
lv_obj_add_event_cb(button, button_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_t * label = lv_label_create(button);
lv_label_set_text(label, "Button");
lv_obj_center(label);
//create textview
lv_obj_t * skill_text = lv_label_create(bg_wnd);
lv_obj_set_size(skill_text, 200, LV_USE_VER_SIZE);
lv_label_set_text(skill_text, "Hello, world");
lv_obj_set_style_text_align(skill_text, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_obj_set_style_text_color(skill_text, lv_color_black(), LV_PART_MAIN);
lv_obj_align(skill_text, LV_ALIGN_RIGHT_MID, 0, 0);
return bg_wnd;
}}
static void button_event_cb(lv_event_t * e)
{{
LV_LOG_USER("Clicked\\n");
}}
"""
create_file(os.path.join(core_apps_dir, 'view', f'{project_name}_home_page.c'), view_c_content)
if __name__ == "__main__":
if len(sys.argv) != 3 or sys.argv[1] != "-p":
print("Usage: ./create_app.py -p XXX")
else:
project_name = sys.argv[2]
create_project(project_name)