void controller::update() { if ((m_active == true) && (m_inhibit == false)) { adjust(m_current_delta); } dampen(); }
static void tdx_drv_handler(io_connect_t connection, natural_t messageType, void *messageArgument) { static double normalizer = 500.0; static int minAxisValue = 1; static ConnexionDeviceState lastState; ConnexionDeviceStatePtr state = (ConnexionDeviceStatePtr)messageArgument; ossimPlanetInteractionController* iac = ossimPlanetInteractionController::instance(); switch(messageType) { case kConnexionMsgDeviceState: // std::cout << "client = " << state->client << std::endl; // std::cout << "myclient = " << gDevWrapperInfo.clientID << std::endl; /* Device state messages are broadcast to all clients. It is up to * the client to figure out if the message is meant for them. This * is done by comparing the "client" id sent in the message to our * assigned id when the connection to the driver was established. * * There is a special mode wherein all events are sent to this * client regardless if it was meant for it or not. This mode is * determined by the showClientEventOnly flag. */ if (!gDevWrapperInfo.showClientEventsOnly || state->client == gDevWrapperInfo.clientID) { switch (state->command) { case kConnexionCmdHandleAxis: { if((std::abs(state->axis[0]) <= minAxisValue)&& (std::abs(state->axis[1]) <= minAxisValue)) { if((std::abs(lastState.axis[0]) > minAxisValue)|| (std::abs(lastState.axis[1]) > minAxisValue)) { iac->updateInteractionValuators("axis0", 0.0); iac->updateInteractionValuators("axis1", 0.0); ossimPlanetAction(":navigator rotatestop").execute(); } } else { if((std::abs(lastState.axis[0]) <= minAxisValue)&& (std::abs(lastState.axis[1]) <= minAxisValue)) { iac->updateInteractionValuators("axis0", 0.0); iac->updateInteractionValuators("axis1", 0.0); ossimPlanetAction(":navigator rotatestart").execute(); } } // now do axis z if(std::abs(state->axis[2]) <= minAxisValue) { if(std::abs(lastState.axis[2])> minAxisValue) { iac->updateInteractionValuators("axis2", 0.0); ossimPlanetAction(":navigator loszoomstop").execute(); } } else { if(std::abs(lastState.axis[2]) <= minAxisValue) { iac->updateInteractionValuators("axis2", 0.0); ossimPlanetAction(":navigator loszoomstart").execute(); } } // now handle yaw and pitch that are associate to losrotatestart if((std::abs(state->axis[3]) <= minAxisValue)&& (std::abs(state->axis[5]) <= minAxisValue)) { if((std::abs(lastState.axis[3]) > minAxisValue)|| (std::abs(lastState.axis[5]) > minAxisValue)) { iac->updateInteractionValuators("axis3", 0.0); iac->updateInteractionValuators("axis5", 0.0); ossimPlanetAction(":navigator losrotatestop").execute(); } } else { if((std::abs(lastState.axis[3]) < minAxisValue)&& (std::abs(lastState.axis[5]) < minAxisValue)) { iac->updateInteractionValuators("axis3", 0.0); iac->updateInteractionValuators("axis5", 0.0); ossimPlanetAction(":navigator losrotatestart").execute(); } } iac->updateInteractionValuators("axis0", dampen(state->axis[0]/normalizer)); iac->updateInteractionValuators("axis1", dampen(state->axis[1]/normalizer)); iac->updateInteractionValuators("axis2", dampen(state->axis[2]/normalizer)); iac->updateInteractionValuators("axis3", dampen(state->axis[3]/normalizer)); iac->updateInteractionValuators("axis5", dampen(state->axis[5]/normalizer)); break; } case kConnexionCmdHandleButtons: { break; } default: break; } /* switch */ } BlockMoveData(state, &lastState, (long)sizeof(ConnexionDeviceState)); break; default: /* other messageTypes can happen and should be ignored */ break; } /* printf("connection: %X\n", connection); printf("messageType: %X\n", messageType); printf("version: %d\n", msg->version); printf("front app client: %d ourID: %d\n", msg->client, gDevWrapperInfo.clientID); printf("command: %u\n", msg->command); printf("value: %ld\n", msg->value); printf("param: %hd\n", msg->param); for (int i=0; i<8; i++) printf("report[%d]: %d\n", i, msg->report[i]); printf("buttons: %d\n", msg->buttons); printf("TX: %d\n", msg->axis[0]); printf("TY: %d\n", msg->axis[1]); printf("TZ: %d\n", msg->axis[2]); printf("RX: %d\n", msg->axis[3]); printf("RY: %d\n", msg->axis[4]); printf("RZ: %d\n", msg->axis[5]); printf("-----------------------------------------\n\n"); */ // printf("TX: %d\n", state->axis[0]); // printf("TY: %d\n", state->axis[1]); // printf("TZ: %d\n", state->axis[2]); // printf("RX: %d\n", state->axis[3]); // printf("RY: %d\n", state->axis[4]); // printf("RZ: %d\n", state->axis[5]); }