示例#1
0
文件: sched.cpp 项目: viirya/mesos
    foreach (const TaskDescription& task, tasks) {
      // Keep only the slave PIDs where we run tasks so we can send
      // framework messages directly.
      savedSlavePids[task.slave_id()] = savedOffers[offerId][task.slave_id()];

      message.add_tasks()->MergeFrom(task);
    }
示例#2
0
void RandomQueueGenerator::createRandomApp(unsigned int numTasks) {
    Time now = Time::getCurrentTime();
    int a = getRandomAppLength() / numTasks;
    Duration alreadyExecuted(0.0);
    double r;
    Time endtime = now;
    TaskDescription description;
    description.setNumTasks(numTasks);
    description.setLength(a);
    // TODO: memory and disk
    if (currentTasks.empty()) {
        // Get a release date so that the first task is still executing
        currentrfirst = -a / currentPower;
        currentrfirst = tsum = r = getRandomReleaseDelta();
        alreadyExecuted -= Duration(r);
    } else {
        r = getRandomReleaseDelta();
        endtime = currentTasks.back()->getDescription().getDeadline();
    }
    Time creationTime = now + Duration(r);
    tsum += a * numTasks / currentPower;
    if (endtime < now + Duration(tsum))
        endtime = now + Duration(tsum);
    description.setDeadline(endtime + Duration(getRandomAppLength() / numTasks / currentPower));
    for (unsigned int taskid = 0; taskid < numTasks; ++taskid) {
        std::shared_ptr<TestTask> newTask(new TestTask(CommAddress(), appId, taskid, description, currentPower));
        newTask->setCreationTime(creationTime);
        currentTasks.push_back(newTask);
    }
    ++appId;
    std::static_pointer_cast<TestTask>(currentTasks.front())->execute(alreadyExecuted);
}
void MMPAvailabilityInformation::updateAvailability(const TaskDescription & req) {
    list<MDPTCluster *> clusters;
    getAvailability(clusters, req);
    for (list<MDPTCluster *>::iterator it = clusters.begin(); it != clusters.end(); it++)
        (*it)->maxT = stars::MaxParameter<Time, int64_t>(req.getDeadline());
    if (!clusters.empty() && queueRange.getMax() < req.getDeadline())
        queueRange.setMaximum(req.getDeadline());
}
TEST(ResourceOffersTest, TaskUsesNoResources)
{
  ASSERT_TRUE(GTEST_IS_THREADSAFE);

  PID<Master> master = local::launch(1, 2, 1 * Gigabyte, false);

  MockScheduler sched;
  MesosSchedulerDriver driver(&sched, "", DEFAULT_EXECUTOR_INFO, master);

  vector<Offer> offers;

  trigger resourceOffersCall;

  EXPECT_CALL(sched, registered(&driver, _))
    .Times(1);

  EXPECT_CALL(sched, resourceOffers(&driver, _))
    .WillOnce(DoAll(SaveArg<1>(&offers),
                    Trigger(&resourceOffersCall)))
    .WillRepeatedly(Return());

  driver.start();

  WAIT_UNTIL(resourceOffersCall);

  EXPECT_NE(0, offers.size());

  TaskDescription task;
  task.set_name("");
  task.mutable_task_id()->set_value("1");
  task.mutable_slave_id()->MergeFrom(offers[0].slave_id());

  vector<TaskDescription> tasks;
  tasks.push_back(task);

  TaskStatus status;

  trigger statusUpdateCall;

  EXPECT_CALL(sched, statusUpdate(&driver, _))
    .WillOnce(DoAll(SaveArg<1>(&status),
                    Trigger(&statusUpdateCall)));

  driver.launchTasks(offers[0].id(), tasks);

  WAIT_UNTIL(statusUpdateCall);

  EXPECT_EQ(task.task_id(), status.task_id());
  EXPECT_EQ(TASK_LOST, status.state());
  EXPECT_TRUE(status.has_message());
  EXPECT_EQ("Task uses no resources", status.message());

  driver.stop();
  driver.join();

  local::shutdown();
}
unsigned int MMPAvailabilityInformation::getAvailability(list<MDPTCluster *> & clusters, const TaskDescription & req) {
    unsigned int result = 0;
    Time now = Time::getCurrentTime();
    for (auto & c : summary) {
        Time start = now;
        if (c.maxT.getValue() > start) start = c.maxT.getValue();
        if (start < req.getDeadline() && c.fulfills(req)) {
            double time = (req.getDeadline() - start).seconds();
            unsigned long int length = req.getLength() ? req.getLength() : 1000;   // A minimum length
            unsigned long int t = (time * c.minP.getValue()) / length;
            if (t != 0) {
                clusters.push_back(&c);
                result += t;
            }
        }
    }
    return result;
}
示例#6
0
  virtual void launchTask(ExecutorDriver* driver, const TaskDescription& task)
  {
    cout << "Starting task " << task.task_id().value() << endl;

    TaskStatus status;
    status.mutable_task_id()->MergeFrom(task.task_id());
    status.set_state(TASK_RUNNING);

    driver->sendStatusUpdate(status);

    sleep(1);

    cout << "Finishing task " << task.task_id().value() << endl;

    status.mutable_task_id()->MergeFrom(task.task_id());
    status.set_state(TASK_FINISHED);

    driver->sendStatusUpdate(status);
  }
  virtual void resourceOffers(SchedulerDriver* driver,
                             const vector<Offer>& offers)
  {
    cout << "." << flush;
    vector<Offer>::const_iterator iterator = offers.begin();
    for (; iterator != offers.end(); ++iterator) {
      const Offer& offer = *iterator;

      // Lookup resources we care about.
      // TODO(benh): It would be nice to ultimately have some helper
      // functions for looking up resources.
      double cpus = 0;
      double mem = 0;

      for (int i = 0; i < offer.resources_size(); i++) {
        const Resource& resource = offer.resources(i);
        if (resource.name() == "cpus" &&
            resource.type() == Value::SCALAR) {
          cpus = resource.scalar().value();
        } else if (resource.name() == "mem" &&
                   resource.type() == Value::SCALAR) {
          mem = resource.scalar().value();
        }
      }

      // Launch tasks (only one per offer).
      vector<TaskDescription> tasks;
      if (cpus >= CPUS_PER_TASK && mem >= MEM_PER_TASK) {
        int taskId = tasksLaunched++;

        cout << "Starting task " << taskId << " on "
             << offer.hostname() << endl;

        TaskDescription task;
        task.set_name("Task " + lexical_cast<string>(taskId));
        task.mutable_task_id()->set_value(lexical_cast<string>(taskId));
        task.mutable_slave_id()->MergeFrom(offer.slave_id());

        Resource* resource;

        resource = task.add_resources();
        resource->set_name("cpus");
        resource->set_type(Value::SCALAR);
        resource->mutable_scalar()->set_value(CPUS_PER_TASK);

        resource = task.add_resources();
        resource->set_name("mem");
        resource->set_type(Value::SCALAR);
        resource->mutable_scalar()->set_value(MEM_PER_TASK);

        tasks.push_back(task);

        cpus -= CPUS_PER_TASK;
        mem -= MEM_PER_TASK;
      }

      driver->launchTasks(offer.id(), tasks);
    }
  }
  virtual void launchTask(ExecutorDriver* driver, const TaskDescription& task)
  {
    cout << "Executor starting task " << task.task_id().value() << endl;
    int64_t memToHog;
    double duration;
    int numThreads;
    istringstream in(task.data());
    in >> memToHog >> duration >> numThreads;
    memToHog *= 1024LL * 1024LL; // Convert from MB to bytes
    for (int i = 0; i < numThreads; i++) {
      ThreadArg* arg = new ThreadArg(this, task, i, memToHog, duration);
      pthread_t thread;
      pthread_create(&thread, 0, runTask, arg);
      pthread_detach(thread);

      TaskStatus status;
      status.mutable_task_id()->MergeFrom(task.task_id());
      status.set_state(TASK_RUNNING);

      driver->sendStatusUpdate(status);
    }
  }
