Device interface library for multiple platforms including Mbed.

Dependents:   DeepCover Embedded Security in IoT MaximInterface MAXREFDES155#

Maxim Interface is a library framework focused on providing flexible and expressive hardware interfaces. Both communication interfaces such as I2C and 1-Wire and device interfaces such as DS18B20 are supported. Modern C++ concepts are used extensively while keeping compatibility with C++98/C++03 and requiring no external dependencies. The embedded-friendly design does not depend on exceptions or RTTI.

The full version of the project is hosted on GitLab: https://gitlab.com/iabenz/MaximInterface

Committer:
IanBenzMaxim
Date:
Mon Jul 22 11:44:07 2019 -0500
Revision:
7:9cd16581b578
Child:
8:5ea891c7d1a1
Updated to version 1.9.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 7:9cd16581b578 1 /*******************************************************************************
IanBenzMaxim 7:9cd16581b578 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 7:9cd16581b578 3 *
IanBenzMaxim 7:9cd16581b578 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 7:9cd16581b578 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 7:9cd16581b578 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 7:9cd16581b578 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 7:9cd16581b578 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 7:9cd16581b578 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 7:9cd16581b578 10 *
IanBenzMaxim 7:9cd16581b578 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 7:9cd16581b578 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 7:9cd16581b578 13 *
IanBenzMaxim 7:9cd16581b578 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 7:9cd16581b578 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 7:9cd16581b578 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 7:9cd16581b578 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 7:9cd16581b578 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 7:9cd16581b578 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 7:9cd16581b578 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 7:9cd16581b578 21 *
IanBenzMaxim 7:9cd16581b578 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 7:9cd16581b578 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 7:9cd16581b578 24 * Products, Inc. Branding Policy.
IanBenzMaxim 7:9cd16581b578 25 *
IanBenzMaxim 7:9cd16581b578 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 7:9cd16581b578 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 7:9cd16581b578 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 7:9cd16581b578 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 7:9cd16581b578 30 * ownership rights.
IanBenzMaxim 7:9cd16581b578 31 *******************************************************************************/
IanBenzMaxim 7:9cd16581b578 32
IanBenzMaxim 7:9cd16581b578 33 #include <MaximInterfaceCore/Error.hpp>
IanBenzMaxim 7:9cd16581b578 34 #include "DS2482_DS2484.hpp"
IanBenzMaxim 7:9cd16581b578 35
IanBenzMaxim 7:9cd16581b578 36 namespace MaximInterfaceDevices {
IanBenzMaxim 7:9cd16581b578 37
IanBenzMaxim 7:9cd16581b578 38 using namespace Core;
IanBenzMaxim 7:9cd16581b578 39
IanBenzMaxim 7:9cd16581b578 40 // Device Status bits
IanBenzMaxim 7:9cd16581b578 41 enum StatusBit {
IanBenzMaxim 7:9cd16581b578 42 Status_1WB = 0x01,
IanBenzMaxim 7:9cd16581b578 43 Status_PPD = 0x02,
IanBenzMaxim 7:9cd16581b578 44 Status_SD = 0x04,
IanBenzMaxim 7:9cd16581b578 45 Status_LL = 0x08,
IanBenzMaxim 7:9cd16581b578 46 Status_RST = 0x10,
IanBenzMaxim 7:9cd16581b578 47 Status_SBR = 0x20,
IanBenzMaxim 7:9cd16581b578 48 Status_TSB = 0x40,
IanBenzMaxim 7:9cd16581b578 49 Status_DIR = 0x80
IanBenzMaxim 7:9cd16581b578 50 };
IanBenzMaxim 7:9cd16581b578 51
IanBenzMaxim 7:9cd16581b578 52 error_code DS2482_DS2484::initialize(Config config) {
IanBenzMaxim 7:9cd16581b578 53 error_code result = resetDevice();
IanBenzMaxim 7:9cd16581b578 54 if (result) {
IanBenzMaxim 7:9cd16581b578 55 return result;
IanBenzMaxim 7:9cd16581b578 56 }
IanBenzMaxim 7:9cd16581b578 57 // Write the default configuration setup.
IanBenzMaxim 7:9cd16581b578 58 result = writeConfig(config);
IanBenzMaxim 7:9cd16581b578 59 return result;
IanBenzMaxim 7:9cd16581b578 60 }
IanBenzMaxim 7:9cd16581b578 61
IanBenzMaxim 7:9cd16581b578 62 error_code DS2482_DS2484::resetDevice() {
IanBenzMaxim 7:9cd16581b578 63 // Device Reset
IanBenzMaxim 7:9cd16581b578 64 // S AD,0 [A] DRST [A] Sr AD,1 [A] [SS] A\ P
IanBenzMaxim 7:9cd16581b578 65 // [] indicates from slave
IanBenzMaxim 7:9cd16581b578 66 // SS status byte to read to verify state
IanBenzMaxim 7:9cd16581b578 67
IanBenzMaxim 7:9cd16581b578 68 error_code result = sendCommand(0xF0);
IanBenzMaxim 7:9cd16581b578 69 if (result) {
IanBenzMaxim 7:9cd16581b578 70 return result;
IanBenzMaxim 7:9cd16581b578 71 }
IanBenzMaxim 7:9cd16581b578 72
IanBenzMaxim 7:9cd16581b578 73 uint_least8_t buf;
IanBenzMaxim 7:9cd16581b578 74 result = readRegister(buf);
IanBenzMaxim 7:9cd16581b578 75 if (result) {
IanBenzMaxim 7:9cd16581b578 76 return result;
IanBenzMaxim 7:9cd16581b578 77 }
IanBenzMaxim 7:9cd16581b578 78
IanBenzMaxim 7:9cd16581b578 79 if ((buf & 0xF7) != 0x10) {
IanBenzMaxim 7:9cd16581b578 80 return make_error_code(HardwareError);
IanBenzMaxim 7:9cd16581b578 81 }
IanBenzMaxim 7:9cd16581b578 82
IanBenzMaxim 7:9cd16581b578 83 // Do a command to get 1-Wire master reset out of holding state.
IanBenzMaxim 7:9cd16581b578 84 reset();
IanBenzMaxim 7:9cd16581b578 85
IanBenzMaxim 7:9cd16581b578 86 return result;
IanBenzMaxim 7:9cd16581b578 87 }
IanBenzMaxim 7:9cd16581b578 88
IanBenzMaxim 7:9cd16581b578 89 error_code DS2482_DS2484::triplet(TripletData & data) {
IanBenzMaxim 7:9cd16581b578 90 // 1-Wire Triplet (Case B)
IanBenzMaxim 7:9cd16581b578 91 // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 7:9cd16581b578 92 // \--------/
IanBenzMaxim 7:9cd16581b578 93 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 7:9cd16581b578 94 // [] indicates from slave
IanBenzMaxim 7:9cd16581b578 95 // SS indicates byte containing search direction bit value in msbit
IanBenzMaxim 7:9cd16581b578 96
IanBenzMaxim 7:9cd16581b578 97 error_code result = sendCommand(0x78, data.writeBit ? 0x80 : 0x00);
IanBenzMaxim 7:9cd16581b578 98 if (!result) {
IanBenzMaxim 7:9cd16581b578 99 uint_least8_t status;
IanBenzMaxim 7:9cd16581b578 100 result = pollBusy(&status);
IanBenzMaxim 7:9cd16581b578 101 if (!result) {
IanBenzMaxim 7:9cd16581b578 102 data.readBit = ((status & Status_SBR) == Status_SBR);
IanBenzMaxim 7:9cd16581b578 103 data.readBitComplement = ((status & Status_TSB) == Status_TSB);
IanBenzMaxim 7:9cd16581b578 104 data.writeBit = ((status & Status_DIR) == Status_DIR);
IanBenzMaxim 7:9cd16581b578 105 }
IanBenzMaxim 7:9cd16581b578 106 }
IanBenzMaxim 7:9cd16581b578 107 return result;
IanBenzMaxim 7:9cd16581b578 108 }
IanBenzMaxim 7:9cd16581b578 109
IanBenzMaxim 7:9cd16581b578 110 error_code DS2482_DS2484::reset() {
IanBenzMaxim 7:9cd16581b578 111 // 1-Wire reset (Case B)
IanBenzMaxim 7:9cd16581b578 112 // S AD,0 [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 7:9cd16581b578 113 // \--------/
IanBenzMaxim 7:9cd16581b578 114 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 7:9cd16581b578 115 // [] indicates from slave
IanBenzMaxim 7:9cd16581b578 116
IanBenzMaxim 7:9cd16581b578 117 error_code result = sendCommand(0xB4);
IanBenzMaxim 7:9cd16581b578 118 if (result) {
IanBenzMaxim 7:9cd16581b578 119 return result;
IanBenzMaxim 7:9cd16581b578 120 }
IanBenzMaxim 7:9cd16581b578 121
IanBenzMaxim 7:9cd16581b578 122 uint_least8_t buf;
IanBenzMaxim 7:9cd16581b578 123 result = pollBusy(&buf);
IanBenzMaxim 7:9cd16581b578 124 if (result) {
IanBenzMaxim 7:9cd16581b578 125 return result;
IanBenzMaxim 7:9cd16581b578 126 }
IanBenzMaxim 7:9cd16581b578 127
IanBenzMaxim 7:9cd16581b578 128 if ((buf & Status_SD) == Status_SD) {
IanBenzMaxim 7:9cd16581b578 129 result = make_error_code(ShortDetectedError);
IanBenzMaxim 7:9cd16581b578 130 } else if ((buf & Status_PPD) != Status_PPD) {
IanBenzMaxim 7:9cd16581b578 131 result = make_error_code(NoSlaveError);
IanBenzMaxim 7:9cd16581b578 132 }
IanBenzMaxim 7:9cd16581b578 133
IanBenzMaxim 7:9cd16581b578 134 return result;
IanBenzMaxim 7:9cd16581b578 135 }
IanBenzMaxim 7:9cd16581b578 136
IanBenzMaxim 7:9cd16581b578 137 error_code DS2482_DS2484::touchBitSetLevel(bool & sendRecvBit,
IanBenzMaxim 7:9cd16581b578 138 Level afterLevel) {
IanBenzMaxim 7:9cd16581b578 139 // 1-Wire bit (Case B)
IanBenzMaxim 7:9cd16581b578 140 // S AD,0 [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 7:9cd16581b578 141 // \--------/
IanBenzMaxim 7:9cd16581b578 142 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 7:9cd16581b578 143 // [] indicates from slave
IanBenzMaxim 7:9cd16581b578 144 // BB indicates byte containing bit value in msbit
IanBenzMaxim 7:9cd16581b578 145
IanBenzMaxim 7:9cd16581b578 146 error_code result = configureLevel(afterLevel);
IanBenzMaxim 7:9cd16581b578 147 if (result) {
IanBenzMaxim 7:9cd16581b578 148 return result;
IanBenzMaxim 7:9cd16581b578 149 }
IanBenzMaxim 7:9cd16581b578 150
IanBenzMaxim 7:9cd16581b578 151 result = sendCommand(0x87, sendRecvBit ? 0x80 : 0x00);
IanBenzMaxim 7:9cd16581b578 152 if (result) {
IanBenzMaxim 7:9cd16581b578 153 return result;
IanBenzMaxim 7:9cd16581b578 154 }
IanBenzMaxim 7:9cd16581b578 155
IanBenzMaxim 7:9cd16581b578 156 uint_least8_t status;
IanBenzMaxim 7:9cd16581b578 157 result = pollBusy(&status);
IanBenzMaxim 7:9cd16581b578 158 if (!result) {
IanBenzMaxim 7:9cd16581b578 159 sendRecvBit = ((status & Status_SBR) == Status_SBR);
IanBenzMaxim 7:9cd16581b578 160 }
IanBenzMaxim 7:9cd16581b578 161 return result;
IanBenzMaxim 7:9cd16581b578 162 }
IanBenzMaxim 7:9cd16581b578 163
IanBenzMaxim 7:9cd16581b578 164 error_code DS2482_DS2484::writeByteSetLevel(uint_least8_t sendByte,
IanBenzMaxim 7:9cd16581b578 165 Level afterLevel) {
IanBenzMaxim 7:9cd16581b578 166 // 1-Wire Write Byte (Case B)
IanBenzMaxim 7:9cd16581b578 167 // S AD,0 [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P
IanBenzMaxim 7:9cd16581b578 168 // \--------/
IanBenzMaxim 7:9cd16581b578 169 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 7:9cd16581b578 170 // [] indicates from slave
IanBenzMaxim 7:9cd16581b578 171 // DD data to write
IanBenzMaxim 7:9cd16581b578 172
IanBenzMaxim 7:9cd16581b578 173 error_code result = configureLevel(afterLevel);
IanBenzMaxim 7:9cd16581b578 174 if (result) {
IanBenzMaxim 7:9cd16581b578 175 return result;
IanBenzMaxim 7:9cd16581b578 176 }
IanBenzMaxim 7:9cd16581b578 177
IanBenzMaxim 7:9cd16581b578 178 result = sendCommand(0xA5, sendByte);
IanBenzMaxim 7:9cd16581b578 179 if (result) {
IanBenzMaxim 7:9cd16581b578 180 return result;
IanBenzMaxim 7:9cd16581b578 181 }
IanBenzMaxim 7:9cd16581b578 182
IanBenzMaxim 7:9cd16581b578 183 result = pollBusy();
IanBenzMaxim 7:9cd16581b578 184 return result;
IanBenzMaxim 7:9cd16581b578 185 }
IanBenzMaxim 7:9cd16581b578 186
IanBenzMaxim 7:9cd16581b578 187 error_code DS2482_DS2484::readByteSetLevel(uint_least8_t & recvByte,
IanBenzMaxim 7:9cd16581b578 188 Level afterLevel) {
IanBenzMaxim 7:9cd16581b578 189 // 1-Wire Read Bytes (Case C)
IanBenzMaxim 7:9cd16581b578 190 // S AD,0 [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A
IanBenzMaxim 7:9cd16581b578 191 // \--------/
IanBenzMaxim 7:9cd16581b578 192 // Repeat until 1WB bit has changed to 0
IanBenzMaxim 7:9cd16581b578 193 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P
IanBenzMaxim 7:9cd16581b578 194 //
IanBenzMaxim 7:9cd16581b578 195 // [] indicates from slave
IanBenzMaxim 7:9cd16581b578 196 // DD data read
IanBenzMaxim 7:9cd16581b578 197
IanBenzMaxim 7:9cd16581b578 198 error_code result = configureLevel(afterLevel);
IanBenzMaxim 7:9cd16581b578 199 if (result) {
IanBenzMaxim 7:9cd16581b578 200 return result;
IanBenzMaxim 7:9cd16581b578 201 }
IanBenzMaxim 7:9cd16581b578 202
IanBenzMaxim 7:9cd16581b578 203 result = sendCommand(0x96);
IanBenzMaxim 7:9cd16581b578 204 if (result) {
IanBenzMaxim 7:9cd16581b578 205 return result;
IanBenzMaxim 7:9cd16581b578 206 }
IanBenzMaxim 7:9cd16581b578 207
IanBenzMaxim 7:9cd16581b578 208 result = pollBusy();
IanBenzMaxim 7:9cd16581b578 209 if (result) {
IanBenzMaxim 7:9cd16581b578 210 return result;
IanBenzMaxim 7:9cd16581b578 211 }
IanBenzMaxim 7:9cd16581b578 212
IanBenzMaxim 7:9cd16581b578 213 result = readRegister(0xE1, recvByte);
IanBenzMaxim 7:9cd16581b578 214 return result;
IanBenzMaxim 7:9cd16581b578 215 }
IanBenzMaxim 7:9cd16581b578 216
IanBenzMaxim 7:9cd16581b578 217 error_code DS2482_DS2484::setSpeed(Speed newSpeed) {
IanBenzMaxim 7:9cd16581b578 218 // Check if supported speed
IanBenzMaxim 7:9cd16581b578 219 if (!((newSpeed == OverdriveSpeed) || (newSpeed == StandardSpeed))) {
IanBenzMaxim 7:9cd16581b578 220 return make_error_code(InvalidSpeedError);
IanBenzMaxim 7:9cd16581b578 221 }
IanBenzMaxim 7:9cd16581b578 222 // Check if requested speed is already set
IanBenzMaxim 7:9cd16581b578 223 if (curConfig.get1WS() == (newSpeed == OverdriveSpeed)) {
IanBenzMaxim 7:9cd16581b578 224 return error_code();
IanBenzMaxim 7:9cd16581b578 225 }
IanBenzMaxim 7:9cd16581b578 226 // Set the speed
IanBenzMaxim 7:9cd16581b578 227 return writeConfig(Config(curConfig).set1WS(newSpeed == OverdriveSpeed));
IanBenzMaxim 7:9cd16581b578 228 }
IanBenzMaxim 7:9cd16581b578 229
IanBenzMaxim 7:9cd16581b578 230 error_code DS2482_DS2484::setLevel(Level newLevel) {
IanBenzMaxim 7:9cd16581b578 231 if (newLevel == StrongLevel) {
IanBenzMaxim 7:9cd16581b578 232 return make_error_code(InvalidLevelError);
IanBenzMaxim 7:9cd16581b578 233 }
IanBenzMaxim 7:9cd16581b578 234
IanBenzMaxim 7:9cd16581b578 235 return configureLevel(newLevel);
IanBenzMaxim 7:9cd16581b578 236 }
IanBenzMaxim 7:9cd16581b578 237
IanBenzMaxim 7:9cd16581b578 238 error_code DS2482_DS2484::writeConfig(Config config) {
IanBenzMaxim 7:9cd16581b578 239 uint_least8_t configBuf =
IanBenzMaxim 7:9cd16581b578 240 ((config.readByte() ^ 0xF) << 4) | config.readByte();
IanBenzMaxim 7:9cd16581b578 241 error_code result = sendCommand(0xD2, configBuf);
IanBenzMaxim 7:9cd16581b578 242 if (!result) {
IanBenzMaxim 7:9cd16581b578 243 result = readRegister(0xC3, configBuf);
IanBenzMaxim 7:9cd16581b578 244 }
IanBenzMaxim 7:9cd16581b578 245 if (!result) {
IanBenzMaxim 7:9cd16581b578 246 if (configBuf != config.readByte()) {
IanBenzMaxim 7:9cd16581b578 247 result = make_error_code(HardwareError);
IanBenzMaxim 7:9cd16581b578 248 }
IanBenzMaxim 7:9cd16581b578 249 }
IanBenzMaxim 7:9cd16581b578 250 if (!result) {
IanBenzMaxim 7:9cd16581b578 251 curConfig = config;
IanBenzMaxim 7:9cd16581b578 252 }
IanBenzMaxim 7:9cd16581b578 253 return result;
IanBenzMaxim 7:9cd16581b578 254 }
IanBenzMaxim 7:9cd16581b578 255
IanBenzMaxim 7:9cd16581b578 256 error_code DS2482_DS2484::readRegister(uint_least8_t reg,
IanBenzMaxim 7:9cd16581b578 257 uint_least8_t & buf) const {
IanBenzMaxim 7:9cd16581b578 258 error_code result = sendCommand(0xE1, reg);
IanBenzMaxim 7:9cd16581b578 259 if (!result) {
IanBenzMaxim 7:9cd16581b578 260 result = readRegister(buf);
IanBenzMaxim 7:9cd16581b578 261 }
IanBenzMaxim 7:9cd16581b578 262 return result;
IanBenzMaxim 7:9cd16581b578 263 }
IanBenzMaxim 7:9cd16581b578 264
IanBenzMaxim 7:9cd16581b578 265 error_code DS2482_DS2484::readRegister(uint_least8_t & buf) const {
IanBenzMaxim 7:9cd16581b578 266 return master->readPacket(address_, make_span(&buf, 1));
IanBenzMaxim 7:9cd16581b578 267 }
IanBenzMaxim 7:9cd16581b578 268
IanBenzMaxim 7:9cd16581b578 269 error_code DS2482_DS2484::pollBusy(uint_least8_t * pStatus) {
IanBenzMaxim 7:9cd16581b578 270 const int pollLimit = 200;
IanBenzMaxim 7:9cd16581b578 271
IanBenzMaxim 7:9cd16581b578 272 int pollCount = 0;
IanBenzMaxim 7:9cd16581b578 273 uint_least8_t status;
IanBenzMaxim 7:9cd16581b578 274 do {
IanBenzMaxim 7:9cd16581b578 275 error_code result = readRegister(status);
IanBenzMaxim 7:9cd16581b578 276 if (result) {
IanBenzMaxim 7:9cd16581b578 277 return result;
IanBenzMaxim 7:9cd16581b578 278 }
IanBenzMaxim 7:9cd16581b578 279 if (pStatus != NULL) {
IanBenzMaxim 7:9cd16581b578 280 *pStatus = status;
IanBenzMaxim 7:9cd16581b578 281 }
IanBenzMaxim 7:9cd16581b578 282 if (pollCount++ >= pollLimit) {
IanBenzMaxim 7:9cd16581b578 283 return make_error_code(HardwareError);
IanBenzMaxim 7:9cd16581b578 284 }
IanBenzMaxim 7:9cd16581b578 285 } while (status & Status_1WB);
IanBenzMaxim 7:9cd16581b578 286
IanBenzMaxim 7:9cd16581b578 287 return error_code();
IanBenzMaxim 7:9cd16581b578 288 }
IanBenzMaxim 7:9cd16581b578 289
IanBenzMaxim 7:9cd16581b578 290 error_code DS2482_DS2484::configureLevel(Level level) {
IanBenzMaxim 7:9cd16581b578 291 // Check if supported level
IanBenzMaxim 7:9cd16581b578 292 if (!((level == NormalLevel) || (level == StrongLevel))) {
IanBenzMaxim 7:9cd16581b578 293 return make_error_code(InvalidLevelError);
IanBenzMaxim 7:9cd16581b578 294 }
IanBenzMaxim 7:9cd16581b578 295 // Check if requested level already set
IanBenzMaxim 7:9cd16581b578 296 if (curConfig.getSPU() == (level == StrongLevel)) {
IanBenzMaxim 7:9cd16581b578 297 return error_code();
IanBenzMaxim 7:9cd16581b578 298 }
IanBenzMaxim 7:9cd16581b578 299 // Set the level
IanBenzMaxim 7:9cd16581b578 300 return writeConfig(Config(curConfig).setSPU(level == StrongLevel));
IanBenzMaxim 7:9cd16581b578 301 }
IanBenzMaxim 7:9cd16581b578 302
IanBenzMaxim 7:9cd16581b578 303 error_code DS2482_DS2484::sendCommand(uint_least8_t cmd) const {
IanBenzMaxim 7:9cd16581b578 304 return master->writePacket(address_, make_span(&cmd, 1));
IanBenzMaxim 7:9cd16581b578 305 }
IanBenzMaxim 7:9cd16581b578 306
IanBenzMaxim 7:9cd16581b578 307 error_code DS2482_DS2484::sendCommand(uint_least8_t cmd,
IanBenzMaxim 7:9cd16581b578 308 uint_least8_t param) const {
IanBenzMaxim 7:9cd16581b578 309 uint_least8_t buf[] = {cmd, param};
IanBenzMaxim 7:9cd16581b578 310 return master->writePacket(address_, buf);
IanBenzMaxim 7:9cd16581b578 311 }
IanBenzMaxim 7:9cd16581b578 312
IanBenzMaxim 7:9cd16581b578 313 const error_category & DS2482_DS2484::errorCategory() {
IanBenzMaxim 7:9cd16581b578 314 static class : public error_category {
IanBenzMaxim 7:9cd16581b578 315 public:
IanBenzMaxim 7:9cd16581b578 316 virtual const char * name() const { return "DS2482_DS2484"; }
IanBenzMaxim 7:9cd16581b578 317
IanBenzMaxim 7:9cd16581b578 318 virtual std::string message(int condition) const {
IanBenzMaxim 7:9cd16581b578 319 switch (condition) {
IanBenzMaxim 7:9cd16581b578 320 case HardwareError:
IanBenzMaxim 7:9cd16581b578 321 return "Hardware Error";
IanBenzMaxim 7:9cd16581b578 322
IanBenzMaxim 7:9cd16581b578 323 case ArgumentOutOfRangeError:
IanBenzMaxim 7:9cd16581b578 324 return "Argument Out of Range Error";
IanBenzMaxim 7:9cd16581b578 325
IanBenzMaxim 7:9cd16581b578 326 default:
IanBenzMaxim 7:9cd16581b578 327 return defaultErrorMessage(condition);
IanBenzMaxim 7:9cd16581b578 328 }
IanBenzMaxim 7:9cd16581b578 329 }
IanBenzMaxim 7:9cd16581b578 330 } instance;
IanBenzMaxim 7:9cd16581b578 331 return instance;
IanBenzMaxim 7:9cd16581b578 332 }
IanBenzMaxim 7:9cd16581b578 333
IanBenzMaxim 7:9cd16581b578 334 error_code DS2482_800::selectChannel(int channel) {
IanBenzMaxim 7:9cd16581b578 335 // Channel Select (Case A)
IanBenzMaxim 7:9cd16581b578 336 // S AD,0 [A] CHSL [A] CC [A] Sr AD,1 [A] [RR] A\ P
IanBenzMaxim 7:9cd16581b578 337 // [] indicates from slave
IanBenzMaxim 7:9cd16581b578 338 // CC channel value
IanBenzMaxim 7:9cd16581b578 339 // RR channel read back
IanBenzMaxim 7:9cd16581b578 340
IanBenzMaxim 7:9cd16581b578 341 uint_least8_t ch;
IanBenzMaxim 7:9cd16581b578 342 uint_least8_t ch_read;
IanBenzMaxim 7:9cd16581b578 343 switch (channel) {
IanBenzMaxim 7:9cd16581b578 344 case 0:
IanBenzMaxim 7:9cd16581b578 345 ch = 0xF0;
IanBenzMaxim 7:9cd16581b578 346 ch_read = 0xB8;
IanBenzMaxim 7:9cd16581b578 347 break;
IanBenzMaxim 7:9cd16581b578 348
IanBenzMaxim 7:9cd16581b578 349 case 1:
IanBenzMaxim 7:9cd16581b578 350 ch = 0xE1;
IanBenzMaxim 7:9cd16581b578 351 ch_read = 0xB1;
IanBenzMaxim 7:9cd16581b578 352 break;
IanBenzMaxim 7:9cd16581b578 353
IanBenzMaxim 7:9cd16581b578 354 case 2:
IanBenzMaxim 7:9cd16581b578 355 ch = 0xD2;
IanBenzMaxim 7:9cd16581b578 356 ch_read = 0xAA;
IanBenzMaxim 7:9cd16581b578 357 break;
IanBenzMaxim 7:9cd16581b578 358
IanBenzMaxim 7:9cd16581b578 359 case 3:
IanBenzMaxim 7:9cd16581b578 360 ch = 0xC3;
IanBenzMaxim 7:9cd16581b578 361 ch_read = 0xA3;
IanBenzMaxim 7:9cd16581b578 362 break;
IanBenzMaxim 7:9cd16581b578 363
IanBenzMaxim 7:9cd16581b578 364 case 4:
IanBenzMaxim 7:9cd16581b578 365 ch = 0xB4;
IanBenzMaxim 7:9cd16581b578 366 ch_read = 0x9C;
IanBenzMaxim 7:9cd16581b578 367 break;
IanBenzMaxim 7:9cd16581b578 368
IanBenzMaxim 7:9cd16581b578 369 case 5:
IanBenzMaxim 7:9cd16581b578 370 ch = 0xA5;
IanBenzMaxim 7:9cd16581b578 371 ch_read = 0x95;
IanBenzMaxim 7:9cd16581b578 372 break;
IanBenzMaxim 7:9cd16581b578 373
IanBenzMaxim 7:9cd16581b578 374 case 6:
IanBenzMaxim 7:9cd16581b578 375 ch = 0x96;
IanBenzMaxim 7:9cd16581b578 376 ch_read = 0x8E;
IanBenzMaxim 7:9cd16581b578 377 break;
IanBenzMaxim 7:9cd16581b578 378
IanBenzMaxim 7:9cd16581b578 379 case 7:
IanBenzMaxim 7:9cd16581b578 380 ch = 0x87;
IanBenzMaxim 7:9cd16581b578 381 ch_read = 0x87;
IanBenzMaxim 7:9cd16581b578 382 break;
IanBenzMaxim 7:9cd16581b578 383
IanBenzMaxim 7:9cd16581b578 384 default:
IanBenzMaxim 7:9cd16581b578 385 return make_error_code(ArgumentOutOfRangeError);
IanBenzMaxim 7:9cd16581b578 386 };
IanBenzMaxim 7:9cd16581b578 387
IanBenzMaxim 7:9cd16581b578 388 error_code result = sendCommand(0xC3, ch);
IanBenzMaxim 7:9cd16581b578 389 if (!result) {
IanBenzMaxim 7:9cd16581b578 390 result = readRegister(ch);
IanBenzMaxim 7:9cd16581b578 391 if (!result) {
IanBenzMaxim 7:9cd16581b578 392 // check for failure due to incorrect read back of channel
IanBenzMaxim 7:9cd16581b578 393 if (ch != ch_read) {
IanBenzMaxim 7:9cd16581b578 394 result = make_error_code(HardwareError);
IanBenzMaxim 7:9cd16581b578 395 }
IanBenzMaxim 7:9cd16581b578 396 }
IanBenzMaxim 7:9cd16581b578 397 }
IanBenzMaxim 7:9cd16581b578 398
IanBenzMaxim 7:9cd16581b578 399 return result;
IanBenzMaxim 7:9cd16581b578 400 }
IanBenzMaxim 7:9cd16581b578 401
IanBenzMaxim 7:9cd16581b578 402 error_code DS2484::adjustPort(PortParameter param, int val) {
IanBenzMaxim 7:9cd16581b578 403 if (val < 0 || val > 15) {
IanBenzMaxim 7:9cd16581b578 404 return make_error_code(ArgumentOutOfRangeError);
IanBenzMaxim 7:9cd16581b578 405 }
IanBenzMaxim 7:9cd16581b578 406
IanBenzMaxim 7:9cd16581b578 407 error_code result = sendCommand(0xC3, (param << 4) | val);
IanBenzMaxim 7:9cd16581b578 408 if (result) {
IanBenzMaxim 7:9cd16581b578 409 return result;
IanBenzMaxim 7:9cd16581b578 410 }
IanBenzMaxim 7:9cd16581b578 411
IanBenzMaxim 7:9cd16581b578 412 uint_least8_t portConfig = val + 1;
IanBenzMaxim 7:9cd16581b578 413 for (int reads = -1; reads < param; ++reads) {
IanBenzMaxim 7:9cd16581b578 414 result = readRegister(portConfig);
IanBenzMaxim 7:9cd16581b578 415 if (result) {
IanBenzMaxim 7:9cd16581b578 416 return result;
IanBenzMaxim 7:9cd16581b578 417 }
IanBenzMaxim 7:9cd16581b578 418 }
IanBenzMaxim 7:9cd16581b578 419 if (val != portConfig) {
IanBenzMaxim 7:9cd16581b578 420 result = make_error_code(HardwareError);
IanBenzMaxim 7:9cd16581b578 421 }
IanBenzMaxim 7:9cd16581b578 422
IanBenzMaxim 7:9cd16581b578 423 return result;
IanBenzMaxim 7:9cd16581b578 424 }
IanBenzMaxim 7:9cd16581b578 425
IanBenzMaxim 7:9cd16581b578 426 } // namespace MaximInterfaceDevices