Modifying version number for building on tizen 3.0
[platform/upstream/iotivity.git] / service / soft-sensor-manager / SampleApp / arduino / Trackee_Thing / src / proximity.cpp
1 /*
2  * proximity.cpp
3  *
4  *  Created on: 2014. 11. 13.
5  *      Author: eunseok
6  */
7
8 #include "Arduino.h"
9 #include "proximity.h"
10 #include <math.h>
11
12 // Proximity code start
13 float CalculateExponentialAverage(int numberOfSamples, int* array, int startindex, int flag){
14         float numerator = 0;
15         float denominator = 0;
16
17         float average = 0.0;
18
19         if (flag < arraysize / RSSI_EA)   // first loop buffer full
20         {
21                 for (int i = 0; i < startindex; i++)
22                 {
23                         average += array[i];
24                 }
25                 if(startindex == 0){}
26                 else{
27                         average = average / startindex;
28                 }
29
30                 Serial.print("average1 : ");
31                 Serial.println(average);
32         }
33         else
34         {
35                 for (int i = 0; i < arraysize; i++)
36                 {
37                         average += array[i];
38                 }
39
40                 for (int i = startindex; i < startindex + RSSI_EA; i++)
41                 {
42                         average -= array[i];
43                 }
44                 average = average / (arraysize - numberOfSamples);
45
46                 Serial.print("average2 : ");
47                 Serial.println(average);
48         }
49         //exponential moving average
50         int i = 0;
51         //CHANGE THIS FOR DIFFERENT SMOOTHING EFFECT
52         float beta=0.8f;
53         for (i = startindex + numberOfSamples - 1; i >= startindex; i--)
54         {
55                 numerator += array[i]* pow(beta, startindex + numberOfSamples - i - 1);
56                 denominator += pow(beta, startindex + numberOfSamples - i - 1);
57         }
58
59         int offset = 3;
60         if(average != 0.0){
61           numerator += average * pow(beta, offset + numberOfSamples);
62           denominator += pow(beta, offset + numberOfSamples);
63         }
64         return numerator / denominator;
65 }
66
67
68 float calculateDistance(float avgRSSI, float txPower)
69 {
70         if (avgRSSI == 0)
71         {
72                 return -1.0;
73         }
74
75         float ratio = avgRSSI*1.0/txPower;
76         if (ratio < 1.0)
77         {
78                 return pow(ratio,10);
79         }
80         else
81         {
82                 float distance =  (0.7)*pow(ratio,10) + 0.024;
83                 return distance;
84         }
85 }
86
87 // proximity code end
88