public HiokiHicorderData Read(FilePath path)\r
{\r
Close();\r
- stream = new FileStream(path, \r
+ stream = new FileStream(path,\r
FileMode.Open, FileAccess.Read, FileShare.ReadWrite);\r
HiokiHicorderData data = Read();\r
Close();\r
string[] header = new string[elementNum];\r
for (int i = 0; i < elementNum; ++i)\r
{\r
- string element = \r
+ string element =\r
Encoding.ASCII.GetString(data, offset, elementSize);\r
header[i] = element.TrimEnd('\0');\r
offset += elementSize;\r
if (timerTrig)\r
{\r
int time = Int32.Parse(header[21]);\r
- settings.TimerTrigStart = \r
- new DateTime(year, time / 1000000, time / 10000 % 100, \r
+ settings.TimerTrigStart =\r
+ new DateTime(year, time / 1000000, time / 10000 % 100,\r
time / 100 % 100, time % 100, 0);\r
time = Int32.Parse(header[22]);\r
settings.TimerTrigStart =\r
time / 100 % 100, time % 100, 0);\r
}\r
\r
+ settings.UseChannel = Int32.Parse(header[26]);\r
settings.TitleSetting = header[28];\r
\r
settings.Title = header[29] + header[30] + header[31] + header[32];\r
\r
settings.CommentSetting = header[33];\r
\r
- settings.UseChannel = 0;\r
- settings.SavedAnalogChannel = 0;\r
- int cursor = 1;\r
- string savedFlags = \r
+ string savedFlags =\r
header[34] + header[35] + header[36] + header[37];\r
if (savedFlags.Length == 48)\r
{\r
savedFlags += header[38];\r
}\r
- foreach (char saved in savedFlags)\r
- {\r
- if (saved == '1')\r
- {\r
- settings.UseChannel++;\r
- settings.SavedAnalogChannel += cursor;\r
- }\r
- cursor += cursor;\r
- }\r
+ settings.SavedAnalogChannel = MapFlagStringToBits(savedFlags);\r
+\r
+ settings.SavedLogicUnit = (int)MapFlagStringToBits(header[39]);\r
\r
- settings.SavedLogicUnit = 0;\r
- cursor = 1;\r
- foreach (char saved in header[39])\r
- {\r
- if (saved == '1')\r
- {\r
- settings.SavedLogicUnit += cursor;\r
- }\r
- cursor += cursor;\r
- }\r
\r
// header[40] : フリーラン or トリガ有効\r
\r
{\r
MHeader m = new MHeader();\r
int i = 1;\r
- while(header[i + 1] != "")\r
+ while (header[i + 1] != "")\r
{\r
string source = header[i] + header[i + 1];\r
string type = header[i].Substring(0, 8);\r
uint x = Convert.ToUInt32(source.Substring(8, 8), 16);\r
uint offset = Convert.ToUInt32(source.Substring(16), 16);\r
- switch(type)\r
+ switch (type)\r
{\r
case "LWBBWINF":\r
m.OffsetOfLwbbwInf = offset;\r
}\r
\r
private void ParseLwbbwInf(byte[] data)\r
- { \r
+ {\r
string id = Encoding.ASCII.GetString(data, 0, 8);\r
if (id != "LWBBWINF")\r
{\r
int scale = BitConverter.ToInt32(data, i + 0x41);\r
sbyte scaleExp = (sbyte)data[i + 0x45];\r
int offset = BitConverter.ToInt32(data, i + 0x46);\r
- sbyte offsetExp = (sbyte)data[i + 0x4A];\r
+ sbyte offsetExp = (sbyte)data[i + 0x4A];\r
c.MeasurementScale = scale * Math.Pow(10, scaleExp);\r
c.MeasurementOffset = offset * Math.Pow(10, offsetExp);\r
}\r
{\r
analog[ch] = new short[n];\r
}\r
+ for (int ch = 0; ch < logic.Length; ++ch)\r
+ {\r
+ logic[ch] = new byte[n];\r
+ }\r
for (int i = 0; i < n; ++i)\r
{\r
+ for (int ch = 0; ch < logic.Length; ++ch)\r
+ {\r
+ switch (ch & 0x3)\r
+ {\r
+ case 3:\r
+ logic[ch][i] = (byte)(data[offset - 1] >> 4);\r
+ continue;\r
+ case 2:\r
+ logic[ch][i] = (byte)(data[offset - 1] & 0xF);\r
+ continue;\r
+ case 1:\r
+ logic[ch][i] = (byte)(data[offset - 2] >> 4);\r
+ continue;\r
+ }\r
+ logic[ch][i] = (byte)(data[offset] & 0xF);\r
+ offset += 2;\r
+ }\r
for (int ch = 0; ch < analog.Length; ++ch)\r
{\r
// 内部的に -32768 オフセットして -32768~32767に\r
- analog[ch][i] = \r
+ analog[ch][i] =\r
(short)(BitConverter.ToUInt16(data, offset) - 0x8000);\r
offset += 2;\r
}\r
}\r
for (int ch = 0; ch < analog.Length; ++ch)\r
{\r
- analog[ch] = new short[n];\r
- }\r
- for (int ch = 0; ch < analog.Length; ++ch)\r
- {\r
analog[ch] = new short[n + n];\r
}\r
for (int i = 0; i < n; ++i)\r
analog[ch][i] =\r
(short)(BitConverter.ToUInt16(data, offset) - 0x8000);\r
analog[ch][i + 1] =\r
- (short)(BitConverter.ToUInt16(data, offset + 2) \r
+ (short)(BitConverter.ToUInt16(data, offset + 2)\r
- 0x8000);\r
offset += 4;\r
}\r
private void ReadDataChunkWithoutBHeaders(byte[] data)\r
{\r
int numberOfAnalogCh = 0;\r
- int numberOfLogicCh = 0;\r
- bool leap = false;\r
+ int numberOfLogicUnit = 0;\r
List<int> analogChMap = new List<int>(16);\r
ulong flags = (ulong)temp.Settings.SavedAnalogChannel;\r
for (int i = 0; i < 60; ++i)\r
{\r
- if (flags == 0)\r
- {\r
- break;\r
- }\r
if ((flags & 1) != 0)\r
{\r
numberOfAnalogCh++;\r
analogChMap.Add(i);\r
}\r
- else\r
+ flags >>= 1;\r
+ }\r
+ flags = (ulong)temp.Settings.SavedLogicUnit;\r
+ for (int i = 0; i < 32; ++i)\r
+ {\r
+ if ((flags & 1) != 0)\r
{\r
- leap = true;\r
+ numberOfLogicUnit++;\r
}\r
flags >>= 1;\r
}\r
\r
int n = settings.SaveDataNumber;\r
short[][] analog = new short[numberOfAnalogCh][];\r
- byte[][] logic = new byte[numberOfLogicCh][];\r
+ byte[][] logic = new byte[numberOfLogicUnit][];\r
\r
if (mHeader is MHeader)\r
{\r
readersM[settings.Function](data, n, analog, logic);\r
}\r
- else \r
+ else\r
{\r
readers[settings.Function](data, n, analog, logic);\r
}\r
- \r
+\r
for (int i = 0; i < analog.Length; ++i)\r
{\r
- AnalogChannel c = (leap) ? \r
- temp.GetAnalogChannel(analogChMap[i] + 1)\r
- : temp.ChannelData[i];\r
+ AnalogChannel c = temp.ChannelData[i];\r
if (c == null)\r
{\r
throw new Exception("invalid channel settings");\r
}\r
return values;\r
}\r
+\r
+ private static long MapFlagStringToBits(string flags)\r
+ {\r
+ long bits = 0;\r
+ long cursor = 1;\r
+ foreach (char b in flags)\r
+ {\r
+ bits += (b == '1') ? cursor : 0;\r
+ cursor += cursor;\r
+ }\r
+ return bits;\r
+ }\r
#endregion\r
}\r
}\r