Changes to Calculate class.
[speedfreak] / Client / calculate.cpp
1 #include "calculate.h"
2 #include <math.h>
3
4 #include <QFile>
5 #include <QString>
6 #include <QTimer>
7 #include <QRegExp>
8
9 const double G_ACCELERATION = 9.80665;
10 const double SECONDS_IN_HOUR = 3600;
11
12 Calculate::Calculate() {
13
14     this->reset();
15
16 }
17
18 Calculate::~Calculate() {
19 }
20
21 void Calculate::reset() {
22
23     averageSpeed = 0;
24     currentSpeed = 0;
25     distanceTraveled = 0;
26     lastAcceleration = 0;
27     lastDistance = 0;
28     lastSpeed = 0;
29     numOfIterations = 0;
30     totalTime = 0;
31 }
32
33 /* Getters and setters
34    */
35
36 double Calculate::AverageSpeed()
37 {
38     return averageSpeed;
39 }
40 void Calculate::AverageSpeed(double value)
41 {
42     averageSpeed = value;
43 }
44 double Calculate::CurrentSpeed()
45 {
46     return currentSpeed;
47 }
48 void Calculate::CurrentSpeed(double value)
49 {
50     currentSpeed = value;
51 }
52 double Calculate::DistanceTraveled()
53 {
54     return distanceTraveled;
55 }
56 void Calculate::DistanceTraveled(double value)
57 {
58     distanceTraveled = value;
59 }
60 double Calculate::LastAcceleration()
61 {
62     return lastAcceleration;
63 }
64 void Calculate::LastAcceleration(double value)
65 {
66     lastAcceleration = value;
67 }
68 double Calculate::LastDistance()
69 {
70     return lastDistance;
71 }
72 void Calculate::LastDistance(double value)
73 {
74     lastDistance = value;
75 }
76 double Calculate::LastSpeed()
77 {
78     return lastSpeed;
79 }
80 void Calculate::LastSpeed(double value)
81 {
82     lastSpeed = value;
83 }
84 long Calculate::NumOfIterations()
85 {
86     return numOfIterations;
87 }
88 void Calculate::NumOfIterations(long value)
89 {
90     numOfIterations = value;
91 }
92 double Calculate::TotalTime()
93 {
94     return totalTime;
95 }
96 void Calculate::TotalTime(double value)
97 {
98     totalTime = value;
99 }
100
101 /*
102   This is a main function for calculating various parameters. Accelerometer
103   provides currentAcceleration and calling function measures time (seconds).
104   This function should be called 20-30 times/second to minimize
105   calculation error.
106
107   To be added: params like horsepower.
108   */
109 void Calculate::CalculateParameters(double currentAcceleration, double seconds)
110 {
111     numOfIterations++;
112     totalTime = (totalTime + seconds);
113
114     // v=v0 + a*t
115     // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
116
117     /* First integration of acceleration provides speed
118        */
119     currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
120
121     /* Second integration: distance.
122        */
123     distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
124
125     /* Average speed
126        */
127     averageSpeed = (distanceTraveled / totalTime);
128
129     /* Check for movement
130            */
131     accelStoppedCheck(currentAcceleration);
132
133     lastSpeed = currentSpeed;
134     lastAcceleration = currentAcceleration;
135     lastDistance = distanceTraveled;
136 }
137
138 /**
139   * This function checks if acceleration has stopped for
140   * a short period of time. Velocity is set to zero to avoid
141   * distance errors.
142   */
143 void Calculate::accelStoppedCheck(double currentAcceleration) {
144
145     // counting number of acceleration samples that equals zero
146     if (currentAcceleration==0)
147     {
148         count++;
149     }
150     else
151     {
152         count = 0;
153     }
154
155     // if count exceeds 25, we assume that velocity is zero
156     if (count >= 25)
157     {
158         currentSpeed=0;
159     }
160 }
161
162