1 /* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29 #include "mm_qcamera_socket.h"
30 #include "mm_qcamera_commands.h"
31 #include "mm_qcamera_dbg.h"
32
33 #define IP_ADDR "127.0.0.1"
34 #define TUNING_CHROMATIX_PORT 55555
35 #define TUNING_PREVIEW_PORT 55556
36
37 #define CURRENT_COMMAND_ACK_SUCCESS 1
38 #define CURRENT_COMMAND_ACK_FAILURE 2
39
40 pthread_t eztune_thread_id;
41
tuneserver_send_command_rsp(tuningserver_t * tsctrl,char * send_buf,uint32_t send_len)42 static int tuneserver_send_command_rsp(tuningserver_t *tsctrl,
43 char *send_buf, uint32_t send_len)
44 {
45 int rc;
46
47 /* send ack back to client upon req */
48 if (send_len <= 0) {
49 ALOGE("%s:Invalid send len \n", __func__);
50 return -1;
51 }
52 if (send_buf == NULL) {
53 ALOGE("%s:Invalid send buf \n", __func__);
54 return -1;
55 }
56
57 rc = send(tsctrl->clientsocket_id, send_buf, send_len, 0);
58 if (rc < 0) {
59 ALOGE("%s:RSP send returns error %s\n", __func__, strerror(errno));
60 } else {
61 rc = 0;
62 }
63
64 if (send_buf != NULL) {
65 free(send_buf);
66 send_buf = NULL;
67 }
68 return rc;
69 }
70
release_eztune_prevcmd_rsp(eztune_prevcmd_rsp * pHead)71 static void release_eztune_prevcmd_rsp(eztune_prevcmd_rsp *pHead)
72 {
73 if (pHead != NULL ) {
74 release_eztune_prevcmd_rsp((eztune_prevcmd_rsp *)pHead->next);
75 free(pHead);
76 }
77 }
78
tuneserver_ack(uint16_t a,uint32_t b,tuningserver_t * tsctrl)79 static int tuneserver_ack(uint16_t a, uint32_t b, tuningserver_t *tsctrl)
80 {
81 int rc;
82 char ack_1[6];
83 /*Ack the command here*/
84 memcpy(ack_1, &a, 2);
85 memcpy(ack_1+2, &b, 4);
86 /* send echo back to client upon accept */
87 rc = send(tsctrl->clientsocket_id, &ack_1, sizeof(ack_1), 0);
88 if (rc < 0) {
89 ALOGE("%s: eztune_server_run: send returns error %s\n", __func__,
90 strerror(errno));
91 return rc;
92 } else if (rc < (int32_t)sizeof(ack_1)) {
93 /*Shouldn't hit this for packets <1K; need to re-send if we do*/
94 }
95 return 0;
96 }
97
tuneserver_send_command_ack(uint8_t ack,tuningserver_t * tsctrl)98 static int tuneserver_send_command_ack( uint8_t ack, tuningserver_t *tsctrl)
99 {
100 int rc;
101 /* send ack back to client upon req */
102 rc = send(tsctrl->clientsocket_id, &ack, sizeof(ack), 0);
103 if (rc < 0) {
104 ALOGE("%s:ACK send returns error %s\n", __func__, strerror(errno));
105 return rc;
106 }
107 return 0;
108 }
109
110 /** tuneserver_process_command
111 * @tsctrl: the server control object
112 *
113 * Processes the command that the client sent
114 *
115 * Return: >=0 on success, -1 on failure.
116 **/
tuneserver_process_command(tuningserver_t * tsctrl,char * send_buf,uint32_t send_len)117 static int32_t tuneserver_process_command(tuningserver_t *tsctrl,
118 char *send_buf, uint32_t send_len)
119 {
120 tuneserver_protocol_t *p = tsctrl->proto;
121 int result = 0;
122
123 CDBG("%s: Current command is %d\n", __func__, p->current_cmd);
124 switch (p->current_cmd) {
125 case TUNESERVER_GET_LIST:
126 if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
127 ALOGE("%s: Ack Failed for cmd %d\n", __func__, p->current_cmd);
128 return -1;
129 }
130 result = tuneserver_process_get_list_cmd(tsctrl, p->recv_buf,
131 send_buf, send_len);
132 if (result < 0) {
133 ALOGE("%s: RSP processing Failed for cmd %d\n", __func__, p->current_cmd);
134 return -1;
135 }
136 if(tuneserver_send_command_rsp(tsctrl, send_buf, send_len)) {
137 ALOGE("%s: RSP Failed for cmd %d\n", __func__, p->current_cmd);
138 return -1;
139 }
140 break;
141
142 case TUNESERVER_GET_PARMS:
143 if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
144 ALOGE("%s: Ack Failed for cmd %d\n", __func__, p->current_cmd);
145 return -1;
146 }
147 result = tuneserver_process_get_params_cmd(tsctrl, p->recv_buf,
148 send_buf, send_len);
149 if (result < 0) {
150 ALOGE("%s: RSP processing Failed for cmd %d\n", __func__, p->current_cmd);
151 return -1;
152 }
153 if(tuneserver_send_command_rsp(tsctrl, send_buf, send_len)) {
154 ALOGE("%s: RSP Failed for cmd %d\n", __func__, p->current_cmd);
155 return -1;
156 }
157 break;
158
159 case TUNESERVER_SET_PARMS:
160 if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
161 ALOGE("%s: Ack Failed for cmd %d\n", __func__, p->current_cmd);
162 return -1;
163 }
164 result = tuneserver_process_set_params_cmd(tsctrl, p->recv_buf,
165 send_buf, send_len);
166 if (result < 0) {
167 ALOGE("%s: RSP processing Failed for cmd %d\n", __func__, p->current_cmd);
168 return -1;
169 }
170 if(tuneserver_send_command_rsp(tsctrl, send_buf, send_len)) {
171 ALOGE("%s: RSP Failed for cmd %d\n", __func__, p->current_cmd);
172 return -1;
173 }
174 break;
175
176 case TUNESERVER_MISC_CMDS: {
177 if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
178 ALOGE("%s: Ack Failed for cmd %d\n", __func__, p->current_cmd);
179 return -1;
180 }
181 result = tuneserver_process_misc_cmd(tsctrl, p->recv_buf,
182 send_buf, send_len);
183 if (result < 0) {
184 ALOGE("%s: RSP processing Failed for cmd %d\n", __func__, p->current_cmd);
185 return -1;
186 }
187 if(tuneserver_send_command_rsp(tsctrl, send_buf, send_len)) {
188 ALOGE("%s: RSP Failed for cmd %d\n", __func__, p->current_cmd);
189 return -1;
190 }
191 break;
192 }
193
194 default:
195 if(tuneserver_send_command_ack(CURRENT_COMMAND_ACK_SUCCESS, tsctrl)) {
196 ALOGE("%s: Ack Failed for cmd %d\n", __func__, p->current_cmd);
197 return -1;
198 }
199 ALOGE("%s: p->current_cmd: default\n", __func__);
200 result = -1;
201 break;
202 }
203
204 return result;
205 }
206
207 /** tuneserver_process_client_message
208 * @recv_buffer: received message from the client
209 * @tsctrl: the server control object
210 *
211 * Processes the message from client and prepares for next
212 * message.
213 *
214 * Return: >=0 on success, -1 on failure.
215 **/
tuneserver_process_client_message(void * recv_buffer,tuningserver_t * tsctrl)216 static int32_t tuneserver_process_client_message(void *recv_buffer,
217 tuningserver_t *tsctrl)
218 {
219 int rc = 0;
220 tuneserver_protocol_t *p = tsctrl->proto;
221
222 switch (tsctrl->proto->next_recv_code) {
223 case TUNESERVER_RECV_COMMAND:
224 p->current_cmd = *(uint16_t *)recv_buffer;
225 p->next_recv_code = TUNESERVER_RECV_PAYLOAD_SIZE;
226 p->next_recv_len = sizeof(uint32_t);
227 break;
228
229 case TUNESERVER_RECV_PAYLOAD_SIZE:
230 p->next_recv_code = TUNESERVER_RECV_PAYLOAD;
231 p->next_recv_len = *(uint32_t *)recv_buffer;
232 p->recv_len = p->next_recv_len;
233 if (p->next_recv_len > TUNESERVER_MAX_RECV)
234 return -1;
235 if (p->next_recv_len == 0) {
236 p->next_recv_code = TUNESERVER_RECV_RESPONSE;
237 p->next_recv_len = sizeof(uint32_t);
238 }
239 break;
240
241 case TUNESERVER_RECV_PAYLOAD:
242 p->recv_buf = malloc(p->next_recv_len);
243 if (!p->recv_buf) {
244 ALOGE("%s:Error allocating memory for recv_buf %s\n", __func__,
245 strerror(errno));
246 return -1;
247 }
248 memcpy(p->recv_buf, recv_buffer, p->next_recv_len);
249 p->next_recv_code = TUNESERVER_RECV_RESPONSE;
250 p->next_recv_len = sizeof(uint32_t);
251 /*Process current command at this point*/
252 break;
253
254 case TUNESERVER_RECV_RESPONSE:
255 p->next_recv_code = TUNESERVER_RECV_COMMAND;
256 p->next_recv_len = 2;
257 p->send_len = *(uint32_t *)recv_buffer;
258 p->send_buf = (char *)calloc(p->send_len, sizeof(char *));
259 if (!p->send_buf) {
260 ALOGE("%s:Error allocating memory for send_buf %s\n", __func__,
261 strerror(errno));
262 return -1;
263 }
264 rc = tuneserver_process_command(tsctrl, p->send_buf, p->send_len);
265 free(p->recv_buf);
266 p->recv_buf = NULL;
267 p->recv_len = 0;
268 break;
269
270 default:
271 ALOGE("%s: p->next_recv_code: default\n", __func__);
272 rc = -1;
273 break;
274 }
275
276 return rc;
277 }
278
279 /** tuneserver_ack_onaccept_initprotocol
280 * @tsctrl: the server control object
281 *
282 * Acks a connection from the cient and sets up the
283 * protocol object to start receiving commands.
284 *
285 * Return: >=0 on success, -1 on failure.
286 **/
tuneserver_ack_onaccept_initprotocol(tuningserver_t * tsctrl)287 static int32_t tuneserver_ack_onaccept_initprotocol(tuningserver_t *tsctrl)
288 {
289 int32_t rc = 0;
290 uint32_t ack_status;
291
292 ALOGE("%s starts\n", __func__);
293 /*
294 if(tsctrl->camera_running) {
295 ack_status = 1;
296 } else {
297 ack_status = 2;
298 }
299 */
300 ack_status = 1;
301
302 rc = tuneserver_ack(1, ack_status, tsctrl);
303
304 tsctrl->proto = malloc(sizeof(tuneserver_protocol_t));
305 if (!tsctrl->proto) {
306 ALOGE("%s: malloc returns NULL with error %s\n", __func__, strerror(errno));
307 return -1;
308 }
309
310 tsctrl->proto->current_cmd = 0xFFFF;
311 tsctrl->proto->next_recv_code = TUNESERVER_RECV_COMMAND;
312 tsctrl->proto->next_recv_len = 2;
313 tsctrl->proto->recv_buf = NULL;
314 tsctrl->proto->send_buf = NULL;
315
316 CDBG("%s end\n", __func__);
317
318 return rc;
319 }
320
321 /** tuneserver_check_status
322 * @tsctrl: the server control object
323 *
324 * Checks if camera is running and stops it.
325 *
326 * Return: >=0 on success, -1 on failure.
327 **/
328 #if 0
329 static void tuneserver_check_status(tuningserver_t *tsctrl)
330 {
331 if (tsctrl->camera_running == 1) {
332 /*TODO: Stop camera here*/
333 tuneserver_stop_cam(&tsctrl->lib_handle);
334 }
335 tsctrl->camera_running = 0;
336
337 tuneserver_close_cam(&tsctrl->lib_handle);
338 }
339 #endif
340
prevserver_send_command_rsp(tuningserver_t * tsctrl,char * send_buf,uint32_t send_len)341 static int prevserver_send_command_rsp(tuningserver_t *tsctrl,
342 char *send_buf, uint32_t send_len)
343 {
344 int rc;
345
346 /* send ack back to client upon req */
347 if (send_len <= 0) {
348 ALOGE("%s:Invalid send len \n", __func__);
349 return -1;
350 }
351 if (send_buf == NULL) {
352 ALOGE("%s:Invalid send buf \n", __func__);
353 return -1;
354 }
355
356 rc = send(tsctrl->pr_clientsocket_id, send_buf, send_len, 0);
357 if (rc < 0) {
358 ALOGE("%s:RSP send returns error %s\n", __func__, strerror(errno));
359 } else {
360 rc = 0;
361 }
362 if (send_buf != NULL) {
363 free(send_buf);
364 send_buf = NULL;
365 }
366 return rc;
367 }
368
prevserver_init_protocol(tuningserver_t * tsctrl)369 static void prevserver_init_protocol(tuningserver_t *tsctrl)
370 {
371 tsctrl->pr_proto = malloc(sizeof(prserver_protocol_t));
372 if (!tsctrl->pr_proto) {
373 ALOGE("%s: malloc returns NULL with error %s\n",
374 __func__, strerror(errno));
375 return;
376 }
377
378 tsctrl->pr_proto->current_cmd = 0xFFFF;
379 tsctrl->pr_proto->next_recv_code = TUNE_PREV_RECV_COMMAND;
380 tsctrl->pr_proto->next_recv_len = 2;
381 }
382
prevserver_process_command(tuningserver_t * tsctrl,char ** send_buf,uint32_t * send_len)383 static int32_t prevserver_process_command(
384 tuningserver_t *tsctrl, char **send_buf, uint32_t *send_len)
385 {
386 prserver_protocol_t *p = tsctrl->pr_proto;
387 int result = 0;
388 eztune_prevcmd_rsp *rsp_ptr=NULL, *rspn_ptr=NULL, *head_ptr=NULL;
389
390 CDBG("%s: Current command is %d\n", __func__, p->current_cmd);
391 switch (p->current_cmd) {
392 case TUNE_PREV_GET_INFO:
393 result = tuneserver_preview_getinfo(tsctrl, send_buf, send_len);
394 if (result < 0) {
395 ALOGE("%s: RSP processing Failed for cmd %d\n", __func__,
396 p->current_cmd);
397 return -1;
398 }
399 rsp_ptr = (eztune_prevcmd_rsp *)*send_buf;
400 if ((!rsp_ptr) || (!rsp_ptr->send_buf)) {
401 ALOGE("%s: RSP ptr is NULL %d\n", __func__, p->current_cmd);
402 return -1;
403 }
404 if (prevserver_send_command_rsp(tsctrl,
405 rsp_ptr->send_buf, rsp_ptr->send_len)) {
406 ALOGE("%s: RSP Failed for TUNE_PREV_GET_INFO ver cmd %d\n", __func__,
407 p->current_cmd);
408 return -1;
409 }
410 rspn_ptr = (eztune_prevcmd_rsp *)rsp_ptr->next;
411 if ((!rspn_ptr) || (!rspn_ptr->send_buf)) {
412 ALOGE("%s: RSP1 ptr is NULL %d\n", __func__, p->current_cmd);
413 return -1;
414 }
415 if (prevserver_send_command_rsp(tsctrl,
416 rspn_ptr->send_buf, rspn_ptr->send_len)) {
417 ALOGE("%s: RSP Failed for TUNE_PREV_GET_INFO caps cmd %d\n", __func__,
418 p->current_cmd);
419 return -1;
420 }
421 free(rspn_ptr);
422 free(rsp_ptr);
423 break;
424
425 case TUNE_PREV_CH_CNK_SIZE:
426 result = tuneserver_preview_getchunksize(tsctrl, send_buf, send_len);
427 if (result < 0) {
428 ALOGE("%s: RSP processing Failed for cmd %d\n", __func__, p->current_cmd);
429 return -1;
430 }
431 if (prevserver_send_command_rsp(tsctrl, *send_buf, *send_len)) {
432 ALOGE("%s: RSP Failed for TUNE_PREV_CH_CNK_SIZE cmd %d\n", __func__,
433 p->current_cmd);
434 return -1;
435 }
436 break;
437
438 case TUNE_PREV_GET_PREV_FRAME:
439 result = tuneserver_preview_getframe(tsctrl, send_buf, send_len);
440 if (result < 0) {
441 ALOGE("%s: RSP processing Failed for cmd %d\n", __func__, p->current_cmd);
442 return -1;
443 }
444 rsp_ptr = (eztune_prevcmd_rsp *)*send_buf;
445 if ((!rsp_ptr) || (!rsp_ptr->send_buf)) {
446 ALOGE("%s: RSP ptr is NULL %d\n", __func__, p->current_cmd);
447 return -1;
448 }
449 head_ptr = rsp_ptr;
450
451 while (rsp_ptr != NULL) {
452 if ((!rsp_ptr) || (!rsp_ptr->send_buf)) {
453 ALOGE("%s: RSP ptr is NULL %d\n", __func__, p->current_cmd);
454 return -1;
455 }
456 if (prevserver_send_command_rsp(tsctrl,
457 rsp_ptr->send_buf, rsp_ptr->send_len)) {
458 ALOGE("%s: RSP Failed for TUNE_PREV_GET_INFO ver cmd %d\n", __func__,
459 p->current_cmd);
460 return -1;
461 }
462 rsp_ptr = (eztune_prevcmd_rsp *)rsp_ptr->next;
463 }
464 release_eztune_prevcmd_rsp(head_ptr);
465 break;
466
467 case TUNE_PREV_GET_JPG_SNAP:
468 case TUNE_PREV_GET_RAW_SNAP:
469 case TUNE_PREV_GET_RAW_PREV:
470 result = tuneserver_preview_unsupported(tsctrl, send_buf, send_len);
471 if (result < 0) {
472 ALOGE("%s:RSP processing Failed for cmd %d\n", __func__, p->current_cmd);
473 return -1;
474 }
475 if (prevserver_send_command_rsp(tsctrl, *send_buf, *send_len)) {
476 ALOGE("%s:RSP Failed for UNSUPPORTED cmd %d\n", __func__, p->current_cmd);
477 return -1;
478 }
479 break;
480
481 default:
482 ALOGE("%s: p->current_cmd: default\n", __func__);
483 result = -1;
484 break;
485 }
486
487 return result;
488 }
489
490 /** previewserver_process_client_message
491 * @recv_buffer: received message from the client
492 * @tsctrl: the server control object
493 *
494 * Processes the message from client and prepares for next
495 * message.
496 *
497 * Return: >=0 on success, -1 on failure.
498 **/
prevserver_process_client_message(void * recv_buffer,tuningserver_t * tsctrl)499 static int32_t prevserver_process_client_message(void *recv_buffer,
500 tuningserver_t *tsctrl)
501 {
502 int rc = 0;
503 prserver_protocol_t *p = tsctrl->pr_proto;
504
505 switch (p->next_recv_code) {
506 case TUNE_PREV_RECV_COMMAND:
507 CDBG("%s %d\n", __func__, __LINE__);
508 p->current_cmd = *(uint16_t *)recv_buffer;
509 if(p->current_cmd != TUNE_PREV_CH_CNK_SIZE) {
510 rc = prevserver_process_command(tsctrl,
511 &p->send_buf, (uint32_t *)&p->send_len);
512 break;
513 }
514 p->next_recv_code = TUNE_PREV_RECV_NEWCNKSIZE;
515 p->next_recv_len = sizeof(uint32_t);
516 CDBG("%s TUNE_PREV_COMMAND X\n", __func__);
517 break;
518 case TUNE_PREV_RECV_NEWCNKSIZE:
519 CDBG("%s %d\n", __func__, __LINE__);
520 p->new_cnk_size = *(uint32_t *)recv_buffer;
521 p->next_recv_code = TUNE_PREV_RECV_COMMAND;
522 p->next_recv_len = 2;
523 rc = prevserver_process_command(tsctrl,
524 &p->send_buf, (uint32_t *)&p->send_len);
525 break;
526 default:
527 ALOGE("%s prev_proc->next_recv_code: default\n", __func__);
528 rc = -1;
529 break;
530 }
531
532 return rc;
533 }
534
535 /** tunning_server_socket_listen
536 * @ip_addr: the ip addr to listen
537 * @port: the port to listen
538 *
539 * Setup a listen socket for eztune.
540 *
541 * Return: >0 on success, <=0 on failure.
542 **/
tunning_server_socket_listen(const char * ip_addr,uint16_t port)543 int tunning_server_socket_listen(const char* ip_addr, uint16_t port)
544 {
545 int sock_fd = -1;
546 struct sockaddr_in server_addr;
547 int result;
548 int option;
549 int socket_flag;
550
551 memset(&server_addr, 0, sizeof(server_addr));
552 server_addr.sin_family = AF_INET;
553 server_addr.sin_port= htons(port);
554 server_addr.sin_addr.s_addr = inet_addr(ip_addr);
555
556 if (server_addr.sin_addr.s_addr == INADDR_NONE) {
557 ALOGE("[ERR] %s invalid address.\n", __func__);
558 return -1;
559 }
560
561 /* Create an AF_INET stream socket to receive incoming connection ON */
562 sock_fd = socket(AF_INET, SOCK_STREAM, 0);
563 if (sock_fd < 0) {
564 ALOGE("[ERR] %s socket failed\n", __func__);
565 return sock_fd;
566 }
567
568 // set listen socket to non-block, but why??
569 socket_flag = fcntl(sock_fd, F_GETFL, 0);
570 fcntl(sock_fd, F_SETFL, socket_flag | O_NONBLOCK);
571
572 /* reuse in case it is in timeout */
573 option = 1;
574 result = setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR,
575 &option, sizeof(option));
576
577 if (result < 0) {
578 ALOGE("eztune setsockopt failed");
579 close(sock_fd);
580 sock_fd = -1;
581 return sock_fd;
582 }
583
584 result = bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
585 if (result < 0) {
586 ALOGE("eztune socket bind failed");
587 close(sock_fd);
588 sock_fd = -1;
589 return sock_fd;
590 }
591
592 result = listen(sock_fd, 1);
593 if (result < 0) {
594 ALOGE("eztune socket listen failed");
595 close(sock_fd);
596 sock_fd = -1;
597 return sock_fd;
598 }
599
600 CDBG_HIGH("%s. sock_fd: %d, listen at port: %d\n", __func__, sock_fd, port);
601
602 return sock_fd;
603 }
604
605 /** main
606 *
607 * Creates the server, and starts waiting for
608 * connections/messages from a prospective
609 * client
610 *
611 **/
eztune_proc(void * data)612 void *eztune_proc(void *data)
613 {
614 int server_socket = -1, client_socket = -1;
615 int prev_server_socket = -1, prev_client_socket = -1;
616
617 struct sockaddr_in addr_client_inet;
618 socklen_t addr_client_len = sizeof(struct sockaddr_in);
619 int result;
620 fd_set tsfds;
621 int num_fds = 0;
622 int recv_bytes;
623 char buf[TUNESERVER_MAX_RECV];
624
625 mm_camera_lib_handle *lib_handle = (mm_camera_lib_handle *)data;
626
627 ALOGE(">>> Starting tune server <<< \n");
628
629 // for eztune chromatix params
630 server_socket = tunning_server_socket_listen(IP_ADDR, TUNING_CHROMATIX_PORT);
631 if (server_socket <= 0) {
632 ALOGE("[ERR] fail to setup listen socket for eztune chromatix parms...");
633 return NULL;
634 }
635 prev_server_socket = tunning_server_socket_listen(IP_ADDR, TUNING_PREVIEW_PORT);
636 if (prev_server_socket <= 0) {
637 ALOGE("[ERR] fail to setup listen socket for eztune preview...\n");
638 return NULL;
639 }
640 num_fds = TUNESERVER_MAX(server_socket, prev_server_socket);
641 CDBG_HIGH("num_fds = %d\n", num_fds);
642
643 do {
644 FD_ZERO(&tsfds);
645 FD_SET(server_socket, &tsfds);
646 FD_SET(prev_server_socket, &tsfds);
647 if (client_socket > 0) {
648 FD_SET(client_socket, &tsfds);
649 }
650 if (prev_client_socket > 0) {
651 FD_SET( prev_client_socket, &tsfds);
652 }
653
654 /* no timeout */
655 result = select(num_fds + 1, &tsfds, NULL, NULL, NULL);
656 if (result < 0) {
657 ALOGE("[ERR] select failed: %s\n", strerror(errno));
658 continue;
659 }
660
661 /*
662 ** (1) CHROMATIX SERVER
663 */
664 if (FD_ISSET(server_socket, &tsfds)) {
665 CDBG("Receiving New client connection\n");
666
667 client_socket = accept(server_socket,
668 (struct sockaddr *)&addr_client_inet, &addr_client_len);
669 if (client_socket == -1) {
670 ALOGE("accept failed %s", strerror(errno));
671 continue;
672 }
673
674 ALOGE("accept a new connect on 55555, sd(%d)\n", client_socket);
675 num_fds = TUNESERVER_MAX(num_fds, client_socket);
676
677 // open camera and get handle - this is needed to
678 // be able to set parameters without starting
679 // preview stream
680 /*if (!tsctrl.camera_running) {
681 result = tuneserver_open_cam(&tsctrl.lib_handle, &tsctrl);
682 if(result) {
683 printf("\n Camera Open Fail !!! \n");
684 close(server_socket);
685 return EXIT_FAILURE;
686 }
687 }*/
688 result = tuneserver_open_cam(lib_handle);
689 if(result) {
690 ALOGE("\n Tuning Library open failed!!!\n");
691 close(server_socket);
692 return NULL;
693 }
694 lib_handle->tsctrl.clientsocket_id = client_socket;
695 if (tuneserver_ack_onaccept_initprotocol(&lib_handle->tsctrl) < 0) {
696 ALOGE("%s: Error while acking\n", __func__);
697 close(client_socket);
698 continue;
699 }
700 tuneserver_initialize_tuningp(lib_handle, client_socket,
701 lib_handle->tsctrl.proto->send_buf, lib_handle->tsctrl.proto->send_len);
702 }
703
704 if (FD_ISSET(client_socket, &tsfds)) {
705 if (lib_handle->tsctrl.proto == NULL) {
706 ALOGE("%s: Cannot receive msg without connect\n", __func__);
707 continue;
708 }
709
710 /*Receive message and process it*/
711 recv_bytes = recv(client_socket, (void *)buf,
712 lib_handle->tsctrl.proto->next_recv_len, 0);
713 CDBG("Receive %d bytes \n", recv_bytes);
714
715 if (recv_bytes == -1) {
716 ALOGE("%s: Receive failed with error %s\n", __func__, strerror(errno));
717 //tuneserver_check_status(&tsctrl);
718 continue;
719 } else if (recv_bytes == 0) {
720 ALOGE("%s %d: connection has been terminated\n", __func__, __LINE__);
721
722 tuneserver_deinitialize_tuningp(&lib_handle->tsctrl, client_socket,
723 lib_handle->tsctrl.proto->send_buf,
724 lib_handle->tsctrl.proto->send_len);
725 free(lib_handle->tsctrl.proto);
726 lib_handle->tsctrl.proto = NULL;
727
728 close(client_socket);
729 client_socket = -1;
730 //tuneserver_check_status(&tsctrl);
731 } else {
732 CDBG("%s: Processing socket command\n", __func__);
733
734 result = tuneserver_process_client_message(buf, &lib_handle->tsctrl);
735
736 if (result < 0) {
737 ALOGE("%s %d Protocol violated\n", __func__, __LINE__);
738
739 free(lib_handle->tsctrl.proto);
740 lib_handle->tsctrl.proto = NULL;
741
742 close(client_socket);
743 client_socket = -1;
744 //tuneserver_check_status(&tsctrl);
745 continue;
746 }
747 }
748 }
749
750 /*
751 ** (2) PREVIEW SERVER
752 */
753 if (FD_ISSET(prev_server_socket, &tsfds)) {
754 CDBG("Receiving New Preview client connection\n");
755
756 prev_client_socket = accept(prev_server_socket,
757 (struct sockaddr *)&addr_client_inet, &addr_client_len);
758 if (prev_client_socket == -1) {
759 ALOGE("accept failed %s", strerror(errno));
760 continue;
761 }
762
763 lib_handle->tsctrl.pr_clientsocket_id = prev_client_socket;
764
765 CDBG("Accepted a new connection, fd(%d)\n", prev_client_socket);
766 num_fds = TUNESERVER_MAX(num_fds, prev_client_socket);
767
768 // start camera
769 /*if (!tsctrl.camera_running) {
770 result = 0;
771 result = tuneserver_open_cam(&tsctrl.lib_handle, &tsctrl);
772 if(result) {
773 printf("\n Camera Open Fail !!! \n");
774 return EXIT_FAILURE;
775 }
776 }*/
777 cam_dimension_t dim;
778 //dim.width = lib_handle->test_obj.buffer_width;
779 //dim.height = lib_handle->test_obj.buffer_height;
780 dim.width = DEFAULT_PREVIEW_WIDTH;
781 dim.height = DEFAULT_PREVIEW_HEIGHT;
782
783 CDBG("preview dimension info: w(%d), h(%d)\n", dim.width, dim.height);
784 // we have to make sure that camera is running, before init connection,
785 // because we need to know the frame size for allocating the memory.
786 prevserver_init_protocol(&lib_handle->tsctrl);
787
788 result = tuneserver_initialize_prevtuningp(lib_handle, prev_client_socket,
789 dim, (char **)&lib_handle->tsctrl.proto->send_buf,
790 &lib_handle->tsctrl.proto->send_len);
791 if (result < 0) {
792 ALOGE("tuneserver_initialize_prevtuningp error!");
793 close(prev_client_socket);
794 prev_client_socket = -1;
795 }
796 }
797
798 if (FD_ISSET(prev_client_socket, &tsfds)) {
799 recv_bytes = recv(prev_client_socket, (void *)buf,
800 lib_handle->tsctrl.pr_proto->next_recv_len, 0);
801
802 CDBG("%s prev_client_socket=%d\n", __func__, prev_client_socket);
803 CDBG("%s next_recv_len=%d\n", __func__, *(uint16_t *)buf);
804
805 if (recv_bytes <= 0) {
806 if (recv_bytes == 0) {
807 ALOGE("client close the connection.\n");
808 } else {
809 ALOGE("receive error: %s\n", strerror(errno));
810 }
811
812 //tuneserver_check_status(&tsctrl);
813 // if recv error, we should close the connection, free the proto data,
814 // AND wait for a new connecton..
815 // close_connection();
816 // stop_camera()
817 // cleanup_proto_data();
818 tuneserver_deinitialize_prevtuningp(&lib_handle->tsctrl,
819 (char **)&lib_handle->tsctrl.proto->send_buf,
820 &lib_handle->tsctrl.proto->send_len);
821 close(prev_client_socket);
822 prev_client_socket = -1;
823 } else {
824 result = prevserver_process_client_message((void *)buf,
825 &lib_handle->tsctrl);
826 if (result < 0) {
827 ALOGE("%s %d Protocol violated\n", __func__, __LINE__);
828
829 //free(tsctrl->preivew_proto);
830 //free(tsctrl);
831 //max_fd = ezt_parms_listen_sd + 1;
832 tuneserver_deinitialize_prevtuningp(&lib_handle->tsctrl,
833 (char **)&lib_handle->tsctrl.proto->send_buf,
834 &lib_handle->tsctrl.proto->send_len);
835 close(prev_client_socket);
836 prev_client_socket = -1;
837 //tuneserver_check_status(&tsctrl);
838 }
839 //sleep(1);
840 }
841 }
842 } while (1);
843
844 if (server_socket >= 0) {
845 close(server_socket);
846 }
847 if (client_socket >= 0) {
848 close(client_socket);
849 }
850 if (prev_server_socket >= 0) {
851 close(prev_server_socket);
852 }
853 if (prev_client_socket >= 0) {
854 close(prev_client_socket);
855 }
856
857 return EXIT_SUCCESS;
858 }
859
eztune_server_start(void * lib_handle)860 int eztune_server_start (void *lib_handle)
861 {
862 return pthread_create(&eztune_thread_id, NULL, eztune_proc, lib_handle);
863 }
864
865