00001
00016 #ifdef WITH_ENERGY_MANAGEMENT
00017
00018 #include <controllers/energyControllers/defaultEnergyController.h>
00019
00020 DefaultEnergyControl::DefaultEnergyControl() {
00021 energyTimer = time(NULL);
00022 otherRobotEnergyTimer = time(NULL);
00023 robotEnergy = 1;
00024 otherRobotEnergy = 1;
00025 powerTime = 60;
00026 otherRobotPowerTime = 120;
00027 }
00028
00029
00030
00031
00032
00033
00034
00035 int DefaultEnergyControl::energyAtPos(bool interact)
00036 {
00037 osg::Vec3 trans = getRobotPosition();
00038 int radius = 5;
00039 int socketX = 21;
00040 int socketY = 0;
00041 int socketX1 = 21;
00042 int socketY1 = -3;
00043 int socketX2 = -10;
00044 int socketY2 = 38;
00045 int returnValue = 0;
00046 int socketEnergyTime = 360;
00047
00048 if(trans[0] <= socketX+radius && trans[0] >= socketX-radius && trans[1] <= socketY+radius && trans[1] >= socketY-radius)
00049 {
00050 if(interact)
00051 robotEnergy = 2;
00052 returnValue = 2;
00053 cout << "Got energy!!" << endl;
00054 energyTimer = time(NULL);
00055 powerTime = socketEnergyTime;
00056 experiment.setGotSocketEnergy();
00057 }
00058
00059 else if(trans[0] <= socketX1+radius && trans[0] >= socketX1-radius && trans[1] <= socketY1+radius && trans[1] >= socketY1-radius)
00060 {
00061 if(interact)
00062 robotEnergy = 2;
00063 returnValue = 2;
00064 cout << "Got energy!!" << endl;
00065 energyTimer = time(NULL);
00066 powerTime = socketEnergyTime;
00067 experiment.setGotSocketEnergy();
00068 }
00069
00070 else if(trans[0] <= socketX2+radius && trans[0] >= socketX2-radius && trans[1] <= socketY2+radius && trans[1] >= socketY2-radius)
00071 {
00072 if(interact)
00073 robotEnergy = 2;
00074 returnValue = 2;
00075 cout << "Got energy!!" << endl;
00076 energyTimer = time(NULL);
00077 powerTime = socketEnergyTime;
00078 experiment.setGotSocketEnergy();
00079 }
00080 int otherObcjectX = -19;
00081 int otherObjectY = 0;
00082
00083 if(trans[0] <= otherObcjectX+(radius+2) && trans[0] >= otherObcjectX-(radius+2) && trans[1] <= otherObjectY+(radius+2) && trans[1] >= otherObjectY-(radius+2))
00084 {
00085 experiment.setGotWrongObject(robotEnergy);
00086 }
00087
00088
00089 int robotX = 0;
00090 int robotY = 0;
00091 if(trans[0] <= robotX+radius && trans[0] >= robotX-radius && trans[1] <= robotY+radius && trans[1] >= robotY-radius)
00092 {
00093 returnValue = otherRobotEnergy;
00094 if(interact)
00095 {
00096 if(robotEnergy == 1 && otherRobotEnergy == 2)
00097 {
00098
00099 robotEnergy = 2;
00100 sendGlobalMessage("energy=1");
00101 cout << "Got energy!!" << endl;
00102 energyTimer = time(NULL);
00103 powerTime = otherRobotPowerTime;
00104 experiment.setGotRobotEnergy();
00105 }
00106 else if(robotEnergy == 2 && otherRobotEnergy == 1)
00107 {
00108 otherRobotEnergy = 2;
00109 otherRobotEnergyTimer = time(NULL);
00110 energyTimer = time(NULL);
00111 powerTime = otherRobotPowerTime;
00112 sendGlobalMessage("energy=2");
00113 cout << "Gave energy!!" << endl;
00114 experiment.setGaveRobotEnergy();
00115 }
00116 }
00117
00118 }
00119 return returnValue;
00120 }
00121
00122 void DefaultEnergyController::robotEnergyTimer()
00123 {
00124 if((time(NULL) - energyTimer) >= powerTime)
00125 robotEnergy = 1;
00126 if(time(NULL) - otherRobotEnergyTimer >= otherRobotPowerTime)
00127 otherRobotEnergy = 1;
00128 }
00129
00130 #endif