From 2cfbfd7acebf7b6f25c7bb146c3f5529c9695c5a Mon Sep 17 00:00:00 2001 From: kimikage Date: Fri, 2 Dec 2011 21:47:41 +0900 Subject: [PATCH] =?utf8?q?8860=E5=BD=A2=E5=BC=8F=E3=81=AELWBBWINF=E3=81=AE?= =?utf8?q?=E4=B8=80=E9=83=A8=E3=82=92=E5=8F=8D=E6=98=A0=E3=81=99=E3=82=8B?= =?utf8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4(#25000)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Karinto/HiokiHicorderDataReader.cs | 136 +++++- Karinto/Xml/Hioki.Designer.cs | 513 ++++++++++++++++++++- Karinto/Xml/Hioki.cs | 4 + Karinto/Xml/Hioki.xsd | 17 +- Karinto/Xml/Hioki.xss | 2 +- KarintoTest/HiokiHicorderDataReaderTest.cs | 66 ++- KarintoTest/KarintoTest.csproj | 8 +- KarintoTest/Resources/{hioki.mem => hioki8855.mem} | Bin 3072 -> 3072 bytes KarintoTest/Resources/hioki886050.mem | Bin 0 -> 176384 bytes 9 files changed, 718 insertions(+), 28 deletions(-) rename KarintoTest/Resources/{hioki.mem => hioki8855.mem} (90%) create mode 100755 KarintoTest/Resources/hioki886050.mem diff --git a/Karinto/HiokiHicorderDataReader.cs b/Karinto/HiokiHicorderDataReader.cs index d571e24..c501fd2 100755 --- a/Karinto/HiokiHicorderDataReader.cs +++ b/Karinto/HiokiHicorderDataReader.cs @@ -34,6 +34,7 @@ namespace Karinto private delegate void DataChunkReader( byte[] data, int n, short[][] analog, byte[][] logic); + private delegate void SParser(byte[] data, int offset); #endregion @@ -129,6 +130,12 @@ namespace Karinto long size = stream.Length - headerChunkSize; if (mHeader is MHeader) { + stream.Seek(mHeader.OffsetOfLwbbwInf, SeekOrigin.Begin); + uint lwbbwInfSize = mHeader.OffsetOfLwbbwDat - + mHeader.OffsetOfLwbbwInf; + byte[] lwbbwInf = new byte[lwbbwInfSize]; + stream.Read(lwbbwInf, 0, (int)lwbbwInfSize); + ParseLwbbwInf(lwbbwInf); size = stream.Length - mHeader.OffsetOfLwbbwDat; stream.Seek(mHeader.OffsetOfLwbbwDat, SeekOrigin.Begin); } @@ -228,6 +235,9 @@ namespace Karinto case "HM": // 8860目次ヘッダ mHeader = ParseMHeader(h); break; + case "HPF": + case "HPV": + break; default: break; @@ -259,7 +269,7 @@ namespace Karinto settings.Model = header[2]; settings.RomVersion = header[3]; settings.Function = header[4]; // MEM|REC|RMS|XYC|FFT - settings.Shot = header[5]; + settings.Shot = header[5]; // *DIV|---|CONT settings.SaveDataNumber = Int32.Parse(header[6]); Match m = new Regex(@"(\d\d)-(\d\d)-(\d\d)").Match(header[7]); @@ -278,14 +288,35 @@ namespace Karinto hour, minute, iSecond, mSecond, DateTimeKind.Local); // header[9] : データ格納形式 - // header[10] : 時間軸データ数(/DIV) + settings.SamplePerDiv = Int32.Parse(header[10]); m = new Regex(@"(\d+(?:\.\d*)?)(.*)s").Match(header[11]); decimal scale = (decimal)Unit.SiPrefix[m.Groups[2].Value]; settings.TimePerDiv = decimal.Parse(m.Groups[1].Value) * scale; - // header[12] : サンプリング周期 - // header[13] : 時間軸方向の最大圧縮 + m = new Regex(@"(\d+(?:\.\d*)?)(.*)s").Match(header[12]); + scale = (decimal)Unit.SiPrefix[m.Groups[2].Value]; + settings.TimePerSample = decimal.Parse(m.Groups[1].Value) * scale; + + //settings.Expand = header[13]; + + settings.TrigMode = header[16]; // SINGLE|REPEAT|AUTO + // header[17] トリガ位置 + settings.TrigSource = header[18]; // AND|OR + settings.PreTrig = header[19]; // * %|* DIV|START|STOP|START_STOP + // header[20] タイマートリガ ON|OFF + bool timerTrig = header[20] == "ON"; + if (timerTrig) + { + int time = Int32.Parse(header[21]); + settings.TimerTrigStart = + new DateTime(year, time / 1000000, time / 10000 % 100, + time / 100 % 100, time % 100, 0); + time = Int32.Parse(header[22]); + settings.TimerTrigStart = + new DateTime(year, time / 1000000, time / 10000 % 100, + time / 100 % 100, time % 100, 0); + } settings.TitleSetting = header[28]; @@ -336,7 +367,10 @@ namespace Karinto /// 保存位置情報 private static BaHeader[] ParseBAHeader(string[] header) { - if (header[0] != "HBA") return null; + if (header[0] != "HBA") + { + return null; + } BaHeader[] headers = new BaHeader[16 + 1]; int offset = 0; for (int i = 0; i < 16; ++i) @@ -461,10 +495,64 @@ namespace Karinto return m; } + private void ParseLwbbwInf(byte[] data) + { + string id = Encoding.ASCII.GetString(data, 0, 8); + if (id != "LWBBWINF") + { + return; + } + int size = BitConverter.ToInt32(data, 12); + if (data.Length < size) + { + return; + } + int i = 0x20; + while (i < (size - 0x10)) + { + id = Encoding.ASCII.GetString(data, i, 8); + int length = BitConverter.ToUInt16(data, i + 0x0C); + length = ((length + 0x0F) >> 4) << 4; + if (length < 1) + { + break; + } + if (id == "SXACAWMN") + { + int unit = data[i + 0x08] + 1; + int ch = data[i + 0x09] + 1; + AnalogChannel c = temp.GetAnalogChannel(unit, ch); + int scale = BitConverter.ToInt32(data, i + 0x41); + sbyte scaleExp = (sbyte)data[i + 0x45]; + int offset = BitConverter.ToInt32(data, i + 0x46); + sbyte offsetExp = (sbyte)data[i + 0x4A]; + c.MeasurementScale = scale * Math.Pow(10, scaleExp); + c.MeasurementOffset = offset * Math.Pow(10, offsetExp); + } + i += length; + } + } + private static void ReadMemDataChunkWithMHeader( byte[] data, int n, short[][] analog, byte[][] logic) { - int offset = 0x70; + string id = Encoding.ASCII.GetString(data, 0, 8); + if (id != "LWBBWDAT") + { + return; + } + int offset = 0x10; + while (offset < (data.Length - 0x10)) + { + id = Encoding.ASCII.GetString(data, offset, 8); + if (id == "SX__BLKP") + { + int length = BitConverter.ToUInt16(data, offset + 0x0C); + offset += ((length + 0x0F) >> 4) << 4; + break; + } + offset += 0x10; + } for (int ch = 0; ch < analog.Length; ++ch) { analog[ch] = new short[n]; @@ -473,9 +561,9 @@ namespace Karinto { for (int ch = 0; ch < analog.Length; ++ch) { - // 内部的に +32768 オフセットして 0~65535に + // 内部的に -32768 オフセットして -32768~32767に analog[ch][i] = - (short)(BitConverter.ToInt16(data, offset) - 0x8000); + (short)(BitConverter.ToUInt16(data, offset) - 0x8000); offset += 2; } } @@ -484,7 +572,27 @@ namespace Karinto private static void ReadRecDataChunkWithMHeader( byte[] data, int n, short[][] analog, byte[][] logic) { - int offset = 0x70; + string id = Encoding.ASCII.GetString(data, 0, 8); + if (id != "LWBBWDAT") + { + return; + } + int offset = 0x10; + while (offset < (data.Length - 0x10)) + { + id = Encoding.ASCII.GetString(data, offset, 8); + if (id == "SX__BLKP") + { + int length = BitConverter.ToUInt16(data, offset + 0x0C); + offset += ((length + 0x0F) >> 4) << 4; + break; + } + offset += 0x10; + } + for (int ch = 0; ch < analog.Length; ++ch) + { + analog[ch] = new short[n]; + } for (int ch = 0; ch < analog.Length; ++ch) { analog[ch] = new short[n + n]; @@ -493,11 +601,11 @@ namespace Karinto { for (int ch = 0; ch < analog.Length; ++ch) { - // 内部的に +32768 オフセットして 0~65535に + // 内部的に -32768 オフセットして -32768~32767に analog[ch][i] = - (short)(BitConverter.ToInt16(data, offset) - 0x8000); + (short)(BitConverter.ToUInt16(data, offset) - 0x8000); analog[ch][i + 1] = - (short)(BitConverter.ToInt16(data, offset + 2) + (short)(BitConverter.ToUInt16(data, offset + 2) - 0x8000); offset += 4; } @@ -572,7 +680,7 @@ namespace Karinto { for (int ch = 0; ch < analog.Length; ++ch) { - // 内部的に +32768 オフセットして 0~65535に + // 内部的に -32768 オフセットして -32768~32767に analog[ch][i] = (short)((data[offset] << 8 | data[offset + 1]) - 0x8000); @@ -607,7 +715,7 @@ namespace Karinto { for (int ch = 0; ch < analog.Length; ++ch) { - // 内部的に +32768 オフセットして 0~65535に + // 内部的に -32768 オフセットして -32768~32767に analog[ch][i + i] = (short)((data[offset] << 8 | data[offset + 1]) - 0x8000); diff --git a/Karinto/Xml/Hioki.Designer.cs b/Karinto/Xml/Hioki.Designer.cs index ef79e28..eff9e86 100755 --- a/Karinto/Xml/Hioki.Designer.cs +++ b/Karinto/Xml/Hioki.Designer.cs @@ -370,8 +370,12 @@ namespace Karinto.Xml { private global::System.Data.DataColumn columnTrigDate; + private global::System.Data.DataColumn columnSamplePerDiv; + private global::System.Data.DataColumn columnTimePerDiv; + private global::System.Data.DataColumn columnTimePerSample; + private global::System.Data.DataColumn columnExpand; private global::System.Data.DataColumn columnTrigMode; @@ -402,6 +406,8 @@ namespace Karinto.Xml { private global::System.Data.DataColumn columnSavedLogicUnit; + private global::System.Data.DataColumn columnSavedCalcChannel; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public HicorderSettingsDataTable() { this.TableName = "HicorderSettings"; @@ -475,6 +481,13 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn SamplePerDivColumn { + get { + return this.columnSamplePerDiv; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public global::System.Data.DataColumn TimePerDivColumn { get { return this.columnTimePerDiv; @@ -482,6 +495,13 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn TimePerSampleColumn { + get { + return this.columnTimePerSample; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public global::System.Data.DataColumn ExpandColumn { get { return this.columnExpand; @@ -587,6 +607,13 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn SavedCalcChannelColumn { + get { + return this.columnSavedCalcChannel; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.ComponentModel.Browsable(false)] public int Count { get { @@ -622,11 +649,13 @@ namespace Karinto.Xml { string Shot, int SaveDataNumber, System.DateTime TrigDate, + int SamplePerDiv, decimal TimePerDiv, + decimal TimePerSample, int Expand, string TrigMode, string TrigSource, - double PreTrig, + string PreTrig, System.DateTime TimerTrigStart, System.DateTime TimerTrigStop, System.TimeSpan TimerTrigInterval, @@ -637,7 +666,8 @@ namespace Karinto.Xml { string Title, string CommentSetting, long SavedAnalogChannel, - int SavedLogicUnit) { + int SavedLogicUnit, + int SavedCalcChannel) { HicorderSettingsRow rowHicorderSettingsRow = ((HicorderSettingsRow)(this.NewRow())); object[] columnValuesArray = new object[] { Model, @@ -646,7 +676,9 @@ namespace Karinto.Xml { Shot, SaveDataNumber, TrigDate, + SamplePerDiv, TimePerDiv, + TimePerSample, Expand, TrigMode, TrigSource, @@ -661,7 +693,8 @@ namespace Karinto.Xml { Title, CommentSetting, SavedAnalogChannel, - SavedLogicUnit}; + SavedLogicUnit, + SavedCalcChannel}; rowHicorderSettingsRow.ItemArray = columnValuesArray; this.Rows.Add(rowHicorderSettingsRow); return rowHicorderSettingsRow; @@ -692,7 +725,9 @@ namespace Karinto.Xml { this.columnShot = base.Columns["Shot"]; this.columnSaveDataNumber = base.Columns["SaveDataNumber"]; this.columnTrigDate = base.Columns["TrigDate"]; + this.columnSamplePerDiv = base.Columns["SamplePerDiv"]; this.columnTimePerDiv = base.Columns["TimePerDiv"]; + this.columnTimePerSample = base.Columns["TimePerSample"]; this.columnExpand = base.Columns["Expand"]; this.columnTrigMode = base.Columns["TrigMode"]; this.columnTrigSource = base.Columns["TrigSource"]; @@ -708,6 +743,7 @@ namespace Karinto.Xml { this.columnCommentSetting = base.Columns["CommentSetting"]; this.columnSavedAnalogChannel = base.Columns["SavedAnalogChannel"]; this.columnSavedLogicUnit = base.Columns["SavedLogicUnit"]; + this.columnSavedCalcChannel = base.Columns["SavedCalcChannel"]; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -724,15 +760,19 @@ namespace Karinto.Xml { base.Columns.Add(this.columnSaveDataNumber); this.columnTrigDate = new global::System.Data.DataColumn("TrigDate", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnTrigDate); + this.columnSamplePerDiv = new global::System.Data.DataColumn("SamplePerDiv", typeof(int), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnSamplePerDiv); this.columnTimePerDiv = new global::System.Data.DataColumn("TimePerDiv", typeof(decimal), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnTimePerDiv); + this.columnTimePerSample = new global::System.Data.DataColumn("TimePerSample", typeof(decimal), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnTimePerSample); this.columnExpand = new global::System.Data.DataColumn("Expand", typeof(int), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnExpand); this.columnTrigMode = new global::System.Data.DataColumn("TrigMode", typeof(string), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnTrigMode); this.columnTrigSource = new global::System.Data.DataColumn("TrigSource", typeof(string), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnTrigSource); - this.columnPreTrig = new global::System.Data.DataColumn("PreTrig", typeof(double), null, global::System.Data.MappingType.Element); + this.columnPreTrig = new global::System.Data.DataColumn("PreTrig", typeof(string), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnPreTrig); this.columnTimerTrigStart = new global::System.Data.DataColumn("TimerTrigStart", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnTimerTrigStart); @@ -756,6 +796,8 @@ namespace Karinto.Xml { base.Columns.Add(this.columnSavedAnalogChannel); this.columnSavedLogicUnit = new global::System.Data.DataColumn("SavedLogicUnit", typeof(int), null, global::System.Data.MappingType.Element); base.Columns.Add(this.columnSavedLogicUnit); + this.columnSavedCalcChannel = new global::System.Data.DataColumn("SavedCalcChannel", typeof(int), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnSavedCalcChannel); this.columnTimePerDiv.Caption = "Time/Div"; this.Locale = new global::System.Globalization.CultureInfo(""); } @@ -1728,6 +1770,26 @@ namespace Karinto.Xml { [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")] public partial class HicorderLogicChannelDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable { + private global::System.Data.DataColumn columnUnit; + + private global::System.Data.DataColumn columnCondition; + + private global::System.Data.DataColumn columnPattern; + + private global::System.Data.DataColumn columnPatternMask; + + private global::System.Data.DataColumn columnFilter; + + private global::System.Data.DataColumn columnComment1; + + private global::System.Data.DataColumn columnComment2; + + private global::System.Data.DataColumn columnComment3; + + private global::System.Data.DataColumn columnComment4; + + private global::System.Data.DataColumn columnData; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public HicorderLogicChannelDataTable() { this.TableName = "HicorderLogicChannel"; @@ -1759,6 +1821,76 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn UnitColumn { + get { + return this.columnUnit; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn ConditionColumn { + get { + return this.columnCondition; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn PatternColumn { + get { + return this.columnPattern; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn PatternMaskColumn { + get { + return this.columnPatternMask; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn FilterColumn { + get { + return this.columnFilter; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn Comment1Column { + get { + return this.columnComment1; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn Comment2Column { + get { + return this.columnComment2; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn Comment3Column { + get { + return this.columnComment3; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn Comment4Column { + get { + return this.columnComment4; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.Data.DataColumn DataColumn { + get { + return this.columnData; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.ComponentModel.Browsable(false)] public int Count { get { @@ -1787,9 +1919,19 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - public HicorderLogicChannelRow AddHicorderLogicChannelRow() { + public HicorderLogicChannelRow AddHicorderLogicChannelRow(string Unit, string Condition, byte Pattern, byte PatternMask, string Filter, string Comment1, string Comment2, string Comment3, string Comment4, string Data) { HicorderLogicChannelRow rowHicorderLogicChannelRow = ((HicorderLogicChannelRow)(this.NewRow())); - object[] columnValuesArray = new object[0]; + object[] columnValuesArray = new object[] { + Unit, + Condition, + Pattern, + PatternMask, + Filter, + Comment1, + Comment2, + Comment3, + Comment4, + Data}; rowHicorderLogicChannelRow.ItemArray = columnValuesArray; this.Rows.Add(rowHicorderLogicChannelRow); return rowHicorderLogicChannelRow; @@ -1814,10 +1956,40 @@ namespace Karinto.Xml { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] internal void InitVars() { + this.columnUnit = base.Columns["Unit"]; + this.columnCondition = base.Columns["Condition"]; + this.columnPattern = base.Columns["Pattern"]; + this.columnPatternMask = base.Columns["PatternMask"]; + this.columnFilter = base.Columns["Filter"]; + this.columnComment1 = base.Columns["Comment1"]; + this.columnComment2 = base.Columns["Comment2"]; + this.columnComment3 = base.Columns["Comment3"]; + this.columnComment4 = base.Columns["Comment4"]; + this.columnData = base.Columns["Data"]; } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] private void InitClass() { + this.columnUnit = new global::System.Data.DataColumn("Unit", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnUnit); + this.columnCondition = new global::System.Data.DataColumn("Condition", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnCondition); + this.columnPattern = new global::System.Data.DataColumn("Pattern", typeof(byte), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnPattern); + this.columnPatternMask = new global::System.Data.DataColumn("PatternMask", typeof(byte), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnPatternMask); + this.columnFilter = new global::System.Data.DataColumn("Filter", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnFilter); + this.columnComment1 = new global::System.Data.DataColumn("Comment1", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnComment1); + this.columnComment2 = new global::System.Data.DataColumn("Comment2", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnComment2); + this.columnComment3 = new global::System.Data.DataColumn("Comment3", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnComment3); + this.columnComment4 = new global::System.Data.DataColumn("Comment4", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnComment4); + this.columnData = new global::System.Data.DataColumn("Data", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnData); } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -2040,6 +2212,21 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public int SamplePerDiv { + get { + try { + return ((int)(this[this.tableHicorderSettings.SamplePerDivColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderSettings\' にある列 \'SamplePerDiv\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderSettings.SamplePerDivColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public decimal TimePerDiv { get { try { @@ -2055,6 +2242,21 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public decimal TimePerSample { + get { + try { + return ((decimal)(this[this.tableHicorderSettings.TimePerSampleColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderSettings\' にある列 \'TimePerSample\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderSettings.TimePerSampleColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public int Expand { get { try { @@ -2100,10 +2302,10 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - public double PreTrig { + public string PreTrig { get { try { - return ((double)(this[this.tableHicorderSettings.PreTrigColumn])); + return ((string)(this[this.tableHicorderSettings.PreTrigColumn])); } catch (global::System.InvalidCastException e) { throw new global::System.Data.StrongTypingException("テーブル \'HicorderSettings\' にある列 \'PreTrig\' の値は DBNull です。", e); @@ -2280,6 +2482,21 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public int SavedCalcChannel { + get { + try { + return ((int)(this[this.tableHicorderSettings.SavedCalcChannelColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderSettings\' にある列 \'SavedCalcChannel\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderSettings.SavedCalcChannelColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public bool IsModelNull() { return this.IsNull(this.tableHicorderSettings.ModelColumn); } @@ -2340,6 +2557,16 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsSamplePerDivNull() { + return this.IsNull(this.tableHicorderSettings.SamplePerDivColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetSamplePerDivNull() { + this[this.tableHicorderSettings.SamplePerDivColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public bool IsTimePerDivNull() { return this.IsNull(this.tableHicorderSettings.TimePerDivColumn); } @@ -2350,6 +2577,16 @@ namespace Karinto.Xml { } [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsTimePerSampleNull() { + return this.IsNull(this.tableHicorderSettings.TimePerSampleColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetTimePerSampleNull() { + this[this.tableHicorderSettings.TimePerSampleColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public bool IsExpandNull() { return this.IsNull(this.tableHicorderSettings.ExpandColumn); } @@ -2498,6 +2735,16 @@ namespace Karinto.Xml { public void SetSavedLogicUnitNull() { this[this.tableHicorderSettings.SavedLogicUnitColumn] = global::System.Convert.DBNull; } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsSavedCalcChannelNull() { + return this.IsNull(this.tableHicorderSettings.SavedCalcChannelColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetSavedCalcChannelNull() { + this[this.tableHicorderSettings.SavedCalcChannelColumn] = global::System.Convert.DBNull; + } } /// @@ -3253,6 +3500,256 @@ namespace Karinto.Xml { base(rb) { this.tableHicorderLogicChannel = ((HicorderLogicChannelDataTable)(this.Table)); } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public string Unit { + get { + try { + return ((string)(this[this.tableHicorderLogicChannel.UnitColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Unit\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.UnitColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public string Condition { + get { + try { + return ((string)(this[this.tableHicorderLogicChannel.ConditionColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Condition\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.ConditionColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public byte Pattern { + get { + try { + return ((byte)(this[this.tableHicorderLogicChannel.PatternColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Pattern\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.PatternColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public byte PatternMask { + get { + try { + return ((byte)(this[this.tableHicorderLogicChannel.PatternMaskColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'PatternMask\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.PatternMaskColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public string Filter { + get { + try { + return ((string)(this[this.tableHicorderLogicChannel.FilterColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Filter\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.FilterColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public string Comment1 { + get { + try { + return ((string)(this[this.tableHicorderLogicChannel.Comment1Column])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Comment1\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.Comment1Column] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public string Comment2 { + get { + try { + return ((string)(this[this.tableHicorderLogicChannel.Comment2Column])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Comment2\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.Comment2Column] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public string Comment3 { + get { + try { + return ((string)(this[this.tableHicorderLogicChannel.Comment3Column])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Comment3\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.Comment3Column] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public string Comment4 { + get { + try { + return ((string)(this[this.tableHicorderLogicChannel.Comment4Column])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Comment4\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.Comment4Column] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public string Data { + get { + try { + return ((string)(this[this.tableHicorderLogicChannel.DataColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("テーブル \'HicorderLogicChannel\' にある列 \'Data\' の値は DBNull です。", e); + } + } + set { + this[this.tableHicorderLogicChannel.DataColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsUnitNull() { + return this.IsNull(this.tableHicorderLogicChannel.UnitColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetUnitNull() { + this[this.tableHicorderLogicChannel.UnitColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsConditionNull() { + return this.IsNull(this.tableHicorderLogicChannel.ConditionColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetConditionNull() { + this[this.tableHicorderLogicChannel.ConditionColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsPatternNull() { + return this.IsNull(this.tableHicorderLogicChannel.PatternColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetPatternNull() { + this[this.tableHicorderLogicChannel.PatternColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsPatternMaskNull() { + return this.IsNull(this.tableHicorderLogicChannel.PatternMaskColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetPatternMaskNull() { + this[this.tableHicorderLogicChannel.PatternMaskColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsFilterNull() { + return this.IsNull(this.tableHicorderLogicChannel.FilterColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetFilterNull() { + this[this.tableHicorderLogicChannel.FilterColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsComment1Null() { + return this.IsNull(this.tableHicorderLogicChannel.Comment1Column); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetComment1Null() { + this[this.tableHicorderLogicChannel.Comment1Column] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsComment2Null() { + return this.IsNull(this.tableHicorderLogicChannel.Comment2Column); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetComment2Null() { + this[this.tableHicorderLogicChannel.Comment2Column] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsComment3Null() { + return this.IsNull(this.tableHicorderLogicChannel.Comment3Column); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetComment3Null() { + this[this.tableHicorderLogicChannel.Comment3Column] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsComment4Null() { + return this.IsNull(this.tableHicorderLogicChannel.Comment4Column); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetComment4Null() { + this[this.tableHicorderLogicChannel.Comment4Column] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public bool IsDataNull() { + return this.IsNull(this.tableHicorderLogicChannel.DataColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void SetDataNull() { + this[this.tableHicorderLogicChannel.DataColumn] = global::System.Convert.DBNull; + } } /// diff --git a/Karinto/Xml/Hioki.cs b/Karinto/Xml/Hioki.cs index 980451b..9a21a31 100755 --- a/Karinto/Xml/Hioki.cs +++ b/Karinto/Xml/Hioki.cs @@ -9,6 +9,10 @@ namespace Karinto.Xml { public partial class Hioki { + partial class HicorderSettingsDataTable + { + } + partial class HicorderLogicChannelDataTable { } diff --git a/Karinto/Xml/Hioki.xsd b/Karinto/Xml/Hioki.xsd index 24ac776..2c40664 100755 --- a/Karinto/Xml/Hioki.xsd +++ b/Karinto/Xml/Hioki.xsd @@ -21,11 +21,13 @@ + + - + @@ -37,6 +39,7 @@ + @@ -83,6 +86,18 @@ + + + + + + + + + + + + diff --git a/Karinto/Xml/Hioki.xss b/Karinto/Xml/Hioki.xss index e95547b..f08f0e2 100755 --- a/Karinto/Xml/Hioki.xss +++ b/Karinto/Xml/Hioki.xss @@ -6,7 +6,7 @@ --> - + diff --git a/KarintoTest/HiokiHicorderDataReaderTest.cs b/KarintoTest/HiokiHicorderDataReaderTest.cs index a3da242..31d1f07 100755 --- a/KarintoTest/HiokiHicorderDataReaderTest.cs +++ b/KarintoTest/HiokiHicorderDataReaderTest.cs @@ -18,23 +18,83 @@ namespace KarintoTest [TestFixture] public class HiokiHicorderDataReaderTest { + private static double e = 1e-6; [Test] - public void Read() + public void Read8855() { HiokiHicorderDataReader reader = new HiokiHicorderDataReader(); - HiokiHicorderData data = reader.Read("Resources/hioki.mem"); + HiokiHicorderData data = reader.Read("Resources/hioki8855.mem"); + Assert.AreEqual("8855", data.Settings.Model); + Assert.AreEqual("V 2.55", data.Settings.RomVersion); + Assert.AreEqual("MEM", data.Settings.Function); + Assert.AreEqual("100DIV", data.Settings.Shot); + Assert.AreEqual(123, data.Settings.SaveDataNumber); + DateTime d = new DateTime(2010, 11, 12, 13, 14, 15, 160, DateTimeKind.Local); + Assert.AreEqual(d, data.Settings.TrigDate); + Assert.AreEqual(100, data.Settings.SamplePerDiv); + Assert.AreEqual(200e-6m, data.Settings.TimePerDiv); + Assert.AreEqual(2e-6m, data.Settings.TimePerSample); + Assert.AreEqual("SINGLE", data.Settings.TrigMode); + Assert.AreEqual("OR", data.Settings.TrigSource); + Assert.AreEqual("0 %", data.Settings.PreTrig); + Assert.AreEqual(2, data.Settings.UseChannel); + Assert.AreEqual("SET&COM", data.Settings.TitleSetting); Assert.AreEqual("KarintoTest", data.Settings.Title); AnalogChannel ch1 = data.ChannelData[0]; Assert.AreEqual(data.Ch1, ch1); - Assert.AreEqual(0.84, ch1[0], 1e-20); + Assert.AreEqual(123, ch1.Length); + Assert.AreEqual(0.84, ch1[0], 0.84 * e); + Assert.AreEqual(0.9025, ch1[50], 0.9025 * e); + Assert.AreEqual(0.9925, ch1[122], 0.9925 * e); + + AnalogChannel ch2 = data.Ch2; + Assert.AreEqual(123, ch2.Length); + Assert.AreEqual(0.0, ch2[0], 0.0 * e); + Assert.AreEqual(0.04, ch2[50], 0.04 * e); + Assert.AreEqual(0.0976, ch2[122], 0.0976 * e); Assert.AreEqual(data.Ch1, data.GetAnalogChannel(1)); Assert.AreEqual(data.Ch2, data.GetAnalogChannel(2)); Assert.AreEqual(data.Units[0][1], data.GetAnalogChannel(1)); Assert.AreEqual(data.Units[0][2], data.GetAnalogChannel(2)); } + + [Test] + public void Read886050() + { + HiokiHicorderDataReader reader = new HiokiHicorderDataReader(); + HiokiHicorderData data = reader.Read("Resources/hioki886050.mem"); + Assert.AreEqual("8860-50", data.Settings.Model); + Assert.AreEqual("V 3.09", data.Settings.RomVersion); + Assert.AreEqual("MEM", data.Settings.Function); + Assert.AreEqual("200 DIV", data.Settings.Shot); + Assert.AreEqual(123, data.Settings.SaveDataNumber); + DateTime d = new DateTime(2010, 11, 12, 13, 14, 15, 160, DateTimeKind.Local); + Assert.AreEqual(d, data.Settings.TrigDate); + Assert.AreEqual(100, data.Settings.SamplePerDiv); + Assert.AreEqual(20e-3m, data.Settings.TimePerDiv); + Assert.AreEqual(200e-6m, data.Settings.TimePerSample); + Assert.AreEqual("AUTO", data.Settings.TrigMode); + Assert.AreEqual("OR", data.Settings.TrigSource); + Assert.AreEqual("0%", data.Settings.PreTrig); + Assert.AreEqual(2, data.Settings.UseChannel); + Assert.AreEqual("SETTING", data.Settings.TitleSetting); + Assert.AreEqual("KarintoTest", data.Settings.Title); + + AnalogChannel ch1 = data.GetAnalogChannel(1, 1); + Assert.AreEqual(123, ch1.Length); + Assert.AreEqual(-0.19, ch1[0], 0.19 * e); + Assert.AreEqual(-0.1275, ch1[50], 0.1275 * e); + Assert.AreEqual(-37.5e-3, ch1[122], 37.5e-3 * e); + + AnalogChannel ch2 = data.GetAnalogChannel(1, 2); + Assert.AreEqual(123, ch2.Length); + Assert.AreEqual(-243.75e-6, ch2[0], 243.75e-6 * e); + Assert.AreEqual(39.75625e-3, ch2[50], 39.75625e-3 * e); + Assert.AreEqual(97.35625e-3, ch2[122], 97.35625e-3 * e); + } } } diff --git a/KarintoTest/KarintoTest.csproj b/KarintoTest/KarintoTest.csproj index 3b6feb6..456563f 100755 --- a/KarintoTest/KarintoTest.csproj +++ b/KarintoTest/KarintoTest.csproj @@ -72,10 +72,16 @@ + + PreserveNewest + PreserveNewest - + + PreserveNewest + + PreserveNewest diff --git a/KarintoTest/Resources/hioki.mem b/KarintoTest/Resources/hioki8855.mem similarity index 90% rename from KarintoTest/Resources/hioki.mem rename to KarintoTest/Resources/hioki8855.mem index cff3955661791b1049e4db892324e7cd7226beaf..2a6e6337dff2bbbcd482e87653f78f46f242c858 100755 GIT binary patch delta 41 qcmZpWXpop-&*tJ8#=yWZ(RGKgk)eU1k%0w}$6x?uZx&$uzy$!u(g`#G delta 41 pcmZpWXpop-&t_m?;NlrJ(RGKgp@AWgW556eKo*$2S%C2a7Xa3M39JAB diff --git a/KarintoTest/Resources/hioki886050.mem b/KarintoTest/Resources/hioki886050.mem new file mode 100755 index 0000000000000000000000000000000000000000..3687c187c1cec77b3ce034219a244295de0f6819 GIT binary patch literal 176384 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 literal 0 HcmV?d00001 -- 2.11.0