136 lines
3.2 KiB
C++
136 lines
3.2 KiB
C++
#include <Arduboy2.h>
|
|
#include <ArdVoice.h>
|
|
#include "voices.h"
|
|
#include "bitmaps.h"
|
|
|
|
#define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0]))
|
|
|
|
Arduboy2 arduboy;
|
|
ArdVoice ardvoice;
|
|
#define ARDBITMAP_SBUF arduboy.getBuffer()
|
|
#include <ArdBitmap.h>
|
|
ArdBitmap<WIDTH, HEIGHT> ardbitmap;
|
|
unsigned long initTime;
|
|
|
|
int voice_segment = 0;
|
|
boolean onePlayed = false;
|
|
boolean twoPlayed = false;
|
|
boolean threePlayed = false;
|
|
boolean merryPlayed = false;
|
|
|
|
void setup() {
|
|
arduboy.begin();
|
|
arduboy.invert(!arduboy.audio.enabled());
|
|
arduboy.setFrameRate(60);
|
|
initTime = millis();
|
|
}
|
|
|
|
|
|
void loop() {
|
|
if (!(arduboy.nextFrame()))
|
|
return;
|
|
|
|
arduboy.clear();
|
|
unsigned long myTime = (millis()-initTime);
|
|
float resize1 = abs(sin((millis()-initTime)/ (1000.0/(PI))));
|
|
float resize2 = abs(sin((millis()-initTime - 3000)/ (4000.0/(PI))));
|
|
float resize3 = abs(sin((millis()-initTime - 7000)/ (8000.0/(PI))));
|
|
|
|
if (myTime < 7000){
|
|
setContrast((myTime > 3000 ? resize2 :resize1) * 255);
|
|
ardbitmap.drawCompressedResized(WIDTH / 2, HEIGHT / 2, myTime < 1000 ? NUMBER_3 :
|
|
myTime < 2000 ? NUMBER_2 :
|
|
myTime < 3000 ? NUMBER_1 :
|
|
MERRY_CHRISTMAS , WHITE, ALIGN_CENTER, MIRROR_NONE, myTime > 3000 ? resize2 :resize1);
|
|
|
|
} else {
|
|
|
|
int contrast = resize3 * 255;
|
|
setContrast(contrast);
|
|
ardbitmap.drawCompressedResized(WIDTH/2, HEIGHT, DOG[ (myTime/80)% ARRAY_LEN(DOG)], WHITE, ALIGN_H_CENTER | ALIGN_V_BOTTOM, MIRROR_NONE, resize3 );
|
|
|
|
}
|
|
|
|
//VOICES
|
|
if (myTime > 250 && !threePlayed){
|
|
threePlayed = true;
|
|
ardvoice.playVoice(three_q6);
|
|
}
|
|
|
|
if (myTime > 1250 && !twoPlayed){
|
|
twoPlayed = true;
|
|
ardvoice.playVoice(two_q6);
|
|
}
|
|
|
|
if (myTime > 2300 && !onePlayed){
|
|
onePlayed = true;
|
|
ardvoice.playVoice(one_q6);
|
|
}
|
|
|
|
if (myTime > 3200){
|
|
|
|
if(!ardvoice.isVoicePlaying()) {
|
|
switch(voice_segment){
|
|
case 0:
|
|
ardvoice.playVoice(merry_q6);
|
|
voice_segment++;
|
|
break;
|
|
case 1:
|
|
ardvoice.playVoice(merry_q6, 4400, 0, 1.0);
|
|
voice_segment++;
|
|
break;
|
|
case 2:
|
|
ardvoice.playVoice(merry_q6, 4400, 13500, 0.8);
|
|
voice_segment++;
|
|
break;
|
|
case 3:
|
|
ardvoice.playVoice(merry_q6, 4400, 11500, 1.3);
|
|
voice_segment++;
|
|
break;
|
|
case 4:
|
|
ardvoice.playVoice(merry_q6, 11500, 13500, 1.4);
|
|
voice_segment++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Reset demo
|
|
if(arduboy.pressed(A_BUTTON) || arduboy.pressed(B_BUTTON)){
|
|
initTime = millis();
|
|
voice_segment = 0;
|
|
onePlayed = false;
|
|
twoPlayed = false;
|
|
threePlayed = false;
|
|
merryPlayed = false;
|
|
}
|
|
if(arduboy.pressed(UP_BUTTON)){
|
|
arduboy.audio.on();
|
|
arduboy.invert(false);
|
|
}
|
|
if(arduboy.pressed(DOWN_BUTTON)){
|
|
arduboy.audio.off();
|
|
arduboy.invert(true);
|
|
}
|
|
|
|
arduboy.display();
|
|
}
|
|
|
|
|
|
|
|
void setContrast(uint8_t contrast){
|
|
|
|
arduboy.LCDCommandMode();
|
|
SPI.transfer(0xd9);
|
|
SPI.transfer(0x2f);
|
|
SPI.transfer(0xdb);
|
|
SPI.transfer(0x00);
|
|
|
|
SPI.transfer(0x81); // contrast command
|
|
SPI.transfer(contrast);
|
|
arduboy.LCDDataMode();
|
|
}
|
|
|