Beispiel #1
0
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]);
}