public Dictionary<string, PictureInformation> doworkCAM(string logFile, string dirWithImages)
{
// Lets start over
Dictionary<string, PictureInformation> picturesInformationTemp = new Dictionary<string,PictureInformation>();
TXT_outputlog.AppendText("Using AMSL Altitude " + useAMSLAlt + "\n");
// If we are required to use AMSL then GPS messages should be used until CAM messages includes AMSL in the coming AC versions
// Or if the user enter shutter lag and thus we have to look for GPS messages ahead in time
if (useAMSLAlt || millisShutterLag > 0)
{
TXT_outputlog.AppendText("Reading log for GPS Messages in order to get AMSL Altitude\n");
if (vehicleLocations == null || vehicleLocations.Count <= 0)
{
vehicleLocations = readGPSMsgInLog(logFile);
if (vehicleLocations == null || vehicleLocations.Count <= 0)
{
TXT_outputlog.AppendText("Log file problem. Aborting....\n");
return null;
}
}
TXT_outputlog.AppendText("Log Read for GPS Messages\n");
}
//logFile = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM\2011-10-01 11-48 1.log";
TXT_outputlog.AppendText("Reading log for CAM Messages\n");
List<string[]> list = readCAMMsgInLog(logFile);
if (list == null)
{
TXT_outputlog.AppendText("Log file problem. Aborting....\n");
return null;
}
TXT_outputlog.AppendText("Log Read with - " + list.Count + " - CAM Messages found\n");
//dirWithImages = @"C:\Users\hog\Pictures\farm 1-10-2011\100SSCAM";
TXT_outputlog.AppendText("Read images\n");
string[] files = Directory.GetFiles(dirWithImages, "*.jpg");
TXT_outputlog.AppendText("Images read : " + files.Length + "\n");
// Check that we have same number of CAMs than files
if (files.Length != list.Count)
{
TXT_outputlog.AppendText("CAM Msgs and Files discrepancy. Check it! Aborting..... \n");
return null;
}
Array.Sort(files, Comparer.DefaultInvariant);
// Each file corresponds to one CAM message
// We assume that picture names are in ascending order in time
for (int i = 0; i < list.Count; i++)
{
string[] currentCAM = list[i];
PictureInformation p = new PictureInformation();
DateTime dCAMMsgTime = GetTimeFromGps(int.Parse(getValueFromStringArray(currentCAM, weekCAMPos), CultureInfo.InvariantCulture), int.Parse(getValueFromStringArray(currentCAM, timeCAMpos), CultureInfo.InvariantCulture));
if (millisShutterLag == 0)
{
// Lets puts GPS time
p.Time = dCAMMsgTime;
p.Lat = double.Parse(getValueFromStringArray(currentCAM, latCAMpos), CultureInfo.InvariantCulture);
p.Lon = double.Parse(getValueFromStringArray(currentCAM, lngCAMpos), CultureInfo.InvariantCulture);
p.AltAMSL = double.Parse(getValueFromStringArray(currentCAM, altCAMpos), CultureInfo.InvariantCulture);
p.RelAlt = double.Parse(getValueFromStringArray(currentCAM, altCAMpos), CultureInfo.InvariantCulture);
VehicleLocation cameraLocationFromGPSMsg = null;
string logAltMsg = "RelAlt";
if (useAMSLAlt)
{
cameraLocationFromGPSMsg = LookForLocation(p.Time, vehicleLocations);
if (cameraLocationFromGPSMsg != null)
{
logAltMsg = "AMSL Alt " + (cameraLocationFromGPSMsg.Time - p.Time).Milliseconds + " ms away";
p.AltAMSL = cameraLocationFromGPSMsg.AltAMSL;
}
else
logAltMsg = "AMSL Alt NOT found";
}
p.Pitch = float.Parse(getValueFromStringArray(currentCAM, pitchCAMATT), CultureInfo.InvariantCulture);
p.Roll = float.Parse(getValueFromStringArray(currentCAM, rollCAMATT), CultureInfo.InvariantCulture);
p.Yaw = float.Parse(getValueFromStringArray(currentCAM, yawCAMATT), CultureInfo.InvariantCulture);
p.Path = files[i];
string picturePath = files[i];
picturesInformationTemp.Add(picturePath, p);
TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(picturePath) + " processed from CAM Msg with " + millisShutterLag + " ms shutter lag. " + logAltMsg + "\n");
}
else
{
// Look fot GPS Message ahead
DateTime dCorrectedWithLagPhotoTime = dCAMMsgTime;
dCorrectedWithLagPhotoTime = dCorrectedWithLagPhotoTime.AddMilliseconds(millisShutterLag);
VehicleLocation cameraLocationFromGPSMsg = LookForLocation(dCorrectedWithLagPhotoTime, vehicleLocations);
// Check which GPS Position is closer in time.
if (cameraLocationFromGPSMsg != null)
{
System.TimeSpan diffGPSTimeCAMTime = cameraLocationFromGPSMsg.Time - dCAMMsgTime;
if (diffGPSTimeCAMTime.Milliseconds > 2 * millisShutterLag)
{
// Stay with CAM Message as it is closer to CorrectedTime
p.Time = dCAMMsgTime;
p.Lat = double.Parse(getValueFromStringArray(currentCAM, latCAMpos), CultureInfo.InvariantCulture);
p.Lon = double.Parse(getValueFromStringArray(currentCAM, lngCAMpos), CultureInfo.InvariantCulture);
p.AltAMSL = double.Parse(getValueFromStringArray(currentCAM, altCAMpos), CultureInfo.InvariantCulture);
p.RelAlt = double.Parse(getValueFromStringArray(currentCAM, altCAMpos), CultureInfo.InvariantCulture);
string logAltMsg = "RelAlt";
cameraLocationFromGPSMsg = null;
if (useAMSLAlt)
{
cameraLocationFromGPSMsg = LookForLocation(p.Time, vehicleLocations);
if (cameraLocationFromGPSMsg != null)
{
logAltMsg = "AMSL Alt " + (cameraLocationFromGPSMsg.Time - p.Time).Milliseconds + " ms away";
p.AltAMSL = cameraLocationFromGPSMsg.AltAMSL;
}
else
logAltMsg = "AMSL Alt NOT found";
}
TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(files[i]) + " processed with CAM Msg. Shutter lag too small. " + logAltMsg + "\n");
}
else
{
// Get GPS Time as it is closer to CorrectedTime
// Lets puts GPS time
p.Time = cameraLocationFromGPSMsg.Time;
p.Lat = cameraLocationFromGPSMsg.Lat;
p.Lon = cameraLocationFromGPSMsg.Lon;
p.AltAMSL = cameraLocationFromGPSMsg.AltAMSL;
p.RelAlt = cameraLocationFromGPSMsg.RelAlt;
string logAltMsg = useAMSLAlt ? "AMSL Alt" : "RelAlt";
TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(files[i]) + " processed with GPS Msg : " + diffGPSTimeCAMTime.Milliseconds + " ms ahead of CAM Msg. " + logAltMsg + "\n");
}
p.Pitch = float.Parse(getValueFromStringArray(currentCAM, pitchCAMATT), CultureInfo.InvariantCulture);
p.Roll = float.Parse(getValueFromStringArray(currentCAM, rollCAMATT), CultureInfo.InvariantCulture);
p.Yaw = float.Parse(getValueFromStringArray(currentCAM, yawCAMATT), CultureInfo.InvariantCulture);
p.Path = files[i];
string picturePath = files[i];
picturesInformationTemp.Add(picturePath, p);
}
else
{
TXT_outputlog.AppendText("Photo " + Path.GetFileNameWithoutExtension(files[i]) + " NOT Processed. Time not found in log. Too large Shutter Lag? Try setting it to 0\n");
}
}
}
return picturesInformationTemp;
}