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
main.cpp@0:3e7d6f496a67, 2011-04-17 (annotated)
- Committer:
- sivan_toledo
- Date:
- Sun Apr 17 21:30:10 2011 +0000
- Revision:
- 0:3e7d6f496a67
- Child:
- 1:b05231650f32
Who changed what in which revision?
User | Revision | Line number | New 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 | } |