Updated Wiflash
Dependents: wiflash-demo-blinkk wiflashdemo
wiflash.cpp@0:30192d068543, 2015-05-01 (annotated)
- Committer:
- adhithyan15
- Date:
- Fri May 01 15:03:29 2015 +0000
- Revision:
- 0:30192d068543
Updated
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
adhithyan15 | 0:30192d068543 | 1 | #include "wiflash.h" |
adhithyan15 | 0:30192d068543 | 2 | #include "rtos.h" |
adhithyan15 | 0:30192d068543 | 3 | #include <fstream> |
adhithyan15 | 0:30192d068543 | 4 | #include <stdio.h> |
adhithyan15 | 0:30192d068543 | 5 | #include <string> |
adhithyan15 | 0:30192d068543 | 6 | #define IAP_LOCATION 0x1FFF1FF1 |
adhithyan15 | 0:30192d068543 | 7 | #define START_THREAD 1 |
adhithyan15 | 0:30192d068543 | 8 | extern "C" void mbed_reset(); |
adhithyan15 | 0:30192d068543 | 9 | |
adhithyan15 | 0:30192d068543 | 10 | Serial pc(USBTX,USBRX); |
adhithyan15 | 0:30192d068543 | 11 | typedef void (*IAP)(unsigned long [], unsigned long[] ); |
adhithyan15 | 0:30192d068543 | 12 | IAP iap_entry = (IAP) IAP_LOCATION; |
adhithyan15 | 0:30192d068543 | 13 | Mutex stdio_mutex; |
adhithyan15 | 0:30192d068543 | 14 | Thread *t; |
adhithyan15 | 0:30192d068543 | 15 | |
adhithyan15 | 0:30192d068543 | 16 | void listdir(void) { |
adhithyan15 | 0:30192d068543 | 17 | DIR *d; |
adhithyan15 | 0:30192d068543 | 18 | struct dirent *p; |
adhithyan15 | 0:30192d068543 | 19 | string l; |
adhithyan15 | 0:30192d068543 | 20 | string full_file_name; |
adhithyan15 | 0:30192d068543 | 21 | string test1 = "_LPC1768.BIN"; |
adhithyan15 | 0:30192d068543 | 22 | string test2 = "MBED.HTM"; |
adhithyan15 | 0:30192d068543 | 23 | string test3 = "WIFLASH.TXT"; |
adhithyan15 | 0:30192d068543 | 24 | d = opendir("/local"); |
adhithyan15 | 0:30192d068543 | 25 | int ret; |
adhithyan15 | 0:30192d068543 | 26 | if (d != NULL) { |
adhithyan15 | 0:30192d068543 | 27 | while ((p = readdir(d)) != NULL) { |
adhithyan15 | 0:30192d068543 | 28 | l = string(p->d_name); |
adhithyan15 | 0:30192d068543 | 29 | |
adhithyan15 | 0:30192d068543 | 30 | if(l != test1 && l != test2 && l != test3){ |
adhithyan15 | 0:30192d068543 | 31 | full_file_name = string("/local/") + l; |
adhithyan15 | 0:30192d068543 | 32 | ret = remove(full_file_name.c_str()); |
adhithyan15 | 0:30192d068543 | 33 | if(ret == 0) |
adhithyan15 | 0:30192d068543 | 34 | { |
adhithyan15 | 0:30192d068543 | 35 | printf("File deleted successfully\n"); |
adhithyan15 | 0:30192d068543 | 36 | } |
adhithyan15 | 0:30192d068543 | 37 | else |
adhithyan15 | 0:30192d068543 | 38 | { |
adhithyan15 | 0:30192d068543 | 39 | printf("Error: unable to delete the file\n"); |
adhithyan15 | 0:30192d068543 | 40 | } |
adhithyan15 | 0:30192d068543 | 41 | } |
adhithyan15 | 0:30192d068543 | 42 | } |
adhithyan15 | 0:30192d068543 | 43 | } else { |
adhithyan15 | 0:30192d068543 | 44 | printf("Could not open directory!\n"); |
adhithyan15 | 0:30192d068543 | 45 | } |
adhithyan15 | 0:30192d068543 | 46 | closedir(d); |
adhithyan15 | 0:30192d068543 | 47 | mbed_reset(); |
adhithyan15 | 0:30192d068543 | 48 | } |
adhithyan15 | 0:30192d068543 | 49 | |
adhithyan15 | 0:30192d068543 | 50 | Wiflash::Wiflash() : local("local"){ |
adhithyan15 | 0:30192d068543 | 51 | |
adhithyan15 | 0:30192d068543 | 52 | } |
adhithyan15 | 0:30192d068543 | 53 | |
adhithyan15 | 0:30192d068543 | 54 | string get_serial_number(){ |
adhithyan15 | 0:30192d068543 | 55 | unsigned long command[5] = {0,0,0,0,0}; |
adhithyan15 | 0:30192d068543 | 56 | unsigned long result[5] = {0,0,0,0,0}; |
adhithyan15 | 0:30192d068543 | 57 | command[0] = 58; // read device serial number |
adhithyan15 | 0:30192d068543 | 58 | iap_entry(command, result); |
adhithyan15 | 0:30192d068543 | 59 | string output; |
adhithyan15 | 0:30192d068543 | 60 | stringstream out; |
adhithyan15 | 0:30192d068543 | 61 | if (result[0] == 0) { |
adhithyan15 | 0:30192d068543 | 62 | for(int i = 1; i < 5; i++) { |
adhithyan15 | 0:30192d068543 | 63 | out << result[i]; |
adhithyan15 | 0:30192d068543 | 64 | } |
adhithyan15 | 0:30192d068543 | 65 | } else { |
adhithyan15 | 0:30192d068543 | 66 | printf("Status error!\r\n"); |
adhithyan15 | 0:30192d068543 | 67 | } |
adhithyan15 | 0:30192d068543 | 68 | output = out.str(); |
adhithyan15 | 0:30192d068543 | 69 | return output; |
adhithyan15 | 0:30192d068543 | 70 | |
adhithyan15 | 0:30192d068543 | 71 | } |
adhithyan15 | 0:30192d068543 | 72 | |
adhithyan15 | 0:30192d068543 | 73 | |
adhithyan15 | 0:30192d068543 | 74 | |
adhithyan15 | 0:30192d068543 | 75 | void check_for_new_firmware(void const *args) { |
adhithyan15 | 0:30192d068543 | 76 | |
adhithyan15 | 0:30192d068543 | 77 | while (true) { |
adhithyan15 | 0:30192d068543 | 78 | TCPSocketConnection sock; |
adhithyan15 | 0:30192d068543 | 79 | sock.connect("104.236.198.189", 80); |
adhithyan15 | 0:30192d068543 | 80 | stdio_mutex.lock(); |
adhithyan15 | 0:30192d068543 | 81 | pc.printf("I am here\n"); |
adhithyan15 | 0:30192d068543 | 82 | char url_buffer[100]; |
adhithyan15 | 0:30192d068543 | 83 | pc.printf("I am here 2\n"); |
adhithyan15 | 0:30192d068543 | 84 | sprintf (url_buffer, "GET /firmware_check/%s.json HTTP/1.0\n\n", get_serial_number().c_str()); |
adhithyan15 | 0:30192d068543 | 85 | pc.printf(url_buffer); |
adhithyan15 | 0:30192d068543 | 86 | sock.send_all(url_buffer, sizeof(url_buffer)-1); |
adhithyan15 | 0:30192d068543 | 87 | char buffer[600]; |
adhithyan15 | 0:30192d068543 | 88 | int ret; |
adhithyan15 | 0:30192d068543 | 89 | int total_chars = 0; |
adhithyan15 | 0:30192d068543 | 90 | while (true) { |
adhithyan15 | 0:30192d068543 | 91 | ret = sock.receive(buffer, sizeof(buffer)-1); |
adhithyan15 | 0:30192d068543 | 92 | if (ret <= 0) |
adhithyan15 | 0:30192d068543 | 93 | break; |
adhithyan15 | 0:30192d068543 | 94 | buffer[ret] = '\0'; |
adhithyan15 | 0:30192d068543 | 95 | if(ret == 25){ |
adhithyan15 | 0:30192d068543 | 96 | pc.printf("Received the timestamp %s\n", buffer); |
adhithyan15 | 0:30192d068543 | 97 | pc.printf("%d\n",ret); |
adhithyan15 | 0:30192d068543 | 98 | FILE *ptr = fopen("/local/wiflash.txt", "r"); |
adhithyan15 | 0:30192d068543 | 99 | char str[30]; |
adhithyan15 | 0:30192d068543 | 100 | int i; |
adhithyan15 | 0:30192d068543 | 101 | i = fread(str, 1,30,ptr); |
adhithyan15 | 0:30192d068543 | 102 | str[i] = '\0'; |
adhithyan15 | 0:30192d068543 | 103 | fclose(ptr); |
adhithyan15 | 0:30192d068543 | 104 | string response = string(buffer); |
adhithyan15 | 0:30192d068543 | 105 | string file_data = string(str); |
adhithyan15 | 0:30192d068543 | 106 | pc.printf("File timestamp %s\n",str); |
adhithyan15 | 0:30192d068543 | 107 | pc.printf("file data length %d\n",file_data.length()); |
adhithyan15 | 0:30192d068543 | 108 | pc.printf("response data length %d\n",response.length()); |
adhithyan15 | 0:30192d068543 | 109 | size_t found = response.find(file_data); |
adhithyan15 | 0:30192d068543 | 110 | if(file_data!= response){ |
adhithyan15 | 0:30192d068543 | 111 | ptr = fopen("/local/wiflash.txt", "w"); |
adhithyan15 | 0:30192d068543 | 112 | pc.printf("Received the timestamp %s\n", buffer); |
adhithyan15 | 0:30192d068543 | 113 | fprintf(ptr,buffer); |
adhithyan15 | 0:30192d068543 | 114 | fclose(ptr); |
adhithyan15 | 0:30192d068543 | 115 | pc.printf("I am inside socket\n"); |
adhithyan15 | 0:30192d068543 | 116 | TCPSocketConnection sock2; |
adhithyan15 | 0:30192d068543 | 117 | sock.close(); |
adhithyan15 | 0:30192d068543 | 118 | sock2.connect("104.236.198.189", 80); |
adhithyan15 | 0:30192d068543 | 119 | char url2_buffer[100]; |
adhithyan15 | 0:30192d068543 | 120 | sprintf (url2_buffer, "GET /devices/%s/download.json HTTP/1.0\n\n", get_serial_number().c_str()); |
adhithyan15 | 0:30192d068543 | 121 | sock2.send_all(url2_buffer, sizeof(url_buffer)-1); |
adhithyan15 | 0:30192d068543 | 122 | int ret2; |
adhithyan15 | 0:30192d068543 | 123 | FILE* pFile; |
adhithyan15 | 0:30192d068543 | 124 | pFile = fopen("/local/_LPC1768.bin", "wb"); |
adhithyan15 | 0:30192d068543 | 125 | if(pFile){ |
adhithyan15 | 0:30192d068543 | 126 | pc.printf("File already exists\n"); |
adhithyan15 | 0:30192d068543 | 127 | pc.printf("Deleting file\n"); |
adhithyan15 | 0:30192d068543 | 128 | ret = remove("/local/_LPC1768.bin"); |
adhithyan15 | 0:30192d068543 | 129 | if(ret == 0) |
adhithyan15 | 0:30192d068543 | 130 | { |
adhithyan15 | 0:30192d068543 | 131 | pc.printf("File deleted successfully\n"); |
adhithyan15 | 0:30192d068543 | 132 | pFile = fopen("/local/_tmp.bin", "wb"); |
adhithyan15 | 0:30192d068543 | 133 | } |
adhithyan15 | 0:30192d068543 | 134 | } |
adhithyan15 | 0:30192d068543 | 135 | pFile = fopen("/local/_LPC1768.bin", "wb"); |
adhithyan15 | 0:30192d068543 | 136 | pc.printf("Writing a new empty _LPC1768.bin file\n"); |
adhithyan15 | 0:30192d068543 | 137 | int counter = 0; |
adhithyan15 | 0:30192d068543 | 138 | char test[] = "\n\nHello\n\n"; |
adhithyan15 | 0:30192d068543 | 139 | memset( buffer, '\0', sizeof(char)*600 ); |
adhithyan15 | 0:30192d068543 | 140 | string k; |
adhithyan15 | 0:30192d068543 | 141 | string phusion_passenger = "X-Powered-By: Phusion Passenger 5.0.6"; |
adhithyan15 | 0:30192d068543 | 142 | while (true) { |
adhithyan15 | 0:30192d068543 | 143 | counter += 1; |
adhithyan15 | 0:30192d068543 | 144 | ret2 = sock2.receive(buffer, sizeof(buffer)-1); |
adhithyan15 | 0:30192d068543 | 145 | if (ret2 <= 0) |
adhithyan15 | 0:30192d068543 | 146 | break; |
adhithyan15 | 0:30192d068543 | 147 | buffer[ret2] = '\0'; |
adhithyan15 | 0:30192d068543 | 148 | k = string(buffer); |
adhithyan15 | 0:30192d068543 | 149 | size_t found = k.find(phusion_passenger); |
adhithyan15 | 0:30192d068543 | 150 | if (found == string::npos){ |
adhithyan15 | 0:30192d068543 | 151 | printf("Download data\n"); |
adhithyan15 | 0:30192d068543 | 152 | total_chars += ret2; |
adhithyan15 | 0:30192d068543 | 153 | fwrite (buffer , sizeof(char), ret2, pFile); |
adhithyan15 | 0:30192d068543 | 154 | } |
adhithyan15 | 0:30192d068543 | 155 | memset( buffer, '\0', sizeof(char)*600 ); |
adhithyan15 | 0:30192d068543 | 156 | } |
adhithyan15 | 0:30192d068543 | 157 | fclose(pFile); |
adhithyan15 | 0:30192d068543 | 158 | pc.printf("Total downloade chars %d\n",total_chars); |
adhithyan15 | 0:30192d068543 | 159 | sock2.close(); |
adhithyan15 | 0:30192d068543 | 160 | listdir(); |
adhithyan15 | 0:30192d068543 | 161 | t->terminate(); |
adhithyan15 | 0:30192d068543 | 162 | } |
adhithyan15 | 0:30192d068543 | 163 | } |
adhithyan15 | 0:30192d068543 | 164 | } |
adhithyan15 | 0:30192d068543 | 165 | wait(20); |
adhithyan15 | 0:30192d068543 | 166 | stdio_mutex.unlock(); |
adhithyan15 | 0:30192d068543 | 167 | } |
adhithyan15 | 0:30192d068543 | 168 | } |
adhithyan15 | 0:30192d068543 | 169 | |
adhithyan15 | 0:30192d068543 | 170 | |
adhithyan15 | 0:30192d068543 | 171 | |
adhithyan15 | 0:30192d068543 | 172 | bool Wiflash::setUp(){ |
adhithyan15 | 0:30192d068543 | 173 | int ret; |
adhithyan15 | 0:30192d068543 | 174 | stdio_mutex.lock(); |
adhithyan15 | 0:30192d068543 | 175 | file = fopen("/local/wiflash.txt", "r"); |
adhithyan15 | 0:30192d068543 | 176 | if(file){ |
adhithyan15 | 0:30192d068543 | 177 | fclose(file); |
adhithyan15 | 0:30192d068543 | 178 | } else { |
adhithyan15 | 0:30192d068543 | 179 | file = fopen("/local/wiflash.txt", "w"); |
adhithyan15 | 0:30192d068543 | 180 | fprintf(file, "Hello World!"); |
adhithyan15 | 0:30192d068543 | 181 | fclose(file); |
adhithyan15 | 0:30192d068543 | 182 | } |
adhithyan15 | 0:30192d068543 | 183 | file = fopen("/local/_LPC1768.bin", "r"); |
adhithyan15 | 0:30192d068543 | 184 | if(file){ |
adhithyan15 | 0:30192d068543 | 185 | fclose(file); |
adhithyan15 | 0:30192d068543 | 186 | } else { |
adhithyan15 | 0:30192d068543 | 187 | file = fopen("/local/_LPC1768.bin", "w"); |
adhithyan15 | 0:30192d068543 | 188 | fclose(file); |
adhithyan15 | 0:30192d068543 | 189 | } |
adhithyan15 | 0:30192d068543 | 190 | stdio_mutex.unlock(); |
adhithyan15 | 0:30192d068543 | 191 | eth.init(); //Use DHCP |
adhithyan15 | 0:30192d068543 | 192 | eth.connect(); |
adhithyan15 | 0:30192d068543 | 193 | printf("IP Address is %s\n", eth.getIPAddress()); |
adhithyan15 | 0:30192d068543 | 194 | t = new Thread(check_for_new_firmware); |
adhithyan15 | 0:30192d068543 | 195 | return true; |
adhithyan15 | 0:30192d068543 | 196 | } |