Updated Wiflash

Dependents:   wiflash-demo-blinkk wiflashdemo

Committer:
adhithyan15
Date:
Fri May 01 15:03:29 2015 +0000
Revision:
0:30192d068543
Updated

Who changed what in which revision?

UserRevisionLine numberNew 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 }