PC에서 전송되는 명령을 처리하는 부분은 ProcessCamTCPS() 함수에서 처리하고 있다.
TCP 통신으로 영상 전송 시작 및 종료나 카메라 제어와 같은 명령을 전송할수 있다.
int32_t ProcessCamTCPS(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
unsigned int cmd;
unsigned int para;
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
setSn_IR(sn,Sn_IR_CON);
}
// Don't need to check SOCKERR_BUSY because it doesn't not occur.
if((size = getSn_RX_RSR(sn)) > 0)
{
if(size > ETH_MAX_BUF_SIZE) size = ETH_MAX_BUF_SIZE;
ret = recv(sn, buf, size);
cmd = buf[0];
para = buf[2]<<8 | buf[3];
if(cmd == _CMD_LED)
{
if(para == 0)
{
Led1Off();
}
else if(para == 1)
{
Led1On();
}
}
else if(cmd == _CMD_CAM_START)
{
gImgTransferFlag = 1;
printf("Cam Stream Start\r\n");
}
else if(cmd == _CMD_CAM_STOP)
{
gImgTransferFlag = 0;
printf("Cam Stream Stop\r\n");
}
//sendto(sock, data_buf, len, gDestip, dDestport);
printf("rx size=%d \r\n", size);
}
break;
case SOCK_CLOSE_WAIT :
if((ret = disconnect(sn)) != SOCK_OK) return ret;
break;
case SOCK_INIT :
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
break;
default:
break;
}
return 1;
}
PC 프로그램
제어 명령은 명령어 종류과 파라미터 값을 전송해서 다양한 처리를 할 수 있도록 하였다.
int CNetImagePlayDlg::SendCommand(unsigned int Cmd, unsigned int Para)
{
CString str;
unsigned char buf[4];
buf[0] = Cmd;
buf[1] = 0;
buf[2] = Para >> 8;
buf[3] = Para;
m_ClientSocket.Send(buf, sizeof(buf));
return 0;
}
반응형