#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Adafruit_NeoPixel.h>
#include <Adafruit_ILI9341.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//#define BTN_PIN 5
#define TFT_DC 2 //TFT is screen
#define TFT_CS 15
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN 21
#define PIN2 22
#define NUMPIXELS 16
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixelTime(NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800);
String APP_ID = "b04f89cb-1cdd-440d-9375-816d794f0aab";
String APP_KEY = "62e76176-335a-4bc7-a147-5389199a9811";
String Refresh_Token = "OAUTH2.eyJraWQiOiJkZ0x3cjNRMCIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wiaWRcIjpcImM2ZjQyNmE1LTU2YjUtNDlmNi1iZjI1LThjYWJhODEzNzZlNVwifSIsImlhdCI6MTY3MjkyODUxMCwiZXhwIjoxNzM2MDAwNTEwfQ.83ioKIFckOLe4UhcTFSDMI1MaJvUpp2AC8apNz9Ed-g";
String Studio_ScheduleID = "0f74afb2-70af-484e-a51d-9adc4271e61a";
String querybookingUrl = "http://www.wixapis.com/bookings/v1/bookings/query";
const String authorizationUrl = "https://www.wixapis.com/oauth/access";
String databody = "{\"grant_type\":\"refresh_token\",\"client_id\":\"b04f89cb-1cdd-440d-9375-816d794f0aab\",\"client_secret\":\"62e76176-335a-4bc7-a147-5389199a9811\",\"refresh_token\":\"OAUTH2.eyJraWQiOiJkZ0x3cjNRMCIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wiaWRcIjpcImM2ZjQyNmE1LTU2YjUtNDlmNi1iZjI1LThjYWJhODEzNzZlNVwifSIsImlhdCI6MTY3MjkyODUxMCwiZXhwIjoxNzM2MDAwNTEwfQ.83ioKIFckOLe4UhcTFSDMI1MaJvUpp2AC8apNz9Ed-g\"}";
const String databody2 = "grant_type=refresh_token&client_id=b04f89cb-1cdd-440d-9375-816d794f0aab&client_secret=62e76176-335a-4bc7-a147-5389199a9811&refresh_token=OAUTH2.eyJraWQiOiJkZ0x3cjNRMCIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wiaWRcIjpcImM2ZjQyNmE1LTU2YjUtNDlmNi1iZjI1LThjYWJhODEzNzZlNVwifSIsImlhdCI6MTY3MjkyODUxMCwiZXhwIjoxNzM2MDAwNTEwfQ.83ioKIFckOLe4UhcTFSDMI1MaJvUpp2AC8apNz9Ed-g";
String timeUrl = "http://worldtimeapi.org/api/timezone/Europe/Paris";
unsigned long lastTime = 0;
unsigned long timerDelay = 10000;
String dateTime = " ";
int hour = 0;
int minute = 0;
int timeSlot = 0;
int bookSlot = 0;
int bookingCount = 0;
//getting the authentication
String getToken() {
String json;
//WiFiClient client;
HTTPClient http;
//http.useHTTP10(true);
http.begin(authorizationUrl);
http.addHeader("Content-Type", "application/json");
const size_t CAPACITY = JSON_OBJECT_SIZE(4);
StaticJsonDocument<CAPACITY> doc;
JsonObject object = doc.to<JsonObject>();
object["grant_type"]="refresh_token";
object["client_id"]="b04f89cb-1cdd-440d-9375-816d794f0aab";
object["client_secret"] = "62e76176-335a-4bc7-a147-5389199a9811";
object["refresh_token"] = "OAUTH2.eyJraWQiOiJkZ0x3cjNRMCIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wiaWRcIjpcImM2ZjQyNmE1LTU2YjUtNDlmNi1iZjI1LThjYWJhODEzNzZlNVwifSIsImlhdCI6MTY3MjkyODUxMCwiZXhwIjoxNzM2MDAwNTEwfQ.83ioKIFckOLe4UhcTFSDMI1MaJvUpp2AC8apNz9Ed-g";
serializeJson(doc, json);
int httpResponseCode = http.POST(json);
if(httpResponseCode > 0)
{
String result = http.getString();
//const size_t CAPACITY2 = JSON_OBJECT_SIZE(2);
DynamicJsonDocument doc2(ESP.getMaxAllocHeap());
DeserializationError error = deserializeJson(doc2, result);
if(error)
{
Serial.println(error.f_str());
return error.f_str() ;
}else
{
JsonObject object2 = doc2.as<JsonObject>();
String accessToken = object2["access_token"].as<String>();
return accessToken;
}
http.end();
}else
{
http.end();
String response = " error";
return response;
}
}
//getting the booking
float* getBooking(String access_token, String apiDate){
String json2;
HTTPClient http2;
http2.begin(querybookingUrl);
http2.addHeader("Authorization", access_token);
StaticJsonDocument<256> doc3;
JsonObject object3 = doc3["query"].createNestedObject("filter");
object3 ["scheduleId"] = Studio_ScheduleID;
JsonArray andArray = object3.createNestedArray("$and");
JsonObject object0 = andArray.createNestedObject();
object0 ["status"]= "CONFIRMED";
String cStart = apiDate + "08:00:00Z";
String cEnd = apiDate + "20:00:00Z";
const char* charStart = cStart.c_str();
const char* charEnd = cEnd.c_str();
//tft.println(c);
object0 ["startTime"]["$gte"] = charStart;
andArray[1] ["endTime"]["$lte"] = charEnd;
tft.setTextColor(ILI9341_RED);
serializeJson(doc3, json2);
int httpResponseCode2 = http2.POST(json2);
float* bookingTimes = new float[24];
if(httpResponseCode2 > 0)
{
String result2 = http2.getString();
DynamicJsonDocument doc4(ESP.getMaxAllocHeap());
DeserializationError error2 = deserializeJson(doc4, result2);
if(error2)
{
Serial.println(error2.f_str());
bookingTimes[0] = 1.0101;
//return bookingTimes;
}else
{
JsonObject object4 = doc4.as<JsonObject>();
int count = object4["pagingMetadata"]["count"];
bookingCount = count;
tft.setTextColor(ILI9341_GREEN);
// tft.println(count);
for(int i=0 ; i<count; i++)
{
String bookingStart = object4["bookingsEntries"][i]["booking"]["bookedEntity"]["singleSession"]["start"];
String booking = bookingStart.substring(11,16);
String hourString = booking.substring(0, 2);
String minuteString = booking.substring(3, 5);
float bookHour = hourString.toFloat();
float bookMinute = minuteString.toFloat();
float time = bookHour + (bookMinute/100) + 1.0;
bookingTimes[i] = time;
//tft.println(bookingTimes[i]);
}
}
}else
{
bookingTimes[0]=0.1010;
//return debug;
}
return bookingTimes;
http2.end();
}
//Getting the current date
String getDate(){
HTTPClient http3;
http3.begin(timeUrl.c_str());
int httpResponseCode3 = http3.GET();
if(httpResponseCode3 > 0){
String date = http3.getString();
DynamicJsonDocument doc5(ESP.getMaxAllocHeap());
DeserializationError error3 = deserializeJson(doc5, date);
if(error3)
{
Serial.println(error3.f_str());
return error3.f_str() ;
}else
{
JsonObject object5 = doc5.as<JsonObject>();
String datetime = object5["datetime"];
String sliced_date = datetime.substring(11, 16);
String date = datetime.substring(0, 11);
//tft.println(sliced_date);
hour = sliced_date.substring(0, 2).toInt();
minute = sliced_date.substring(3, 5).toInt();
//tft.println(hour);
//tft.println(minute);
//tft.setTextColor(ILI9341_RED);
//tft.println(date.c_str());
return date.c_str();
}
}else{
const char* dateError = "can't connect to date api";
return dateError;
}
http3.end();
}
int* nextData() {
tft.setTextColor(ILI9341_WHITE);
String token = getToken();
String date = getDate(); //update hour and minute at the same time
float* ptr = getBooking(token, date);
//tft.setTextColor(ILI9341_GREEN);// turn greeeeeennn!!!
if(hour == 8 )
{
if(minute < 30) timeSlot = 0;
else timeSlot = 1 ;
}else if(hour == 9 )
{
if(minute < 30) timeSlot = 2;
else timeSlot = 3;
}else if(hour == 10 )
{
if(minute < 30) timeSlot = 4 ;
else timeSlot = 5 ;
}else if(hour == 11 )
{
if(minute < 30) timeSlot = 6 ;
else timeSlot = 7;
}else if(hour == 12 )
{
if(minute < 30) timeSlot = 8;
else timeSlot = 9 ;
}else if(hour == 13 )
{
if(minute < 30) timeSlot = 10;
else timeSlot = 11 ;
}else if(hour == 14 )
{
if(minute < 30) timeSlot = 12 ;
else timeSlot = 13 ;
}else if(hour == 15 )
{
if(minute < 30) timeSlot = 14 ;
else timeSlot = 15 ;
}else if(hour == 16 )
{
if(minute < 30) timeSlot = 16;
else timeSlot = 16 ;
}else if(hour == 17 )
{
if(minute < 30) timeSlot = 16 ;
else timeSlot = 16;
}else if(hour == 18 )
{
if(minute < 30) timeSlot = 16;
else timeSlot = 16 ;
}else if(hour == 19 )
{
if(minute < 30) timeSlot = 16 ;
else timeSlot = 16;
}else
{
timeSlot = 25;
}
// tft.setTextColor(ILI9341_GREEN);
// for(int i=0; i< sizeof(ptr); i++)
// {
// tft.println(ptr[i]);
// }
int* bslots = new int[24];
float tolerance = 0.1;
//int slotCount = sizeof(ptr) / sizeof(ptr[0]);// sizeof array in c++ is not the length!!!! it is the memory
for(int i=0; i< bookingCount;i++)
{
if(abs(ptr[i]-8.00) < tolerance) bslots[i] = 0;
else if(abs(ptr[i]-8.30) < tolerance) bslots[i] = 1.;
else if(abs(ptr[i]-9.00) < tolerance) bslots[i] = 2;
else if(abs(ptr[i]-9.30) < tolerance) bslots[i] = 3;
else if(abs(ptr[i]-10.00) < tolerance) bslots[i] = 4;
else if(abs(ptr[i]-10.30) < tolerance) bslots[i] = 5;
else if(abs(ptr[i]-11.00) < tolerance) bslots[i] = 6;
else if(abs(ptr[i]-11.30) < tolerance) bslots[i] = 7;
else if(abs(ptr[i]-12.00) < tolerance) bslots[i] = 8;
else if(abs(ptr[i]-12.30) < tolerance) bslots[i] = 9;
else if(abs(ptr[i]-13.00) < tolerance) bslots[i] = 10;
else if(abs(ptr[i]-13.30) < tolerance) bslots[i] = 11;
else if(abs(ptr[i]-14.00) < tolerance) bslots[i] = 12;
else if(abs(ptr[i]-14.30) < tolerance) bslots[i] = 13;
else if(abs(ptr[i]-15.00) < tolerance) bslots[i] = 14;
else if(abs(ptr[i]-15.30) < tolerance) bslots[i] = 15;
else if(abs(ptr[i]-16.00) < tolerance) bslots[i] = 16;
else if(abs(ptr[i]-16.30) < tolerance) bslots[i] = 16;
else if(abs(ptr[i]-17.00) < tolerance) bslots[i] = 16;
else if(abs(ptr[i]-17.30) < tolerance) bslots[i] = 16;
else if(abs(ptr[i]-18.00) < tolerance) bslots[i] = 16;
else if(abs(ptr[i]-18.30) < tolerance) bslots[i] = 16;
else if(abs(ptr[i]-19.00) < tolerance) bslots[i] = 16;
else if(abs(ptr[i]-19.30) < tolerance) bslots[i] = 16;
else bslots[i] = 16;
//tft.println(bslots[i]); // print!!!! all the booking slots in Int!!!
}
delete[] ptr;
return bslots;
}
void setup() {
//pinMode(BTN_PIN, INPUT_PULLUP);
tft.println("\nLoading data...");
WiFi.begin(ssid, password, 6);
tft.begin();
tft.setRotation(1);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
tft.print(".");
}
dateTime = getDate();
int* ptr2 = nextData();
//set up adafruit trinkete 5V
pixels.begin();
pixelTime.begin();
//delay(500);
tft.setTextColor(ILI9341_RED);
pixelTime.setPixelColor(timeSlot, pixelTime.Color(0,150,0));
for(int i=0; i<bookingCount; i++)
{
pixels.setPixelColor(ptr2[i], pixels.Color(150, 0, 0));
}
pixels.show();
pixelTime.show();
}
void loop() {
// pixels.clear();
// pixelTime.clear();
// if (digitalRead(BTN_PIN) == LOW) {
// tft.fillScreen(ILI9341_BLACK);
// tft.setCursor(0, 0);
// }
if((millis() - lastTime) > timerDelay)
{
pixels.clear();
pixelTime.clear();
tft.println("update the data");
dateTime = getDate();
int* ptr3 = nextData();
for(int i=0; i<bookingCount; i++)
{
pixels.setPixelColor(ptr3[i], pixels.Color(150, 0, 0));
}
pixelTime.setPixelColor(timeSlot, pixelTime.Color(0,150,0));
pixels.show();
pixelTime.show();
lastTime = millis();
}
//delay(1000);
}