示例#9
0
文件: convert.cpp 项目: viirya/mesos
jobject convert(JNIEnv* env, const TaskDescription& task)
{
    string data;
    task.SerializeToString(&data);

    // byte[] data = ..;
    jbyteArray jdata = env->NewByteArray(data.size());
    env->SetByteArrayRegion(jdata, 0, data.size(), (jbyte*) data.data());

    // TaskDescription task = TaskDescription.parseFrom(data);
    jclass clazz = FindMesosClass(env, "org/apache/mesos/Protos$TaskDescription");

    jmethodID parseFrom =
        env->GetStaticMethodID(clazz, "parseFrom",
                               "([B)Lorg/apache/mesos/Protos$TaskDescription;");

    jobject jtask = env->CallStaticObjectMethod(clazz, parseFrom, jdata);

    return jtask;
}
TEST(MasterTest, TaskRunning)
{
  ASSERT_TRUE(GTEST_IS_THREADSAFE);

  SimpleAllocator a;
  Master m(&a);
  PID<Master> master = process::spawn(&m);

  MockExecutor exec;

  trigger shutdownCall;

  EXPECT_CALL(exec, registered(_, _, _, _, _, _))
    .Times(1);

  EXPECT_CALL(exec, launchTask(_, _))
    .WillOnce(SendStatusUpdate(TASK_RUNNING));

  EXPECT_CALL(exec, shutdown(_))
    .WillOnce(Trigger(&shutdownCall));

  map<ExecutorID, Executor*> execs;
  execs[DEFAULT_EXECUTOR_ID] = &exec;

  TestingIsolationModule isolationModule(execs);

  Resources resources = Resources::parse("cpus:2;mem:1024");

  Slave s(resources, true, &isolationModule);
  PID<Slave> slave = process::spawn(&s);

  BasicMasterDetector detector(master, slave, true);

  MockScheduler sched;
  MesosSchedulerDriver driver(&sched, "", DEFAULT_EXECUTOR_INFO, master);

  vector<Offer> offers;
  TaskStatus status;

  trigger resourceOffersCall, statusUpdateCall, resourcesChangedCall;

  EXPECT_CALL(sched, registered(&driver, _))
    .Times(1);

  EXPECT_CALL(sched, resourceOffers(&driver, _))
    .WillOnce(DoAll(SaveArg<1>(&offers),
                    Trigger(&resourceOffersCall)))
    .WillRepeatedly(Return());

  EXPECT_CALL(sched, statusUpdate(&driver, _))
    .WillOnce(DoAll(SaveArg<1>(&status), Trigger(&statusUpdateCall)));

  driver.start();

  WAIT_UNTIL(resourceOffersCall);

  EXPECT_NE(0, offers.size());

  TaskDescription task;
  task.set_name("");
  task.mutable_task_id()->set_value("1");
  task.mutable_slave_id()->MergeFrom(offers[0].slave_id());
  task.mutable_resources()->MergeFrom(offers[0].resources());

  vector<TaskDescription> tasks;
  tasks.push_back(task);

  EXPECT_CALL(isolationModule,
              resourcesChanged(_, _, Resources(offers[0].resources())))
    .WillOnce(Trigger(&resourcesChangedCall));

  driver.launchTasks(offers[0].id(), tasks);

  WAIT_UNTIL(statusUpdateCall);

  EXPECT_EQ(TASK_RUNNING, status.state());

  WAIT_UNTIL(resourcesChangedCall);

  driver.stop();
  driver.join();

  WAIT_UNTIL(shutdownCall); // To ensure can deallocate MockExecutor.

  process::terminate(slave);
  process::wait(slave);

  process::terminate(master);
  process::wait(master);
}
TEST(MasterTest, FrameworkMessage)
{
  ASSERT_TRUE(GTEST_IS_THREADSAFE);

  SimpleAllocator a;
  Master m(&a);
  PID<Master> master = process::spawn(&m);

  MockExecutor exec;

  ExecutorDriver* execDriver;
  string execData;

  trigger execFrameworkMessageCall, shutdownCall;

  EXPECT_CALL(exec, registered(_, _, _, _, _, _))
    .WillOnce(SaveArg<0>(&execDriver));

  EXPECT_CALL(exec, launchTask(_, _))
    .WillOnce(SendStatusUpdate(TASK_RUNNING));

  EXPECT_CALL(exec, frameworkMessage(_, _))
    .WillOnce(DoAll(SaveArg<1>(&execData),
                    Trigger(&execFrameworkMessageCall)));

  EXPECT_CALL(exec, shutdown(_))
    .WillOnce(Trigger(&shutdownCall));

  map<ExecutorID, Executor*> execs;
  execs[DEFAULT_EXECUTOR_ID] = &exec;

  TestingIsolationModule isolationModule(execs);

  Resources resources = Resources::parse("cpus:2;mem:1024");

  Slave s(resources, true, &isolationModule);
  PID<Slave> slave = process::spawn(&s);

  BasicMasterDetector detector(master, slave, true);

  // Launch the first (i.e., failing) scheduler and wait until the
  // first status update message is sent to it (drop the message).

  MockScheduler sched;
  MesosSchedulerDriver schedDriver(&sched, "", DEFAULT_EXECUTOR_INFO, master);

  vector<Offer> offers;
  TaskStatus status;
  string schedData;

  trigger resourceOffersCall, statusUpdateCall, schedFrameworkMessageCall;

  EXPECT_CALL(sched, registered(&schedDriver, _))
    .Times(1);

  EXPECT_CALL(sched, resourceOffers(&schedDriver, _))
    .WillOnce(DoAll(SaveArg<1>(&offers),
                    Trigger(&resourceOffersCall)))
    .WillRepeatedly(Return());

  EXPECT_CALL(sched, statusUpdate(&schedDriver, _))
    .WillOnce(DoAll(SaveArg<1>(&status), Trigger(&statusUpdateCall)));

  EXPECT_CALL(sched, frameworkMessage(&schedDriver, _, _, _))
    .WillOnce(DoAll(SaveArg<3>(&schedData),
                    Trigger(&schedFrameworkMessageCall)));

  schedDriver.start();

  WAIT_UNTIL(resourceOffersCall);

  EXPECT_NE(0, offers.size());

  TaskDescription task;
  task.set_name("");
  task.mutable_task_id()->set_value("1");
  task.mutable_slave_id()->MergeFrom(offers[0].slave_id());
  task.mutable_resources()->MergeFrom(offers[0].resources());

  vector<TaskDescription> tasks;
  tasks.push_back(task);

  schedDriver.launchTasks(offers[0].id(), tasks);

  WAIT_UNTIL(statusUpdateCall);

  EXPECT_EQ(TASK_RUNNING, status.state());

  string hello = "hello";

  schedDriver.sendFrameworkMessage(offers[0].slave_id(),
				   DEFAULT_EXECUTOR_ID,
				   hello);

  WAIT_UNTIL(execFrameworkMessageCall);

  EXPECT_EQ(hello, execData);

  string reply = "reply";

  execDriver->sendFrameworkMessage(reply);

  WAIT_UNTIL(schedFrameworkMessageCall);

  EXPECT_EQ(reply, schedData);

  schedDriver.stop();
  schedDriver.join();

  WAIT_UNTIL(shutdownCall); // To ensure can deallocate MockExecutor.

  process::terminate(slave);
  process::wait(slave);

  process::terminate(master);
  process::wait(master);
}
TEST(ResourceOffersTest, ResourcesGetReofferedAfterTaskDescriptionError)
{
  ASSERT_TRUE(GTEST_IS_THREADSAFE);

  PID<Master> master = local::launch(1, 2, 1 * Gigabyte, false);

  MockScheduler sched1;
  MesosSchedulerDriver driver1(&sched1, "", DEFAULT_EXECUTOR_INFO, master);

  vector<Offer> offers;

  trigger sched1ResourceOffersCall;

  EXPECT_CALL(sched1, registered(&driver1, _))
    .Times(1);

  EXPECT_CALL(sched1, resourceOffers(&driver1, _))
    .WillOnce(DoAll(SaveArg<1>(&offers),
                    Trigger(&sched1ResourceOffersCall)))
    .WillRepeatedly(Return());

  driver1.start();

  WAIT_UNTIL(sched1ResourceOffersCall);

  EXPECT_NE(0, offers.size());

  TaskDescription task;
  task.set_name("");
  task.mutable_task_id()->set_value("1");
  task.mutable_slave_id()->MergeFrom(offers[0].slave_id());

  Resource* cpus = task.add_resources();
  cpus->set_name("cpus");
  cpus->set_type(Value::SCALAR);
  cpus->mutable_scalar()->set_value(0);

  Resource* mem = task.add_resources();
  mem->set_name("mem");
  mem->set_type(Value::SCALAR);
  mem->mutable_scalar()->set_value(1 * Gigabyte);

  vector<TaskDescription> tasks;
  tasks.push_back(task);

  TaskStatus status;

  trigger sched1StatusUpdateCall;

  EXPECT_CALL(sched1, statusUpdate(&driver1, _))
    .WillOnce(DoAll(SaveArg<1>(&status),
                    Trigger(&sched1StatusUpdateCall)));

  driver1.launchTasks(offers[0].id(), tasks);

  WAIT_UNTIL(sched1StatusUpdateCall);

  EXPECT_EQ(task.task_id(), status.task_id());
  EXPECT_EQ(TASK_LOST, status.state());
  EXPECT_TRUE(status.has_message());
  EXPECT_EQ("Task uses invalid resources", status.message());

  driver1.stop();
  driver1.join();

  MockScheduler sched2;
  MesosSchedulerDriver driver2(&sched2, "", DEFAULT_EXECUTOR_INFO, master);

  trigger sched2ResourceOffersCall;

  EXPECT_CALL(sched2, registered(&driver2, _))
    .Times(1);

  EXPECT_CALL(sched2, resourceOffers(&driver2, _))
    .WillOnce(Trigger(&sched2ResourceOffersCall))
    .WillRepeatedly(Return());

  EXPECT_CALL(sched2, offerRescinded(&driver2, _))
    .Times(AtMost(1));

  driver2.start();

  WAIT_UNTIL(sched2ResourceOffersCall);

  driver2.stop();
  driver2.join();

  local::shutdown();
}
示例#13
0
  virtual void resourceOffer(SchedulerDriver* driver,
                             const OfferID& offerId,
                             const vector<SlaveOffer>& offers)
  {
    time_t now = time(0);
    double curTime = difftime(now, startTime);
    vector<TaskDescription> toLaunch;
    vector<SlaveOffer>::const_iterator iterator = offers.begin();
    for (; iterator != offers.end(); ++iterator) {
      const SlaveOffer& offer = *iterator;
      // Lookup resources we care about.
      // TODO(benh): It would be nice to ultimately have some helper
      // functions for looking up resources.
      double cpus = 0;
      double mem = 0;

      for (int i = 0; i < offer.resources_size(); i++) {
        const Resource& resource = offer.resources(i);
        if (resource.name() == "cpus" &&
            resource.type() == Resource::SCALAR) {
          cpus = resource.scalar().value();
        } else if (resource.name() == "mem" &&
                   resource.type() == Resource::SCALAR) {
          mem = resource.scalar().value();
        }
      }

      // Launch tasks.
      if (tasksLaunched < tasks.size() &&
          cpus >= 1 &&
          curTime >= tasks[tasksLaunched].launchTime &&
          mem >= tasks[tasksLaunched].memToRequest)
      {
        int taskId = tasksLaunched++;

        cout << "Starting task " << taskId << " on "
             << offer.hostname() << endl;

        TaskDescription task;
        task.set_name("Task " + lexical_cast<string>(taskId));
        task.mutable_task_id()->set_value(lexical_cast<string>(taskId));
        task.mutable_slave_id()->MergeFrom(offer.slave_id());

        Resource* resource;

        resource = task.add_resources();
        resource->set_name("cpus");
        resource->set_type(Resource::SCALAR);
        resource->mutable_scalar()->set_value(1);

        resource = task.add_resources();
        resource->set_name("mem");
        resource->set_type(Resource::SCALAR);
        resource->mutable_scalar()->set_value(tasks[taskId].memToRequest);

        ostringstream data;
        data << tasks[taskId].memToHog << " " << tasks[taskId].duration
            << " " << threadsPerTask;
        task.set_data(data.str());

        toLaunch.push_back(task);
      }
    }

    driver->replyToOffer(offerId, toLaunch);
  }
