// Spludlow Software // Copyright © Samuel P. Ludlow 2020 All Rights Reserved // Distributed under the terms of the GNU General Public License version 3 // Distributed WITHOUT ANY WARRANTY; without implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE // https://www.spludlow.co.uk/LICENCE.TXT // The Spludlow logo is a registered trademark of Samuel P. Ludlow and may not be used without permission // v1.14 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Spludlow.MetSat { /// /// Wrappers for XRIT2PIC and xRITDecompress /// Using Spludlow.SpawnProcess that makes running .exe a peice of cake /// public class Xrit2Pic { private const string _Xrit2picProgramPath = @"C:\Program Files (x86)\xrit\xrit2pic.exe"; private const string _XRITDecompressPath = @"C:\Program Files\xRITDecompress\xRITDecompress.exe"; /// /// Combines AVHRR files into a single .rah file (Rob Alblas HRPT Format) for opening in HRPT Reader /// public static string[] RahAVHRR(string[] sourceFiles, string targetDirectory) { return Run(sourceFiles, targetDirectory, "-rah -nolin"); } /// /// Run XRIT2PIC /// public static string[] Run(string[] sourceFiles, string targetDirectory, string commandLine) { int processTimeoutMinutes = 10; List targetFilenames = new List(); using (Spludlow.TempDirectory tempDir = new TempDirectory()) { string inputDirectory = tempDir + @"\input"; string outputDirectory = tempDir + @"\output"; Directory.CreateDirectory(inputDirectory); Directory.CreateDirectory(outputDirectory); foreach (string sourceFile in sourceFiles) File.Copy(sourceFile, inputDirectory + @"\" + Path.GetFileName(sourceFile)); StringBuilder arguments = new StringBuilder(); arguments.Append("-nogui -src \"@SRC\" -dest \"@DEST\" " + commandLine); arguments.Replace("@SRC", inputDirectory); arguments.Replace("@DEST", outputDirectory); Spludlow.SpawnProcess.ProcessExitInfo exitInfo = Spludlow.SpawnProcess.Run(_Xrit2picProgramPath, arguments.ToString(), processTimeoutMinutes * 60); if (exitInfo.ExitCode != 0 || exitInfo.StandardError.Length > 0) { Spludlow.Log.Error("xrit2pic; Process. ExitCode:" + exitInfo.ExitCode + ", Error Length:" + exitInfo.StandardError.Length, new object[] { exitInfo.StandardError, exitInfo.StandardOutput } ); throw new ApplicationException("xrit2pic; Error from Process. ExitCode:" + exitInfo.ExitCode); } string[] resultFiles = Directory.GetFiles(outputDirectory); if (resultFiles.Length == 0) throw new ApplicationException("xrit2pic no output files."); foreach (string resultFile in resultFiles) { string filename = targetDirectory + @"\" + Path.GetFileName(resultFile); if (File.Exists(filename) == true) { Spludlow.Log.Warning("xrit2pic target filename already exists, deleting:\t" + filename); File.Delete(filename); } File.Copy(resultFile, filename); targetFilenames.Add(filename); } } return targetFilenames.ToArray(); } public static void XRITDecompress(string inputDirectory, string outputDirectory) { XRITDecompress(Directory.GetFiles(inputDirectory), outputDirectory); } public static void XRITDecompress(string[] filenames, string outputDirectory) { foreach (string filename in filenames) XRITDecompress(filename, outputDirectory, false); } /// /// Run XRITDecompress /// public static string XRITDecompress(string filename, string outputDirectory, bool returnSingleFilename) { string arguments = Spludlow.Io.Paths.CygwinName(filename); // This cygwin exe just won't work without a console window, so the windows will pop up when running from the desktop which is anoying Spludlow.SpawnProcess.ProcessExitInfo exitInfo = Spludlow.SpawnProcess.Run(_XRITDecompressPath, arguments, outputDirectory, null, 60, true); if (exitInfo.ExitCode != 0 || exitInfo.StandardError.Length > 0) { if (exitInfo.StandardError.Length > 0) Spludlow.Log.Error("xRITDecompress StandardError, ExitCode:" + exitInfo.ExitCode + ", " + filename, exitInfo.StandardError); throw new ApplicationException("xRITDecompress Error; ExitCode:" + exitInfo.ExitCode + ", StandardError.Length:" + exitInfo.StandardError.Length); } if (returnSingleFilename == false) return null; string[] resultFiles = Directory.GetFiles(outputDirectory); if (resultFiles.Length != 1) throw new ApplicationException("xRITDecompress Not 1 result file:\t" + resultFiles.Length + ", " + filename); return resultFiles[0]; } } }