The FirmwareUpdater is a mbed firmware update library with HTTP server on cloud.

Fork of FirmwareUpdater by Shinichiro Nakamura

Committer:
vinajarr
Date:
Thu Nov 13 07:40:14 2014 +0000
Revision:
4:8bfdadb09544
Parent:
3:851bd91fa0ae
error correction in the program

Who changed what in which revision?

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