示例#1
0
		public LaserDiode(List<int> sigDat,List<int> refDat) {
			_SamplingDataList = new List<SamplingData>();
			for (int i = 0; i < sigDat.Count(); i++) {
				SamplingData sd = new SamplingData(sigDat[i], refDat[i]);
				_SamplingDataList.Add(sd);
			}
		}
示例#2
0
		private string CheckOverFlow(int Threshold1,int Threshold2){
			List<SamplingData> inputAttLD = new List<SamplingData>();
			List<SamplingData> inputAdLD = new List<SamplingData>();

			//Initialize
			for (int i = 0; i < 9; i++) {
				SamplingData sd = new SamplingData(0, 0);
				inputAttLD.Add(sd);
			}
			for (int i = 0; i < 9; i++) {
				SamplingData sd = new SamplingData(0, 0);
				inputAdLD.Add(sd);
			}

			List<List<SamplingData>> src = new List<List<SamplingData>>(_machine.GetMaxSampData());

			//比較
			for (int i = 0; i < src[0].Count; i++) {
				if (src[0][i].GetSigData() > Threshold1 ) {
					inputAttLD[i].SetSigData(src[0][i].GetSigData());
				}
				if (src[0][i].GetRefData() > Threshold1) {
					inputAttLD[i].SetRefData(src[0][i].GetRefData());
				}
			}

			for (int i = 0; i < src[0].Count; i++) {
				if (src[1][i].GetSigData() > Threshold2 ) {
					inputAdLD[i].SetSigData(src[1][i].GetSigData());
				}
				if (src[1][i].GetRefData() > Threshold2) {
					inputAdLD[i].SetRefData(src[1][i].GetRefData());
				}
			}

			//出力
			string inputAttOverflow = "アッテネーター入力\tしきい値:"+ Threshold1 + "\r\n";
			string inputAdOverflow = "AD入力\tしきい値:"+ Threshold2 +"\r\n";
			
			for (int i = 0; i < inputAttLD.Count; i++) {
				if (inputAttLD[i].GetSigData() != 0) {
					inputAttOverflow += "LD" + i.ToString() + "\tSigが\t" + inputAttLD[i].GetSigData().ToString() + "\t飽和しています。\r\n";
				}
				if (inputAttLD[i].GetRefData() != 0) {
					inputAttOverflow += "LD" + i.ToString() + "\tRefが\t" + inputAttLD[i].GetRefData().ToString() + "\t飽和しています。\r\n";
				
				}
			}
			for (int i = 0; i < inputAdLD.Count; i++) {
				if (inputAdLD[i].GetSigData() != 0) {
					inputAdOverflow += "LD" + i.ToString() + "\tSigが\t" + inputAdLD[i].GetSigData().ToString() + "\t飽和しています。\r\n";
				}
				if (inputAdLD[i].GetRefData() != 0) {
					inputAdOverflow += "LD" + i.ToString() + "\tRefが\t" + inputAdLD[i].GetRefData().ToString() + "\t飽和しています。\r\n";
				
				}
			}

			string result = inputAttOverflow + "\r\n" + inputAdOverflow;
			return result;
		}
		//ソースである8chのLDの値からオフセットを引いて返す
		private List<SamplingData> GetDiffOffset(List<SamplingData> src, SamplingData offset) {
			List<SamplingData> result = new List<SamplingData>();
			result.Add(offset);
			foreach (SamplingData sd in src) {
				double sigBuf = sd.GetSigData() - offset.GetSigData();
				double refBuf = sd.GetRefData() - offset.GetRefData();
				SamplingData offsetRemovedSd = new SamplingData(sigBuf, refBuf);
				result.Add(offsetRemovedSd);
			}
			return result;
		}
        ////result1
        //public List<double> GetGammaList() {
        //    return this._avgGammaList;
        //}

        ////result2
        //public List<SamplingResult> GetAvgSamplingList() {
        //    return this._avgSamplingList;
        //}

        ////result3
        //public List<List<SamplingResult>> GetSamplingResult() {
        //    return this._allSamplingResult;
        //}

		public void Main() {
			List<LaserDiodeSet> src = _machine.GetLaserDiodeSetList();
			List<List<double>> allGammaList = new List<List<double>>(); //gamma6 * 30
            List<double> allBslList = new List<double>();
            List<List<SamplingResult>> allSamplingResult = new List<List<SamplingResult>>();
            List<List<SamplingResult>> allSamplingResultRaw = new List<List<SamplingResult>>();
            

			//Sampling Count x300
			for (int i = 0; i < src.Count; i++) {
				SamplingData offset = new SamplingData();
				List<SamplingData> averagedSampData = new List<SamplingData>();

				//LD x9
				for (int j = 0; j < numOfLaser; j++) {
					double sigAvg = 0;
					double refAvg = 0;

					//1パルスにおける測定点 x30
					for (int k = 0; k < measurePointsPerPulse; k++) {
						SamplingData sd = src[i].GetLaserDiodeList()[j].GetSamplingDataList()[k];
						sigAvg += sd.GetSigData();
						refAvg += sd.GetRefData();
					}

					//1パルスにおける測定点30個のデータを平均
					//①LD0~LD8の SIG、REFそれぞれ30個の平均を求めます。

					//LD0はオフセットなので確保
					if (j == 0) {
						double sigOffset = (double)sigAvg / (double)measurePointsPerPulse;
						double refOffset = (double)refAvg / (double)measurePointsPerPulse;
						offset = new SamplingData(sigOffset, refOffset);
					} else {
						double sigBuff = (double)sigAvg / (double)measurePointsPerPulse;
						double refBuff = (double)refAvg / (double)measurePointsPerPulse;
						SamplingData sd = new SamplingData(sigBuff,refBuff);
						averagedSampData.Add(sd);
					}
				}
				
				//②上記で求めたSIG、REFの平均について、LD1~LD8からLD0を引きます。
				List<SamplingData> offsetRemovedSampData = GetDiffOffset(averagedSampData, offset);

				//③LD1~LD8について②で求めた値でSIG/REFで反射率を求めます。表示用とガンマ用でそれぞれスイッチするRの値
				//List<SamplingResult> srList = MakeSigRefDivData(offsetRemovedSampData,false);
                //List<SamplingResult> dbg_srList = MakeSigRefDivData(offsetRemovedSampData,false);

				//③LD1~LD8について②で求めた値でSIG/REFで反射率を求めます。表示用とガンマ用でそれぞれスイッチするRの値
                //lambdaとLDの対応表を使って変換
                List<SamplingResult> srList = ResortByCorrespTable(MakeSigRefDivData(offsetRemovedSampData, false));

                //ガンマを求める用のR
                //List<SamplingResult> srListForGamma = MakeSigRefDivData(offsetRemovedSampData, true);
                //List<SamplingResult> dbg_srListForGamma = MakeSigRefDivData(offsetRemovedSampData, true);
                
                //ガンマを求める用のR
                //lambdaとLDの対応表を使って変換
                List<SamplingResult> srListForGamma = ResortByCorrespTable(MakeSigRefDivData(offsetRemovedSampData, true));


                //素直にsig/refをする関数
                List<SamplingResult> rawList = ResortByCorrespTable(MakeSigRefDivData(offsetRemovedSampData));


				//④上記反射率からγを求めます(6個)
				GammaManager gm = new GammaManager(srListForGamma,_settings);
				List<double> gammaList = gm.Main();
				allGammaList.Add(gammaList);
				//⑤①~④を300回行います。

                //得たガンマからBSLデータを作ります
                Bsl est = new Bsl();
                double bslList = est.Main(gammaList, _settings._data._estimate);
                allBslList.Add(bslList);

				//及び、反射率の300回平均も取る
				allSamplingResult.Add(srList);
                
                //シンプルにsig/refだけの生データ用
                allSamplingResultRaw.Add(rawList);


                
				
			}
			//⑥⑤で求めた300個のデータの平均を求めます。
			_avgGammaList = GetGammaAverage(allGammaList);
			_avgSamplingList = GetSamplingAverage(allSamplingResult);
            _avgBslList = GetBslAverage(allBslList);
           
            //下村さんの要請により、15/10/06 に追加
            _allGammaList = new List<List<double>>();
            _allSamplingResult = new List<List<SamplingResult>>();

            //ガンマの平均前生データ
            _allGammaList = allGammaList;
            //校正係数とアッテネーターゲインをかけたRの平均前生データ
            _allSamplingResult = allSamplingResult;
            //普通のsig/refをRとした平均前の生データ
            _allSamplingResultRaw = allSamplingResultRaw;
            //BSLの平均前生データ
            _allBslList = allBslList;

		}
		////************************************************
		////  パルス幅の設定
		////************************************************
		//public bool SetPulseWidth(List<byte> data) {
		//    bool result = false;

		//    if (CheckReceiveData(data, "SET WID ")) {
		//        result = true;
		//    }

		//    return result;
		//}

		////************************************************
		////  パルス幅の取得
		////************************************************
		//public bool GetPulseWidth(List<byte> data, int pulseWidth) {
		//    bool result = false;

		//    if (CheckReceiveData(data, "GET WID ")) {
                
		//        List<int> buf = GetParameters(data, 1, 2);
		//        pulseWidth = buf[0];
                
		//        result = true;
		//    }

		//    return result;
		//}
        
		////************************************************
		////  レーザーチャンネルの設定
		////************************************************
		//public bool SetLaserChannel(List<byte> data) {
		//    bool result = false;

		//    if (CheckReceiveData(data, "SET LAMB")) {
		//        result = true;
		//    }

		//    return result;
		//}

		////************************************************
		////   レーザーチャンネルの取得
		////************************************************
		//public bool GetLaserChannel(List<byte> data, List<int> LDchannel) {
		//    bool result = false;

		//    if (CheckReceiveData(data, "GET LAMB")) {

		//        List<int> buf = GetParameters(data,1, 2);
		//        LDchannel = buf;

		//        result = true;
		//    }
		//    return result;
		//}



		////************************************************
		////   レーザーパワーの取得
		////************************************************
		//public bool GetLaserPower(List<byte> data, List<int> offCurrents,List<int> onCurrents,int channelCount) {
		//    bool result = false;

		//    if (CheckReceiveData(data, "GET POW ")) {

		//        List<int> buf = GetParameters(data,16,2);
		//        int idx = 0;

		//        //代入
		//        offCurrents = new List<int>();
		//        onCurrents = new List<int>();
		//        for (int i = 0; i < channelCount; i++) {
		//            offCurrents.Add(buf[idx]);
		//            idx++;
		//        }
		//        for (int i = 0; i < channelCount; i++) {
		//            onCurrents.Add(buf[idx]);
		//            idx++;
		//        }

		//        result = true;
		//    }
		//    return result;
		//}

        #region データ操作メソッド系

        //サンプリングデータの最大値を取得 →オーバーフローエラー対策
        public List<List<SamplingData>> ExtractSamplingMaxValue(List<byte> data, int samplingCount) {
            List<List<SamplingData>> result = new List<List<SamplingData>>();
            int startIdx = 10;	//command 8 + status 2 
            List<SamplingData> maxDataKeeper0to1 = new List<SamplingData>();
            List<SamplingData> maxDataKeeper2to32 = new List<SamplingData>();
            List<byte> cloneData = new List<byte>(data);
			cloneData.RemoveRange(0, startIdx);

            //MaxDataKeeper0to1 Initialize
            for (int i = 0; i < 9; i++) {
                SamplingData sd = new SamplingData(0, 0);
                maxDataKeeper0to1.Add(sd);
            }
            //MaxDataKeeper2to32 Initialize
            for (int i = 0; i < 9; i++) {
                SamplingData sd = new SamplingData(0, 0);
                maxDataKeeper2to32.Add(sd);
            }


			int idx = 0;
			for (int k = 0; k < samplingCount; k++) {
				//offset + LD1 - LD8
				List<List<int>> sig9Dat = new List<List<int>>();
				List<List<int>> ref9Dat = new List<List<int>>();
				for (int i = 0; i < 9; i++) {

					//sig
					List<int> sigDat = new List<int>();
					List<byte> sigBuf = new List<byte>();

					for (int j = 0; j < 32 * 2; j++) {
						sigBuf.Add(cloneData[idx]);
						if (sigBuf.Count == 2) {
							sigDat.Add(WordToInt(sigBuf.ToArray()));
							sigBuf.Clear();
						}
						idx++;
					}

                    List<int> sigDat2to32 = new List<int>(sigDat);
                    List<int> sigDat0to1 = new List<int>(sigDat);
                    sigDat0to1.RemoveRange(2, 30);  //最初の2つだけのオーバーフロー監視用
                    sigDat2to32.RemoveRange(0, 2);  //最初の2つを省く残りの30のオーバーフロー監視用

                    //暫定Max値
                    int provisionalSigMax0to1 = sigDat0to1.Max();
                    int provisionalSigMax2to32 = sigDat2to32.Max();

                    //歴代の0to1Max値と比較
                    if (maxDataKeeper0to1[i].GetSigData() < (double)provisionalSigMax0to1) {
                        maxDataKeeper0to1[i].SetSigData((double)provisionalSigMax0to1);
                    }
                    //歴代2to32Max値と比較
                    if (maxDataKeeper2to32[i].GetSigData() < (double)provisionalSigMax2to32) {
                        maxDataKeeper2to32[i].SetSigData((double)provisionalSigMax2to32);
                    }

                    //sig9Dat.Add(sigDat);
                    
					//ref
					List<int> refDat = new List<int>();
					List<byte> refBuf = new List<byte>();

					for (int j = 0; j < 32 * 2; j++) {
						refBuf.Add(cloneData[idx]);
						if (refBuf.Count == 2) {
							refDat.Add(WordToInt(refBuf.ToArray()));
							refBuf.Clear();
						}
						idx++;
					}
                    List<int> refDat2to32 = new List<int>(refDat);
                    List<int> refDat0to1 = new List<int>(refDat);
                    refDat0to1.RemoveRange(2, 30);  //最初の2つだけのオーバーフロー監視用
                    refDat2to32.RemoveRange(0, 2);  //最初の2つを省く残りの30のオーバーフロー監視用

                    //暫定Max値
                    int provisionalRefMax0to1 = refDat0to1.Max();
                    int provisionalRefMax2to32 = refDat2to32.Max();

                    //歴代の0to1Max値と比較
                    if (maxDataKeeper0to1[i].GetRefData() < (double)provisionalRefMax0to1) {
                        maxDataKeeper0to1[i].SetRefData((double)provisionalRefMax0to1);
                    }
                    //歴代2to32Max値と比較
                    if (maxDataKeeper2to32[i].GetRefData() < (double)provisionalRefMax2to32) {
                        maxDataKeeper2to32[i].SetRefData((double)provisionalRefMax2to32);
                    }

				}
			}
            result.Add(maxDataKeeper0to1);
            result.Add(maxDataKeeper2to32);
 
            return result;
        }