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:
Mon Dec 08 10:06:35 2014 +0000
Revision:
1:c47a2f0816bb
Parent:
0:4e6ae21cbd31
Child:
2:c939d0501184
Working after accidental delete.

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 0:4e6ae21cbd31 8 #include <string>
dudanian 1:c47a2f0816bb 9
dudanian 1:c47a2f0816bb 10 #define SERVER_IP "143.215.120.157"
dudanian 1:c47a2f0816bb 11 #define SERVER_PORT 13000
dudanian 1:c47a2f0816bb 12 #define FILE_NAME "/sd/test-rec.wav"
dudanian 1:c47a2f0816bb 13 #define BUF_SIZE 1024
dudanian 0:4e6ae21cbd31 14
dudanian 0:4e6ae21cbd31 15 uLCD_4DGL uLCD(p28,p27,p30);
dudanian 0:4e6ae21cbd31 16 Serial pc(USBTX, USBRX);
dudanian 1:c47a2f0816bb 17 Serial easyVR(p13, p14);
dudanian 1:c47a2f0816bb 18 SDFileSystem sdc(p5, p6, p7, p8, "sd");
dudanian 1:c47a2f0816bb 19 EthernetInterface eth;
dudanian 1:c47a2f0816bb 20 Clock clk;
dudanian 1:c47a2f0816bb 21
dudanian 1:c47a2f0816bb 22 DigitalOut sleepLED(LED4);
dudanian 0:4e6ae21cbd31 23 Mutex cMutex;
dudanian 0:4e6ae21cbd31 24 Mutex sMutex;
dudanian 1:c47a2f0816bb 25 char buf[BUF_SIZE];
dudanian 1:c47a2f0816bb 26
dudanian 0:4e6ae21cbd31 27
dudanian 1:c47a2f0816bb 28 void execute(char *command) {
dudanian 1:c47a2f0816bb 29 char buffer[12];
dudanian 1:c47a2f0816bb 30 int hour, minute, period, zone;
dudanian 1:c47a2f0816bb 31 sscanf(command, "%s %d %d %d %d", buffer, &hour, &minute, &period, &zone);
dudanian 1:c47a2f0816bb 32 string operation(buffer);
dudanian 1:c47a2f0816bb 33
dudanian 1:c47a2f0816bb 34 if (operation == "setTime") {
dudanian 1:c47a2f0816bb 35 cMutex.lock();
dudanian 1:c47a2f0816bb 36 clk.setTime(hour, minute, period);
dudanian 1:c47a2f0816bb 37 cMutex.unlock();
dudanian 1:c47a2f0816bb 38 } else if (operation == "setTimezone") {
dudanian 1:c47a2f0816bb 39 cMutex.lock();
dudanian 1:c47a2f0816bb 40 clk.setTimezone(zone);
dudanian 1:c47a2f0816bb 41 cMutex.unlock();
dudanian 1:c47a2f0816bb 42 } else if (operation == "sync") {
dudanian 1:c47a2f0816bb 43 cMutex.lock();
dudanian 1:c47a2f0816bb 44 if (clk.syncTime() != 0) {
dudanian 1:c47a2f0816bb 45 sMutex.lock();
dudanian 1:c47a2f0816bb 46 pc.printf("Error syncing time\n\r");
dudanian 1:c47a2f0816bb 47 sMutex.unlock();
dudanian 1:c47a2f0816bb 48 }
dudanian 1:c47a2f0816bb 49 cMutex.unlock();
dudanian 1:c47a2f0816bb 50 } else {
dudanian 0:4e6ae21cbd31 51 sMutex.lock();
dudanian 1:c47a2f0816bb 52 pc.printf("Not a valid command\n\r");
dudanian 0:4e6ae21cbd31 53 sMutex.unlock();
dudanian 1:c47a2f0816bb 54 }
dudanian 0:4e6ae21cbd31 55 }
dudanian 0:4e6ae21cbd31 56
dudanian 0:4e6ae21cbd31 57
dudanian 0:4e6ae21cbd31 58 /**
dudanian 0:4e6ae21cbd31 59 * Thread which updates the clock on the lcd while the main thread is waiting for
dudanian 0:4e6ae21cbd31 60 * or executing a command.
dudanian 0:4e6ae21cbd31 61 */
dudanian 0:4e6ae21cbd31 62 void lcdUpdateThread(void const *args) {
dudanian 0:4e6ae21cbd31 63 time_t time;
dudanian 0:4e6ae21cbd31 64 struct tm *timeinfo;
dudanian 0:4e6ae21cbd31 65 char buffer[20];
dudanian 0:4e6ae21cbd31 66
dudanian 0:4e6ae21cbd31 67 // set initial time
dudanian 0:4e6ae21cbd31 68 cMutex.lock();
dudanian 0:4e6ae21cbd31 69 clk.syncTime();
dudanian 0:4e6ae21cbd31 70 clk.setTimezone(-5);
dudanian 0:4e6ae21cbd31 71 cMutex.unlock();
dudanian 0:4e6ae21cbd31 72
dudanian 0:4e6ae21cbd31 73 // set lcd format
dudanian 0:4e6ae21cbd31 74 sMutex.lock();
dudanian 0:4e6ae21cbd31 75 uLCD.text_width(2);
dudanian 0:4e6ae21cbd31 76 uLCD.text_height(2);
dudanian 0:4e6ae21cbd31 77 uLCD.color(BLUE);
dudanian 0:4e6ae21cbd31 78 sMutex.unlock();
dudanian 0:4e6ae21cbd31 79
dudanian 0:4e6ae21cbd31 80 while (1) {
dudanian 0:4e6ae21cbd31 81 cMutex.lock();
dudanian 0:4e6ae21cbd31 82 time = clk.getTime();
dudanian 0:4e6ae21cbd31 83 cMutex.unlock();
dudanian 0:4e6ae21cbd31 84
dudanian 0:4e6ae21cbd31 85 timeinfo = localtime(&time);
dudanian 0:4e6ae21cbd31 86 strftime(buffer, 20, "%I:%M:%S %p", timeinfo);
dudanian 0:4e6ae21cbd31 87
dudanian 0:4e6ae21cbd31 88 sMutex.lock();
dudanian 0:4e6ae21cbd31 89 uLCD.locate(0,3);
dudanian 0:4e6ae21cbd31 90 uLCD.printf("%s", buffer);
dudanian 0:4e6ae21cbd31 91 sMutex.unlock();
dudanian 0:4e6ae21cbd31 92 Thread::wait(0.25);
dudanian 0:4e6ae21cbd31 93 }
dudanian 0:4e6ae21cbd31 94 }
dudanian 0:4e6ae21cbd31 95
dudanian 0:4e6ae21cbd31 96 /**
dudanian 0:4e6ae21cbd31 97 * main function which loops getting a command, parsing that command, and executing
dudanian 0:4e6ae21cbd31 98 * that command. It also starts a thread which updates the clock separate from the
dudanian 0:4e6ae21cbd31 99 * command execution.
dudanian 0:4e6ae21cbd31 100 */
dudanian 0:4e6ae21cbd31 101 int main() {
dudanian 1:c47a2f0816bb 102 pc.printf("Starting MbedClock\n\r");
dudanian 0:4e6ae21cbd31 103
dudanian 0:4e6ae21cbd31 104 eth.init();
dudanian 1:c47a2f0816bb 105 pc.printf("Ititialized Ethernet\n\r");
dudanian 1:c47a2f0816bb 106
dudanian 0:4e6ae21cbd31 107 eth.connect();
dudanian 1:c47a2f0816bb 108 pc.printf("Connected using DHCP\n\r");
dudanian 1:c47a2f0816bb 109 wait(5);
dudanian 1:c47a2f0816bb 110 pc.printf("Using IP: %s\n\r", eth.getIPAddress());
dudanian 0:4e6ae21cbd31 111
dudanian 1:c47a2f0816bb 112 easyVR.putc('b');
dudanian 1:c47a2f0816bb 113 easyVR.getc();
dudanian 1:c47a2f0816bb 114 pc.printf("Initialized EasyVR\n\r");
dudanian 1:c47a2f0816bb 115
dudanian 0:4e6ae21cbd31 116 Thread updateThread(lcdUpdateThread);
dudanian 1:c47a2f0816bb 117 //sMutex.lock();
dudanian 1:c47a2f0816bb 118 pc.printf("Started LCDThread\n\n\r");
dudanian 1:c47a2f0816bb 119 //sMutex.unlock();
dudanian 1:c47a2f0816bb 120
dudanian 1:c47a2f0816bb 121 while(1) {
dudanian 1:c47a2f0816bb 122 // set EasyVR to 3 claps
dudanian 1:c47a2f0816bb 123 sMutex.lock();
dudanian 1:c47a2f0816bb 124 easyVR.putc('s');
dudanian 1:c47a2f0816bb 125 easyVR.putc('A' + 4);
dudanian 1:c47a2f0816bb 126 sMutex.unlock();
dudanian 1:c47a2f0816bb 127 wait(0.2);
dudanian 1:c47a2f0816bb 128
dudanian 1:c47a2f0816bb 129 // Clear buffer and wait for awake
dudanian 1:c47a2f0816bb 130 sMutex.lock();
dudanian 1:c47a2f0816bb 131 while (easyVR.readable())
dudanian 1:c47a2f0816bb 132 easyVR.getc();
dudanian 1:c47a2f0816bb 133 sMutex.unlock();
dudanian 1:c47a2f0816bb 134 sleepLED = 1;
dudanian 1:c47a2f0816bb 135 while(!easyVR.readable()) {
dudanian 1:c47a2f0816bb 136 wait(0.2);
dudanian 1:c47a2f0816bb 137 }
dudanian 1:c47a2f0816bb 138 sleepLED = 0;
dudanian 1:c47a2f0816bb 139 rec(FILE_NAME, 5);
dudanian 1:c47a2f0816bb 140
dudanian 1:c47a2f0816bb 141 TCPSocketConnection server;
dudanian 1:c47a2f0816bb 142 if (!server.connect(SERVER_IP, SERVER_PORT)) {
dudanian 1:c47a2f0816bb 143 printf("Connected to %s\n\r", SERVER_IP);
dudanian 1:c47a2f0816bb 144 FILE *fp = fopen(FILE_NAME, "rb");
dudanian 1:c47a2f0816bb 145
dudanian 1:c47a2f0816bb 146 printf(" Sending %s\n\r", FILE_NAME);
dudanian 1:c47a2f0816bb 147 int sum = 0;
dudanian 1:c47a2f0816bb 148 while (sum < 110296)
dudanian 1:c47a2f0816bb 149 {
dudanian 1:c47a2f0816bb 150 int i = fread(buf, 1, BUF_SIZE, fp);
dudanian 1:c47a2f0816bb 151 server.send(buf, i);
dudanian 1:c47a2f0816bb 152 sum += i;
dudanian 1:c47a2f0816bb 153 }
dudanian 1:c47a2f0816bb 154 int n = server.receive(buf, BUF_SIZE);
dudanian 1:c47a2f0816bb 155 buf[n] = '\0';
dudanian 1:c47a2f0816bb 156 printf(" Received: %s\n\n\r", buf);
dudanian 1:c47a2f0816bb 157 server.close();
dudanian 1:c47a2f0816bb 158 } else {
dudanian 1:c47a2f0816bb 159 printf("Unable to connect to %s\n\r", SERVER_IP);
dudanian 1:c47a2f0816bb 160 }
dudanian 0:4e6ae21cbd31 161 }
dudanian 0:4e6ae21cbd31 162 }