MBED clock sync using NTP Server from from internet

Dependencies:   EthernetInterface NTPClient mbed-rtos mbed

Fork of MbedClock by Andrew Duda

Revision:
2:c939d0501184
Parent:
1:c47a2f0816bb
Child:
3:b711df1f40cb
--- a/main.cpp	Mon Dec 08 10:06:35 2014 +0000
+++ b/main.cpp	Mon Dec 08 23:30:49 2014 +0000
@@ -5,25 +5,50 @@
 #include "SDFileSystem.h"
 #include "Clock.h"
 #include "Recorder.h"
+#include "Speaker.h"
 #include <string>
 
-#define SERVER_IP "143.215.120.157"
+//#define SERVER_IP "143.215.120.157"
+#define SERVER_IP "143.215.119.135"
 #define SERVER_PORT 13000
-#define FILE_NAME "/sd/test-rec.wav"
-#define BUF_SIZE 1024
+#define REC_NAME "/sd/rec.wav"
+#define PLAY_NAME "/sd/play.wav"
 
+#define BUF_SIZE 8192
+
+// Big Components
 uLCD_4DGL uLCD(p28,p27,p30);
 Serial pc(USBTX, USBRX);
 Serial easyVR(p13, p14);
 SDFileSystem sdc(p5, p6, p7, p8, "sd");
 EthernetInterface eth;
+TCPSocketConnection server;
 Clock clk;
 
+// Small Components
+Speaker speaker(p21);
 DigitalOut sleepLED(LED4);
 Mutex cMutex;
 Mutex sMutex;
 char buf[BUF_SIZE];
+// float array for recorder (they share the buffer)
+float *buffer = (float*)buf; 
 
+// Help with noise
+AnalogIn pin15(p15);
+AnalogIn pin16(p16);
+AnalogIn pin17(p17);
+AnalogIn pin19(p19);
+
+void aThread(void const *args) {
+    while (1) {
+        Thread::signal_wait(0x1, osWaitForever);
+        for (int i = 0; i < 5; i++) {
+            speaker.playNote(969.0, 0.5, 0.1);
+            Thread::wait(1000);
+        }
+    }
+}
 
 void execute(char *command) {
     char buffer[12];
@@ -39,18 +64,28 @@
         cMutex.lock();
         clk.setTimezone(zone);
         cMutex.unlock();
-    } else if (operation == "sync") {
+    } else if (operation == "setAlarm") {
+        cMutex.lock();
+        clk.setAlarm(hour, minute, period);
+        cMutex.unlock(); 
+    } else if (operation == "setTimer") {
+        cMutex.lock();
+        clk.setTimer(hour, minute);
+        cMutex.unlock(); 
+    } else if (operation == "deleteAlarm") {
+        cMutex.lock();
+        clk.deleteAlarm();
+        cMutex.unlock(); 
+    } else if (operation == "syncNow") {
         cMutex.lock();            
         if (clk.syncTime() != 0) {
-            sMutex.lock();
-            pc.printf("Error syncing time\n\r");
-            sMutex.unlock();
+            printf("  ERROR: failed to sync time\n\n\r");
         }
         cMutex.unlock();
+    } else if (operation == "noCommand") {
+        printf("  ERROR: speech not recognized\n\n\r");
     } else {
-        sMutex.lock();
-        pc.printf("Not a valid command\n\r");
-        sMutex.unlock();
+        printf("  ERROR: not a valid command\n\n\r");
     }
 }
 
@@ -80,6 +115,7 @@
     while (1) {
         cMutex.lock();
         time = clk.getTime();
+        bool alarmSet = clk.alarmSet();
         cMutex.unlock();
         
         timeinfo = localtime(&time);
@@ -88,75 +124,142 @@
         sMutex.lock();
         uLCD.locate(0,3);
         uLCD.printf("%s", buffer);
+        if (alarmSet)
+            uLCD.printf("ALARM SET");
+        else
+            uLCD.printf("         ");
         sMutex.unlock();
-        Thread::wait(0.25);
+        Thread::wait(200);
     }
 }
 
