add tetris module

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@904 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
qiuyiuestc committed 2010-09-13 00:58:56 +00:00
1 parent 322b7d21db
commit e78285e76f
9 files changed
+1604

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
import os
import sys
import rtconfig
RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
import mdk
target = RTT_ROOT + '/bsp/mini2440/rtthread-mini2440'
projects = []
AddOption('--target',
dest='target',
type='string',
help='set target project: mdk')
if GetOption('target'):
SetOption('no_exec', 1)
TARGET = target + '.' + rtconfig.TARGET_EXT
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
AR = rtconfig.AR, ARFLAGS = '-rc',
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
Export('env')
Export('RTT_ROOT')
Export('rtconfig')
Export('projects')
Export('TARGET')
objs = SConscript(RTT_ROOT + '/components/module/tetris/SConscript', variant_dir='build/tetris', duplicate=0)
File diff suppressed because it is too large. Load diff
+83
View File
@@ -0,0 +1,83 @@
import SCons.cpp
# component options
# toolchains options
ARCH = 'arm'
CPU = 's3c24x0'
TextBase = '0x30000000'
CROSS_TOOL = 'gcc'
if CROSS_TOOL == 'gcc':
PLATFORM = 'gcc'
EXEC_PATH = 'E:/Program Files/CodeSourcery/Sourcery G++ Lite/bin'
elif CROSS_TOOL == 'keil':
PLATFORM = 'armcc'
EXEC_PATH = 'E:/Keil'
BUILD = 'debug'
if PLATFORM == 'gcc':
# toolchains
PREFIX = 'arm-none-eabi-'
CC = PREFIX + 'gcc'
AS = PREFIX + 'gcc'
AR = PREFIX + 'ar'
LINK = PREFIX + 'gcc'
TARGET_EXT = 'axf'
SIZE = PREFIX + 'size'
OBJDUMP = PREFIX + 'objdump'
OBJCPY = PREFIX + 'objcopy'
DEVICE = ' -mcpu=arm920t'
CFLAGS = DEVICE
AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp' + ' -DTEXT_BASE=' + TextBase
LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread_mini2440.map,-cref,-u,_start -T mini2440_ram.ld' + ' -Ttext ' + TextBase
CPATH = ''
LPATH = ''
if BUILD == 'debug':
CFLAGS += ' -O0 -gdwarf-2'
AFLAGS += ' -gdwarf-2'
else:
CFLAGS += ' -O2'
POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'
elif PLATFORM == 'armcc':
# toolchains
CC = 'armcc'
AS = 'armasm'
AR = 'armar'
LINK = 'armlink'
TARGET_EXT = 'axf'
DEVICE = ' --device DARMSS9'
CFLAGS = DEVICE + ' --apcs=interwork --diag_suppress=870'
AFLAGS = DEVICE
LFLAGS = DEVICE + ' --strict --info sizes --info totals --info unused --info veneers --list rtthread-mini2440.map --ro-base 0x30000000 --entry Entry_Point --first Entry_Point'
CFLAGS += ' -I"' + EXEC_PATH + '/ARM/RV31/INC"'
LFLAGS += ' --libpath "' + EXEC_PATH + '/ARM/RV31/LIB"' + ' --keep __RTMsym_*'
EXEC_PATH += '/arm/bin40/'
if BUILD == 'debug':
CFLAGS += ' -g -O0'
AFLAGS += ' -g'
else:
CFLAGS += ' -O2'
POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET'
elif PLATFORM == 'iar':
# toolchains
CC = 'armcc'
AS = 'armasm'
AR = 'armar'
LINK = 'armlink'
CFLAGS = ''
AFLAGS = ''
LFLAGS = ''
+42
View File
@@ -0,0 +1,42 @@
Import('env')
Import('projects')
Import('RTT_ROOT')
Import('rtconfig')
Import('TARGET')
RTMLINKER = RTT_ROOT + '/tools/rtmlinker.exe '
# group definitions
group = {}
group['CCFLAGS'] = ''
group['CPPPATH'] = [RTT_ROOT + '/include',
RTT_ROOT + '/components/module',
RTT_ROOT + '/components/rtgui/include',
RTT_ROOT + '/components/rgtui/common',
RTT_ROOT + '/components/rtgui/server',
RTT_ROOT + '/components/rtgui/widgets']
group['CPPDEFINES'] = ''
target = 'tetris.so'
POST_ACTION = RTMLINKER + ' -D 1 -l ' + TARGET + ' -o tetris.mo ' + '$TARGET'
# add group to project list
projects.append(group)
src_local = Split("""
application.c
tetris_ui.c
tetris_modal.c
tetris_view.c
""")
env.Append(CCFLAGS = group['CCFLAGS'])
env.Append(CPPPATH = group['CPPPATH'])
env.Append(CPPDEFINES = group['CPPDEFINES'])
module_env = env.Clone(CPPDEFINE = 'RT_MODULE')
module_env = env.Clone(CCFLAGS = ' -mcpu=arm920t -O0 -fPIC')
module_env.Replace(LINK = 'arm-none-eabi-ld')
module_env.Replace(LINKFLAGS = '-z max-page-size=0x4 -shared -fPIC -e rt_application_init -nostdlib -s')
module_env.Program(target, src_local)
module_env.AddPostAction(target, POST_ACTION)
+45
View File
@@ -0,0 +1,45 @@
/*
* File : app.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://openlab.rt-thread.com/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2010-08-28 Yi.Qiu the first version
*/
/**
* @addtogroup LM3S
*/
/*@{*/
#include <rtthread.h>
#include <rtgui/rtgui.h>
#include <rtgui/rtgui_server.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/workbench.h>
extern void tetris_ui_entry(void* parameter);
int rt_application_init()
{
rt_thread_t tid;
rtgui_rect_t rect;
/* ×¢²áÃæ°å */
rect.x1 = 0;
rect.y1 = 0;
rect.x2 = 128;
rect.y2 = 96;
rtgui_panel_register("main", &rect);
rtgui_panel_set_default_focused("main");
tid = rt_thread_create("wb", tetris_ui_entry, RT_NULL, 2048, 20, 5);
if (tid != RT_NULL) rt_thread_startup(tid);
return 0;
}
/*@}*/
+59
View File
@@ -0,0 +1,59 @@
/*
* File : tetris_modal.c
* This file is part of RTGUI in RT-Thread RTOS
* COPYRIGHT (C) 2010, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2010-08-14 Yi.Qiu first version
*/
#include <rtthread.h>
struct rt_tetris;
typedef struct rt_tetris rt_tetris_t;
struct rt_tetris_view;
typedef struct rt_tetris_view rt_tetris_view_t;
typedef rt_err_t (*on_update)(rt_tetris_view_t* thiz, rt_tetris_t* tetris);
struct rt_tetris_view
{
rt_uint32_t width;
rt_uint32_t height;
on_update update;
on_update update_next_brick;
on_update update_level;
on_update update_score_and_lines;
void *private;
};
rt_tetris_t* rt_tetris_create(rt_uint32_t width, rt_uint32_t height);
rt_err_t rt_tetris_destory(rt_tetris_t* thiz);
rt_err_t rt_tetris_start(rt_tetris_t* thiz);
rt_err_t rt_tetris_pause(rt_tetris_t* thiz);
rt_uint32_t rt_tetris_width(rt_tetris_t* thiz);
rt_uint32_t* rt_tetris_next_brick(rt_tetris_t* thiz);
rt_uint32_t rt_tetris_level(rt_tetris_t* thiz);
rt_uint32_t rt_tetris_lines(rt_tetris_t* thiz);
rt_uint32_t rt_tetris_score(rt_tetris_t* thiz);
rt_uint32_t rt_tetris_height(rt_tetris_t* thiz);
rt_bool_t rt_tetris_status(rt_tetris_t* thiz);
rt_err_t rt_tetris_down(rt_tetris_t* thiz);
rt_err_t rt_tetris_left(rt_tetris_t* thiz);
rt_err_t rt_tetris_right(rt_tetris_t* thiz);
rt_err_t rt_tetris_drop(rt_tetris_t* thiz);
rt_err_t rt_tetris_rotate(rt_tetris_t* thiz, rt_bool_t direction);
rt_err_t rt_tetris_add_view(rt_tetris_t* thiz, rt_tetris_view_t* view);
rt_err_t rt_tetris_delete_view(rt_tetris_t* thiz, rt_tetris_view_t* view);
rt_err_t rt_tetris_check_collision(rt_tetris_t* thiz, rt_uint32_t block);
rt_tetris_view_t* rt_tetris_view_create(void* private);
rt_err_t rt_tetris_view_destroy(rt_tetris_view_t* thiz);
File diff suppressed because it is too large. Load diff
+178
View File
@@ -0,0 +1,178 @@
/*
* File : tetris_ui.c
* This file is part of RTGUI in RT-Thread RTOS
* COPYRIGHT (C) 2010, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2010-08-14 Yi.Qiu first version
*/
#include <rtgui/rtgui.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/view.h>
#include <rtgui/widgets/label.h>
#include <rtgui/widgets/button.h>
#include <rtgui/widgets/window.h>
#include <rtgui/widgets/workbench.h>
#include <rtgui/dc.h>
#include "tetris.h"
struct app_info
{
struct rtgui_view* home_view;
struct rtgui_view* info_view;
struct rtgui_workbench* workbench;
rt_tetris_t * tetris;
rt_tetris_view_t* tetris_view;
rtgui_timer_t* _timer;
};
typedef struct app_info app_info;
static app_info g_app_info;
static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
if (event->type == RTGUI_EVENT_PAINT)
{
struct rtgui_dc* dc;
rtgui_rect_t rect;
/* draw child */
rtgui_view_event_handler(widget, event);
dc = rtgui_dc_begin_drawing(widget);
if (dc == RT_NULL) return -RT_ERROR;
rect.x1 = 96;
rect.y1 = 0;
rect.x2 = 128;
rect.y2 = 16;
rtgui_dc_draw_text(dc, "next", &rect);
rect.y1 += 30;
rect.y2 = rect.y1 + 16;
rtgui_dc_draw_text(dc, "level", &rect);
rect.y1 += 22;
rect.y2 = rect.y1 + 16;
rtgui_dc_draw_text(dc, "lines", &rect);
rect.y1 += 22;
rect.y2 = rect.y1 + 16;
rtgui_dc_draw_text(dc, "score", &rect);
rtgui_dc_end_drawing(dc);
/* start tetris game, removed later */
rt_tetris_start(g_app_info.tetris);
return RT_FALSE;
}
else if ((event->type == RTGUI_EVENT_KBD))
{
struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
if (ekbd->type == RTGUI_KEYDOWN)
{
if (ekbd->key == RTGUIK_RIGHT)
{
rt_tetris_right(g_app_info.tetris);
}
else if (ekbd->key == RTGUIK_LEFT)
{
rt_tetris_left(g_app_info.tetris);
}
else if (ekbd->key == RTGUIK_UP)
{
rt_tetris_rotate(g_app_info.tetris, RT_EOK);
}
else if (ekbd->key == RTGUIK_DOWN)
{
if( rt_tetris_drop(g_app_info.tetris) == -RT_ETIMEOUT
&& rt_tetris_status(g_app_info.tetris) != RT_FALSE)
{
rt_kprintf("GAME OVER\n");
rtgui_timer_stop(g_app_info._timer);
rt_tetris_pause(g_app_info.tetris);
}
}
}
}
return rtgui_view_event_handler(widget, event);
}
static void _timer_timeout(rtgui_timer_t* timer, void* parameter)
{
if( rt_tetris_down(g_app_info.tetris) == -RT_ETIMEOUT)
{
rt_kprintf("GAME OVER\n");
rtgui_timer_stop(g_app_info._timer);
rt_tetris_destory(g_app_info.tetris);
rt_tetris_view_destroy(g_app_info.tetris_view);
}
}
static rt_bool_t workbench_event_handler(rtgui_widget_t *widget, rtgui_event_t *event)
{
if (event->type == RTGUI_EVENT_KBD)
{
struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
if (((ekbd->type == RTGUI_KEYUP) && ekbd->key == RTGUIK_HOME)
&& !RTGUI_WORKBENCH_IS_MODAL_MODE(g_app_info.workbench))
{
/* active home view */
if (g_app_info.workbench->current_view != g_app_info.home_view)
{
rtgui_view_show(g_app_info.home_view, RT_FALSE);
return RT_TRUE;
}
}
}
return rtgui_workbench_event_handler(widget, event);
}
void tetris_ui_entry(void* parameter)
{
rt_mq_t mq;
rt_kprintf("tetris_ui_entry\n");
mq = rt_mq_create("tetris_ui", 256, 4, RT_IPC_FLAG_FIFO);
rtgui_thread_register(rt_thread_self(), mq);
g_app_info.workbench = rtgui_workbench_create("main", "workbench");
if (g_app_info.workbench == RT_NULL) return;
rtgui_widget_set_event_handler(RTGUI_WIDGET(g_app_info.workbench), workbench_event_handler);
/* add home view */
g_app_info.home_view = rtgui_view_create("Home");
rtgui_widget_set_event_handler(RTGUI_WIDGET(g_app_info.home_view), home_view_event_handler);
rtgui_workbench_add_view(g_app_info.workbench, g_app_info.home_view);
/* this view can be focused */
RTGUI_WIDGET(g_app_info.home_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
/* set widget focus */
rtgui_widget_focus(RTGUI_WIDGET(g_app_info.home_view));
RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(g_app_info.home_view)) = 10;
rtgui_view_show(g_app_info.home_view, RT_FALSE);
/* create tetris modal instance */
g_app_info.tetris = rt_tetris_create(16, 17);
/* create tetris view instance */
g_app_info.tetris_view = rt_tetris_view_create(RTGUI_WIDGET(g_app_info.home_view));
/* register tetris view to tetris modal */
rt_tetris_add_view(g_app_info.tetris, g_app_info.tetris_view);
g_app_info._timer = rtgui_timer_create(40, RT_TIMER_FLAG_PERIODIC, _timer_timeout, RT_NULL);
rtgui_timer_start(g_app_info._timer);
rtgui_workbench_event_loop(g_app_info.workbench);
rtgui_thread_deregister(rt_thread_self());
rt_mq_delete(mq);
}
File diff suppressed because it is too large. Load diff