#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <LiquidCrystal_I2C.h>
#include "Namespace.h"
#include "config.h"
#include "pitches.h"
const char wifi_ssid[] = WIFI_SSID;
const char wifi_password[] = WIFI_PASSWORD;
const char endpoint[] = ENDPOINT;
const String token = TOKEN;
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
#define BTN_PIN 2
#define RED_LED 4
#define YELLOW_LED 5
#define GREEN_LED 18
#define BLUE_LED 14
#define BUZZER 19
unsigned long currentMillis;
unsigned long checkCommitStartMillis;
unsigned long printTimeStartMillis;
unsigned long checkCommitInterval = 10000UL;
unsigned long printTimeInterval = 1000UL;
String saved_sha = "";
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
String checkRepo() {
HTTPClient http;
http.useHTTP10(true);
http.addHeader("Authorization", "token " + token);
http.begin(endpoint);
http.GET();
String result = http.getString();
//Serial.println(result);
DynamicJsonDocument doc(32768);
DeserializationError error = deserializeJson(doc, result);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return "<error>";
}
String sha = doc["sha"].as<String>();
String filename = doc["files"][0]["filename"].as<String>();
http.end();
if (checkForCommits(sha)) {
return filename;
} else {
return "no commit";
}
}
boolean checkForCommits(String sha) {
if (saved_sha.equals("") && sha.length() > 5) {
Serial.println("Storing sha: " + sha);
saved_sha = sha;
} else {
Serial.println("Saved_sha is: " + saved_sha);
if (sha.length() > 5 && sha != saved_sha) {
Serial.println("New sha detected: " + sha);
saved_sha = sha;
return true;
}
return false;
}
}
Namespace whatNamespace(String filename) {
if (filename.indexOf("test") >= 0) {
return TEST;
}
if (filename.indexOf("prod") >= 0) {
return PROD;
}
if (filename.indexOf("systest") >= 0) {
return SYSTEST;
}
if (filename.indexOf("no commit") >= 0) {
return NONE;
}
}
void handleAction(Namespace nameSpace) {
if (nameSpace == TEST) {
playCommitSound();
flashLed(YELLOW_LED);
}
if (nameSpace == PROD) {
playCommitSound();
flashLed(RED_LED);
}
if (nameSpace == SYSTEST) {
playCommitSound();
flashLed(GREEN_LED);
}
if (nameSpace == NONE) {
Serial.println("Do nothing!");
}
}
void flashLed(int led) {
for (int i = 0; i < 10; i++) {
digitalWrite(led, HIGH);
delay(150);
digitalWrite(led, LOW);
delay(150);
}
}
void startupLed() {
digitalWrite(RED_LED, HIGH);
delay(200);
digitalWrite(YELLOW_LED, HIGH);
delay(200);
digitalWrite(GREEN_LED, HIGH);
delay(200);
digitalWrite(RED_LED, LOW);
delay(200);
digitalWrite(YELLOW_LED, LOW);
delay(200);
digitalWrite(GREEN_LED, LOW);
}
void playCommitSound() {
tone(BUZZER, NOTE_E4);
delay(150);
tone(BUZZER, NOTE_G4);
delay(150);
tone(BUZZER, NOTE_E5);
delay(150);
tone(BUZZER, NOTE_C5);
delay(150);
tone(BUZZER, NOTE_D5);
delay(150);
tone(BUZZER, NOTE_G5);
delay(150);
noTone(BUZZER);
}
void printLocalTime() {
if (currentMillis - printTimeStartMillis > printTimeInterval) {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 1);
LCD.println("Connection Err");
return;
}
LCD.clear();
LCD.setCursor(8, 0);
LCD.println(&timeinfo, "%H:%M:%S");
LCD.setCursor(0, 1);
LCD.println(&timeinfo, "%d/%m/%Y %Z");
printTimeStartMillis = currentMillis;
}
}
void lookForNewCommits() {
if (currentMillis - checkCommitStartMillis > checkCommitInterval) {
handleAction(whatNamespace(checkRepo()));
checkCommitStartMillis = currentMillis;
}
}
void setup() {
Serial.begin(115200);
LCD.init();
LCD.backlight();
LCD.setCursor(4, 0);
LCD.println("Booting");
pinMode(BTN_PIN, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
startupLed();
WiFi.begin(wifi_ssid, wifi_password, 6);
LCD.clear();
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
LCD.setCursor(4, 0);
LCD.println("Online");
Serial.println("Connected");
digitalWrite(BLUE_LED, HIGH);
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
checkCommitStartMillis = millis();
printTimeStartMillis = millis();
}
void loop() {
currentMillis = millis();
printLocalTime();
lookForNewCommits();
// Button to test function
if (digitalRead(BTN_PIN) == LOW) {
Serial.println("Button pressed");
handleAction(whatNamespace(checkRepo()));
playCommitSound();
}
}