OSDN Git Service

ロジックチャンネルデータを含む8860形式ファイルに部分的に対応(#25000)
authorkimikage <kimikage_ceo@hotmail.com>
Wed, 14 Dec 2011 12:05:47 +0000 (21:05 +0900)
committerkimikage <kimikage_ceo@hotmail.com>
Wed, 14 Dec 2011 12:05:47 +0000 (21:05 +0900)
Karinto/HiokiHicorderDataReader.cs

index c501fd2..9915115 100755 (executable)
@@ -159,7 +159,7 @@ namespace Karinto
         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
@@ -177,7 +177,7 @@ namespace Karinto
             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
@@ -309,8 +309,8 @@ namespace Karinto
             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
@@ -318,6 +318,7 @@ namespace Karinto
                                             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
@@ -325,35 +326,16 @@ namespace Karinto
 \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
@@ -475,13 +457,13 @@ namespace Karinto
         {\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
@@ -496,7 +478,7 @@ namespace Karinto
         }\r
 \r
         private void ParseLwbbwInf(byte[] data)\r
-        { \r
+        {\r
             string id = Encoding.ASCII.GetString(data, 0, 8);\r
             if (id != "LWBBWINF")\r
             {\r
@@ -525,7 +507,7 @@ namespace Karinto
                     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
@@ -557,12 +539,33 @@ namespace Karinto
             {\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
@@ -591,10 +594,6 @@ namespace Karinto
             }\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
@@ -605,7 +604,7 @@ namespace Karinto
                     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
@@ -615,46 +614,44 @@ namespace Karinto
         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
@@ -759,6 +756,18 @@ namespace Karinto
             }\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