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