vrpn 07.35
Virtual Reality Peripheral Network
Loading...
Searching...
No Matches
vrpn_Android.C
Go to the documentation of this file.
1#include "vrpn_Android.h"
2#include <sstream>
3#include <string>
4#include <bitset>
5
8{
9 fprintf(stderr, "Button_Server_Remote: button %i state %i\n", b.button, b.state);
10}
11
12void VRPN_CALLBACK handle_analog (void *userdata, const vrpn_ANALOGCB a)
13{
14 vrpn_int32 i;
15 const char *name = (const char *)userdata;
16
17 fprintf(stderr, "Analog:\n %5.2f", a.channel[0]);
18 for (i = 1; i < a.num_channel; i++) {
19 fprintf(stderr, ", %5.2f\n", a.channel[i]);
20 }
21 fprintf(stderr, " (%d chans)\n", a.num_channel);
22}
24
25
26vrpn_Android_Server::vrpn_Android_Server(vrpn_int32 num_analogs, vrpn_int32 * analog_sizes, vrpn_int32 num_buttons, vrpn_int32 port)
27{
28 fprintf(stderr, "C++: vrpn_Android_Server instantiated\n");
29 this->port = port;
30 this->initialize(num_analogs, analog_sizes, num_buttons);
31}
32
33void vrpn_Android_Server::initialize(vrpn_int32 num_analogs, vrpn_int32 * analog_sizes, vrpn_int32 num_buttons)
34{
35 ANALOG_SERVER_NAME = "Analog"; // Numbers added automatically
36 BUTTON_SERVER_NAME = "Button0";
37
38 this->num_analogs = num_analogs;
39 this->analog_sizes = analog_sizes;
40
41 fprintf(stderr, "vrpn_Android_Server: using port %i\n", port);
42
43 fprintf(stderr, "vrpn_Android_Server: getting server connection...\n");
44 connection = vrpn_create_server_connection(port);
45 fprintf(stderr, (connection == 0) ? "vrpn_Android_Server: Failed to get connection\n" : "vrpn_Android_Server: Got connection\n");
46
47 // Create analog servers
48 analog_server = new vrpn_Analog_Server*[num_analogs];
49
50 for (int i = 0; i < num_analogs; i++)
51 {
52 std::stringstream name;
53 name << ANALOG_SERVER_NAME << i;
54 analog_server[i] = new vrpn_Analog_Server(name.str().c_str(), connection, analog_sizes[i]);
55 analog_server[i]->setNumChannels(analog_sizes[i]);
56 fprintf(stderr, "vrpn_Android_Server: instantiated analog server %i\n", i);
57 }
58
59 // Create button server
60 button_server = new vrpn_Button_Server(BUTTON_SERVER_NAME, connection, num_buttons);
61 fprintf(stderr, "vrpn_Android_Server: instantiated button server\n");
62
63 // Create analog clients
64 analog_client = new vrpn_Analog_Remote*[num_analogs];
65
66 for (int i = 0; i < num_analogs; i++)
67 {
68 std::stringstream name;
69 name << ANALOG_SERVER_NAME << i;
70 analog_client[i] = new vrpn_Analog_Remote(name.str().c_str(), connection);
71 analog_client[i]->register_change_handler(const_cast <char*> (name.str().c_str()), handle_analog);
72
73 }
74
75 // Create button client
76 button_client = new vrpn_Button_Remote(BUTTON_SERVER_NAME, connection);
77 button_client->register_change_handler(const_cast <char*> (BUTTON_SERVER_NAME), button_press);
78
79 fprintf(stderr, "C++: vrpn_Android_Server initialized\n");
80}
81
83{
84 for (vrpn_int32 i = 0; i < num_analogs; i++)
85 {
86 analog_server[i]->mainloop();
87 analog_client[i]->mainloop();
88 }
89 button_server->mainloop();
90 button_client->mainloop();
91 connection->mainloop();
92}
93
94void vrpn_Android_Server::set_button(vrpn_int32 button_id, vrpn_int32 state)
95{
96 button_server->set_button(button_id, state);
97}
98
99void vrpn_Android_Server::set_analog(vrpn_int32 analog_id, vrpn_int32 channel, vrpn_float64 val)
100{
101 vrpn_float64 * channels = analog_server[analog_id]->channels();
102 channels[channel] = val;
103}
104
106{
107 analog_server[analog_id]->report();
108}
109
111{
112 for (vrpn_int32 i = 0; i < num_analogs; i++)
113 {
114 delete analog_server[i];
115 delete analog_client[i];
116 }
117 delete button_server;
118 delete button_client;
119 delete connection;
120 fprintf(stderr, "C++: vrpn_Android_Server destroyed\n");
121}
virtual void mainloop()
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
virtual int register_change_handler(void *userdata, vrpn_ANALOGCHANGEHANDLER handler)
vrpn_float64 * channels(void)
Exposes an array of values for the user to write into.
virtual void report(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY, const struct timeval time=vrpn_ANALOG_NOW)
Makes public the protected base class function.
virtual void mainloop()
For this server, the user must normally call report() or report_changes() directly....
vrpn_int32 setNumChannels(vrpn_int32 sizeRequested)
Sets the size of the array; returns the size actually set. (May be clamped to vrpn_CHANNEL_MAX) This ...
void mainloop()
Main loop to be called at every time step. Calls the mainloop() functions of the member servers.
void set_analog(vrpn_int32 analog_id, vrpn_int32 channel, vrpn_float64 val)
Set the value for the given channel of the given vrpn_Analog_Server.
vrpn_Android_Server(vrpn_int32 num_analogs, vrpn_int32 *analog_sizes, vrpn_int32 num_buttons, vrpn_int32 port)
Constructor. Takes an array of integers representing the number of channels for each analog server,...
void report_analog_chg(vrpn_int32 analog_id)
Called when changes are made to any of the analog values.
void set_button(vrpn_int32 button_id, vrpn_int32 state)
Set the value for the given button.
~vrpn_Android_Server()
Destructor.
virtual int register_change_handler(void *userdata, vrpn_BUTTONCHANGEHANDLER handler)
virtual void mainloop()
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
virtual void mainloop()
Called once each time through the server program's mainloop to handle various functions (like setting...
int set_button(int button, int new_value)
Allows the server program to set current button states (to 0 or 1)
virtual int mainloop(const struct timeval *timeout=NULL)=0
Call each time through program main loop to handle receiving any incoming messages and sending any pa...
vrpn_int32 num_channel
vrpn_float64 channel[vrpn_CHANNEL_MAX]
vrpn_int32 button
vrpn_int32 state
void VRPN_CALLBACK handle_analog(void *userdata, const vrpn_ANALOGCB a)
void VRPN_CALLBACK button_press(void *, const vrpn_BUTTONCB b)
Definition vrpn_Android.C:7
#define VRPN_CALLBACK
vrpn_Connection * vrpn_create_server_connection(const char *cname, const char *local_in_logfile_name, const char *local_out_logfile_name)
Create a server connection of arbitrary type (VRPN UDP/TCP, TCP, File, Loopback, MPI).