Student project by David Berlin and Boris Dogadov made for the Embedded Systems Workshop course given in Tel-Aviv University on 2010 by Sivan Toledo. Visit the project website for more details: http://davidberlin.co.il/sadna/ .

Dependencies:   EthernetNetIf NTPClient_NetServices mbed HTTPServer HTTPClient CyaSSL

Committer:
sivan_toledo
Date:
Sun Apr 17 21:30:10 2011 +0000
Revision:
0:3e7d6f496a67
Child:
1:b05231650f32

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sivan_toledo 0:3e7d6f496a67 1 /*
sivan_toledo 0:3e7d6f496a67 2 Copyright (c) 2010 Peter Barrett
sivan_toledo 0:3e7d6f496a67 3
sivan_toledo 0:3e7d6f496a67 4 Permission is hereby granted, free of charge, to any person obtaining a copy
sivan_toledo 0:3e7d6f496a67 5 of this software and associated documentation files (the "Software"), to deal
sivan_toledo 0:3e7d6f496a67 6 in the Software without restriction, including without limitation the rights
sivan_toledo 0:3e7d6f496a67 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
sivan_toledo 0:3e7d6f496a67 8 copies of the Software, and to permit persons to whom the Software is
sivan_toledo 0:3e7d6f496a67 9 furnished to do so, subject to the following conditions:
sivan_toledo 0:3e7d6f496a67 10
sivan_toledo 0:3e7d6f496a67 11 The above copyright notice and this permission notice shall be included in
sivan_toledo 0:3e7d6f496a67 12 all copies or substantial portions of the Software.
sivan_toledo 0:3e7d6f496a67 13
sivan_toledo 0:3e7d6f496a67 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
sivan_toledo 0:3e7d6f496a67 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
sivan_toledo 0:3e7d6f496a67 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
sivan_toledo 0:3e7d6f496a67 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
sivan_toledo 0:3e7d6f496a67 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sivan_toledo 0:3e7d6f496a67 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
sivan_toledo 0:3e7d6f496a67 20 THE SOFTWARE.
sivan_toledo 0:3e7d6f496a67 21 */
sivan_toledo 0:3e7d6f496a67 22
sivan_toledo 0:3e7d6f496a67 23 #include "mbed.h"
sivan_toledo 0:3e7d6f496a67 24 #include "USBHost.h"
sivan_toledo 0:3e7d6f496a67 25 #include "Utils.h"
sivan_toledo 0:3e7d6f496a67 26 #include "UsbStorage.h"
sivan_toledo 0:3e7d6f496a67 27
sivan_toledo 0:3e7d6f496a67 28 #include "EthernetNetIf.h"
sivan_toledo 0:3e7d6f496a67 29 #include "HTTPClient.h"
sivan_toledo 0:3e7d6f496a67 30 #include "Dropbox.h"
sivan_toledo 0:3e7d6f496a67 31 #include "HTTPServer.h"
sivan_toledo 0:3e7d6f496a67 32 #include "HttpHandlerSetup.h"
sivan_toledo 0:3e7d6f496a67 33 #include "HttpHandlerUsbBrowser.h"
sivan_toledo 0:3e7d6f496a67 34 #include "HTTPFileSender.h"
sivan_toledo 0:3e7d6f496a67 35 #include "base64.h"
sivan_toledo 0:3e7d6f496a67 36 #include "url.h"
sivan_toledo 0:3e7d6f496a67 37 #include "ctc_hmac.h"
sivan_toledo 0:3e7d6f496a67 38 #include "NTPClient.h"
sivan_toledo 0:3e7d6f496a67 39 #include "HTTPData.h"
sivan_toledo 0:3e7d6f496a67 40
sivan_toledo 0:3e7d6f496a67 41 void test_dropbox();
sivan_toledo 0:3e7d6f496a67 42
sivan_toledo 0:3e7d6f496a67 43 // USB
sivan_toledo 0:3e7d6f496a67 44 Serial pc(USBTX, USBRX);
sivan_toledo 0:3e7d6f496a67 45 USBFileSystem fs;
sivan_toledo 0:3e7d6f496a67 46 int usbDevice = -1;
sivan_toledo 0:3e7d6f496a67 47
sivan_toledo 0:3e7d6f496a67 48 // NET
sivan_toledo 0:3e7d6f496a67 49 EthernetNetIf* eth;
sivan_toledo 0:3e7d6f496a67 50
sivan_toledo 0:3e7d6f496a67 51 // LED
sivan_toledo 0:3e7d6f496a67 52 DigitalOut led1(LED1);
sivan_toledo 0:3e7d6f496a67 53 DigitalOut led2(LED2);
sivan_toledo 0:3e7d6f496a67 54 DigitalOut led3(LED3);
sivan_toledo 0:3e7d6f496a67 55
sivan_toledo 0:3e7d6f496a67 56 int OnDiskInsert(int device)
sivan_toledo 0:3e7d6f496a67 57 {
sivan_toledo 0:3e7d6f496a67 58 printf("\r\nOnDiskInsert\r\n");
sivan_toledo 0:3e7d6f496a67 59
sivan_toledo 0:3e7d6f496a67 60 usbDevice = device;
sivan_toledo 0:3e7d6f496a67 61 fs.SetDevice(usbDevice);
sivan_toledo 0:3e7d6f496a67 62
sivan_toledo 0:3e7d6f496a67 63 return 0;
sivan_toledo 0:3e7d6f496a67 64 }
sivan_toledo 0:3e7d6f496a67 65
sivan_toledo 0:3e7d6f496a67 66
sivan_toledo 0:3e7d6f496a67 67 bool setup_eth()
sivan_toledo 0:3e7d6f496a67 68 {
sivan_toledo 0:3e7d6f496a67 69 printf("\r\nSetting up...\r\n");
sivan_toledo 0:3e7d6f496a67 70
sivan_toledo 0:3e7d6f496a67 71 EthernetErr ethErr = eth->setup();
sivan_toledo 0:3e7d6f496a67 72 if(ethErr)
sivan_toledo 0:3e7d6f496a67 73 {
sivan_toledo 0:3e7d6f496a67 74 printf("Error %d in setup.\n", ethErr);
sivan_toledo 0:3e7d6f496a67 75 return false;
sivan_toledo 0:3e7d6f496a67 76 }
sivan_toledo 0:3e7d6f496a67 77 printf("\r\nSetup OK\r\n");
sivan_toledo 0:3e7d6f496a67 78
sivan_toledo 0:3e7d6f496a67 79 return true;
sivan_toledo 0:3e7d6f496a67 80 }
sivan_toledo 0:3e7d6f496a67 81
sivan_toledo 0:3e7d6f496a67 82 bool setup_httpServer(HTTPServer& svr)
sivan_toledo 0:3e7d6f496a67 83 {
sivan_toledo 0:3e7d6f496a67 84 svr.addHandler<HttpHandlerUsbBrowser>("/UsbBrowser");
sivan_toledo 0:3e7d6f496a67 85 svr.addHandler<HttpHandlerSetup>("/");
sivan_toledo 0:3e7d6f496a67 86 svr.bind(80);
sivan_toledo 0:3e7d6f496a67 87
sivan_toledo 0:3e7d6f496a67 88 printf("Http Server initialized\r\n");
sivan_toledo 0:3e7d6f496a67 89
sivan_toledo 0:3e7d6f496a67 90 return true;
sivan_toledo 0:3e7d6f496a67 91 }
sivan_toledo 0:3e7d6f496a67 92
sivan_toledo 0:3e7d6f496a67 93 bool upload_files(char* username, char* password)
sivan_toledo 0:3e7d6f496a67 94 {
sivan_toledo 0:3e7d6f496a67 95 DIR *d = opendir("/usb/DROPBOX"); //TODO - global
sivan_toledo 0:3e7d6f496a67 96 int totalFiles = -1;
sivan_toledo 0:3e7d6f496a67 97 if (d)
sivan_toledo 0:3e7d6f496a67 98 {
sivan_toledo 0:3e7d6f496a67 99 char filenameSrc[64] = "/usb/DROPBOX/";
sivan_toledo 0:3e7d6f496a67 100 char filenameDst[32] = "USBSYNC_"; //TODO - remove?
sivan_toledo 0:3e7d6f496a67 101 int c = 0;
sivan_toledo 0:3e7d6f496a67 102
sivan_toledo 0:3e7d6f496a67 103 printf("Synchronize Start\n\r");
sivan_toledo 0:3e7d6f496a67 104 if (!dropbox_syncTime())
sivan_toledo 0:3e7d6f496a67 105 {
sivan_toledo 0:3e7d6f496a67 106 printf("Failed to sync time");
sivan_toledo 0:3e7d6f496a67 107 led3 = 1;
sivan_toledo 0:3e7d6f496a67 108 return totalFiles;
sivan_toledo 0:3e7d6f496a67 109 }
sivan_toledo 0:3e7d6f496a67 110 if (!dropbox_getToken(username, password))
sivan_toledo 0:3e7d6f496a67 111 {
sivan_toledo 0:3e7d6f496a67 112 printf("Failed getting token\r\n");
sivan_toledo 0:3e7d6f496a67 113 led3 = 1;
sivan_toledo 0:3e7d6f496a67 114 return totalFiles;
sivan_toledo 0:3e7d6f496a67 115 }
sivan_toledo 0:3e7d6f496a67 116
sivan_toledo 0:3e7d6f496a67 117 struct dirent *p = readdir(d);
sivan_toledo 0:3e7d6f496a67 118 while (p)
sivan_toledo 0:3e7d6f496a67 119 {
sivan_toledo 0:3e7d6f496a67 120 strcpy(filenameSrc + 13, p->d_name);
sivan_toledo 0:3e7d6f496a67 121 strcpy(filenameDst + 8, p->d_name);
sivan_toledo 0:3e7d6f496a67 122 printf("Uploading %s to %s\r\n", filenameSrc, filenameDst);
sivan_toledo 0:3e7d6f496a67 123
sivan_toledo 0:3e7d6f496a67 124 dropbox_upload(filenameSrc, filenameDst);
sivan_toledo 0:3e7d6f496a67 125 c++;
sivan_toledo 0:3e7d6f496a67 126 p = readdir(d);
sivan_toledo 0:3e7d6f496a67 127 }
sivan_toledo 0:3e7d6f496a67 128
sivan_toledo 0:3e7d6f496a67 129 closedir(d);
sivan_toledo 0:3e7d6f496a67 130
sivan_toledo 0:3e7d6f496a67 131 totalFiles = c;
sivan_toledo 0:3e7d6f496a67 132 printf("Synchronizing finished (%d)\n\r", totalFiles);
sivan_toledo 0:3e7d6f496a67 133 led2 = 1;
sivan_toledo 0:3e7d6f496a67 134
sivan_toledo 0:3e7d6f496a67 135 return totalFiles;
sivan_toledo 0:3e7d6f496a67 136 }
sivan_toledo 0:3e7d6f496a67 137 else
sivan_toledo 0:3e7d6f496a67 138 {
sivan_toledo 0:3e7d6f496a67 139 led3 = 1;
sivan_toledo 0:3e7d6f496a67 140 printf("Failed opening /usb/DROPBOX/\r\n");
sivan_toledo 0:3e7d6f496a67 141 return totalFiles;
sivan_toledo 0:3e7d6f496a67 142 }
sivan_toledo 0:3e7d6f496a67 143 }
sivan_toledo 0:3e7d6f496a67 144
sivan_toledo 0:3e7d6f496a67 145 int main()
sivan_toledo 0:3e7d6f496a67 146 {
sivan_toledo 0:3e7d6f496a67 147 bool ethSetup = false, httpSetup = false;
sivan_toledo 0:3e7d6f496a67 148 USBInit();
sivan_toledo 0:3e7d6f496a67 149 HTTPServer svr;
sivan_toledo 0:3e7d6f496a67 150
sivan_toledo 0:3e7d6f496a67 151 int i = 0;
sivan_toledo 0:3e7d6f496a67 152
sivan_toledo 0:3e7d6f496a67 153 led3 = 0; // clear error LED
sivan_toledo 0:3e7d6f496a67 154
sivan_toledo 0:3e7d6f496a67 155 for (;;)
sivan_toledo 0:3e7d6f496a67 156 {
sivan_toledo 0:3e7d6f496a67 157 if (i++ % 500000 == 0) printf("looping\r\n"); //TODO replace with time
sivan_toledo 0:3e7d6f496a67 158
sivan_toledo 0:3e7d6f496a67 159 USBLoop();
sivan_toledo 0:3e7d6f496a67 160 Net::poll();
sivan_toledo 0:3e7d6f496a67 161
sivan_toledo 0:3e7d6f496a67 162 if (!ethSetup)
sivan_toledo 0:3e7d6f496a67 163 {
sivan_toledo 0:3e7d6f496a67 164 eth = new EthernetNetIf();
sivan_toledo 0:3e7d6f496a67 165 ethSetup = setup_eth();
sivan_toledo 0:3e7d6f496a67 166
sivan_toledo 0:3e7d6f496a67 167 if (!ethSetup)
sivan_toledo 0:3e7d6f496a67 168 {
sivan_toledo 0:3e7d6f496a67 169 delete eth;
sivan_toledo 0:3e7d6f496a67 170 eth = 0;
sivan_toledo 0:3e7d6f496a67 171 }
sivan_toledo 0:3e7d6f496a67 172
sivan_toledo 0:3e7d6f496a67 173 httpSetup = false;
sivan_toledo 0:3e7d6f496a67 174 }
sivan_toledo 0:3e7d6f496a67 175
sivan_toledo 0:3e7d6f496a67 176 if (ethSetup && !httpSetup)
sivan_toledo 0:3e7d6f496a67 177 {
sivan_toledo 0:3e7d6f496a67 178 httpSetup = setup_httpServer(svr);
sivan_toledo 0:3e7d6f496a67 179 }
sivan_toledo 0:3e7d6f496a67 180
sivan_toledo 0:3e7d6f496a67 181 // Cehck if Ethernet setup and USB-Disk connected
sivan_toledo 0:3e7d6f496a67 182 if (usbDevice >= 0 && ethSetup)
sivan_toledo 0:3e7d6f496a67 183 {
sivan_toledo 0:3e7d6f496a67 184 usbDevice = -1;
sivan_toledo 0:3e7d6f496a67 185
sivan_toledo 0:3e7d6f496a67 186 led1 = 1;
sivan_toledo 0:3e7d6f496a67 187 led2 = 0;
sivan_toledo 0:3e7d6f496a67 188
sivan_toledo 0:3e7d6f496a67 189 // Read username/password
sivan_toledo 0:3e7d6f496a67 190 char username[32] = {0};
sivan_toledo 0:3e7d6f496a67 191 char password[32] = {0};
sivan_toledo 0:3e7d6f496a67 192 if (!ReadSettings(username, password))
sivan_toledo 0:3e7d6f496a67 193 {
sivan_toledo 0:3e7d6f496a67 194 printf("Failed opening /usb/DBSet.txt\r\n");
sivan_toledo 0:3e7d6f496a67 195 led3 = 1;
sivan_toledo 0:3e7d6f496a67 196 continue;
sivan_toledo 0:3e7d6f496a67 197 }
sivan_toledo 0:3e7d6f496a67 198
sivan_toledo 0:3e7d6f496a67 199 // Start synchronizing
sivan_toledo 0:3e7d6f496a67 200 int totalFiles = upload_files(username, password);
sivan_toledo 0:3e7d6f496a67 201
sivan_toledo 0:3e7d6f496a67 202 FILE* logFile = fopen("/usb/dbLog.txt", "a+");
sivan_toledo 0:3e7d6f496a67 203 if (logFile)
sivan_toledo 0:3e7d6f496a67 204 {
sivan_toledo 0:3e7d6f496a67 205 if (totalFiles >= 0)
sivan_toledo 0:3e7d6f496a67 206 fprintf(logFile, "%d Synchronizing successfull %d files\r\n", time(NULL), totalFiles);
sivan_toledo 0:3e7d6f496a67 207 else
sivan_toledo 0:3e7d6f496a67 208 fputs("Synchronizing failed\r\n", logFile); //TODO whats this?
sivan_toledo 0:3e7d6f496a67 209
sivan_toledo 0:3e7d6f496a67 210 fclose(logFile);
sivan_toledo 0:3e7d6f496a67 211 }
sivan_toledo 0:3e7d6f496a67 212
sivan_toledo 0:3e7d6f496a67 213 led1 = 0;
sivan_toledo 0:3e7d6f496a67 214 ClearPortPower();
sivan_toledo 0:3e7d6f496a67 215 }
sivan_toledo 0:3e7d6f496a67 216 }
sivan_toledo 0:3e7d6f496a67 217 }