Mbed Clock application using an NTP connection to get internet time and a terminal interface to send commands

Dependencies:   4DGL-uLCD-SE EthernetInterface NTPClient mbed-rtos mbed SDFileSystem wavfile

Committer:
dudanian
Date:
Tue Dec 09 15:42:39 2014 +0000
Revision:
3:b711df1f40cb
Parent:
2:c939d0501184
Final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudanian 0:4e6ae21cbd31 1 #include "mbed.h"
dudanian 0:4e6ae21cbd31 2 #include "rtos.h"
dudanian 0:4e6ae21cbd31 3 #include "EthernetInterface.h"
dudanian 0:4e6ae21cbd31 4 #include "uLCD_4DGL.h"
dudanian 1:c47a2f0816bb 5 #include "SDFileSystem.h"
dudanian 0:4e6ae21cbd31 6 #include "Clock.h"
dudanian 1:c47a2f0816bb 7 #include "Recorder.h"
dudanian 2:c939d0501184 8 #include "Speaker.h"
dudanian 0:4e6ae21cbd31 9 #include <string>
dudanian 1:c47a2f0816bb 10
dudanian 2:c939d0501184 11 //#define SERVER_IP "143.215.120.157"
dudanian 2:c939d0501184 12 #define SERVER_IP "143.215.119.135"
dudanian 1:c47a2f0816bb 13 #define SERVER_PORT 13000
dudanian 2:c939d0501184 14 #define REC_NAME "/sd/rec.wav"
dudanian 2:c939d0501184 15 #define PLAY_NAME "/sd/play.wav"
dudanian 0:4e6ae21cbd31 16
dudanian 2:c939d0501184 17 #define BUF_SIZE 8192
dudanian 2:c939d0501184 18
dudanian 2:c939d0501184 19 // Big Components
dudanian 0:4e6ae21cbd31 20 uLCD_4DGL uLCD(p28,p27,p30);
dudanian 0:4e6ae21cbd31 21 Serial pc(USBTX, USBRX);
dudanian 1:c47a2f0816bb 22 Serial easyVR(p13, p14);
dudanian 1:c47a2f0816bb 23 SDFileSystem sdc(p5, p6, p7, p8, "sd");
dudanian 1:c47a2f0816bb 24 EthernetInterface eth;
dudanian 2:c939d0501184 25 TCPSocketConnection server;
dudanian 1:c47a2f0816bb 26 Clock clk;
dudanian 1:c47a2f0816bb 27
dudanian 2:c939d0501184 28 // Small Components
dudanian 2:c939d0501184 29 Speaker speaker(p21);
dudanian 1:c47a2f0816bb 30 DigitalOut sleepLED(LED4);
dudanian 0:4e6ae21cbd31 31 Mutex cMutex;
dudanian 0:4e6ae21cbd31 32 Mutex sMutex;
dudanian 1:c47a2f0816bb 33 char buf[BUF_SIZE];
dudanian 2:c939d0501184 34 // float array for recorder (they share the buffer)
dudanian 2:c939d0501184 35 float *buffer = (float*)buf;
dudanian 1:c47a2f0816bb 36
dudanian 2:c939d0501184 37 // Help with noise
dudanian 2:c939d0501184 38 AnalogIn pin15(p15);
dudanian 2:c939d0501184 39 AnalogIn pin16(p16);
dudanian 2:c939d0501184 40 AnalogIn pin17(p17);
dudanian 2:c939d0501184 41 AnalogIn pin19(p19);
dudanian 2:c939d0501184 42
dudanian 2:c939d0501184 43 void aThread(void const *args) {
dudanian 2:c939d0501184 44 while (1) {
dudanian 2:c939d0501184 45 Thread::signal_wait(0x1, osWaitForever);
dudanian 2:c939d0501184 46 for (int i = 0; i < 5; i++) {
dudanian 2:c939d0501184 47 speaker.playNote(969.0, 0.5, 0.1);
dudanian 2:c939d0501184 48 Thread::wait(1000);
dudanian 2:c939d0501184 49 }
dudanian 2:c939d0501184 50 }
dudanian 2:c939d0501184 51 }
dudanian 0:4e6ae21cbd31 52
dudanian 1:c47a2f0816bb 53 void execute(char *command) {
dudanian 1:c47a2f0816bb 54 char buffer[12];
dudanian 1:c47a2f0816bb 55 int hour, minute, period, zone;
dudanian 1:c47a2f0816bb 56 sscanf(command, "%s %d %d %d %d", buffer, &hour, &minute, &period, &zone);
dudanian 1:c47a2f0816bb 57 string operation(buffer);
dudanian 1:c47a2f0816bb 58
dudanian 1:c47a2f0816bb 59 if (operation == "setTime") {
dudanian 1:c47a2f0816bb 60 cMutex.lock();
dudanian 1:c47a2f0816bb 61 clk.setTime(hour, minute, period);
dudanian 1:c47a2f0816bb 62 cMutex.unlock();
dudanian 1:c47a2f0816bb 63 } else if (operation == "setTimezone") {
dudanian 1:c47a2f0816bb 64 cMutex.lock();
dudanian 1:c47a2f0816bb 65 clk.setTimezone(zone);
dudanian 1:c47a2f0816bb 66 cMutex.unlock();
dudanian 2:c939d0501184 67 } else if (operation == "setAlarm") {
dudanian 2:c939d0501184 68 cMutex.lock();
dudanian 2:c939d0501184 69 clk.setAlarm(hour, minute, period);
dudanian 2:c939d0501184 70 cMutex.unlock();
dudanian 2:c939d0501184 71 } else if (operation == "setTimer") {
dudanian 2:c939d0501184 72 cMutex.lock();
dudanian 2:c939d0501184 73 clk.setTimer(hour, minute);
dudanian 2:c939d0501184 74 cMutex.unlock();
dudanian 2:c939d0501184 75 } else if (operation == "deleteAlarm") {
dudanian 2:c939d0501184 76 cMutex.lock();
dudanian 2:c939d0501184 77 clk.deleteAlarm();
dudanian 2:c939d0501184 78 cMutex.unlock();
dudanian 2:c939d0501184 79 } else if (operation == "syncNow") {
dudanian 1:c47a2f0816bb 80 cMutex.lock();
dudanian 1:c47a2f0816bb 81 if (clk.syncTime() != 0) {
dudanian 2:c939d0501184 82 printf(" ERROR: failed to sync time\n\n\r");
dudanian 1:c47a2f0816bb 83 }
dudanian 1:c47a2f0816bb 84 cMutex.unlock();
dudanian 2:c939d0501184 85 } else if (operation == "noCommand") {
dudanian 2:c939d0501184 86 printf(" ERROR: speech not recognized\n\n\r");
dudanian 1:c47a2f0816bb 87 } else {
dudanian 2:c939d0501184 88 printf(" ERROR: not a valid command\n\n\r");
dudanian 1:c47a2f0816bb 89 }
dudanian 0:4e6ae21cbd31 90 }
dudanian 0:4e6ae21cbd31 91
dudanian 0:4e6ae21cbd31 92
dudanian 0:4e6ae21cbd31 93 /**
dudanian 0:4e6ae21cbd31 94 * Thread which updates the clock on the lcd while the main thread is waiting for
dudanian 0:4e6ae21cbd31 95 * or executing a command.
dudanian 0:4e6ae21cbd31 96 */
dudanian 0:4e6ae21cbd31 97 void lcdUpdateThread(void const *args) {
dudanian 0:4e6ae21cbd31 98 time_t time;
dudanian 0:4e6ae21cbd31 99 struct tm *timeinfo;
dudanian 0:4e6ae21cbd31 100 char buffer[20];
dudanian 0:4e6ae21cbd31 101
dudanian 0:4e6ae21cbd31 102 // set initial time
dudanian 0:4e6ae21cbd31 103 cMutex.lock();
dudanian 0:4e6ae21cbd31 104 clk.syncTime();
dudanian 0:4e6ae21cbd31 105 clk.setTimezone(-5);
dudanian 0:4e6ae21cbd31 106 cMutex.unlock();
dudanian 0:4e6ae21cbd31 107
dudanian 0:4e6ae21cbd31 108 // set lcd format
dudanian 0:4e6ae21cbd31 109 sMutex.lock();
dudanian 0:4e6ae21cbd31 110 uLCD.text_width(2);
dudanian 0:4e6ae21cbd31 111 uLCD.text_height(2);
dudanian 0:4e6ae21cbd31 112 uLCD.color(BLUE);
dudanian 0:4e6ae21cbd31 113 sMutex.unlock();
dudanian 0:4e6ae21cbd31 114
dudanian 0:4e6ae21cbd31 115 while (1) {
dudanian 0:4e6ae21cbd31 116 cMutex.lock();
dudanian 0:4e6ae21cbd31 117 time = clk.getTime();
dudanian 2:c939d0501184 118 bool alarmSet = clk.alarmSet();
dudanian 0:4e6ae21cbd31 119 cMutex.unlock();
dudanian 0:4e6ae21cbd31 120
dudanian 0:4e6ae21cbd31 121 timeinfo = localtime(&time);
dudanian 0:4e6ae21cbd31 122 strftime(buffer, 20, "%I:%M:%S %p", timeinfo);
dudanian 0:4e6ae21cbd31 123
dudanian 0:4e6ae21cbd31 124 sMutex.lock();
dudanian 0:4e6ae21cbd31 125 uLCD.locate(0,3);
dudanian 0:4e6ae21cbd31 126 uLCD.printf("%s", buffer);
dudanian 2:c939d0501184 127 if (alarmSet)
dudanian 2:c939d0501184 128 uLCD.printf("ALARM SET");
dudanian 2:c939d0501184 129 else
dudanian 2:c939d0501184 130 uLCD.printf(" ");
dudanian 0:4e6ae21cbd31 131 sMutex.unlock();
dudanian 2:c939d0501184 132 Thread::wait(200);
dudanian 0:4e6ae21cbd31 133 }
dudanian 0:4e6ae21cbd31 134 }
dudanian 0:4e6ae21cbd31 135
dudanian 2:c939d0501184 136 void init() {
dudanian 2:c939d0501184 137 printf("\r\n\n--Starting MbedClock--\n\r");
dudanian 2:c939d0501184 138
dudanian 0:4e6ae21cbd31 139 eth.init();
dudanian 2:c939d0501184 140 printf(" * Initialized Ethernet\n\r");
dudanian 1:c47a2f0816bb 141
dudanian 0:4e6ae21cbd31 142 eth.connect();
dudanian 2:c939d0501184 143 printf(" * Connected using DHCP\n\r");
dudanian 1:c47a2f0816bb 144 wait(5);
dudanian 2:c939d0501184 145 printf(" * Using IP: %s\n\r", eth.getIPAddress());
dudanian 0:4e6ae21cbd31 146
dudanian 1:c47a2f0816bb 147 easyVR.putc('b');
dudanian 1:c47a2f0816bb 148 easyVR.getc();
dudanian 2:c939d0501184 149 printf(" * Initialized EasyVR\n\r");
dudanian 2:c939d0501184 150
dudanian 2:c939d0501184 151
dudanian 2:c939d0501184 152 }
dudanian 2:c939d0501184 153
dudanian 3:b711df1f40cb 154 void waitForTrigger() {
dudanian 2:c939d0501184 155 // set EasyVR to 2 claps
dudanian 2:c939d0501184 156 sMutex.lock();
dudanian 2:c939d0501184 157 easyVR.putc('s');
dudanian 3:b711df1f40cb 158 easyVR.putc('A' + 1);
dudanian 2:c939d0501184 159 sMutex.unlock();
dudanian 2:c939d0501184 160 wait(0.2);
dudanian 1:c47a2f0816bb 161
dudanian 2:c939d0501184 162 // Clear buffer and wait for awake
dudanian 2:c939d0501184 163 printf("Waiting for trigger...");
dudanian 2:c939d0501184 164 sMutex.lock();
dudanian 2:c939d0501184 165 while (easyVR.readable())
dudanian 2:c939d0501184 166 easyVR.getc();
dudanian 2:c939d0501184 167 sMutex.unlock();
dudanian 2:c939d0501184 168 sleepLED = 1;
dudanian 2:c939d0501184 169 while(!easyVR.readable()) {
dudanian 2:c939d0501184 170 wait(0.2);
dudanian 2:c939d0501184 171 }
dudanian 2:c939d0501184 172 sleepLED = 0;
dudanian 2:c939d0501184 173 printf("trigger received!\n\r");
dudanian 2:c939d0501184 174 }
dudanian 2:c939d0501184 175
dudanian 3:b711df1f40cb 176 void waitForTrigger2() {
dudanian 2:c939d0501184 177 char rchar = 0;
dudanian 2:c939d0501184 178 sleepLED = 1;
dudanian 2:c939d0501184 179 printf("Waiting for trigger...");
dudanian 2:c939d0501184 180 while (rchar!='A') {
dudanian 2:c939d0501184 181 wait(.001);
dudanian 1:c47a2f0816bb 182 sMutex.lock();
dudanian 2:c939d0501184 183 easyVR.putc('d');
dudanian 2:c939d0501184 184 // a small delay is needed when sending EasyVR several characters
dudanian 2:c939d0501184 185 wait(.001);
dudanian 2:c939d0501184 186 easyVR.putc('A');
dudanian 1:c47a2f0816bb 187 sMutex.unlock();
dudanian 2:c939d0501184 188 while (!easyVR.readable()) {
dudanian 1:c47a2f0816bb 189 wait(0.2);
dudanian 1:c47a2f0816bb 190 }
dudanian 2:c939d0501184 191 sMutex.lock();
dudanian 2:c939d0501184 192 rchar=easyVR.getc();
dudanian 2:c939d0501184 193 sMutex.unlock();
dudanian 2:c939d0501184 194 // word recognized
dudanian 2:c939d0501184 195 if (rchar=='r') {
dudanian 2:c939d0501184 196 wait(.001);
dudanian 2:c939d0501184 197 sMutex.lock();
dudanian 2:c939d0501184 198 easyVR.putc(' ');
dudanian 2:c939d0501184 199 rchar=easyVR.getc();
dudanian 2:c939d0501184 200 sMutex.unlock();
dudanian 2:c939d0501184 201 // error
dudanian 2:c939d0501184 202 } else if (rchar=='e') {
dudanian 2:c939d0501184 203 wait(.001);
dudanian 2:c939d0501184 204 sMutex.lock();
dudanian 2:c939d0501184 205 easyVR.putc(' ');
dudanian 2:c939d0501184 206 rchar=easyVR.getc();
dudanian 2:c939d0501184 207 easyVR.putc(' ');
dudanian 2:c939d0501184 208 rchar=easyVR.getc();
dudanian 2:c939d0501184 209 sMutex.unlock();
dudanian 2:c939d0501184 210 }
dudanian 2:c939d0501184 211 }
dudanian 2:c939d0501184 212 sleepLED = 0;
dudanian 2:c939d0501184 213 printf("trigger received!\n\r");
dudanian 2:c939d0501184 214 }
dudanian 2:c939d0501184 215
dudanian 2:c939d0501184 216 void sendFile() {
dudanian 2:c939d0501184 217 printf(" Sending \"%s\"...", REC_NAME);
dudanian 2:c939d0501184 218 FILE *fp = fopen(REC_NAME, "rb");
dudanian 2:c939d0501184 219
dudanian 2:c939d0501184 220 int sum = 0;
dudanian 2:c939d0501184 221 while (sum < 110296)
dudanian 2:c939d0501184 222 {
dudanian 2:c939d0501184 223 int i = fread(buf, 1, BUF_SIZE, fp);
dudanian 2:c939d0501184 224 server.send(buf, i);
dudanian 2:c939d0501184 225 sum += i;
dudanian 2:c939d0501184 226 }
dudanian 2:c939d0501184 227 printf("sent\n\r");
dudanian 2:c939d0501184 228 fclose(fp);
dudanian 2:c939d0501184 229
dudanian 2:c939d0501184 230 int n = server.receive(buf, BUF_SIZE);
dudanian 2:c939d0501184 231 buf[n] = '\0';
dudanian 2:c939d0501184 232 printf(" Received \"%s\"\n\n\r", buf);
dudanian 2:c939d0501184 233 }
dudanian 2:c939d0501184 234
dudanian 2:c939d0501184 235 int main() {
dudanian 2:c939d0501184 236 init();
dudanian 2:c939d0501184 237 //RtosTimer alarmTimer(aThread, osTimerOnce, NULL);
dudanian 2:c939d0501184 238
dudanian 2:c939d0501184 239
dudanian 2:c939d0501184 240 Thread alarmThread(aThread);
dudanian 2:c939d0501184 241 Thread updateThread(lcdUpdateThread);
dudanian 2:c939d0501184 242 printf(" * Started LCD and Alarm Threads\n\n\r");
dudanian 2:c939d0501184 243
dudanian 2:c939d0501184 244 cMutex.lock();
dudanian 2:c939d0501184 245 clk.setAlarmThread(&alarmThread);
dudanian 2:c939d0501184 246 cMutex.unlock();
dudanian 2:c939d0501184 247 while(1) {
dudanian 2:c939d0501184 248 waitForTrigger();
dudanian 2:c939d0501184 249
dudanian 2:c939d0501184 250 printf(" Recording audio file...");
dudanian 2:c939d0501184 251 rec(REC_NAME, 5);
dudanian 2:c939d0501184 252 printf("complete\n\r");
dudanian 2:c939d0501184 253 //wait(0.1);
dudanian 2:c939d0501184 254 //play(FILE_NAME);
dudanian 1:c47a2f0816bb 255
dudanian 1:c47a2f0816bb 256 if (!server.connect(SERVER_IP, SERVER_PORT)) {
dudanian 2:c939d0501184 257 printf(" Connected to %s\n\r", SERVER_IP);
dudanian 2:c939d0501184 258 sendFile();
dudanian 2:c939d0501184 259 execute(buf);
dudanian 1:c47a2f0816bb 260 server.close();
dudanian 1:c47a2f0816bb 261 } else {
dudanian 2:c939d0501184 262 printf(" Unable to connect to %s\n\n\r", SERVER_IP);
dudanian 2:c939d0501184 263 }
dudanian 0:4e6ae21cbd31 264 }
dudanian 0:4e6ae21cbd31 265 }