1 /*
2  * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
3  * Copyright (c) 2014 Intel Corporation.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #pragma once
25 
26 #include <string>
27 #include <mraa/pwm.h>
28 
29 #define  DO     3300    // 261 Hz 3830
30 #define  RE     2930    // 294 Hz
31 #define  MI     2600    // 329 Hz
32 #define  FA     2460    // 349 Hz
33 #define  SOL    2190    // 392 Hz
34 #define  LA     1960    // 440 Hz
35 #define  SI     1750    // 493 Hz
36 
37 namespace upm {
38 
39 /**
40  * @brief Buzzer library
41  * @defgroup buzzer libupm-buzzer
42  * @ingroup seeed pwm sound gsk
43  */
44 
45 /**
46  * @library buzzer
47  * @sensor buzzer
48  * @comname Grove Buzzer
49  * @type sound
50  * @man seeed
51  * @con pwm
52  * @kit gsk
53  *
54  * @brief API for the Buzzer component
55  *
56  * This module defines the Buzzer interface for libbuzzer.
57  * This sensor can make different tones when connected to
58  * a pin capable of analog pulse-width modulation. It emits
59  * sound using a piezoelectric material that vibrates at different
60  * frequencies based on the input voltage.
61  *
62  * @image html buzzer.jpg
63  * @snippet buzzer-sound.cxx Interesting
64  */
65 class Buzzer {
66     public:
67         /**
68          * Instantiates a Buzzer object.
69          *
70          * @param pinNumber Buzzer pin number
71          */
72         Buzzer (int pinNumber);
73 
74         /**
75          * Buzzer object destructor.
76          */
77         ~Buzzer ();
78 
79         /**
80          * Plays a tone for a certain amount of time or indefinitely. When delay
81          * is not used, the sound can be stopped by calling stopSound().
82          *
83          * @param note Note to play (C, D, E, etc.) or frequency
84          * @param delay Time in microseconds for which to play the sound; if the value is
85          * 0, the sound is played indefinitely
86          *
87          * @return Note played
88          */
89         int playSound (int note, int delay);
90 
91         /**
92          * Stops the sound currently playing. Should be called when playSound()
93          * does not have a delay value.
94          */
95         void stopSound();
96 
97         /**
98          * Sets the volume for the buzzer, but may affect the sound timbre.
99          * Works best with halved values; e.g., 1.0, 0.5, 0.25, etc.
100          *
101          * @param vol Value to set the volume to, from 0.0 to 1.0
102          */
103         void setVolume(float vol);
104 
105         /**
106          * Gets the buzzer volume.
107          *
108          * @return Value the volume was set to
109          */
110         float getVolume();
111 
112         /**
113          * Returns the name of the sensor.
114          *
115          * @return Name of the sensor
116          */
name()117         std::string name()
118         {
119             return m_name;
120         }
121     protected:
122         std::string m_name;
123     private:
124         mraa_pwm_context m_pwm_context;
125         float m_volume;
126 };
127 }
128