diff --git a/README.md b/README.md index 5769075..2c86588 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,9 @@ Die SD Karte (Ordner mp3 und advert) hat sich gegenüber der Version 3.1.11 geä # Change Log +## Version 3.2.1 (22.09.2024) +- [Issue 236](https://github.com/tonuino/TonUINO-TNG/issues/236): Improve hardware diagnostic on startup + ## Version 3.2.0 (05.09.2024) - [Issue 231](https://github.com/tonuino/TonUINO-TNG/issues/231): Fix logging of card data (bad order) - [Issue 229](https://github.com/tonuino/TonUINO-TNG/issues/229): playAdvertisement does not work for some DF Player diff --git a/TonUINO-TNG.ino b/TonUINO-TNG.ino index 747a555..d4676c7 100644 --- a/TonUINO-TNG.ino +++ b/TonUINO-TNG.ino @@ -35,7 +35,7 @@ void setup() LOG(init_log, s_error, F("TonUINO Version 3.1 - refactored by Boerge1\n")); LOG(init_log, s_error, F("created by Thorsten Voß and licensed under GNU/GPL.")); LOG(init_log, s_error, F("Information and contribution at https://tonuino.de.\n")); - LOG(init_log, s_error, F("V3.2.0 05.09.24\n")); + LOG(init_log, s_error, F("V3.2.1 22.09.24\n")); #ifdef TonUINO_Classic LOG(init_log, s_error, F("C "), lf_no); diff --git a/src/chip_card.cpp b/src/chip_card.cpp index b7a486a..ef56cd7 100644 --- a/src/chip_card.cpp +++ b/src/chip_card.cpp @@ -238,7 +238,12 @@ void Chip_card::sleepCard() { void Chip_card::initCard() { SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 - LOG(card_log, s_info, F("MFRC522:"), mfrc522.PCD_ReadRegister(MFRC522::VersionReg)); + LOG_CODE(card_log, s_debug, { + if (not mfrc522.PCD_PerformSelfTest()) + LOG(card_log, s_debug, F("mfrc522 self test not successful")); + }); + byte ver = mfrc522.PCD_ReadRegister(MFRC522::VersionReg); + LOG(card_log, s_info, F("MFRC522:"), ver); // Show MFRC522 Card Reader version // 0 or 255: communication error) // 136: (clone) @@ -247,6 +252,8 @@ void Chip_card::initCard() { // 146: v2.0 // 18: counterfeit chip // else: unknown + if ((ver == 0) || (ver == 255)) + LOG(card_log, s_error, F("com to mfrc broken")); } void Chip_card::stopCard() { @@ -271,7 +278,7 @@ cardEvent Chip_card::getCardEvent() { if (cardRemovedSwitch.on()) { if (not cardRemoved) { - LOG(card_log, s_info, F("Card Removed")); + LOG(card_log, s_info, F("Card Rem")); cardRemoved = true; stopCard(); return cardEvent::removed; @@ -279,7 +286,7 @@ cardEvent Chip_card::getCardEvent() { } else { if (cardRemoved) { - LOG(card_log, s_info, F("Card Inserted")); + LOG(card_log, s_info, F("Card Ins")); cardRemoved = false; return cardEvent::inserted; } diff --git a/src/commands.cpp b/src/commands.cpp index 4e40d5b..f5bfe66 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -78,11 +78,67 @@ command Commands::getCommand(commandRaw b, state_for_command s) { } if (ret != command::none) { - LOG(button_log, s_info, F("Command: "), static_cast(ret)); +#ifdef ALLinONE + LOG(button_log, s_debug, F("btn/cmd: "), static_cast(b), F("/"), static_cast(ret)); +#else + LOG(button_log, s_info , F("btn/cmd: "), getCommandRawStr(b), F("/"), getCommandStr(ret)); +#endif } return ret; } +const __FlashStringHelper* Commands::getCommandRawStr(commandRaw cmd) { + switch(cmd) { + case commandRaw::none : return(F("none" )); break; + case commandRaw::start : return(F("start" )); break; + case commandRaw::allLong : return(F("allLong" )); break; + case commandRaw::pause : return(F("pause" )); break; + case commandRaw::pauseLong : return(F("pauseLong" )); break; + case commandRaw::up : return(F("up" )); break; + case commandRaw::upLong : return(F("upLong" )); break; + case commandRaw::upLongRepeat : return(F("upLongRepeat" )); break; + case commandRaw::down : return(F("down" )); break; + case commandRaw::downLong : return(F("downLong" )); break; + case commandRaw::downLongRepeat: return(F("downLongRepeat")); break; + case commandRaw::updownLong : return(F("updownLong" )); break; +#ifdef FIVEBUTTONS + case commandRaw::four : return(F("four" )); break; + case commandRaw::fourLong : return(F("fourLong" )); break; + case commandRaw::fourLongRepeat: return(F("fourLongRepeat")); break; + case commandRaw::five : return(F("five" )); break; + case commandRaw::fiveLong : return(F("fiveLong" )); break; + case commandRaw::fiveLongRepeat: return(F("fiveLongRepeat")); break; +#endif + default : return(F("" )); break; + } +} + +const __FlashStringHelper* Commands::getCommandStr (command cmd) { + switch(cmd) { + case command::none : return(F("none" )); break; + case command::admin : return(F("admin" )); break; + case command::shutdown : return(F("shutdown" )); break; + case command::shortcut1 : return(F("shortcut1" )); break; + case command::shortcut2 : return(F("shortcut2" )); break; + case command::shortcut3 : return(F("shortcut3" )); break; + case command::start : return(F("start" )); break; + case command::pause : return(F("pause" )); break; + case command::track : return(F("track" )); break; + case command::volume_up : return(F("volume_up" )); break; + case command::volume_down: return(F("volume_down")); break; + case command::bright_up : return(F("bright_up" )); break; + case command::bright_down: return(F("bright_down")); break; + case command::to_first : return(F("to_first" )); break; + case command::next : return(F("next" )); break; + case command::next10 : return(F("next10" )); break; + case command::previous : return(F("previous" )); break; + case command::previous10 : return(F("previous10" )); break; + case command::select : return(F("select" )); break; + default : return(F("" )); break; + } +} + + uint8_t Commands::getButtonCode(commandRaw b) { switch (b) { case commandRaw::pause: return 1; diff --git a/src/commands.hpp b/src/commands.hpp index 56fd70b..cd00b74 100644 --- a/src/commands.hpp +++ b/src/commands.hpp @@ -41,33 +41,33 @@ fiveLong prev 10 vol-- cont. */ enum class commandRaw: uint8_t { - none, - start, - allLong, - pause, - pauseLong, - up, - upLong, - upLongRepeat, - down, - downLong, - downLongRepeat, - updownLong, + none = 0, + start = 1, + allLong = 2, + pause = 3, + pauseLong = 4, + up = 5, + upLong = 6, + upLongRepeat = 7, + down = 8, + downLong = 9, + downLongRepeat = 10, + updownLong = 11, #ifdef FIVEBUTTONS - four, - fourLong, - fourLongRepeat, - five, - fiveLong, - fiveLongRepeat, + four = 12, + fourLong = 13, + fourLongRepeat = 14, + five = 15, + fiveLong = 16, + fiveLongRepeat = 17, #endif #ifdef SPECIAL_START_SHORTCUT - specialStart, + specialStart = 18, #endif #ifdef SerialInputAsCommand - menu_jump, + menu_jump = 19, #endif - cmd_end, + cmd_end = 20, #ifdef BUTTONS3X3 ext_begin = buttonExtSC_begin, ext_end = ext_begin + buttonExtSC_buttons, @@ -75,32 +75,32 @@ enum class commandRaw: uint8_t { }; enum class command: uint8_t { - none, + none = 0, // play/pause/idle - admin, - shutdown, - shortcut1, - shortcut2, - shortcut3, - start, - pause, - track, - volume_up, - volume_down, - bright_up, - bright_down, - to_first, + admin = 1, + shutdown = 2, + shortcut1 = 3, + shortcut2 = 4, + shortcut3 = 5, + start = 6, + pause = 7, + track = 8, + volume_up = 9, + volume_down = 10, + bright_up = 11, + bright_down = 12, + to_first = 13, // play/pause/idle/adm - next, - next10, - previous, - previous10, + next = 14, + next10 = 15, + previous = 16, + previous10 = 17, // adm - select, + select = 18, #ifdef SerialInputAsCommand - menu_jump, + menu_jump = 19, #endif - adm_end, + adm_end = 20, #ifdef BUTTONS3X3 ext_begin = buttonExtSC_begin, ext_end = ext_begin + buttonExtSC_buttons, @@ -131,6 +131,9 @@ class Commands { commandRaw getCommandRaw(); command getCommand (commandRaw b, state_for_command s); + const __FlashStringHelper* getCommandRawStr(commandRaw cmd); + const __FlashStringHelper* getCommandStr (command cmd); + static bool isSelect(command cmd) { return cmd == command::select #ifdef SerialInputAsCommand diff --git a/src/constants.hpp b/src/constants.hpp index 1ca8cb0..e2161be 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -389,7 +389,7 @@ inline constexpr levelType dfPlayer_busyPinType = levelType::activeHigh; #if defined(DFMiniMp3_T_CHIP_MH2024K24SS_MP3_TF_16P_V3_0) inline constexpr unsigned long dfPlayer_timeUntilStarts = 2500; #elif defined(DFMiniMp3_T_CHIP_GD3200B) -inline constexpr unsigned long dfPlayer_timeUntilStarts = 1500; +inline constexpr unsigned long dfPlayer_timeUntilStarts = 2500; #else inline constexpr unsigned long dfPlayer_timeUntilStarts = 1200; #endif diff --git a/src/logger.hpp b/src/logger.hpp index 38f48c3..48c2002 100644 --- a/src/logger.hpp +++ b/src/logger.hpp @@ -7,11 +7,11 @@ DEFINE_LOGGER(tonuino_log , s_debug , void); DEFINE_LOGGER(init_log , s_info , tonuino_log); DEFINE_LOGGER(card_log , s_info , tonuino_log); -DEFINE_LOGGER(play_log , s_warning, tonuino_log); -DEFINE_LOGGER(standby_log , s_warning, tonuino_log); +DEFINE_LOGGER(play_log , s_info , tonuino_log); +DEFINE_LOGGER(standby_log , s_info , tonuino_log); DEFINE_LOGGER(state_log , s_info , tonuino_log); DEFINE_LOGGER(button_log , s_info , tonuino_log); -DEFINE_LOGGER(modifier_log, s_warning, tonuino_log); +DEFINE_LOGGER(modifier_log, s_info , tonuino_log); DEFINE_LOGGER(mp3_log , s_info , tonuino_log); DEFINE_LOGGER(settings_log, s_info , tonuino_log); DEFINE_LOGGER(batvol_log , s_info , tonuino_log); diff --git a/src/modifier.cpp b/src/modifier.cpp index a4b76d4..c60d883 100644 --- a/src/modifier.cpp +++ b/src/modifier.cpp @@ -19,9 +19,9 @@ const __FlashStringHelper* str_RepeatSingleModifier() { return F("RepeatSingle") void SleepTimer::loop() { if (sleepTimer.isActive() && sleepTimer.isExpired()) { - LOG(modifier_log, s_info, str_SleepTimer(), F(" -> expired")); + LOG(modifier_log, s_debug, str_SleepTimer(), F(" -> expired")); if (not stopAfterTrackFinished || stopAfterTrackFinished_active) { - LOG(modifier_log, s_info, str_SleepTimer(), F(" -> SLEEP!")); + LOG(modifier_log, s_debug, str_SleepTimer(), F(" -> SLEEP!")); if (SM_tonuino::is_in_state()) SM_tonuino::dispatch(command_e(commandRaw::pause)); fired = true; @@ -35,7 +35,7 @@ void SleepTimer::loop() { } bool SleepTimer::handleNext() { if (stopAfterTrackFinished_active) { - LOG(modifier_log, s_info, str_SleepTimer(), F(" -> SLEEP!")); + LOG(modifier_log, s_debug, str_SleepTimer(), F(" -> SLEEP!")); mp3.clearFolderQueue(); stopAfterTrackFinished_active = false; sleepTimer.stop(); @@ -46,7 +46,7 @@ bool SleepTimer::handleNext() { } void SleepTimer::init(pmode_t, uint8_t special /* is minutes*/) { - LOG(modifier_log, s_info, str_SleepTimer(), F(" minutes: "), special); + LOG(modifier_log, s_debug, str_SleepTimer(), F(" minutes: "), special); fired = false; stopAfterTrackFinished_active = false; if (special > 0x80) { @@ -76,7 +76,7 @@ bool SleepTimer::handleRFID(const folderSettings &/*newCard*/) { void DanceGame::init(pmode_t a_mode, uint8_t a_t) { - LOG(modifier_log, s_info, str_danceGame(), F("t : "), a_t); + LOG(modifier_log, s_debug, str_danceGame(), F("t : "), a_t); mode = a_mode; if (mode == pmode_t::fi_wa_ai) lastFiWaAi = random(0, 3); setNextStop(true /*addAdvTime*/); @@ -92,12 +92,12 @@ void DanceGame::loop() { if (stopTimer.isExpired()) { switch (mode) { case pmode_t::freeze_dance: - LOG(modifier_log, s_info, str_danceGame(), F(" -> FREEZE!")); + LOG(modifier_log, s_debug, str_danceGame(), F(" -> FREEZE!")); mp3.playAdvertisement(advertTracks::t_301_freeze_freeze); setNextStop(true /*addAdvTime*/); break; case pmode_t::fi_wa_ai: - LOG(modifier_log, s_info, str_danceGame(), F(" -> Action! ")); + LOG(modifier_log, s_debug, str_danceGame(), F(" -> Action! ")); lastFiWaAi = (lastFiWaAi+random(1, 3))%3; mp3.playAdvertisement(static_cast(advertTracks::t_306_fire)+lastFiWaAi); setNextStop(true /*addAdvTime*/); @@ -121,13 +121,13 @@ void DanceGame::setNextStop(bool addAdvTime) { default: break; } } - LOG(modifier_log, s_info, str_danceGame(), F(" next stop in "), seconds); + LOG(modifier_log, s_debug, str_danceGame(), F(" next stop in "), seconds); stopTimer.start(seconds * 1000); } bool KindergardenMode::handleNext() { if (cardQueued) { - LOG(modifier_log, s_info, str_KindergardenMode(), F(" -> NEXT")); + LOG(modifier_log, s_debug, str_KindergardenMode(), F(" -> NEXT")); cardQueued = false; tonuino.setMyFolder(nextCard, true /*myFolderIsCard*/); @@ -143,7 +143,7 @@ bool KindergardenMode::handleRFID(const folderSettings &newCard) { return false; if (!cardQueued) { - LOG(modifier_log, s_info, str_KindergardenMode(), F(" -> queued!")); + LOG(modifier_log, s_debug, str_KindergardenMode(), F(" -> queued!")); nextCard = newCard; cardQueued = true; } @@ -160,7 +160,7 @@ bool KindergardenMode::handleButton(command cmd) { bool RepeatSingleModifier::handleNext() { - LOG(modifier_log, s_info, str_RepeatSingleModifier(), F(" -> REPEAT")); + LOG(modifier_log, s_debug, str_RepeatSingleModifier(), F(" -> REPEAT")); mp3.loop(); // WA: this will call again Mp3Notify::OnPlayFinished() (error in DFMiniMp3 lib) // but will be blocked by lastTrackFinished Mp3Notify::ResetLastTrackFinished(); // unblock this track so that it can be repeated diff --git a/src/mp3.cpp b/src/mp3.cpp index 38754be..594dcac 100644 --- a/src/mp3.cpp +++ b/src/mp3.cpp @@ -13,7 +13,7 @@ uint16_t Mp3Notify::lastTrackFinished = 0; void Mp3Notify::OnError(DfMp3&, uint16_t errorCode) { // see DfMp3_Error for code meaning - LOG(mp3_log, s_error, F("DfPlayer Error: "), errorCode); + LOG(mp3_log, s_error, F("DfPl Err: "), errorCode); } void Mp3Notify::OnPlaySourceOnline (DfMp3&, DfMp3_PlaySources source) { PrintlnSourceAction(source, F("online" )); } void Mp3Notify::OnPlaySourceInserted(DfMp3&, DfMp3_PlaySources source) { PrintlnSourceAction(source, F("bereit" )); } @@ -25,7 +25,7 @@ void Mp3Notify::PrintlnSourceAction(DfMp3_PlaySources source, const __FlashStrin } void Mp3Notify::OnPlayFinished(DfMp3&, DfMp3_PlaySources /*source*/, uint16_t track) { - LOG(mp3_log, s_info, F("Track beendet: "), track); + LOG(mp3_log, s_info, F("Track end: "), track); if (track == lastTrackFinished) return; else @@ -62,6 +62,23 @@ Mp3::Mp3(Settings &settings) #endif } +void Mp3::init() { + spkVolume = settings.spkInitVolume; +#ifdef HPJACKDETECT + hpVolume = settings.hpInitVolume; +#endif + + begin(); + loop(); + + if (not setVolume()) + LOG(init_log, s_error, F("Com to DFPlayer broken")); + + setEq(static_cast(settings.eq - 1)); + + loop(); +} + bool Mp3::isPlaying() const { return !digitalRead(dfPlayer_busyPin); } @@ -92,7 +109,7 @@ void Mp3::playAdvertisement(uint16_t track, bool olnyIfIsPlaying) { advPlaying = true; #endif if (isPlaying()) { - LOG(mp3_log, s_debug, F("playAdvertisement: "), track); + LOG(mp3_log, s_debug, F("playAdvertisement()")); Base::playAdvertisement(track); } else if (not olnyIfIsPlaying) { @@ -107,8 +124,11 @@ void Mp3::playAdvertisement(uint16_t track, bool olnyIfIsPlaying) { LOG(mp3_log, s_debug, F("playAdvertisement: "), track); Base::playAdvertisement(track); delay(dfPlayer_timeUntilStarts); + LOG(mp3_log, s_debug, F("before waitForTrackToFinish()")); waitForTrackToFinish(); // finish adv + LOG(mp3_log, s_debug, F("before waitForTrackToStart()")); waitForTrackToStart(); // start folder track + LOG(mp3_log, s_debug, F("after waitForTrackToStart()")); delay(10); pause(); loop(); @@ -279,20 +299,22 @@ void Mp3::decreaseVolume() { logVolume(); } -void Mp3::setVolume() { - spkVolume = settings.spkInitVolume; -#ifdef HPJACKDETECT - hpVolume = settings.hpInitVolume; -#endif +bool Mp3::setVolume() { LOG(mp3_log, s_debug, F("setVolume: "), volume); - uint8_t max_loop = 20; // 4 seconds - while((--max_loop>0) && (Base::getVolume() != *volume)) { + startTrackTimer.start(6000); // 6 seconds + while(not startTrackTimer.isExpired() && (Base::getVolume() != *volume)) { + loop(); delay(100); Base::setVolume(*volume); delay(100); } - LOG(mp3_log, s_debug, F("setVolume loops: "), 20-max_loop); + if (not startTrackTimer.isActive()) { + return false; + } else { + startTrackTimer.stop(); + } logVolume(); + return true; } void Mp3::setVolume(uint8_t v) { @@ -306,9 +328,9 @@ void Mp3::logVolume() { LOG(mp3_log, s_info, F("Volume: "), *volume); } -void Mp3::loop() { - #ifdef HPJACKDETECT +void Mp3::hpjackdetect() { + level noHeadphoneJackDetect_now = getLevel(dfPlayer_noHeadphoneJackDetectType, digitalRead(dfPlayer_noHeadphoneJackDetect)); if (tempSpkOn) noHeadphoneJackDetect_now = level::active; @@ -331,8 +353,10 @@ void Mp3::loop() { Base::setVolume(*volume); logVolume(); } +} #endif +void Mp3::loop() { if (not isPause && playing != play_none && startTrackTimer.isExpired() && not isPlaying()) { if (not missingOnPlayFinishedTimer.isActive()) diff --git a/src/mp3.hpp b/src/mp3.hpp index 43f9164..139ef78 100644 --- a/src/mp3.hpp +++ b/src/mp3.hpp @@ -203,6 +203,7 @@ class Mp3: public DfMp3 { Mp3(Settings& settings); + void init(); bool isPlaying() const; void waitForTrackToFinish(); void waitForTrackToStart(); @@ -237,7 +238,7 @@ class Mp3: public DfMp3 { void increaseVolume(); void decreaseVolume(); - void setVolume (); + bool setVolume (); void setVolume (uint8_t); #ifdef NEO_RING_EXT uint8_t getVolumeRel() const { return static_cast(*volume-*minVolume)*0xff/(*maxVolume-*minVolume); } @@ -251,8 +252,9 @@ class Mp3: public DfMp3 { uint8_t& getInitVolume() { return *initVolume; } #ifdef HPJACKDETECT + void hpjackdetect (); bool isHeadphoneJackDetect() { return noHeadphoneJackDetect == level::inactive; } - void setTempSpkOn() { tempSpkOn = 2; } + void setTempSpkOn () { tempSpkOn = 2; } #endif private: diff --git a/src/state_machine.cpp b/src/state_machine.cpp index 77f9b37..c76b029 100644 --- a/src/state_machine.cpp +++ b/src/state_machine.cpp @@ -17,13 +17,13 @@ Settings &settings = tonuino.getSettings(); Chip_card &chip_card = tonuino.getChipCard(); const __FlashStringHelper* str_ChMode () { return F("ChMode") ; } -const __FlashStringHelper* str_ChFolder () { return F("ChFolder") ; } -const __FlashStringHelper* str_ChTrack () { return F("ChTrack") ; } -const __FlashStringHelper* str_ChFirstTrack () { return F("ChFirstTrack") ; } -const __FlashStringHelper* str_ChLastTrack () { return F("ChLastTrack") ; } -const __FlashStringHelper* str_ChNumAnswer () { return F("ChNumAnswer") ; } -const __FlashStringHelper* str_ChNumTracks () { return F("ChNumTracks") ; } -const __FlashStringHelper* str_WriteCard () { return F("WriteCard") ; } +const __FlashStringHelper* str_ChFolder () { return F("ChFold") ; } +const __FlashStringHelper* str_ChTrack () { return F("ChTr") ; } +const __FlashStringHelper* str_ChFirstTrack () { return F("ChFTr") ; } +const __FlashStringHelper* str_ChLastTrack () { return F("ChLTr") ; } +const __FlashStringHelper* str_ChNumAnswer () { return F("ChNumAnsw") ; } +const __FlashStringHelper* str_ChNumTracks () { return F("ChNumTr") ; } +const __FlashStringHelper* str_WriteCard () { return F("WriteC") ; } const __FlashStringHelper* str_Base () { return F("Base") ; } const __FlashStringHelper* str_Idle () { return F("Idle") ; } const __FlashStringHelper* str_StartPlay () { return F("StartPlay") ; } @@ -31,24 +31,24 @@ const __FlashStringHelper* str_Play () { return F("Play") ; } const __FlashStringHelper* str_Pause () { return F("Pause") ; } const __FlashStringHelper* str_Quiz () { return F("Quiz") ; } const __FlashStringHelper* str_Memory () { return F("Memory") ; } -const __FlashStringHelper* str_Admin_BaseSetting () { return F("AdmBaseSetting") ; } -const __FlashStringHelper* str_Admin_BaseWriteCard () { return F("AdmBaseWriteCard") ; } +const __FlashStringHelper* str_Admin_BaseSetting () { return F("AdmBaseSet") ; } +const __FlashStringHelper* str_Admin_BaseWriteCard () { return F("AdmBaseWC") ; } const __FlashStringHelper* str_Admin_Allow () { return F("AdmAllow") ; } const __FlashStringHelper* str_Admin_Entry () { return F("AdmEntry") ; } -const __FlashStringHelper* str_Admin_NewCard () { return F("AdmNewCard") ; } -const __FlashStringHelper* str_Admin_SimpleSetting () { return F("AdmSimpleSetting") ; } -const __FlashStringHelper* str_Admin_ModCard () { return F("AdmModCard") ; } +const __FlashStringHelper* str_Admin_NewCard () { return F("AdmNCard") ; } +const __FlashStringHelper* str_Admin_SimpleSetting () { return F("AdmSimpleSet") ; } +const __FlashStringHelper* str_Admin_ModCard () { return F("AdmModC") ; } const __FlashStringHelper* str_Admin_ShortCut () { return F("AdmShortCut") ; } -const __FlashStringHelper* str_Admin_StandbyTimer () { return F("AdmStandbyTimer") ; } -const __FlashStringHelper* str_Admin_CardsForFolder () { return F("AdmCardsForFolder") ; } -const __FlashStringHelper* str_Admin_InvButtons () { return F("AdmInvButtons") ; } -const __FlashStringHelper* str_Admin_ResetEeprom () { return F("AdmResetEeprom") ; } -const __FlashStringHelper* str_Admin_LockAdmin () { return F("AdmLockAdmin") ; } -const __FlashStringHelper* str_Admin_PauseIfCardRemoved() { return F("AdmPauseIfCardRem") ; } +const __FlashStringHelper* str_Admin_StandbyTimer () { return F("AdmStbT") ; } +const __FlashStringHelper* str_Admin_CardsForFolder () { return F("AdmCardsFFold") ; } +const __FlashStringHelper* str_Admin_InvButtons () { return F("AdmInvBut") ; } +const __FlashStringHelper* str_Admin_ResetEeprom () { return F("AdmREeprom") ; } +const __FlashStringHelper* str_Admin_LockAdmin () { return F("AdmLAdm") ; } +const __FlashStringHelper* str_Admin_PauseIfCardRemoved() { return F("AdmPIfCRem") ; } #ifdef MEMORY_GAME -const __FlashStringHelper* str_Admin_MemoryGameCards () { return F("Admin_MemoryGameCards") ; } +const __FlashStringHelper* str_Admin_MemoryGameCards () { return F("AdmMemoryGameCards") ; } #endif -const __FlashStringHelper* str_VoiceMenu () { return F("VoiceMenu") ; } +const __FlashStringHelper* str_VoiceMenu () { return F("VMenu") ; } const __FlashStringHelper* str_to () { return F(" -> ") ; } const __FlashStringHelper* str_enter () { return F("enter ") ; } const __FlashStringHelper* str_abort () { return F(" abort") ; } @@ -162,7 +162,7 @@ void ChMode::react(command_e const &cmd_e) { if (Commands::isSelect(cmd) && (currentValue != 0)) { folder.mode = static_cast(currentValue); - LOG(state_log, s_info, str_ChMode(), F(": "), currentValue); + LOG(state_log, s_debug, str_ChMode(), F(": "), currentValue); if (folder.mode == pmode_t::admin) { folder.folder = 0; folder.mode = pmode_t::admin_card; @@ -218,7 +218,7 @@ void ChFolder::react(command_e const &cmd_e) { if (Commands::isSelect(cmd) && (currentValue != 0)) { folder.folder = currentValue; - LOG(state_log, s_info, str_ChFolder(), F(": "), currentValue); + LOG(state_log, s_debug, str_ChFolder(), F(": "), currentValue); #ifdef QUIZ_GAME if (folder.mode == pmode_t::quiz_game) { transit(); @@ -271,7 +271,7 @@ void ChTrack::react(command_e const &cmd_e) { if (Commands::isSelect(cmd) && (currentValue != 0)) { folder.special = currentValue; - LOG(state_log, s_info, str_ChTrack(), F(": "), currentValue); + LOG(state_log, s_debug, str_ChTrack(), F(": "), currentValue); transit(); return; } @@ -304,7 +304,7 @@ void ChFirstTrack::react(command_e const &cmd_e) { if (Commands::isSelect(cmd) && (currentValue != 0)) { folder.special = currentValue; - LOG(state_log, s_info, str_ChFirstTrack(), F(": "), currentValue); + LOG(state_log, s_debug, str_ChFirstTrack(), F(": "), currentValue); transit(); return; } @@ -339,7 +339,7 @@ void ChLastTrack::react(command_e const &cmd_e) { if (Commands::isSelect(cmd) && (currentValue != 0)) { folder.special2 = currentValue; - LOG(state_log, s_info, str_ChLastTrack(), F(": "), currentValue); + LOG(state_log, s_debug, str_ChLastTrack(), F(": "), currentValue); transit(); return; } @@ -381,7 +381,7 @@ void ChNumAnswer::react(command_e const &cmd_e) { folder.special = ((currentValue-1)%2+1)*2; folder.special2 = (currentValue-1) / 2; } - LOG(state_log, s_info, str_ChNumAnswer(), F(": "), currentValue); + LOG(state_log, s_debug, str_ChNumAnswer(), F(": "), currentValue); transit(); return; } @@ -416,7 +416,7 @@ void ChNumTracks::react(command_e const &cmd_e) { if (Commands::isSelect(cmd) && (currentValue != 0)) { folder.special = currentValue-1; - LOG(state_log, s_info, str_ChNumTracks(), F(": "), currentValue); + LOG(state_log, s_debug, str_ChNumTracks(), F(": "), currentValue); transit(); return; } diff --git a/src/tonuino.cpp b/src/tonuino.cpp index e358300..d9ba80d 100644 --- a/src/tonuino.cpp +++ b/src/tonuino.cpp @@ -88,10 +88,6 @@ void Tonuino::setup() { LOG(init_log, s_debug, F("get last, folder: "), myFolder.folder, F(", mode: "), static_cast(myFolder.mode)); #endif - // DFPlayer Mini initialisieren - mp3.begin(); - delay(2000); - // NFC Leser initialisieren chip_card.initCard(); @@ -101,19 +97,18 @@ void Tonuino::setup() { settings.loadSettingsFromFlash(); } - // DFPlayer Mini initialisieren (2) -#if defined SPKONOFF - digitalWrite(ampEnablePin, getLevel(ampEnablePinType, level::active)); -#endif - mp3.setVolume(); - mp3.setEq(static_cast(settings.eq - 1)); - mp3.loop(); + // DFPlayer Mini initialisieren + mp3.init(); SM_tonuino::start(); // ignore commands, if buttons already pressed during startup commands.getCommandRaw(); +#if defined SPKONOFF + digitalWrite(ampEnablePin, getLevel(ampEnablePinType, level::active)); +#endif + // Start Shortcut "at Startup" - e.g. Welcome Sound #ifdef SPECIAL_START_SHORTCUT @@ -152,6 +147,9 @@ void Tonuino::loop() { shutdown(); #endif +#ifdef HPJACKDETECT + mp3.hpjackdetect(); +#endif mp3.loop(); activeModifier->loop(); @@ -218,8 +216,8 @@ void Tonuino::playFolder() { /* no break */ case pmode_t::hoerspiel_vb: // Spezialmodus Von-Bin: Hörspiel: eine zufällige Datei aus dem Ordner - LOG(play_log, s_info, F("Hörspiel")); - LOG(play_log, s_info, myFolder.special, str_bis(), myFolder.special2); + LOG(play_log, s_debug, F("Hörspiel")); + LOG(play_log, s_debug, myFolder.special, str_bis(), myFolder.special2); mp3.enqueueTrack(myFolder.folder, random(myFolder.special, myFolder.special2 + 1)); break; @@ -231,8 +229,8 @@ void Tonuino::playFolder() { /* no break */ case pmode_t::album_vb: // Spezialmodus Von-Bis: Album: alle Dateien zwischen Start und Ende spielen - LOG(play_log, s_info, F("Album")); - LOG(play_log, s_info, myFolder.special, str_bis() , myFolder.special2); + LOG(play_log, s_debug, F("Album")); + LOG(play_log, s_debug, myFolder.special, str_bis() , myFolder.special2); mp3.enqueueTrack(myFolder.folder, myFolder.special, myFolder.special2); break; @@ -244,8 +242,8 @@ void Tonuino::playFolder() { /* no break */ case pmode_t::party_vb: // Spezialmodus Von-Bis: Party Ordner in zufälliger Reihenfolge - LOG(play_log, s_info, F("Party")); - LOG(play_log, s_info, myFolder.special, str_bis(), myFolder.special2); + LOG(play_log, s_debug, F("Party")); + LOG(play_log, s_debug, myFolder.special, str_bis(), myFolder.special2); mp3.enqueueTrack(myFolder.folder, myFolder.special, myFolder.special2); mp3.shuffleQueue(); mp3.setEndless(); @@ -253,7 +251,7 @@ void Tonuino::playFolder() { case pmode_t::einzel: // Einzel Modus: eine Datei aus dem Ordner abspielen - LOG(play_log, s_info, F("Einzel")); + LOG(play_log, s_debug, F("Einzel")); mp3.enqueueTrack(myFolder.folder, myFolder.special); break; @@ -261,7 +259,7 @@ void Tonuino::playFolder() { case pmode_t::hoerbuch_1: { // Hörbuch Modus: kompletten Ordner spielen und Fortschritt merken (oder nur eine Datei) - LOG(play_log, s_info, F("Hörbuch")); + LOG(play_log, s_debug, F("Hörbuch")); uint16_t startTrack = settings.readFolderSettingFromFlash(myFolder.folder); if ((startTrack == 0) || (startTrack > numTracksInFolder)) startTrack = 1; @@ -283,7 +281,7 @@ void Tonuino::playTrackNumber () { // Leider kann das Modul selbst keine Queue abspielen, daher müssen wir selbst die Queue verwalten void Tonuino::nextTrack(uint8_t tracks, bool fromOnPlayFinished) { - LOG(play_log, s_info, F("nextTrack")); + LOG(play_log, s_debug, F("nextTrack")); if (fromOnPlayFinished && mp3.isPlayingFolder() && (myFolder.mode == pmode_t::hoerbuch || myFolder.mode == pmode_t::hoerbuch_1)) { const uint8_t trackToSave = (mp3.getCurrentTrack() < numTracksInFolder) ? mp3.getCurrentTrack()+1 : 1; settings.writeFolderSettingToFlash(myFolder.folder, trackToSave); @@ -303,7 +301,7 @@ void Tonuino::nextTrack(uint8_t tracks, bool fromOnPlayFinished) { } void Tonuino::previousTrack(uint8_t tracks) { - LOG(play_log, s_info, F("previousTrack")); + LOG(play_log, s_debug, F("previousTrack")); if (activeModifier->handlePrevious()) return; mp3.playPrevious(tracks); @@ -314,7 +312,7 @@ void Tonuino::previousTrack(uint8_t tracks) { // Funktionen für den Standby Timer (z.B. über Pololu-Switch oder Mosfet) void Tonuino::setStandbyTimer() { - LOG(standby_log, s_info, F("setStandbyTimer")); + LOG(standby_log, s_debug, F("setStandbyTimer")); if (settings.standbyTimer != 0 && not standbyTimer.isActive()) { standbyTimer.start(settings.standbyTimer * 60 * 1000); LOG(standby_log, s_info, F("timer started")); @@ -322,7 +320,7 @@ void Tonuino::setStandbyTimer() { } void Tonuino::disableStandbyTimer() { - LOG(standby_log, s_info, F("disableStandbyTimer")); + LOG(standby_log, s_debug, F("disableStandbyTimer")); if (settings.standbyTimer != 0) { standbyTimer.stop(); LOG(standby_log, s_info, F("timer stopped")); diff --git a/test/libs/MFRC522.h b/test/libs/MFRC522.h index edde5e5..e8e08e9 100644 --- a/test/libs/MFRC522.h +++ b/test/libs/MFRC522.h @@ -186,6 +186,7 @@ class MFRC522 { void PCD_Init() { called_Init = true; } bool called_AntennaOff = false; void PCD_AntennaOff() { called_AntennaOff = true; } + bool PCD_PerformSelfTest() { return true; } ///////////////////////////////////////////////////////////////////////////////////// // Power control functions