mirror of
				https://github.com/taigrr/arduinolibs
				synced 2025-01-18 04:33:12 -08:00 
			
		
		
		
	Selecting the melody to play when alarm goes off
This commit is contained in:
		
							parent
							
								
									23c98820f7
								
							
						
					
					
						commit
						4ac487fe05
					
				| @ -137,7 +137,7 @@ void Melody::setLoopDuration(unsigned long ms) | |||||||
| /**
 | /**
 | ||||||
|  * \brief Starts playing the melody, or restarts it if already playing. |  * \brief Starts playing the melody, or restarts it if already playing. | ||||||
|  * |  * | ||||||
|  * \sa setMelody(), stop(), loopCount() |  * \sa playOnce(), setMelody(), stop(), loopCount() | ||||||
|  */ |  */ | ||||||
| void Melody::play() | void Melody::play() | ||||||
| { | { | ||||||
| @ -150,6 +150,22 @@ void Melody::play() | |||||||
|     nextNote(); |     nextNote(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * \brief Plays the melody once and then stops. | ||||||
|  |  * | ||||||
|  |  * \sa play(), stop() | ||||||
|  |  */ | ||||||
|  | void Melody::playOnce() | ||||||
|  | { | ||||||
|  |     stop(); | ||||||
|  |     if (size == 0) | ||||||
|  |         return;         // No melody to play.
 | ||||||
|  |     loopsLeft = 1; | ||||||
|  |     posn = 0; | ||||||
|  |     playing = true; | ||||||
|  |     nextNote(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * \brief Stops playing the melody. |  * \brief Stops playing the melody. | ||||||
|  * |  * | ||||||
|  | |||||||
| @ -131,6 +131,7 @@ public: | |||||||
|     void setLoopDuration(unsigned long ms); |     void setLoopDuration(unsigned long ms); | ||||||
| 
 | 
 | ||||||
|     void play(); |     void play(); | ||||||
|  |     void playOnce(); | ||||||
|     void stop(); |     void stop(); | ||||||
| 
 | 
 | ||||||
|     void setMelody(const int *notes, const uint8_t *lengths, unsigned int size); |     void setMelody(const int *notes, const uint8_t *lengths, unsigned int size); | ||||||
|  | |||||||
| @ -35,6 +35,7 @@ | |||||||
| #include "SetAlarm.h" | #include "SetAlarm.h" | ||||||
| #include "SetTime.h" | #include "SetTime.h" | ||||||
| #include "SetDate.h" | #include "SetDate.h" | ||||||
|  | #include "SetMelody.h" | ||||||
| #include "LowPowerMelody.h" | #include "LowPowerMelody.h" | ||||||
| 
 | 
 | ||||||
| // I/O pins that are used by this sketch. | // I/O pins that are used by this sketch. | ||||||
| @ -51,6 +52,7 @@ | |||||||
| #define SETTING_24HOUR          0   // 0: 12 hour, 1: 24 hour | #define SETTING_24HOUR          0   // 0: 12 hour, 1: 24 hour | ||||||
| #define SETTING_ALARM_TIMEOUT   1   // Timeout in minutes for the alarm | #define SETTING_ALARM_TIMEOUT   1   // Timeout in minutes for the alarm | ||||||
| #define SETTING_SNOOZE          2   // 0: no snooze, 1: snooze | #define SETTING_SNOOZE          2   // 0: no snooze, 1: snooze | ||||||
|  | #define SETTING_MELODY          3   // Melody to play for the alarm | ||||||
| 
 | 
 | ||||||
| // Initialize the LCD | // Initialize the LCD | ||||||
| FreetronicsLCD lcd; | FreetronicsLCD lcd; | ||||||
| @ -60,8 +62,8 @@ SoftI2C bus(RTC_DATA, RTC_CLOCK); | |||||||
| DS1307RTC rtc(bus, RTC_ONE_HZ); | DS1307RTC rtc(bus, RTC_ONE_HZ); | ||||||
| 
 | 
 | ||||||
| // Melody to play when the alarm sounds. | // Melody to play when the alarm sounds. | ||||||
| int alarmNotes[] = {NOTE_C6, NOTE_C6, NOTE_C6, NOTE_C6, NOTE_REST}; | int defaultMelodyNotes[5] = {NOTE_C6, NOTE_C6, NOTE_C6, NOTE_C6, NOTE_REST}; | ||||||
| byte alarmLengths[] = {8, 8, 8, 8, 2}; | byte defaultMelodyLengths[5] = {8, 8, 8, 8, 2}; | ||||||
| LowPowerMelody alarmMelody(BUZZER); | LowPowerMelody alarmMelody(BUZZER); | ||||||
| 
 | 
 | ||||||
| uint8_t prevHour = 24; | uint8_t prevHour = 24; | ||||||
| @ -77,6 +79,7 @@ SetAlarm alarm3(mainForm, "Alarm 3", 2); | |||||||
| SetAlarm alarm4(mainForm, "Alarm 4", 3); | SetAlarm alarm4(mainForm, "Alarm 4", 3); | ||||||
| IntField alarmTimeout(mainForm, "Alarm timeout", 2, 10, 1, 2, " minutes"); | IntField alarmTimeout(mainForm, "Alarm timeout", 2, 10, 1, 2, " minutes"); | ||||||
| BoolField snooze(mainForm, "Snooze alarm", "On", "Off", false); | BoolField snooze(mainForm, "Snooze alarm", "On", "Off", false); | ||||||
|  | SetMelody alarmSound(mainForm, "Alarm sound"); | ||||||
| SetTime setTime(mainForm, "Set current time"); | SetTime setTime(mainForm, "Set current time"); | ||||||
| SetDate setDate(mainForm, "Set current date"); | SetDate setDate(mainForm, "Set current date"); | ||||||
| BoolField hourMode(mainForm, "Hour display", "24 hour clock", "12 hour clock", false); | BoolField hourMode(mainForm, "Hour display", "24 hour clock", "12 hour clock", false); | ||||||
| @ -105,7 +108,7 @@ void setup() { | |||||||
|     lcd.enableScreenSaver(3); |     lcd.enableScreenSaver(3); | ||||||
| 
 | 
 | ||||||
|     // Initialize the alarm melody. |     // Initialize the alarm melody. | ||||||
|     alarmMelody.setMelody(alarmNotes, alarmLengths, sizeof(alarmLengths)); |     alarmMelody.setMelody(defaultMelodyNotes, defaultMelodyLengths, sizeof(defaultMelodyLengths)); | ||||||
|     alarmMelody.stop();     // Force Timer2 to be disabled. |     alarmMelody.stop();     // Force Timer2 to be disabled. | ||||||
| 
 | 
 | ||||||
|     // Read the clock settings from the realtime clock's NVRAM. |     // Read the clock settings from the realtime clock's NVRAM. | ||||||
| @ -115,6 +118,8 @@ void setup() { | |||||||
|     alarmTimeout.setValue(rtc.readByte(SETTING_ALARM_TIMEOUT)); |     alarmTimeout.setValue(rtc.readByte(SETTING_ALARM_TIMEOUT)); | ||||||
|     alarmMelody.setLoopDuration(60000UL * alarmTimeout.value()); |     alarmMelody.setLoopDuration(60000UL * alarmTimeout.value()); | ||||||
|     snooze.setValue(rtc.readByte(SETTING_SNOOZE) != 0); |     snooze.setValue(rtc.readByte(SETTING_SNOOZE) != 0); | ||||||
|  |     alarmSound.setValue(rtc.readByte(SETTING_MELODY)); | ||||||
|  |     alarmSound.updateMelody(); | ||||||
| 
 | 
 | ||||||
|     // Set the initial time and date and find the next alarm to be triggered. |     // Set the initial time and date and find the next alarm to be triggered. | ||||||
|     RTCTime time; |     RTCTime time; | ||||||
| @ -176,6 +181,8 @@ void loop() { | |||||||
|             alarmMelody.setLoopDuration(60000UL * alarmTimeout.value()); |             alarmMelody.setLoopDuration(60000UL * alarmTimeout.value()); | ||||||
|         } else if (snooze.isCurrent()) { |         } else if (snooze.isCurrent()) { | ||||||
|             rtc.writeByte(SETTING_SNOOZE, (byte)snooze.value()); |             rtc.writeByte(SETTING_SNOOZE, (byte)snooze.value()); | ||||||
|  |         } else if (alarmSound.isCurrent()) { | ||||||
|  |             rtc.writeByte(SETTING_MELODY, (byte)alarmSound.value()); | ||||||
|         } |         } | ||||||
|         prevHour = 24;      // Force an update of the main screen. |         prevHour = 24;      // Force an update of the main screen. | ||||||
|         findNextAlarm();    // Update the time of the next alarm event. |         findNextAlarm();    // Update the time of the next alarm event. | ||||||
|  | |||||||
| @ -34,6 +34,15 @@ void LowPowerMelody::play() | |||||||
|     Melody::play(); |     Melody::play(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void LowPowerMelody::playOnce() | ||||||
|  | { | ||||||
|  |     // Turn on Timer2.
 | ||||||
|  |     power_timer2_enable(); | ||||||
|  | 
 | ||||||
|  |     // Start the melody playing.
 | ||||||
|  |     Melody::playOnce(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void LowPowerMelody::stop() | void LowPowerMelody::stop() | ||||||
| { | { | ||||||
|     // Stop the melody playing.
 |     // Stop the melody playing.
 | ||||||
|  | |||||||
| @ -30,6 +30,7 @@ public: | |||||||
|     LowPowerMelody(uint8_t pin) : Melody(pin) {} |     LowPowerMelody(uint8_t pin) : Melody(pin) {} | ||||||
| 
 | 
 | ||||||
|     void play(); |     void play(); | ||||||
|  |     void playOnce(); | ||||||
|     void stop(); |     void stop(); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										86
									
								
								libraries/RTC/examples/AlarmClock/SetMelody.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								libraries/RTC/examples/AlarmClock/SetMelody.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright (C) 2012 Southern Storm Software, Pty Ltd. | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a | ||||||
|  |  * copy of this software and associated documentation files (the "Software"), | ||||||
|  |  * to deal in the Software without restriction, including without limitation | ||||||
|  |  * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||||
|  |  * and/or sell copies of the Software, and to permit persons to whom the | ||||||
|  |  * Software is furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included | ||||||
|  |  * in all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||||
|  |  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||||
|  |  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||||||
|  |  * DEALINGS IN THE SOFTWARE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SetMelody.h" | ||||||
|  | #include "LowPowerMelody.h" | ||||||
|  | #include <WProgram.h> | ||||||
|  | 
 | ||||||
|  | extern LowPowerMelody alarmMelody; | ||||||
|  | extern int defaultMelodyNotes[5]; | ||||||
|  | extern byte defaultMelodyLengths[5]; | ||||||
|  | 
 | ||||||
|  | static int haircutNotes[] = { | ||||||
|  |     NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, | ||||||
|  |     NOTE_REST, NOTE_B3, NOTE_C4, NOTE_REST | ||||||
|  | }; | ||||||
|  | static byte haircutLengths[] = {4, 8, 8, 4, 4, 4, 4, 4, 2}; | ||||||
|  | 
 | ||||||
|  | static int sosNotes[] = { | ||||||
|  |     NOTE_C6, NOTE_C6, NOTE_C6, NOTE_REST, | ||||||
|  |     NOTE_C6, NOTE_C6, NOTE_C6, NOTE_REST, | ||||||
|  |     NOTE_C6, NOTE_C6, NOTE_C6, NOTE_REST | ||||||
|  | }; | ||||||
|  | static byte sosLengths[] = {8, 8, 8, 8, 4, 4, 4, 8, 8, 8, 8, 2}; | ||||||
|  | 
 | ||||||
|  | static const char item_FourBeeps[] PROGMEM = "Four beeps"; | ||||||
|  | static const char item_Haircut[] PROGMEM = "Shave 'n haircut"; | ||||||
|  | static const char item_SOS[] PROGMEM = "S.O.S."; | ||||||
|  | static ListItem melodyNames[] PROGMEM = { | ||||||
|  |     item_FourBeeps, | ||||||
|  |     item_Haircut, | ||||||
|  |     item_SOS, | ||||||
|  |     0 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | SetMelody::SetMelody(Form &form, const String &label) | ||||||
|  |     : ListField(form, label, melodyNames) | ||||||
|  |     , needsPlay(false) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int SetMelody::dispatch(int event) | ||||||
|  | { | ||||||
|  |     int result = ListField::dispatch(event); | ||||||
|  |     if (result == FORM_CHANGED) { | ||||||
|  |         updateMelody(); | ||||||
|  |         needsPlay = true;   // Play when we see the button release event.
 | ||||||
|  |     } else if (needsPlay && event < 0) { | ||||||
|  |         needsPlay = false; | ||||||
|  |         alarmMelody.playOnce(); | ||||||
|  |     } | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SetMelody::updateMelody() | ||||||
|  | { | ||||||
|  |     switch (value()) { | ||||||
|  |     case 0: default: | ||||||
|  |         alarmMelody.setMelody(defaultMelodyNotes, defaultMelodyLengths, sizeof(defaultMelodyLengths)); | ||||||
|  |         break; | ||||||
|  |     case 1: | ||||||
|  |         alarmMelody.setMelody(haircutNotes, haircutLengths, sizeof(haircutLengths)); | ||||||
|  |         break; | ||||||
|  |     case 2: | ||||||
|  |         alarmMelody.setMelody(sosNotes, sosLengths, sizeof(sosLengths)); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								libraries/RTC/examples/AlarmClock/SetMelody.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								libraries/RTC/examples/AlarmClock/SetMelody.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | /*
 | ||||||
|  |  * Copyright (C) 2012 Southern Storm Software, Pty Ltd. | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a | ||||||
|  |  * copy of this software and associated documentation files (the "Software"), | ||||||
|  |  * to deal in the Software without restriction, including without limitation | ||||||
|  |  * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||||
|  |  * and/or sell copies of the Software, and to permit persons to whom the | ||||||
|  |  * Software is furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included | ||||||
|  |  * in all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||||
|  |  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||||
|  |  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||||||
|  |  * DEALINGS IN THE SOFTWARE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef SetMelody_h | ||||||
|  | #define SetMelody_h | ||||||
|  | 
 | ||||||
|  | #include <ListField.h> | ||||||
|  | 
 | ||||||
|  | class SetMelody : public ListField { | ||||||
|  | public: | ||||||
|  |     SetMelody(Form &form, const String &label); | ||||||
|  | 
 | ||||||
|  |     int dispatch(int event); | ||||||
|  | 
 | ||||||
|  |     void updateMelody(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     bool needsPlay; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user