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

Dependents:   FirmwareUpdater_TestProgram geigercounter04 firm LPC1768_up_frim

FirmwareUpdater.h

Committer:
shintamainjp
Date:
2010-11-05
Revision:
3:851bd91fa0ae
Parent:
1:0305a8120f06

File content as of revision 3:851bd91fa0ae:

/**
 * =============================================================================
 * Firmware updater (Version 0.0.2)
 * =============================================================================
 * Copyright (c) 2010 Shinichiro Nakamura (CuBeatSystems)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * =============================================================================
 */

#ifndef FIRMWARE_UPDATER_H
#define FIRMWARE_UPDATER_H

#include "mbed.h"
#include "HTTPClient.h"
#include "LocalFileSystem.h"
#include <string>

/**
 * @code
 * #include "mbed.h"
 * #include "FirmwareUpdater.h"
 * #include "EthernetNetIf.h"
 *
 * EthernetNetIf eth;
 * FirmwareUpdater fwup("http://mbed.org/media/uploads/shintamainjp/", "firm", true);
 *
 * // There are 2 files for the firmware.
 * //  1. firm.txt : firmware version file.
 * //  2. firm.bin : firmware binary file.
 *
 * int main() {
 *     eth.setup();
 *     if (fwup.exist() == 0) {
 *         printf("Found a new firmware.\n");
 *         if (fwup.execute() == 0) {
 *             printf("Update succeed.\n");
 *             printf("Resetting this system...\n\n\n\n\n");
 *             fwup.reset();
 *         } else {
 *             printf("Update failed!\n");
 *         }
 *     }
 * }
 * @endcode
 */
class FirmwareUpdater {
public:
    /**
     * Create.
     *
     * @param url URL for firmware. Do not include a target file name.
     * @param name An application name. Do not include a extention.
     * @param log True if logging.
     */
    FirmwareUpdater(std::string url, std::string name, bool log = false);

    /**
     * Dispose.
     */
    ~FirmwareUpdater();

    /**
     * Get a URL.
     *
     * @return URL.
     */
    const std::string getURL() const;

    /**
     * Get a name.
     *
     * @return name.
     */
    const std::string getName() const;

    /**
     * Checking a new firmware.
     * Compare versions of the software between local storage on mbed and on webserver.
     *
     * @return Return 0 if a new firmware exists.
     */
    int exist();

    /**
     * Execute update.
     *
     * @return Return 0 if it succeed.
     */
    int execute();

    /**
     * Reset system.
     */
    void reset();

private:
    static const int MAXNAMELEN = 8;
    static const std::string EXT_BIN;
    static const std::string EXT_BINTMP;
    static const std::string EXT_TXT;
    static const std::string EXT_TXTTMP;
    const std::string url;
    const std::string name;
    const bool log;
    LocalFileSystem local;
    HTTPClient client;

    /**
     * Fetch a file.
     *
     * @param src_url URL of a source file.
     * @param local_file Local file name.
     *
     * @return Return 0 if it succeed.
     */
    int fetch(std::string src_url, std::string local_file);

    /**
     * Copy a file.
     *
     * @param local_file1 Source file.
     * @param local_file2 Destination file.
     *
     * @return Return 0 if it succeed.
     */
    int copy(std::string local_file1, std::string local_file2);

    /**
     * Output a message to a log file.
     *
     * @param format ...
     */
    void LOG(const char* format, ...);

    /**
     * Cleanup all bin files.
     */
    int cleanupAllBinFiles(void);
    
    /**
     * Create a new binary file name.
     *
     * @param ver Version.
     * @param buf A pointer to a buffer.
     * @param siz A size of the buffer.
     *
     * @return Return 0 if it succeed.
     */
    int createNewBinName(const int ver, char *buf, size_t siz);

    /**
     * Read a version from a file.
     *
     * @param filename file name.
     * @return A version.
     */
    int readVersionFromFile(const char *filename);

    /**
     * Read a version from a URL.
     *
     * @param url URL.
     * @return A version.
     */
    int readVersionFromURL(const char *url);
};

#endif