Commit b3f3439e authored by Štěpánek Filip's avatar Štěpánek Filip
Browse files

Update solution.ino

parents
#include "funshield.h"
constexpr int buttonPins[] { button1_pin, button2_pin, button3_pin };
constexpr int buttonPinsCount = sizeof(buttonPins) / sizeof(buttonPins[0]);
constexpr int positionsCount = 4;
constexpr int ledsCount = 4;
constexpr byte segmentMap[] = {
0xC0, // 0 0b11000000
0xF9, // 1 0b11111001
0xA4, // 2 0b10100100
0xB0, // 3 0b10110000
0x99, // 4 0b10011001
0x92, // 5 0b10010010
0x82, // 6 0b10000010
0xF8, // 7 0b11111000
0x80, // 8 0b10000000
0x90 // 9 0b10010000
};
constexpr byte EMPTY_GLYPH = 0b11111111;
constexpr byte D_GLYPH = 0b10100001;
constexpr int maximumHodu = 9;
constexpr int pocetKostek = 7;
constexpr int intervalPocatek = 300;
constexpr int intervalPrubeh = 80;
constexpr int normal = 0;
constexpr int configuration = 1;
struct Kostka {
int pocetStran;
Kostka(int pocetStranKostky) {
pocetStran = pocetStranKostky;
}
int hodit() {
return random(1, pocetStran + 1);
}
};
struct Hra {
int pocetHodu = 1;
Kostka kostky[pocetKostek] = { Kostka(4), Kostka(6), Kostka(8), Kostka(10), Kostka(12), Kostka(20), Kostka(100) };
int aktualniKostka = 0;
int vysledek = 0;
unsigned long cas;
int mode = normal;
void zmenaHodu() {
pocetHodu = pocetHodu + 1;
if (pocetHodu == maximumHodu + 1) pocetHodu = 1;
}
void zmenaKostky() {
aktualniKostka = (aktualniKostka + 1) % pocetKostek;
}
void vygenerovatCislo() {
vysledek = 0;
randomSeed(millis() - cas);
for (int i = 0; i < pocetHodu; i++) {
vysledek = vysledek + kostky[aktualniKostka].hodit();
}
}
};
Hra hra;
struct Glyph {
int pozice;
byte hodnota = EMPTY_GLYPH;
Glyph(int glyphPosition) {
pozice = glyphPosition;
}
void rozsvitit() {
digitalWrite(latch_pin, LOW);
shiftOut(data_pin, clock_pin, MSBFIRST, hodnota);
shiftOut(data_pin, clock_pin, MSBFIRST, digit_muxpos[pozice]);
digitalWrite(latch_pin, HIGH);
}
};
struct SegDisplay {
Glyph glyphs[positionsCount] = { Glyph(0), Glyph(1), Glyph(2), Glyph(3) };
int rozsvicenaPozice = 0;
void setup() {
pinMode(latch_pin, OUTPUT);
pinMode(clock_pin, OUTPUT);
pinMode(data_pin, OUTPUT);
}
void rozsvitit() {
glyphs[rozsvicenaPozice].rozsvitit();
rozsvicenaPozice = (rozsvicenaPozice + 1) % positionsCount;
}
void aktualizaceNormal() {
int cislo = hra.vysledek;
for (int i = positionsCount - 1; i >= 0; i--) {
if (cislo != 0) {
glyphs[i].hodnota = segmentMap[cislo - ((cislo / 10) * 10)];
cislo = cislo / 10;
}
else glyphs[i].hodnota = EMPTY_GLYPH;
}
}
void aktualizaceKostka(byte a, byte b) {
glyphs[2].hodnota = a;
glyphs[3].hodnota = b;
}
void aktualizaceConfig() {
glyphs[0].hodnota = segmentMap[hra.pocetHodu];
glyphs[1].hodnota = D_GLYPH;
int cislo = hra.kostky[hra.aktualniKostka].pocetStran;
if (cislo < 10) {
aktualizaceKostka(segmentMap[cislo], EMPTY_GLYPH);
}
else if (cislo < 100) {
aktualizaceKostka(segmentMap[cislo / 10], segmentMap[cislo - ((cislo / 10) * 10)]);
}
else if (cislo == 100) {
aktualizaceKostka(segmentMap[0], segmentMap[0]);
}
}
void aktualizace() {
if (hra.mode == normal) aktualizaceNormal();
else aktualizaceConfig();
}
};
SegDisplay segDisplay;
struct Led {
int pin;
Led(int led_pin) {
pin = led_pin;
}
void rozsvitit() {
digitalWrite(pin, ON);
}
void zhasnout() {
digitalWrite(pin, OFF);
}
void setup() {
pinMode(pin, OUTPUT);
zhasnout();
}
};
struct Leds {
Led leds[ledsCount] = { Led(led1_pin), Led(led2_pin), Led(led3_pin), Led(led4_pin) };
int aktivniLed = 0;
bool pocatek = true;
bool zpatky = false;
unsigned long cas;
void setup() {
for (int i = 0; i < ledsCount; i++) {
leds[i].setup();
}
}
void animacePocatek() {
leds[aktivniLed].rozsvitit();
pocatek = false;
cas = millis();
}
void animacePrubeh() {
leds[aktivniLed].zhasnout();
if (!zpatky) {
aktivniLed = aktivniLed + 1;
if (aktivniLed == ledsCount - 1) zpatky = true;
}
else {
aktivniLed = aktivniLed - 1;
if (aktivniLed == 0) zpatky = false;
}
leds[aktivniLed].rozsvitit();
cas = millis();
}
void animace(bool probiha) {
if (probiha) {
if (pocatek and millis() - cas == intervalPocatek) animacePocatek();
else if (!pocatek and millis() - cas == intervalPrubeh) animacePrubeh();
}
else {
leds[aktivniLed].zhasnout();
aktivniLed = 0;
pocatek = true;
zpatky = false;
}
}
};
Leds leds;
struct Button {
int pin;
Button(int button_pin) {
pin = button_pin;
}
void setup() {
pinMode(pin, INPUT);
}
int zjistitStav() {
return digitalRead(pin);
}
};
struct Buttons {
Button buttons[buttonPinsCount] = { Button(button1_pin), Button(button2_pin), Button(button3_pin) };
bool stavTlacitek = false;
bool generovaniZmacknuto = false;
void setup() {
for (int i = 0; i < buttonPinsCount; i++) {
buttons[i].setup();
}
}
int zjistitStavTlacitek() {
for (int i = 0; i < buttonPinsCount; i++) {
if (!buttons[i].zjistitStav()) return false;
}
return true;
}
void zmacknuti0() {
if (hra.mode == normal) {
generovaniZmacknuto = true;
hra.cas = millis();
leds.cas = millis();
leds.animace(true);
}
else {
hra.mode = normal;
segDisplay.aktualizace();
}
stavTlacitek = true;
}
void zmacknuti1() {
if (hra.mode == configuration) hra.zmenaHodu();
else hra.mode = configuration;
segDisplay.aktualizace();
stavTlacitek = true;
}
void zmacknuti2() {
if (hra.mode == configuration) hra.zmenaKostky();
else hra.mode = configuration;
segDisplay.aktualizace();
stavTlacitek = true;
}
void kontrolaZmacknutiGenerovani() {
if (!buttons[0].zjistitStav()) leds.animace(true);
else {
hra.vygenerovatCislo();
generovaniZmacknuto = false;
leds.animace(false);
segDisplay.aktualizace();
stavTlacitek = false;
}
}
void kontrolaZmacknuti() {
if (!stavTlacitek) {
if (!buttons[0].zjistitStav()) zmacknuti0();
else if (!buttons[1].zjistitStav()) zmacknuti1();
else if (!buttons[2].zjistitStav()) zmacknuti2();
}
else if (generovaniZmacknuto) kontrolaZmacknutiGenerovani();
else if (zjistitStavTlacitek()) stavTlacitek = false;
}
};
Buttons buttons;
void setup() {
buttons.setup();
segDisplay.setup();
leds.setup();
}
void loop() {
buttons.kontrolaZmacknuti();
segDisplay.rozsvitit();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment