aboutsummaryrefslogtreecommitdiff
blob: e00d792fc23095d1897ff7ed0b8f00263e8afa7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using PollutometerWebApi.Models;

namespace PollutometerWebApi
{
    public static class AqiCalculator
    {
        public static Aqi CalculateAqi(Reading reading)
        {
            double[,,] breakpoints =
            {
                {
                    {0, 4.4},
                    {4.5, 9.4},
                    {9.5, 12.4},
                    {12.5, 15.4},
                    {15.5, 30.4},
                    {30.5, 40.4},
                    {40.5, 50.4}
                },
                {
                    {0.000, 0.034},
                    {0.035, 0.144},
                    {0.145, 0.224},
                    {0.225, 0.304},
                    {0.305, 0.604},
                    {0.605, 0.804},
                    {0.805, 1.004}
                },
                {
                    {0, 0.05},
                    {0.08, 0.10},
                    {0.15, 0.20},
                    {0.25, 0.31},
                    {0.65, 1.24},
                    {1.25, 1.64},
                    {1.65, 2.04}
                },
                {
                    {0, 50},
                    {51, 100},
                    {101, 150},
                    {151, 200},
                    {201, 300},
                    {301, 400},
                    {401, 500}
                }
            };

            double i, c = 0, cLow = 0, cHigh = 0, iLow = 0, iHigh = 0;
            Aqi aqi = new Aqi();
           
            for (int x = 0; x < 4; x++)
            {
                switch (x)
                {
                    case 0:
                        c = reading.Co;
                        break;
                    case 1:
                        c = reading.So;
                        break;
                    case 2:
                        c = reading.No;
                        break;
                }

                for (int y = 0; y < 7; y++)
				{
					if (c >= breakpoints[x, y, 0] && c <= breakpoints[x, y, 1])
					{
						cLow = breakpoints[x, y, 0];
						cHigh = breakpoints[x, y, 1];
						iLow = breakpoints[3, y, 0];
						iHigh = breakpoints[3, y, 1];
                        break;
					}
				}

                i = (iHigh - iLow) / (cHigh - cLow) * (c - cLow) + iLow;

                if (i > aqi.Value)
                { 
                    aqi.Value = i;
                    switch (x)
                    {
                        case 0:
                            aqi.GasName = "CO";
                            break;
                        case 1:
                            aqi.GasName = "SO";
                            break;
                        case 2:
                            aqi.GasName = "NO";
                            break;
                    }
                }
            }

            return aqi;
        }
    }
}