Dependencies:   mbed

Committer:
Markus_Paar
Date:
Mon Sep 19 10:25:22 2011 +0000
Revision:
0:48870d877970

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Markus_Paar 0:48870d877970 1 /**
Markus_Paar 0:48870d877970 2 * =============================================================================
Markus_Paar 0:48870d877970 3 * Firmware updater (Version 0.0.2)
Markus_Paar 0:48870d877970 4 * =============================================================================
Markus_Paar 0:48870d877970 5 * Copyright (c) 2010 Shinichiro Nakamura (CuBeatSystems)
Markus_Paar 0:48870d877970 6 *
Markus_Paar 0:48870d877970 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
Markus_Paar 0:48870d877970 8 * of this software and associated documentation files (the "Software"), to deal
Markus_Paar 0:48870d877970 9 * in the Software without restriction, including without limitation the rights
Markus_Paar 0:48870d877970 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Markus_Paar 0:48870d877970 11 * copies of the Software, and to permit persons to whom the Software is
Markus_Paar 0:48870d877970 12 * furnished to do so, subject to the following conditions:
Markus_Paar 0:48870d877970 13 *
Markus_Paar 0:48870d877970 14 * The above copyright notice and this permission notice shall be included in
Markus_Paar 0:48870d877970 15 * all copies or substantial portions of the Software.
Markus_Paar 0:48870d877970 16 *
Markus_Paar 0:48870d877970 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Markus_Paar 0:48870d877970 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Markus_Paar 0:48870d877970 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Markus_Paar 0:48870d877970 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Markus_Paar 0:48870d877970 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Markus_Paar 0:48870d877970 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Markus_Paar 0:48870d877970 23 * THE SOFTWARE.
Markus_Paar 0:48870d877970 24 * =============================================================================
Markus_Paar 0:48870d877970 25 */
Markus_Paar 0:48870d877970 26
Markus_Paar 0:48870d877970 27 #include "FirmwareUpdater.h"
Markus_Paar 0:48870d877970 28
Markus_Paar 0:48870d877970 29 #include <stdio.h>
Markus_Paar 0:48870d877970 30 #include <stdarg.h>
Markus_Paar 0:48870d877970 31 #include "MSCFileSystem.h"
Markus_Paar 0:48870d877970 32
Markus_Paar 0:48870d877970 33 extern "C" void mbed_reset();
Markus_Paar 0:48870d877970 34
Markus_Paar 0:48870d877970 35 const std::string FirmwareUpdater::EXT_BIN = ".bin";
Markus_Paar 0:48870d877970 36 const std::string FirmwareUpdater::EXT_BINTMP = ".b__";
Markus_Paar 0:48870d877970 37 const std::string FirmwareUpdater::EXT_TXT = ".txt";
Markus_Paar 0:48870d877970 38 const std::string FirmwareUpdater::EXT_TXTTMP = ".t__";
Markus_Paar 0:48870d877970 39 MSCFileSystem fs ("fs");
Markus_Paar 0:48870d877970 40 LocalFileSystem local ("local");
Markus_Paar 0:48870d877970 41
Markus_Paar 0:48870d877970 42 /**
Markus_Paar 0:48870d877970 43 * Create.
Markus_Paar 0:48870d877970 44 *
Markus_Paar 0:48870d877970 45 * @param url URL for firmware. Do not include a target file name.
Markus_Paar 0:48870d877970 46 * @param name An application name. Do not include a extention.
Markus_Paar 0:48870d877970 47 * @param log True if logging.
Markus_Paar 0:48870d877970 48 */
Markus_Paar 0:48870d877970 49 FirmwareUpdater::FirmwareUpdater(std::string src_name, std::string dest_name, bool log)
Markus_Paar 0:48870d877970 50 : src_name(src_name), dest_name(dest_name), log(log), local("local") {
Markus_Paar 0:48870d877970 51 //client.setTimeout(10000);
Markus_Paar 0:48870d877970 52
Markus_Paar 0:48870d877970 53 /*
Markus_Paar 0:48870d877970 54 * A file name on the mbed local file system should keep '8 + 3' types of name.
Markus_Paar 0:48870d877970 55 */
Markus_Paar 0:48870d877970 56 if (MAXNAMELEN < dest_name.length()) {
Markus_Paar 0:48870d877970 57 LOG("ERR : Invalid firmware name '%s' found. The maximum length is %d.\n", dest_name.c_str(), MAXNAMELEN);
Markus_Paar 0:48870d877970 58 error("ERR : Invalid firmware name '%s' found. The maximum length is %d.\n", dest_name.c_str(), MAXNAMELEN);
Markus_Paar 0:48870d877970 59 }
Markus_Paar 0:48870d877970 60 }
Markus_Paar 0:48870d877970 61
Markus_Paar 0:48870d877970 62 /**
Markus_Paar 0:48870d877970 63 * Dispose.
Markus_Paar 0:48870d877970 64 */
Markus_Paar 0:48870d877970 65 FirmwareUpdater::~FirmwareUpdater() {
Markus_Paar 0:48870d877970 66 }
Markus_Paar 0:48870d877970 67
Markus_Paar 0:48870d877970 68 /**
Markus_Paar 0:48870d877970 69 * Get a URL.
Markus_Paar 0:48870d877970 70 *
Markus_Paar 0:48870d877970 71 * @return URL.
Markus_Paar 0:48870d877970 72 */
Markus_Paar 0:48870d877970 73 const std::string FirmwareUpdater:: get_src_name() const {
Markus_Paar 0:48870d877970 74 return src_name;
Markus_Paar 0:48870d877970 75 }
Markus_Paar 0:48870d877970 76
Markus_Paar 0:48870d877970 77 /**
Markus_Paar 0:48870d877970 78 * Get a name.
Markus_Paar 0:48870d877970 79 *
Markus_Paar 0:48870d877970 80 * @return name.
Markus_Paar 0:48870d877970 81 */
Markus_Paar 0:48870d877970 82 const std::string FirmwareUpdater:: get_dest_name() const {
Markus_Paar 0:48870d877970 83 return dest_name;
Markus_Paar 0:48870d877970 84 }
Markus_Paar 0:48870d877970 85
Markus_Paar 0:48870d877970 86 /**
Markus_Paar 0:48870d877970 87 * Checking a new firmware.
Markus_Paar 0:48870d877970 88 * Compare versions of the software between local storage on mbed and on USB-device.
Markus_Paar 0:48870d877970 89 *
Markus_Paar 0:48870d877970 90 * @return Return 0 if a new firmware exists.
Markus_Paar 0:48870d877970 91 */
Markus_Paar 0:48870d877970 92 int FirmwareUpdater::exist() {
Markus_Paar 0:48870d877970 93 int ver_local, ver_USB;
Markus_Paar 0:48870d877970 94
Markus_Paar 0:48870d877970 95 /*
Markus_Paar 0:48870d877970 96 * Fetch the version from a local.
Markus_Paar 0:48870d877970 97 */
Markus_Paar 0:48870d877970 98 std::string file_local = "/local/" + dest_name + EXT_TXT;
Markus_Paar 0:48870d877970 99 ver_local = readVersionFromFile(file_local.c_str());
Markus_Paar 0:48870d877970 100 if (ver_local < 0) {
Markus_Paar 0:48870d877970 101 return -1;
Markus_Paar 0:48870d877970 102 }
Markus_Paar 0:48870d877970 103
Markus_Paar 0:48870d877970 104 /*
Markus_Paar 0:48870d877970 105 * Fetch the version from a server.
Markus_Paar 0:48870d877970 106 */
Markus_Paar 0:48870d877970 107 std::string file_usb = "/fs/" + src_name + EXT_TXT;
Markus_Paar 0:48870d877970 108 ver_USB = readVersionFromUSB(file_usb.c_str());
Markus_Paar 0:48870d877970 109 if (ver_USB < 0) {
Markus_Paar 0:48870d877970 110 return -2;
Markus_Paar 0:48870d877970 111 }
Markus_Paar 0:48870d877970 112
Markus_Paar 0:48870d877970 113 return (ver_local < ver_USB) ? 0 : 1;
Markus_Paar 0:48870d877970 114 }
Markus_Paar 0:48870d877970 115
Markus_Paar 0:48870d877970 116 /**
Markus_Paar 0:48870d877970 117 * Execute update.
Markus_Paar 0:48870d877970 118 *
Markus_Paar 0:48870d877970 119 * @return Return 0 if it succeed.
Markus_Paar 0:48870d877970 120 */
Markus_Paar 0:48870d877970 121 int FirmwareUpdater::execute() {
Markus_Paar 0:48870d877970 122 /*
Markus_Paar 0:48870d877970 123 * Fetch the files.
Markus_Paar 0:48870d877970 124 */
Markus_Paar 0:48870d877970 125 /*
Markus_Paar 0:48870d877970 126 std::string usb_txt = "/fs/" + src_name + EXT_TXT;
Markus_Paar 0:48870d877970 127 std::string file_txttmp = "/local/" + dest_name + EXT_TXTTMP;
Markus_Paar 0:48870d877970 128 if (fetch(usb_txt, file_txttmp) != 0) {
Markus_Paar 0:48870d877970 129 LOG("ERR : Aborted...\n");
Markus_Paar 0:48870d877970 130 return -1;
Markus_Paar 0:48870d877970 131 }
Markus_Paar 0:48870d877970 132 std::string usb_bin = "/fs/" + src_name + EXT_BIN;
Markus_Paar 0:48870d877970 133 std::string file_bintmp = "/local/" + dest_name + EXT_BINTMP;
Markus_Paar 0:48870d877970 134 if (fetch(usb_bin, file_bintmp) != 0) {
Markus_Paar 0:48870d877970 135 LOG("ERR : Aborted...\n");
Markus_Paar 0:48870d877970 136 return -2;
Markus_Paar 0:48870d877970 137 }
Markus_Paar 0:48870d877970 138 */
Markus_Paar 0:48870d877970 139
Markus_Paar 0:48870d877970 140 /*
Markus_Paar 0:48870d877970 141 * Check the firmware versions.
Markus_Paar 0:48870d877970 142 */
Markus_Paar 0:48870d877970 143 std::string dest_file_txt = "/local/" + dest_name + EXT_TXT;
Markus_Paar 0:48870d877970 144 std::string src_file_txt = "/fs/" + src_name + EXT_TXT;
Markus_Paar 0:48870d877970 145 int ver_old = readVersionFromFile(dest_file_txt.c_str());
Markus_Paar 0:48870d877970 146 int ver_new = readVersionFromFile(src_file_txt.c_str());
Markus_Paar 0:48870d877970 147 if (ver_old < 0) {
Markus_Paar 0:48870d877970 148 LOG("ERR : Could not read the previous firmware version.\n");
Markus_Paar 0:48870d877970 149 LOG("ERR : Aborted...\n");
Markus_Paar 0:48870d877970 150 return -3;
Markus_Paar 0:48870d877970 151 }
Markus_Paar 0:48870d877970 152 if (ver_new < 0) {
Markus_Paar 0:48870d877970 153 LOG("ERR : Could not read the new firmware version.\n");
Markus_Paar 0:48870d877970 154 LOG("ERR : Aborted...\n");
Markus_Paar 0:48870d877970 155 return -4;
Markus_Paar 0:48870d877970 156 }
Markus_Paar 0:48870d877970 157 if (ver_new < ver_old) {
Markus_Paar 0:48870d877970 158 LOG("ERR : Ignore the new firmware. (old=%d, new=%d)\n", ver_old, ver_new);
Markus_Paar 0:48870d877970 159 LOG("ERR : Aborted...\n");
Markus_Paar 0:48870d877970 160 return -5;
Markus_Paar 0:48870d877970 161 }
Markus_Paar 0:48870d877970 162 LOG("INFO: Firmware updating... (%d -> %d)\n", ver_old, ver_new);
Markus_Paar 0:48870d877970 163
Markus_Paar 0:48870d877970 164 /*
Markus_Paar 0:48870d877970 165 * Cleanup the previous versions.
Markus_Paar 0:48870d877970 166 *
Markus_Paar 0:48870d877970 167 * Note:
Markus_Paar 0:48870d877970 168 * A file time stamp on mbed is always '12:00 01/01/2008'.
Markus_Paar 0:48870d877970 169 * mbed can't sense updated firmware when the file name is same as previous version.
Markus_Paar 0:48870d877970 170 *
Markus_Paar 0:48870d877970 171 * So I decided to cleanup all bin files.
Markus_Paar 0:48870d877970 172 * And the new firmware name is 'name-VERSION.bin'.
Markus_Paar 0:48870d877970 173 * To remove previous versions at first means 'start critical section on the system'.
Markus_Paar 0:48870d877970 174 */
Markus_Paar 0:48870d877970 175 cleanupAllBinFiles();
Markus_Paar 0:48870d877970 176
Markus_Paar 0:48870d877970 177 /*
Markus_Paar 0:48870d877970 178 * Copy it.
Markus_Paar 0:48870d877970 179 */
Markus_Paar 0:48870d877970 180 char nn[32];
Markus_Paar 0:48870d877970 181 createNewBinName(ver_new, nn, sizeof(nn));
Markus_Paar 0:48870d877970 182 LOG("INFO: generate src name & dest name ... (%d)", ver_new);
Markus_Paar 0:48870d877970 183 std::string src_file_bin = "/fs/" + src_name + EXT_BIN;
Markus_Paar 0:48870d877970 184 std::string dest_file_bin = "/local/" + dest_name + EXT_BIN;
Markus_Paar 0:48870d877970 185 if (copy(src_file_txt, dest_file_txt) != 0) {
Markus_Paar 0:48870d877970 186 return -6;
Markus_Paar 0:48870d877970 187 }
Markus_Paar 0:48870d877970 188
Markus_Paar 0:48870d877970 189 if (copy(src_file_bin, dest_file_bin) != 0) {
Markus_Paar 0:48870d877970 190 return -7;
Markus_Paar 0:48870d877970 191 }
Markus_Paar 0:48870d877970 192 /*
Markus_Paar 0:48870d877970 193 * Delete the temporary files.
Markus_Paar 0:48870d877970 194 */
Markus_Paar 0:48870d877970 195 //remove(file_txttmp.c_str());
Markus_Paar 0:48870d877970 196 //remove(file_bintmp.c_str());
Markus_Paar 0:48870d877970 197 return 0;
Markus_Paar 0:48870d877970 198 }
Markus_Paar 0:48870d877970 199
Markus_Paar 0:48870d877970 200 /**
Markus_Paar 0:48870d877970 201 * Reset system.
Markus_Paar 0:48870d877970 202 */
Markus_Paar 0:48870d877970 203 void FirmwareUpdater::reset() {
Markus_Paar 0:48870d877970 204 mbed_reset();
Markus_Paar 0:48870d877970 205 }
Markus_Paar 0:48870d877970 206
Markus_Paar 0:48870d877970 207 /**
Markus_Paar 0:48870d877970 208 * Fetch a file.
Markus_Paar 0:48870d877970 209 *
Markus_Paar 0:48870d877970 210 * @param src_url URL of a source file.
Markus_Paar 0:48870d877970 211 * @param local_file Local file name.
Markus_Paar 0:48870d877970 212 *
Markus_Paar 0:48870d877970 213 * @return Return 0 if it succeed.
Markus_Paar 0:48870d877970 214 */
Markus_Paar 0:48870d877970 215 //int FirmwareUpdater::fetch(std::string src_usb, std::string local_file) {
Markus_Paar 0:48870d877970 216 /*
Markus_Paar 0:48870d877970 217 * Fetch the source file from URL to a temporary file on local.
Markus_Paar 0:48870d877970 218 *
Markus_Paar 0:48870d877970 219 HTTPFile file(local_file.c_str());
Markus_Paar 0:48870d877970 220 int r = client.get(src_url.c_str(), &file);
Markus_Paar 0:48870d877970 221 if (r != HTTP_OK) {
Markus_Paar 0:48870d877970 222 LOG("ERR : Fetch '%s' to '%s'.\n", src_url.c_str(), local_file.c_str());
Markus_Paar 0:48870d877970 223 return -1;
Markus_Paar 0:48870d877970 224 }
Markus_Paar 0:48870d877970 225 LOG("INFO: Fetched '%s' to '%s'.\n", src_url.c_str(), local_file.c_str());*/
Markus_Paar 0:48870d877970 226 //return 0;
Markus_Paar 0:48870d877970 227 //}
Markus_Paar 0:48870d877970 228
Markus_Paar 0:48870d877970 229 /**
Markus_Paar 0:48870d877970 230 * Copy a file.
Markus_Paar 0:48870d877970 231 *
Markus_Paar 0:48870d877970 232 * @param local_file1 Source file.
Markus_Paar 0:48870d877970 233 * @param local_file2 Destination file.
Markus_Paar 0:48870d877970 234 *
Markus_Paar 0:48870d877970 235 * @return Return 0 if it succeed.
Markus_Paar 0:48870d877970 236 */
Markus_Paar 0:48870d877970 237 int FirmwareUpdater::copy(std::string local_file1, std::string local_file2) {
Markus_Paar 0:48870d877970 238 LOG("INFO: File copying... (%s->%s)\n", local_file1.c_str(), local_file2.c_str());
Markus_Paar 0:48870d877970 239 FILE *rp = fopen(local_file1.c_str(), "rb");
Markus_Paar 0:48870d877970 240 if (rp == NULL) {
Markus_Paar 0:48870d877970 241 LOG("ERR : File '%s' open failed.\n", local_file1.c_str());
Markus_Paar 0:48870d877970 242 return -1;
Markus_Paar 0:48870d877970 243 }
Markus_Paar 0:48870d877970 244 remove(local_file2.c_str());
Markus_Paar 0:48870d877970 245 FILE *wp = fopen(local_file2.c_str(), "wb");
Markus_Paar 0:48870d877970 246 if (wp == NULL) {
Markus_Paar 0:48870d877970 247 LOG("ERR : File '%s' open failed.\n", local_file2.c_str());
Markus_Paar 0:48870d877970 248 fclose(rp);
Markus_Paar 0:48870d877970 249 return -2;
Markus_Paar 0:48870d877970 250 }
Markus_Paar 0:48870d877970 251 int c;
Markus_Paar 0:48870d877970 252 while ((c = fgetc(rp)) != EOF) {
Markus_Paar 0:48870d877970 253 fputc(c, wp);
Markus_Paar 0:48870d877970 254 }
Markus_Paar 0:48870d877970 255 fclose(rp);
Markus_Paar 0:48870d877970 256 fclose(wp);
Markus_Paar 0:48870d877970 257 LOG("INFO: File copied. (%s->%s)\n", local_file1.c_str(), local_file2.c_str());
Markus_Paar 0:48870d877970 258 return 0;
Markus_Paar 0:48870d877970 259 }
Markus_Paar 0:48870d877970 260
Markus_Paar 0:48870d877970 261 /**
Markus_Paar 0:48870d877970 262 * Output a message to a log file.
Markus_Paar 0:48870d877970 263 *
Markus_Paar 0:48870d877970 264 * @param format ...
Markus_Paar 0:48870d877970 265 */
Markus_Paar 0:48870d877970 266 void FirmwareUpdater::LOG(const char* format, ...) {
Markus_Paar 0:48870d877970 267 if (log) {
Markus_Paar 0:48870d877970 268 FILE *fplog = fopen("/local/update.log", "a");
Markus_Paar 0:48870d877970 269 if (fplog != NULL) {
Markus_Paar 0:48870d877970 270 char buf[BUFSIZ];
Markus_Paar 0:48870d877970 271 va_list p;
Markus_Paar 0:48870d877970 272 va_start(p, format);
Markus_Paar 0:48870d877970 273 vsnprintf(buf, sizeof(buf) - 1, format, p);
Markus_Paar 0:48870d877970 274 fprintf(fplog, "%s", buf);
Markus_Paar 0:48870d877970 275 // printf("%s", buf); /* If you want to check a message from a console. */
Markus_Paar 0:48870d877970 276 va_end(p);
Markus_Paar 0:48870d877970 277 fclose(fplog);
Markus_Paar 0:48870d877970 278 }
Markus_Paar 0:48870d877970 279 }
Markus_Paar 0:48870d877970 280 }
Markus_Paar 0:48870d877970 281
Markus_Paar 0:48870d877970 282 /**
Markus_Paar 0:48870d877970 283 * Cleanup all bin files.
Markus_Paar 0:48870d877970 284 */
Markus_Paar 0:48870d877970 285 int FirmwareUpdater::cleanupAllBinFiles(void) {
Markus_Paar 0:48870d877970 286 struct dirent *p;
Markus_Paar 0:48870d877970 287 DIR *dir = opendir("/local");
Markus_Paar 0:48870d877970 288 if (dir == NULL) {
Markus_Paar 0:48870d877970 289 return -1;
Markus_Paar 0:48870d877970 290 }
Markus_Paar 0:48870d877970 291 while ((p = readdir(dir)) != NULL) {
Markus_Paar 0:48870d877970 292 char *str = p->d_name;
Markus_Paar 0:48870d877970 293 if ((strstr(str, ".bin") != NULL) || (strstr(str, ".BIN") != NULL)) {
Markus_Paar 0:48870d877970 294 char buf[BUFSIZ];
Markus_Paar 0:48870d877970 295 snprintf(buf, sizeof(buf) - 1, "/local/%s", str);
Markus_Paar 0:48870d877970 296 if (remove(buf) == 0) {
Markus_Paar 0:48870d877970 297 LOG("INFO: Deleted '%s'.\n", buf);
Markus_Paar 0:48870d877970 298 } else {
Markus_Paar 0:48870d877970 299 LOG("ERR : Delete '%s' failed.\n", buf);
Markus_Paar 0:48870d877970 300 }
Markus_Paar 0:48870d877970 301 }
Markus_Paar 0:48870d877970 302 }
Markus_Paar 0:48870d877970 303 closedir(dir);
Markus_Paar 0:48870d877970 304 return 0;
Markus_Paar 0:48870d877970 305 }
Markus_Paar 0:48870d877970 306
Markus_Paar 0:48870d877970 307 /*
Markus_Paar 0:48870d877970 308 * Create a new binary file name.
Markus_Paar 0:48870d877970 309 *
Markus_Paar 0:48870d877970 310 * @param ver Version.
Markus_Paar 0:48870d877970 311 * @param buf A pointer to a buffer.
Markus_Paar 0:48870d877970 312 * @param siz A size of the buffer.
Markus_Paar 0:48870d877970 313 *
Markus_Paar 0:48870d877970 314 * @return Return 0 if it succeed.
Markus_Paar 0:48870d877970 315 */
Markus_Paar 0:48870d877970 316 int FirmwareUpdater::createNewBinName(const int ver, char *buf, size_t siz) {
Markus_Paar 0:48870d877970 317 if (siz <= dest_name.length()) {
Markus_Paar 0:48870d877970 318 return -1;
Markus_Paar 0:48870d877970 319 }
Markus_Paar 0:48870d877970 320 snprintf(buf, siz - 1, "%s", dest_name.c_str());
Markus_Paar 0:48870d877970 321 char nb[32];
Markus_Paar 0:48870d877970 322 snprintf(nb, sizeof(nb) - 1, "-%d", ver);
Markus_Paar 0:48870d877970 323 if (strlen(buf) + strlen(nb) <= MAXNAMELEN) {
Markus_Paar 0:48870d877970 324 strcat(buf, nb);
Markus_Paar 0:48870d877970 325 return 0;
Markus_Paar 0:48870d877970 326 } else {
Markus_Paar 0:48870d877970 327 strcpy(buf + (MAXNAMELEN - strlen(nb)), nb);
Markus_Paar 0:48870d877970 328 return 0;
Markus_Paar 0:48870d877970 329 }
Markus_Paar 0:48870d877970 330 }
Markus_Paar 0:48870d877970 331
Markus_Paar 0:48870d877970 332 /**
Markus_Paar 0:48870d877970 333 * Read a version from a file on local FileSystem.
Markus_Paar 0:48870d877970 334 *
Markus_Paar 0:48870d877970 335 * @param filename file name.
Markus_Paar 0:48870d877970 336 * @return A version.
Markus_Paar 0:48870d877970 337 */
Markus_Paar 0:48870d877970 338 int FirmwareUpdater::readVersionFromFile(const char *filename) {
Markus_Paar 0:48870d877970 339 int ver;
Markus_Paar 0:48870d877970 340 FILE *fp = fopen(filename, "rb");
Markus_Paar 0:48870d877970 341 if (fp == NULL) {
Markus_Paar 0:48870d877970 342 LOG("ERR : Version file '%s' open failed.\n", filename);
Markus_Paar 0:48870d877970 343 return -1;
Markus_Paar 0:48870d877970 344 }
Markus_Paar 0:48870d877970 345 if (fscanf(fp, "%d", &ver) != 1) {
Markus_Paar 0:48870d877970 346 LOG("ERR : Version file '%s' is invalid.\n", filename);
Markus_Paar 0:48870d877970 347 return -2;
Markus_Paar 0:48870d877970 348 }
Markus_Paar 0:48870d877970 349 fclose(fp);
Markus_Paar 0:48870d877970 350 LOG("INFO: Version file '%s': Version %d.\n", filename, ver);
Markus_Paar 0:48870d877970 351 return ver;
Markus_Paar 0:48870d877970 352 }
Markus_Paar 0:48870d877970 353
Markus_Paar 0:48870d877970 354 /**
Markus_Paar 0:48870d877970 355 * Read a version from a file on USB FileSystem.
Markus_Paar 0:48870d877970 356 *
Markus_Paar 0:48870d877970 357 * @param filename file name.
Markus_Paar 0:48870d877970 358 * @return A version.
Markus_Paar 0:48870d877970 359 */
Markus_Paar 0:48870d877970 360 int FirmwareUpdater::readVersionFromUSB(const char *filename) {
Markus_Paar 0:48870d877970 361 int ver;
Markus_Paar 0:48870d877970 362 FILE *fp = fopen(filename, "rb");
Markus_Paar 0:48870d877970 363 if (fp == NULL) {
Markus_Paar 0:48870d877970 364 LOG("ERR : Version file '%s' open failed.\n", filename);
Markus_Paar 0:48870d877970 365 return -1;
Markus_Paar 0:48870d877970 366 }
Markus_Paar 0:48870d877970 367 if (fscanf(fp, "%d", &ver) != 1) {
Markus_Paar 0:48870d877970 368 LOG("ERR : Version file '%s' is invalid.\n", filename);
Markus_Paar 0:48870d877970 369 return -2;
Markus_Paar 0:48870d877970 370 }
Markus_Paar 0:48870d877970 371 fclose(fp);
Markus_Paar 0:48870d877970 372 LOG("INFO: Version file '%s': Version %d.\n", filename, ver);
Markus_Paar 0:48870d877970 373 return ver;
Markus_Paar 0:48870d877970 374 }