00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "ArExport.h"
00028 #include "ariaOSDef.h"
00029 #include "ArPriorityResolver.h"
00030 #include "ArAction.h"
00031 #include "ArRobot.h"
00032
00033 ArPriorityResolver::ArPriorityResolver() :
00034 ArResolver("ArPriorityResolver", "Resolves strictly by using priority, the highest priority action to act is the one that gets to go. Does no mixing of any variety.")
00035 {
00036
00037
00038 }
00039
00040
00041 ArPriorityResolver::~ArPriorityResolver()
00042 {
00043 }
00044
00045 ArActionDesired *ArPriorityResolver::resolve(
00046 ArResolver::ActionMap *actions, ArRobot *robot)
00047 {
00048 ArResolver::ActionMap::reverse_iterator it;
00049 ArAction *action;
00050 ArActionDesired *act;
00051 ArActionDesired averaging;
00052 bool first = true;
00053 int lastPriority;
00054
00055 if (actions == NULL)
00056 return NULL;
00057
00058 myActionDesired.reset();
00059 averaging.reset();
00060 averaging.startAverage();
00061 for (it = actions->rbegin(); it != actions->rend(); ++it)
00062 {
00063 action = (*it).second;
00064 if (action != NULL && action->isActive())
00065 {
00066 act = action->fire(myActionDesired);
00067 if (robot != NULL && act != NULL)
00068 act->accountForRobotHeading(robot->getTh());
00069 if (first || (*it).first != lastPriority)
00070 {
00071 averaging.endAverage();
00072 myActionDesired.merge(&averaging);
00073
00074 averaging.reset();
00075 averaging.startAverage();
00076 first = false;
00077 lastPriority = (*it).first;
00078 }
00079 averaging.addAverage(act);
00080 }
00081 }
00082 averaging.endAverage();
00083 myActionDesired.merge(&averaging);
00084
00085
00086
00087
00088
00089
00090 return &myActionDesired;
00091 }
00092
00093