SP03 Text to Speech Synthesizer

Revision:
1:58ab657cd515
Parent:
0:2326b6172834
--- a/SP03.cpp	Wed May 07 13:52:08 2014 +0000
+++ b/SP03.cpp	Mon Mar 07 14:38:55 2016 +0000
@@ -3,47 +3,58 @@
 SP03::SP03(PinName sda, PinName scl): i2c_bus(sda,scl)
 {
     i2c_bus.frequency(CLOCK_RATE);
-}
-
-void SP03::_speak(const char message[],SmartLab_SP03::Speech_Speed speed, SmartLab_SP03::Speech_Volume volume,uint8_t pitch)
-{
-    char speakout[2];
-    speakout[0] = REGISTER_FOR_COMMAND;
-    speakout[1] = SPEAK_OUT_THE_BUFFER;
-    int length = 6 + strlen(message);
-    char _message[length];
-    _message[0] = REGISTER_FOR_COMMAND;
-    _message[1] = 0x00;
-    _message[2] = volume;
-    _message[3] = speed;
-    _message[4] = pitch;
-    for (int i = 5; i < length; i++)
-        _message[i] = message[i - 5];
-    i2c_bus.write(DEFAULT_ADDRESS, _message, length);
-    i2c_bus.write(DEFAULT_ADDRESS, speakout, 2);
+    _volume = VOLUME_MAX;
+    _speed = SPEED_NORMAL;
 }
 
-void SP03::Speak(const char message[])
+void SP03::speak(const char * message)
 {
-    _speak(message, SmartLab_SP03::NORMAL, SmartLab_SP03::MAX, DEFAULT_SPEECH_PITCH);
-}
+    i2c_bus.start();
+    i2c_bus.write(DEFAULT_ADDRESS);
+    i2c_bus.write(REGISTER_FOR_COMMAND);
+    i2c_bus.write(0x00);
+    i2c_bus.write(_volume);
+    i2c_bus.write(_speed);
+    i2c_bus.write(DEFAULT_SPEECH_PITCH);
+    int i = 0;
+    while (true) {
+        i2c_bus.write(message[i++]);
+        if (message[i] == 0x00)
+            break;
+    }
+    i2c_bus.write(0x00);
+    i2c_bus.stop();
 
-void SP03::Speak(const char message[],SmartLab_SP03::Speech_Speed speed, SmartLab_SP03::Speech_Volume volume)
-{
-    _speak(message, speed, volume, DEFAULT_SPEECH_PITCH);
+    i2c_bus.start();
+    i2c_bus.write(DEFAULT_ADDRESS);
+    i2c_bus.write(REGISTER_FOR_COMMAND);
+    i2c_bus.write(SPEAK_OUT_THE_BUFFER);
+    i2c_bus.stop();
 }
 
-void SP03::Speak(const char message[],SmartLab_SP03::Speech_Speed speed, SmartLab_SP03::Speech_Volume volume,uint8_t pitch)
+void SP03::setSpeed(char speed)
 {
-    _speak(message, speed, volume, pitch);
+    _speed = speed;
+}
+
+void SP03::setVolume(char volume)
+{
+    _volume = volume;
 }
 
-bool SP03::IsSpeaking()
+bool SP03::isSpeaking()
 {
-    char m[1]= {REGISTER_FOR_COMMAND};
-    i2c_bus.write(DEFAULT_ADDRESS,m ,1);
-    i2c_bus.read(DEFAULT_ADDRESS, m, 1);
-    if (m[0] == 0x00)
+    i2c_bus.start();
+    i2c_bus.write(DEFAULT_ADDRESS);
+    i2c_bus.write(REGISTER_FOR_COMMAND);
+    i2c_bus.stop();
+
+    i2c_bus.start();
+    i2c_bus.write(DEFAULT_ADDRESS | 0x01);
+    int value = i2c_bus.read(0x00);
+    i2c_bus.stop();
+
+    if (value == 0x00)
         return false;
     else return true;
 }
\ No newline at end of file