#include<Wire.h>
#include<Arduino.h>
#include<WiFi.h>
#include<WiFiMulti.h>
#include<HTTPClient.h>

WiFiMulti wifiMulti;

int16_t AcX;
int16_t AcY;
int16_t AcZ;

int16_t xArray[100];
int16_t yArray[100];
int16_t zArray[100];
float xaverage = 0;
float yaverage = 0;
float zaverage = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  for(uint8_t t = 4; t > 0; t--) {
    Serial.printf("[SETUP] WAIT %d...\n", t);
    Serial.flush();
    delay(1000);
  }
  wifiMulti.addAP("OSU_Access", "");
  
  Wire.begin(33,32,400000);
  Wire.beginTransmission(0x68); //0x68 is hexadecimal. This is the address
  Wire.write(0x6B); //0x6B is hexadecimal. It is the same as 107 in decimal
  Wire.write(0);
  Wire.endTransmission(true);

  
  
}


void loop() {
  // put your main code here, to run repeatedly:
  
  //average of 100 values of AcX, AcY, AcZ
  for(int index = 0; index < 100; index++){
    Wire.beginTransmission(0x68);
    Wire.write(0x3B); //0x3B is hexadecimal
    Wire.endTransmission(false);
    Wire.requestFrom(0x68,6,true);
   
    AcX = Wire.read()<<8|Wire.read(); // Combines two bytes into a single int. X axis 
    AcY = Wire.read()<<8|Wire.read(); // Combines two bytes into a single int. Y axis
    AcZ = Wire.read()<<8|Wire.read(); // Combines two bytes into a single int. Z axis
    
    xArray[index]=AcX;
    yArray[index]=AcY;
    zArray[index]=AcZ;
    
    xaverage = xaverage + xArray[index];
    yaverage = yaverage + yArray[index];
    zaverage = zaverage + zArray[index];
  }

  xaverage = xaverage/100;
  yaverage = yaverage/100;
  zaverage = zaverage/100;

  String gesture;

  if ((xaverage > 15500) && (-3000 < yaverage < 1000) && (500 < zaverage < 2500)){//hello gesture
    Serial.println("Hello");
    gesture = "hello";
  }
  else if ((0 < xaverage < 3000) && (yaverage > 15500) && (1000 < zaverage < 5000)){//pointing gesture
    Serial.println("Point");
    gesture = "point";
  }
  else if((-2000 < xaverage < 2000) && (-2000 < yaverage < 1500) && (zaverage > 15500)){//palm down gesture
    Serial.println("Palm Down");
    gesture = "palmdown";
  }
  else if((-2000 < xaverage < 2000) && (-3000 < yaverage < 1000) && (zaverage < -14000)){//palm down gesture
    Serial.println("Palm Up");
    gesture = "palmup";
  }
  
  Serial.print(xaverage);
  Serial.print(",");
  Serial.print(yaverage);
  Serial.print(",");
  Serial.println(zaverage);
  
  if ((wifiMulti.run() == WL_CONNECTED)) { //wait for wifi connection
    HTTPClient http; //Creates an HTTPClient object to be used
    //Begins a request we will eventually POST
    http.begin("https://web.engr.oregonstate.edu/~mccoyh/finalAssignment.php");//need webspace
    //Setup this request to look like an HTML form
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    //Data to send with HTTP POST
    String myString;
    myString = "gesture=";
    myString = myString + gesture;
    //Send HTTP POST request
    int httpCode = http.POST(myString);
    if(httpCode > 0) { //was there a valid response?
      if(httpCode == HTTP_CODE_OK) {
        String payload = http.getString();
        Serial.println(payload);
      }
      else{
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);
      }
      http.end();
    }
    
    
  }
}
