www.pudn.com > Net_apps.rar > Tx6Rx6DisplayTv.c
/*
*********************************************************************************************************
* Copyright 2003 Service & Quality Technology CO., LTD. ALL RIGHTS RESERVED.
* This software is provided under license and contains proprietary and
* confidential material which is the property of SQ tech.
*
* FileName : Tx6Rx6DisplayTv.c
* Description : 610 get image from 610 and put image into queue,display by driver
*
*
* Version control:
* $Revision: 0.1 $ Date: 2004/09/16 12:00:00 gofly
* first implemetation
*
*********************************************************************************************************
*/
#include "opt.h"
#if TX6RX6DISPLAYTV
#include "..\include\L3\net_apps\demo\Tx6Rx6DisplayTv.h"
OS_EVENT *Tx6Rx6DisplayTvEvenSem;
struct _TTx6Rx6DisplayTvState Tx6Rx6DisplayTvState;
/****************************************************************************/
/* FUNCTION NAME :
/* DESCRIPTION :
/* in PARAMETERS :
/* out PARAMETERS:
/* RETURN VALUES :
/* EXAMPLE :
*****************************************************************************/
void Tx6Rx6DisplayTv (void *data)
{
struct _TTx6Rx6DisplayTvState *state;
INT8U ucErr;
INT8U Msg[128];
state = &data;
Tx6Rx6DisplayTvEvenSem = (OS_EVENT*)OSSemCreate(0);
Tx6Rx6DisplayTvInit(state);
while(1)
{
#if 0
OSSemPend(Tx6Rx6DisplayTvEvenSem, 0, &ucErr);
#else
state->OrderState = SERVER_START;
#endif
Tx6Rx6DisplayTvLog (NULL, 0, IOINIT);
sprintf(Msg,"Tx6Rx6DisplayTv START.\x0d\x0a");
Tx6Rx6DisplayTvLog (Msg, strlen(Msg), IOW);
while(2)
{
switch(state->SockState)
{
case SOCK_NEW:
Tx6Rx6DisplayTvConnect((void*)state);
break;
case SOCK_SEND:
Tx6Rx6DisplayTvSend((void*)state);
break;
case SOCK_RECV:
Tx6Rx6DisplayTvRecv((void*)state);
break;
case SOCK_CLOSE:
close(state->sock );
state->sock = INVALID_SOCKET;
sprintf(Msg,"Tx6Rx6DisplayTv CLOSE.\x0d\x0a");
Tx6Rx6DisplayTvLog (Msg, strlen(Msg), IOW);
if(state->OrderState != SERVER_STOP)
{
Tx6Rx6DisplayTvTurnStates(state,SOCK_NEW,state->BufState,state->OrderState);
}
OSTimeDlyHMSM(0, 0, 5 , 0);
break;
}
//---- socket close and order stop
if(state->SockState == SOCK_CLOSE && state->OrderState == SERVER_STOP)
{
break;
}
//----- order stop => socket stop
if(state->OrderState == SERVER_STOP)
{
Tx6Rx6DisplayTvTurnStates(state,SOCK_CLOSE,state->BufState,state->OrderState);
}
}// while(2)
sprintf(Msg,"Tx6Rx6DisplayTv STOP.\x0d\x0a");
Tx6Rx6DisplayTvLog (Msg, strlen(Msg), IOW);
OSTimeDlyHMSM(0, 0, 5 , 0);
}//while(1)
}
/****************************************************************************/
/* FUNCTION NAME : Tx6Rx6DisplayTvRecv
/* DESCRIPTION :
/* in PARAMETERS :
/* out PARAMETERS:
/* RETURN VALUES :
/* EXAMPLE :
*****************************************************************************/
void Tx6Rx6DisplayTvRecv(void *data)
{
struct _TTx6Rx6DisplayTvState *state;
INT8U maxfdp1;
fd_set readset;
INT8U time_count;
INT16S recv_len;
INT8U Msg[1024];
INT8U *pMsgRecv;
struct timeval timeout={1,0};
state = data;
maxfdp1 = state->sock + 1;
time_count = 0;
while(1)
{
FD_ZERO(&readset);
FD_SET(state->sock , &readset);
select(maxfdp1, &readset, 0, 0,&timeout);
if(FD_ISSET(state->sock, &readset))
{
memset(Msg,0x00,sizeof(Msg));
recv_len = recv(state->sock , Msg, sizeof(Msg), 0);
if(recv_len <= 0) goto GOTO_Tx6Rx6DisplayTvRecv_ERR_END;
break;
}
else
{
time_count++;
if(time_count > 30)
{
goto GOTO_Tx6Rx6DisplayTvRecv_ERR_END;
}
}
}// while(1)
return;
GOTO_Tx6Rx6DisplayTvRecv_ERR_END:
sprintf(Msg,"Tx6Rx6DisplayTvRecv fail\x0d\x0a\x00") ;
Tx6Rx6DisplayTvLog(Msg,strlen(Msg),IOW);
Tx6Rx6DisplayTvTurnStates(state,SOCK_CLOSE,state->BufState,state->OrderState);
//state->sock_state = SOCK_CLOSE;
}
/****************************************************************************/
/* FUNCTION NAME : Tx6Rx6DisplayTvSend
/* DESCRIPTION :
/* in PARAMETERS :
/* out PARAMETERS:
/* RETURN VALUES :
/* EXAMPLE :
*****************************************************************************/
void Tx6Rx6DisplayTvSend(void *data)
{
struct _TTx6Rx6DisplayTvState *state;
INT8U Msg[128];
INT16S send_len;
state = data;
sprintf(Msg,"GET /cgi-bin/Stream?Video webcamPWD=%s\x0d\x0a\x0d\x0a",
IoCookie(NULL,NULL,IOR,ROOT)
);
send_len = send(state->sock , Msg, strlen(Msg),0);
sprintf(Msg,"Tx6Rx6DisplayTvSend send size = %d \x0d\x0a\x00", send_len) ;
Tx6Rx6DisplayTvLog(Msg,strlen(Msg),IOW);
if(send_len <= 0) goto GOTO_Tx6Rx6DisplayTv_ERR_END;
sprintf(Msg,"Tx6Rx6DisplayTvSend DdnsSend ok \x0d\x0a\x00") ;
Tx6Rx6DisplayTvLog(Msg,strlen(Msg),IOW);
Tx6Rx6DisplayTvTurnStates(state,SOCK_RECV,state->BufState,state->OrderState);
return;
GOTO_Tx6Rx6DisplayTv_ERR_END:
sprintf(Msg,"DDNS_DEBUG DdnsSend fail\x0d\x0a\x00") ;
Tx6Rx6DisplayTvLog(Msg,strlen(Msg),IOW);
Tx6Rx6DisplayTvTurnStates(state,SOCK_CLOSE,state->BufState,state->OrderState);
}
/****************************************************************************/
/* FUNCTION NAME : Tx6Rx6DisplayTvConnect
/* DESCRIPTION :
/* in PARAMETERS :
/* out PARAMETERS:
/* RETURN VALUES :
/* EXAMPLE :
*****************************************************************************/
void Tx6Rx6DisplayTvConnect(void *data)
{
struct _TTx6Rx6DisplayTvState *state;
INT8U Msg[128];
state = data;
state->S_ip_port_data.sin_port = htons(80);
state->sock = socket(0,SOCK_STREAM,0);
state->S_ip_port_data.sin_addr.s_addr = IMAGE_SERVER_IP4;
state->S_ip_port_data.sin_family = AF_INET;
if(state->sock == INVALID_SOCKET)
{
sprintf(Msg,"Tx6Rx6DisplayTvConnect socket() fail \x0d\x0a\x00") ;
goto GOTO_Tx6Rx6DisplayTvConnect_ERR_END;
}
if( -1 == connect(state->sock, &state->S_ip_port_data, 0))
{
sprintf(Msg,"Tx6Rx6DisplayTvConnect connect() fail \x0d\x0a\x00") ;
goto GOTO_Tx6Rx6DisplayTvConnect_ERR_END;
}
sprintf(Msg,"Tx6Rx6DisplayTvConnect ok \x0d\x0a\x00") ;
Tx6Rx6DisplayTvLog(Msg,strlen(Msg),IOW);
Tx6Rx6DisplayTvTurnStates(state,SOCK_SEND,state->BufState,state->OrderState);
//state->SockState = SOCK_SEND;
return;
GOTO_Tx6Rx6DisplayTvConnect_ERR_END:
Tx6Rx6DisplayTvLog(Msg,strlen(Msg),IOW);
sprintf(Msg,"Tx6Rx6DisplayTvConnect fail \x0d\x0a\x00") ;
Tx6Rx6DisplayTvLog(Msg,strlen(Msg),IOW);
Tx6Rx6DisplayTvTurnStates(state,SOCK_CLOSE,state->BufState,state->OrderState);
//state->SockState = SOCK_CLOSE;
}
/****************************************************************************/
/* FUNCTION NAME :
/* DESCRIPTION :
/* in PARAMETERS :
/* out PARAMETERS:
/* RETURN VALUES :
/* EXAMPLE :
*****************************************************************************/
void Tx6Rx6DisplayTvInit(void *data)
{
struct _TTx6Rx6DisplayTvState *state;
state = data;
state->BufState = RELEASE;
state->OrderState = SERVER_STOP;
state->SockState = SOCK_NEW;
state->sock = INVALID_SOCKET;
state->pLog = NULL;
state->RequestCount = 0;
};
/****************************************************************************/
/* FUNCTION NAME : DdnsLog
/* DESCRIPTION :
/* in PARAMETERS :
/* out PARAMETERS:
/* RETURN VALUES :
/* EXAMPLE :
*****************************************************************************/
void Tx6Rx6DisplayTvLog (INT8U *data,INT32U Size,INT8U op)
{
static INT8U Log[1024];
Tx6Rx6DisplayTvState.pLog = Log;
//if(op == IOW)SHOW_EX1(1 ,data);
asm {PUSHF; CLI}
switch(op)
{
case IOR:
memset(data, 0x00, Size);
Size = min(Size, sizeof(Log));
memcpy(data, Log,Size);
break;
case IOW:
if(Size > sizeof(Log)) break;
if(Size + strlen(Log) >= sizeof(Log))
memset(Log, 0x00, sizeof(Log));
strcat(Log, data);
break;
case IOINIT:
memset(Log, 0x00, sizeof(Log));
break;
}
asm POPF
}
/****************************************************************************/
/* FUNCTION NAME :
/* DESCRIPTION :
/* in PARAMETERS :
/* out PARAMETERS:
/* RETURN VALUES :
/* EXAMPLE :
*****************************************************************************/
void Tx6Rx6DisplayTvTurnStates(void *data,INT8U SockState,INT8U BufState,INT8U OrderState)
{
struct _TTx6Rx6DisplayTvState *state;
state = data;
asm {PUSHF; CLI}
state->BufState = BufState;
state->OrderState = OrderState;
state->SockState = SockState;
asm POPF
}
#endif//TX6RX6DISPLAYTV