http://http://diytec.web.fc2.com/mark2r2/

Dependencies:   EthernetNetIf NTPClient_NetServices mbed ConfigFile

Committer:
mark2r2
Date:
Tue Sep 20 12:46:26 2011 +0000
Revision:
0:08a4d61cd84c
V1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mark2r2 0:08a4d61cd84c 1 /*******************************************************************************
mark2r2 0:08a4d61cd84c 2 modify
mark2r2 0:08a4d61cd84c 3 2011/08
mark2r2 0:08a4d61cd84c 4 - Use commonClient.
mark2r2 0:08a4d61cd84c 5 2011/07
mark2r2 0:08a4d61cd84c 6 - Add MD5 checksum.
mark2r2 0:08a4d61cd84c 7
mark2r2 0:08a4d61cd84c 8 *******************************************************************************/
mark2r2 0:08a4d61cd84c 9
mark2r2 0:08a4d61cd84c 10
mark2r2 0:08a4d61cd84c 11 /**
mark2r2 0:08a4d61cd84c 12 * =============================================================================
mark2r2 0:08a4d61cd84c 13 * Firmware updater (Version 0.0.2)
mark2r2 0:08a4d61cd84c 14 * =============================================================================
mark2r2 0:08a4d61cd84c 15 * Copyright (c) 2010 Shinichiro Nakamura (CuBeatSystems)
mark2r2 0:08a4d61cd84c 16 *
mark2r2 0:08a4d61cd84c 17 * Permission is hereby granted, free of charge, to any person obtaining a copy
mark2r2 0:08a4d61cd84c 18 * of this software and associated documentation files (the "Software"), to deal
mark2r2 0:08a4d61cd84c 19 * in the Software without restriction, including without limitation the rights
mark2r2 0:08a4d61cd84c 20 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mark2r2 0:08a4d61cd84c 21 * copies of the Software, and to permit persons to whom the Software is
mark2r2 0:08a4d61cd84c 22 * furnished to do so, subject to the following conditions:
mark2r2 0:08a4d61cd84c 23 *
mark2r2 0:08a4d61cd84c 24 * The above copyright notice and this permission notice shall be included in
mark2r2 0:08a4d61cd84c 25 * all copies or substantial portions of the Software.
mark2r2 0:08a4d61cd84c 26 *
mark2r2 0:08a4d61cd84c 27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mark2r2 0:08a4d61cd84c 28 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mark2r2 0:08a4d61cd84c 29 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mark2r2 0:08a4d61cd84c 30 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mark2r2 0:08a4d61cd84c 31 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mark2r2 0:08a4d61cd84c 32 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
mark2r2 0:08a4d61cd84c 33 * THE SOFTWARE.
mark2r2 0:08a4d61cd84c 34 * =============================================================================
mark2r2 0:08a4d61cd84c 35 */
mark2r2 0:08a4d61cd84c 36
mark2r2 0:08a4d61cd84c 37 #ifndef FIRMWARE_UPDATER_H
mark2r2 0:08a4d61cd84c 38 #define FIRMWARE_UPDATER_H
mark2r2 0:08a4d61cd84c 39
mark2r2 0:08a4d61cd84c 40 #include "mbed.h"
mark2r2 0:08a4d61cd84c 41 #include "HTTPClient.h"
mark2r2 0:08a4d61cd84c 42 #include "LocalFileSystem.h"
mark2r2 0:08a4d61cd84c 43 #include <string>
mark2r2 0:08a4d61cd84c 44
mark2r2 0:08a4d61cd84c 45 /**
mark2r2 0:08a4d61cd84c 46 * @code
mark2r2 0:08a4d61cd84c 47 * #include "mbed.h"
mark2r2 0:08a4d61cd84c 48 * #include "FirmwareUpdater.h"
mark2r2 0:08a4d61cd84c 49 * #include "EthernetNetIf.h"
mark2r2 0:08a4d61cd84c 50 *
mark2r2 0:08a4d61cd84c 51 * EthernetNetIf eth;
mark2r2 0:08a4d61cd84c 52 * FirmwareUpdater fwup("http://mbed.org/media/uploads/shintamainjp/", "firm", true);
mark2r2 0:08a4d61cd84c 53 *
mark2r2 0:08a4d61cd84c 54 * // There are 2 files for the firmware.
mark2r2 0:08a4d61cd84c 55 * // 1. firm.txt : firmware version file.
mark2r2 0:08a4d61cd84c 56 * // 2. firm.bin : firmware binary file.
mark2r2 0:08a4d61cd84c 57 *
mark2r2 0:08a4d61cd84c 58 * int main() {
mark2r2 0:08a4d61cd84c 59 * eth.setup();
mark2r2 0:08a4d61cd84c 60 * if (fwup.exist() == 0) {
mark2r2 0:08a4d61cd84c 61 * printf("Found a new firmware.\n");
mark2r2 0:08a4d61cd84c 62 * if (fwup.execute() == 0) {
mark2r2 0:08a4d61cd84c 63 * printf("Update succeed.\n");
mark2r2 0:08a4d61cd84c 64 * printf("Resetting this system...\n\n\n\n\n");
mark2r2 0:08a4d61cd84c 65 * fwup.reset();
mark2r2 0:08a4d61cd84c 66 * } else {
mark2r2 0:08a4d61cd84c 67 * printf("Update failed!\n");
mark2r2 0:08a4d61cd84c 68 * }
mark2r2 0:08a4d61cd84c 69 * }
mark2r2 0:08a4d61cd84c 70 * }
mark2r2 0:08a4d61cd84c 71 * @endcode
mark2r2 0:08a4d61cd84c 72 */
mark2r2 0:08a4d61cd84c 73 class FirmwareUpdater {
mark2r2 0:08a4d61cd84c 74 public:
mark2r2 0:08a4d61cd84c 75 /**
mark2r2 0:08a4d61cd84c 76 * Create.
mark2r2 0:08a4d61cd84c 77 *
mark2r2 0:08a4d61cd84c 78 * @param url URL for firmware. Do not include a target file name.
mark2r2 0:08a4d61cd84c 79 * @param name An application name. Do not include a extention.
mark2r2 0:08a4d61cd84c 80 * @param log True if logging.
mark2r2 0:08a4d61cd84c 81 */
mark2r2 0:08a4d61cd84c 82 // FirmwareUpdater(std::string url, std::string name, bool log = false);
mark2r2 0:08a4d61cd84c 83 FirmwareUpdater(std::string url, std::string name, HTTPClient *pclient, bool log = false); // 2011/08
mark2r2 0:08a4d61cd84c 84
mark2r2 0:08a4d61cd84c 85 /**
mark2r2 0:08a4d61cd84c 86 * Dispose.
mark2r2 0:08a4d61cd84c 87 */
mark2r2 0:08a4d61cd84c 88 ~FirmwareUpdater();
mark2r2 0:08a4d61cd84c 89
mark2r2 0:08a4d61cd84c 90 /**
mark2r2 0:08a4d61cd84c 91 * Get a URL.
mark2r2 0:08a4d61cd84c 92 *
mark2r2 0:08a4d61cd84c 93 * @return URL.
mark2r2 0:08a4d61cd84c 94 */
mark2r2 0:08a4d61cd84c 95 const std::string getURL() const;
mark2r2 0:08a4d61cd84c 96
mark2r2 0:08a4d61cd84c 97 /**
mark2r2 0:08a4d61cd84c 98 * Get a name.
mark2r2 0:08a4d61cd84c 99 *
mark2r2 0:08a4d61cd84c 100 * @return name.
mark2r2 0:08a4d61cd84c 101 */
mark2r2 0:08a4d61cd84c 102 const std::string getName() const;
mark2r2 0:08a4d61cd84c 103
mark2r2 0:08a4d61cd84c 104 /**
mark2r2 0:08a4d61cd84c 105 * Checking a new firmware.
mark2r2 0:08a4d61cd84c 106 * Compare versions of the software between local storage on mbed and on webserver.
mark2r2 0:08a4d61cd84c 107 *
mark2r2 0:08a4d61cd84c 108 * @return Return 0 if a new firmware exists.
mark2r2 0:08a4d61cd84c 109 */
mark2r2 0:08a4d61cd84c 110 int exist();
mark2r2 0:08a4d61cd84c 111
mark2r2 0:08a4d61cd84c 112 /**
mark2r2 0:08a4d61cd84c 113 * Execute update.
mark2r2 0:08a4d61cd84c 114 *
mark2r2 0:08a4d61cd84c 115 * @return Return 0 if it succeed.
mark2r2 0:08a4d61cd84c 116 */
mark2r2 0:08a4d61cd84c 117 int execute();
mark2r2 0:08a4d61cd84c 118
mark2r2 0:08a4d61cd84c 119 /**
mark2r2 0:08a4d61cd84c 120 * Reset system.
mark2r2 0:08a4d61cd84c 121 */
mark2r2 0:08a4d61cd84c 122 void reset();
mark2r2 0:08a4d61cd84c 123
mark2r2 0:08a4d61cd84c 124 private:
mark2r2 0:08a4d61cd84c 125 static const int MAXNAMELEN = 8;
mark2r2 0:08a4d61cd84c 126 static const std::string EXT_BIN;
mark2r2 0:08a4d61cd84c 127 static const std::string EXT_BINTMP;
mark2r2 0:08a4d61cd84c 128 static const std::string EXT_TXT;
mark2r2 0:08a4d61cd84c 129 static const std::string EXT_TXTTMP;
mark2r2 0:08a4d61cd84c 130 static const std::string EXT_MD5; // 2011/07
mark2r2 0:08a4d61cd84c 131 static const std::string EXT_MD5TMP; // 2011/07
mark2r2 0:08a4d61cd84c 132 const std::string url;
mark2r2 0:08a4d61cd84c 133 const std::string name;
mark2r2 0:08a4d61cd84c 134 const bool log;
mark2r2 0:08a4d61cd84c 135 LocalFileSystem local;
mark2r2 0:08a4d61cd84c 136 HTTPClient *client;
mark2r2 0:08a4d61cd84c 137
mark2r2 0:08a4d61cd84c 138 /**
mark2r2 0:08a4d61cd84c 139 * Fetch a file.
mark2r2 0:08a4d61cd84c 140 *
mark2r2 0:08a4d61cd84c 141 * @param src_url URL of a source file.
mark2r2 0:08a4d61cd84c 142 * @param local_file Local file name.
mark2r2 0:08a4d61cd84c 143 *
mark2r2 0:08a4d61cd84c 144 * @return Return 0 if it succeed.
mark2r2 0:08a4d61cd84c 145 */
mark2r2 0:08a4d61cd84c 146 int fetch(std::string src_url, std::string local_file);
mark2r2 0:08a4d61cd84c 147
mark2r2 0:08a4d61cd84c 148 /**
mark2r2 0:08a4d61cd84c 149 * Copy a file.
mark2r2 0:08a4d61cd84c 150 *
mark2r2 0:08a4d61cd84c 151 * @param local_file1 Source file.
mark2r2 0:08a4d61cd84c 152 * @param local_file2 Destination file.
mark2r2 0:08a4d61cd84c 153 *
mark2r2 0:08a4d61cd84c 154 * @return Return 0 if it succeed.
mark2r2 0:08a4d61cd84c 155 */
mark2r2 0:08a4d61cd84c 156 int copy(std::string local_file1, std::string local_file2);
mark2r2 0:08a4d61cd84c 157
mark2r2 0:08a4d61cd84c 158 /**
mark2r2 0:08a4d61cd84c 159 * Output a message to a log file.
mark2r2 0:08a4d61cd84c 160 *
mark2r2 0:08a4d61cd84c 161 * @param format ...
mark2r2 0:08a4d61cd84c 162 */
mark2r2 0:08a4d61cd84c 163 void LOG(const char* format, ...);
mark2r2 0:08a4d61cd84c 164
mark2r2 0:08a4d61cd84c 165 /**
mark2r2 0:08a4d61cd84c 166 * Cleanup all bin files.
mark2r2 0:08a4d61cd84c 167 */
mark2r2 0:08a4d61cd84c 168 int cleanupAllBinFiles(void);
mark2r2 0:08a4d61cd84c 169
mark2r2 0:08a4d61cd84c 170 /**
mark2r2 0:08a4d61cd84c 171 * Cleanup all bbk(binary backup) files.
mark2r2 0:08a4d61cd84c 172 * 2011/07
mark2r2 0:08a4d61cd84c 173 */
mark2r2 0:08a4d61cd84c 174 int cleanupAllBbkFiles(void);
mark2r2 0:08a4d61cd84c 175
mark2r2 0:08a4d61cd84c 176 /**
mark2r2 0:08a4d61cd84c 177 * Backup BIN files.
mark2r2 0:08a4d61cd84c 178 * 2011/07
mark2r2 0:08a4d61cd84c 179 */
mark2r2 0:08a4d61cd84c 180 int BackupBinFiles(void);
mark2r2 0:08a4d61cd84c 181
mark2r2 0:08a4d61cd84c 182 /**
mark2r2 0:08a4d61cd84c 183 * Create a new binary file name.
mark2r2 0:08a4d61cd84c 184 *
mark2r2 0:08a4d61cd84c 185 * @param ver Version.
mark2r2 0:08a4d61cd84c 186 * @param buf A pointer to a buffer.
mark2r2 0:08a4d61cd84c 187 * @param siz A size of the buffer.
mark2r2 0:08a4d61cd84c 188 *
mark2r2 0:08a4d61cd84c 189 * @return Return 0 if it succeed.
mark2r2 0:08a4d61cd84c 190 */
mark2r2 0:08a4d61cd84c 191 int createNewBinName(const int ver, char *buf, size_t siz);
mark2r2 0:08a4d61cd84c 192
mark2r2 0:08a4d61cd84c 193 /**
mark2r2 0:08a4d61cd84c 194 * Read a version from a file.
mark2r2 0:08a4d61cd84c 195 *
mark2r2 0:08a4d61cd84c 196 * @param filename file name.
mark2r2 0:08a4d61cd84c 197 * @return A version.
mark2r2 0:08a4d61cd84c 198 */
mark2r2 0:08a4d61cd84c 199 int readVersionFromFile(const char *filename);
mark2r2 0:08a4d61cd84c 200
mark2r2 0:08a4d61cd84c 201 /**
mark2r2 0:08a4d61cd84c 202 * Read a version from a URL.
mark2r2 0:08a4d61cd84c 203 *
mark2r2 0:08a4d61cd84c 204 * @param url URL.
mark2r2 0:08a4d61cd84c 205 * @return A version.
mark2r2 0:08a4d61cd84c 206 */
mark2r2 0:08a4d61cd84c 207 int readVersionFromURL(const char *url);
mark2r2 0:08a4d61cd84c 208
mark2r2 0:08a4d61cd84c 209 /**
mark2r2 0:08a4d61cd84c 210 * Read a MD5 from a file.
mark2r2 0:08a4d61cd84c 211 * 2011/07
mark2r2 0:08a4d61cd84c 212 * @param filename file name.
mark2r2 0:08a4d61cd84c 213 * @param md5str MD5 string.
mark2r2 0:08a4d61cd84c 214 * @return Error code.
mark2r2 0:08a4d61cd84c 215 */
mark2r2 0:08a4d61cd84c 216 int readMd5FromFile(const char *filename, char *md5str);
mark2r2 0:08a4d61cd84c 217 };
mark2r2 0:08a4d61cd84c 218
mark2r2 0:08a4d61cd84c 219 #endif