示例#14
0
//-------------------------------------
bool BatchFile::Process()
{
   static const char lEndOfRecord = '#';
   static const int lLineLength = 256;

  bool   lOK = true;

///  ARTHUR - commented due to string stream incompatability
//	 Jtk - uncommented to bring back batch file functionality.
//   type cast the strings to (char*) which appeared to solve 
//	 the string stream incompatibility
   //attempt to open input file
   
  ifstream   lInFile( mInFileName.c_str(), ios::in );
   if( ! lInFile.is_open() )
   {
      AfxMessageBox( "Unable to open batch input file." );
      return   false;
   }

   //make sure this is a batch file
   string   lLine;//( lLineLength, "", ' ' );
   lInFile >> lLine;
   //lInFile.getline( (char*)lLine, lLineLength, lEndOfRecord );
   
 // JTK - Removed simplying setting lCommandName = lLine appears to work
 /*  strstream   lCore;
   lCore << lLine << endl;*/
   string   lCommandName;//( 20, "", ' ' );
// JTK - Removed because strstream no longer exists   
//   lCore >> (char*)lCommandName;
   lCommandName = lLine;		// added because of the removal of strstream
   // allow no space so we don't break peoples' workarounds
   if(lCommandName != "3DSSPPBATCHFILE#") {
	if(mCommands.find(lCommandName) == mCommands.end() ||
		mCommands[lCommandName] != bch3DSSPPBatchFile) {
			AfxMessageBox("Batch file header missing. \nFile must begin with '3DSSPPBATCHFILE #'.");
			lInFile.close();
			return false;
	}
	
		// make sure there's a # next
		lInFile >> lLine;
		if(lLine != "#") {
			AfxMessageBox("Batch file header missing. \nFile must begin with '3DSSPPBATCHFILE #'.");
			lInFile.close();
			return false;
		}
   }
   //cMapType::iterator   lIt = mCommands.find( lCommandName );
/*
   if(lIt != mCommands.end()) //match found
   {
      switch((*lIt).second)
      {
         case bch3DSSPPBatchFile :
         {
            //Header found as first command. OK to proceed.
            break;
         }
         default:
         {
            AfxMessageBox( "Batch file header missing. \nFile must begin with '3DSSPPBATCHFILE #'." );
            lInFile.close();
            return false;
         }
      }
   }
   else //match not found
   {
      AfxMessageBox( "3DSSPP batch file header missing. This is not a valid 3DSSPP batch file." );
	  lInFile.close();     
	  return false;      
   }*/
   
   //attempt to open export file
   
   fstream lExportFile(mExportFileName.c_str(), ios::in | ios::out | ios::trunc | ios::ate ); 
   if(!lExportFile.is_open())
   {
      AfxMessageBox( "Unable to open batch export file." );
      lInFile.close();
      return false;
   }
   
   //attempt to open log file
   
   ofstream lLogFile(mLogFileName.c_str()); 
   if(!lLogFile.is_open())
   {
      AfxMessageBox("Unable to open batch log file.");
      lInFile.close();
      lExportFile.close();
      return false;
   }

   // prepare the progress dialog

   mProgressDialog.Create(IDD_BATCHFILE);
   mProgressDialog.ShowWindow(SW_SHOWNORMAL);
   
   // repeatedly get and decode lines

   int lRecordNumber = 1;
   bool lFirstCommand = true;
   
   while(lInFile.peek() != EOF)
   {
      //Get line

      string   lLine;//( lLineLength, "", ' ' );
      //lInFile.getline( (char*)lLine, lLineLength, lEndOfRecord );
	  lInFile >> lLine;
      
      //strstream   lCore;
      //lCore << lLine << ends;
      
      //Get the command name

      //String   lCommandName( 20, "", ' ' );
      //lCore >> (char*)lCommandName;
	  string lCommandName = lLine;
      
      cMapType::iterator   lIt = mCommands.find( lCommandName );
      
      if( lIt != mCommands.end() ) //match found
      {
         switch( (*lIt).second )
         {
            case bchDescription :
            {
               TaskDescription   lTaskDescription;
               lInFile >> lTaskDescription;
               if( lTaskDescription.Error() )
               {
                  LogError( lLogFile, lRecordNumber, "TaskDescription", (char*)lTaskDescription.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
                  mDocPtr->SetDescription( lTaskDescription );
                  //NOTE: Task description does not trigger automatic export.
               }
               break;
            }
            
            case bchAnthropomentry :
			{
                Anthropometry   lAnthropometry;
			    lInFile >> lAnthropometry;
                if( lAnthropometry.Error() ) {
                    LogError( lLogFile, lRecordNumber, "Anthropometry", (char*)lAnthropometry.LastErrorMessage() );
                    lOK = false;
                } else {
                    mDocPtr->setAnthropometry( lAnthropometry );
					mDocPtr->MakeDirtyAndUpdateViews(true);
                    if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
                }
               break;
            }
            
            case bchJointAngles :
            {
     //          JointAngles lJointAngles;
     //          lInFile >> lJointAngles;
			  // if(! lJointAngles.Validate() ) 
     //          {
     //             LogError( lLogFile, lRecordNumber, "JointAngles", lJointAngles.getLastError().c_str() );
     //             lOK = false;
     //          }
     //          else
     //          {
					//// make the frame a keyframe if it is currently unset
					//// TODO make keyframe as long as it is not a keyframe?
					//if(mDocPtr->getFrameType() == FT_Unset) {
					//	mDocPtr->setFrameType(FT_Keyframe);
					//}

					//// Put the joint angles and clear the undoing queue
     //               mDocPtr->clearUndoHistory();
     //               mDocPtr->GetSkeleton()->SetAngles(lJointAngles);
					//mDocPtr->MakeDirtyAndUpdateViews(true);

					//if (mAutoExport)
					//	mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND);
     //          }
     //          break;
				AfxMessageBox(_T("JOI not supported in 7.00 and later version."), MB_OK | MB_ICONSTOP);
            }

			case bchJointAnglesWithLegs :
			{
				//no longer needed in 7.0.0

				//JointAngles lJointAngles;
				//// don't user operator when we're reading in with the leg angles
				//// we should actually get rid of the operator then, or have a better
				//// versioning system
				////lInFile >> lJointAngles;
				//lJointAngles.ReadBatchFileWithLegs(lInFile);
				//if(! lJointAngles.Validate() )
				//{
				//	LogError(lLogFile, lRecordNumber, "JointAngles", lJointAngles.getLastError().c_str());
				//	lOK = false;
				//}
				//else
				//{
				//	// make the frame a keyframe if it is currently unset
				//	// TODO make keyframe as long as it is not a keyframe?
				//	if(mDocPtr->getFrameType() == FT_Unset) {
				//		mDocPtr->setFrameType(FT_Keyframe);
				//	}

				//	// Put the joint angles and clear the undoing queue
				//	mDocPtr->clearUndoHistory();
				//	mDocPtr->GetSkeleton()->SetAngles(lJointAngles);
				//	mDocPtr->MakeDirtyAndUpdateViews(true);

				//	if(mAutoExport)
				//		mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND);
				//}
				//break;
				AfxMessageBox(_T("JO6 not supported in 7.00 and later version."), MB_OK | MB_ICONSTOP);
			}

			case bchJointAnglesAll :
			{
				JointAngles lJointAngles;
				// don't user operator when we're reading in with the leg angles
				// we should actually get rid of the operator then, or have a better
				// versioning system
				//lInFile >> lJointAngles;
				lJointAngles.ReadBatchFileAll(lInFile);
				/*if(! lJointAngles.Validate() )
				{
					LogError(lLogFile, lRecordNumber, "JointAngles", lJointAngles.getLastError().c_str());
					lOK = false;
				}
				else*/
				{
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}

					// Put the joint angles and clear the undoing queue
					mDocPtr->clearUndoHistory();
					mDocPtr->GetSkeleton()->SetAngles(lJointAngles);
					mDocPtr->MakeDirtyAndUpdateViews(true);

					if(mAutoExport)
						mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND);
				}
				break;
			}
            
            case bchHandLoads :
            {
               HandLoads   lHandLoads;
               lInFile >> lHandLoads;
               if(lHandLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "HandLoads", (char*)lHandLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {

				   mDocPtr->GetSkeleton()->setExtForce(JT_LHAND, lHandLoads.GetLForceVector());
				   mDocPtr->GetSkeleton()->setExtForce(JT_RHAND, lHandLoads.GetRForceVector());

					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }
			// for hand component load
			case bchLeftHandComponentLoad :
            {
               HandLoads   lHandLoads;
               lInFile >> lHandLoads;
               if(lHandLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "HandComponentLoads", (char*)lHandLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   Vector3 leftForceVec;
				   leftForceVec[0] = lHandLoads.LeftMagnitude();
				   leftForceVec[1] = lHandLoads.LeftVerticalAngle();
				   leftForceVec[2] = lHandLoads.LeftHorizontalAngle();
				   Vector3 leftTorqueVec;
				   leftTorqueVec[0] = lHandLoads.RightMagnitude();
				   leftTorqueVec[1] = lHandLoads.RightVerticalAngle();
				   leftTorqueVec[2] = lHandLoads.RightHorizontalAngle();
				   mDocPtr->GetSkeleton()->setExtForce(JT_LHAND, leftForceVec);
				   mDocPtr->GetSkeleton()->setExtTorque(JT_LHAND, leftTorqueVec);

					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }
			case bchRightHandComponentLoad :
            {
               HandLoads   lHandLoads;
               lInFile >> lHandLoads;
               if(lHandLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "HandComponentLoads", (char*)lHandLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   Vector3 rightForceVec;
				   rightForceVec[0] = lHandLoads.LeftMagnitude();
				   rightForceVec[1] = lHandLoads.LeftVerticalAngle();
				   rightForceVec[2] = lHandLoads.LeftHorizontalAngle();
				   Vector3 rightTorqueVec;
				   rightTorqueVec[0] = lHandLoads.RightMagnitude();
				   rightTorqueVec[1] = lHandLoads.RightVerticalAngle();
				   rightTorqueVec[2] = lHandLoads.RightHorizontalAngle();
				   mDocPtr->GetSkeleton()->setExtForce(JT_RHAND, rightForceVec);
				   mDocPtr->GetSkeleton()->setExtTorque(JT_RHAND, rightTorqueVec);

					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			//for multi-joint load
			case bchexternala:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[0],lJointLoads.GetForceVector());
						skel.setExtTorque(order[0],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalb:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[1],lJointLoads.GetForceVector());
						skel.setExtTorque(order[1],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalc:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[2],lJointLoads.GetForceVector());
						skel.setExtTorque(order[2],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternald:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[3],lJointLoads.GetForceVector());
						skel.setExtTorque(order[3],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternale:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[4],lJointLoads.GetForceVector());
						skel.setExtTorque(order[4],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalf:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[5],lJointLoads.GetForceVector());
						skel.setExtTorque(order[5],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalg:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[6],lJointLoads.GetForceVector());
						skel.setExtTorque(order[6],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalh:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[7],lJointLoads.GetForceVector());
						skel.setExtTorque(order[7],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternali:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[8],lJointLoads.GetForceVector());
						skel.setExtTorque(order[8],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalj:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[9],lJointLoads.GetForceVector());
						skel.setExtTorque(order[9],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalk:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[10],lJointLoads.GetForceVector());
						skel.setExtTorque(order[10],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternall:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[14] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE, JT_RWRIST, JT_LWRIST,JT_TRAGION};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[11],lJointLoads.GetForceVector());
						skel.setExtTorque(order[11],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalm:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[14] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
					   JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE, JT_RWRIST, JT_LWRIST, JT_TRAGION};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[12],lJointLoads.GetForceVector());
						skel.setExtTorque(order[12],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }
			case bchexternaln:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[14] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
					   JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE, JT_RWRIST, JT_LWRIST, JT_TRAGION};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[13],lJointLoads.GetForceVector());
						skel.setExtTorque(order[13],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchSupport : 
			{
				Support_s tempsupport;
				InputAuxiliary inputcheck; //input checking class
				string temp; //temp string for the input
				int feetSupport, position; //temp int value for enum to support read
				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), 0,3))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input feetsupport must be an integer from 0 to 3 \n"));
					lOK = false;
					break;
				}
				feetSupport = inputcheck.StringtoInt(temp);
				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), 0,1))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input position must be an integer from 0 to 1 \n"));
					lOK = false;
					break;
				}
				position = (bool)inputcheck.StringtoInt(temp);
				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), 0,1))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input frontSeatPanSuppor must be an integer from 0 to 1 \n"));
					lOK = false;
					break;
				}
				tempsupport.frontSeatPanSupport = (bool)inputcheck.StringtoInt(temp);
				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), 0,1))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input seatHasBackRest must be an integer from 0 to 1 \n"));
					lOK = false;
					break;
				}
				tempsupport.seatHasBackRest = (bool)inputcheck.StringtoInt(temp);
				
				lInFile >> temp; 
				if (!inputcheck.isDouble(temp) | !inputcheck.CheckLowBound(inputcheck.StringtoDouble(temp), 19.05))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input backRestCenterHeight must be a number and it is bigger than 19.05 \n"));
					lOK = false;
					break;
				}
				tempsupport.backRestCenterHeight = inputcheck.StringtoDouble(temp);

				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), -360,360))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input additionalPelvicTilt must be an integer from -360 to 360 \n"));
					lOK = false;
					break;
				}
				tempsupport.additionalPelvicTilt = inputcheck.StringtoInt(temp);

				tempsupport.feetSupport = FeetSupport_e(feetSupport);
				tempsupport.position = Position_e(position);

				//The following two line is due to the coodinate changing. 
				tempsupport.additionalPelvicTilt = tempsupport.additionalPelvicTilt;
				tempsupport.displayAdditionalPelvicTilt = tempsupport.additionalPelvicTilt;

				if(lInFile.fail()) {
					LogError(lLogFile, lRecordNumber, "Support Selection", string("Support Selection parameters must be FeetSupport, Position, FrontSeatPanSupport,seatHasBackRest, backRestCenterHeight. additionalPelvicTilt, displayAdditionalPelvicTilt \n"));
					lOK = false;
				}
				else if (position && (feetSupport ==1|feetSupport ==2)){
					LogError(lLogFile, lRecordNumber, "Support Selection", string("Two feet must be both on or not on the ground if seated \n"));
					lOK = false;
				}
				else if (!position && (feetSupport == 3)){
					LogError(lLogFile, lRecordNumber, "Support Selection", string("Either or both feet needs to be on the ground if standing \n"));
					lOK = false;
				}
				else if (tempsupport.frontSeatPanSupport && (feetSupport !=3)){
					LogError(lLogFile, lRecordNumber, "Support Selection", string("No frontPan is allowed \n"));
					lOK = false;
				}

				else {

					mDocPtr->setSupport(tempsupport);
					mDocPtr->MakeDirtyAndUpdateViews(true); 
				}
				break;
				
			}
            case bchComment :
            {
               //do nothing
               break;
            }
            
            case bchExport :
            {
               mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND);  
               break;
            }
            
            case bchAutoExport :
            {
               int   lAutoExport;
               lInFile >> lAutoExport;
               if( ! lInFile.fail() )
               {
				   if (lAutoExport)
					   mAutoExport = true;
				   else 
					   mAutoExport = false;
                  
               }
               else
               {
                  string   lMsg( "Value not 0 (false) or 1 (true)." );
                  LogError( lLogFile, lRecordNumber, "AutoExport", lMsg );
                  lOK = false;                  
               }
               break;
            }
			
			case bchPause :
			{
				int pauseTime;
				string temp; //temp string for the input
				lInFile >> temp;
				InputAuxiliary inputcheck; //input checking class
				if (!inputcheck.isInteger(temp))
				{	
					LogError(lLogFile, lRecordNumber, "Pause", string("Must enter a positive integer number of milliseconds to pause, or 0 to be prompted to resume"));
					lOK = false;
					break;
				}
				pauseTime = inputcheck.StringtoInt(temp);

				if( ! lInFile.fail() && pauseTime >= 0) {
					//mDocPtr->RedrawViews();
					mDocPtr->UpdateViews();
					if(pauseTime == 0) {
						AfxMessageBox("Batch file processing paused. Press OK to continue", MB_OK);
					} else {
						Sleep(pauseTime);
					}
				} else {
					LogError( lLogFile, lRecordNumber, "Pause", string("Must enter a positive integer number of milliseconds to pause, or 0 to be prompted to resume"));
					lOK = false;
				}
				break;
			}

			case bchFrameChange:
			{
				string firstParam;
				lInFile >> firstParam;
				if(lInFile.fail()) {
					LogError(lLogFile, lRecordNumber, "Frame", string("Frame command parameters must be + <num> | - <num> | FIRST | LAST | <num>"));
					lOK = false;
				} else {
					// Go to first frame
					if(firstParam == "FIRST") {
						mDocPtr->setCurrentFrame(0);
					} else
					// Go to last frame
					if(firstParam == "LAST") {
						mDocPtr->setCurrentFrame(mDocPtr->getLastFrame());
					} else
					// Advance a number of frames
					if(firstParam == "+") {
						// read number of frames
						int numFrames;
						lInFile >> numFrames;
						if(lInFile.fail()) {
							LogError(lLogFile, lRecordNumber, "Frame", string("Frame command parameters must be + <num> | - <num> | FIRST | LAST | <num>"));
							lOK = false;
						} else {
							mDocPtr->setCurrentFrame(mDocPtr->getCurrentFrame() + numFrames);
						}
					} else
					// Rewind a number of frames
					if(firstParam == "-") {
						// read number of frames
						int numFrames;
						lInFile >> numFrames;
						if(lInFile.fail()) {
							LogError(lLogFile, lRecordNumber, "Frame", string("Frame command parameters must be + <num> | - <num> | FIRST | LAST | <num>"));
							lOK = false;
						} else {
							mDocPtr->setCurrentFrame(mDocPtr->getCurrentFrame() - numFrames);
						}
					} else {
						// Go to numbered frame
						int frameNumber = atoi(firstParam.c_str());
						mDocPtr->setCurrentFrame(frameNumber);
					}
				}
				// update views after frame change
				mDocPtr->UpdateViews();
				break;
			}
