3 #if defined(VRPN_USE_JSONNET) 6 #ifdef VRPN_USE_WINSOCK2 12 #include <sys/socket.h> 14 #include <netinet/in.h> 16 #define INVALID_SOCKET -1 19 #include "json/json.h" 28 static const char*
const MSG_KEY_TYPE =
"type";
29 static const char*
const MSG_KEY_SEQUENCE_NUMBER =
"sn";
30 static const char*
const MSG_KEY_TIMESTAMP =
"ts";
32 static const char*
const MSG_KEY_TRACKER_ID =
"id";
33 static const char*
const MSG_KEY_TRACKER_QUAT =
"quat";
34 static const char*
const MSG_KEY_TRACKER_POS =
"pos";
36 static const char*
const MSG_KEY_BUTTON_ID =
"button";
37 static const char*
const MSG_KEY_BUTTON_STATUS =
"state";
39 static const char*
const MSG_KEY_ANALOG_CHANNEL =
"num";
40 static const char*
const MSG_KEY_ANALOG_DATA =
"data";
42 static const char*
const MSG_KEY_TEXT_DATA =
"data";
45 static const int MSG_TYPE_TRACKER = 1;
46 static const int MSG_TYPE_BUTTON = 2;
47 static const int MSG_TYPE_ANALOG = 3;
48 static const int MSG_TYPE_TEXT = 4;
50 vrpn_Tracker_JsonNet::vrpn_Tracker_JsonNet(
const char* name,
vrpn_Connection* c,
int udp_port) :
57 _do_tracker_report(false)
59 fprintf(stderr,
"vrpn_Tracker_JsonNet : Device %s listen on port udp port %d\n", name, udp_port);
60 if (! _network_init(udp_port)) {
69 _pJsonReader =
new Json::Reader();
72 vrpn_Tracker_JsonNet::~vrpn_Tracker_JsonNet(
void)
74 if (_pJsonReader != 0) {
82 void vrpn_Tracker_JsonNet::mainloop() {
91 const int timeout_us = 10 * 1000;
92 int received_length = _network_receive(_network_buffer, _NETWORK_BUFFER_SIZE, timeout_us);
94 if (received_length < 0) {
98 _network_buffer[received_length] =
'\0';
100 if (!_parse(_network_buffer, received_length)) {
111 if (d_connection && _do_tracker_report) {
118 _do_tracker_report =
false;
127 bool vrpn_Tracker_JsonNet::_parse(
const char* buffer,
int length) {
130 bool parsingSuccessful = _pJsonReader->parse( buffer, root ,
false);
131 if ( !parsingSuccessful ) {
133 fprintf(stderr,
"vrpn_Tracker_JsonNet parse error :%s\n",
134 _pJsonReader->getFormatedErrorMessages().c_str());
135 fprintf(stderr,
"%s\n",buffer);
139 const Json::Value& constRoot = root;
141 const Json::Value& type = constRoot[MSG_KEY_TYPE];
143 if (!type.empty() && type.isConvertibleTo(Json::intValue)) {
144 messageType = type.asInt();
147 fprintf(stderr,
"vrpn_Tracker_JsonNet parse error : missing message type\n");
150 switch (messageType) {
152 case MSG_TYPE_TRACKER:
153 return _parse_tracker_data(root);
155 case MSG_TYPE_BUTTON:
156 return _parse_button(root);
158 case MSG_TYPE_ANALOG:
159 return _parse_analog(root);
162 return _parse_text(root);
180 bool vrpn_Tracker_JsonNet::_parse_tracker_data(
const Json::Value& root) {
181 const Json::Value& constRoot = root;
184 const Json::Value& sensorId = constRoot[MSG_KEY_TRACKER_ID];
185 if (!sensorId.empty() && sensorId.isConvertibleTo(Json::intValue)){
186 this->d_sensor = sensorId.asInt();
196 const Json::Value& quatData = constRoot[MSG_KEY_TRACKER_QUAT];
197 if (!quatData.empty() && quatData.isArray() && quatData.size() == 4) {
198 this->d_quat[0] = quatData[0u].asDouble();
199 this->d_quat[1] = quatData[1].asDouble();
200 this->d_quat[2] = quatData[2].asDouble();
201 this->d_quat[3] = quatData[3].asDouble();
210 const Json::Value& posData = constRoot[MSG_KEY_TRACKER_POS];
211 if (!posData.empty() && posData.isArray() && posData.size() == 3) {
212 this->pos[0] = posData[0u].asDouble();
213 this->pos[1]= posData[1].asDouble();
214 this->pos[2]= posData[2].asDouble();
217 _do_tracker_report =
true;
229 bool vrpn_Tracker_JsonNet::_parse_text(
const Json::Value& root) {
230 const Json::Value& valueTextStatus = root[MSG_KEY_TEXT_DATA];
231 const char *msg =
"";
232 if (!valueTextStatus.empty() && valueTextStatus.isConvertibleTo(Json::stringValue)) {
236 fprintf(stderr,
"vrpn_Tracker_JsonNet::_parse_text parse error : missing text");
247 bool vrpn_Tracker_JsonNet::_parse_button(
const Json::Value& root) {
248 const Json::Value& valueButtonStatus = root[MSG_KEY_BUTTON_STATUS];
250 if (!valueButtonStatus.empty() && valueButtonStatus.isConvertibleTo(Json::booleanValue)) {
251 buttonStatus = valueButtonStatus.asBool();
253 fprintf(stderr,
"vrpn_Tracker_JsonNet::_parse_button parse error : missing status");
256 const Json::Value& valueButtonId = root[MSG_KEY_BUTTON_ID];
258 if (!valueButtonId.empty() && valueButtonId.isConvertibleTo(Json::intValue)) {
259 buttonId = valueButtonId.asInt();
261 fprintf(stderr,
"vrpn_Tracker_JsonNet::_parse_button parse error : missing id\n");
265 if (buttonId < 0 || buttonId > num_buttons) {
266 fprintf(stderr,
"invalid button Id %d (max : %d)\n", buttonId, num_buttons);
268 buttons[buttonId] = (int)buttonStatus;
283 bool vrpn_Tracker_JsonNet::_parse_analog(
const Json::Value& root) {
284 const Json::Value& valueData = root[MSG_KEY_ANALOG_DATA];
286 if (!valueData.empty() && valueData.isConvertibleTo(Json::realValue)) {
287 data = valueData.asDouble();
289 fprintf(stderr,
"vrpn_Tracker_JsonNet::_parse_analog parse error : missing status");
294 const Json::Value& channelNumberId = root[MSG_KEY_ANALOG_CHANNEL];
296 if (!channelNumberId.empty() && channelNumberId.isConvertibleTo(Json::intValue)) {
297 channelNumber = channelNumberId.asInt();
299 fprintf(stderr,
"vrpn_Tracker_JsonNet::_parse_analog parse error : missing id\n");
303 if (channelNumber < 0 || channelNumber >= num_channel) {
304 fprintf(stderr,
"vrpn_Tracker_JsonNet::_parse_analog id out of bounds %d/%d\n", channelNumber, num_channel);
306 channel[channelNumber] = data;
316 bool vrpn_Tracker_JsonNet::_network_init(
int udp_port) {
321 WORD versionRequested = MAKEWORD(2,2);
324 iResult = WSAStartup(versionRequested, &wsaData);
326 printf(
"WSAStartup failed with error: %d\n", iResult);
335 _socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
337 printf(
"socket failed with error: %ld\n", WSAGetLastError());
347 usock = socket(PF_INET, SOCK_DGRAM, 0);
355 struct sockaddr_in localSocketAddress;
356 localSocketAddress.sin_family = AF_INET;
357 localSocketAddress.sin_addr.s_addr = htonl(INADDR_ANY);
358 localSocketAddress.sin_port = htons(udp_port);
361 iResult = bind( _socket, (
struct sockaddr*)&localSocketAddress,
sizeof(localSocketAddress));
364 printf(
"bind failed with error: %d\n", WSAGetLastError());
366 printf(
"bind failed.");
387 int vrpn_Tracker_JsonNet::_network_receive(
void *buffer,
int maxlen,
int tout_us)
396 FD_SET(_socket, &
set);
398 tout.tv_sec = tout_us / 1000000;
399 tout.tv_usec = tout_us % 1000000;
401 switch((err = select(FD_SETSIZE, &
set, NULL, NULL, &tout))){
418 nbytes = recv(_socket, (
char *)buffer, maxlen, 0);
426 FD_SET(_socket, &
set);
431 if(select(FD_SETSIZE, &
set, NULL, NULL, &tout) != 1){
433 if(nbytes >= maxlen){
444 void vrpn_Tracker_JsonNet::_network_release() {
446 closesocket(_socket);
453 #endif // defined VRPN_USE_JSONNET const vrpn_uint32 vrpn_CONNECTION_LOW_LATENCY
virtual void report_changes(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY, const struct timeval time=vrpn_ANALOG_NOW)
Send a report only if something has changed (for servers) Optionally, tell what time to stamp the val...
Allows a user to send text messages from a device (usually,.
Generic connection class not specific to the transport mechanism.
virtual int encode_to(char *buf)
Header allowing use of a output stream-style method of sending text messages from devices...
#define vrpn_gettimeofday