void isisbeamDriver::pollerThread()
{
    static const char* functionName = "isisbeamPoller";
	static char buffer[LEN_BUFFER+1];
	SOCKET sd = setup_udp_socket(ND_BROADCAST_PORT1, 0);
	int n,v;
	char* tmp;
	struct tm* pstm;
	time_t timer;
	double beamts1, beamts2, beamepb1, mtempts1, htempts1, beamsynch, freqsynch, totalts1, freqts2, totalts2, demethanets2, methanets2, hydrogents2, dmodrunts2, dmodrunlimts2, beamdmodts2, muonkick, dmodannlowts2;
	char *onts1, *offts1, *onts2, *offts2, *e1, *e2, *e3, *e4, *e5, *e6, *e7, *e8, *e9, *w1, *w2, *w3, *w4, *w5, *w6, *w7, *w8, *w9, *n1, *n2, *n3, *n4, *n5, *n6, *n7, *n8, *n9, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9, *em1, *em2, *em3, *em4, *em5, *em6, *em7, *em8, *em9, *wm1, *wm2, *wm3, *wm4, *wm5, *wm6, *wm7, *wm8, *wm9;
	static char time_buffer[128];
	int  c1, c2, c3, c4, c5, c6, c7, c8, c9;

	while(true)
	{
		n = receive_data_udp(sd, buffer, LEN_BUFFER);
		if (n > 0)
		{
			buffer[n] = '\0';
			buffer[LEN_BUFFER] = '\0';
			tmp = xml_parse(buffer, "ISISBEAM");
			if (tmp == NULL)
			{
				tmp = xml_parse(buffer, "ISISBEAM2");
				if (tmp == NULL)
				{
					continue; // ignore anything other than ISISBEAM and ISISBEAM2 packets for moment
				}
				free(tmp);
				tmp = xml_parse(buffer, "TIME");
				if (tmp == NULL)
				{	
					continue;
				}
				timer = atol(tmp);
				pstm = localtime(&timer);
				free(tmp);
				strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%dT%H:%M:%S+0100", pstm);
				tmp = xml_parse(buffer, "DMOD_RUNTIME"); dmodrunts2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "DMOD_RUNTIME_LIM"); dmodrunlimts2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "DMOD_UABEAM"); beamdmodts2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "DMOD_ANNLOW1"); dmodannlowts2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "VATE");
				sscanf(tmp, "%lu %lu %lu %lu %lu %lu %lu %lu %lu", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9);
				e1 = ts2_vat_status(c1);
				e2 = ts2_vat_status(c2);
				e3 = ts2_vat_status(c3);
				e4 = ts2_vat_status(c4);
				e5 = ts2_vat_status(c5);
				e6 = ts2_vat_status(c6);
				e7 = ts2_vat_status(c7);
				e8 = ts2_vat_status(c8);
				e9 = ts2_vat_status(c9);
				free(tmp);
				tmp = xml_parse(buffer, "VATW");
				sscanf(tmp, "%lu %lu %lu %lu %lu %lu %lu %lu %lu", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9);
				w1 = ts2_vat_status(c1);
				w2 = ts2_vat_status(c2);
				w3 = ts2_vat_status(c3);
				w4 = ts2_vat_status(c4);
				w5 = ts2_vat_status(c5);
				w6 = ts2_vat_status(c6);
				w7 = ts2_vat_status(c7);
				w8 = ts2_vat_status(c8);
				w9 = ts2_vat_status(c9);
				free(tmp);
				lock();
				setDoubleParam(P_DmodRunTS2, dmodrunts2);
				setDoubleParam(P_DmodRunLimTS2, dmodrunlimts2);
				setDoubleParam(P_BeamDmodTS2, beamdmodts2);
				setDoubleParam(P_DmodAnnLowTS2, dmodannlowts2);
				setStringParam(m_blparams["VAT_E1"], e1);
				setStringParam(m_blparams["VAT_E2"], e2);
				setStringParam(m_blparams["VAT_E3"], e3);
				setStringParam(m_blparams["VAT_E4"], e4);
				setStringParam(m_blparams["VAT_E5"], e5);
				setStringParam(m_blparams["VAT_E6"], e6);
				setStringParam(m_blparams["VAT_E7"], e7);
				setStringParam(m_blparams["VAT_E8"], e8);
				setStringParam(m_blparams["VAT_E9"], e9);
				setStringParam(m_blparams["VAT_W1"], w1);
				setStringParam(m_blparams["VAT_W2"], w2);
				setStringParam(m_blparams["VAT_W3"], w3);
				setStringParam(m_blparams["VAT_W4"], w4);
				setStringParam(m_blparams["VAT_W5"], w5);
				setStringParam(m_blparams["VAT_W6"], w6);
				setStringParam(m_blparams["VAT_W7"], w7);
				setStringParam(m_blparams["VAT_W8"], w8);
				setStringParam(m_blparams["VAT_W9"], w9);
				setStringParam(P_UpdateTime, time_buffer);
				setIntegerParam(P_UpdateTimeT, timer);
				setStringParam(P_InstTS1, "ALF,ARGUS,CHRONUS,CRISP,EMMA,EMU,ENGINX,EVS,GEM,HIFI,HRPD,INES,IRIS,LOQ,MAPS,MARI,MERLIN,MUSR,OSIRIS,PEARL,POLARIS,"
				                          "PRISMA,ROTAX,SANDALS,SURF,SXD,TOSCA,VESUVIO");

				setStringParam(P_InstTS2, "CHIPIR,IMAT,INTER,LARMOR,LET,NIMROD,OFFSPEC,POLREF,SANS2D,WISH,ZOOM");
				setIntegerParam(P_OsirisCryomag, 0);
				callParamCallbacks();
				unlock();
			}
			else
			{
				free(tmp);
				tmp = xml_parse(buffer, "TIME");
				if (tmp == NULL)
				{	
					continue;
				}
				timer = atol(tmp);
				pstm = localtime(&timer);
				free(tmp);
				strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%dT%H:%M:%S+0100", pstm);
				tmp = xml_parse(buffer, "BEAMT"); beamts1 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "BEAMT2"); beamts2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "BEAME1"); beamepb1 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "MTEMP"); mtempts1 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "HTEMP"); htempts1 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "BEAMS"); beamsynch = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "REPR"); freqsynch = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "TS1_TOTAL"); totalts1 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "REPR2"); freqts2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "TS2_TOTAL"); totalts2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "T2MTEMP1"); demethanets2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "T2MTEMP2"); methanets2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "T2HTEMP1"); hydrogents2 = atof(tmp); free(tmp);
				tmp = xml_parse(buffer, "MUONKICKER"); muonkick = atof(tmp); free(tmp);
				onts1 = xml_parse(buffer, "TS1ON"); 
				offts1 = xml_parse(buffer, "TS1OFF");
				onts2 = xml_parse(buffer, "TS2ON");
				offts2 = xml_parse(buffer, "TS2OFF");
				tmp = xml_parse(buffer, "SHUTE");
				sscanf(tmp, "%lu %lu %lu %lu %lu %lu %lu %lu %lu", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9);
				e1 = ts2_shutter_status(c1);
				e2 = ts2_shutter_status(c2);
				e3 = ts2_shutter_status(c3);
				e4 = ts2_shutter_status(c4);
				e5 = ts2_shutter_status(c5);
				e6 = ts2_shutter_status(c6);
				e7 = ts2_shutter_status(c7);
				e8 = ts2_shutter_status(c8);
				e9 = ts2_shutter_status(c9);
				em1 = ts2_shutter_mode(c1);
				em2 = ts2_shutter_mode(c2);
				em3 = ts2_shutter_mode(c3);
				em4 = ts2_shutter_mode(c4);
				em5 = ts2_shutter_mode(c5);
				em6 = ts2_shutter_mode(c6);
				em7 = ts2_shutter_mode(c7);
				em8 = ts2_shutter_mode(c8);
				em9 = ts2_shutter_mode(c9);
				free(tmp);
				tmp = xml_parse(buffer, "SHUTW");
				sscanf(tmp, "%lu %lu %lu %lu %lu %lu %lu %lu %lu", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9);
				w1 = ts2_shutter_status(c1);
				w2 = ts2_shutter_status(c2);
				w3 = ts2_shutter_status(c3);
				w4 = ts2_shutter_status(c4);
				w5 = ts2_shutter_status(c5);
				w6 = ts2_shutter_status(c6);
				w7 = ts2_shutter_status(c7);
				w8 = ts2_shutter_status(c8);
				w9 = ts2_shutter_status(c9);
				wm1 = ts2_shutter_mode(c1);
				wm2 = ts2_shutter_mode(c2);
				wm3 = ts2_shutter_mode(c3);
				wm4 = ts2_shutter_mode(c4);
				wm5 = ts2_shutter_mode(c5);
				wm6 = ts2_shutter_mode(c6);
				wm7 = ts2_shutter_mode(c7);
				wm8 = ts2_shutter_mode(c8);
				wm9 = ts2_shutter_mode(c9);
				free(tmp);
				tmp = xml_parse(buffer, "SHUTN");
				v = atoi((const char *)tmp);
				n1 = ts1_shutter_status(v, 1);
				n2 = ts1_shutter_status(v, 2);
				n3 = ts1_shutter_status(v, 3);
				n4 = ts1_shutter_status(v, 4);
				n5 = ts1_shutter_status(v, 5);
				n6 = ts1_shutter_status(v, 6);
				n7 = ts1_shutter_status(v, 7);
				n8 = ts1_shutter_status(v, 8);
				n9 = ts1_shutter_status(v, 9);				
				free(tmp);
				tmp = xml_parse(buffer, "SHUTS");
				v = atoi((const char *)tmp);
				s1 = ts1_shutter_status(v, 1);
				s2 = ts1_shutter_status(v, 2);
				s3 = ts1_shutter_status(v, 3);
				s4 = ts1_shutter_status(v, 4);
				s5 = ts1_shutter_status(v, 5);
				s6 = ts1_shutter_status(v, 6);
				s7 = ts1_shutter_status(v, 7);
				s8 = ts1_shutter_status(v, 8);
				s9 = ts1_shutter_status(v, 9);				
				free(tmp);
				lock();
				epicsTimeFromTime_t(&m_timestamp, timer);
				setDoubleParam(P_BeamTS1, beamts1);
				setDoubleParam(P_BeamTS2, beamts2);
				setDoubleParam(P_BeamEPB1, beamepb1);
				setDoubleParam(P_MethaneTS1, mtempts1);
				setDoubleParam(P_HydrogenTS1, htempts1);
				setDoubleParam(P_BeamSynch, beamsynch);
				setDoubleParam(P_FreqSynch, freqsynch);
				setDoubleParam(P_TotalTS1, totalts1);
				setDoubleParam(P_FreqTS2, freqts2);
				setDoubleParam(P_TotalTS2, totalts2);
				setDoubleParam(P_DeMethaneTS2, demethanets2);
				setDoubleParam(P_MethaneTS2, methanets2);
				setDoubleParam(P_HydrogenTS2, hydrogents2);
				setDoubleParam(P_MuonKick, muonkick);
				setStringParam(P_OnTS1, onts1);
				setStringParam(P_OffTS1, offts1);
				setStringParam(P_OnTS2, onts2);
				setStringParam(P_OffTS2, offts2);
				free(onts1);
				free(offts1);
				free(onts2);
				free(offts2);
				setStringParam(m_blparams["SHUT_N1"], n1);
				setStringParam(m_blparams["SHUT_N2"], n2);
				setStringParam(m_blparams["SHUT_N3"], n3);
				setStringParam(m_blparams["SHUT_N4"], n4);
				setStringParam(m_blparams["SHUT_N5"], n5);
				setStringParam(m_blparams["SHUT_N6"], n6);
				setStringParam(m_blparams["SHUT_N7"], n7);
				setStringParam(m_blparams["SHUT_N8"], n8);
				setStringParam(m_blparams["SHUT_N9"], n9);
				setStringParam(m_blparams["SHUT_S1"], s1);
				setStringParam(m_blparams["SHUT_S2"], s2);
				setStringParam(m_blparams["SHUT_S3"], s3);
				setStringParam(m_blparams["SHUT_S4"], s4);
				setStringParam(m_blparams["SHUT_S5"], s5);
				setStringParam(m_blparams["SHUT_S6"], s6);
				setStringParam(m_blparams["SHUT_S7"], s7);
				setStringParam(m_blparams["SHUT_S8"], s8);
				setStringParam(m_blparams["SHUT_S9"], s9);
				setStringParam(m_blparams["SHUT_E1"], e1);
				setStringParam(m_blparams["SHUT_E2"], e2);
				setStringParam(m_blparams["SHUT_E3"], e3);
				setStringParam(m_blparams["SHUT_E4"], e4);
				setStringParam(m_blparams["SHUT_E5"], e5);
				setStringParam(m_blparams["SHUT_E6"], e6);
				setStringParam(m_blparams["SHUT_E7"], e7);
				setStringParam(m_blparams["SHUT_E8"], e8);
				setStringParam(m_blparams["SHUT_E9"], e9);
				setStringParam(m_blparams["SHUT_W1"], w1);
				setStringParam(m_blparams["SHUT_W2"], w2);
				setStringParam(m_blparams["SHUT_W3"], w3);
				setStringParam(m_blparams["SHUT_W4"], w4);
				setStringParam(m_blparams["SHUT_W5"], w5);
				setStringParam(m_blparams["SHUT_W6"], w6);
				setStringParam(m_blparams["SHUT_W7"], w7);
				setStringParam(m_blparams["SHUT_W8"], w8);
				setStringParam(m_blparams["SHUT_W9"], w9);
				setStringParam(m_blparams["SMODE_E1"], em1);
				setStringParam(m_blparams["SMODE_E2"], em2);
				setStringParam(m_blparams["SMODE_E3"], em3);
				setStringParam(m_blparams["SMODE_E4"], em4);
				setStringParam(m_blparams["SMODE_E5"], em5);
				setStringParam(m_blparams["SMODE_E6"], em6);
				setStringParam(m_blparams["SMODE_E7"], em7);
				setStringParam(m_blparams["SMODE_E8"], em8);
				setStringParam(m_blparams["SMODE_E9"], em9);
				setStringParam(m_blparams["SMODE_W1"], wm1);
				setStringParam(m_blparams["SMODE_W2"], wm2);
				setStringParam(m_blparams["SMODE_W3"], wm3);
				setStringParam(m_blparams["SMODE_W4"], wm4);
				setStringParam(m_blparams["SMODE_W5"], wm5);
				setStringParam(m_blparams["SMODE_W6"], wm6);
				setStringParam(m_blparams["SMODE_W7"], wm7);
				setStringParam(m_blparams["SMODE_W8"], wm8);
				setStringParam(m_blparams["SMODE_W9"], wm9);
				setStringParam(P_UpdateTime, time_buffer);
				setIntegerParam(P_UpdateTimeT, timer);
				callParamCallbacks();
				unlock();
			}
		}
		else
		{
			epicsThreadSleep(3.0);
		}
	}
}	
Пример #2
0
int main(int argc, char* argv[])
{
    int fifo_fp = -1;
    int udp_sock = -1;
    int tcp_sock = -1;
    int tcp_client_sock = -1;
    int max_sock = -1;
    struct sockaddr_in my_addr;
    struct sockaddr_in peer_addr;
    struct sockaddr_in receiver_addr;
    int addr_len;
    char resp_msg_buf[512];
    char data_msg_buf[1024];
    int len;
    fd_set fd_r;
    int gst_in_fp = -1;
    int gst_out_fp = -1;
    pid_t gst_pid = -1;
    int just_connect = 0;
    char *gst_sink;
    int no_data_count = 0;

    if (argc != 2 || strlen(argv[1]) <= 0) {
        perror("Missing sink setting");
        return -1;
    }

    gst_sink = argv[1];
    printf("Using sink: %s\n", gst_sink);

#if USE_FIFO
    unlink(FIFO_PATH);
    if (mkfifo(FIFO_PATH, 0666) < 0) {
        perror("Error when creating fifo");
        return 0;
    }
#endif

#ifdef CLIENT_MODE
    if ((tcp_client_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Error when creating tcp socket");
        return 0;
    }

    memset((char *)&peer_addr, 0, sizeof(peer_addr));
    peer_addr.sin_family = AF_INET;
    peer_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    peer_addr.sin_port = htons(LOCAL_SERVER_PORT);

    if (connect(tcp_client_sock, (const struct sockaddr *)&peer_addr, sizeof(peer_addr)) < 0) {
        perror("Error when connecting to remote");
        return 0;
    }
    if (send(tcp_client_sock, "mirror\n", 7, 0) < 0) {
        perror("Error when sending mirror command");
        return 0;
    }
    just_connect = 1;

#else
    udp_sock = setup_udp_socket();
    if ((tcp_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Error when creating tcp socket");
        return 0;
    }

    memset((char *)&my_addr, 0, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    my_addr.sin_port = htons(DISCOVER_PORT);

    if (bind(tcp_sock, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0) {
        perror("Error when binding tcp socket");
        return 0;
    }

    if (listen(tcp_sock, 3) < 0) {
        perror("Error when listening tcp socket");
        return 0;
    }
#endif

    for (;;) {
        int timeout = 0;
        struct timeval tv;
        // set connect timeout
        tv.tv_sec = 3;
        tv.tv_usec = 0;
        FD_ZERO(&fd_r);
        FD_SET(udp_sock, &fd_r);
        FD_SET(tcp_sock, &fd_r);
        if (tcp_sock > udp_sock) {
            max_sock = tcp_sock;
        } else {
            max_sock = udp_sock;
        }
        if (tcp_client_sock > 0) {
            FD_SET(tcp_client_sock, &fd_r);
            if (tcp_client_sock > max_sock) {
                max_sock = tcp_client_sock;
            }
        }
        switch (select(max_sock + 1, &fd_r, NULL, NULL, &tv)) {
            case -1:
                printf("error occur, %s\n", strerror(errno));
                break;
            case 0:
                timeout = 1;
            default: {
                if (FD_ISSET(udp_sock, &fd_r)) {
                    size_t aux[128 / sizeof(size_t)];
                    char broadcast_msg_buf[128];
                    struct iovec io;
                    struct msghdr msg;
                    struct cmsghdr *cmsg;
                    io.iov_base = broadcast_msg_buf;
                    io.iov_len = sizeof(broadcast_msg_buf);
                    memset(&msg, 0, sizeof(msg));
                    msg.msg_iov = &io;
                    msg.msg_iovlen = 1;
                    msg.msg_control = aux;
                    msg.msg_controllen = sizeof(aux);
                    msg.msg_flags = 0;
                    msg.msg_name = &peer_addr;
                    msg.msg_namelen = sizeof(peer_addr);
                    len = recvmsg(udp_sock, &msg, 0);
                    if (len < 0) {
                        printf("Error when receiving data from discover socket, errno: %s\n", strerror(errno));
                        close(udp_sock);
                        udp_sock = setup_udp_socket();
                        break;
                    }
                    printf("Receive broadcast msg: %s from: %s:%d\n", broadcast_msg_buf, inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port));
                    if (!strncmp(broadcast_msg_buf, DISCOVER_MSG, 5)) {
                        printf("Receive discover msg: %s, from: %s\n", broadcast_msg_buf, inet_ntoa(peer_addr.sin_addr));
                        for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
                            if (cmsg->cmsg_level == IPPROTO_IP) {
                                struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg);
                                printf("Response discover msg with local ip: %s\n", inet_ntoa(i->ipi_spec_dst));
                                memset(resp_msg_buf, 0, sizeof(resp_msg_buf));
                                snprintf(resp_msg_buf, sizeof(resp_msg_buf), DISCOVER_MSG_TEMPLATE, DISCOVER_PORT, inet_ntoa(i->ipi_spec_dst), inet_ntoa(i->ipi_spec_dst));
                                if (sendto(udp_sock, resp_msg_buf, strlen(resp_msg_buf), 0, (struct sockaddr *)&peer_addr, sizeof(peer_addr)) < 0) {
                                    printf("Error when send discover response to peer\n");
                                }
                            }
                        }
                    }
                } else if (FD_ISSET(tcp_sock, &fd_r)) {
                    if (tcp_client_sock < 0) {
                        addr_len = sizeof(peer_addr);
                        tcp_client_sock = accept(tcp_sock, (struct sockaddr *)&peer_addr, &addr_len);
                        if (tcp_client_sock < 0) {
                            printf("Error when accepting client\n");
                        } else {
                            just_connect = 1;
                            printf("Accept peer addr: %s:%d\n", inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port));
                            if (!strncmp(gst_sink, "ffplay", 6)) {
#if USE_FIFO
                                const char *command[] = {"ffplay", "-framerate", "50", "-infbuf", "-framedrop", "-analyzeduration", "1", FIFO_PATH, NULL};
#else
                                const char *command[] = {"ffplay", "-framerate", "50", "-infbuf", "-framedrop", "-analyzeduration", "1", "-", NULL};
#endif
                                gst_pid = popen2(command, &gst_in_fp, &gst_out_fp);
                            } else {
#if USE_FIFO
                                char location_buf[32] = {0};
                                strcat(location_buf, "location=");
                                strcat(location_buf, FIFO_PATH);
#ifdef VPUDEC
                                const char *command[] = {"gst-launch-0.10", "filesrc", location_buf, "!", "video\/x-h264,width=800,height=480,framerate=30\/1", "!", "vpudec", "framedrop=true", "frame-plus=1", "low-latency=true", "!", gst_sink, NULL};
#else
                                const char *command[] = {"gst-launch-1.0", "filesrc", location_buf, "!", "h264parse", "!", "decodebin", "!", gst_sink, NULL};
#endif
#else
#ifdef VPUDEC
                                const char *command[] = {"gst-launch-0.10", "fdsrc", "!", "video\/x-h264,width=800,height=480,framerate=30\/1", "!", "vpudec", "framedrop=true", "frame-plus=1", "low-latency=true", "!", gst_sink, NULL};
#else
                                const char *command[] = {"gst-launch-1.0", "fdsrc", "!", "h264parse", "!", "decodebin", "!", gst_sink, NULL};
                                //const char *command[] = {"gst-launch-1.0", "fdsrc", "!", "video\/x-h264,width=800,height=480,framerate=0\/1,stream-format=avc", "!", "avdec_h264", "!", gst_sink, NULL};
#endif
#endif
                                gst_pid = popen2(command, &gst_in_fp, &gst_out_fp);
                            }
                            printf("gst pid: %d\n", gst_pid);
#if USE_FIFO
                            fifo_fp = open(FIFO_PATH, O_WRONLY);
                            printf("fifo_fp: %d\n", fifo_fp);
#endif
                        }
                    } else {
                        printf("Could not accept client, another connection still exist\n");
                    }
                } else if (tcp_client_sock > 0 && FD_ISSET(tcp_client_sock, &fd_r)) {
                    memset(data_msg_buf, 0, sizeof(data_msg_buf));
                    len = read(tcp_client_sock, data_msg_buf, sizeof(data_msg_buf));
                    //printf("Receive data len: %d\n", len);
                    if (len < 0 || no_data_count > 2) {
                        printf("Failed to receive from tcp client socket, close the socket\n");
                        close(tcp_client_sock);
                        tcp_client_sock = -1;
                        if (gst_pid > 0) {
                            kill(gst_pid, SIGKILL);
                            waitpid(gst_pid, NULL, 0);
                            gst_pid = -1;
                            gst_in_fp = -1;
                            gst_out_fp = -1;
                        }
                        if (fifo_fp > 0) {
                            close(fifo_fp);
                            fifo_fp = -1;
                        }
#ifdef CLIENT_MODE
                        return 0;
#endif
                    } else {
                        if (len > 0) {
                            no_data_count = 0;
                        } else {
			    no_data_count++;
                        }
                        if (just_connect && strstr(data_msg_buf, "\r\n")) {
                            int width = 800;
                            int height = 480;
                            printf("Receive control data(%u): %s\n", len, data_msg_buf);
                            char *control_end = strstr(data_msg_buf, "\r\n\r\n");
                            int bdata_len = 0;
                            if (control_end + 4 - data_msg_buf > 0) {
                                bdata_len = len - (control_end + 4 - data_msg_buf);
                                control_end = control_end + 4;
                            }
                            char *info = strtok(data_msg_buf, "\r\n");
                            while (info) {
                                //printf("info: %s\n", info);
                                if (strstr(info, "X-WIDTH:")) {
                                    width = atoi(strstr(info, " "));
                                    printf("width: %d\n", width);
                                }
                                if (strstr(info, "X-HEIGHT:")) {
                                    height = atoi(strstr(info, " "));
                                    printf("height: %d\n", height);
                                }
                                info = strtok(NULL, "\r\n");
                            }

                            if (!strncmp(gst_sink, "ffplay", 6)) {
#if USE_FIFO
                                const char *command[] = {"ffplay", "-framerate", "50", "-infbuf", "-framedrop", "-analyzeduration", "1", FIFO_PATH, NULL};
#else
                                const char *command[] = {"ffplay", "-framerate", "50", "-infbuf", "-framedrop", "-analyzeduration", "1", "-", NULL};
#endif
                                gst_pid = popen2(command, &gst_in_fp, &gst_out_fp);
                            } else {
#if USE_FIFO
                                char location_buf[32] = {0};
                                strcat(location_buf, "location=");
                                strcat(location_buf, FIFO_PATH);
#ifdef VPUDEC
                                char mime_buf[70] = {0};
                                snprintf(mime_buf, 70, "video\/x-h264,width=%d,height=%d,framerate=30\/1", width, height);
                                //snprintf(mime_buf, 70, "video\/x-h264,width=%d,height=%d,framerate=30\/1,stream-format=avc", width, height);
                                printf("Using cap: %s\n", mime_buf);
                                const char *command[] = {"gst-launch-0.10", "filesrc", location_buf, "!", mime_buf, "!", "vpudec", "framedrop=true", "frame-plus=1", "low-latency=true", "!", gst_sink, NULL};
#else
                                const char *command[] = {"gst-launch-1.0", "filesrc", location_buf, "!", "h264parse", "!", "decodebin", "!", gst_sink, NULL};
#endif
#else
#ifdef VPUDEC
                                char mime_buf[70] = {0};
                                snprintf(mime_buf, 70, "video\/x-h264,width=%d,height=%d,framerate=30\/1", width, height);
                                //snprintf(mime_buf, 70, "video\/x-h264,width=%d,height=%d,framerate=30\/1,stream-format=avc", width, height);
                                printf("Using cap: %s\n", mime_buf);
                                const char *command[] = {"gst-launch-0.10", "fdsrc", "do-timestamp=true", "!", mime_buf, "!", "vpudec", "framedrop=false", "frame-plus=1", "low-latency=true", "!", gst_sink, NULL};
#else
                                const char *command[] = {"gst-launch-1.0", "fdsrc", "!", "h264parse", "!", "decodebin", "!", gst_sink, NULL};
#endif
#endif

                                gst_pid = popen2(command, &gst_in_fp, &gst_out_fp);
                            }
                            printf("gst pid: %d\n", gst_pid);
                            printf("gst in fp: %d\n", gst_in_fp);
#if USE_FIFO
                            fifo_fp = open(FIFO_PATH, O_WRONLY);
                            printf("fifo_fp: %d\n", fifo_fp);
#endif

                            just_connect = 0;
                            if (bdata_len > 0) {
#if USE_FIFO
                                if (fifo_fp > 0) {
                                    len = write(fifo_fp, control_end, bdata_len);
                                    printf("Write non control data len: %d\n", len);
                                }
#else
                                if (gst_in_fp > 0) {
                                    len = write(gst_in_fp, control_end, bdata_len);
                                    printf("Write non control data len: %d\n", len);
                                }
#endif
                            }
                        } else {
#if USE_FIFO
                            if (fifo_fp > 0) {