added functionality to send a udp packet to a destination for display purposes
parent
ea78bb4134
commit
c286b459ba
|
@ -24,9 +24,11 @@ UDPSock.bind((outgoing_if, local_port))
|
||||||
# goes down or refuses connection
|
# goes down or refuses connection
|
||||||
#UDPSock.connect((remote_host, remote_port))
|
#UDPSock.connect((remote_host, remote_port))
|
||||||
|
|
||||||
segments = open('segments','r')
|
segmentsfile = open('segments','r')
|
||||||
|
|
||||||
alpha = chr(125)
|
hash = "abcdefghij"
|
||||||
|
|
||||||
|
alpha = chr(255)
|
||||||
|
|
||||||
z_buffer = chr(1) + "\n"
|
z_buffer = chr(1) + "\n"
|
||||||
|
|
||||||
|
@ -45,7 +47,8 @@ frequency = 2*pi/200
|
||||||
|
|
||||||
while (1):
|
while (1):
|
||||||
#zero out the data buffer
|
#zero out the data buffer
|
||||||
data = z_buffer
|
data = hash
|
||||||
|
data += z_buffer
|
||||||
for i in range(0,width):
|
for i in range(0,width):
|
||||||
for j in range(0,height):
|
for j in range(0,height):
|
||||||
pixel = fabs(sin(2*pi*(float(i)/width)+t*frequency)*sin(2*pi*(float(j)/height)+t*frequency))
|
pixel = fabs(sin(2*pi*(float(i)/width)+t*frequency)*sin(2*pi*(float(j)/height)+t*frequency))
|
||||||
|
@ -54,7 +57,7 @@ while (1):
|
||||||
for i in range(0,segwidth):
|
for i in range(0,segwidth):
|
||||||
for j in range(0,segments):
|
for j in range(0,segments):
|
||||||
for a in range(0,segchannels):
|
for a in range(0,segchannels):
|
||||||
data += chr(255)
|
data += chr( 127 + int(128*sin(2*pi*(1+i)*(1+j)*(1+a)*t*frequency/200)))
|
||||||
data += "\n"
|
data += "\n"
|
||||||
t+=1
|
t+=1
|
||||||
if not data:
|
if not data:
|
||||||
|
|
|
@ -13,7 +13,7 @@ Server::Server(int _port )
|
||||||
consoleinit = false;
|
consoleinit = false;
|
||||||
mode = FRAME;
|
mode = FRAME;
|
||||||
selected_buffer=0;
|
selected_buffer=0;
|
||||||
//test();
|
launch_threads();
|
||||||
}
|
}
|
||||||
|
|
||||||
Server::~Server()
|
Server::~Server()
|
||||||
|
@ -65,6 +65,14 @@ void Server::listen()
|
||||||
socket.receive_from(boost::asio::buffer(recv_buf),
|
socket.receive_from(boost::asio::buffer(recv_buf),
|
||||||
remote_endpoint, 0, error);
|
remote_endpoint, 0, error);
|
||||||
|
|
||||||
|
// check whether this is a valid packet and discard it if it isn't
|
||||||
|
// note, this is a very hack way of comparing strings...
|
||||||
|
if( std::string( (char*)recv_buf.data(), (size_t)10 ) != std::string(HASH) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// DEBUG send reply to sender
|
||||||
|
// socket.send_to( boost::asio::buffer("ACK",3) ,remote_endpoint);
|
||||||
|
|
||||||
// bufnum is used further down
|
// bufnum is used further down
|
||||||
/* the buffer is locked for a long long time, however, we need
|
/* the buffer is locked for a long long time, however, we need
|
||||||
to make sure that none of the buffers expires while we're about
|
to make sure that none of the buffers expires while we're about
|
||||||
|
@ -106,7 +114,7 @@ void Server::listen()
|
||||||
packetcounter++;
|
packetcounter++;
|
||||||
|
|
||||||
// copy frame information into the buffer
|
// copy frame information into the buffer
|
||||||
frame.z = recv_buf[0];
|
frame.z = recv_buf[10];
|
||||||
for(int i = 0; i < HEIGHT; i++)
|
for(int i = 0; i < HEIGHT; i++)
|
||||||
{
|
{
|
||||||
for(int j = 0; j < WIDTH; j++)
|
for(int j = 0; j < WIDTH; j++)
|
||||||
|
@ -157,10 +165,53 @@ void Server::listen()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this sends the frame content to a host expecting udp packets */
|
||||||
|
void Server::send(frame_t _frame, udp::endpoint destination)
|
||||||
|
{
|
||||||
|
// write the frame into a char buffer, make it static so we don't waste time creating
|
||||||
|
// it at every function call
|
||||||
|
const int length = WIDTH*HEIGHT*CHANNELS + SEGWIDTH*SEGNUM*SEGCHANNELS;
|
||||||
|
static char data[length];
|
||||||
|
for(int i = 0; i < HEIGHT; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < WIDTH; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < CHANNELS; k++)
|
||||||
|
{
|
||||||
|
data[i*WIDTH*CHANNELS + CHANNELS*j + k] = _frame.windows[i][j][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < SEGWIDTH; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < SEGNUM; j++)
|
||||||
|
{
|
||||||
|
for(int k = 0; k < SEGCHANNELS; k++)
|
||||||
|
{
|
||||||
|
data[WIDTH*HEIGHT*CHANNELS +
|
||||||
|
i*SEGNUM*SEGCHANNELS + SEGCHANNELS*j + k] = _frame.segments[i][j][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
boost::asio::io_service io_service;
|
||||||
|
|
||||||
|
udp::socket socket(io_service, udp::endpoint(udp::v4(),0));
|
||||||
|
|
||||||
|
// std::cerr << destination << std::endl;
|
||||||
|
socket.send_to(boost::asio::buffer(data,length), destination);
|
||||||
|
}
|
||||||
|
catch (std::exception& e)
|
||||||
|
{
|
||||||
|
std::cerr << e.what() << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* the framemixer, this periodically (40 times a second) reads all input
|
/* the framemixer, this periodically (40 times a second) reads all input
|
||||||
buffers and then produces output, ready to be displayed.
|
buffers and then produces output, ready to be displayed.
|
||||||
In the final version, this is where interesting things will happen.
|
|
||||||
*/
|
*/
|
||||||
void Server::mix()
|
void Server::mix()
|
||||||
{
|
{
|
||||||
|
@ -254,7 +305,9 @@ void Server::mix()
|
||||||
// we do this in case output() takes a long time to return. If it read frame directly, we'd end up
|
// we do this in case output() takes a long time to return. If it read frame directly, we'd end up
|
||||||
// waiting for a long time
|
// waiting for a long time
|
||||||
temp_frame = frame;
|
temp_frame = frame;
|
||||||
} // release lock and send off to hardware
|
} /* release lock and send off to hardware
|
||||||
|
* (note, temp_frame is passed by value and will live only in the
|
||||||
|
* argument of the "output" function and does not need to be locked) */
|
||||||
output(temp_frame);
|
output(temp_frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -262,6 +315,10 @@ void Server::mix()
|
||||||
// output to hardware using OLA
|
// output to hardware using OLA
|
||||||
void Server::output(frame_t _frame)
|
void Server::output(frame_t _frame)
|
||||||
{
|
{
|
||||||
|
boost::asio::ip::udp::endpoint remote_endpoint( boost::asio::ip::address_v4::from_string(REMOTE_IP) , REMOTE_PORT );
|
||||||
|
// send frame to a network host
|
||||||
|
send(_frame,remote_endpoint);
|
||||||
|
|
||||||
// pretend we're doing something
|
// pretend we're doing something
|
||||||
usleep( 25000 );
|
usleep( 25000 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,11 +33,11 @@ public:
|
||||||
Server(int _port);
|
Server(int _port);
|
||||||
~Server();
|
~Server();
|
||||||
|
|
||||||
void launch_threads();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Glib::Mutex mutex_;
|
Glib::Mutex mutex_;
|
||||||
|
|
||||||
|
void launch_threads();
|
||||||
|
|
||||||
void console();
|
void console();
|
||||||
void input();
|
void input();
|
||||||
void test();
|
void test();
|
||||||
|
@ -51,6 +51,7 @@ private:
|
||||||
void console_printclients();
|
void console_printclients();
|
||||||
|
|
||||||
void listen();
|
void listen();
|
||||||
|
void send(frame_t,udp::endpoint);
|
||||||
void mix();
|
void mix();
|
||||||
void output(frame_t);
|
void output(frame_t);
|
||||||
int get_size();
|
int get_size();
|
||||||
|
|
|
@ -1,14 +1,19 @@
|
||||||
#ifndef __DEFINES_H_
|
#ifndef __DEFINES_H_
|
||||||
#define __DEFINES_H_
|
#define __DEFINES_H_
|
||||||
|
|
||||||
|
#define HASH "abcdefghij"
|
||||||
|
|
||||||
// four minutes should be enough (seconds)
|
// four minutes should be enough (seconds)
|
||||||
// timeout set to two seconds for testing purposes
|
// timeout set to two seconds for testing purposes
|
||||||
#define BUFTIMEOUT 2
|
#define BUFTIMEOUT 2
|
||||||
|
|
||||||
#define NUMBUFS 1000
|
#define NUMBUFS 1000
|
||||||
|
|
||||||
// one number + newline
|
#define REMOTE_IP "127.0.0.1"
|
||||||
#define HEADEROFFSET 2
|
#define REMOTE_PORT 1234
|
||||||
|
|
||||||
|
// one byte number + 10 character hash
|
||||||
|
#define HEADEROFFSET 11
|
||||||
|
|
||||||
// 12 windows per floor, 7 floors, Value:Alpha
|
// 12 windows per floor, 7 floors, Value:Alpha
|
||||||
#define WIDTH 12
|
#define WIDTH 12
|
||||||
|
|
|
@ -23,8 +23,6 @@ int main(void)
|
||||||
Glib::RefPtr<Glib::MainLoop> Main = Glib::MainLoop::create();
|
Glib::RefPtr<Glib::MainLoop> Main = Glib::MainLoop::create();
|
||||||
|
|
||||||
Server server(4321);
|
Server server(4321);
|
||||||
server.launch_threads();
|
|
||||||
|
|
||||||
Main->run();
|
Main->run();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue