Host library for controlling a WiConnect enabled Wi-Fi module.
Dependents: wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more
internal/file/FileInterface.cpp@0:ea85c4bb5e1f, 2014-08-11 (annotated)
- Committer:
- dan_ackme
- Date:
- Mon Aug 11 09:58:24 2014 +0000
- Revision:
- 0:ea85c4bb5e1f
- Child:
- 1:6ec9998427ad
initial check-in
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dan_ackme | 0:ea85c4bb5e1f | 1 | /* |
dan_ackme | 0:ea85c4bb5e1f | 2 | * Copyright 2014, ACKme Networks |
dan_ackme | 0:ea85c4bb5e1f | 3 | * All Rights Reserved. |
dan_ackme | 0:ea85c4bb5e1f | 4 | * |
dan_ackme | 0:ea85c4bb5e1f | 5 | * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks; |
dan_ackme | 0:ea85c4bb5e1f | 6 | * the contents of this file may not be disclosed to third parties, copied |
dan_ackme | 0:ea85c4bb5e1f | 7 | * or duplicated in any form, in whole or in part, without the prior |
dan_ackme | 0:ea85c4bb5e1f | 8 | * written permission of ACKme Networks. |
dan_ackme | 0:ea85c4bb5e1f | 9 | */ |
dan_ackme | 0:ea85c4bb5e1f | 10 | |
dan_ackme | 0:ea85c4bb5e1f | 11 | |
dan_ackme | 0:ea85c4bb5e1f | 12 | #include "Wiconnect.h" |
dan_ackme | 0:ea85c4bb5e1f | 13 | #include "internal/common.h" |
dan_ackme | 0:ea85c4bb5e1f | 14 | #include "StringUtil.h" |
dan_ackme | 0:ea85c4bb5e1f | 15 | |
dan_ackme | 0:ea85c4bb5e1f | 16 | |
dan_ackme | 0:ea85c4bb5e1f | 17 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 18 | FileInterface::FileInterface(Wiconnect *wiconnect_) |
dan_ackme | 0:ea85c4bb5e1f | 19 | { |
dan_ackme | 0:ea85c4bb5e1f | 20 | wiconnect = wiconnect_; |
dan_ackme | 0:ea85c4bb5e1f | 21 | } |
dan_ackme | 0:ea85c4bb5e1f | 22 | |
dan_ackme | 0:ea85c4bb5e1f | 23 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 24 | WiconnectResult FileInterface::openFile(File &file, const char *name) |
dan_ackme | 0:ea85c4bb5e1f | 25 | { |
dan_ackme | 0:ea85c4bb5e1f | 26 | WiconnectResult result; |
dan_ackme | 0:ea85c4bb5e1f | 27 | |
dan_ackme | 0:ea85c4bb5e1f | 28 | CHECK_OTHER_COMMAND_EXECUTING(); |
dan_ackme | 0:ea85c4bb5e1f | 29 | |
dan_ackme | 0:ea85c4bb5e1f | 30 | if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("fop %s", name))) |
dan_ackme | 0:ea85c4bb5e1f | 31 | { |
dan_ackme | 0:ea85c4bb5e1f | 32 | int32_t handle; |
dan_ackme | 0:ea85c4bb5e1f | 33 | if(!WICONNECT_FAILED(result, wiconnect->responseToInt32(&handle))) |
dan_ackme | 0:ea85c4bb5e1f | 34 | { |
dan_ackme | 0:ea85c4bb5e1f | 35 | file.openForRead(handle, name); |
dan_ackme | 0:ea85c4bb5e1f | 36 | } |
dan_ackme | 0:ea85c4bb5e1f | 37 | } |
dan_ackme | 0:ea85c4bb5e1f | 38 | |
dan_ackme | 0:ea85c4bb5e1f | 39 | CHECK_CLEANUP_COMMAND(); |
dan_ackme | 0:ea85c4bb5e1f | 40 | |
dan_ackme | 0:ea85c4bb5e1f | 41 | return result; |
dan_ackme | 0:ea85c4bb5e1f | 42 | } |
dan_ackme | 0:ea85c4bb5e1f | 43 | |
dan_ackme | 0:ea85c4bb5e1f | 44 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 45 | WiconnectResult FileInterface::createFile(const ReaderFunc &reader, void *user, const char *name, uint32_t size, uint32_t version, FileType type, bool isEssential, int32_t checksum) |
dan_ackme | 0:ea85c4bb5e1f | 46 | { |
dan_ackme | 0:ea85c4bb5e1f | 47 | WiconnectResult result; |
dan_ackme | 0:ea85c4bb5e1f | 48 | char cmdBuffer[WICONNECT_MAX_CMD_SIZE]; |
dan_ackme | 0:ea85c4bb5e1f | 49 | |
dan_ackme | 0:ea85c4bb5e1f | 50 | if(WICONNECT_IS_IDLE()) |
dan_ackme | 0:ea85c4bb5e1f | 51 | { |
dan_ackme | 0:ea85c4bb5e1f | 52 | char *ptr = cmdBuffer; |
dan_ackme | 0:ea85c4bb5e1f | 53 | |
dan_ackme | 0:ea85c4bb5e1f | 54 | ptr += sprintf(cmdBuffer, "fcr %s%s %d", isEssential ? "-e " : "", name, size); |
dan_ackme | 0:ea85c4bb5e1f | 55 | |
dan_ackme | 0:ea85c4bb5e1f | 56 | if(version != 0) |
dan_ackme | 0:ea85c4bb5e1f | 57 | { |
dan_ackme | 0:ea85c4bb5e1f | 58 | *ptr = ' '; |
dan_ackme | 0:ea85c4bb5e1f | 59 | ++ptr; |
dan_ackme | 0:ea85c4bb5e1f | 60 | FileInterface::fileVersionIntToStr(version, true, ptr); |
dan_ackme | 0:ea85c4bb5e1f | 61 | ptr = ptr + strlen(ptr); |
dan_ackme | 0:ea85c4bb5e1f | 62 | } |
dan_ackme | 0:ea85c4bb5e1f | 63 | if(type != FILE_TYPE_ANY) |
dan_ackme | 0:ea85c4bb5e1f | 64 | { |
dan_ackme | 0:ea85c4bb5e1f | 65 | ptr += sprintf(ptr, " %X", type); |
dan_ackme | 0:ea85c4bb5e1f | 66 | } |
dan_ackme | 0:ea85c4bb5e1f | 67 | if(checksum != -1) |
dan_ackme | 0:ea85c4bb5e1f | 68 | { |
dan_ackme | 0:ea85c4bb5e1f | 69 | ptr += sprintf(ptr, " %X", checksum); |
dan_ackme | 0:ea85c4bb5e1f | 70 | } |
dan_ackme | 0:ea85c4bb5e1f | 71 | } |
dan_ackme | 0:ea85c4bb5e1f | 72 | |
dan_ackme | 0:ea85c4bb5e1f | 73 | CHECK_OTHER_COMMAND_EXECUTING(); |
dan_ackme | 0:ea85c4bb5e1f | 74 | |
dan_ackme | 0:ea85c4bb5e1f | 75 | result = wiconnect->sendCommand(reader, user, (const char *)cmdBuffer); |
dan_ackme | 0:ea85c4bb5e1f | 76 | |
dan_ackme | 0:ea85c4bb5e1f | 77 | CHECK_CLEANUP_COMMAND(); |
dan_ackme | 0:ea85c4bb5e1f | 78 | |
dan_ackme | 0:ea85c4bb5e1f | 79 | return result; |
dan_ackme | 0:ea85c4bb5e1f | 80 | } |
dan_ackme | 0:ea85c4bb5e1f | 81 | |
dan_ackme | 0:ea85c4bb5e1f | 82 | |
dan_ackme | 0:ea85c4bb5e1f | 83 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 84 | WiconnectResult FileInterface::deleteFile(const char *name) |
dan_ackme | 0:ea85c4bb5e1f | 85 | { |
dan_ackme | 0:ea85c4bb5e1f | 86 | WiconnectResult result; |
dan_ackme | 0:ea85c4bb5e1f | 87 | |
dan_ackme | 0:ea85c4bb5e1f | 88 | CHECK_OTHER_COMMAND_EXECUTING(); |
dan_ackme | 0:ea85c4bb5e1f | 89 | |
dan_ackme | 0:ea85c4bb5e1f | 90 | result = wiconnect->sendCommand("fde %s", name); |
dan_ackme | 0:ea85c4bb5e1f | 91 | |
dan_ackme | 0:ea85c4bb5e1f | 92 | CHECK_CLEANUP_COMMAND(); |
dan_ackme | 0:ea85c4bb5e1f | 93 | |
dan_ackme | 0:ea85c4bb5e1f | 94 | return result; |
dan_ackme | 0:ea85c4bb5e1f | 95 | } |
dan_ackme | 0:ea85c4bb5e1f | 96 | |
dan_ackme | 0:ea85c4bb5e1f | 97 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 98 | WiconnectResult FileInterface::deleteFile(const File &file) |
dan_ackme | 0:ea85c4bb5e1f | 99 | { |
dan_ackme | 0:ea85c4bb5e1f | 100 | return deleteFile(file.getName()); |
dan_ackme | 0:ea85c4bb5e1f | 101 | } |
dan_ackme | 0:ea85c4bb5e1f | 102 | |
dan_ackme | 0:ea85c4bb5e1f | 103 | |
dan_ackme | 0:ea85c4bb5e1f | 104 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 105 | const char* FileInterface::fileVersionIntToStr(uint32_t version, bool verbose, char *buffer) |
dan_ackme | 0:ea85c4bb5e1f | 106 | { |
dan_ackme | 0:ea85c4bb5e1f | 107 | SET_STR_BUFFER(buffer, 32); |
dan_ackme | 0:ea85c4bb5e1f | 108 | const char *fmt = verbose ? "%u.%u.%u.%u" : "%u.%u.%u"; |
dan_ackme | 0:ea85c4bb5e1f | 109 | sprintf(ptr, fmt, FILE_VERSION_ARGS(version)); |
dan_ackme | 0:ea85c4bb5e1f | 110 | return ptr; |
dan_ackme | 0:ea85c4bb5e1f | 111 | } |
dan_ackme | 0:ea85c4bb5e1f | 112 | |
dan_ackme | 0:ea85c4bb5e1f | 113 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 114 | bool FileInterface::fileVersionStrToInt(const char *versionStr, uint32_t *versionIntPtr) |
dan_ackme | 0:ea85c4bb5e1f | 115 | { |
dan_ackme | 0:ea85c4bb5e1f | 116 | const uint8_t offsets[] = {27, 21, 8, 0}; |
dan_ackme | 0:ea85c4bb5e1f | 117 | char buffer[18]; |
dan_ackme | 0:ea85c4bb5e1f | 118 | char *tok, *ptr = buffer; |
dan_ackme | 0:ea85c4bb5e1f | 119 | uint32_t version = 0; |
dan_ackme | 0:ea85c4bb5e1f | 120 | |
dan_ackme | 0:ea85c4bb5e1f | 121 | strcpy(buffer, versionStr); |
dan_ackme | 0:ea85c4bb5e1f | 122 | |
dan_ackme | 0:ea85c4bb5e1f | 123 | for(int i = 0; i < 4 && (tok = strtok(ptr, ".")) != NULL; ++i) |
dan_ackme | 0:ea85c4bb5e1f | 124 | { |
dan_ackme | 0:ea85c4bb5e1f | 125 | char *end; |
dan_ackme | 0:ea85c4bb5e1f | 126 | const uint32_t value = strtol(tok, &end, 10); |
dan_ackme | 0:ea85c4bb5e1f | 127 | if(*end != 0) |
dan_ackme | 0:ea85c4bb5e1f | 128 | { |
dan_ackme | 0:ea85c4bb5e1f | 129 | return false; |
dan_ackme | 0:ea85c4bb5e1f | 130 | } |
dan_ackme | 0:ea85c4bb5e1f | 131 | version |= (value << offsets[i]); |
dan_ackme | 0:ea85c4bb5e1f | 132 | ptr = NULL; |
dan_ackme | 0:ea85c4bb5e1f | 133 | } |
dan_ackme | 0:ea85c4bb5e1f | 134 | |
dan_ackme | 0:ea85c4bb5e1f | 135 | *versionIntPtr = version; |
dan_ackme | 0:ea85c4bb5e1f | 136 | |
dan_ackme | 0:ea85c4bb5e1f | 137 | return true; |
dan_ackme | 0:ea85c4bb5e1f | 138 | } |
dan_ackme | 0:ea85c4bb5e1f | 139 | |
dan_ackme | 0:ea85c4bb5e1f | 140 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 141 | const char* FileInterface::fileTypeToStr(FileType type) |
dan_ackme | 0:ea85c4bb5e1f | 142 | { |
dan_ackme | 0:ea85c4bb5e1f | 143 | switch(type) |
dan_ackme | 0:ea85c4bb5e1f | 144 | { |
dan_ackme | 0:ea85c4bb5e1f | 145 | case FILE_TYPE_UPGRADE_APP: |
dan_ackme | 0:ea85c4bb5e1f | 146 | return "Upgrade App"; |
dan_ackme | 0:ea85c4bb5e1f | 147 | case FILE_TYPE_WIFI_FW: |
dan_ackme | 0:ea85c4bb5e1f | 148 | return "Wifi Firmware"; |
dan_ackme | 0:ea85c4bb5e1f | 149 | case FILE_TYPE_REGULAR_APP: |
dan_ackme | 0:ea85c4bb5e1f | 150 | return "Regular App"; |
dan_ackme | 0:ea85c4bb5e1f | 151 | case FILE_TYPE_TEMPORY: |
dan_ackme | 0:ea85c4bb5e1f | 152 | return "Temporary"; |
dan_ackme | 0:ea85c4bb5e1f | 153 | case FILE_TYPE_GPIO_CONFIG: |
dan_ackme | 0:ea85c4bb5e1f | 154 | return "GPIO Default Configuration"; |
dan_ackme | 0:ea85c4bb5e1f | 155 | case FILE_TYPE_COMMAND_HELP: |
dan_ackme | 0:ea85c4bb5e1f | 156 | return "Command Help"; |
dan_ackme | 0:ea85c4bb5e1f | 157 | case FILE_TYPE_SDC_CAPS: |
dan_ackme | 0:ea85c4bb5e1f | 158 | return "goHACK.me Capabilities"; |
dan_ackme | 0:ea85c4bb5e1f | 159 | case FILE_TYPE_SETUP_SCRIPT: |
dan_ackme | 0:ea85c4bb5e1f | 160 | return "Setup Dcript"; |
dan_ackme | 0:ea85c4bb5e1f | 161 | case FILE_TYPE_MISC_FIX_LEN: |
dan_ackme | 0:ea85c4bb5e1f | 162 | return "Miscellaneous"; |
dan_ackme | 0:ea85c4bb5e1f | 163 | default: |
dan_ackme | 0:ea85c4bb5e1f | 164 | if(type >= FILE_TYPE_USER_RANGE_START && type <= FILE_TYPE_USER_RANGE_END) |
dan_ackme | 0:ea85c4bb5e1f | 165 | return "User"; |
dan_ackme | 0:ea85c4bb5e1f | 166 | else |
dan_ackme | 0:ea85c4bb5e1f | 167 | return "Unknown"; |
dan_ackme | 0:ea85c4bb5e1f | 168 | } |
dan_ackme | 0:ea85c4bb5e1f | 169 | } |
dan_ackme | 0:ea85c4bb5e1f | 170 | |
dan_ackme | 0:ea85c4bb5e1f | 171 | /*************************************************************************************************/ |
dan_ackme | 0:ea85c4bb5e1f | 172 | const char* FileInterface::fileFlagsToStr(FileFlags flags, char *buffer) |
dan_ackme | 0:ea85c4bb5e1f | 173 | { |
dan_ackme | 0:ea85c4bb5e1f | 174 | SET_STR_BUFFER(buffer, 64); |
dan_ackme | 0:ea85c4bb5e1f | 175 | static const char* const flag_strings[] = { |
dan_ackme | 0:ea85c4bb5e1f | 176 | "Valid", |
dan_ackme | 0:ea85c4bb5e1f | 177 | "Executable", |
dan_ackme | 0:ea85c4bb5e1f | 178 | "Encrypted", |
dan_ackme | 0:ea85c4bb5e1f | 179 | "Internal", |
dan_ackme | 0:ea85c4bb5e1f | 180 | "Bootable", |
dan_ackme | 0:ea85c4bb5e1f | 181 | "User", |
dan_ackme | 0:ea85c4bb5e1f | 182 | "Essential", |
dan_ackme | 0:ea85c4bb5e1f | 183 | }; |
dan_ackme | 0:ea85c4bb5e1f | 184 | |
dan_ackme | 0:ea85c4bb5e1f | 185 | int i = 0; |
dan_ackme | 0:ea85c4bb5e1f | 186 | *ptr = 0; |
dan_ackme | 0:ea85c4bb5e1f | 187 | |
dan_ackme | 0:ea85c4bb5e1f | 188 | for(uint16_t f = flags; f != 0 && i < 7; f >>= 1, ++i) |
dan_ackme | 0:ea85c4bb5e1f | 189 | { |
dan_ackme | 0:ea85c4bb5e1f | 190 | if(f & 0x0001) |
dan_ackme | 0:ea85c4bb5e1f | 191 | { |
dan_ackme | 0:ea85c4bb5e1f | 192 | ptr += sprintf(ptr, "%s,", flag_strings[i]); |
dan_ackme | 0:ea85c4bb5e1f | 193 | } |
dan_ackme | 0:ea85c4bb5e1f | 194 | } |
dan_ackme | 0:ea85c4bb5e1f | 195 | |
dan_ackme | 0:ea85c4bb5e1f | 196 | if(ptr == buffer) |
dan_ackme | 0:ea85c4bb5e1f | 197 | { |
dan_ackme | 0:ea85c4bb5e1f | 198 | strcpy(buffer, "None"); |
dan_ackme | 0:ea85c4bb5e1f | 199 | } |
dan_ackme | 0:ea85c4bb5e1f | 200 | else |
dan_ackme | 0:ea85c4bb5e1f | 201 | { |
dan_ackme | 0:ea85c4bb5e1f | 202 | *(ptr-1) = 0; |
dan_ackme | 0:ea85c4bb5e1f | 203 | } |
dan_ackme | 0:ea85c4bb5e1f | 204 | |
dan_ackme | 0:ea85c4bb5e1f | 205 | return buf; |
dan_ackme | 0:ea85c4bb5e1f | 206 | } |
dan_ackme | 0:ea85c4bb5e1f | 207 |