/// <summary> /// CorrectData.xmlから補正値、タイミング値を取得します。 ///ファイルが見つからない場合、 ///ファイルに書き込みができない場合、例外を発生させます。 /// </summary> /// <param name="CorrectData">読出した補正値・タイミング値を格納する構造体</param> /// <returns></returns> public void GetCorrectData(ref CorrectDataStruct[] CorrectData) { // XMLファイルを読む var nodes = from n in xmlAccessor.document.Elements("correctdata") select n; // エントリの数を数える var bank = nodes.First(); int count = bank.Elements("entry").Count(); // 構造体を割り当てる CorrectData = new CorrectDataStruct[count]; // 構造体に読み込む int i = 0; foreach (var entry in bank.Elements()) { CorrectData[i].Type = Int32.Parse(entry.Attribute("type").Value); CorrectData[i].ID = Int32.Parse(entry.Attribute("workid").Value.Remove(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier); CorrectData[i].value = entry.Attribute("value").Value; i++; } }
/// <summary> /// 補正値を同期後に保存する /// </summary> public void CorrectDataSave() { int[] groupIDList = null; int[] workid = null; List<CorrectDataStruct> correctDataStructList = new List<CorrectDataStruct>(); CorrectDataStruct[] correctDataStruct_old = null; CorrectDataStruct[] correctDataStruct_new = null; CorrectDataStruct correctDataStruct_tmp; MemAllocStruct memAllocStruct = null; //システムデータを参照 correctdata.GetCorrectData(ref correctDataStruct_old); //ArrayListにコピー correctDataStructList.AddRange(correctDataStruct_old); foreach (var type in new[] { SystemConstants.WORKID_TYPE_CORRECTDATA, SystemConstants.WORKID_TYPE_TIMINGDATA }) { //group codeを全取得 GetMemryDataGroupList(type, SystemConstants.WORKGROUP_ROOT, ref groupIDList); for (int i = 0; i < groupIDList.Length; i++) { //グループごとのworkidを全取得 GetMemryDataGroupList(type, groupIDList[i], ref workid); for (int j = 0; j < workid.Length; j++) { //該当workidのメモリ割り当てデータを取得 memAllocStruct = memalloc.GetEntry(type, workid[j]); //CorrectDataにtypeがタイミングでwork[j]が存在するかチェック var nodes = from n in correctDataStruct_old where n.Type == type && n.ID == workid[j] select n; //システムデータに該当するIDの補正値が存在しない場合 if (nodes.Count() == 0) { //システムデータに存在しなしworkidの構造体作成 correctDataStruct_tmp.Type = type; correctDataStruct_tmp.ID = workid[j]; correctDataStruct_tmp.value = memAllocStruct.DefaultValue.ToString(); //ArrayListに追加 correctDataStructList.Add(correctDataStruct_tmp); } // 存在する場合 else { double WorkData = 0; ReadData(workid[j], ref WorkData, type); CorrectDataStruct correct = nodes.First(); correct.ID = workid[j]; correct.Type = type; correct.value = WorkData.ToString(); } } } } //システムデータに反映 correctDataStruct_new = new CorrectDataStruct[correctDataStructList.Count]; for (int k = 0; k < correctDataStructList.Count; k++) { correctDataStruct_new[k] = correctDataStructList[k]; } //xmlに書き込み correctdata.WriteCorrectData(correctDataStruct_new); }
/// <summary> /// 補正値、タイミング値をCorrectData.xmlに書き込みます。 ///ファイルが見つからない場合、 ///ファイルに書き込みができない場合、例外を発生させます。 /// </summary> /// <param name="CorrectData">書き込む補正値・タイミング値を格納する構造体</param> /// <returns></returns> public void WriteCorrectData(CorrectDataStruct[] CorrectData) { // XMLファイルを読む var nodes = from n in xmlAccessor.document.Elements("correctdata") select n; XElement entry; entry = nodes.First(); entry.RemoveNodes(); // エントリを作る for (int i = 0; i < CorrectData.Length; i++) { var elem = new XElement("entry"); elem.SetAttributeValue("type", CorrectData[i].Type); elem.SetAttributeValue("workid", string.Format("0x{0:X4}", CorrectData[i].ID)); elem.SetAttributeValue("value", CorrectData[i].value); entry.Add(elem); } // XMLファイルにセーブする try { // XMLファイルを開く xmlAccessor.SaveXmlFile(xmlFileName); } finally { Utility.DeleteBackupFile(xmlFileName); } }
/// <summary> /// 同期処理(データの送信) /// </summary> /// <param name="type"></param> private int DataSend(int type, bool sendFlag = true) { int[] groupIDList = null; int[] workid = null; int sendCount = 0; List<CorrectDataStruct> correctDataStructList = new List<CorrectDataStruct>(); CorrectDataStruct[] correctDataStruct_old = null; CorrectDataStruct[] correctDataStruct_new = null; CorrectDataStruct correctDataStruct_tmp; MemAllocStruct memAllocStruct = null; //システムデータを参照 correctdata.GetCorrectData(ref correctDataStruct_old); //ArrayListにコピー correctDataStructList.AddRange(correctDataStruct_old); //group codeを全取得 GetMemryDataGroupList(type, SystemConstants.WORKGROUP_ROOT, ref groupIDList); for (int i = 0; i < groupIDList.Length; i++) { //グループごとのworkidを全取得 GetMemryDataGroupList(type, groupIDList[i], ref workid); for (int j = 0; j < workid.Length; j++) { //該当workidのメモリ割り当てデータを取得 memAllocStruct = memalloc.GetEntry(type, workid[j]); //CorrectDataにtypeがタイミングでwork[j]が存在するかチェック var nodes = from n in correctDataStruct_old where n.Type == type && n.ID == workid[j] select n; //システムデータに該当するIDの補正値が存在しない場合 if (nodes.Count() == 0) { if (sendFlag) { //標準値を書き込み writeCorrectData(type, workid[j], memAllocStruct.DefaultValue, false); } //システムデータに存在しなしworkidの構造体作成 correctDataStruct_tmp.Type = type; correctDataStruct_tmp.ID = workid[j]; correctDataStruct_tmp.value = memAllocStruct.DefaultValue.ToString(); //ArrayListに追加 correctDataStructList.Add(correctDataStruct_tmp); sendCount++; } //存在する場合 else { if (sendFlag) { // メモリへ書き込み writeCorrectData(type, workid[j], Convert.ToDouble(nodes.First().value), false); } sendCount++; } } } //システムデータに反映 correctDataStruct_new = new CorrectDataStruct[correctDataStructList.Count]; for (int k = 0; k < correctDataStructList.Count; k++) { correctDataStruct_new[k] = correctDataStructList[k]; } //xmlに書き込み correctdata.WriteCorrectData(correctDataStruct_new); return sendCount; }