00001
00002
00003
00004
00005
00006
00007 #include "GTCamTimeSyncHandler.h"
00008
00009
00010
00011
00012 GTCamTimeSyncHandler::GTCamTimeSyncHandler() :
00013 UDPEndpoint(2048,2048)
00014 {
00015 robotTimeRequestWasSent = -1;
00016 robotTimeRequestWasReceived = -1;
00017 serverTimeInResponse = -1;
00018 received2Packages = false;
00019 timeServer = "127.0.0.1";
00020
00021 }
00022
00023
00024
00025
00026 void GTCamTimeSyncHandler::initGTCamTimeSyncHandler(GTCamWorldState* myState, Image* myImage)
00027 {
00028 int camport = GTCAMPORT;
00029 int syncport = GTCAMSYNCPORT;
00030 double version;
00031
00032
00033 InConfigFile file("gtcam.cfg");
00034
00035
00036
00037
00038
00039 if(file.exists())
00040 {
00041 char buf[250];
00042 while(!file.eof())
00043 {
00044 file >> buf;
00045 if ( strcmp(buf,"Version")==0 )
00046 {
00047 file >> version;
00048 }else
00049 if ( strcmp(buf,"CAMPORT")==0 )
00050 {
00051 file >> camport;
00052 }
00053 if ( strcmp(buf,"SYNCPORT")==0 )
00054 {
00055 file >> syncport;
00056 }
00057 }
00058 }
00059
00060 bind(syncport);
00061 state = myState;
00062 image = myImage;
00063
00064 }
00065
00066
00067
00068
00069
00070 void GTCamTimeSyncHandler::onReceive(void* data, int size)
00071 {
00072
00073 if (serverTimeInResponse != -1) {
00074 received2Packages = true;
00075 }
00076
00077
00078 memcpy(&serverTimeInResponse,data,size);
00079 robotTimeRequestWasReceived = SystemCall::getCurrentSystemTime();
00080 frameNumberTimeRequestWasReceived = image->frameNumber;
00081 calculateOffset();
00082
00083 }
00084
00085
00086
00087
00088 void GTCamTimeSyncHandler::calculateOffset() {
00089 offset = serverTimeInResponse - (robotTimeRequestWasSent / 2) - (robotTimeRequestWasReceived / 2);
00090 buffer.add((double)offset);
00091
00092
00093 offset = (long)(buffer.getSum() / buffer.getNumberOfEntries());
00094
00095
00096
00097 frameOffset = serverTimeInResponse / 8 -
00098 (frameNumberTimeRequestWasSent / 2) - (frameNumberTimeRequestWasReceived / 2);
00099
00100
00101
00102 frameNumberBuffer.add(frameOffset);
00103
00104 frameOffset = frameNumberBuffer.getSum() / frameNumberBuffer.getNumberOfEntries();
00105
00106
00107
00108
00109 }
00110
00111
00112
00113
00114 void GTCamTimeSyncHandler::startTimeSync() {
00115 double id = (double)getPlayer().getPlayerNumber();
00116 send(&id,sizeof(id),timeServer,GTCAMSYNCPORT);
00117 robotTimeRequestWasSent = SystemCall::getCurrentSystemTime();
00118 frameNumberTimeRequestWasSent = image->frameNumber;
00119 }