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 #ifndef FIRMWARE_UPDATER_H
Markus_Paar 0:48870d877970 28 #define FIRMWARE_UPDATER_H
Markus_Paar 0:48870d877970 29
Markus_Paar 0:48870d877970 30 #include "mbed.h"
Markus_Paar 0:48870d877970 31 //#include "HTTPClient.h"
Markus_Paar 0:48870d877970 32 #include "LocalFileSystem.h"
Markus_Paar 0:48870d877970 33 #include <string>
Markus_Paar 0:48870d877970 34
Markus_Paar 0:48870d877970 35 /**
Markus_Paar 0:48870d877970 36 * @code
Markus_Paar 0:48870d877970 37 * #include "mbed.h"
Markus_Paar 0:48870d877970 38 * #include "FirmwareUpdater.h"
Markus_Paar 0:48870d877970 39 * #include "EthernetNetIf.h"
Markus_Paar 0:48870d877970 40 *
Markus_Paar 0:48870d877970 41 * EthernetNetIf eth;
Markus_Paar 0:48870d877970 42 * FirmwareUpdater fwup("http://mbed.org/media/uploads/shintamainjp/", "firm", true);
Markus_Paar 0:48870d877970 43 *
Markus_Paar 0:48870d877970 44 * // There are 2 files for the firmware.
Markus_Paar 0:48870d877970 45 * // 1. firm.txt : firmware version file.
Markus_Paar 0:48870d877970 46 * // 2. firm.bin : firmware binary file.
Markus_Paar 0:48870d877970 47 *
Markus_Paar 0:48870d877970 48 * int main() {
Markus_Paar 0:48870d877970 49 * eth.setup();
Markus_Paar 0:48870d877970 50 * if (fwup.exist() == 0) {
Markus_Paar 0:48870d877970 51 * printf("Found a new firmware.\n");
Markus_Paar 0:48870d877970 52 * if (fwup.execute() == 0) {
Markus_Paar 0:48870d877970 53 * printf("Update succeed.\n");
Markus_Paar 0:48870d877970 54 * printf("Resetting this system...\n\n\n\n\n");
Markus_Paar 0:48870d877970 55 * fwup.reset();
Markus_Paar 0:48870d877970 56 * } else {
Markus_Paar 0:48870d877970 57 * printf("Update failed!\n");
Markus_Paar 0:48870d877970 58 * }
Markus_Paar 0:48870d877970 59 * }
Markus_Paar 0:48870d877970 60 * }
Markus_Paar 0:48870d877970 61 * @endcode
Markus_Paar 0:48870d877970 62 */
Markus_Paar 0:48870d877970 63 class FirmwareUpdater {
Markus_Paar 0:48870d877970 64 public:
Markus_Paar 0:48870d877970 65 /**
Markus_Paar 0:48870d877970 66 * Create.
Markus_Paar 0:48870d877970 67 *
Markus_Paar 0:48870d877970 68 * @param url URL for firmware. Do not include a target file name.
Markus_Paar 0:48870d877970 69 * @param name An application name. Do not include a extention.
Markus_Paar 0:48870d877970 70 * @param log True if logging.
Markus_Paar 0:48870d877970 71 */
Markus_Paar 0:48870d877970 72 FirmwareUpdater(std::string src_name, std::string dest_name, bool log = false);
Markus_Paar 0:48870d877970 73
Markus_Paar 0:48870d877970 74 /**
Markus_Paar 0:48870d877970 75 * Dispose.
Markus_Paar 0:48870d877970 76 */
Markus_Paar 0:48870d877970 77 ~FirmwareUpdater();
Markus_Paar 0:48870d877970 78
Markus_Paar 0:48870d877970 79 /**
Markus_Paar 0:48870d877970 80 * Get a URL.
Markus_Paar 0:48870d877970 81 *
Markus_Paar 0:48870d877970 82 * @return URL.
Markus_Paar 0:48870d877970 83 */
Markus_Paar 0:48870d877970 84 const std::string get_src_name() const;
Markus_Paar 0:48870d877970 85
Markus_Paar 0:48870d877970 86 /**
Markus_Paar 0:48870d877970 87 * Get a name.
Markus_Paar 0:48870d877970 88 *
Markus_Paar 0:48870d877970 89 * @return name.
Markus_Paar 0:48870d877970 90 */
Markus_Paar 0:48870d877970 91 const std::string get_dest_name() const;
Markus_Paar 0:48870d877970 92
Markus_Paar 0:48870d877970 93 /**
Markus_Paar 0:48870d877970 94 * Checking a new firmware.
Markus_Paar 0:48870d877970 95 * Compare versions of the software between local storage on mbed and on webserver.
Markus_Paar 0:48870d877970 96 *
Markus_Paar 0:48870d877970 97 * @return Return 0 if a new firmware exists.
Markus_Paar 0:48870d877970 98 */
Markus_Paar 0:48870d877970 99 int exist();
Markus_Paar 0:48870d877970 100
Markus_Paar 0:48870d877970 101 /**
Markus_Paar 0:48870d877970 102 * Execute update.
Markus_Paar 0:48870d877970 103 *
Markus_Paar 0:48870d877970 104 * @return Return 0 if it succeed.
Markus_Paar 0:48870d877970 105 */
Markus_Paar 0:48870d877970 106 int execute();
Markus_Paar 0:48870d877970 107
Markus_Paar 0:48870d877970 108 /**
Markus_Paar 0:48870d877970 109 * Reset system.
Markus_Paar 0:48870d877970 110 */
Markus_Paar 0:48870d877970 111 void reset();
Markus_Paar 0:48870d877970 112
Markus_Paar 0:48870d877970 113 private:
Markus_Paar 0:48870d877970 114 static const int MAXNAMELEN = 8;
Markus_Paar 0:48870d877970 115 static const std::string EXT_BIN;
Markus_Paar 0:48870d877970 116 static const std::string EXT_BINTMP;
Markus_Paar 0:48870d877970 117 static const std::string EXT_TXT;
Markus_Paar 0:48870d877970 118 static const std::string EXT_TXTTMP;
Markus_Paar 0:48870d877970 119 const std::string src_name;
Markus_Paar 0:48870d877970 120 const std::string dest_name;
Markus_Paar 0:48870d877970 121 const bool log;
Markus_Paar 0:48870d877970 122 LocalFileSystem local;
Markus_Paar 0:48870d877970 123
Markus_Paar 0:48870d877970 124
Markus_Paar 0:48870d877970 125 /**
Markus_Paar 0:48870d877970 126 * Fetch a file.
Markus_Paar 0:48870d877970 127 *
Markus_Paar 0:48870d877970 128 * @param src_url URL of a source file.
Markus_Paar 0:48870d877970 129 * @param local_file Local file name.
Markus_Paar 0:48870d877970 130 *
Markus_Paar 0:48870d877970 131 * @return Return 0 if it succeed.
Markus_Paar 0:48870d877970 132 */
Markus_Paar 0:48870d877970 133 //int fetch(std::string src_usb, std::string local_file);
Markus_Paar 0:48870d877970 134
Markus_Paar 0:48870d877970 135 /**
Markus_Paar 0:48870d877970 136 * Copy a file.
Markus_Paar 0:48870d877970 137 *
Markus_Paar 0:48870d877970 138 * @param local_file1 Source file.
Markus_Paar 0:48870d877970 139 * @param local_file2 Destination file.
Markus_Paar 0:48870d877970 140 *
Markus_Paar 0:48870d877970 141 * @return Return 0 if it succeed.
Markus_Paar 0:48870d877970 142 */
Markus_Paar 0:48870d877970 143 int copy(std::string local_file1, std::string local_file2);
Markus_Paar 0:48870d877970 144
Markus_Paar 0:48870d877970 145 /**
Markus_Paar 0:48870d877970 146 * Output a message to a log file.
Markus_Paar 0:48870d877970 147 *
Markus_Paar 0:48870d877970 148 * @param format ...
Markus_Paar 0:48870d877970 149 */
Markus_Paar 0:48870d877970 150 void LOG(const char* format, ...);
Markus_Paar 0:48870d877970 151
Markus_Paar 0:48870d877970 152 /**
Markus_Paar 0:48870d877970 153 * Cleanup all bin files.
Markus_Paar 0:48870d877970 154 */
Markus_Paar 0:48870d877970 155 int cleanupAllBinFiles(void);
Markus_Paar 0:48870d877970 156
Markus_Paar 0:48870d877970 157 /**
Markus_Paar 0:48870d877970 158 * Create a new binary file name.
Markus_Paar 0:48870d877970 159 *
Markus_Paar 0:48870d877970 160 * @param ver Version.
Markus_Paar 0:48870d877970 161 * @param buf A pointer to a buffer.
Markus_Paar 0:48870d877970 162 * @param siz A size of the buffer.
Markus_Paar 0:48870d877970 163 *
Markus_Paar 0:48870d877970 164 * @return Return 0 if it succeed.
Markus_Paar 0:48870d877970 165 */
Markus_Paar 0:48870d877970 166 int createNewBinName(const int ver, char *buf, size_t siz);
Markus_Paar 0:48870d877970 167
Markus_Paar 0:48870d877970 168 /**
Markus_Paar 0:48870d877970 169 * Read a version from a file.
Markus_Paar 0:48870d877970 170 *
Markus_Paar 0:48870d877970 171 * @param filename file name.
Markus_Paar 0:48870d877970 172 * @return A version.
Markus_Paar 0:48870d877970 173 */
Markus_Paar 0:48870d877970 174 int readVersionFromFile(const char *filename);
Markus_Paar 0:48870d877970 175
Markus_Paar 0:48870d877970 176 /**
Markus_Paar 0:48870d877970 177 * Read a version from a URL.
Markus_Paar 0:48870d877970 178 *
Markus_Paar 0:48870d877970 179 * @param url URL.
Markus_Paar 0:48870d877970 180 * @return A version.
Markus_Paar 0:48870d877970 181 */
Markus_Paar 0:48870d877970 182 int readVersionFromUSB(const char *src_name);
Markus_Paar 0:48870d877970 183 };
Markus_Paar 0:48870d877970 184
Markus_Paar 0:48870d877970 185 #endif