예제 #1
0
        // 透光率
        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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        // 原始数据转为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);
        }
예제 #5
0
        // 吸光度 标准曲线法,只需要计算吸光度即可。
        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);
        }