void output_ws_handle_data(obd_data_t *obd) {
    if (!ws || ws->getReadyState() == WebSocket::CLOSED) {
        delete ws;
        res_init();
        ws = WebSocket::from_url(url);
        if (!ws)
            return;
    }

    // We forget endianess exists...
    std::vector<uint8_t> buf;
    uint8_t* start = reinterpret_cast<uint8_t*>(obd);
    // header that indicates type 1, which is telemetry
    buf.push_back(1);
    buf.insert(buf.end(), start, start + sizeof(obd_data_t));
    ws->sendBinary(buf);
    ws->poll();
    ws->dispatchBinary(handle_binary_message);
}
int main(int argc, char* argv[]) {

	using easywsclient::WebSocket;
	WebSocket::pointer ws = NULL;
	
	sixenseControllerData data;
	sixenseInit();
	
	int numctrl;

	while (!(numctrl = sixenseGetNumActiveControllers()))
		;

	std::ostringstream msgbuf;
	VRCom::Update* updateMsg = new VRCom::Update();
	VRCom::Hydra* msg = new VRCom::Hydra();
	updateMsg->set_allocated_hydra(msg);
	VRCom::Joystick* joy = new VRCom::Joystick();
	VRCom::Position* pos = new VRCom::Position();
	VRCom::Rotation* rot = new VRCom::Rotation();
	msg->set_allocated_pos(pos);
	msg->set_allocated_rot(rot);
	msg->set_allocated_joy(joy);

    // open the websocket server connection
    #ifdef _WIN32
    INT rc;
    WSADATA wsaData;

    rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (rc) {
      printf("WSAStartup Failed.\n");
      return 1;
    }
    #endif

    std::string websocketAddr = "ws://192.168.11.34:4567";

    if (argc > 1) {
    	websocketAddr = argv[1];
    }

    ws = WebSocket::from_url(websocketAddr);
    assert(ws);

	while(true) {
		for (int i = 0; i < numctrl; i++) {
			sixenseGetNewestData(i, &data);

			//std::cerr << "controller: " << i << std::endl;
			//std::cerr << "pos: " << data.pos[0] << ", " << data.pos[1] << ", " << data.pos[2] << std::endl;
			// std::cerr << "rot: " << data.rot_quat[0] << ", " << data.rot_quat[1] << ", " << data.rot_quat[2] << ", " << data.rot_quat[3] << std::endl;
			// std::cerr << "joystick: " << data.joystick_x << ", " << data.joystick_y << std::endl;
			// std::cerr << "trigger: " << data.trigger << std::endl;
			// std::cerr << "buttons: " << (data.buttons&SIXENSE_BUTTON_BUMPER) << " "
			// 						<< (data.buttons&SIXENSE_BUTTON_JOYSTICK) << " "
			// 						<< (data.buttons&SIXENSE_BUTTON_1) << " "
			// 						<< (data.buttons&SIXENSE_BUTTON_2) << " "
			// 						<< (data.buttons&SIXENSE_BUTTON_3) << " "
			// 						<< (data.buttons&SIXENSE_BUTTON_4) << " "
			// 						<< (data.buttons&SIXENSE_BUTTON_START) << std::endl;

			msg->set_ctrl_num(i);
			pos->set_x(data.pos[0]);
			pos->set_y(data.pos[1]);
			pos->set_z(data.pos[2]);
			rot->set_x(data.rot_quat[0]);
			rot->set_y(data.rot_quat[1]);
			rot->set_z(data.rot_quat[2]);
			rot->set_w(data.rot_quat[3]);
			joy->set_x(data.joystick_x);
			joy->set_y(data.joystick_y);
			msg->set_trigger(data.trigger);
			msg->set_buttons(data.buttons);

			updateMsg->SerializeToOstream(&msgbuf);
			ws->sendBinary(msgbuf.str());
			ws->poll();

			std::ostringstream().swap(msgbuf);
          	msgbuf.clear();

			std::this_thread::sleep_for(std::chrono::milliseconds(20));
			// msg.reset();
			//std::cerr << data.pos[0] << std::endl;
			//ws->send("5:1::{\"name\":\"hydra\",\"args\":\"bla\"}");
		
		}
	}

}