/**
*/
#include <Keypad.h>
//#include <Servo.h>
#include "SafeState.h"
//#include "icons.h"
#include <Wire.h> // knihovna pro LCD
#include <LiquidCrystal_I2C.h> // knihovna pro LCD
#include <Adafruit_NeoPixel.h> // knihovna pro NEOPIXEL LED strip
/* nastaveni displeje */
LiquidCrystal_I2C lcd(0x27, 16, 2); // nastav adresu LDC na 0x27 pro 16 sloupcovy a 2 radkovy displej
/* Neopixel */
#define pinDIN 8 // nastavení propojovacího pinu
#define pocetLED 8 // nastavení počtu LED modulů
// nastaveni LED modulu z knihovny
Adafruit_NeoPixel rgbWS = Adafruit_NeoPixel(pocetLED, pinDIN, NEO_GRB + NEO_KHZ800);
//promenne
int tlacStav1; // ulozi hodnotu pri stisku tlacitka 1
int tlacStav2; // ulozi hodnotu pri stisku tlacitka 2
// 1. Definice typu ukazatele: "ukazatel na funkci, která vrací void a nemá parametry"
typedef void (*posledni)();
// 2. Deklarace proměnné, která bude ukazovat na funkci
posledni aktualni;
/* nastaveni keypadu */
char znak,mod; // promenna pro keypad
int keystisk = 0; // indikace stisku keypadu
//auto key;
const byte radky = 4;
const byte sloupce = 4;
byte radkyPiny[radky] = {5, 4, 3, 2};
byte sloupcePiny[sloupce] = {A3, A2, A1, A0};
char keys[radky][sloupce] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), radkyPiny, sloupcePiny, radky, sloupce);
unsigned long casomira; // pomocne promenne pro nastaveni casu
int dobaStisku, limit = 25;
static uint32_t last_time, now = 0;
int h=0;
int m=0;
int s=0;
int bodp1=0; // promenne pro pocitani bodu
int pocitadlop1=0;
int bodp2=0;
int pocitadlop2=0;
int hrac=0;
const int bzuk = 7; // bzucak na pinu 10
//int pas = 3123; // heslo pro nulovani skore
const char pas[4] = "3123"; // heslo pro nulovani skore
char pokus[3]; // pole pro zadani hesla
char pokus1[3]; // pole pro korekci hesla
char zp1, zp2, zp3, zp4; // promenne pro jednotlive znaky hesla
int count,znkr1,admin; // promenne pro zadavani znaku hesla
char m1, m2;
int conf, res;
int pocetznaku;
char zn,zn1,zn2,zn3,zn4,zn5,zn6,zn7,zn8,zn9,zn0,znhv,znkr,zna,znb,znc,znd;
int pruchod = 0; // pomocna promenna pro zjisteni zda je jiz obsazemo hracem aby nespoustel obdazeni znovu
int obsazeno = 0; // pomocna promenna pro zjisteni zda je jiz obsazemo hracem a volno pro druheho hrace
int p1 = 0; // pomocna promenna pro zjisteni ktery hrac onsadil
int p2 = 0; // pomocna promenna pro zjisteni ktery hrac onsadil
int z = 0; // indikace spusteni onsazovani
int nestihl = 0;
/* SafeState uklada heslo v EEPROM */
SafeState safeState;
String inputSecretCode() {
lcd.setCursor(5, 1);
lcd.print("[____]");
lcd.setCursor(6, 1);
String result = "";
while (result.length() < 4) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
lcd.print('*');
result += key;
}
}
return result;
}
void setup() {
Serial.begin(9600); // zahajeni seriove komunikace
pinMode(12, INPUT); // nastaveni pinu A0 na vstup
pinMode(13, INPUT); // nastaveni pinu A1 na vstup
pinMode(bzuk, OUTPUT); // nastav bzucak na pinu 13 na vystup
lcd.init(); // inicializace displeje
lcd.backlight(); // zapnuti podsviceni displeje
lcd.clear(); // smazani displeje
lcd.setCursor(4,0); // nastaveni mista kam se bude na displej zapisovat
lcd.print("GAMEPAD"); // zapis na displej
lcd.setCursor(4,1); // nastaveni mista kam se bude na displej zapisovat
lcd.print("MARTIN"); // zapis na displej
pauzakratka(); // volani podprogramu
lcd.clear(); // smazani displeje
// provedeni funkci a prvotni nastaveni promennych
lcd.clear(); // smazani displeje
lcd.setCursor(6,0); // nastaveni mista kam se bude na displej zapisovat
lcd.print("READY"); // zapis na displej
pauzakratka();
lcd.clear();
hrac=0; // imicializaxe promennych
obsazeno=0;
now=millis();
keystisk = 0;
pruchod = 0;
mod = "";
m1 = 'M';
admin = 1;
// zahájení komunikace s LED modulem
rgbWS.begin();
// nastavení jasu diod
rgbWS.setBrightness(100);
// nastavení zelené barvy na vsechny didy
nastavRGB(0 , 255, 0 );
pauzakratka();
// showStartupMessage();
} // konec setup
void loop() {
auto key = keypad.getKey();
tlacStav1 = digitalRead(12);
tlacStav2 = digitalRead(13);
// if (key != 'A' && key != '#') {
key = keypad.getKey();
//if (key == 'A') {
if (key) {
Serial.println(key);
znak = key;
pad();
// zabzuc();
}else if (key == '*'){
znak = key;
potvrd();
}else if (digitalRead(12) == HIGH){
Serial.println(tlacStav1);
h1();
// zabzuc();
}else if (digitalRead(13) == HIGH){
Serial.println(tlacStav2);
h2();
// zabzuc();
}
// if (safeState.locked()) {
// safeLockedLogic();
// } else {
// safeUnlockedLogic();
// }
} // konec loop
/* funkce */
void pad()
{
lcd.clear(); // smazani displeje
lcd.setCursor(6,0); // nastaveni mista kam se bude na displej zapisovat
lcd.print(znak); // zapis na displej
if (znak == 'A' || znak == 'B' || znak == 'C' || znak == 'D'){
lcd.clear(); // smazani displeje
lcd.setCursor(1,0); // nastaveni mista kam se bude na displej zapisovat
lcd.print("GAME MODE "); // zapis na displej
lcd.setCursor(11,0); // nastaveni mista kam se bude na displej zapisovat
lcd.print(znak); // zapis na displej
lcd.setCursor(2, 1);
lcd.print("CONFIRM - *"); // napis na displej
pauzakratka();
mod = znak;
}else{
lcd.clear(); // smazani displeje
lcd.setCursor(2,0); // nastaveni mista kam se bude na displej zapisovat
lcd.print("SELECT GAME"); // zapis na displej
lcd.setCursor(6,1); // nastaveni mista kam se bude na displej zapisovat
lcd.print("MODE"); // zapis na displej
return;
}
}
void potvrd()
{
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("CONFIRMED"); // napis na displej
lcd.setCursor(7, 1);
lcd.print(zn); // vypise stisknutou klavesu
keystisk = 1;
pruchod = 0;
// delay(100);
m1 = 'X';
zn1 = 'X';
zn2 = mod;
// pauzakratka();
// podrz();
aktualni = potvrd;
return;
}
void h1()
{
lcd.clear(); // smazani displeje
lcd.setCursor(6,0); // nastaveni mista kam se bude na displej zapisovat
lcd.print("PLAYER 1"); // zapis na displej
return;
}
void h2()
{
lcd.clear(); // smazani displeje
lcd.setCursor(6,0); // nastaveni mista kam se bude na displej zapisovat
lcd.print("PLAYER 2"); // zapis na displej
return;
}
/* funkce */
void pauza()
{
for ( int i=0 ;i<11 ;i++)
{
while ((now-last_time)<250)
{
now=millis();
}
last_time=now;
}
}
void pauzakratka()
{
for ( int i=0 ;i<11 ;i++)
{
while ((now-last_time)<50)
{
now=millis();
}
last_time=now;
}
}
// funkce pro nastavení zadané barvy na zvolenou diodu
void nastavRGB (byte r, byte g, byte b) {
for (int i = 0; i < pocetLED; i++) {
rgbWS.setPixelColor(i, rgbWS.Color(r, g, b));
rgbWS.show();
}
}
void zabzuc()
{
tone(bzuk, 1000); // ton 1KHz
delay(100); // 1 sec
noTone(bzuk); // Stop
delay(100); // 1sec
}
void zabzuc2()
{
tone(bzuk, 500); // ton 500 Hz
delay(100); // 1 sec
noTone(bzuk); // Stop
delay(100); // 1sec
}
/*
void showWaitScreen(int delayMillis) {
lcd.setCursor(2, 1);
lcd.print("[..........]");
lcd.setCursor(3, 1);
for (byte i = 0; i < 10; i++) {
delay(delayMillis);
lcd.print("=");
}
}
bool setNewCode() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter new code:");
String newCode = inputSecretCode();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Confirm new code");
String confirmCode = inputSecretCode();
if (newCode.equals(confirmCode)) {
safeState.setCode(newCode);
return true;
} else {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Code mismatch");
lcd.setCursor(0, 1);
lcd.print("Safe not locked!");
delay(2000);
return false;
}
}
void showUnlockMessage() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(ICON_UNLOCKED_CHAR);
lcd.setCursor(4, 0);
lcd.print("Unlocked!");
lcd.setCursor(15, 0);
lcd.write(ICON_UNLOCKED_CHAR);
delay(1000);
}
void safeUnlockedLogic() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(ICON_UNLOCKED_CHAR);
lcd.setCursor(2, 0);
lcd.print(" # to lock");
lcd.setCursor(15, 0);
lcd.write(ICON_UNLOCKED_CHAR);
bool newCodeNeeded = true;
if (safeState.hasCode()) {
lcd.setCursor(0, 1);
lcd.print(" A = new code");
newCodeNeeded = false;
}
auto key = keypad.getKey();
while (key != 'A' && key != '#') {
key = keypad.getKey();
}
bool readyToLock = true;
if (key == 'A' || newCodeNeeded) {
readyToLock = setNewCode();
}
if (readyToLock) {
lcd.clear();
lcd.setCursor(5, 0);
lcd.write(ICON_UNLOCKED_CHAR);
lcd.print(" ");
lcd.write(ICON_RIGHT_ARROW);
lcd.print(" ");
lcd.write(ICON_LOCKED_CHAR);
safeState.lock();
lock();
showWaitScreen(100);
}
}
void safeLockedLogic() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(ICON_LOCKED_CHAR);
lcd.print(" Safe Locked! ");
lcd.write(ICON_LOCKED_CHAR);
String userCode = inputSecretCode();
bool unlockedSuccessfully = safeState.unlock(userCode);
showWaitScreen(200);
if (unlockedSuccessfully) {
showUnlockMessage();
unlock();
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Access Denied!");
showWaitScreen(1000);
}
}
*/