Gleb Klochkov / Mbed OS Climatcontroll_Main

Dependencies:   esp8266-driver

Committer:
glebiuskv
Date:
Fri Apr 13 08:53:46 2018 +0000
Revision:
0:2f0e1e23c242
initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
glebiuskv 0:2f0e1e23c242 1 /* mbed Microcontroller Library
glebiuskv 0:2f0e1e23c242 2 * Copyright (c) 2017 ARM Limited
glebiuskv 0:2f0e1e23c242 3 *
glebiuskv 0:2f0e1e23c242 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
glebiuskv 0:2f0e1e23c242 5 * of this software and associated documentation files (the "Software"), to deal
glebiuskv 0:2f0e1e23c242 6 * in the Software without restriction, including without limitation the rights
glebiuskv 0:2f0e1e23c242 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
glebiuskv 0:2f0e1e23c242 8 * copies of the Software, and to permit persons to whom the Software is
glebiuskv 0:2f0e1e23c242 9 * furnished to do so, subject to the following conditions:
glebiuskv 0:2f0e1e23c242 10 *
glebiuskv 0:2f0e1e23c242 11 * The above copyright notice and this permission notice shall be included in
glebiuskv 0:2f0e1e23c242 12 * all copies or substantial portions of the Software.
glebiuskv 0:2f0e1e23c242 13 *
glebiuskv 0:2f0e1e23c242 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
glebiuskv 0:2f0e1e23c242 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
glebiuskv 0:2f0e1e23c242 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
glebiuskv 0:2f0e1e23c242 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
glebiuskv 0:2f0e1e23c242 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
glebiuskv 0:2f0e1e23c242 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
glebiuskv 0:2f0e1e23c242 20 * SOFTWARE.
glebiuskv 0:2f0e1e23c242 21 */
glebiuskv 0:2f0e1e23c242 22 #ifndef MBED_SLICING_BLOCK_DEVICE_H
glebiuskv 0:2f0e1e23c242 23 #define MBED_SLICING_BLOCK_DEVICE_H
glebiuskv 0:2f0e1e23c242 24
glebiuskv 0:2f0e1e23c242 25 #include "BlockDevice.h"
glebiuskv 0:2f0e1e23c242 26 #include "mbed.h"
glebiuskv 0:2f0e1e23c242 27
glebiuskv 0:2f0e1e23c242 28
glebiuskv 0:2f0e1e23c242 29 /** Block device for mapping to a slice of another block device
glebiuskv 0:2f0e1e23c242 30 *
glebiuskv 0:2f0e1e23c242 31 * @code
glebiuskv 0:2f0e1e23c242 32 * #include "mbed.h"
glebiuskv 0:2f0e1e23c242 33 * #include "HeapBlockDevice.h"
glebiuskv 0:2f0e1e23c242 34 * #include "SlicingBlockDevice.h"
glebiuskv 0:2f0e1e23c242 35 *
glebiuskv 0:2f0e1e23c242 36 * // Create a block device with 64 blocks of size 512
glebiuskv 0:2f0e1e23c242 37 * HeapBlockDevice mem(64*512, 512);
glebiuskv 0:2f0e1e23c242 38 *
glebiuskv 0:2f0e1e23c242 39 * // Create a block device that maps to the first 32 blocks
glebiuskv 0:2f0e1e23c242 40 * SlicingBlockDevice slice1(&mem, 0*512, 32*512);
glebiuskv 0:2f0e1e23c242 41 *
glebiuskv 0:2f0e1e23c242 42 * // Create a block device that maps to the last 32 blocks
glebiuskv 0:2f0e1e23c242 43 * SlicingBlockDevice slice2(&mem, 32*512);
glebiuskv 0:2f0e1e23c242 44 *
glebiuskv 0:2f0e1e23c242 45 * // Create a block device that maps to the middle 32 blocks
glebiuskv 0:2f0e1e23c242 46 * SlicingBlockDevice slice3(&mem, 16*512, -16*512);
glebiuskv 0:2f0e1e23c242 47 * @endcode
glebiuskv 0:2f0e1e23c242 48 */
glebiuskv 0:2f0e1e23c242 49 class SlicingBlockDevice : public BlockDevice
glebiuskv 0:2f0e1e23c242 50 {
glebiuskv 0:2f0e1e23c242 51 public:
glebiuskv 0:2f0e1e23c242 52 /** Lifetime of the memory block device
glebiuskv 0:2f0e1e23c242 53 *
glebiuskv 0:2f0e1e23c242 54 * @param bd Block device to back the SlicingBlockDevice
glebiuskv 0:2f0e1e23c242 55 * @param start Start block address to map to block 0, negative addresses
glebiuskv 0:2f0e1e23c242 56 * are calculated from the end of the underlying block device
glebiuskv 0:2f0e1e23c242 57 * @param end End block address to mark the end of the block device,
glebiuskv 0:2f0e1e23c242 58 * this block is not mapped, negative addresses are
glebiuskv 0:2f0e1e23c242 59 * calculated from the end of the underlying block device.
glebiuskv 0:2f0e1e23c242 60 * The default stops at end of the underlying block device.
glebiuskv 0:2f0e1e23c242 61 */
glebiuskv 0:2f0e1e23c242 62 SlicingBlockDevice(BlockDevice *bd, bd_addr_t start, bd_addr_t end = 0);
glebiuskv 0:2f0e1e23c242 63
glebiuskv 0:2f0e1e23c242 64 /** Lifetime of a block device
glebiuskv 0:2f0e1e23c242 65 */
glebiuskv 0:2f0e1e23c242 66 virtual ~SlicingBlockDevice() {};
glebiuskv 0:2f0e1e23c242 67
glebiuskv 0:2f0e1e23c242 68 /** Initialize a block device
glebiuskv 0:2f0e1e23c242 69 *
glebiuskv 0:2f0e1e23c242 70 * @return 0 on success or a negative error code on failure
glebiuskv 0:2f0e1e23c242 71 */
glebiuskv 0:2f0e1e23c242 72 virtual int init();
glebiuskv 0:2f0e1e23c242 73
glebiuskv 0:2f0e1e23c242 74 /** Deinitialize a block device
glebiuskv 0:2f0e1e23c242 75 *
glebiuskv 0:2f0e1e23c242 76 * @return 0 on success or a negative error code on failure
glebiuskv 0:2f0e1e23c242 77 */
glebiuskv 0:2f0e1e23c242 78 virtual int deinit();
glebiuskv 0:2f0e1e23c242 79
glebiuskv 0:2f0e1e23c242 80 /** Ensure data on storage is in sync with the driver
glebiuskv 0:2f0e1e23c242 81 *
glebiuskv 0:2f0e1e23c242 82 * @return 0 on success or a negative error code on failure
glebiuskv 0:2f0e1e23c242 83 */
glebiuskv 0:2f0e1e23c242 84 virtual int sync();
glebiuskv 0:2f0e1e23c242 85
glebiuskv 0:2f0e1e23c242 86 /** Read blocks from a block device
glebiuskv 0:2f0e1e23c242 87 *
glebiuskv 0:2f0e1e23c242 88 * @param buffer Buffer to read blocks into
glebiuskv 0:2f0e1e23c242 89 * @param addr Address of block to begin reading from
glebiuskv 0:2f0e1e23c242 90 * @param size Size to read in bytes, must be a multiple of read block size
glebiuskv 0:2f0e1e23c242 91 * @return 0 on success, negative error code on failure
glebiuskv 0:2f0e1e23c242 92 */
glebiuskv 0:2f0e1e23c242 93 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
glebiuskv 0:2f0e1e23c242 94
glebiuskv 0:2f0e1e23c242 95 /** Program blocks to a block device
glebiuskv 0:2f0e1e23c242 96 *
glebiuskv 0:2f0e1e23c242 97 * The blocks must have been erased prior to being programmed
glebiuskv 0:2f0e1e23c242 98 *
glebiuskv 0:2f0e1e23c242 99 * @param buffer Buffer of data to write to blocks
glebiuskv 0:2f0e1e23c242 100 * @param addr Address of block to begin writing to
glebiuskv 0:2f0e1e23c242 101 * @param size Size to write in bytes, must be a multiple of program block size
glebiuskv 0:2f0e1e23c242 102 * @return 0 on success, negative error code on failure
glebiuskv 0:2f0e1e23c242 103 */
glebiuskv 0:2f0e1e23c242 104 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
glebiuskv 0:2f0e1e23c242 105
glebiuskv 0:2f0e1e23c242 106 /** Erase blocks on a block device
glebiuskv 0:2f0e1e23c242 107 *
glebiuskv 0:2f0e1e23c242 108 * The state of an erased block is undefined until it has been programmed,
glebiuskv 0:2f0e1e23c242 109 * unless get_erase_value returns a non-negative byte value
glebiuskv 0:2f0e1e23c242 110 *
glebiuskv 0:2f0e1e23c242 111 * @param addr Address of block to begin erasing
glebiuskv 0:2f0e1e23c242 112 * @param size Size to erase in bytes, must be a multiple of erase block size
glebiuskv 0:2f0e1e23c242 113 * @return 0 on success, negative error code on failure
glebiuskv 0:2f0e1e23c242 114 */
glebiuskv 0:2f0e1e23c242 115 virtual int erase(bd_addr_t addr, bd_size_t size);
glebiuskv 0:2f0e1e23c242 116
glebiuskv 0:2f0e1e23c242 117 /** Get the size of a readable block
glebiuskv 0:2f0e1e23c242 118 *
glebiuskv 0:2f0e1e23c242 119 * @return Size of a readable block in bytes
glebiuskv 0:2f0e1e23c242 120 */
glebiuskv 0:2f0e1e23c242 121 virtual bd_size_t get_read_size() const;
glebiuskv 0:2f0e1e23c242 122
glebiuskv 0:2f0e1e23c242 123 /** Get the size of a programmable block
glebiuskv 0:2f0e1e23c242 124 *
glebiuskv 0:2f0e1e23c242 125 * @return Size of a programmable block in bytes
glebiuskv 0:2f0e1e23c242 126 * @note Must be a multiple of the read size
glebiuskv 0:2f0e1e23c242 127 */
glebiuskv 0:2f0e1e23c242 128 virtual bd_size_t get_program_size() const;
glebiuskv 0:2f0e1e23c242 129
glebiuskv 0:2f0e1e23c242 130 /** Get the size of an erasable block
glebiuskv 0:2f0e1e23c242 131 *
glebiuskv 0:2f0e1e23c242 132 * @return Size of an erasable block in bytes
glebiuskv 0:2f0e1e23c242 133 * @note Must be a multiple of the program size
glebiuskv 0:2f0e1e23c242 134 */
glebiuskv 0:2f0e1e23c242 135 virtual bd_size_t get_erase_size() const;
glebiuskv 0:2f0e1e23c242 136
glebiuskv 0:2f0e1e23c242 137 /** Get the size of an erasable block given address
glebiuskv 0:2f0e1e23c242 138 *
glebiuskv 0:2f0e1e23c242 139 * @param addr Address within the erasable block
glebiuskv 0:2f0e1e23c242 140 * @return Size of an erasable block in bytes
glebiuskv 0:2f0e1e23c242 141 * @note Must be a multiple of the program size
glebiuskv 0:2f0e1e23c242 142 */
glebiuskv 0:2f0e1e23c242 143 virtual bd_size_t get_erase_size(bd_addr_t addr) const;
glebiuskv 0:2f0e1e23c242 144
glebiuskv 0:2f0e1e23c242 145 /** Get the value of storage when erased
glebiuskv 0:2f0e1e23c242 146 *
glebiuskv 0:2f0e1e23c242 147 * If get_erase_value returns a non-negative byte value, the underlying
glebiuskv 0:2f0e1e23c242 148 * storage is set to that value when erased, and storage containing
glebiuskv 0:2f0e1e23c242 149 * that value can be programmed without another erase.
glebiuskv 0:2f0e1e23c242 150 *
glebiuskv 0:2f0e1e23c242 151 * @return The value of storage when erased, or -1 if you can't
glebiuskv 0:2f0e1e23c242 152 * rely on the value of erased storage
glebiuskv 0:2f0e1e23c242 153 */
glebiuskv 0:2f0e1e23c242 154 virtual int get_erase_value() const;
glebiuskv 0:2f0e1e23c242 155
glebiuskv 0:2f0e1e23c242 156 /** Get the total size of the underlying device
glebiuskv 0:2f0e1e23c242 157 *
glebiuskv 0:2f0e1e23c242 158 * @return Size of the underlying device in bytes
glebiuskv 0:2f0e1e23c242 159 */
glebiuskv 0:2f0e1e23c242 160 virtual bd_size_t size() const;
glebiuskv 0:2f0e1e23c242 161
glebiuskv 0:2f0e1e23c242 162 protected:
glebiuskv 0:2f0e1e23c242 163 BlockDevice *_bd;
glebiuskv 0:2f0e1e23c242 164 bool _start_from_end;
glebiuskv 0:2f0e1e23c242 165 bd_size_t _start;
glebiuskv 0:2f0e1e23c242 166 bool _stop_from_end;
glebiuskv 0:2f0e1e23c242 167 bd_size_t _stop;
glebiuskv 0:2f0e1e23c242 168 };
glebiuskv 0:2f0e1e23c242 169
glebiuskv 0:2f0e1e23c242 170
glebiuskv 0:2f0e1e23c242 171 #endif