示例#15
0
TEST(MasterTest, ResourcesReofferedAfterBadResponse)
{
  ASSERT_TRUE(GTEST_IS_THREADSAFE);

  PID<Master> master = local::launch(1, 2, 1 * Gigabyte, false, false);

  MockScheduler sched1;
  MesosSchedulerDriver driver1(&sched1, master);

  OfferID offerId;
  vector<SlaveOffer> offers;

  trigger sched1ResourceOfferCall;

  EXPECT_CALL(sched1, getFrameworkName(&driver1))
    .WillOnce(Return(""));

  EXPECT_CALL(sched1, getExecutorInfo(&driver1))
    .WillOnce(Return(DEFAULT_EXECUTOR_INFO));

  EXPECT_CALL(sched1, registered(&driver1, _))
    .Times(1);

  EXPECT_CALL(sched1, resourceOffer(&driver1, _, ElementsAre(_)))
    .WillOnce(DoAll(SaveArg<1>(&offerId), SaveArg<2>(&offers),
                    Trigger(&sched1ResourceOfferCall)))
    .WillRepeatedly(Return());

  driver1.start();

  WAIT_UNTIL(sched1ResourceOfferCall);

  EXPECT_NE(0, offers.size());

  TaskDescription task;
  task.set_name("");
  task.mutable_task_id()->set_value("1");
  task.mutable_slave_id()->MergeFrom(offers[0].slave_id());

  Resource* cpus = task.add_resources();
  cpus->set_name("cpus");
  cpus->set_type(Resource::SCALAR);
  cpus->mutable_scalar()->set_value(0);

  Resource* mem = task.add_resources();
  mem->set_name("mem");
  mem->set_type(Resource::SCALAR);
  mem->mutable_scalar()->set_value(1 * Gigabyte);

  vector<TaskDescription> tasks;
  tasks.push_back(task);

  trigger sched1ErrorCall;

  EXPECT_CALL(sched1,
              error(&driver1, _, "Invalid resources for task"))
    .WillOnce(Trigger(&sched1ErrorCall));

  EXPECT_CALL(sched1, offerRescinded(&driver1, offerId))
    .Times(AtMost(1));

  driver1.replyToOffer(offerId, tasks);

  WAIT_UNTIL(sched1ErrorCall);

  driver1.stop();
  driver1.join();

  MockScheduler sched2;
  MesosSchedulerDriver driver2(&sched2, master);

  trigger sched2ResourceOfferCall;

  EXPECT_CALL(sched2, getFrameworkName(&driver2))
    .WillOnce(Return(""));

  EXPECT_CALL(sched2, getExecutorInfo(&driver2))
    .WillOnce(Return(DEFAULT_EXECUTOR_INFO));

  EXPECT_CALL(sched2, registered(&driver2, _))
    .Times(1);

  EXPECT_CALL(sched2, resourceOffer(&driver2, _, _))
    .WillOnce(Trigger(&sched2ResourceOfferCall))
    .WillRepeatedly(Return());

  EXPECT_CALL(sched2, offerRescinded(&driver2, _))
    .Times(AtMost(1));

  driver2.start();

  WAIT_UNTIL(sched2ResourceOfferCall);

  driver2.stop();
  driver2.join();

  local::shutdown();
}