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

Dependents:   FirmwareUpdater_TestProgram geigercounter04 firm LPC1768_up_frim

Committer:
shintamainjp
Date:
Fri Nov 05 12:16:17 2010 +0000
Revision:
3:851bd91fa0ae
Parent:
1:0305a8120f06
Specification changed. The maximum firmware name length changed to 8 from 4.

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 */
shintamainjp 0:f9bdb06ab672 72 FirmwareUpdater(std::string url, std::string name, bool log = false);
shintamainjp 0:f9bdb06ab672 73
shintamainjp 0:f9bdb06ab672 74 /**
shintamainjp 0:f9bdb06ab672 75 * Dispose.
shintamainjp 0:f9bdb06ab672 76 */
shintamainjp 0:f9bdb06ab672 77 ~FirmwareUpdater();
shintamainjp 0:f9bdb06ab672 78
shintamainjp 0:f9bdb06ab672 79 /**
shintamainjp 0:f9bdb06ab672 80 * Get a URL.
shintamainjp 0:f9bdb06ab672 81 *
shintamainjp 0:f9bdb06ab672 82 * @return URL.
shintamainjp 0:f9bdb06ab672 83 */
shintamainjp 0:f9bdb06ab672 84 const std::string getURL() const;
shintamainjp 0:f9bdb06ab672 85
shintamainjp 0:f9bdb06ab672 86 /**
shintamainjp 0:f9bdb06ab672 87 * Get a name.
shintamainjp 0:f9bdb06ab672 88 *
shintamainjp 0:f9bdb06ab672 89 * @return name.
shintamainjp 0:f9bdb06ab672 90 */
shintamainjp 0:f9bdb06ab672 91 const std::string getName() const;
shintamainjp 0:f9bdb06ab672 92
shintamainjp 0:f9bdb06ab672 93 /**
shintamainjp 0:f9bdb06ab672 94 * Checking a new firmware.
shintamainjp 0:f9bdb06ab672 95 * Compare versions of the software between local storage on mbed and on webserver.
shintamainjp 0:f9bdb06ab672 96 *
shintamainjp 0:f9bdb06ab672 97 * @return Return 0 if a new firmware exists.
shintamainjp 0:f9bdb06ab672 98 */
shintamainjp 0:f9bdb06ab672 99 int exist();
shintamainjp 0:f9bdb06ab672 100
shintamainjp 0:f9bdb06ab672 101 /**
shintamainjp 0:f9bdb06ab672 102 * Execute update.
shintamainjp 0:f9bdb06ab672 103 *
shintamainjp 0:f9bdb06ab672 104 * @return Return 0 if it succeed.
shintamainjp 0:f9bdb06ab672 105 */
shintamainjp 0:f9bdb06ab672 106 int execute();
shintamainjp 0:f9bdb06ab672 107
shintamainjp 0:f9bdb06ab672 108 /**
shintamainjp 0:f9bdb06ab672 109 * Reset system.
shintamainjp 0:f9bdb06ab672 110 */
shintamainjp 0:f9bdb06ab672 111 void reset();
shintamainjp 3:851bd91fa0ae 112
shintamainjp 0:f9bdb06ab672 113 private:
shintamainjp 3:851bd91fa0ae 114 static const int MAXNAMELEN = 8;
shintamainjp 0:f9bdb06ab672 115 static const std::string EXT_BIN;
shintamainjp 0:f9bdb06ab672 116 static const std::string EXT_BINTMP;
shintamainjp 0:f9bdb06ab672 117 static const std::string EXT_TXT;
shintamainjp 0:f9bdb06ab672 118 static const std::string EXT_TXTTMP;
shintamainjp 0:f9bdb06ab672 119 const std::string url;
shintamainjp 0:f9bdb06ab672 120 const std::string name;
shintamainjp 0:f9bdb06ab672 121 const bool log;
shintamainjp 0:f9bdb06ab672 122 LocalFileSystem local;
shintamainjp 0:f9bdb06ab672 123 HTTPClient client;
shintamainjp 0:f9bdb06ab672 124
shintamainjp 0:f9bdb06ab672 125 /**
shintamainjp 0:f9bdb06ab672 126 * Fetch a file.
shintamainjp 0:f9bdb06ab672 127 *
shintamainjp 0:f9bdb06ab672 128 * @param src_url URL of a source file.
shintamainjp 0:f9bdb06ab672 129 * @param local_file Local file name.
shintamainjp 0:f9bdb06ab672 130 *
shintamainjp 0:f9bdb06ab672 131 * @return Return 0 if it succeed.
shintamainjp 0:f9bdb06ab672 132 */
shintamainjp 0:f9bdb06ab672 133 int fetch(std::string src_url, std::string local_file);
shintamainjp 0:f9bdb06ab672 134
shintamainjp 0:f9bdb06ab672 135 /**
shintamainjp 0:f9bdb06ab672 136 * Copy a file.
shintamainjp 0:f9bdb06ab672 137 *
shintamainjp 0:f9bdb06ab672 138 * @param local_file1 Source file.
shintamainjp 0:f9bdb06ab672 139 * @param local_file2 Destination file.
shintamainjp 0:f9bdb06ab672 140 *
shintamainjp 0:f9bdb06ab672 141 * @return Return 0 if it succeed.
shintamainjp 0:f9bdb06ab672 142 */
shintamainjp 0:f9bdb06ab672 143 int copy(std::string local_file1, std::string local_file2);
shintamainjp 0:f9bdb06ab672 144
shintamainjp 0:f9bdb06ab672 145 /**
shintamainjp 0:f9bdb06ab672 146 * Output a message to a log file.
shintamainjp 0:f9bdb06ab672 147 *
shintamainjp 0:f9bdb06ab672 148 * @param format ...
shintamainjp 0:f9bdb06ab672 149 */
shintamainjp 0:f9bdb06ab672 150 void LOG(const char* format, ...);
shintamainjp 0:f9bdb06ab672 151
shintamainjp 1:0305a8120f06 152 /**
shintamainjp 1:0305a8120f06 153 * Cleanup all bin files.
shintamainjp 1:0305a8120f06 154 */
shintamainjp 1:0305a8120f06 155 int cleanupAllBinFiles(void);
shintamainjp 3:851bd91fa0ae 156
shintamainjp 3:851bd91fa0ae 157 /**
shintamainjp 3:851bd91fa0ae 158 * Create a new binary file name.
shintamainjp 3:851bd91fa0ae 159 *
shintamainjp 3:851bd91fa0ae 160 * @param ver Version.
shintamainjp 3:851bd91fa0ae 161 * @param buf A pointer to a buffer.
shintamainjp 3:851bd91fa0ae 162 * @param siz A size of the buffer.
shintamainjp 3:851bd91fa0ae 163 *
shintamainjp 3:851bd91fa0ae 164 * @return Return 0 if it succeed.
shintamainjp 3:851bd91fa0ae 165 */
shintamainjp 3:851bd91fa0ae 166 int createNewBinName(const int ver, char *buf, size_t siz);
shintamainjp 1:0305a8120f06 167
shintamainjp 1:0305a8120f06 168 /**
shintamainjp 1:0305a8120f06 169 * Read a version from a file.
shintamainjp 1:0305a8120f06 170 *
shintamainjp 1:0305a8120f06 171 * @param filename file name.
shintamainjp 1:0305a8120f06 172 * @return A version.
shintamainjp 1:0305a8120f06 173 */
shintamainjp 1:0305a8120f06 174 int readVersionFromFile(const char *filename);
shintamainjp 1:0305a8120f06 175
shintamainjp 1:0305a8120f06 176 /**
shintamainjp 1:0305a8120f06 177 * Read a version from a URL.
shintamainjp 1:0305a8120f06 178 *
shintamainjp 1:0305a8120f06 179 * @param url URL.
shintamainjp 1:0305a8120f06 180 * @return A version.
shintamainjp 1:0305a8120f06 181 */
shintamainjp 1:0305a8120f06 182 int readVersionFromURL(const char *url);
shintamainjp 0:f9bdb06ab672 183 };
shintamainjp 0:f9bdb06ab672 184
shintamainjp 0:f9bdb06ab672 185 #endif