mirror of
https://github.com/xfjx/TonUINO.git
synced 2025-08-22 17:53:11 +02:00
Update Beta
This commit is contained in:
547
Tonuino.ino
547
Tonuino.ino
@@ -60,6 +60,8 @@ struct adminSettings {
|
||||
long standbyTimer;
|
||||
bool invertVolumeButtons;
|
||||
folderSettings shortCuts[4];
|
||||
uint8_t adminMenuLocked;
|
||||
uint8_t adminMenuPin[4];
|
||||
};
|
||||
|
||||
adminSettings mySettings;
|
||||
@@ -71,6 +73,10 @@ static void nextTrack(uint16_t track);
|
||||
uint8_t voiceMenu(int numberOfOptions, int startMessage, int messageOffset,
|
||||
bool preview = false, int previewFromFolder = 0, int defaultValue = 0, bool exitWithLongPress = false);
|
||||
bool isPlaying();
|
||||
bool checkTwo ( uint8_t a[], uint8_t b[] );
|
||||
void writeCard(nfcTagObject nfcTag);
|
||||
void dump_byte_array(byte * buffer, byte bufferSize);
|
||||
void adminMenu(bool fromCard = false);
|
||||
bool knownCard = false;
|
||||
|
||||
// implement a notification class,
|
||||
@@ -118,10 +124,10 @@ void shuffleQueue() {
|
||||
queue[i] = queue[j];
|
||||
queue[j] = t;
|
||||
}
|
||||
Serial.println(F("Queue :"));
|
||||
for (uint8_t x = 0; x < numTracksInFolder - firstTrack + 1 ; x++)
|
||||
Serial.println(queue[x]);
|
||||
|
||||
/* Serial.println(F("Queue :"));
|
||||
for (uint8_t x = 0; x < numTracksInFolder - firstTrack + 1 ; x++)
|
||||
Serial.println(queue[x]);
|
||||
*/
|
||||
}
|
||||
|
||||
void writeSettingsToFlash() {
|
||||
@@ -133,7 +139,7 @@ void writeSettingsToFlash() {
|
||||
void resetSettings() {
|
||||
Serial.println(F("=== resetSettings()"));
|
||||
mySettings.cookie = cardCookie;
|
||||
mySettings.version = 1;
|
||||
mySettings.version = 2;
|
||||
mySettings.maxVolume = 25;
|
||||
mySettings.minVolume = 5;
|
||||
mySettings.initVolume = 15;
|
||||
@@ -145,11 +151,27 @@ void resetSettings() {
|
||||
mySettings.shortCuts[1].folder = 0;
|
||||
mySettings.shortCuts[2].folder = 0;
|
||||
mySettings.shortCuts[3].folder = 0;
|
||||
mySettings.adminMenuLocked = 0;
|
||||
mySettings.adminMenuPin[0] = 1;
|
||||
mySettings.adminMenuPin[1] = 1;
|
||||
mySettings.adminMenuPin[2] = 1;
|
||||
mySettings.adminMenuPin[3] = 1;
|
||||
|
||||
writeSettingsToFlash();
|
||||
}
|
||||
|
||||
void migradeSettings(int oldVersion) {
|
||||
|
||||
if (oldVersion == 1) {
|
||||
Serial.println(F("=== resetSettings()"));
|
||||
Serial.println(F("1 -> 2"));
|
||||
mySettings.version = 2;
|
||||
mySettings.adminMenuLocked = 0;
|
||||
mySettings.adminMenuPin[0] = 1;
|
||||
mySettings.adminMenuPin[1] = 2;
|
||||
mySettings.adminMenuPin[2] = 3;
|
||||
mySettings.adminMenuPin[3] = 4;
|
||||
writeSettingsToFlash();
|
||||
}
|
||||
}
|
||||
|
||||
void loadSettingsFromFlash() {
|
||||
@@ -183,15 +205,276 @@ void loadSettingsFromFlash() {
|
||||
|
||||
Serial.print(F("Inverted Volume Buttons: "));
|
||||
Serial.println(mySettings.invertVolumeButtons);
|
||||
|
||||
Serial.print(F("Admin Menu locked: "));
|
||||
Serial.println(mySettings.adminMenuLocked);
|
||||
|
||||
Serial.print(F("Admin Menu Pin: "));
|
||||
Serial.print(mySettings.adminMenuPin[0]);
|
||||
Serial.print(mySettings.adminMenuPin[1]);
|
||||
Serial.print(mySettings.adminMenuPin[2]);
|
||||
Serial.println(mySettings.adminMenuPin[3]);
|
||||
}
|
||||
|
||||
class Modifier {
|
||||
public:
|
||||
virtual void loop() {}
|
||||
virtual bool handlePause() {
|
||||
return false;
|
||||
}
|
||||
virtual bool handleNext() {
|
||||
return false;
|
||||
}
|
||||
virtual bool handlePrevious() {
|
||||
return false;
|
||||
}
|
||||
virtual bool handleNextButton() {
|
||||
return false;
|
||||
}
|
||||
virtual bool handlePreviousButton() {
|
||||
return false;
|
||||
}
|
||||
virtual bool handleVolumeUp() {
|
||||
return false;
|
||||
}
|
||||
virtual bool handleVolumeDown() {
|
||||
return false;
|
||||
}
|
||||
virtual bool handleRFID(nfcTagObject *newCard) {
|
||||
return false;
|
||||
}
|
||||
virtual uint8_t getActive() {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
Modifier *activeModifier = NULL;
|
||||
|
||||
class SleepTimer: public Modifier {
|
||||
private:
|
||||
unsigned long sleepAtMillis = 0;
|
||||
|
||||
public:
|
||||
void loop() {
|
||||
if (this->sleepAtMillis != 0 && millis() > this->sleepAtMillis) {
|
||||
Serial.println(F("=== SleepTimer::loop() -> SLEEP!"));
|
||||
mp3.pause();
|
||||
activeModifier = NULL;
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
SleepTimer(uint8_t minutes) {
|
||||
Serial.println(F("=== SleepTimer()"));
|
||||
Serial.println(minutes);
|
||||
this->sleepAtMillis = millis() + minutes * 60000;
|
||||
if (isPlaying())
|
||||
mp3.playAdvertisement(302);
|
||||
delay(500);
|
||||
}
|
||||
uint8_t getActive() {
|
||||
Serial.println(F("== SleepTimer::getActive()"));
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
class FreezeDance: public Modifier {
|
||||
private:
|
||||
unsigned long nextStopAtMillis = 0;
|
||||
const uint8_t minSecondsBetweenStops = 5;
|
||||
const uint8_t maxSecondsBetweenStops = 30;
|
||||
|
||||
void setNextStopAtMillis() {
|
||||
uint16_t seconds = random(this->minSecondsBetweenStops, this->maxSecondsBetweenStops + 1);
|
||||
Serial.println(F("=== FreezeDance::setNextStopAtMillis()"));
|
||||
Serial.println(seconds);
|
||||
this->nextStopAtMillis = millis() + seconds * 1000;
|
||||
}
|
||||
|
||||
public:
|
||||
void loop() {
|
||||
if (this->nextStopAtMillis != 0 && millis() > this->nextStopAtMillis) {
|
||||
Serial.println(F("== FreezeDance::loop() -> FREEZE!"));
|
||||
if (isPlaying()) {
|
||||
mp3.playAdvertisement(301);
|
||||
delay(500);
|
||||
}
|
||||
setNextStopAtMillis();
|
||||
}
|
||||
}
|
||||
FreezeDance(void) {
|
||||
Serial.println(F("=== FreezeDance()"));
|
||||
if (isPlaying()) {
|
||||
mp3.playAdvertisement(300);
|
||||
delay(500);
|
||||
}
|
||||
setNextStopAtMillis();
|
||||
}
|
||||
uint8_t getActive() {
|
||||
Serial.println(F("== FreezeDance::getActive()"));
|
||||
return 2;
|
||||
}
|
||||
};
|
||||
|
||||
class Locked: public Modifier {
|
||||
public:
|
||||
virtual bool handlePause() {
|
||||
Serial.println(F("== Locked::handlePause() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handeNextButton() {
|
||||
Serial.println(F("== Locked::handeNextButton() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handlePreviousButton() {
|
||||
Serial.println(F("== Locked::handlePreviousButton() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handleVolumeUp() {
|
||||
Serial.println(F("== Locked::handleVolumeUp() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handleVolumeDown() {
|
||||
Serial.println(F("== Locked::handleVolumeDown() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handleRFID(nfcTagObject *newCard) {
|
||||
Serial.println(F("== Locked::handleRFID() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
Locked(void) {
|
||||
Serial.println(F("=== Locked()"));
|
||||
if (isPlaying())
|
||||
mp3.playAdvertisement(303);
|
||||
}
|
||||
uint8_t getActive() {
|
||||
return 3;
|
||||
}
|
||||
};
|
||||
|
||||
class ToddlerMode: public Modifier {
|
||||
public:
|
||||
virtual bool handlePause() {
|
||||
Serial.println(F("== ToddlerMode::handlePause() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handeNextButton() {
|
||||
Serial.println(F("== ToddlerMode::handeNextButton() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handlePreviousButton() {
|
||||
Serial.println(F("== ToddlerMode::handlePreviousButton() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handleVolumeUp() {
|
||||
Serial.println(F("== ToddlerMode::handleVolumeUp() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handleVolumeDown() {
|
||||
Serial.println(F("== ToddlerMode::handleVolumeDown() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
ToddlerMode(void) {
|
||||
Serial.println(F("=== ToddlerMode()"));
|
||||
if (isPlaying())
|
||||
mp3.playAdvertisement(304);
|
||||
}
|
||||
uint8_t getActive() {
|
||||
Serial.println(F("== ToddlerMode::getActive()"));
|
||||
return 4;
|
||||
}
|
||||
};
|
||||
|
||||
class KindergardenMode: public Modifier {
|
||||
private:
|
||||
nfcTagObject nextCard;
|
||||
bool cardQueued = false;
|
||||
|
||||
public:
|
||||
virtual bool handleNext() {
|
||||
Serial.println(F("== KindergardenMode::handleNext() -> NEXT"));
|
||||
//if (this->nextCard.cookie == cardCookie && this->nextCard.nfcFolderSettings.folder != 0 && this->nextCard.nfcFolderSettings.mode != 0) {
|
||||
//myFolder = &this->nextCard.nfcFolderSettings;
|
||||
if (this->cardQueued == true) {
|
||||
this->cardQueued = false;
|
||||
|
||||
myCard = nextCard;
|
||||
myFolder = &myCard.nfcFolderSettings;
|
||||
Serial.println(myFolder->folder);
|
||||
Serial.println(myFolder->mode);
|
||||
playFolder();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
virtual bool handleNextButton() {
|
||||
Serial.println(F("== KindergardenMode::handeNextButton() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handlePreviousButton() {
|
||||
Serial.println(F("== KindergardenMode::handlePreviousButton() -> LOCKED!"));
|
||||
return true;
|
||||
}
|
||||
virtual bool handleRFID(nfcTagObject * newCard) { // lot of work to do!
|
||||
Serial.println(F("== KindergardenMode::handleRFID() -> queued!"));
|
||||
this->nextCard = *newCard;
|
||||
this->cardQueued = true;
|
||||
return true;
|
||||
}
|
||||
KindergardenMode() {
|
||||
Serial.println(F("=== KindergardenMode()"));
|
||||
if (isPlaying())
|
||||
mp3.playAdvertisement(305);
|
||||
delay(500);
|
||||
}
|
||||
uint8_t getActive() {
|
||||
Serial.println(F("== KindergardenMode::getActive()"));
|
||||
return 5;
|
||||
}
|
||||
};
|
||||
|
||||
// An modifier can also do somethings in addition to the modified action
|
||||
// by returning false (not handled) at the end
|
||||
// This simple FeedbackModifier will tell the volume before changing it and
|
||||
// give some feedback once a RFID card is detected.
|
||||
class FeedbackModifier: public Modifier {
|
||||
public:
|
||||
virtual bool handleVolumeDown() {
|
||||
if (volume > mySettings.minVolume) {
|
||||
mp3.playAdvertisement(volume - 1);
|
||||
}
|
||||
else {
|
||||
mp3.playAdvertisement(volume);
|
||||
}
|
||||
delay(500);
|
||||
Serial.println(F("== FeedbackModifier::handleVolumeDown()!"));
|
||||
return false;
|
||||
}
|
||||
virtual bool handleVolumeUp() {
|
||||
if (volume < mySettings.maxVolume) {
|
||||
mp3.playAdvertisement(volume + 1);
|
||||
}
|
||||
else {
|
||||
mp3.playAdvertisement(volume);
|
||||
}
|
||||
delay(500);
|
||||
Serial.println(F("== FeedbackModifier::handleVolumeUp()!"));
|
||||
return false;
|
||||
}
|
||||
virtual bool handleRFID(nfcTagObject *newCard) {
|
||||
Serial.println(F("== FeedbackModifier::handleRFID()"));
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// Leider kann das Modul selbst keine Queue abspielen, daher müssen wir selbst die Queue verwalten
|
||||
static uint16_t _lastTrackFinished;
|
||||
static void nextTrack(uint16_t track) {
|
||||
Serial.println(F("=== nextTrack()"));
|
||||
if (track == _lastTrackFinished) {
|
||||
return;
|
||||
}
|
||||
Serial.println(F("=== nextTrack()"));
|
||||
|
||||
_lastTrackFinished = track;
|
||||
|
||||
if (knownCard == false)
|
||||
@@ -199,6 +482,10 @@ static void nextTrack(uint16_t track) {
|
||||
// verarbeitet werden
|
||||
return;
|
||||
|
||||
if (activeModifier != NULL)
|
||||
if (activeModifier->handleNext() == true)
|
||||
return;
|
||||
|
||||
if (myFolder->mode == 1 || myFolder->mode == 7) {
|
||||
Serial.println(F("Hörspielmodus ist aktiv -> keinen neuen Track spielen"));
|
||||
setstandbyTimer();
|
||||
@@ -371,7 +658,6 @@ void checkStandbyAtMillis() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool isPlaying() {
|
||||
return !digitalRead(busyPin);
|
||||
}
|
||||
@@ -440,15 +726,15 @@ void setup() {
|
||||
pinMode(shutdownPin, OUTPUT);
|
||||
digitalWrite(shutdownPin, LOW);
|
||||
|
||||
/* // RESET --- ALLE DREI KNÖPFE BEIM STARTEN GEDRÜCKT HALTEN -> alle EINSTELLUNGEN werden gelöscht
|
||||
if (digitalRead(buttonPause) == LOW && digitalRead(buttonUp) == LOW &&
|
||||
digitalRead(buttonDown) == LOW) {
|
||||
Serial.println(F("Reset -> EEPROM wird gelöscht"));
|
||||
for (int i = 0; i < EEPROM.length(); i++) {
|
||||
EEPROM.update(i, 0);
|
||||
}
|
||||
// RESET --- ALLE DREI KNÖPFE BEIM STARTEN GEDRÜCKT HALTEN -> alle EINSTELLUNGEN werden gelöscht
|
||||
if (digitalRead(buttonPause) == LOW && digitalRead(buttonUp) == LOW &&
|
||||
digitalRead(buttonDown) == LOW) {
|
||||
Serial.println(F("Reset -> EEPROM wird gelöscht"));
|
||||
for (int i = 0; i < EEPROM.length(); i++) {
|
||||
EEPROM.update(i, 0);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// Start Shortcut "at Startup" - e.g. Welcome Sound
|
||||
playShortCut(3);
|
||||
}
|
||||
@@ -464,6 +750,10 @@ void readButtons() {
|
||||
}
|
||||
|
||||
void volumeUpButton() {
|
||||
if (activeModifier != NULL)
|
||||
if (activeModifier->handleVolumeUp() == true)
|
||||
return;
|
||||
|
||||
Serial.println(F("=== volumeUp()"));
|
||||
if (volume < mySettings.maxVolume) {
|
||||
mp3.increaseVolume();
|
||||
@@ -473,6 +763,10 @@ void volumeUpButton() {
|
||||
}
|
||||
|
||||
void volumeDownButton() {
|
||||
if (activeModifier != NULL)
|
||||
if (activeModifier->handleVolumeDown() == true)
|
||||
return;
|
||||
|
||||
Serial.println(F("=== volumeDown()"));
|
||||
if (volume > mySettings.minVolume) {
|
||||
mp3.decreaseVolume();
|
||||
@@ -482,16 +776,25 @@ void volumeDownButton() {
|
||||
}
|
||||
|
||||
void nextButton() {
|
||||
if (activeModifier != NULL)
|
||||
if (activeModifier->handleNextButton() == true)
|
||||
return;
|
||||
|
||||
nextTrack(random(65536));
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
void previousButton() {
|
||||
if (activeModifier != NULL)
|
||||
if (activeModifier->handlePreviousButton() == true)
|
||||
return;
|
||||
|
||||
previousTrack();
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
void playFolder() {
|
||||
Serial.println(F("== playFolder()")) ;
|
||||
disablestandbyTimer();
|
||||
randomSeed(millis() + random(1000));
|
||||
knownCard = true;
|
||||
@@ -592,6 +895,12 @@ void loop() {
|
||||
do {
|
||||
checkStandbyAtMillis();
|
||||
mp3.loop();
|
||||
|
||||
// Modifier : WIP!
|
||||
if (activeModifier != NULL) {
|
||||
activeModifier->loop();
|
||||
}
|
||||
|
||||
// Buttons werden nun über JS_Button gehandelt, dadurch kann jede Taste
|
||||
// doppelt belegt werden
|
||||
readButtons();
|
||||
@@ -608,6 +917,9 @@ void loop() {
|
||||
}
|
||||
|
||||
if (pauseButton.wasReleased()) {
|
||||
if (activeModifier != NULL)
|
||||
if (activeModifier->handlePause() == true)
|
||||
return;
|
||||
if (ignorePauseButton == false)
|
||||
if (isPlaying()) {
|
||||
mp3.pause();
|
||||
@@ -620,6 +932,9 @@ void loop() {
|
||||
ignorePauseButton = false;
|
||||
} else if (pauseButton.pressedFor(LONG_PRESS) &&
|
||||
ignorePauseButton == false) {
|
||||
if (activeModifier != NULL)
|
||||
if (activeModifier->handlePause() == true)
|
||||
return;
|
||||
if (isPlaying()) {
|
||||
uint8_t advertTrack;
|
||||
if (myFolder->mode == 3 || myFolder->mode == 9) {
|
||||
@@ -731,12 +1046,12 @@ void loop() {
|
||||
if (readCard(&myCard) == true) {
|
||||
// make random a little bit more "random"
|
||||
randomSeed(millis() + random(1000));
|
||||
if (myCard.cookie == cardCookie && myFolder->folder != 0 && myFolder->mode != 0) {
|
||||
if (myCard.cookie == cardCookie && myCard.nfcFolderSettings.folder != 0 && myCard.nfcFolderSettings.mode != 0) {
|
||||
playFolder();
|
||||
}
|
||||
|
||||
// Neue Karte konfigurieren
|
||||
else {
|
||||
else if (myCard.cookie != cardCookie) {
|
||||
knownCard = false;
|
||||
mp3.playMp3FolderTrack(300);
|
||||
waitForTrackToFinish();
|
||||
@@ -747,13 +1062,59 @@ void loop() {
|
||||
mfrc522.PCD_StopCrypto1();
|
||||
}
|
||||
|
||||
void adminMenu() {
|
||||
void adminMenu(bool fromCard = false) {
|
||||
disablestandbyTimer();
|
||||
mp3.pause();
|
||||
Serial.println(F("=== adminMenu()"));
|
||||
knownCard = false;
|
||||
if (fromCard == false) {
|
||||
// Admin menu has been locked - it still can be trigged via admin card
|
||||
if (mySettings.adminMenuLocked == 1) {
|
||||
return;
|
||||
}
|
||||
// Pin check
|
||||
else if (mySettings.adminMenuLocked == 2) {
|
||||
uint8_t pin[4];
|
||||
mp3.playMp3FolderTrack(991);
|
||||
if (askCode(pin) == true) {
|
||||
if (checkTwo(pin, mySettings.adminMenuPin) == false) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Match check
|
||||
else if (mySettings.adminMenuLocked == 3) {
|
||||
uint8_t a = random(10, 20);
|
||||
uint8_t b = random(1, 10);
|
||||
uint8_t c;
|
||||
mp3.playMp3FolderTrack(992);
|
||||
waitForTrackToFinish();
|
||||
mp3.playMp3FolderTrack(a);
|
||||
|
||||
int subMenu = voiceMenu(11, 900, 900, false, false, 0, true);
|
||||
if (random(1, 3) == 2) {
|
||||
// a + b
|
||||
c = a + b;
|
||||
waitForTrackToFinish();
|
||||
mp3.playMp3FolderTrack(993);
|
||||
} else {
|
||||
// a - b
|
||||
b = random(1, a);
|
||||
c = a - b;
|
||||
waitForTrackToFinish();
|
||||
mp3.playMp3FolderTrack(994);
|
||||
}
|
||||
waitForTrackToFinish();
|
||||
mp3.playMp3FolderTrack(b);
|
||||
Serial.println(c);
|
||||
uint8_t temp = voiceMenu(255, 0, 0, false);
|
||||
if (temp != c) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
int subMenu = voiceMenu(12, 900, 900, false, false, 0, true);
|
||||
if (subMenu == 0)
|
||||
return;
|
||||
if (subMenu == 1) {
|
||||
@@ -779,7 +1140,43 @@ void adminMenu() {
|
||||
mp3.setEq(mySettings.eq - 1);
|
||||
}
|
||||
else if (subMenu == 6) {
|
||||
// create master card
|
||||
// create modifier card
|
||||
nfcTagObject tempCard;
|
||||
tempCard.cookie = cardCookie;
|
||||
tempCard.version = 1;
|
||||
tempCard.nfcFolderSettings.folder = 0;
|
||||
tempCard.nfcFolderSettings.special = 0;
|
||||
tempCard.nfcFolderSettings.special2 = 0;
|
||||
tempCard.nfcFolderSettings.mode = voiceMenu(5, 970, 970, false, false, 0, true);
|
||||
|
||||
if (tempCard.nfcFolderSettings.mode != 0) {
|
||||
if (tempCard.nfcFolderSettings.mode == 1) {
|
||||
switch (voiceMenu(5, 960, 960)) {
|
||||
case 1: tempCard.nfcFolderSettings.special = 5; break;
|
||||
case 2: tempCard.nfcFolderSettings.special = 15; break;
|
||||
case 3: tempCard.nfcFolderSettings.special = 30; break;
|
||||
case 4: tempCard.nfcFolderSettings.special = 60; break;
|
||||
}
|
||||
}
|
||||
do {
|
||||
readButtons();
|
||||
if (upButton.wasReleased() || downButton.wasReleased()) {
|
||||
Serial.println(F("Abgebrochen!"));
|
||||
mp3.playMp3FolderTrack(802);
|
||||
return;
|
||||
}
|
||||
} while (!mfrc522.PICC_IsNewCardPresent());
|
||||
|
||||
// RFID Karte wurde aufgelegt
|
||||
if (mfrc522.PICC_ReadCardSerial()) {
|
||||
Serial.println(F("schreibe Karte..."));
|
||||
writeCard(tempCard);
|
||||
delay(100);
|
||||
mfrc522.PICC_HaltA();
|
||||
mfrc522.PCD_StopCrypto1();
|
||||
waitForTrackToFinish();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (subMenu == 7) {
|
||||
uint8_t shortcut = voiceMenu(4, 940, 940);
|
||||
@@ -825,14 +1222,14 @@ void adminMenu() {
|
||||
} while (!mfrc522.PICC_IsNewCardPresent());
|
||||
|
||||
// RFID Karte wurde aufgelegt
|
||||
if (!mfrc522.PICC_ReadCardSerial())
|
||||
return;
|
||||
Serial.println(F("schreibe Karte..."));
|
||||
writeCard(tempCard);
|
||||
delay(100);
|
||||
mfrc522.PICC_HaltA();
|
||||
mfrc522.PCD_StopCrypto1();
|
||||
waitForTrackToFinish();
|
||||
if (mfrc522.PICC_ReadCardSerial()) {
|
||||
Serial.println(F("schreibe Karte..."));
|
||||
writeCard(tempCard);
|
||||
delay(100);
|
||||
mfrc522.PICC_HaltA();
|
||||
mfrc522.PCD_StopCrypto1();
|
||||
waitForTrackToFinish();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (subMenu == 10) {
|
||||
@@ -853,13 +1250,35 @@ void adminMenu() {
|
||||
resetSettings();
|
||||
mp3.playMp3FolderTrack(999);
|
||||
}
|
||||
// lock admin menu
|
||||
else if (subMenu == 12) {
|
||||
int temp = voiceMenu(4, 980, 980, false);
|
||||
if (temp == 1) {
|
||||
mySettings.adminMenuLocked = 0;
|
||||
}
|
||||
else if (temp == 2) {
|
||||
mySettings.adminMenuLocked = 1;
|
||||
}
|
||||
else if (temp == 3) {
|
||||
int8_t pin[4];
|
||||
mp3.playMp3FolderTrack(991);
|
||||
if (askCode(pin)) {
|
||||
memcpy(mySettings.adminMenuPin, pin, 4);
|
||||
mySettings.adminMenuLocked = 2;
|
||||
}
|
||||
}
|
||||
else if (temp == 4) {
|
||||
mySettings.adminMenuLocked = 3;
|
||||
}
|
||||
|
||||
}
|
||||
writeSettingsToFlash();
|
||||
setstandbyTimer();
|
||||
}
|
||||
|
||||
bool askCode(uint8_t *code) {
|
||||
uint8_t x = 0;
|
||||
while (x < 3) {
|
||||
while (x < 4) {
|
||||
readButtons();
|
||||
if (pauseButton.pressedFor(LONG_PRESS))
|
||||
break;
|
||||
@@ -1009,9 +1428,11 @@ void setupFolder(folderSettings * theFolder) {
|
||||
theFolder->special = voiceMenu(mp3.getFolderTrackCount(theFolder->folder), 320, 0,
|
||||
true, theFolder->folder);
|
||||
// Admin Funktionen
|
||||
if (theFolder->mode == 6)
|
||||
theFolder->special = voiceMenu(3, 320, 320);
|
||||
|
||||
if (theFolder->mode == 6) {
|
||||
//theFolder->special = voiceMenu(3, 320, 320);
|
||||
theFolder->folder = 0;
|
||||
theFolder->mode = 0;
|
||||
}
|
||||
// Spezialmodus Von-Bis
|
||||
if (theFolder->mode == 7 || theFolder->mode == 8 || theFolder->mode == 9) {
|
||||
theFolder->special = voiceMenu(mp3.getFolderTrackCount(theFolder->folder), 321, 0,
|
||||
@@ -1033,6 +1454,7 @@ void setupCard() {
|
||||
}
|
||||
|
||||
bool readCard(nfcTagObject * nfcTag) {
|
||||
nfcTagObject tempCard;
|
||||
// Show some details of the PICC (that is: the tag/card)
|
||||
Serial.print(F("Card UID:"));
|
||||
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
|
||||
@@ -1055,7 +1477,7 @@ bool readCard(nfcTagObject * nfcTag) {
|
||||
}
|
||||
else if (piccType == MFRC522::PICC_TYPE_MIFARE_UL )
|
||||
{
|
||||
byte pACK[] = {0, 0}; //16 bit PassWord ACK returned by the NFCtag
|
||||
byte pACK[] = {0, 0}; //16 bit PassWord ACK returned by the tempCard
|
||||
|
||||
// Authenticate using key A
|
||||
Serial.println(F("Authenticating MIFARE UL..."));
|
||||
@@ -1138,18 +1560,51 @@ bool readCard(nfcTagObject * nfcTag) {
|
||||
tempCookie += (uint32_t)buffer[2] << 8;
|
||||
tempCookie += (uint32_t)buffer[3];
|
||||
|
||||
nfcTag->cookie = tempCookie;
|
||||
nfcTag->version = buffer[4];
|
||||
nfcTag->nfcFolderSettings.folder = buffer[5];
|
||||
nfcTag->nfcFolderSettings.mode = buffer[6];
|
||||
nfcTag->nfcFolderSettings.special = buffer[7];
|
||||
nfcTag->nfcFolderSettings.special2 = buffer[8];
|
||||
tempCard.cookie = tempCookie;
|
||||
tempCard.version = buffer[4];
|
||||
tempCard.nfcFolderSettings.folder = buffer[5];
|
||||
tempCard.nfcFolderSettings.mode = buffer[6];
|
||||
tempCard.nfcFolderSettings.special = buffer[7];
|
||||
tempCard.nfcFolderSettings.special2 = buffer[8];
|
||||
|
||||
myFolder = &nfcTag->nfcFolderSettings;
|
||||
if (tempCard.cookie == cardCookie) {
|
||||
|
||||
if (activeModifier != NULL && tempCard.nfcFolderSettings.folder != 0) {
|
||||
if (activeModifier->handleRFID(&tempCard) == true) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (tempCard.nfcFolderSettings.folder == 0) {
|
||||
if (activeModifier != NULL) {
|
||||
if (activeModifier->getActive() == tempCard.nfcFolderSettings.mode) {
|
||||
activeModifier = NULL;
|
||||
Serial.println(F("modifier removed"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
switch (tempCard.nfcFolderSettings.mode ) {
|
||||
case 0: adminMenu(true); break;
|
||||
case 1: activeModifier = new SleepTimer(tempCard.nfcFolderSettings.special); break;
|
||||
case 2: activeModifier = new FreezeDance(); break;
|
||||
case 3: activeModifier = new Locked(); break;
|
||||
case 4: activeModifier = new ToddlerMode(); break;
|
||||
case 5: activeModifier = new KindergardenMode(); break;
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
memcpy(nfcTag, &tempCard, sizeof(nfcTagObject));
|
||||
Serial.println( nfcTag->nfcFolderSettings.folder);
|
||||
myFolder = &nfcTag->nfcFolderSettings;
|
||||
Serial.println( myFolder->folder);
|
||||
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void writeCard(nfcTagObject nfcTag) {
|
||||
MFRC522::PICC_Type mifareType;
|
||||
byte buffer[16] = {0x13, 0x37, 0xb3, 0x47, // 0x1337 0xb347 magic cookie to
|
||||
@@ -1249,3 +1704,13 @@ void dump_byte_array(byte * buffer, byte bufferSize) {
|
||||
Serial.print(buffer[i], HEX);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////// Check Bytes ///////////////////////////////////
|
||||
bool checkTwo ( uint8_t a[], uint8_t b[] ) {
|
||||
for ( uint8_t k = 0; k < 4; k++ ) { // Loop 4 times
|
||||
if ( a[k] != b[k] ) { // IF a != b then false, because: one fails, all fail
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@@ -1,3 +1,11 @@
|
||||
advert/0300_freeze_into.mp3|Wir spielen jetzt den Stopptanz. Wenn die Musik stoppt, bleibe stehen!
|
||||
advert/0301_freeze_freeze1.mp3|Und Stopp!
|
||||
advert/0301_freeze_freeze2.mp3|Nicht bewegen!
|
||||
advert/0301_freeze_freeze3.mp3|weiter geht´s!
|
||||
advert/0302_sleep.mp3|Schlummerfunktion aktiviert.
|
||||
advert/0303_locked.mp3|TonUINO ist nun gesperrt.
|
||||
advert/0304_buttonslocked.mp3|Tasten sind nun gesperrt.
|
||||
advert/0305_kindergarden.mp3|KiTa-Modus aktiviert.
|
||||
mp3/0300_new_tag.mp3|Oh, eine neue Karte!
|
||||
mp3/0301_select_folder.mp3|Verwende die Lautstärketasten um einen Ordner für die Karte auszuwählen. Drücke die Pausetaste um fortzufahren.
|
||||
mp3/0310.mp3|OK, wähle nun mit den Lautstärketasten den Wiedergabemodus aus.
|
||||
@@ -19,18 +27,19 @@ mp3/0322_select_last_file.mp3|Wähle nun bitte die Enddatei mit den Lautstärket
|
||||
mp3/0400_ok.mp3|OK. Ich habe die Karte konfiguriert.
|
||||
mp3/0401_error.mp3|Oh weh! Das hat leider nicht geklappt!
|
||||
mp3/0802_reset_aborted.mp3|OK, ich habe den Vorgang abgebrochen.
|
||||
mp3/0900_admin.mp3|Willkommen im Admin Menü. Bitte wähle eine Funktion mit den Lautstärketasten aus und bestätige sie mit der Pausetaste!
|
||||
mp3/0900_admin.mp3|Willkommen im Admin Menü. Bitte wähle eine Funktion mit den Lautstärketasten aus und bestätige sie mit der Pausetaste! Durch einen langen Druck auf die Pausetaste kannst du den Vorgang abbrechen.
|
||||
mp3/0901_card_reset.mp3|Eine Karte neu konfigurieren.
|
||||
mp3/0902_max_volume.mp3|Maximale Lautstärke festlegen.
|
||||
mp3/0903_min_volume.mp3|Minimale Lautstärke festlegen.
|
||||
mp3/0904_init_volume.mp3|Lautstärke beim Start festlegen.
|
||||
mp3/0905_eq.mp3|EQ konfigurieren.
|
||||
mp3/0906_mastercard.mp3|Eine Masterkarte erstellen. Mit der Masterkarte kann deine Box gesperrt und wieder entsperrt werden.
|
||||
mp3/0906_modifiers.mp3|Eine Modifikationskarte erstellen. Diese Karten werden nach den eigentlichen Musikkarten aufgelegt und ändern das Verhalten deines TonUINOs.
|
||||
mp3/0907_shortcut.mp3|Tasten mit einem Shortcut konfigurieren. Ein Shortcut wird über einen langen Tastendruck gestartet und funktioniert nur, wenn gerade nichts abgespielt wird.
|
||||
mp3/0908_standbytimer.mp3|Den Timer konfigurieren.
|
||||
mp3/0909_batch_cards.mp3|Einzelkarten für einen Ordner erstellen.
|
||||
mp3/0910_switch_volume.mp3|Funktion der Lautstärketasten umdrehen.
|
||||
mp3/0911_reset.mp3|Alle Einstellungen löschen.
|
||||
mp3/0912_admin_lock.mp3|Das Adminmenü absichern.
|
||||
mp3/0920_eq_intro.mp3|Bitte wähle eine Einstellung für den EQ mit den Lautstärketasten aus und bestätige sie mit der Pausetaste.
|
||||
mp3/0921_normal.mp3|Normal
|
||||
mp3/0922_pop.mp3|Pop
|
||||
@@ -56,4 +65,19 @@ mp3/0962_timer_15.mp3|15 Minuten.
|
||||
mp3/0963_timer_30.mp3|30 Minuten.
|
||||
mp3/0964_timer_60.mp3|60 Minuten.
|
||||
mp3/0965_timer_disabled.mp3|nicht automatisch abschalten
|
||||
mp3/0970_modifier_Intro.mp3|
|
||||
mp3/0971_modifier_SleepTimer.mp3|Schlummermodus
|
||||
mp3/0972_modifier_FreezeDance.mp3|Stopptanz - TonUINO spielt Stopptanz mit dir und hält zufällig für dich die Wiedergabe kurz an.
|
||||
mp3/0973_modifier_Locked.mp3|TonUINO Sperren
|
||||
mp3/0974_modifier_Toddler.mp3|Krabbler-Modus - Alle Tasten vom TonUINO werden für die ganz Kleinen gesperrt. Karten funktionieren weiterhin.
|
||||
mp3/0975_modifier_KinderGarden.mp3|KiTa-Modus - Damit es keinen Streit mehr gibt werden neue Karten nicht sofort gespielt sondern erst nachdem das aktuelle Lied vorbei ist. Die Vor- und Zurücktasten sind gesperrt.
|
||||
mp3/0980_admin_lock_intro.mp3|Wähle bitte aus ob und wie das Adminmenü geschützt werden soll.
|
||||
mp3/0981_admin_lock_disabled.mp3|Kein Schutz - das Adminmenü kann jederzeit durch drücken von allen drei Tasten aktiviert werden.
|
||||
mp3/0982_admin_lock_card.mp3|Nur Adminkarte - das Adminmenü kann nur mit einer Adminkarte geöffnet werden. Eine neue Adminkarte kann jederzeit angelernt werden.
|
||||
mp3/0983_admin_lock_pin.mp3|Codeeingabe - das Adminmenü wird durch eine vierstellige Pin geschützt. Wenn du diese Option auswählst musst du als nächstes die Pin festlegen.
|
||||
mp3/0984_admin_lock_calc.mp3|Rechenaufgabe - das Adminmenü kann nur durch Lösen einer Rechenaufgabe betreten werden.
|
||||
mp3/0991_admin_pin.mp3|Bitte gebe die Pin ein.
|
||||
mp3/0992_admin_calc.mp3|Wieviel ist
|
||||
mp3/0993_admin_calc.mp3|plus
|
||||
mp3/0994_admin_calc.mp3|minus
|
||||
mp3/0999_reset_ok.mp3|Reset wurde durchgeführt!
|
||||
|
Reference in New Issue
Block a user