-/**
- * main function which loops getting a command, parsing that command, and executing
- * that command. It also starts a thread which updates the clock separate from the
- * command execution.
- */
-int main() {
-    pc.printf("Starting MbedClock\n\r");
-
+void init() {
+    printf("\r\n\n--Starting MbedClock--\n\r");
+    
     eth.init();
-    pc.printf("Ititialized Ethernet\n\r");
+    printf(" * Initialized Ethernet\n\r");
     
     eth.connect();
-    pc.printf("Connected using DHCP\n\r");
+    printf(" * Connected using DHCP\n\r");
     wait(5);
-    pc.printf("Using IP: %s\n\r", eth.getIPAddress());
+    printf(" * Using IP: %s\n\r", eth.getIPAddress());
     
     easyVR.putc('b');
     easyVR.getc();
-    pc.printf("Initialized EasyVR\n\r");
-      
-    Thread updateThread(lcdUpdateThread);
-    //sMutex.lock();
-    pc.printf("Started LCDThread\n\n\r");
-    //sMutex.unlock();
+    printf(" * Initialized EasyVR\n\r");
+
+    
+}
+
+void waitForTrigger2() {
+    // set EasyVR to 2 claps
+    sMutex.lock();
+    easyVR.putc('s');
+    easyVR.putc('A' + 4);
+    sMutex.unlock();
+    wait(0.2);
     
-    while(1) {
-        // set EasyVR to 3 claps
+    // Clear buffer and wait for awake
+    printf("Waiting for trigger...");
+    sMutex.lock();
+    while (easyVR.readable())
+        easyVR.getc();
+    sMutex.unlock();
+    sleepLED = 1;
+    while(!easyVR.readable()) {
+        wait(0.2);
+    }
+    sleepLED = 0;
+    printf("trigger received!\n\r");
+}
+
+void waitForTrigger() {
+    char rchar = 0;
+    sleepLED = 1;
+    printf("Waiting for trigger...");
+    while (rchar!='A') {
+        wait(.001);
         sMutex.lock();
-        easyVR.putc('s');
-        easyVR.putc('A' + 4);
+        easyVR.putc('d');
+// a small delay is needed when sending EasyVR several characters
+        wait(.001);
+        easyVR.putc('A');
         sMutex.unlock();
-        wait(0.2);
-        
-        // Clear buffer and wait for awake
-        sMutex.lock();
-        while (easyVR.readable())
-            easyVR.getc();
-        sMutex.unlock();
-        sleepLED = 1;
-        while(!easyVR.readable()) {
+        while (!easyVR.readable()) {
             wait(0.2);
         }
-        sleepLED = 0;
-        rec(FILE_NAME, 5);
+        sMutex.lock();
+        rchar=easyVR.getc();
+        sMutex.unlock();
+        // word recognized
+        if (rchar=='r') {
+            wait(.001);
+            sMutex.lock();
+            easyVR.putc(' ');
+            rchar=easyVR.getc();
+            sMutex.unlock();
+        // error
+        } else if (rchar=='e') {
+            wait(.001);
+            sMutex.lock();
+            easyVR.putc(' ');
+            rchar=easyVR.getc();
+            easyVR.putc(' ');
+            rchar=easyVR.getc();
+            sMutex.unlock();
+        }
+    }
+    sleepLED = 0;
+    printf("trigger received!\n\r");
+}
+
+void sendFile() {
+    printf("  Sending \"%s\"...", REC_NAME);
+    FILE *fp = fopen(REC_NAME, "rb");
+
+    int sum = 0;
+    while (sum < 110296)
+    {
+        int i = fread(buf, 1, BUF_SIZE, fp);
+        server.send(buf, i);
+        sum += i;
+    }
+    printf("sent\n\r");
+    fclose(fp);
+    
+    int n = server.receive(buf, BUF_SIZE);
+    buf[n] = '\0';
+    printf("  Received \"%s\"\n\n\r", buf);
+}
+
+int main() {
+    init();
+    //RtosTimer alarmTimer(aThread, osTimerOnce, NULL);
+
+    
+    Thread alarmThread(aThread);
+    Thread updateThread(lcdUpdateThread);
+    printf(" * Started LCD and Alarm Threads\n\n\r");
+    
+    cMutex.lock();
+    clk.setAlarmThread(&alarmThread);
+    cMutex.unlock();
+    while(1) {
+        waitForTrigger();
+
+        printf("  Recording audio file...");
+        rec(REC_NAME, 5);
+        printf("complete\n\r");
+        //wait(0.1);
+        //play(FILE_NAME);
         
-        TCPSocketConnection server;
         if (!server.connect(SERVER_IP, SERVER_PORT)) {
-            printf("Connected to %s\n\r", SERVER_IP);
-            FILE *fp = fopen(FILE_NAME, "rb");
-            
-            printf("  Sending %s\n\r", FILE_NAME);
-            int sum = 0;
-            while (sum < 110296)
-            {
-                int i = fread(buf, 1, BUF_SIZE, fp);
-                server.send(buf, i);
-                sum += i;
-            }
-            int n = server.receive(buf, BUF_SIZE);
-            buf[n] = '\0';
-            printf("  Received: %s\n\n\r", buf);
+            printf("  Connected to %s\n\r", SERVER_IP);
+            sendFile();
+            execute(buf);
             server.close();
         } else {
-            printf("Unable to connect to %s\n\r", SERVER_IP);
-        }  
+            printf("  Unable to connect to %s\n\n\r", SERVER_IP);
+        }
     }
 }