public frmEnterSERFileInfo(SerFileInfo info, bool hasFireCaptureTimestamps) { InitializeComponent(); cbxBitPix.Items.Clear(); bool hasEmbeddedTimeStamps = info.SequenceStartTimeUTCHi != 0 && info.SequenceStartTimeUTCHi >> 0x1F == 0; if (info.PixelDepthPerPlane == 8) { cbxBitPix.Items.Add("8"); cbxBitPix.SelectedIndex = 0; } else { cbxBitPix.Items.Add("8"); cbxBitPix.Items.Add("12"); cbxBitPix.Items.Add("14"); cbxBitPix.Items.Add("16"); int selIndex = cbxBitPix.Items.IndexOf(TangraConfig.Settings.LastUsed.SerFileLastBitPix.ToString()); if (selIndex != -1) cbxBitPix.SelectedIndex = selIndex; else cbxBitPix.SelectedIndex = 4; } nudFrameRate.SetNUDValue(TangraConfig.Settings.LastUsed.SerFileLastFrameRate); pnlFrameRate.Visible = !hasEmbeddedTimeStamps; if (hasFireCaptureTimestamps) { cbxTimeSource.Items.Add("FireCapture Log File"); cbxTimeSource.SelectedIndex = cbxTimeSource.Items.Count - 1; } else { cbxTimeSource.SelectedIndex = hasEmbeddedTimeStamps ? 1 : 0; if (!hasEmbeddedTimeStamps) cbxTimeSource.Enabled = false; } }
private SERVideoStream(string fileName, double frameRate, int cameraBitPix, SerUseTimeStamp useTimeStamp, Dictionary<int, DateTime> fireCaptureTimeStamps) { m_FileInfo = new SerFileInfo(); byte[] observer = new byte[40]; byte[] instrument = new byte[40]; byte[] telescope = new byte[40]; TangraCore.SEROpenFile(fileName, ref m_FileInfo, observer, instrument, telescope, false); m_FileName = fileName; BitPix = cameraBitPix; FrameRate = frameRate; MillisecondsPerFrame = 1000 / frameRate; UseTimeStamp = useTimeStamp; m_FireCaptureTimeStamps = fireCaptureTimeStamps; Observer = Encoding.UTF8.GetString(observer).Trim(); Instrument = Encoding.UTF8.GetString(instrument).Trim(); Telescope = Encoding.UTF8.GetString(telescope).Trim(); HasTimeStamps = false; HasUTCTimeStamps = false; HasFireCaptureTimeStamps = false; if (useTimeStamp != SerUseTimeStamp.None) { HasFireCaptureTimeStamps = useTimeStamp == SerUseTimeStamp.FireCaptureLog; if (!HasFireCaptureTimeStamps) { HasTimeStamps = m_FileInfo.SequenceStartTimeHi != 0 && m_FileInfo.SequenceStartTimeHi >> 0x1F == 0; HasUTCTimeStamps = m_FileInfo.SequenceStartTimeUTCHi != 0 && m_FileInfo.SequenceStartTimeUTCHi >> 0x1F == 0; } } }
// DLL_PUBLIC HRESULT SEROpenFile(char* fileName, SerLib::SerFileInfo* fileInfo, char* observer, char* instrument, char* telescope, bool checkMagic); public static extern int SEROpenFile(string fileName, [In, Out] ref SerFileInfo fileInfo, [In, Out] byte[] observer, [In, Out] byte[] instrument, [In, Out] byte[] telescope, bool checkMagic);
public static SERVideoStream OpenFile(string fileName, IWin32Window parentForm, TangraOpenFileArgs args, out SerEquipmentInfo equipmentInfo) { var fileInfo = new SerFileInfo(); equipmentInfo = new SerEquipmentInfo(); byte[] observer = new byte[40]; byte[] instrument = new byte[40]; byte[] telescope = new byte[40]; TangraCore.SEROpenFile(fileName, ref fileInfo, observer, instrument, telescope, false); string fireCaptureLogFileName = Path.ChangeExtension(fileName, ".txt"); var fireCaptureTimeStamps = new Dictionary<int, DateTime>(); if (File.Exists(fireCaptureLogFileName)) { string[] fireCaptureLogLines = File.ReadAllLines(fireCaptureLogFileName); fireCaptureLogLines = fireCaptureLogLines.Where(x => x != null && x.StartsWith("Frame ")).ToArray(); if (fireCaptureLogLines.Any()) { // Parse FireCapture timestamps Regex timestampRegEx = new Regex(@"Frame (\d+):\s+(UT)?\s+(\d\d\d\d\d\d)\s+(\d\d\d\d\d\d)\.(\d+)"); foreach (string line in fireCaptureLogLines) { Match match = timestampRegEx.Match(line); if (match.Success) { string frameNo = match.Groups[1].Value; bool isUT = match.Groups[2].Value == "UT"; string ddmmyy = match.Groups[isUT ? 3 : 2].Value; string hhmmss = match.Groups[isUT ? 4 : 3].Value; double fffff = double.Parse("0." + match.Groups[isUT ? 5 : 4].Value, CultureInfo.InvariantCulture); DateTime dt = new DateTime( 2000 + int.Parse(ddmmyy.Substring(4, 2)), int.Parse(ddmmyy.Substring(2, 2)), int.Parse(ddmmyy.Substring(0, 2)), int.Parse(hhmmss.Substring(0, 2)), int.Parse(hhmmss.Substring(2, 2)), int.Parse(hhmmss.Substring(4, 2))).AddMilliseconds(fffff * 1000); fireCaptureTimeStamps.Add(int.Parse(frameNo), dt); } } } } UsageStats.Instance.ProcessedSerFiles++; UsageStats.Instance.Save(); int bitPix; double frameRate; SerUseTimeStamp serTiming; if (args != null) { bitPix = args.BitPix; frameRate = args.FrameRate; serTiming = args.SerTiming; } else { var frmInfo = new frmEnterSERFileInfo(fileInfo, fireCaptureTimeStamps.Count > 0); if (frmInfo.ShowDialog(parentForm) != DialogResult.OK) { return null; } frameRate = frmInfo.FrameRate; bitPix = frmInfo.BitPix; serTiming = frmInfo.UseEmbeddedTimeStamps; } TangraCore.SERCloseFile(); var rv = new SERVideoStream(fileName, frameRate, bitPix, serTiming, fireCaptureTimeStamps); equipmentInfo.Instrument = rv.Instrument; equipmentInfo.Observer = rv.Observer; equipmentInfo.Telescope = rv.Telescope; if (rv.HasTimeStamps || rv.HasUTCTimeStamps || rv.HasFireCaptureTimeStamps) { var frmCheckTS = new frmCheckTimeStampsIntegrity(rv); frmCheckTS.ShowDialog(parentForm); } return rv; }