// 透光率 public static HolesT CaculateT(HolesAD ad, HolesAD fullAd, TLimit limit) { HolesT t = new HolesT(ad.LED_ROW, ad.LED_COL, ad.LED_NUMS); for (int i = 0; i < ad.LED_ROW; ++i) { for (int j = 0; j < ad.LED_COL; ++j) { for (int k = 0; k < ad.LED_NUMS; ++k) { if (0 == fullAd.adValues[i][j][k]) { t.tValues[i][j][k] = _VALUE_INVALID; } else { t.tValues[i][j][k] = ad.adValues[i][j][k] * 1.0 / fullAd.adValues[i][j][k]; // 以下情况做特别处理 if (t.tValues[i][j][k] >= limit.T_MAX_VALUE) { t.tValues[i][j][k] = _VALUE_OVERFLOW; } else if ((t.tValues[i][j][k] >= limit._100Min) && (t.tValues[i][j][k] <= limit._100Max)) { t.tValues[i][j][k] = 1; } } } } } return(t); }
/// <summary> /// 透光率|分光度TEST /// </summary> /// <param name="ad"></param> /// <param name="fullAd"></param> /// <param name="limit"></param> /// <param name="str"></param> /// <returns></returns> public static List <double> CaculateT(HolesAD ad, HolesAD fullAd, TLimit limit, string str) { List <double> dbList = new List <double>(); HolesT t = new HolesT(ad.LED_ROW, ad.LED_COL, ad.LED_NUMS); for (int i = 0; i < ad.LED_ROW; ++i) { for (int j = 0; j < ad.LED_COL; ++j) { for (int k = 0; k < ad.LED_NUMS; ++k) { if (0 != fullAd.adValues[i][j][k]) { t.tValues[i][j][k] = ad.adValues[i][j][k] * 1.0 / fullAd.adValues[i][j][k]; // 以下情况做特别处理 if (t.tValues[i][j][k] >= limit.T_MAX_VALUE) { t.tValues[i][j][k] = _VALUE_OVERFLOW; } else if ((t.tValues[i][j][k] >= limit._100Min) && (t.tValues[i][j][k] <= limit._100Max)) { t.tValues[i][j][k] = 1; } dbList.Add(t.tValues[i][j][k]); } else { dbList.Add(0); } } } } return(dbList); }
public static List <double> CaculateA(HolesAD ad, HolesAD fullAd, HolesT t, ALimit limit, string str) { List <double> tgList = new List <double>(); HolesA a = new HolesA(t.LED_ROW, t.LED_COL, t.LED_NUMS); for (int i = 0; i < t.LED_ROW; ++i) { for (int j = 0; j < t.LED_COL; ++j) { for (int k = 0; k < t.LED_NUMS; ++k) { if (_VALUE_INVALID == t.tValues[i][j][k]) { a.aValues[i][j][k] = _VALUE_INVALID; } else if (_VALUE_OVERFLOW == t.tValues[i][j][k]) { a.aValues[i][j][k] = _VALUE_OVERFLOW; } else if (1 == t.tValues[i][j][k]) { a.aValues[i][j][k] = 0; } else { if (ad.adValues[i][j][k] < 1) { a.aValues[i][j][k] = 5; } else { a.aValues[i][j][k] = Math.Log10(fullAd.adValues[i][j][k] / ad.adValues[i][j][k]); } } tgList.Add(a.aValues[i][j][k]); } } } return(tgList); }
// 原始数据转为AD值 public static HolesAD RawDataToAD(byte[] data) { int idx = 1; int LED_ROW = data[idx]; int LED_COL = 8; int LED_NUMS = 4; HolesAD ad = new HolesAD(LED_ROW, LED_COL, LED_NUMS); idx = 2; for (int i = 0; i < LED_ROW; ++i) { ++idx;// 1个byte的长度 // 灯全灭,暗电流 ad.darkAdValues[i] = ((UInt32)data[idx]) + ((UInt32)(data[idx + 1] << 8)) + ((UInt32)(data[idx + 2] << 16)) + ((UInt32)(data[idx + 3] << 24)); idx += 4; for (int j = 0; j < LED_COL; ++j) { for (int k = 0; k < LED_NUMS; ++k) { ad.adValues[i][j][k] = ((UInt32)data[idx]) + ((UInt32)(data[idx + 1] << 8)) + ((UInt32)(data[idx + 2] << 16)) + ((UInt32)(data[idx + 3] << 24)); idx += 4; if (ad.adValues[i][j][k] < ad.darkAdValues[i]) { ad.adValues[i][j][k] = 0; } else { ad.adValues[i][j][k] -= ad.darkAdValues[i]; } // adValues[offset] * 1000 / 0x10000 ,将AD转换成3.3V的千分之几。直观显示。 } } ++idx;// 1个byte的校验 } return(ad); }
// 吸光度 标准曲线法,只需要计算吸光度即可。 public static HolesA CaculateA(HolesAD ad, HolesAD fullAd, HolesT t, ALimit limit) { HolesA a = new HolesA(t.LED_ROW, t.LED_COL, t.LED_NUMS); for (int i = 0; i < t.LED_ROW; ++i) { for (int j = 0; j < t.LED_COL; ++j) { for (int k = 0; k < t.LED_NUMS; ++k) { if (_VALUE_INVALID == t.tValues[i][j][k]) { a.aValues[i][j][k] = _VALUE_INVALID; } else if (_VALUE_OVERFLOW == t.tValues[i][j][k]) { a.aValues[i][j][k] = _VALUE_OVERFLOW; } else if (1 == t.tValues[i][j][k]) { a.aValues[i][j][k] = 0; } else { if (ad.adValues[i][j][k] < 1) { a.aValues[i][j][k] = 5; } else { a.aValues[i][j][k] = Math.Log10(fullAd.adValues[i][j][k] / ad.adValues[i][j][k]); } } } } } return(a); }