9 #include "PCVideoServer.h"
17 #include "NetworkCommunication/UsageReporting.h"
20 #include "Vision/AxisCamera.h"
21 #include "WPIErrors.h"
35 if (m_camSock != ERROR) {
41 operator int()
const {
57 : m_serverTask(
"PCVideoServer", (FUNCPTR)s_ServerTask)
58 , m_newImageSem (NULL)
59 , m_stopServer (false)
86 int camSock = socket(AF_INET, SOCK_STREAM, 0);
97 struct sockaddr_in selfAddr;
98 int sockAddrSize =
sizeof(selfAddr);
99 bzero ((
char *) &selfAddr, sockAddrSize);
100 selfAddr.sin_family = AF_INET;
101 selfAddr.sin_len = (u_char) sockAddrSize;
102 selfAddr.sin_port = htons (VIDEO_TO_PC_PORT);
104 if (( (
int)(selfAddr.sin_addr.s_addr = inet_addr (const_cast<char*>(
"localhost")) ) != ERROR) ||
105 ( (
int)(selfAddr.sin_addr.s_addr = hostGetByName (const_cast<char*>(
"localhost")) ) != ERROR))
107 struct timeval connectTimeout;
108 connectTimeout.tv_sec = 1;
109 connectTimeout.tv_usec = 0;
110 connectWithTimeout(camSock, (
struct sockaddr *) &selfAddr, sockAddrSize, &connectTimeout);
118 int PCVideoServer::StartServerTask()
125 m_stopServer =
false;
127 int oldId = taskNameToId((
char*)m_serverTask.
GetName());
137 bool started = m_serverTask.
Start((
int)
this);
139 id = m_serverTask.
GetID();
143 wpi_setWPIError(TaskError);
171 return thisPtr->ServerTask();
179 int PCVideoServer::ServerTask()
182 struct sockaddr_in serverAddr;
183 int sockAddrSize =
sizeof(serverAddr);
185 bzero ((
char *) &serverAddr, sockAddrSize);
186 serverAddr.sin_len = (u_char) sockAddrSize;
187 serverAddr.sin_family = AF_INET;
188 serverAddr.sin_port = htons (VIDEO_TO_PC_PORT);
189 serverAddr.sin_addr.s_addr = htonl (INADDR_ANY);
196 if ((pcSock = socket (AF_INET, SOCK_STREAM, 0)) == ERROR)
198 wpi_setErrnoErrorWithContext(
"Failed to create the PCVideoServer socket");
203 setsockopt(pcSock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char*>(&reuseAddr),
sizeof(reuseAddr));
205 if (bind (pcSock, (
struct sockaddr *) &serverAddr, sockAddrSize) == ERROR)
207 wpi_setErrnoErrorWithContext(
"Failed to bind the PCVideoServer port");
212 if (listen (pcSock, 1) == ERROR)
214 wpi_setErrnoErrorWithContext(
"Failed to listen on the PCVideoServer port");
219 struct sockaddr_in clientAddr;
221 int newPCSock = accept (pcSock, reinterpret_cast<sockaddr*>(&clientAddr), &clientAddrSize);
222 if (newPCSock == ERROR)
230 nUsageReporting::report(nUsageReporting::kResourceType_PCVideoServer, 0);
233 int imageDataSize = 0;
234 char* imageData = NULL;
238 success = semTake(m_newImageSem, 1000);
239 if (success == ERROR)
255 static const char header[4]={1,0,0,0};
256 int headerSend = write(newPCSock, const_cast<char*>(header), 4);
259 int lengthSend = write(newPCSock, reinterpret_cast<char*>(&numBytes), 4);
262 int sent = write (newPCSock, imageData, numBytes);
266 if (headerSend == ERROR || lengthSend == ERROR || sent == ERROR)
int CopyJPEG(char **destImage, int &destImageSize, int &destImageBufferSize)
bool Start(uint32_t arg0=0, uint32_t arg1=0, uint32_t arg2=0, uint32_t arg3=0, uint32_t arg4=0, uint32_t arg5=0, uint32_t arg6=0, uint32_t arg7=0, uint32_t arg8=0, uint32_t arg9=0)
Implements an object that automatically does a close on a camera socket on destruction.
void Start()
Start sending images to the PC.
~PCVideoServer()
Destructor. Stop serving images and destroy this class.
void Stop()
Stop sending images to the PC.
virtual void ClearError() const
Clear the current error information associated with this sensor.
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
static AxisCamera & GetInstance(const char *cameraIP=NULL)
PCVideoServer()
Constructor.