1
0
mirror of https://github.com/xfjx/TonUINO.git synced 2025-08-23 01:02:58 +02:00

Update Beta

This commit is contained in:
Thorsten Voß
2019-04-14 00:13:44 +02:00
parent 5cfbb5bfad
commit e4c3193508
2 changed files with 532 additions and 43 deletions

View File

@@ -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;
}

View File

@@ -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!