mirror of
https://github.com/xfjx/TonUINO.git
synced 2025-08-22 23:15:04 +02:00
Update Beta
This commit is contained in:
517
Tonuino.ino
517
Tonuino.ino
@@ -60,6 +60,8 @@ struct adminSettings {
|
|||||||
long standbyTimer;
|
long standbyTimer;
|
||||||
bool invertVolumeButtons;
|
bool invertVolumeButtons;
|
||||||
folderSettings shortCuts[4];
|
folderSettings shortCuts[4];
|
||||||
|
uint8_t adminMenuLocked;
|
||||||
|
uint8_t adminMenuPin[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
adminSettings mySettings;
|
adminSettings mySettings;
|
||||||
@@ -71,6 +73,10 @@ static void nextTrack(uint16_t track);
|
|||||||
uint8_t voiceMenu(int numberOfOptions, int startMessage, int messageOffset,
|
uint8_t voiceMenu(int numberOfOptions, int startMessage, int messageOffset,
|
||||||
bool preview = false, int previewFromFolder = 0, int defaultValue = 0, bool exitWithLongPress = false);
|
bool preview = false, int previewFromFolder = 0, int defaultValue = 0, bool exitWithLongPress = false);
|
||||||
bool isPlaying();
|
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;
|
bool knownCard = false;
|
||||||
|
|
||||||
// implement a notification class,
|
// implement a notification class,
|
||||||
@@ -118,10 +124,10 @@ void shuffleQueue() {
|
|||||||
queue[i] = queue[j];
|
queue[i] = queue[j];
|
||||||
queue[j] = t;
|
queue[j] = t;
|
||||||
}
|
}
|
||||||
Serial.println(F("Queue :"));
|
/* Serial.println(F("Queue :"));
|
||||||
for (uint8_t x = 0; x < numTracksInFolder - firstTrack + 1 ; x++)
|
for (uint8_t x = 0; x < numTracksInFolder - firstTrack + 1 ; x++)
|
||||||
Serial.println(queue[x]);
|
Serial.println(queue[x]);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeSettingsToFlash() {
|
void writeSettingsToFlash() {
|
||||||
@@ -133,7 +139,7 @@ void writeSettingsToFlash() {
|
|||||||
void resetSettings() {
|
void resetSettings() {
|
||||||
Serial.println(F("=== resetSettings()"));
|
Serial.println(F("=== resetSettings()"));
|
||||||
mySettings.cookie = cardCookie;
|
mySettings.cookie = cardCookie;
|
||||||
mySettings.version = 1;
|
mySettings.version = 2;
|
||||||
mySettings.maxVolume = 25;
|
mySettings.maxVolume = 25;
|
||||||
mySettings.minVolume = 5;
|
mySettings.minVolume = 5;
|
||||||
mySettings.initVolume = 15;
|
mySettings.initVolume = 15;
|
||||||
@@ -145,11 +151,27 @@ void resetSettings() {
|
|||||||
mySettings.shortCuts[1].folder = 0;
|
mySettings.shortCuts[1].folder = 0;
|
||||||
mySettings.shortCuts[2].folder = 0;
|
mySettings.shortCuts[2].folder = 0;
|
||||||
mySettings.shortCuts[3].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();
|
writeSettingsToFlash();
|
||||||
}
|
}
|
||||||
|
|
||||||
void migradeSettings(int oldVersion) {
|
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() {
|
void loadSettingsFromFlash() {
|
||||||
@@ -183,15 +205,276 @@ void loadSettingsFromFlash() {
|
|||||||
|
|
||||||
Serial.print(F("Inverted Volume Buttons: "));
|
Serial.print(F("Inverted Volume Buttons: "));
|
||||||
Serial.println(mySettings.invertVolumeButtons);
|
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
|
// Leider kann das Modul selbst keine Queue abspielen, daher müssen wir selbst die Queue verwalten
|
||||||
static uint16_t _lastTrackFinished;
|
static uint16_t _lastTrackFinished;
|
||||||
static void nextTrack(uint16_t track) {
|
static void nextTrack(uint16_t track) {
|
||||||
|
Serial.println(F("=== nextTrack()"));
|
||||||
if (track == _lastTrackFinished) {
|
if (track == _lastTrackFinished) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Serial.println(F("=== nextTrack()"));
|
|
||||||
_lastTrackFinished = track;
|
_lastTrackFinished = track;
|
||||||
|
|
||||||
if (knownCard == false)
|
if (knownCard == false)
|
||||||
@@ -199,6 +482,10 @@ static void nextTrack(uint16_t track) {
|
|||||||
// verarbeitet werden
|
// verarbeitet werden
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (activeModifier != NULL)
|
||||||
|
if (activeModifier->handleNext() == true)
|
||||||
|
return;
|
||||||
|
|
||||||
if (myFolder->mode == 1 || myFolder->mode == 7) {
|
if (myFolder->mode == 1 || myFolder->mode == 7) {
|
||||||
Serial.println(F("Hörspielmodus ist aktiv -> keinen neuen Track spielen"));
|
Serial.println(F("Hörspielmodus ist aktiv -> keinen neuen Track spielen"));
|
||||||
setstandbyTimer();
|
setstandbyTimer();
|
||||||
@@ -371,7 +658,6 @@ void checkStandbyAtMillis() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool isPlaying() {
|
bool isPlaying() {
|
||||||
return !digitalRead(busyPin);
|
return !digitalRead(busyPin);
|
||||||
}
|
}
|
||||||
@@ -440,7 +726,7 @@ void setup() {
|
|||||||
pinMode(shutdownPin, OUTPUT);
|
pinMode(shutdownPin, OUTPUT);
|
||||||
digitalWrite(shutdownPin, LOW);
|
digitalWrite(shutdownPin, LOW);
|
||||||
|
|
||||||
/* // RESET --- ALLE DREI KNÖPFE BEIM STARTEN GEDRÜCKT HALTEN -> alle EINSTELLUNGEN werden gelöscht
|
// RESET --- ALLE DREI KNÖPFE BEIM STARTEN GEDRÜCKT HALTEN -> alle EINSTELLUNGEN werden gelöscht
|
||||||
if (digitalRead(buttonPause) == LOW && digitalRead(buttonUp) == LOW &&
|
if (digitalRead(buttonPause) == LOW && digitalRead(buttonUp) == LOW &&
|
||||||
digitalRead(buttonDown) == LOW) {
|
digitalRead(buttonDown) == LOW) {
|
||||||
Serial.println(F("Reset -> EEPROM wird gelöscht"));
|
Serial.println(F("Reset -> EEPROM wird gelöscht"));
|
||||||
@@ -448,7 +734,7 @@ void setup() {
|
|||||||
EEPROM.update(i, 0);
|
EEPROM.update(i, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
// Start Shortcut "at Startup" - e.g. Welcome Sound
|
// Start Shortcut "at Startup" - e.g. Welcome Sound
|
||||||
playShortCut(3);
|
playShortCut(3);
|
||||||
}
|
}
|
||||||
@@ -464,6 +750,10 @@ void readButtons() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void volumeUpButton() {
|
void volumeUpButton() {
|
||||||
|
if (activeModifier != NULL)
|
||||||
|
if (activeModifier->handleVolumeUp() == true)
|
||||||
|
return;
|
||||||
|
|
||||||
Serial.println(F("=== volumeUp()"));
|
Serial.println(F("=== volumeUp()"));
|
||||||
if (volume < mySettings.maxVolume) {
|
if (volume < mySettings.maxVolume) {
|
||||||
mp3.increaseVolume();
|
mp3.increaseVolume();
|
||||||
@@ -473,6 +763,10 @@ void volumeUpButton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void volumeDownButton() {
|
void volumeDownButton() {
|
||||||
|
if (activeModifier != NULL)
|
||||||
|
if (activeModifier->handleVolumeDown() == true)
|
||||||
|
return;
|
||||||
|
|
||||||
Serial.println(F("=== volumeDown()"));
|
Serial.println(F("=== volumeDown()"));
|
||||||
if (volume > mySettings.minVolume) {
|
if (volume > mySettings.minVolume) {
|
||||||
mp3.decreaseVolume();
|
mp3.decreaseVolume();
|
||||||
@@ -482,16 +776,25 @@ void volumeDownButton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void nextButton() {
|
void nextButton() {
|
||||||
|
if (activeModifier != NULL)
|
||||||
|
if (activeModifier->handleNextButton() == true)
|
||||||
|
return;
|
||||||
|
|
||||||
nextTrack(random(65536));
|
nextTrack(random(65536));
|
||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void previousButton() {
|
void previousButton() {
|
||||||
|
if (activeModifier != NULL)
|
||||||
|
if (activeModifier->handlePreviousButton() == true)
|
||||||
|
return;
|
||||||
|
|
||||||
previousTrack();
|
previousTrack();
|
||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void playFolder() {
|
void playFolder() {
|
||||||
|
Serial.println(F("== playFolder()")) ;
|
||||||
disablestandbyTimer();
|
disablestandbyTimer();
|
||||||
randomSeed(millis() + random(1000));
|
randomSeed(millis() + random(1000));
|
||||||
knownCard = true;
|
knownCard = true;
|
||||||
@@ -592,6 +895,12 @@ void loop() {
|
|||||||
do {
|
do {
|
||||||
checkStandbyAtMillis();
|
checkStandbyAtMillis();
|
||||||
mp3.loop();
|
mp3.loop();
|
||||||
|
|
||||||
|
// Modifier : WIP!
|
||||||
|
if (activeModifier != NULL) {
|
||||||
|
activeModifier->loop();
|
||||||
|
}
|
||||||
|
|
||||||
// Buttons werden nun über JS_Button gehandelt, dadurch kann jede Taste
|
// Buttons werden nun über JS_Button gehandelt, dadurch kann jede Taste
|
||||||
// doppelt belegt werden
|
// doppelt belegt werden
|
||||||
readButtons();
|
readButtons();
|
||||||
@@ -608,6 +917,9 @@ void loop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pauseButton.wasReleased()) {
|
if (pauseButton.wasReleased()) {
|
||||||
|
if (activeModifier != NULL)
|
||||||
|
if (activeModifier->handlePause() == true)
|
||||||
|
return;
|
||||||
if (ignorePauseButton == false)
|
if (ignorePauseButton == false)
|
||||||
if (isPlaying()) {
|
if (isPlaying()) {
|
||||||
mp3.pause();
|
mp3.pause();
|
||||||
@@ -620,6 +932,9 @@ void loop() {
|
|||||||
ignorePauseButton = false;
|
ignorePauseButton = false;
|
||||||
} else if (pauseButton.pressedFor(LONG_PRESS) &&
|
} else if (pauseButton.pressedFor(LONG_PRESS) &&
|
||||||
ignorePauseButton == false) {
|
ignorePauseButton == false) {
|
||||||
|
if (activeModifier != NULL)
|
||||||
|
if (activeModifier->handlePause() == true)
|
||||||
|
return;
|
||||||
if (isPlaying()) {
|
if (isPlaying()) {
|
||||||
uint8_t advertTrack;
|
uint8_t advertTrack;
|
||||||
if (myFolder->mode == 3 || myFolder->mode == 9) {
|
if (myFolder->mode == 3 || myFolder->mode == 9) {
|
||||||
@@ -731,12 +1046,12 @@ void loop() {
|
|||||||
if (readCard(&myCard) == true) {
|
if (readCard(&myCard) == true) {
|
||||||
// make random a little bit more "random"
|
// make random a little bit more "random"
|
||||||
randomSeed(millis() + random(1000));
|
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();
|
playFolder();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Neue Karte konfigurieren
|
// Neue Karte konfigurieren
|
||||||
else {
|
else if (myCard.cookie != cardCookie) {
|
||||||
knownCard = false;
|
knownCard = false;
|
||||||
mp3.playMp3FolderTrack(300);
|
mp3.playMp3FolderTrack(300);
|
||||||
waitForTrackToFinish();
|
waitForTrackToFinish();
|
||||||
@@ -747,13 +1062,59 @@ void loop() {
|
|||||||
mfrc522.PCD_StopCrypto1();
|
mfrc522.PCD_StopCrypto1();
|
||||||
}
|
}
|
||||||
|
|
||||||
void adminMenu() {
|
void adminMenu(bool fromCard = false) {
|
||||||
disablestandbyTimer();
|
disablestandbyTimer();
|
||||||
mp3.pause();
|
mp3.pause();
|
||||||
Serial.println(F("=== adminMenu()"));
|
Serial.println(F("=== adminMenu()"));
|
||||||
knownCard = false;
|
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)
|
if (subMenu == 0)
|
||||||
return;
|
return;
|
||||||
if (subMenu == 1) {
|
if (subMenu == 1) {
|
||||||
@@ -779,7 +1140,43 @@ void adminMenu() {
|
|||||||
mp3.setEq(mySettings.eq - 1);
|
mp3.setEq(mySettings.eq - 1);
|
||||||
}
|
}
|
||||||
else if (subMenu == 6) {
|
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) {
|
else if (subMenu == 7) {
|
||||||
uint8_t shortcut = voiceMenu(4, 940, 940);
|
uint8_t shortcut = voiceMenu(4, 940, 940);
|
||||||
@@ -825,8 +1222,7 @@ void adminMenu() {
|
|||||||
} while (!mfrc522.PICC_IsNewCardPresent());
|
} while (!mfrc522.PICC_IsNewCardPresent());
|
||||||
|
|
||||||
// RFID Karte wurde aufgelegt
|
// RFID Karte wurde aufgelegt
|
||||||
if (!mfrc522.PICC_ReadCardSerial())
|
if (mfrc522.PICC_ReadCardSerial()) {
|
||||||
return;
|
|
||||||
Serial.println(F("schreibe Karte..."));
|
Serial.println(F("schreibe Karte..."));
|
||||||
writeCard(tempCard);
|
writeCard(tempCard);
|
||||||
delay(100);
|
delay(100);
|
||||||
@@ -835,6 +1231,7 @@ void adminMenu() {
|
|||||||
waitForTrackToFinish();
|
waitForTrackToFinish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (subMenu == 10) {
|
else if (subMenu == 10) {
|
||||||
// Invert Functions for Up/Down Buttons
|
// Invert Functions for Up/Down Buttons
|
||||||
int temp = voiceMenu(2, 933, 933, false);
|
int temp = voiceMenu(2, 933, 933, false);
|
||||||
@@ -853,13 +1250,35 @@ void adminMenu() {
|
|||||||
resetSettings();
|
resetSettings();
|
||||||
mp3.playMp3FolderTrack(999);
|
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();
|
writeSettingsToFlash();
|
||||||
setstandbyTimer();
|
setstandbyTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool askCode(uint8_t *code) {
|
bool askCode(uint8_t *code) {
|
||||||
uint8_t x = 0;
|
uint8_t x = 0;
|
||||||
while (x < 3) {
|
while (x < 4) {
|
||||||
readButtons();
|
readButtons();
|
||||||
if (pauseButton.pressedFor(LONG_PRESS))
|
if (pauseButton.pressedFor(LONG_PRESS))
|
||||||
break;
|
break;
|
||||||
@@ -1009,9 +1428,11 @@ void setupFolder(folderSettings * theFolder) {
|
|||||||
theFolder->special = voiceMenu(mp3.getFolderTrackCount(theFolder->folder), 320, 0,
|
theFolder->special = voiceMenu(mp3.getFolderTrackCount(theFolder->folder), 320, 0,
|
||||||
true, theFolder->folder);
|
true, theFolder->folder);
|
||||||
// Admin Funktionen
|
// Admin Funktionen
|
||||||
if (theFolder->mode == 6)
|
if (theFolder->mode == 6) {
|
||||||
theFolder->special = voiceMenu(3, 320, 320);
|
//theFolder->special = voiceMenu(3, 320, 320);
|
||||||
|
theFolder->folder = 0;
|
||||||
|
theFolder->mode = 0;
|
||||||
|
}
|
||||||
// Spezialmodus Von-Bis
|
// Spezialmodus Von-Bis
|
||||||
if (theFolder->mode == 7 || theFolder->mode == 8 || theFolder->mode == 9) {
|
if (theFolder->mode == 7 || theFolder->mode == 8 || theFolder->mode == 9) {
|
||||||
theFolder->special = voiceMenu(mp3.getFolderTrackCount(theFolder->folder), 321, 0,
|
theFolder->special = voiceMenu(mp3.getFolderTrackCount(theFolder->folder), 321, 0,
|
||||||
@@ -1033,6 +1454,7 @@ void setupCard() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool readCard(nfcTagObject * nfcTag) {
|
bool readCard(nfcTagObject * nfcTag) {
|
||||||
|
nfcTagObject tempCard;
|
||||||
// Show some details of the PICC (that is: the tag/card)
|
// Show some details of the PICC (that is: the tag/card)
|
||||||
Serial.print(F("Card UID:"));
|
Serial.print(F("Card UID:"));
|
||||||
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
|
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 )
|
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
|
// Authenticate using key A
|
||||||
Serial.println(F("Authenticating MIFARE UL..."));
|
Serial.println(F("Authenticating MIFARE UL..."));
|
||||||
@@ -1138,18 +1560,51 @@ bool readCard(nfcTagObject * nfcTag) {
|
|||||||
tempCookie += (uint32_t)buffer[2] << 8;
|
tempCookie += (uint32_t)buffer[2] << 8;
|
||||||
tempCookie += (uint32_t)buffer[3];
|
tempCookie += (uint32_t)buffer[3];
|
||||||
|
|
||||||
nfcTag->cookie = tempCookie;
|
tempCard.cookie = tempCookie;
|
||||||
nfcTag->version = buffer[4];
|
tempCard.version = buffer[4];
|
||||||
nfcTag->nfcFolderSettings.folder = buffer[5];
|
tempCard.nfcFolderSettings.folder = buffer[5];
|
||||||
nfcTag->nfcFolderSettings.mode = buffer[6];
|
tempCard.nfcFolderSettings.mode = buffer[6];
|
||||||
nfcTag->nfcFolderSettings.special = buffer[7];
|
tempCard.nfcFolderSettings.special = buffer[7];
|
||||||
nfcTag->nfcFolderSettings.special2 = buffer[8];
|
tempCard.nfcFolderSettings.special2 = buffer[8];
|
||||||
|
|
||||||
|
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;
|
myFolder = &nfcTag->nfcFolderSettings;
|
||||||
|
Serial.println( myFolder->folder);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void writeCard(nfcTagObject nfcTag) {
|
void writeCard(nfcTagObject nfcTag) {
|
||||||
MFRC522::PICC_Type mifareType;
|
MFRC522::PICC_Type mifareType;
|
||||||
byte buffer[16] = {0x13, 0x37, 0xb3, 0x47, // 0x1337 0xb347 magic cookie to
|
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);
|
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/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/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.
|
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/0400_ok.mp3|OK. Ich habe die Karte konfiguriert.
|
||||||
mp3/0401_error.mp3|Oh weh! Das hat leider nicht geklappt!
|
mp3/0401_error.mp3|Oh weh! Das hat leider nicht geklappt!
|
||||||
mp3/0802_reset_aborted.mp3|OK, ich habe den Vorgang abgebrochen.
|
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/0901_card_reset.mp3|Eine Karte neu konfigurieren.
|
||||||
mp3/0902_max_volume.mp3|Maximale Lautstärke festlegen.
|
mp3/0902_max_volume.mp3|Maximale Lautstärke festlegen.
|
||||||
mp3/0903_min_volume.mp3|Minimale Lautstärke festlegen.
|
mp3/0903_min_volume.mp3|Minimale Lautstärke festlegen.
|
||||||
mp3/0904_init_volume.mp3|Lautstärke beim Start festlegen.
|
mp3/0904_init_volume.mp3|Lautstärke beim Start festlegen.
|
||||||
mp3/0905_eq.mp3|EQ konfigurieren.
|
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/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/0908_standbytimer.mp3|Den Timer konfigurieren.
|
||||||
mp3/0909_batch_cards.mp3|Einzelkarten für einen Ordner erstellen.
|
mp3/0909_batch_cards.mp3|Einzelkarten für einen Ordner erstellen.
|
||||||
mp3/0910_switch_volume.mp3|Funktion der Lautstärketasten umdrehen.
|
mp3/0910_switch_volume.mp3|Funktion der Lautstärketasten umdrehen.
|
||||||
mp3/0911_reset.mp3|Alle Einstellungen löschen.
|
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/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/0921_normal.mp3|Normal
|
||||||
mp3/0922_pop.mp3|Pop
|
mp3/0922_pop.mp3|Pop
|
||||||
@@ -56,4 +65,19 @@ mp3/0962_timer_15.mp3|15 Minuten.
|
|||||||
mp3/0963_timer_30.mp3|30 Minuten.
|
mp3/0963_timer_30.mp3|30 Minuten.
|
||||||
mp3/0964_timer_60.mp3|60 Minuten.
|
mp3/0964_timer_60.mp3|60 Minuten.
|
||||||
mp3/0965_timer_disabled.mp3|nicht automatisch abschalten
|
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!
|
mp3/0999_reset_ok.mp3|Reset wurde durchgeführt!
|
||||||
|
Reference in New Issue
Block a user