// Developed By Patrick Woollvin (MrPurpleSocks)
// Good luck to whoever tries to modfy this in the future
// Libraries
#include <LiquidCrystal.h>
#include "WiFi.h"
// Wokwi Debug Pins [REMOVE FOR PRODUCTION]
#define LED 4
// Button Pins
#define LEFT 36
#define RIGHT 35
#define SELECT 37
// LCD Pins
#define LCD_RS 10
#define LCD_E 11
#define LCD_D4 12
#define LCD_D5 13
#define LCD_D6 14
#define LCD_D7 17
// LCD other
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
// UI States
enum { enterMenu, item, genSelect } selectState = enterMenu;
enum { WiFiSetup, Main, Admin } menu = WiFiSetup;
// Menu Configs
int curPos = 0;
volatile byte state = LOW;
// Debounce
volatile byte debounceDelay = 100;
volatile byte debounceLeft = 0;
// Gen Global Info
bool wifiStatus = false; //0 = Offline, 1 = Online
bool wifiSetup = false;
void setup() {
// Setup Start
Serial.begin(115200);
// Pin Config
pinMode(LED, OUTPUT);
pinMode(LEFT, INPUT_PULLUP);
pinMode(RIGHT, INPUT_PULLUP);
pinMode(SELECT, INPUT_PULLUP);
// WiFi Config
WiFi.mode(WIFI_STA);
int n = WiFi.scanNetworks();
// LCD Config
lcd.begin(16,2);
lcd.print("WBAttend Offline");
lcd.setCursor(0,1);
if (n == 0) {
lcd.print(" No Networks");
} else if (n > 0 && n < 10) {
lcd.print(" ");
lcd.setCursor(2, 1);
lcd.print(n);
lcd.setCursor(3,1);
lcd.print(" Network(s)");
} else {
lcd.print(" ");
lcd.setCursor(2, 1);
lcd.print(n);
lcd.setCursor(4,1);
lcd.print(" Networks");
}
// Interrupts
attachInterrupt(digitalPinToInterrupt(LEFT), test, HIGH);
attachInterrupt(digitalPinToInterrupt(SELECT), selectISR, HIGH);
// Final Setup
delay(100); // Configure timing
Serial.println("WB Attend Terminal Ready");
}
void loop() {
// put your main code here, to run repeatedly:
delay(10); // this speeds up the simulation
digitalWrite(LED, state);
}
void test() {
int actTime = millis();
if ((actTime - debounceLeft) >= debounceDelay) {
state = !state;
}
}
void selectISR() {
switch (selectState) {
case 0:
switch (menu) {
case 0:
wifiSetupInit();
default:
Serial.println("ERR: UNKNOWN MENU");
}
default:
Serial.println("ERR: UNKNOWN ACTION");
}
}
void rightISR() {
}
// Gen UI Functions
void returnStatus() {
lcd.noCursor();
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(" ");
lcd.print("WBAttend Offline");
lcd.setCursor(0,1);
if (n == 0) {
lcd.print(" No Networks");
} else if (n > 0 && n < 10) {
lcd.print(" ");
lcd.setCursor(2, 1);
lcd.print(n);
lcd.setCursor(3,1);
lcd.print(" Network(s)");
} else {
lcd.print(" ");
lcd.setCursor(2, 1);
lcd.print(n);
lcd.setCursor(4,1);
lcd.print(" Networks");
}
selectState = enterMenu;
menu = WiFiSetup;
}
// WiFi Setup Functions
void wifiSetupInit() {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("HowTo SetUp WiFi");
lcd.setCursor(0, 1);
lcd.print(" Device Web");
lcd.setCursor(2,1);
lcd.cursor();
selectState = genSelect;
curPos = 1;
}
void wifiSetupHandler() {
if (menu == 0) {
switch (curPos) {
case 1:
//Device Setup Function
Serial.println("Not added lmao");
returnStatus();
case 2:
// Web Setup Function
Serial.println("Not added lmao");
returnStatus();
}
}
}
void wifiSetupRight() {
if (curPos == 1 && menu == 0) {
lcd.setCursor(11, 1);
curPos = 2;
}
}
void wifiSetupLeft() {
if (curPos == 2 && menu == 0) {
lcd.setCursor(2, 1);
curPos = 1;
}
}