Does still not work properly

Dependencies:   mbed

Committer:
Markus_Paar
Date:
Thu Sep 15 05:40:44 2011 +0000
Revision:
0:319f1e8e3bdd
V2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Markus_Paar 0:319f1e8e3bdd 1 /**
Markus_Paar 0:319f1e8e3bdd 2 * =============================================================================
Markus_Paar 0:319f1e8e3bdd 3 * Firmware updater (Version 0.0.1)
Markus_Paar 0:319f1e8e3bdd 4 * =============================================================================
Markus_Paar 0:319f1e8e3bdd 5 * Copyright (c) 2010 Shinichiro Nakamura (CuBeatSystems)
Markus_Paar 0:319f1e8e3bdd 6 *
Markus_Paar 0:319f1e8e3bdd 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
Markus_Paar 0:319f1e8e3bdd 8 * of this software and associated documentation files (the "Software"), to deal
Markus_Paar 0:319f1e8e3bdd 9 * in the Software without restriction, including without limitation the rights
Markus_Paar 0:319f1e8e3bdd 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Markus_Paar 0:319f1e8e3bdd 11 * copies of the Software, and to permit persons to whom the Software is
Markus_Paar 0:319f1e8e3bdd 12 * furnished to do so, subject to the following conditions:
Markus_Paar 0:319f1e8e3bdd 13 *
Markus_Paar 0:319f1e8e3bdd 14 * The above copyright notice and this permission notice shall be included in
Markus_Paar 0:319f1e8e3bdd 15 * all copies or substantial portions of the Software.
Markus_Paar 0:319f1e8e3bdd 16 *
Markus_Paar 0:319f1e8e3bdd 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Markus_Paar 0:319f1e8e3bdd 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Markus_Paar 0:319f1e8e3bdd 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Markus_Paar 0:319f1e8e3bdd 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Markus_Paar 0:319f1e8e3bdd 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Markus_Paar 0:319f1e8e3bdd 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Markus_Paar 0:319f1e8e3bdd 23 * THE SOFTWARE.
Markus_Paar 0:319f1e8e3bdd 24 * =============================================================================
Markus_Paar 0:319f1e8e3bdd 25 */
Markus_Paar 0:319f1e8e3bdd 26
Markus_Paar 0:319f1e8e3bdd 27 #include "FirmwareUpdater.h"
Markus_Paar 0:319f1e8e3bdd 28
Markus_Paar 0:319f1e8e3bdd 29 #include <stdio.h>
Markus_Paar 0:319f1e8e3bdd 30 #include <stdarg.h>
Markus_Paar 0:319f1e8e3bdd 31
Markus_Paar 0:319f1e8e3bdd 32 extern "C" void mbed_reset();
Markus_Paar 0:319f1e8e3bdd 33
Markus_Paar 0:319f1e8e3bdd 34 const std::string FirmwareUpdater::EXT_BIN = ".bin";
Markus_Paar 0:319f1e8e3bdd 35 const std::string FirmwareUpdater::EXT_BINTMP = ".b__";
Markus_Paar 0:319f1e8e3bdd 36 const std::string FirmwareUpdater::EXT_TXT = ".txt";
Markus_Paar 0:319f1e8e3bdd 37 const std::string FirmwareUpdater::EXT_TXTTMP = ".t__";
Markus_Paar 0:319f1e8e3bdd 38
Markus_Paar 0:319f1e8e3bdd 39 MSCFileSystem fs ("fs");
Markus_Paar 0:319f1e8e3bdd 40 LocalFileSystem local("local");
Markus_Paar 0:319f1e8e3bdd 41
Markus_Paar 0:319f1e8e3bdd 42
Markus_Paar 0:319f1e8e3bdd 43 /**
Markus_Paar 0:319f1e8e3bdd 44 * Create.
Markus_Paar 0:319f1e8e3bdd 45 *
Markus_Paar 0:319f1e8e3bdd 46 * @param src_name: An application name on USB Stick. Do not include a extention.
Markus_Paar 0:319f1e8e3bdd 47 * @param dest_name An application name on MBED. Do not include a extention.
Markus_Paar 0:319f1e8e3bdd 48 * @param log True if logging.
Markus_Paar 0:319f1e8e3bdd 49 */
Markus_Paar 0:319f1e8e3bdd 50 FirmwareUpdater::FirmwareUpdater(std::string src_name, std::string dest_name, bool log)
Markus_Paar 0:319f1e8e3bdd 51 : src_name(src_name), dest_name(dest_name), log(log), local("local") {
Markus_Paar 0:319f1e8e3bdd 52
Markus_Paar 0:319f1e8e3bdd 53 }
Markus_Paar 0:319f1e8e3bdd 54
Markus_Paar 0:319f1e8e3bdd 55 /*
Markus_Paar 0:319f1e8e3bdd 56 * Dispose.
Markus_Paar 0:319f1e8e3bdd 57 */
Markus_Paar 0:319f1e8e3bdd 58 FirmwareUpdater::~FirmwareUpdater() {
Markus_Paar 0:319f1e8e3bdd 59 }
Markus_Paar 0:319f1e8e3bdd 60
Markus_Paar 0:319f1e8e3bdd 61 /**
Markus_Paar 0:319f1e8e3bdd 62 * Get the source_name.
Markus_Paar 0:319f1e8e3bdd 63 *
Markus_Paar 0:319f1e8e3bdd 64 * @return src_name.
Markus_Paar 0:319f1e8e3bdd 65 */
Markus_Paar 0:319f1e8e3bdd 66 const std::string FirmwareUpdater:: get_src_name() const {
Markus_Paar 0:319f1e8e3bdd 67 return src_name;
Markus_Paar 0:319f1e8e3bdd 68 }
Markus_Paar 0:319f1e8e3bdd 69
Markus_Paar 0:319f1e8e3bdd 70 /**
Markus_Paar 0:319f1e8e3bdd 71 * Get the dest_name.
Markus_Paar 0:319f1e8e3bdd 72 *
Markus_Paar 0:319f1e8e3bdd 73 * @return _destname.
Markus_Paar 0:319f1e8e3bdd 74 */
Markus_Paar 0:319f1e8e3bdd 75 const std::string FirmwareUpdater:: get_dest_name() const {
Markus_Paar 0:319f1e8e3bdd 76 return dest_name;
Markus_Paar 0:319f1e8e3bdd 77 }
Markus_Paar 0:319f1e8e3bdd 78
Markus_Paar 0:319f1e8e3bdd 79 /*
Markus_Paar 0:319f1e8e3bdd 80 * Checking a new firmware.
Markus_Paar 0:319f1e8e3bdd 81 * Compare versions of the software between local storage on mbed and on USB Stick.
Markus_Paar 0:319f1e8e3bdd 82 *
Markus_Paar 0:319f1e8e3bdd 83 * @return Return 0 if a new firmware exists.
Markus_Paar 0:319f1e8e3bdd 84 */
Markus_Paar 0:319f1e8e3bdd 85
Markus_Paar 0:319f1e8e3bdd 86 int FirmwareUpdater::exist() {
Markus_Paar 0:319f1e8e3bdd 87 int ver_local, ver_USB;
Markus_Paar 0:319f1e8e3bdd 88 printf("Fetch the version from a local.");
Markus_Paar 0:319f1e8e3bdd 89 /*
Markus_Paar 0:319f1e8e3bdd 90 * Fetch the version from a local.
Markus_Paar 0:319f1e8e3bdd 91 */
Markus_Paar 0:319f1e8e3bdd 92 std::string file_local = "/local/" + dest_name + EXT_TXT;
Markus_Paar 0:319f1e8e3bdd 93 FILE *fp = fopen(file_local.c_str(), "rb");
Markus_Paar 0:319f1e8e3bdd 94 if (fp == NULL) {
Markus_Paar 0:319f1e8e3bdd 95 LOG("Local firmware version file '%s' open failed.\n\r", file_local.c_str());
Markus_Paar 0:319f1e8e3bdd 96 return -1;
Markus_Paar 0:319f1e8e3bdd 97 }
Markus_Paar 0:319f1e8e3bdd 98 if (fscanf(fp, "%d", &ver_local) != 1) {
Markus_Paar 0:319f1e8e3bdd 99 LOG("Local firmware version file '%s' is invalid.\n\r", file_local.c_str());
Markus_Paar 0:319f1e8e3bdd 100 return -2;
Markus_Paar 0:319f1e8e3bdd 101 }
Markus_Paar 0:319f1e8e3bdd 102 fclose(fp);
Markus_Paar 0:319f1e8e3bdd 103 LOG("Local firmware version is %d. (%s)\n\r", ver_local, file_local.c_str());
Markus_Paar 0:319f1e8e3bdd 104
Markus_Paar 0:319f1e8e3bdd 105 /*
Markus_Paar 0:319f1e8e3bdd 106 * Fetch the version from USB Stick.
Markus_Paar 0:319f1e8e3bdd 107 */
Markus_Paar 0:319f1e8e3bdd 108 printf("Fetch the version from USB Stick.\r");
Markus_Paar 0:319f1e8e3bdd 109 std::string file_USB = "/fs/" + src_name + EXT_TXT;
Markus_Paar 0:319f1e8e3bdd 110 fp = fopen(file_USB.c_str(), "rb");
Markus_Paar 0:319f1e8e3bdd 111
Markus_Paar 0:319f1e8e3bdd 112 if (fp == NULL) {
Markus_Paar 0:319f1e8e3bdd 113 LOG("Source firmware version file '%s' open failed.\n\r", file_USB.c_str());
Markus_Paar 0:319f1e8e3bdd 114 return -1;
Markus_Paar 0:319f1e8e3bdd 115 }
Markus_Paar 0:319f1e8e3bdd 116 if (fscanf(fp, "%d", &ver_USB) != 1) {
Markus_Paar 0:319f1e8e3bdd 117 LOG("Source firmware version file '%s' is invalid.\n\r", file_USB.c_str());
Markus_Paar 0:319f1e8e3bdd 118 return -2;
Markus_Paar 0:319f1e8e3bdd 119 }
Markus_Paar 0:319f1e8e3bdd 120 fclose(fp);
Markus_Paar 0:319f1e8e3bdd 121 LOG("Source firmware version is %d. (%s)\n\r", ver_USB, file_USB.c_str());
Markus_Paar 0:319f1e8e3bdd 122
Markus_Paar 0:319f1e8e3bdd 123
Markus_Paar 0:319f1e8e3bdd 124
Markus_Paar 0:319f1e8e3bdd 125 return (ver_local < ver_USB) ? 0 : 1;
Markus_Paar 0:319f1e8e3bdd 126 }
Markus_Paar 0:319f1e8e3bdd 127
Markus_Paar 0:319f1e8e3bdd 128 /**
Markus_Paar 0:319f1e8e3bdd 129 * Execute update.
Markus_Paar 0:319f1e8e3bdd 130 *
Markus_Paar 0:319f1e8e3bdd 131 * @return Return 0 if it succeed.
Markus_Paar 0:319f1e8e3bdd 132 */
Markus_Paar 0:319f1e8e3bdd 133 int FirmwareUpdater::execute() {
Markus_Paar 0:319f1e8e3bdd 134 /*
Markus_Paar 0:319f1e8e3bdd 135 * Fetch the files.
Markus_Paar 0:319f1e8e3bdd 136 */
Markus_Paar 0:319f1e8e3bdd 137 printf("Start execute\r");
Markus_Paar 0:319f1e8e3bdd 138 std::string USB_txt = "/fs/" + src_name + EXT_TXT;
Markus_Paar 0:319f1e8e3bdd 139 std::string USB_bin = "/fs/" + src_name + EXT_BIN;
Markus_Paar 0:319f1e8e3bdd 140
Markus_Paar 0:319f1e8e3bdd 141 /*
Markus_Paar 0:319f1e8e3bdd 142 std::string file_txttmp = "/local/" + name + EXT_TXTTMP;
Markus_Paar 0:319f1e8e3bdd 143 std::string file_bintmp = "/local/" + name + EXT_BINTMP;
Markus_Paar 0:319f1e8e3bdd 144 if (fetch(serv_txt, file_txttmp) != 0) {
Markus_Paar 0:319f1e8e3bdd 145 return -1;
Markus_Paar 0:319f1e8e3bdd 146 }
Markus_Paar 0:319f1e8e3bdd 147 if (fetch(serv_bin, file_bintmp) != 0) {
Markus_Paar 0:319f1e8e3bdd 148 return -2;
Markus_Paar 0:319f1e8e3bdd 149 }*/
Markus_Paar 0:319f1e8e3bdd 150 cleanupAllBinFiles();
Markus_Paar 0:319f1e8e3bdd 151 /*
Markus_Paar 0:319f1e8e3bdd 152 * Copy it.
Markus_Paar 0:319f1e8e3bdd 153 */
Markus_Paar 0:319f1e8e3bdd 154
Markus_Paar 0:319f1e8e3bdd 155 std::string local_txt = "/local/" + dest_name + EXT_TXT;
Markus_Paar 0:319f1e8e3bdd 156 std::string local_bin = "/local/" + dest_name + EXT_BIN;
Markus_Paar 0:319f1e8e3bdd 157 if (copy(USB_txt, local_txt) != 0) {
Markus_Paar 0:319f1e8e3bdd 158 printf("-3");
Markus_Paar 0:319f1e8e3bdd 159 return -3;
Markus_Paar 0:319f1e8e3bdd 160 }
Markus_Paar 0:319f1e8e3bdd 161 if (copy(USB_bin, local_bin) != 0) {
Markus_Paar 0:319f1e8e3bdd 162 printf("-4");
Markus_Paar 0:319f1e8e3bdd 163 return -4;
Markus_Paar 0:319f1e8e3bdd 164 }
Markus_Paar 0:319f1e8e3bdd 165 /*
Markus_Paar 0:319f1e8e3bdd 166 * Delete the temporary files.
Markus_Paar 0:319f1e8e3bdd 167 */
Markus_Paar 0:319f1e8e3bdd 168 //remove(file_txttmp.c_str());
Markus_Paar 0:319f1e8e3bdd 169 //remove(file_bintmp.c_str());
Markus_Paar 0:319f1e8e3bdd 170 return 0;
Markus_Paar 0:319f1e8e3bdd 171 }
Markus_Paar 0:319f1e8e3bdd 172
Markus_Paar 0:319f1e8e3bdd 173
Markus_Paar 0:319f1e8e3bdd 174 /**
Markus_Paar 0:319f1e8e3bdd 175 * Reset system.
Markus_Paar 0:319f1e8e3bdd 176 */
Markus_Paar 0:319f1e8e3bdd 177 void FirmwareUpdater::reset() {
Markus_Paar 0:319f1e8e3bdd 178 mbed_reset();
Markus_Paar 0:319f1e8e3bdd 179 }
Markus_Paar 0:319f1e8e3bdd 180
Markus_Paar 0:319f1e8e3bdd 181 /**
Markus_Paar 0:319f1e8e3bdd 182 * Fetch a file.
Markus_Paar 0:319f1e8e3bdd 183 *
Markus_Paar 0:319f1e8e3bdd 184 * @param src_url URL of a source file.
Markus_Paar 0:319f1e8e3bdd 185 * @param local_file Local file name.
Markus_Paar 0:319f1e8e3bdd 186 *
Markus_Paar 0:319f1e8e3bdd 187 * @return Return 0 if it succeed.
Markus_Paar 0:319f1e8e3bdd 188 */
Markus_Paar 0:319f1e8e3bdd 189 int FirmwareUpdater::fetch(std::string src_name, std::string local_file) {
Markus_Paar 0:319f1e8e3bdd 190 return (0);
Markus_Paar 0:319f1e8e3bdd 191 }
Markus_Paar 0:319f1e8e3bdd 192
Markus_Paar 0:319f1e8e3bdd 193
Markus_Paar 0:319f1e8e3bdd 194 /**
Markus_Paar 0:319f1e8e3bdd 195 * Copy a file.
Markus_Paar 0:319f1e8e3bdd 196 *
Markus_Paar 0:319f1e8e3bdd 197 * @param local_file1 Source file.
Markus_Paar 0:319f1e8e3bdd 198 * @param local_file2 Destination file.
Markus_Paar 0:319f1e8e3bdd 199 *
Markus_Paar 0:319f1e8e3bdd 200 * @return Return 0 if it succeed.
Markus_Paar 0:319f1e8e3bdd 201 */
Markus_Paar 0:319f1e8e3bdd 202 int FirmwareUpdater::copy(std::string local_file1, std::string local_file2) {
Markus_Paar 0:319f1e8e3bdd 203
Markus_Paar 0:319f1e8e3bdd 204 LOG("File copying... (%s->%s)\n\r", local_file1.c_str(), local_file2.c_str());
Markus_Paar 0:319f1e8e3bdd 205
Markus_Paar 0:319f1e8e3bdd 206 FILE *rp = fopen(local_file1.c_str(), "rb");
Markus_Paar 0:319f1e8e3bdd 207 if (rp == NULL) {
Markus_Paar 0:319f1e8e3bdd 208 LOG("File '%s' open failed.\n", local_file1.c_str());
Markus_Paar 0:319f1e8e3bdd 209 return -1;
Markus_Paar 0:319f1e8e3bdd 210 }
Markus_Paar 0:319f1e8e3bdd 211 remove(local_file2.c_str());
Markus_Paar 0:319f1e8e3bdd 212 FILE *wp = fopen(local_file2.c_str(), "wb");
Markus_Paar 0:319f1e8e3bdd 213 if (wp == NULL) {
Markus_Paar 0:319f1e8e3bdd 214 LOG("File '%s' open failed.\n\r", local_file2.c_str());
Markus_Paar 0:319f1e8e3bdd 215 fclose(rp);
Markus_Paar 0:319f1e8e3bdd 216 return -2;
Markus_Paar 0:319f1e8e3bdd 217 }
Markus_Paar 0:319f1e8e3bdd 218 int c;
Markus_Paar 0:319f1e8e3bdd 219 while ((c = fgetc(rp)) != EOF) {
Markus_Paar 0:319f1e8e3bdd 220 fputc(c, wp);
Markus_Paar 0:319f1e8e3bdd 221 }
Markus_Paar 0:319f1e8e3bdd 222 fclose(rp);
Markus_Paar 0:319f1e8e3bdd 223 fclose(wp);
Markus_Paar 0:319f1e8e3bdd 224 LOG("File copied. (%s->%s)\n\r", local_file1.c_str(), local_file2.c_str());
Markus_Paar 0:319f1e8e3bdd 225 return 0;
Markus_Paar 0:319f1e8e3bdd 226 }
Markus_Paar 0:319f1e8e3bdd 227 /**
Markus_Paar 0:319f1e8e3bdd 228 * Clean up all bin files.
Markus_Paar 0:319f1e8e3bdd 229 */
Markus_Paar 0:319f1e8e3bdd 230 int FirmwareUpdater::cleanupAllBinFiles(void)
Markus_Paar 0:319f1e8e3bdd 231 {
Markus_Paar 0:319f1e8e3bdd 232 struct dirent *p;
Markus_Paar 0:319f1e8e3bdd 233 DIR *dir = opendir("/local");
Markus_Paar 0:319f1e8e3bdd 234 if (dir == NULL) {
Markus_Paar 0:319f1e8e3bdd 235 return -1;
Markus_Paar 0:319f1e8e3bdd 236 }
Markus_Paar 0:319f1e8e3bdd 237 while ((p = readdir(dir)) != NULL) {
Markus_Paar 0:319f1e8e3bdd 238 char *str = p->d_name;
Markus_Paar 0:319f1e8e3bdd 239 if ((strstr(str, ".bin") != NULL) || (strstr(str, ".BIN") != NULL)) {
Markus_Paar 0:319f1e8e3bdd 240 char buf[BUFSIZ];
Markus_Paar 0:319f1e8e3bdd 241 snprintf(buf, sizeof(buf) - 1, "/local/%s", str);
Markus_Paar 0:319f1e8e3bdd 242 if (remove(buf) == 0) {
Markus_Paar 0:319f1e8e3bdd 243 LOG("INFO: Deleted '%s'.\n", buf);
Markus_Paar 0:319f1e8e3bdd 244 } else {
Markus_Paar 0:319f1e8e3bdd 245 LOG("ERR : Delete '%s' failed.\n", buf);
Markus_Paar 0:319f1e8e3bdd 246 }
Markus_Paar 0:319f1e8e3bdd 247 }
Markus_Paar 0:319f1e8e3bdd 248 }
Markus_Paar 0:319f1e8e3bdd 249 closedir(dir);
Markus_Paar 0:319f1e8e3bdd 250 return 0;
Markus_Paar 0:319f1e8e3bdd 251 }
Markus_Paar 0:319f1e8e3bdd 252
Markus_Paar 0:319f1e8e3bdd 253
Markus_Paar 0:319f1e8e3bdd 254 /*
Markus_Paar 0:319f1e8e3bdd 255 * Output a message to a log file.
Markus_Paar 0:319f1e8e3bdd 256 *
Markus_Paar 0:319f1e8e3bdd 257 * @param format ...
Markus_Paar 0:319f1e8e3bdd 258 */
Markus_Paar 0:319f1e8e3bdd 259 void FirmwareUpdater::LOG(const char* format, ...) {
Markus_Paar 0:319f1e8e3bdd 260 if (log) {
Markus_Paar 0:319f1e8e3bdd 261 FILE *fplog = fopen("/local/update.log", "a");
Markus_Paar 0:319f1e8e3bdd 262 if (fplog != NULL) {
Markus_Paar 0:319f1e8e3bdd 263 char buf[BUFSIZ];
Markus_Paar 0:319f1e8e3bdd 264 va_list p;
Markus_Paar 0:319f1e8e3bdd 265 va_start(p, format);
Markus_Paar 0:319f1e8e3bdd 266 vsnprintf(buf, sizeof(buf) - 1, format, p);
Markus_Paar 0:319f1e8e3bdd 267 fprintf(fplog, "%s", buf);
Markus_Paar 0:319f1e8e3bdd 268 va_end(p);
Markus_Paar 0:319f1e8e3bdd 269 fclose(fplog);
Markus_Paar 0:319f1e8e3bdd 270 }
Markus_Paar 0:319f1e8e3bdd 271 }
Markus_Paar 0:319f1e8e3bdd 272
Markus_Paar 0:319f1e8e3bdd 273
Markus_Paar 0:319f1e8e3bdd 274 }