Mercurial > hg > Members > kono > Cerium
annotate Renderer/Test/send_linda.cc @ 924:ad6903dd6419
show dma wait format
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 30 Jul 2010 16:40:30 +0900 |
parents | 61bfd8e246fc |
children |
rev | line source |
---|---|
566 | 1 #include <stdlib.h> |
2 #include <stdio.h> | |
3 #include <string.h> | |
4 #include <fcntl.h> | |
5 #include <sys/types.h> | |
6 #include <sys/mman.h> | |
7 #include <sys/stat.h> | |
8 #include <unistd.h> | |
9 #include <arpa/inet.h> | |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
10 #include <rpc/types.h> |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
11 #include <rpc/xdr.h> |
566 | 12 #include "SceneGraphRoot.h" |
13 #include "lindaapi.h" | |
14 #include "send_linda.h" | |
15 | |
16 #define HOSTNAME "localhost" | |
17 #define PORT_NUM 10000 | |
18 #define LISTEN_PORT 1 | |
19 #define MULTI_NUM 10 | |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
20 #define SEND_DATA_SIZE sizeof(float) * 6 |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
21 |
588 | 22 void |
23 send_position(SceneGraphPtr node) | |
24 { | |
25 char *data; | |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
26 if (node->seq == 0) { |
844
61bfd8e246fc
send_linda's bug fix, and replace wait_rd() to rd() on dynamic_load
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
843
diff
changeset
|
27 } else if ((data = (char *)psx_reply(node->seq)) != NULL) { |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
28 psx_free(data); |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
29 } else { |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
30 node->resend_flag = 1; |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
31 return; |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
32 } |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
33 node->resend_flag = 0; |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
34 |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
35 //float send_data[6]; // xyz[3] and angle[3] |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
36 int tapleid = node->id * 10 + 1; |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
37 int fd = *(int*)node->propertyptr; |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
38 |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
39 // XDRの準備 |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
40 XDR xdrs; |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
41 char send_data[SEND_DATA_SIZE]; |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
42 xdrmem_create(&xdrs, send_data, SEND_DATA_SIZE, XDR_ENCODE); |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
43 |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
44 for (int i = 0; i < 3; i ++) { |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
45 xdr_float(&xdrs, &node->xyz[i]); |
588 | 46 } |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
47 for (int i = 0; i < 3; i ++) { |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
48 xdr_float(&xdrs, &node->angle[i]); |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
49 } |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
50 node->seq = psx_in(fd, tapleid); |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
51 psx_out(fd, tapleid, (unsigned char *)send_data, SEND_DATA_SIZE); |
588 | 52 } |
566 | 53 |
54 void | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
55 root_move(SceneGraphPtr node, void *sgroot_, int w, int h) |
566 | 56 { |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
57 SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; |
566 | 58 Pad *pad = sgroot->getController(); |
588 | 59 int flag = 0; |
566 | 60 if (pad->right.isHold() || pad->left.isHold()) { |
586 | 61 if (pad->right.isHold()) { |
62 node->xyz[0] += 5.0f; | |
588 | 63 flag = 1; |
586 | 64 } else if (pad->left.isHold()) { |
65 node->xyz[0] -= 5.0f; | |
588 | 66 flag = 1; |
586 | 67 } |
566 | 68 } |
69 | |
70 if (pad->down.isHold() || pad->up.isHold() ) { | |
586 | 71 if (pad->down.isHold()) { |
72 node->xyz[1] += 5.0f; | |
588 | 73 flag = 1; |
586 | 74 } else if (pad->up.isHold()) { |
75 node->xyz[1] -= 5.0f; | |
588 | 76 flag = 1; |
586 | 77 } |
566 | 78 } |
79 | |
588 | 80 /* |
566 | 81 ここでキー入力を向こうに送る |
586 | 82 */ |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
83 if (flag || node->resend_flag) { |
588 | 84 send_position(node); |
85 } | |
566 | 86 } |
87 | |
88 void | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
89 root_collision(SceneGraphPtr node, void *sgroot_, int w, int h, SceneGraphPtr tree) |
566 | 90 { |
91 } | |
92 | |
93 void | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
94 move(SceneGraphPtr node, void *sgroot_, int w, int h) |
566 | 95 { |
96 } | |
97 | |
98 void | |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
99 collision(SceneGraphPtr node, void *sgroot_, int w, int h, SceneGraphPtr tree) |
566 | 100 { |
101 } | |
102 | |
103 void * | |
104 file_map(const char *filename, int *size) { | |
105 int fd; | |
106 void *addr; | |
107 struct stat sb; | |
108 | |
109 if ((fd = open(filename, O_RDONLY)) == -1) { | |
586 | 110 fprintf(stderr, "Can't open %s\n", filename); |
111 perror(NULL); | |
566 | 112 } |
113 if (fstat(fd, &sb) == -1) { | |
586 | 114 fprintf(stderr, "Can't fstat %s\n", filename); |
115 perror(NULL); | |
566 | 116 } |
117 *size = sb.st_size; | |
118 addr = mmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0); | |
119 if (addr == MAP_FAILED) { | |
586 | 120 perror("mmap error\n"); |
121 exit(EXIT_FAILURE); | |
566 | 122 } |
123 close(fd); | |
124 | |
125 return addr; | |
126 } | |
127 | |
128 | |
129 | |
130 int get_serial_id(int fd) { | |
131 char *data; | |
132 int serial; | |
133 int seq; | |
134 | |
135 seq = psx_in(fd, 65535); | |
587 | 136 do { |
137 psx_sync_n(); | |
138 data = (char *)psx_reply(seq); | |
139 } while (data == 0); | |
566 | 140 serial = atoi(data + LINDA_HEADER_SIZE); |
141 psx_free(data); | |
593
6f741ab60749
sending and moving of multi xml work (linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
592
diff
changeset
|
142 printf("serial id = %d\n", serial); |
566 | 143 return serial; |
144 } | |
145 | |
146 | |
147 void | |
148 send_xml(int tspace, int xml_id, void *addr, int size) { | |
149 psx_out(tspace, xml_id, (unsigned char *)addr, size); | |
150 psx_sync_n(); | |
151 } | |
152 | |
153 static char *xml; | |
843
0c7d885f0c92
cleanup unused variables and fix warning.
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
841
diff
changeset
|
154 static const char *linda = HOSTNAME; |
566 | 155 |
156 MainLoopPtr | |
586 | 157 send_linda::init(Viewer *sgr, int screen_w, int screen_h) |
566 | 158 { |
159 void *addr; | |
160 int size; | |
161 int tspace; | |
162 int serial; | |
163 int xml_id; | |
164 | |
587 | 165 |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
166 // ここら辺長ったるいから、関数で分けるべきか... |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
167 |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
168 // root オブジェクト作成 |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
169 SceneGraphPtr root = sgr->createSceneGraph(); |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
170 // root_moveはコントローラーの入力で動き、座標をLinda Serverにout |
566 | 171 root->set_move_collision(root_move, root_collision); |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
172 |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
173 // XMLをメモリにmapして、オブジェクト生成 |
586 | 174 addr = file_map(xml, &size); |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
175 SceneGraphPtr sgp = sgr->createSceneGraph(); |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
176 sgr->createFromXMLmemory(sgp, (char *)addr, size); |
566 | 177 sgp->set_move_collision(move, collision); |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
178 |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
179 // rootに接続 |
566 | 180 root->addChild(sgp); |
586 | 181 |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
182 // Linda Serverに接続 |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
183 tspace = open_linda_java(linda, PORT_NUM); |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
184 // rootにLindaのfdを持たせる |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
185 root->propertyptr = (void*)malloc(sizeof(int)); |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
186 int *p = (int*)root->propertyptr; |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
187 root->property_size = sizeof(int); |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
188 *p = tspace; |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
189 |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
190 // このclientのserial_idを取得 |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
191 serial = get_serial_id(tspace); |
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
192 root->id = serial; |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
193 |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
194 // ここから先の処理は、裏で何か動かせないかを考える |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
195 // とりあえず、関数に分けようか |
588 | 196 |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
197 // serial_idを十倍したところにXMLを送信 |
566 | 198 xml_id = serial * 10; |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
199 send_xml(tspace, xml_id, addr, size); // ここのpsx_sync_n()は仕方ない |
566 | 200 |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
201 // XMLの送信が終了してから、serial_idをLindaに送信する |
587 | 202 int client_id = htonl(serial); |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
203 psx_out(tspace, LISTEN_PORT, (unsigned char *)&client_id, sizeof(int)); |
592
56e63fc45105
send position work!!!(linda)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
591
diff
changeset
|
204 |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
205 // serial_idを十倍して1足したところに座標データを送る |
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
206 // 初期化のout() |
588 | 207 int pos_id = serial * 10 + 1; |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
208 char pos_data[SEND_DATA_SIZE] = {0}; |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
209 |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
210 // init seq |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
211 // send_position()でinの終了を確認する分岐が最初にあるため |
610
529188ae604d
change htonl to xdr_float (checked working on mac)
kazz@kazzone.st.ie.u-ryukyu.ac.jp
parents:
601
diff
changeset
|
212 psx_out(tspace, pos_id, (unsigned char *)pos_data, SEND_DATA_SIZE); |
841
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
213 root->seq = 0; |
2432c7fe291c
dynamic loading demo bug fix
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
214 root->resend_flag = 0; |
671
f42b303044f7
fix several Renderer/Test with (void*)sgroot.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
655
diff
changeset
|
215 sgr->setSceneData(root); |
588 | 216 |
586 | 217 return sgr; |
566 | 218 } |
219 | |
220 extern Application * | |
221 application() { | |
222 return new send_linda(); | |
223 } | |
224 | |
225 | |
226 const char *usr_help_str = "Usage: ./test_nogl [OPTION]\n"; | |
227 | |
228 extern int init(TaskManager *manager, int argc, char *argv[]); | |
229 extern void task_initialize(); | |
230 static void TMend(TaskManager *manager); | |
231 | |
232 int | |
233 TMmain(TaskManager *manager, int argc, char *argv[]) | |
234 { | |
235 task_initialize(); | |
236 manager->set_TMend(TMend); | |
237 | |
238 for(int i=0;i<argc;i++) { | |
588 | 239 if (strcmp(argv[i],"-xml") == 0 && i+1<=argc) { |
240 xml = argv[i+1]; | |
241 } else if (strcmp(argv[i],"-linda") == 0 && i+1<=argc) { | |
242 linda = argv[i+1]; | |
243 } | |
566 | 244 } |
245 | |
577 | 246 if (xml==0) { |
247 printf("-xml xml-file is required\n"); | |
248 exit(0); | |
249 } | |
250 | |
566 | 251 return init(manager, argc, argv); |
252 | |
253 } | |
254 | |
255 void | |
256 TMend(TaskManager *manager) | |
257 { | |
258 printf("test_nogl end\n"); | |
259 } | |
260 | |
261 /* end */ | |
262 |