26
|
1 #include <iostream>
|
|
2 #include "viewer.h"
|
|
3 #include "polygon.h"
|
|
4 #include "demonstration.h"
|
|
5 #include "pad.h"
|
|
6 #include "TaskManager.h"
|
|
7 using namespace std;
|
|
8
|
49
|
9 #include "error.h"
|
|
10
|
26
|
11 int init(void*, void*);
|
|
12 int sdl_init(void*, void*);
|
|
13 int zrow_init(void*, void*);
|
|
14 int run(void*, void*);
|
|
15 int finish(void*, void*);
|
|
16
|
48
|
17 extern void task_initialize();
|
42
|
18
|
26
|
19 TaskManager *manager;
|
|
20 Viewer *screen;
|
|
21
|
|
22 struct init_arg {
|
|
23 int bpp;
|
|
24 int w;
|
|
25 int h;
|
|
26 };
|
|
27
|
49
|
28 struct init_arg *initArg;
|
|
29
|
|
30 int init(void *r, void *w)
|
26
|
31 {
|
48
|
32 int fd_sdl_init, fd_zrow_init, fd_run;
|
|
33 HTaskPtr task_sdl_init, task_zrow_init, task_run;
|
26
|
34
|
49
|
35 __debug("[%s]\n", __FUNCTION__);
|
26
|
36
|
49
|
37 screen = new Viewer(initArg->bpp, initArg->w, initArg->h);
|
26
|
38
|
|
39 fd_sdl_init = manager->open("sdl_init");
|
|
40 fd_zrow_init = manager->open("zRow_init");
|
|
41 fd_run = manager->open("run");
|
|
42
|
|
43 task_sdl_init = manager->create_task(fd_sdl_init, 0, 0, 0, NULL);
|
|
44 task_zrow_init = manager->create_task(fd_zrow_init, 0, 0, 0, NULL);
|
|
45 task_run = manager->create_task(fd_run, 0, 0, 0, NULL);
|
|
46
|
85
|
47 //manager->set_task_depend(task_sdl_init, task_run);
|
|
48 //manager->set_task_depend(task_zrow_init, task_run);
|
|
49
|
63
|
50 task_run->set_depend(task_sdl_init);
|
|
51 task_run->set_depend(task_zrow_init);
|
26
|
52
|
63
|
53 task_sdl_init->spawn();
|
|
54 task_zrow_init->spawn();
|
|
55 task_run->spawn();
|
26
|
56
|
49
|
57 free(initArg);
|
26
|
58 return 0;
|
|
59 }
|
|
60
|
|
61
|
|
62 // クラス関数は単純にポインタで扱えないので
|
|
63 // 現状は間接的に呼ぶことに
|
48
|
64 int sdl_init(void *r, void *w)
|
26
|
65 {
|
49
|
66 __debug("[%s]\n", __FUNCTION__);
|
26
|
67 screen->sdl_init();
|
|
68 return 0;
|
|
69 }
|
|
70
|
48
|
71 int zRow_init(void *r, void *w)
|
26
|
72 {
|
49
|
73 __debug("[%s]\n", __FUNCTION__);
|
26
|
74 screen->zRow_init();
|
|
75 return 0;
|
|
76 }
|
|
77
|
48
|
78 int run(void *r, void *w)
|
26
|
79 {
|
49
|
80 __debug("[%s]\n", __FUNCTION__);
|
48
|
81 screen->run_init();
|
|
82 return 0;
|
|
83 }
|
|
84
|
|
85 int run_loop(void *r, void *w)
|
|
86 {
|
49
|
87 __debug("[%s]\n", __FUNCTION__);
|
48
|
88 screen->run_loop();
|
26
|
89 return 0;
|
|
90 }
|
|
91
|
48
|
92 int run_draw(void *r, void *w)
|
|
93 {
|
49
|
94 __debug("[%s]\n", __FUNCTION__);
|
48
|
95 screen->run_draw();
|
|
96 return 0;
|
|
97 }
|
|
98
|
|
99 int run_finish(void *r, void *w)
|
|
100 {
|
49
|
101 __debug("[%s]\n", __FUNCTION__);
|
85
|
102 screen->run_finish();
|
48
|
103 return 0;
|
|
104 }
|
|
105
|
26
|
106 int finish(void *w, void *r)
|
|
107 {
|
49
|
108 __debug("[%s]\n", __FUNCTION__);
|
26
|
109 delete screen;
|
50
|
110 delete manager;
|
26
|
111 return 0;
|
|
112 }
|
|
113
|
49
|
114 int
|
|
115 main(int argc, char *argv[])
|
26
|
116 {
|
85
|
117 manager = new TaskManager(1);
|
26
|
118 manager->init();
|
|
119
|
35
|
120 task_initialize();
|
|
121
|
26
|
122 // 本当は、dlsym みたいなものを使いたいんだけど
|
|
123 // 静的なやつはできないん?
|
|
124 manager->set_symbol("init", (void*)init);
|
|
125 manager->set_symbol("sdl_init", (void*)sdl_init);
|
|
126 manager->set_symbol("zRow_init", (void*)zRow_init);
|
|
127 manager->set_symbol("run", (void*)run);
|
|
128 manager->set_symbol("finish", (void*)finish);
|
48
|
129 manager->set_symbol("ViewerRunLoop", (void*)run_loop);
|
|
130 manager->set_symbol("ViewerRunDraw", (void*)run_draw);
|
|
131 manager->set_symbol("ViewerRunFinish", (void*)run_finish);
|
26
|
132
|
|
133 int bpp = 0;
|
|
134 int width = 640;
|
|
135 int height = 480;
|
|
136
|
|
137 for(int i = 1; argv[i]; ++i)
|
|
138 {
|
|
139 if (strcmp(argv[i], "-bpp") == 0)
|
|
140 {
|
31
|
141 bpp = atoi(argv[++i]);
|
26
|
142 }
|
|
143 if (strcmp(argv[i], "-width") == 0)
|
|
144 {
|
31
|
145 width = atoi(argv[++i]);
|
26
|
146 }
|
|
147 if (strcmp(argv[i], "-height") == 0)
|
|
148 {
|
31
|
149 height = atoi(argv[++i]);
|
26
|
150 }
|
|
151 }
|
|
152
|
|
153 // 一番最初に行われる init 専用の task_run があってもいいけど。。
|
|
154 // その場合は引数とか固定か。まあ引数は argc, argv を持つ
|
|
155 // 構造体で固定しても問題はない・・・か?
|
|
156 HTaskPtr task_init;
|
|
157 int fd_init;
|
49
|
158 initArg = new struct init_arg;
|
|
159 initArg->bpp = bpp;
|
|
160 initArg->w = width;
|
|
161 initArg->h = height;
|
31
|
162
|
26
|
163 fd_init = manager->open("init");
|
49
|
164 task_init = manager->create_task(fd_init, 0, 0, 0, NULL);
|
85
|
165 //manager->spawn_task(task_init);
|
63
|
166 task_init->spawn();
|
50
|
167
|
26
|
168 manager->run();
|
48
|
169
|
|
170 finish(NULL, NULL);
|
26
|
171 return 0;
|
|
172 }
|