Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Štěpánek Filip
NSWI170 - Home Assignment
Commits
b3f3439e
Commit
b3f3439e
authored
Sep 09, 2021
by
Štěpánek Filip
Browse files
Update solution.ino
parents
Changes
1
Hide whitespace changes
Inline
Side-by-side
solution.ino
0 → 100644
View file @
b3f3439e
#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
();
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment