mirror of
https://github.com/Robertofon/1D-pong.git
synced 2024-06-01 16:16:30 +02:00
Anpassung auf Adafrout orig bibo
This commit is contained in:
parent
816ef0e170
commit
4eaddf66ba
|
@ -15,31 +15,16 @@
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Adapted by Robert Köpferl 2022 to be used on ESP32 -
|
||||||
|
* no optimisation towards atmel
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
#include "Adafruit_NeoPixel.h"
|
|
||||||
|
#include <Adafruit_NeoPixel.h>
|
||||||
#include "notes.h"
|
#include "notes.h"
|
||||||
#include "pin-names.h"
|
#include "pin-names.h"
|
||||||
|
|
||||||
//DIO
|
|
||||||
#define GPIO23 23
|
|
||||||
#define GPIO22 22
|
|
||||||
#define GPIO18 18 // SPI CLK
|
|
||||||
#define GPIO19 19
|
|
||||||
#define GPIO21 21
|
|
||||||
|
|
||||||
//ADIO
|
|
||||||
#define GPIO25 25
|
|
||||||
#define GPIO26 26
|
|
||||||
#define GPIO27 27
|
|
||||||
#define GPIO32 32
|
|
||||||
#define GPIO33 33
|
|
||||||
#define GPIO34 34
|
|
||||||
#define GPIO35 35
|
|
||||||
#define GPIO36 36
|
|
||||||
#define GPIO39 39
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define NELEM(x) (sizeof(x) / sizeof((x)[0]))
|
#define NELEM(x) (sizeof(x) / sizeof((x)[0]))
|
||||||
|
|
||||||
#define PIN_WSDATA GPIO21 // LED data
|
#define PIN_WSDATA GPIO21 // LED data
|
||||||
|
@ -84,7 +69,8 @@ Adafruit_NeoPixel one_d = Adafruit_NeoPixel(NPIXELS, PIN_WSDATA, NEO_GRB | NEO_K
|
||||||
#define TIME_TONE_MOVE 25
|
#define TIME_TONE_MOVE 25
|
||||||
#define TIME_TONE_SCORE 50
|
#define TIME_TONE_SCORE 50
|
||||||
|
|
||||||
enum {
|
enum
|
||||||
|
{
|
||||||
ST_IDLE = 0,
|
ST_IDLE = 0,
|
||||||
ST_START_L,
|
ST_START_L,
|
||||||
ST_START_R,
|
ST_START_R,
|
||||||
|
@ -131,18 +117,74 @@ static uint8_t boosted; // Set if any user boosted until the ball reaches oppos
|
||||||
static uint8_t tonecount; // Interval counter for sound during move
|
static uint8_t tonecount; // Interval counter for sound during move
|
||||||
static uint8_t tuneidx; // Index to the running tune
|
static uint8_t tuneidx; // Index to the running tune
|
||||||
|
|
||||||
struct tnote {
|
struct tnote
|
||||||
|
{
|
||||||
uint8_t note;
|
uint8_t note;
|
||||||
uint16_t duration;
|
uint16_t duration;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Tone pitch table for 16MHz crystal */
|
/* Tone pitch table for 16MHz crystal */
|
||||||
static const uint16_t tone_pitch[NTONE_PITCH] PROGMEM = {
|
static const uint16_t tone_pitch[NTONE_PITCH] PROGMEM = {
|
||||||
61155, 57722, 54482, 51424, 48538, 45814, 43242, 40815, 38524, 36362 /* == 220Hz */, 34321, 32395,
|
61155,
|
||||||
30577, 28860, 27240, 25711, 24268, 22906, 21620, 20407, 19261, 18180 /* == 440Hz */, 17160, 16197,
|
57722,
|
||||||
15288, 14429, 13619, 12855, 12133, 11452, 10809, 10203, 9630, 9089 /* == 880Hz */, 8579, 8098,
|
54482,
|
||||||
7643, 7214, 6809, 6427, 6066, 5725, 5404, 5101, 4814, 4544, 4289, 4048,
|
51424,
|
||||||
3821, 3606, 3404, 3213, 3032, 2862, 2701, 2550, 2406, 2271, 2144, 2023,
|
48538,
|
||||||
|
45814,
|
||||||
|
43242,
|
||||||
|
40815,
|
||||||
|
38524,
|
||||||
|
36362 /* == 220Hz */,
|
||||||
|
34321,
|
||||||
|
32395,
|
||||||
|
30577,
|
||||||
|
28860,
|
||||||
|
27240,
|
||||||
|
25711,
|
||||||
|
24268,
|
||||||
|
22906,
|
||||||
|
21620,
|
||||||
|
20407,
|
||||||
|
19261,
|
||||||
|
18180 /* == 440Hz */,
|
||||||
|
17160,
|
||||||
|
16197,
|
||||||
|
15288,
|
||||||
|
14429,
|
||||||
|
13619,
|
||||||
|
12855,
|
||||||
|
12133,
|
||||||
|
11452,
|
||||||
|
10809,
|
||||||
|
10203,
|
||||||
|
9630,
|
||||||
|
9089 /* == 880Hz */,
|
||||||
|
8579,
|
||||||
|
8098,
|
||||||
|
7643,
|
||||||
|
7214,
|
||||||
|
6809,
|
||||||
|
6427,
|
||||||
|
6066,
|
||||||
|
5725,
|
||||||
|
5404,
|
||||||
|
5101,
|
||||||
|
4814,
|
||||||
|
4544,
|
||||||
|
4289,
|
||||||
|
4048,
|
||||||
|
3821,
|
||||||
|
3606,
|
||||||
|
3404,
|
||||||
|
3213,
|
||||||
|
3032,
|
||||||
|
2862,
|
||||||
|
2701,
|
||||||
|
2550,
|
||||||
|
2406,
|
||||||
|
2271,
|
||||||
|
2144,
|
||||||
|
2023,
|
||||||
1910,
|
1910,
|
||||||
};
|
};
|
||||||
static const tnote tune_win[] PROGMEM = {
|
static const tnote tune_win[] PROGMEM = {
|
||||||
|
@ -181,11 +223,16 @@ void sound_off()
|
||||||
*/
|
*/
|
||||||
static inline uint8_t button_is_down(uint8_t pin)
|
static inline uint8_t button_is_down(uint8_t pin)
|
||||||
{
|
{
|
||||||
switch(pin) {
|
switch (pin)
|
||||||
case PIN_BUT_LS: return !debtmr_ls && !bstate_ls;
|
{
|
||||||
case PIN_BUT_RS: return !debtmr_rs && !bstate_rs;
|
case PIN_BUT_LS:
|
||||||
case PIN_BUT_LP: return !debtmr_lp && !bstate_lp;
|
return !debtmr_ls && !bstate_ls;
|
||||||
case PIN_BUT_RP: return !debtmr_rp && !bstate_rp;
|
case PIN_BUT_RS:
|
||||||
|
return !debtmr_rs && !bstate_rs;
|
||||||
|
case PIN_BUT_LP:
|
||||||
|
return !debtmr_lp && !bstate_lp;
|
||||||
|
case PIN_BUT_RP:
|
||||||
|
return !debtmr_rp && !bstate_rp;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -199,16 +246,20 @@ static inline uint8_t button_is_down(uint8_t pin)
|
||||||
*/
|
*/
|
||||||
static inline uint8_t do_debounce(uint8_t tdiff, uint8_t *bstate, uint8_t *debtmr, uint8_t pin, uint8_t ev)
|
static inline uint8_t do_debounce(uint8_t tdiff, uint8_t *bstate, uint8_t *debtmr, uint8_t pin, uint8_t ev)
|
||||||
{
|
{
|
||||||
if(0 == *debtmr) {
|
if (0 == *debtmr)
|
||||||
|
{
|
||||||
uint8_t state = digitalRead(pin);
|
uint8_t state = digitalRead(pin);
|
||||||
if(state != *bstate) {
|
if (state != *bstate)
|
||||||
|
{
|
||||||
*debtmr = TIME_DEBOUNCE;
|
*debtmr = TIME_DEBOUNCE;
|
||||||
if (!(*bstate = state))
|
if (!(*bstate = state))
|
||||||
return ev; // Event on High-to-Low transition of input
|
return ev; // Event on High-to-Low transition of input
|
||||||
// else
|
// else
|
||||||
// return release_event_value
|
// return release_event_value
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (*debtmr >= tdiff)
|
if (*debtmr >= tdiff)
|
||||||
*debtmr -= tdiff;
|
*debtmr -= tdiff;
|
||||||
else
|
else
|
||||||
|
@ -222,7 +273,8 @@ static inline uint8_t do_debounce(uint8_t tdiff, uint8_t *bstate, uint8_t *debtm
|
||||||
*/
|
*/
|
||||||
static inline uint8_t do_timer(uint8_t tdiff, uint16_t *tmr, uint8_t ev)
|
static inline uint8_t do_timer(uint8_t tdiff, uint16_t *tmr, uint8_t ev)
|
||||||
{
|
{
|
||||||
if(0 != *tmr) {
|
if (0 != *tmr)
|
||||||
|
{
|
||||||
if (*tmr >= tdiff)
|
if (*tmr >= tdiff)
|
||||||
*tmr -= tdiff; // Timer countdown
|
*tmr -= tdiff; // Timer countdown
|
||||||
else
|
else
|
||||||
|
@ -245,7 +297,8 @@ static inline void set_tone(uint16_t note, uint16_t duration)
|
||||||
// OCR1A = pgm_read_word(&tone_pitch[note-1]);
|
// OCR1A = pgm_read_word(&tone_pitch[note-1]);
|
||||||
// TCCR1A = _BV(COM1A0); /* Set toggle output */
|
// TCCR1A = _BV(COM1A0); /* Set toggle output */
|
||||||
// TCNT1 = 0;
|
// TCNT1 = 0;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
sound_off();
|
sound_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,12 +307,14 @@ static inline void set_tone(uint16_t note, uint16_t duration)
|
||||||
*/
|
*/
|
||||||
static inline void tune_next()
|
static inline void tune_next()
|
||||||
{
|
{
|
||||||
if(tuneidx < NELEM(tune_win)) {
|
if (tuneidx < NELEM(tune_win))
|
||||||
|
{
|
||||||
uint16_t n = pgm_read_byte(&tune_win[tuneidx].note);
|
uint16_t n = pgm_read_byte(&tune_win[tuneidx].note);
|
||||||
uint16_t d = pgm_read_word(&tune_win[tuneidx].duration);
|
uint16_t d = pgm_read_word(&tune_win[tuneidx].duration);
|
||||||
set_tone(n, d);
|
set_tone(n, d);
|
||||||
tuneidx++;
|
tuneidx++;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
set_tone(0, 0);
|
set_tone(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,11 +323,13 @@ static inline void tune_next()
|
||||||
*/
|
*/
|
||||||
static void draw_sides()
|
static void draw_sides()
|
||||||
{
|
{
|
||||||
for(uint8_t i = 0; i < zone_l-1; i++) {
|
for (uint8_t i = 0; i < zone_l - 1; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(i, 0, 64, 64);
|
one_d.setPixelColor(i, 0, 64, 64);
|
||||||
}
|
}
|
||||||
one_d.setPixelColor(0, 0, 64, 64);
|
one_d.setPixelColor(0, 0, 64, 64);
|
||||||
for(uint8_t i = 0; i < zone_r-1; i++) {
|
for (uint8_t i = 0; i < zone_r - 1; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS - 1 - i, 0, 64, 64);
|
one_d.setPixelColor(NPIXELS - 1 - i, 0, 64, 64);
|
||||||
}
|
}
|
||||||
one_d.setPixelColor(NPIXELS - 1, 0, 64, 64);
|
one_d.setPixelColor(NPIXELS - 1, 0, 64, 64);
|
||||||
|
@ -284,7 +341,8 @@ static void draw_sides()
|
||||||
static void draw_ball(int8_t dir, uint8_t pos)
|
static void draw_ball(int8_t dir, uint8_t pos)
|
||||||
{
|
{
|
||||||
uint8_t c = 255;
|
uint8_t c = 255;
|
||||||
for(uint8_t i = 0; i < 5 && pos >= 0 && pos < NPIXELS; i++) {
|
for (uint8_t i = 0; i < 5 && pos >= 0 && pos < NPIXELS; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(pos, c, c, 0);
|
one_d.setPixelColor(pos, c, c, 0);
|
||||||
c >>= 1;
|
c >>= 1;
|
||||||
pos -= dir;
|
pos -= dir;
|
||||||
|
@ -298,12 +356,15 @@ static void draw_course(uint8_t v)
|
||||||
{
|
{
|
||||||
one_d.clear();
|
one_d.clear();
|
||||||
draw_sides();
|
draw_sides();
|
||||||
if(v) {
|
if (v)
|
||||||
for(uint8_t i = 0; i < points_l; i++) {
|
{
|
||||||
|
for (uint8_t i = 0; i < points_l; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * i + 0), v, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * i + 0), v, 0, 0);
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * i + 1), v, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * i + 1), v, 0, 0);
|
||||||
}
|
}
|
||||||
for(uint8_t i = 0; i < points_r; i++) {
|
for (uint8_t i = 0; i < points_r; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 + (2 * i + 0), 0, v, 0);
|
one_d.setPixelColor(NPIXELS / 2 + (2 * i + 0), 0, v, 0);
|
||||||
one_d.setPixelColor(NPIXELS / 2 + (2 * i + 1), 0, v, 0);
|
one_d.setPixelColor(NPIXELS / 2 + (2 * i + 1), 0, v, 0);
|
||||||
}
|
}
|
||||||
|
@ -330,20 +391,23 @@ static void animate_idle_init(void)
|
||||||
|
|
||||||
static void animate_idle(void)
|
static void animate_idle(void)
|
||||||
{
|
{
|
||||||
switch(ai_state) {
|
switch (ai_state)
|
||||||
|
{
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
/* Rainbow pattern */
|
/* Rainbow pattern */
|
||||||
for(uint8_t i = 0; i < NPIXELS; i++) {
|
for (uint8_t i = 0; i < NPIXELS; i++)
|
||||||
|
{
|
||||||
uint16_t h = ai_h + (i << 4);
|
uint16_t h = ai_h + (i << 4);
|
||||||
if (h >= H_STEPS)
|
if (h >= H_STEPS)
|
||||||
h -= H_STEPS;
|
h -= H_STEPS;
|
||||||
//*one_d.setPixelColorHsv(i, h, 255, 128);
|
//*one_d.setPixelColorHsv(i, h, 255, 128);
|
||||||
}
|
}
|
||||||
ai_h += H_STEPS / 60;
|
ai_h += H_STEPS / 60;
|
||||||
if(ai_h >= H_STEPS) {
|
if (ai_h >= H_STEPS)
|
||||||
|
{
|
||||||
ai_h -= H_STEPS;
|
ai_h -= H_STEPS;
|
||||||
ai_pos = 0;
|
ai_pos = 0;
|
||||||
ai_state++;
|
ai_state++;
|
||||||
|
@ -354,7 +418,8 @@ static void animate_idle(void)
|
||||||
/* Ball left-to-right */
|
/* Ball left-to-right */
|
||||||
draw_course(0);
|
draw_course(0);
|
||||||
draw_ball(1, ai_pos++);
|
draw_ball(1, ai_pos++);
|
||||||
if(ai_pos >= NPIXELS) {
|
if (ai_pos >= NPIXELS)
|
||||||
|
{
|
||||||
ai_state++;
|
ai_state++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -363,7 +428,8 @@ static void animate_idle(void)
|
||||||
/* Ball right-to-left */
|
/* Ball right-to-left */
|
||||||
draw_course(0);
|
draw_course(0);
|
||||||
draw_ball(-1, --ai_pos);
|
draw_ball(-1, --ai_pos);
|
||||||
if(!ai_pos) {
|
if (!ai_pos)
|
||||||
|
{
|
||||||
ai_state++;
|
ai_state++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -371,11 +437,13 @@ static void animate_idle(void)
|
||||||
case 10:
|
case 10:
|
||||||
/* Score blinkenlights */
|
/* Score blinkenlights */
|
||||||
draw_course(0);
|
draw_course(0);
|
||||||
for(uint8_t i = 0; i < ai_pos; i++) {
|
for (uint8_t i = 0; i < ai_pos; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - i, 255, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - i, 255, 0, 0);
|
||||||
one_d.setPixelColor(NPIXELS / 2 + i, 0, 255, 0);
|
one_d.setPixelColor(NPIXELS / 2 + i, 0, 255, 0);
|
||||||
}
|
}
|
||||||
if(++ai_pos >= NPIXELS/2) {
|
if (++ai_pos >= NPIXELS / 2)
|
||||||
|
{
|
||||||
ai_state++;
|
ai_state++;
|
||||||
ai_pos = 0;
|
ai_pos = 0;
|
||||||
}
|
}
|
||||||
|
@ -384,11 +452,13 @@ static void animate_idle(void)
|
||||||
case 9:
|
case 9:
|
||||||
case 11:
|
case 11:
|
||||||
draw_course(0);
|
draw_course(0);
|
||||||
for(uint8_t i = 0; i < NPIXELS/2-ai_pos; i++) {
|
for (uint8_t i = 0; i < NPIXELS / 2 - ai_pos; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - i, 255, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - i, 255, 0, 0);
|
||||||
one_d.setPixelColor(NPIXELS / 2 + i, 0, 255, 0);
|
one_d.setPixelColor(NPIXELS / 2 + i, 0, 255, 0);
|
||||||
}
|
}
|
||||||
if(++ai_pos >= NPIXELS/2) {
|
if (++ai_pos >= NPIXELS / 2)
|
||||||
|
{
|
||||||
ai_state++;
|
ai_state++;
|
||||||
ai_pos = 0;
|
ai_pos = 0;
|
||||||
}
|
}
|
||||||
|
@ -415,35 +485,53 @@ static uint8_t animate_win(uint8_t side)
|
||||||
uint32_t clr;
|
uint32_t clr;
|
||||||
uint8_t pos;
|
uint8_t pos;
|
||||||
|
|
||||||
if(side) {
|
if (side)
|
||||||
|
{
|
||||||
clr = Adafruit_NeoPixel::Color(0, 255, 0);
|
clr = Adafruit_NeoPixel::Color(0, 255, 0);
|
||||||
pos = NPIXELS / 2;
|
pos = NPIXELS / 2;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
clr = Adafruit_NeoPixel::Color(255, 0, 0);
|
clr = Adafruit_NeoPixel::Color(255, 0, 0);
|
||||||
pos = 0;
|
pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
one_d.clear();
|
one_d.clear();
|
||||||
if(aw_state < 20) {
|
if (aw_state < 20)
|
||||||
if(aw_state & 0x01) {
|
{
|
||||||
for(uint8_t i = 0; i < NPIXELS/2; i++) {
|
if (aw_state & 0x01)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < NPIXELS / 2; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(pos + i, clr);
|
one_d.setPixelColor(pos + i, clr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(aw_state < 50) {
|
}
|
||||||
for(uint8_t i = 0; i < aw_state - 20; i++) {
|
else if (aw_state < 50)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < aw_state - 20; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(pos + i, clr);
|
one_d.setPixelColor(pos + i, clr);
|
||||||
}
|
}
|
||||||
} else if(aw_state < 80) {
|
}
|
||||||
for(uint8_t i = aw_state - 50; i < NPIXELS/2; i++) {
|
else if (aw_state < 80)
|
||||||
|
{
|
||||||
|
for (uint8_t i = aw_state - 50; i < NPIXELS / 2; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(pos + i, clr);
|
one_d.setPixelColor(pos + i, clr);
|
||||||
}
|
}
|
||||||
} else if(aw_state < 110) {
|
}
|
||||||
for(uint8_t i = 0; i < aw_state - 80; i++) {
|
else if (aw_state < 110)
|
||||||
|
{
|
||||||
|
for (uint8_t i = 0; i < aw_state - 80; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - i + pos, clr);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - i + pos, clr);
|
||||||
}
|
}
|
||||||
} else if(aw_state < 140) {
|
}
|
||||||
for(uint8_t i = aw_state - 110; i < NPIXELS/2; i++) {
|
else if (aw_state < 140)
|
||||||
|
{
|
||||||
|
for (uint8_t i = aw_state - 110; i < NPIXELS / 2; i++)
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - i + pos, clr);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - i + pos, clr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -456,7 +544,8 @@ static uint8_t animate_win(uint8_t side)
|
||||||
*/
|
*/
|
||||||
static uint8_t is_game_state(uint8_t s)
|
static uint8_t is_game_state(uint8_t s)
|
||||||
{
|
{
|
||||||
switch(s) {
|
switch (s)
|
||||||
|
{
|
||||||
case ST_MOVE_LR: // If you press too soon
|
case ST_MOVE_LR: // If you press too soon
|
||||||
case ST_MOVE_RL:
|
case ST_MOVE_RL:
|
||||||
case ST_ZONE_R: // In the zone
|
case ST_ZONE_R: // In the zone
|
||||||
|
@ -493,7 +582,8 @@ static inline void speed_to_timer()
|
||||||
static void set_state(uint8_t newstate)
|
static void set_state(uint8_t newstate)
|
||||||
{
|
{
|
||||||
/* State exit actions */
|
/* State exit actions */
|
||||||
switch(thestate) {
|
switch (thestate)
|
||||||
|
{
|
||||||
case ST_IDLE:
|
case ST_IDLE:
|
||||||
case ST_WIN_L:
|
case ST_WIN_L:
|
||||||
case ST_WIN_R:
|
case ST_WIN_R:
|
||||||
|
@ -545,7 +635,8 @@ static void set_state(uint8_t newstate)
|
||||||
|
|
||||||
thestate = newstate;
|
thestate = newstate;
|
||||||
/* State entry actions */
|
/* State entry actions */
|
||||||
switch(thestate) {
|
switch (thestate)
|
||||||
|
{
|
||||||
case ST_IDLE:
|
case ST_IDLE:
|
||||||
boost_l = boost_r = 0;
|
boost_l = boost_r = 0;
|
||||||
zone_l = zone_r = ZONE_SIZE;
|
zone_l = zone_r = ZONE_SIZE;
|
||||||
|
@ -622,6 +713,7 @@ void setup()
|
||||||
pinMode(PIN_SOUND, OUTPUT);
|
pinMode(PIN_SOUND, OUTPUT);
|
||||||
|
|
||||||
one_d.begin(); // Setup IO
|
one_d.begin(); // Setup IO
|
||||||
|
// Test rob
|
||||||
one_d.setBrightness(60);
|
one_d.setBrightness(60);
|
||||||
one_d.setPixelColor(6, one_d.Color(200, 200, 0));
|
one_d.setPixelColor(6, one_d.Color(200, 200, 0));
|
||||||
one_d.show(); // All leds off
|
one_d.show(); // All leds off
|
||||||
|
@ -650,14 +742,16 @@ void setup()
|
||||||
*/
|
*/
|
||||||
#define chk_ev(ev) (events & (ev))
|
#define chk_ev(ev) (events & (ev))
|
||||||
|
|
||||||
|
/// @brief Main loop
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
uint32_t now;
|
uint32_t now = millis();
|
||||||
uint8_t tdiff = (now = millis()) - oldtime;
|
uint8_t tdiff = now - oldtime;
|
||||||
uint8_t events = 0;
|
uint8_t events = 0;
|
||||||
|
|
||||||
/* Handle buttons and timers on (just about) every millisecond */
|
/* Handle buttons and timers on (just about) every millisecond */
|
||||||
if(tdiff) {
|
if (tdiff > 0)
|
||||||
|
{
|
||||||
oldtime = now;
|
oldtime = now;
|
||||||
events |= do_debounce(tdiff, &bstate_ls, &debtmr_ls, PIN_BUT_LS, EV_BUT_LS_PRESS);
|
events |= do_debounce(tdiff, &bstate_ls, &debtmr_ls, PIN_BUT_LS, EV_BUT_LS_PRESS);
|
||||||
events |= do_debounce(tdiff, &bstate_rs, &debtmr_rs, PIN_BUT_RS, EV_BUT_RS_PRESS);
|
events |= do_debounce(tdiff, &bstate_rs, &debtmr_rs, PIN_BUT_RS, EV_BUT_RS_PRESS);
|
||||||
|
@ -670,7 +764,8 @@ void loop()
|
||||||
do_timer(tdiff, &lockout_r, 0);
|
do_timer(tdiff, &lockout_r, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(is_game_state(thestate)) {
|
if (is_game_state(thestate))
|
||||||
|
{
|
||||||
// If the lockout timer is running, squash the button event
|
// If the lockout timer is running, squash the button event
|
||||||
if (lockout_l)
|
if (lockout_l)
|
||||||
events &= ~EV_BUT_LS_PRESS;
|
events &= ~EV_BUT_LS_PRESS;
|
||||||
|
@ -684,14 +779,20 @@ void loop()
|
||||||
if (chk_ev(EV_BUT_RS_PRESS))
|
if (chk_ev(EV_BUT_RS_PRESS))
|
||||||
lockout_r = TIME_LOCKOUT;
|
lockout_r = TIME_LOCKOUT;
|
||||||
|
|
||||||
switch(thestate) {
|
switch (thestate)
|
||||||
|
{
|
||||||
// Nothing to do
|
// Nothing to do
|
||||||
case ST_IDLE:
|
case ST_IDLE:
|
||||||
if(chk_ev(EV_BUT_LS_PRESS)) {
|
if (chk_ev(EV_BUT_LS_PRESS))
|
||||||
|
{
|
||||||
set_state(ST_START_L);
|
set_state(ST_START_L);
|
||||||
} else if(chk_ev(EV_BUT_RS_PRESS)) {
|
}
|
||||||
|
else if (chk_ev(EV_BUT_RS_PRESS))
|
||||||
|
{
|
||||||
set_state(ST_START_R);
|
set_state(ST_START_R);
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
timer = TIME_IDLE;
|
timer = TIME_IDLE;
|
||||||
animate_idle();
|
animate_idle();
|
||||||
}
|
}
|
||||||
|
@ -699,11 +800,16 @@ void loop()
|
||||||
|
|
||||||
// Game is started, waiting for left player to serve the ball
|
// Game is started, waiting for left player to serve the ball
|
||||||
case ST_START_L:
|
case ST_START_L:
|
||||||
if(chk_ev(EV_BUT_LS_PRESS)) {
|
if (chk_ev(EV_BUT_LS_PRESS))
|
||||||
|
{
|
||||||
set_state(ST_MOVE_LR);
|
set_state(ST_MOVE_LR);
|
||||||
} else if(chk_ev(EV_TIMEOUT)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMEOUT))
|
||||||
|
{
|
||||||
set_state(ST_IDLE);
|
set_state(ST_IDLE);
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
timer = TIME_BALL_BLINK;
|
timer = TIME_BALL_BLINK;
|
||||||
if (ballblinkstate)
|
if (ballblinkstate)
|
||||||
one_d.setPixelColor(ballpos, 255, 128, 0);
|
one_d.setPixelColor(ballpos, 255, 128, 0);
|
||||||
|
@ -716,11 +822,16 @@ void loop()
|
||||||
|
|
||||||
// Game is started, waiting for right player to serve the ball
|
// Game is started, waiting for right player to serve the ball
|
||||||
case ST_START_R:
|
case ST_START_R:
|
||||||
if(chk_ev(EV_BUT_RS_PRESS)) {
|
if (chk_ev(EV_BUT_RS_PRESS))
|
||||||
|
{
|
||||||
set_state(ST_MOVE_RL);
|
set_state(ST_MOVE_RL);
|
||||||
} else if(chk_ev(EV_TIMEOUT)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMEOUT))
|
||||||
|
{
|
||||||
set_state(ST_IDLE);
|
set_state(ST_IDLE);
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
timer = TIME_BALL_BLINK;
|
timer = TIME_BALL_BLINK;
|
||||||
if (ballblinkstate)
|
if (ballblinkstate)
|
||||||
one_d.setPixelColor(ballpos, 255, 128, 0);
|
one_d.setPixelColor(ballpos, 255, 128, 0);
|
||||||
|
@ -733,8 +844,10 @@ void loop()
|
||||||
|
|
||||||
// Ball is moving left-to-right outside the playback zone
|
// Ball is moving left-to-right outside the playback zone
|
||||||
case ST_MOVE_LR:
|
case ST_MOVE_LR:
|
||||||
if(chk_ev(EV_TIMER)) {
|
if (chk_ev(EV_TIMER))
|
||||||
if(!--tonecount) {
|
{
|
||||||
|
if (!--tonecount)
|
||||||
|
{
|
||||||
set_tone(NOTE_G4, TIME_TONE_MOVE);
|
set_tone(NOTE_G4, TIME_TONE_MOVE);
|
||||||
tonecount = TONE_INTERVAL;
|
tonecount = TONE_INTERVAL;
|
||||||
}
|
}
|
||||||
|
@ -750,8 +863,10 @@ void loop()
|
||||||
|
|
||||||
// Ball is moving right-to-left outside the playback zone
|
// Ball is moving right-to-left outside the playback zone
|
||||||
case ST_MOVE_RL:
|
case ST_MOVE_RL:
|
||||||
if(chk_ev(EV_TIMER)) {
|
if (chk_ev(EV_TIMER))
|
||||||
if(!--tonecount) {
|
{
|
||||||
|
if (!--tonecount)
|
||||||
|
{
|
||||||
set_tone(NOTE_G4, TIME_TONE_MOVE);
|
set_tone(NOTE_G4, TIME_TONE_MOVE);
|
||||||
tonecount = TONE_INTERVAL;
|
tonecount = TONE_INTERVAL;
|
||||||
}
|
}
|
||||||
|
@ -767,24 +882,31 @@ void loop()
|
||||||
|
|
||||||
// Ball is in the left playback zone, waiting for hit/score
|
// Ball is in the left playback zone, waiting for hit/score
|
||||||
case ST_ZONE_L:
|
case ST_ZONE_L:
|
||||||
if(chk_ev(EV_BUT_LS_PRESS)) {
|
if (chk_ev(EV_BUT_LS_PRESS))
|
||||||
|
{
|
||||||
set_tone(NOTE_G3, TIME_TONE_BOUNCE);
|
set_tone(NOTE_G3, TIME_TONE_BOUNCE);
|
||||||
set_state(ST_MOVE_LR);
|
set_state(ST_MOVE_LR);
|
||||||
// Changing speed is done after the state-change's exit/entry action
|
// Changing speed is done after the state-change's exit/entry action
|
||||||
if(zone_l > 1 && button_is_down(PIN_BUT_LP)) {
|
if (zone_l > 1 && button_is_down(PIN_BUT_LP))
|
||||||
|
{
|
||||||
zone_l--;
|
zone_l--;
|
||||||
boosted = 1;
|
boosted = 1;
|
||||||
speed_to_timer();
|
speed_to_timer();
|
||||||
boost_l++;
|
boost_l++;
|
||||||
}
|
}
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
if(!ballpos) {
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
|
if (!ballpos)
|
||||||
|
{
|
||||||
set_tone(NOTE_C5, TIME_TONE_SCORE);
|
set_tone(NOTE_C5, TIME_TONE_SCORE);
|
||||||
if (++points_r >= WIN_POINTS)
|
if (++points_r >= WIN_POINTS)
|
||||||
set_state(ST_WIN_R);
|
set_state(ST_WIN_R);
|
||||||
else
|
else
|
||||||
set_state(ST_POINT_R);
|
set_state(ST_POINT_R);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
speed_to_timer();
|
speed_to_timer();
|
||||||
ballpos--;
|
ballpos--;
|
||||||
}
|
}
|
||||||
|
@ -796,24 +918,31 @@ void loop()
|
||||||
|
|
||||||
// Ball is in the right playback zone, waiting for hit/score
|
// Ball is in the right playback zone, waiting for hit/score
|
||||||
case ST_ZONE_R:
|
case ST_ZONE_R:
|
||||||
if(chk_ev(EV_BUT_RS_PRESS)) {
|
if (chk_ev(EV_BUT_RS_PRESS))
|
||||||
|
{
|
||||||
set_tone(NOTE_G3, TIME_TONE_BOUNCE);
|
set_tone(NOTE_G3, TIME_TONE_BOUNCE);
|
||||||
set_state(ST_MOVE_RL);
|
set_state(ST_MOVE_RL);
|
||||||
// Changing speed is done after the state-change's exit/entry action
|
// Changing speed is done after the state-change's exit/entry action
|
||||||
if(zone_r > 1 && button_is_down(PIN_BUT_RP)) {
|
if (zone_r > 1 && button_is_down(PIN_BUT_RP))
|
||||||
|
{
|
||||||
zone_r--;
|
zone_r--;
|
||||||
speed_to_timer();
|
speed_to_timer();
|
||||||
boosted = 1;
|
boosted = 1;
|
||||||
boost_r++;
|
boost_r++;
|
||||||
}
|
}
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
if(ballpos == NPIXELS-1) {
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
|
if (ballpos == NPIXELS - 1)
|
||||||
|
{
|
||||||
set_tone(NOTE_C5, TIME_TONE_SCORE);
|
set_tone(NOTE_C5, TIME_TONE_SCORE);
|
||||||
if (++points_l >= WIN_POINTS)
|
if (++points_l >= WIN_POINTS)
|
||||||
set_state(ST_WIN_L);
|
set_state(ST_WIN_L);
|
||||||
else
|
else
|
||||||
set_state(ST_POINT_L);
|
set_state(ST_POINT_L);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
speed_to_timer();
|
speed_to_timer();
|
||||||
ballpos++;
|
ballpos++;
|
||||||
}
|
}
|
||||||
|
@ -825,15 +954,21 @@ void loop()
|
||||||
|
|
||||||
// Left player scored, animate point
|
// Left player scored, animate point
|
||||||
case ST_POINT_L:
|
case ST_POINT_L:
|
||||||
if(chk_ev(EV_BUT_LS_PRESS)) {
|
if (chk_ev(EV_BUT_LS_PRESS))
|
||||||
|
{
|
||||||
set_state(ST_RESUME_L);
|
set_state(ST_RESUME_L);
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
timer = TIME_POINT_BLINK;
|
timer = TIME_POINT_BLINK;
|
||||||
draw_course(SHOW_HI);
|
draw_course(SHOW_HI);
|
||||||
if(!(pointblinkcount & 0x01)) {
|
if (!(pointblinkcount & 0x01))
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * (points_l - 1) + 0), 0, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * (points_l - 1) + 0), 0, 0, 0);
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * (points_l - 1) + 1), 0, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * (points_l - 1) + 1), 0, 0, 0);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * (points_l - 1) + 0), 255, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * (points_l - 1) + 0), 255, 0, 0);
|
||||||
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * (points_l - 1) + 1), 255, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 - 1 - (2 * (points_l - 1) + 1), 255, 0, 0);
|
||||||
}
|
}
|
||||||
|
@ -845,15 +980,21 @@ void loop()
|
||||||
|
|
||||||
// Right player scored, animate point
|
// Right player scored, animate point
|
||||||
case ST_POINT_R:
|
case ST_POINT_R:
|
||||||
if(chk_ev(EV_BUT_RS_PRESS)) {
|
if (chk_ev(EV_BUT_RS_PRESS))
|
||||||
|
{
|
||||||
set_state(ST_RESUME_R);
|
set_state(ST_RESUME_R);
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
timer = TIME_POINT_BLINK;
|
timer = TIME_POINT_BLINK;
|
||||||
draw_course(SHOW_HI);
|
draw_course(SHOW_HI);
|
||||||
if(!(pointblinkcount & 0x01)) {
|
if (!(pointblinkcount & 0x01))
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 + (2 * (points_r - 1) + 0), 0, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 + (2 * (points_r - 1) + 0), 0, 0, 0);
|
||||||
one_d.setPixelColor(NPIXELS / 2 + (2 * (points_r - 1) + 1), 0, 0, 0);
|
one_d.setPixelColor(NPIXELS / 2 + (2 * (points_r - 1) + 1), 0, 0, 0);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
one_d.setPixelColor(NPIXELS / 2 + (2 * (points_r - 1) + 0), 0, 255, 0);
|
one_d.setPixelColor(NPIXELS / 2 + (2 * (points_r - 1) + 0), 0, 255, 0);
|
||||||
one_d.setPixelColor(NPIXELS / 2 + (2 * (points_r - 1) + 1), 0, 255, 0);
|
one_d.setPixelColor(NPIXELS / 2 + (2 * (points_r - 1) + 1), 0, 255, 0);
|
||||||
}
|
}
|
||||||
|
@ -865,10 +1006,13 @@ void loop()
|
||||||
|
|
||||||
// Left player previously scored and must serve again (or timeout to auto-serve)
|
// Left player previously scored and must serve again (or timeout to auto-serve)
|
||||||
case ST_RESUME_L:
|
case ST_RESUME_L:
|
||||||
if(chk_ev(EV_BUT_LS_PRESS | EV_TIMEOUT)) {
|
if (chk_ev(EV_BUT_LS_PRESS | EV_TIMEOUT))
|
||||||
|
{
|
||||||
set_state(ST_MOVE_LR);
|
set_state(ST_MOVE_LR);
|
||||||
set_tone(NOTE_F3, TIME_TONE_SERVE);
|
set_tone(NOTE_F3, TIME_TONE_SERVE);
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
timer = TIME_BALL_BLINK;
|
timer = TIME_BALL_BLINK;
|
||||||
if (ballblinkstate)
|
if (ballblinkstate)
|
||||||
one_d.setPixelColor(ballpos, 255, 128, 0);
|
one_d.setPixelColor(ballpos, 255, 128, 0);
|
||||||
|
@ -881,10 +1025,13 @@ void loop()
|
||||||
|
|
||||||
// Right player previously scored and must serve again (or timeout to auto-serve)
|
// Right player previously scored and must serve again (or timeout to auto-serve)
|
||||||
case ST_RESUME_R:
|
case ST_RESUME_R:
|
||||||
if(chk_ev(EV_BUT_RS_PRESS | EV_TIMEOUT)) {
|
if (chk_ev(EV_BUT_RS_PRESS | EV_TIMEOUT))
|
||||||
|
{
|
||||||
set_state(ST_MOVE_RL);
|
set_state(ST_MOVE_RL);
|
||||||
set_tone(NOTE_F3, TIME_TONE_SERVE);
|
set_tone(NOTE_F3, TIME_TONE_SERVE);
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
timer = TIME_BALL_BLINK;
|
timer = TIME_BALL_BLINK;
|
||||||
if (ballblinkstate)
|
if (ballblinkstate)
|
||||||
one_d.setPixelColor(ballpos, 255, 128, 0);
|
one_d.setPixelColor(ballpos, 255, 128, 0);
|
||||||
|
@ -898,15 +1045,21 @@ void loop()
|
||||||
// A player won the game, animate the winning side
|
// A player won the game, animate the winning side
|
||||||
case ST_WIN_L:
|
case ST_WIN_L:
|
||||||
case ST_WIN_R:
|
case ST_WIN_R:
|
||||||
if(chk_ev(EV_TONETIMER)) {
|
if (chk_ev(EV_TONETIMER))
|
||||||
|
{
|
||||||
events &= ~EV_TONETIMER; // Remove the event so we don't get messed up with a set_tone(0, 0) below call
|
events &= ~EV_TONETIMER; // Remove the event so we don't get messed up with a set_tone(0, 0) below call
|
||||||
tune_next();
|
tune_next();
|
||||||
}
|
}
|
||||||
if(chk_ev(EV_BUT_LS_PRESS)) {
|
if (chk_ev(EV_BUT_LS_PRESS))
|
||||||
|
{
|
||||||
set_state(ST_START_L);
|
set_state(ST_START_L);
|
||||||
} else if(chk_ev(EV_BUT_RS_PRESS)) {
|
}
|
||||||
|
else if (chk_ev(EV_BUT_RS_PRESS))
|
||||||
|
{
|
||||||
set_state(ST_START_R);
|
set_state(ST_START_R);
|
||||||
} else if(chk_ev(EV_TIMER)) {
|
}
|
||||||
|
else if (chk_ev(EV_TIMER))
|
||||||
|
{
|
||||||
timer = TIME_WIN_BLINK;
|
timer = TIME_WIN_BLINK;
|
||||||
if (!animate_win(thestate == ST_WIN_R))
|
if (!animate_win(thestate == ST_WIN_R))
|
||||||
set_state(ST_IDLE);
|
set_state(ST_IDLE);
|
||||||
|
@ -923,7 +1076,6 @@ void loop()
|
||||||
/* Alternative is to handle it in each and every state */
|
/* Alternative is to handle it in each and every state */
|
||||||
if (chk_ev(EV_TONETIMER))
|
if (chk_ev(EV_TONETIMER))
|
||||||
set_tone(0, 0);
|
set_tone(0, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// vim: syn=cpp
|
// vim: syn=cpp
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,97 +0,0 @@
|
||||||
/*--------------------------------------------------------------------
|
|
||||||
This file is part of the Adafruit NeoPixel library.
|
|
||||||
|
|
||||||
NeoPixel is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Lesser General Public License as
|
|
||||||
published by the Free Software Foundation, either version 3 of
|
|
||||||
the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
NeoPixel is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with NeoPixel. If not, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
--------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef ADAFRUIT_NEOPIXEL_H
|
|
||||||
#define ADAFRUIT_NEOPIXEL_H
|
|
||||||
|
|
||||||
#if (ARDUINO >= 100)
|
|
||||||
#include <Arduino.h>
|
|
||||||
#else
|
|
||||||
#include <WProgram.h>
|
|
||||||
#include <pins_arduino.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// 'type' flags for LED pixels (third parameter to constructor):
|
|
||||||
#define NEO_RGB 0x00 // Wired for RGB data order
|
|
||||||
#define NEO_GRB 0x01 // Wired for GRB data order
|
|
||||||
#define NEO_BRG 0x04
|
|
||||||
|
|
||||||
#define NEO_COLMASK 0x01
|
|
||||||
#define NEO_KHZ800 0x02 // 800 KHz datastream
|
|
||||||
#define NEO_SPDMASK 0x02
|
|
||||||
// Trinket flash space is tight, v1 NeoPixels aren't handled by default.
|
|
||||||
// Remove the ifndef/endif to add support -- but code will be bigger.
|
|
||||||
// Conversely, can comment out the #defines to save space on other MCUs.
|
|
||||||
#ifndef __AVR_ATtiny85__
|
|
||||||
#define NEO_KHZ400 0x00 // 400 KHz datastream
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class Adafruit_NeoPixel
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructor: number of LEDs, pin number, LED type
|
|
||||||
Adafruit_NeoPixel(uint16_t n, uint8_t p = 6, uint8_t t = NEO_GRB + NEO_KHZ800);
|
|
||||||
~Adafruit_NeoPixel();
|
|
||||||
|
|
||||||
void
|
|
||||||
begin(void),
|
|
||||||
show(void),
|
|
||||||
setPin(uint8_t p),
|
|
||||||
setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b),
|
|
||||||
setPixelColor(uint16_t n, uint32_t c),
|
|
||||||
setPixelColorHsv(uint16_t n, uint16_t h, uint8_t s, uint8_t v),
|
|
||||||
setBrightness(uint8_t),
|
|
||||||
clear();
|
|
||||||
uint8_t
|
|
||||||
*
|
|
||||||
getPixels(void) const,
|
|
||||||
getBrightness(void) const;
|
|
||||||
uint16_t
|
|
||||||
numPixels(void) const;
|
|
||||||
static uint32_t
|
|
||||||
Color(uint8_t r, uint8_t g, uint8_t b);
|
|
||||||
uint32_t
|
|
||||||
getPixelColor(uint16_t n) const;
|
|
||||||
inline bool
|
|
||||||
canShow(void) { return (micros() - endTime) >= 50L; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
const uint16_t
|
|
||||||
numLEDs, // Number of RGB LEDs in strip
|
|
||||||
numBytes; // Size of 'pixels' buffer below
|
|
||||||
uint8_t
|
|
||||||
pin, // Output pin number
|
|
||||||
brightness,
|
|
||||||
*pixels, // Holds LED color values (3 bytes each)
|
|
||||||
rOffset, // Index of red byte within each 3-byte pixel
|
|
||||||
gOffset, // Index of green byte
|
|
||||||
bOffset; // Index of blue byte
|
|
||||||
const uint8_t
|
|
||||||
type; // Pixel flags (400 vs 800 KHz, RGB vs GRB color)
|
|
||||||
uint32_t
|
|
||||||
endTime; // Latch timing reference
|
|
||||||
#ifdef __AVR__
|
|
||||||
const volatile uint8_t
|
|
||||||
*port; // Output PORT register
|
|
||||||
uint8_t
|
|
||||||
pinMask; // Output PORT bitmask
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADAFRUIT_NEOPIXEL_H
|
|
|
@ -5,7 +5,7 @@
|
||||||
#define GPIO22 22
|
#define GPIO22 22
|
||||||
#define GPIO18 18 // SPI CLK
|
#define GPIO18 18 // SPI CLK
|
||||||
#define GPIO19 19
|
#define GPIO19 19
|
||||||
#define GPIO21 21
|
#define GPIO21 21 // guter LED-out pin
|
||||||
|
|
||||||
//ADIO
|
//ADIO
|
||||||
#define GPIO25 25
|
#define GPIO25 25
|
||||||
|
|
Loading…
Reference in a new issue