MBED clock sync using NTP Server from from internet
Dependencies: EthernetInterface NTPClient mbed-rtos mbed
Fork of MbedClock by
Diff: main.cpp
- 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); + } } }