SWUpdate library to be used with RPC.

Fork of SWUpdate by David Smart

Revision:
3:c69fff55fc60
Parent:
1:208de08b1a19
Child:
7:a7efbae7e02e
diff -r ef2ac9627546 -r c69fff55fc60 SWUpdate.cpp
--- a/SWUpdate.cpp	Sat Jun 14 16:15:30 2014 +0000
+++ b/SWUpdate.cpp	Sat Jun 14 18:18:28 2014 +0000
@@ -25,8 +25,26 @@
 #define INFO(x, ...)
 #endif
 
-static bool PassesIntegrityCheck(const char * fname) {
-    return true;
+static bool PassesIntegrityCheck(const char * fname, int cksum, int fsize) {
+    int res = false;    // assume things go wrong...
+    int newCksum = 0;
+    int newFSize = 0;
+    FILE *fh = fopen(fname, "rb");
+    INFO("IntegrityCheck(%s,%d,%d)", fname, cksum, fsize);
+    if (fh) {
+        char buf;
+        while (fread(&buf, 1, 1, fh)) {
+            newCksum = (newCksum + buf) & 0xFFFF;
+            newFSize++;
+        }
+        fclose(fh);
+        INFO("      Check(...,%d,%d)", newCksum, newFSize);
+        if (newCksum == cksum && newFSize == fsize)
+            res = true;
+    } else {
+        WARN("failed to open %s.", fname);
+    }
+    return res;
 }
 
 bool SoftwareUpdate(const char *url, const char * name, Reboot_T reboot) {
@@ -36,7 +54,6 @@
     char verfn[32];     // local version file
     char fwfn[32];
     bool result = false;    // many things can go wrong, assume failure
-    //char *verfn = "/local/VERSION.TXT";
     char buf[50];
         
     INFO("SoftwareUpdate(%s,%s)", url, name);
@@ -57,50 +74,59 @@
     HTTPResult r = http.get(fqurl, buf, sizeof(buf));
     if (r == HTTP_OK) {
         int latest_ver = -1;
+        int cksum = 0;
+        int fsize = 0;
+        int parseCount;
         INFO("  read {%s}", buf);
-        sscanf(buf, "%d", &latest_ver);
-        INFO("  web version: %d", latest_ver);
-        if (inst_ver != latest_ver) {
-            INFO("  Downloading new firmware...");
-            sprintf(fwfn, "/local/%s%d.BIN", name, latest_ver);
-            snprintf(fqurl, 150, "%s/%s.bin", url, name);
-    
-            HTTPFile latest(fwfn);
-            r = http.get(fqurl, &latest);
-            if (r == HTTP_OK) {
-                // Check the integrity of the freshly downloaded file,
-                // before swapping out the old version.
-                // ... to appear here ...
-                if (PassesIntegrityCheck(fwfn)) {
-                    sprintf(fwfn, "/local/%s%d.BIN", name, inst_ver);
-                    INFO("  Firmware downloaded, removing old version (%s).", fwfn);
-                    if (remove(fwfn)) {
-                        ERR("  *** Failed to remove old version. ***");
-                    }
-                    INFO("Updating stored version number.");
-                    fv = fopen(verfn, "w");
-                    if (fv) {
-                        int fr = fputs(buf, fv);
-                        if (fr < 0) {
-                            ERR("Failed (%d) to update stored version number.", fr);
-                            fclose( fv );
+        parseCount = sscanf(buf, "%d,%d,%d", &latest_ver, &cksum, &fsize);
+        if (parseCount == 3) {
+            INFO("  web version: %d", latest_ver);
+            INFO("     checksum: %d", cksum);
+            INFO("    file size: %d", fsize);
+            if (inst_ver != latest_ver) {
+                INFO("  Downloading firmware ver %d ...", latest_ver);
+                sprintf(fwfn, "/local/%s%d.BIN", name, latest_ver);
+                snprintf(fqurl, 150, "%s/%s.bin", url, name);
+        
+                HTTPFile latest(fwfn);
+                r = http.get(fqurl, &latest);
+                if (r == HTTP_OK) {
+                    // Check the integrity of the freshly downloaded file,
+                    // before swapping out the old version.
+                    // ... to appear here ...
+                    if (PassesIntegrityCheck(fwfn, cksum, fsize)) {
+                        sprintf(fwfn, "/local/%s%d.BIN", name, inst_ver);
+                        INFO("  Firmware downloaded, removing old version (%s).", fwfn);
+                        if (remove(fwfn)) {
+                            ERR("  *** Failed to remove old version. ***");
+                        }
+                        INFO("Updating stored version number.");
+                        fv = fopen(verfn, "w");
+                        if (fv) {
+                            int fr = fputs(buf, fv);
+                            if (fr < 0) {
+                                ERR("Failed (%d) to update stored version number.", fr);
+                                fclose( fv );
+                            } else {
+                                fclose( fv );
+                                if (reboot == AUTO_REBOOT) {
+                                    WARN("Resetting...\n");
+                                    wait_ms(200);
+                                    mbed_reset();
+                                }
+                                result = true;
+                            }
                         } else {
-                            fclose( fv );
-                            if (reboot == AUTO_REBOOT) {
-                                WARN("Resetting...\n");
-                                wait_ms(200);
-                                mbed_reset();
-                            }
-                            result = true;
+                            WARN("Failed to update local version info in %s.", verfn);
                         }
                     } else {
-                        WARN("Failed to update local version info in %s.", verfn);
+                        WARN("New file {%s} did not pass integrity check.", fwfn);
                     }
                 } else {
-                    WARN("New file {%s} did not pass integrity check.", fwfn);
+                    WARN("Failed to download lastest firmware.");
                 }
             } else {
-                WARN("Failed to download lastest firmware.");
+                WARN("Only %d parameters found in online version file.", parseCount);
             }
         }
     } else {