Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
reARMnimator
Date:
Mon Jan 06 15:54:55 2020 +0000
Revision:
10:de4b8812877d
Parent:
6:a8c83a2e6fa4
Fixed inappropriate include path.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 0:f77ad7f72d04 1 /*******************************************************************************
IanBenzMaxim 0:f77ad7f72d04 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 0:f77ad7f72d04 3 *
IanBenzMaxim 0:f77ad7f72d04 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 0:f77ad7f72d04 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 0:f77ad7f72d04 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 0:f77ad7f72d04 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 0:f77ad7f72d04 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 0:f77ad7f72d04 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 0:f77ad7f72d04 10 *
IanBenzMaxim 0:f77ad7f72d04 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 0:f77ad7f72d04 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 0:f77ad7f72d04 13 *
IanBenzMaxim 0:f77ad7f72d04 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 0:f77ad7f72d04 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 0:f77ad7f72d04 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 0:f77ad7f72d04 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 0:f77ad7f72d04 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 0:f77ad7f72d04 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 0:f77ad7f72d04 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 0:f77ad7f72d04 21 *
IanBenzMaxim 0:f77ad7f72d04 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 0:f77ad7f72d04 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 0:f77ad7f72d04 24 * Products, Inc. Branding Policy.
IanBenzMaxim 0:f77ad7f72d04 25 *
IanBenzMaxim 0:f77ad7f72d04 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 0:f77ad7f72d04 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 0:f77ad7f72d04 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 0:f77ad7f72d04 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 0:f77ad7f72d04 30 * ownership rights.
IanBenzMaxim 0:f77ad7f72d04 31 *******************************************************************************/
IanBenzMaxim 0:f77ad7f72d04 32
IanBenzMaxim 0:f77ad7f72d04 33 #include <MaximInterface/Utilities/Error.hpp>
IanBenzMaxim 0:f77ad7f72d04 34 #include "DS2480B.hpp"
IanBenzMaxim 0:f77ad7f72d04 35
IanBenzMaxim 0:f77ad7f72d04 36 // Mode Commands
IanBenzMaxim 0:f77ad7f72d04 37 #define MODE_DATA 0xE1
IanBenzMaxim 0:f77ad7f72d04 38 #define MODE_COMMAND 0xE3
IanBenzMaxim 0:f77ad7f72d04 39 #define MODE_STOP_PULSE 0xF1
IanBenzMaxim 0:f77ad7f72d04 40
IanBenzMaxim 0:f77ad7f72d04 41 // Return byte value
IanBenzMaxim 0:f77ad7f72d04 42 #define RB_CHIPID_MASK 0x1C
IanBenzMaxim 0:f77ad7f72d04 43 #define RB_RESET_MASK 0x03
IanBenzMaxim 0:f77ad7f72d04 44 #define RB_1WIRESHORT 0x00
IanBenzMaxim 0:f77ad7f72d04 45 #define RB_PRESENCE 0x01
IanBenzMaxim 0:f77ad7f72d04 46 #define RB_ALARMPRESENCE 0x02
IanBenzMaxim 0:f77ad7f72d04 47 #define RB_NOPRESENCE 0x03
IanBenzMaxim 0:f77ad7f72d04 48
IanBenzMaxim 0:f77ad7f72d04 49 #define RB_BIT_MASK 0x03
IanBenzMaxim 0:f77ad7f72d04 50 #define RB_BIT_ONE 0x03
IanBenzMaxim 0:f77ad7f72d04 51 #define RB_BIT_ZERO 0x00
IanBenzMaxim 0:f77ad7f72d04 52
IanBenzMaxim 0:f77ad7f72d04 53 // Masks for all bit ranges
IanBenzMaxim 0:f77ad7f72d04 54 #define CMD_MASK 0x80
IanBenzMaxim 0:f77ad7f72d04 55 #define FUNCTSEL_MASK 0x60
IanBenzMaxim 0:f77ad7f72d04 56 #define BITPOL_MASK 0x10
IanBenzMaxim 0:f77ad7f72d04 57 #define SPEEDSEL_MASK 0x0C
IanBenzMaxim 0:f77ad7f72d04 58 #define MODSEL_MASK 0x02
IanBenzMaxim 0:f77ad7f72d04 59 #define PARMSEL_MASK 0x70
IanBenzMaxim 0:f77ad7f72d04 60 #define PARMSET_MASK 0x0E
IanBenzMaxim 0:f77ad7f72d04 61
IanBenzMaxim 0:f77ad7f72d04 62 // Command or config bit
IanBenzMaxim 0:f77ad7f72d04 63 #define CMD_COMM 0x81
IanBenzMaxim 0:f77ad7f72d04 64 #define CMD_CONFIG 0x01
IanBenzMaxim 0:f77ad7f72d04 65
IanBenzMaxim 0:f77ad7f72d04 66 // Function select bits
IanBenzMaxim 0:f77ad7f72d04 67 #define FUNCTSEL_BIT 0x00
IanBenzMaxim 0:f77ad7f72d04 68 #define FUNCTSEL_SEARCHON 0x30
IanBenzMaxim 0:f77ad7f72d04 69 #define FUNCTSEL_SEARCHOFF 0x20
IanBenzMaxim 0:f77ad7f72d04 70 #define FUNCTSEL_RESET 0x40
IanBenzMaxim 0:f77ad7f72d04 71 #define FUNCTSEL_CHMOD 0x60
IanBenzMaxim 0:f77ad7f72d04 72
IanBenzMaxim 0:f77ad7f72d04 73 // Bit polarity/Pulse voltage bits
IanBenzMaxim 0:f77ad7f72d04 74 #define BITPOL_ONE 0x10
IanBenzMaxim 0:f77ad7f72d04 75 #define BITPOL_ZERO 0x00
IanBenzMaxim 0:f77ad7f72d04 76 #define BITPOL_5V 0x00
IanBenzMaxim 0:f77ad7f72d04 77 #define BITPOL_12V 0x10
IanBenzMaxim 0:f77ad7f72d04 78
IanBenzMaxim 0:f77ad7f72d04 79 // One Wire speed bits
IanBenzMaxim 0:f77ad7f72d04 80 #define SPEEDSEL_STD 0x00
IanBenzMaxim 0:f77ad7f72d04 81 #define SPEEDSEL_FLEX 0x04
IanBenzMaxim 0:f77ad7f72d04 82 #define SPEEDSEL_OD 0x08
IanBenzMaxim 0:f77ad7f72d04 83 #define SPEEDSEL_PULSE 0x0C
IanBenzMaxim 0:f77ad7f72d04 84
IanBenzMaxim 0:f77ad7f72d04 85 // Data/Command mode select bits
IanBenzMaxim 0:f77ad7f72d04 86 #define MODSEL_DATA 0x00
IanBenzMaxim 0:f77ad7f72d04 87 #define MODSEL_COMMAND 0x02
IanBenzMaxim 0:f77ad7f72d04 88
IanBenzMaxim 0:f77ad7f72d04 89 // 5V Follow Pulse select bits
IanBenzMaxim 0:f77ad7f72d04 90 #define PRIME5V_TRUE 0x02
IanBenzMaxim 0:f77ad7f72d04 91 #define PRIME5V_FALSE 0x00
IanBenzMaxim 0:f77ad7f72d04 92
IanBenzMaxim 0:f77ad7f72d04 93 // Parameter select bits
IanBenzMaxim 0:f77ad7f72d04 94 #define PARMSEL_PARMREAD 0x00
IanBenzMaxim 0:f77ad7f72d04 95 #define PARMSEL_SLEW 0x10
IanBenzMaxim 0:f77ad7f72d04 96 #define PARMSEL_12VPULSE 0x20
IanBenzMaxim 0:f77ad7f72d04 97 #define PARMSEL_5VPULSE 0x30
IanBenzMaxim 0:f77ad7f72d04 98 #define PARMSEL_WRITE1LOW 0x40
IanBenzMaxim 0:f77ad7f72d04 99 #define PARMSEL_SAMPLEOFFSET 0x50
IanBenzMaxim 0:f77ad7f72d04 100 #define PARMSEL_ACTIVEPULLUPTIME 0x60
IanBenzMaxim 0:f77ad7f72d04 101 #define PARMSEL_BAUDRATE 0x70
IanBenzMaxim 0:f77ad7f72d04 102
IanBenzMaxim 0:f77ad7f72d04 103 // Pull down slew rate.
IanBenzMaxim 0:f77ad7f72d04 104 #define PARMSET_Slew15Vus 0x00
IanBenzMaxim 0:f77ad7f72d04 105 #define PARMSET_Slew2p2Vus 0x02
IanBenzMaxim 0:f77ad7f72d04 106 #define PARMSET_Slew1p65Vus 0x04
IanBenzMaxim 0:f77ad7f72d04 107 #define PARMSET_Slew1p37Vus 0x06
IanBenzMaxim 0:f77ad7f72d04 108 #define PARMSET_Slew1p1Vus 0x08
IanBenzMaxim 0:f77ad7f72d04 109 #define PARMSET_Slew0p83Vus 0x0A
IanBenzMaxim 0:f77ad7f72d04 110 #define PARMSET_Slew0p7Vus 0x0C
IanBenzMaxim 0:f77ad7f72d04 111 #define PARMSET_Slew0p55Vus 0x0E
IanBenzMaxim 0:f77ad7f72d04 112
IanBenzMaxim 0:f77ad7f72d04 113 // 12V programming pulse time table
IanBenzMaxim 0:f77ad7f72d04 114 #define PARMSET_32us 0x00
IanBenzMaxim 0:f77ad7f72d04 115 #define PARMSET_64us 0x02
IanBenzMaxim 0:f77ad7f72d04 116 #define PARMSET_128us 0x04
IanBenzMaxim 0:f77ad7f72d04 117 #define PARMSET_256us 0x06
IanBenzMaxim 0:f77ad7f72d04 118 #define PARMSET_512us 0x08
IanBenzMaxim 0:f77ad7f72d04 119 #define PARMSET_1024us 0x0A
IanBenzMaxim 0:f77ad7f72d04 120 #define PARMSET_2048us 0x0C
IanBenzMaxim 0:f77ad7f72d04 121 #define PARMSET_infinite 0x0E
IanBenzMaxim 0:f77ad7f72d04 122
IanBenzMaxim 0:f77ad7f72d04 123 // 5V strong pull up pulse time table
IanBenzMaxim 0:f77ad7f72d04 124 #define PARMSET_16p4ms 0x00
IanBenzMaxim 0:f77ad7f72d04 125 #define PARMSET_65p5ms 0x02
IanBenzMaxim 0:f77ad7f72d04 126 #define PARMSET_131ms 0x04
IanBenzMaxim 0:f77ad7f72d04 127 #define PARMSET_262ms 0x06
IanBenzMaxim 0:f77ad7f72d04 128 #define PARMSET_524ms 0x08
IanBenzMaxim 0:f77ad7f72d04 129 #define PARMSET_1p05s 0x0A
IanBenzMaxim 0:f77ad7f72d04 130 #define PARMSET_dynamic 0x0C
IanBenzMaxim 0:f77ad7f72d04 131 #define PARMSET_infinite 0x0E
IanBenzMaxim 0:f77ad7f72d04 132
IanBenzMaxim 0:f77ad7f72d04 133 // Write 1 low time
IanBenzMaxim 0:f77ad7f72d04 134 #define PARMSET_Write8us 0x00
IanBenzMaxim 0:f77ad7f72d04 135 #define PARMSET_Write9us 0x02
IanBenzMaxim 0:f77ad7f72d04 136 #define PARMSET_Write10us 0x04
IanBenzMaxim 0:f77ad7f72d04 137 #define PARMSET_Write11us 0x06
IanBenzMaxim 0:f77ad7f72d04 138 #define PARMSET_Write12us 0x08
IanBenzMaxim 0:f77ad7f72d04 139 #define PARMSET_Write13us 0x0A
IanBenzMaxim 0:f77ad7f72d04 140 #define PARMSET_Write14us 0x0C
IanBenzMaxim 0:f77ad7f72d04 141 #define PARMSET_Write15us 0x0E
IanBenzMaxim 0:f77ad7f72d04 142
IanBenzMaxim 0:f77ad7f72d04 143 // Data sample offset and Write 0 recovery time
IanBenzMaxim 0:f77ad7f72d04 144 #define PARMSET_SampOff3us 0x00
IanBenzMaxim 0:f77ad7f72d04 145 #define PARMSET_SampOff4us 0x02
IanBenzMaxim 0:f77ad7f72d04 146 #define PARMSET_SampOff5us 0x04
IanBenzMaxim 0:f77ad7f72d04 147 #define PARMSET_SampOff6us 0x06
IanBenzMaxim 0:f77ad7f72d04 148 #define PARMSET_SampOff7us 0x08
IanBenzMaxim 0:f77ad7f72d04 149 #define PARMSET_SampOff8us 0x0A
IanBenzMaxim 0:f77ad7f72d04 150 #define PARMSET_SampOff9us 0x0C
IanBenzMaxim 0:f77ad7f72d04 151 #define PARMSET_SampOff10us 0x0E
IanBenzMaxim 0:f77ad7f72d04 152
IanBenzMaxim 0:f77ad7f72d04 153 // Active pull up on time
IanBenzMaxim 0:f77ad7f72d04 154 #define PARMSET_PullUp0p0us 0x00
IanBenzMaxim 0:f77ad7f72d04 155 #define PARMSET_PullUp0p5us 0x02
IanBenzMaxim 0:f77ad7f72d04 156 #define PARMSET_PullUp1p0us 0x04
IanBenzMaxim 0:f77ad7f72d04 157 #define PARMSET_PullUp1p5us 0x06
IanBenzMaxim 0:f77ad7f72d04 158 #define PARMSET_PullUp2p0us 0x08
IanBenzMaxim 0:f77ad7f72d04 159 #define PARMSET_PullUp2p5us 0x0A
IanBenzMaxim 0:f77ad7f72d04 160 #define PARMSET_PullUp3p0us 0x0C
IanBenzMaxim 0:f77ad7f72d04 161 #define PARMSET_PullUp3p5us 0x0E
IanBenzMaxim 0:f77ad7f72d04 162
IanBenzMaxim 6:a8c83a2e6fa4 163 // Baud rate bits
IanBenzMaxim 6:a8c83a2e6fa4 164 #define PARMSET_9600 0x00
IanBenzMaxim 6:a8c83a2e6fa4 165 #define PARMSET_19200 0x02
IanBenzMaxim 6:a8c83a2e6fa4 166 #define PARMSET_57600 0x04
IanBenzMaxim 6:a8c83a2e6fa4 167 #define PARMSET_115200 0x06
IanBenzMaxim 6:a8c83a2e6fa4 168
IanBenzMaxim 0:f77ad7f72d04 169 // DS2480B program voltage available
IanBenzMaxim 0:f77ad7f72d04 170 #define DS2480BPROG_MASK 0x20
IanBenzMaxim 0:f77ad7f72d04 171
IanBenzMaxim 0:f77ad7f72d04 172 namespace MaximInterface {
IanBenzMaxim 0:f77ad7f72d04 173
IanBenzMaxim 0:f77ad7f72d04 174 error_code DS2480B::initialize() {
IanBenzMaxim 0:f77ad7f72d04 175 level = NormalLevel;
IanBenzMaxim 0:f77ad7f72d04 176 mode = MODSEL_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 177 speed = SPEEDSEL_STD;
IanBenzMaxim 0:f77ad7f72d04 178
IanBenzMaxim 6:a8c83a2e6fa4 179 // Send a break to reset the DS2480B.
IanBenzMaxim 0:f77ad7f72d04 180 // Switch to lower baud rate to ensure break is longer than 2 ms.
IanBenzMaxim 3:f818ea5172ed 181 error_code result = uart->setBaudRate(4800);
IanBenzMaxim 0:f77ad7f72d04 182 if (result) {
IanBenzMaxim 0:f77ad7f72d04 183 return result;
IanBenzMaxim 0:f77ad7f72d04 184 }
IanBenzMaxim 0:f77ad7f72d04 185 result = uart->sendBreak();
IanBenzMaxim 0:f77ad7f72d04 186 if (result) {
IanBenzMaxim 0:f77ad7f72d04 187 return result;
IanBenzMaxim 0:f77ad7f72d04 188 }
IanBenzMaxim 6:a8c83a2e6fa4 189 result = uart->setBaudRate(9600);
IanBenzMaxim 6:a8c83a2e6fa4 190 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 191 return result;
IanBenzMaxim 6:a8c83a2e6fa4 192 }
IanBenzMaxim 6:a8c83a2e6fa4 193
IanBenzMaxim 6:a8c83a2e6fa4 194 // Wait for master reset.
IanBenzMaxim 6:a8c83a2e6fa4 195 sleep->invoke(1);
IanBenzMaxim 6:a8c83a2e6fa4 196
IanBenzMaxim 6:a8c83a2e6fa4 197 // Flush the read buffer.
IanBenzMaxim 6:a8c83a2e6fa4 198 result = uart->clearReadBuffer();
IanBenzMaxim 6:a8c83a2e6fa4 199 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 200 return result;
IanBenzMaxim 6:a8c83a2e6fa4 201 }
IanBenzMaxim 6:a8c83a2e6fa4 202
IanBenzMaxim 6:a8c83a2e6fa4 203 // Send the timing byte.
IanBenzMaxim 6:a8c83a2e6fa4 204 result = uart->writeByte(CMD_COMM | FUNCTSEL_RESET | SPEEDSEL_STD);
IanBenzMaxim 6:a8c83a2e6fa4 205 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 206 return result;
IanBenzMaxim 6:a8c83a2e6fa4 207 }
IanBenzMaxim 6:a8c83a2e6fa4 208
IanBenzMaxim 6:a8c83a2e6fa4 209 // Change the DS2480 baud rate.
IanBenzMaxim 6:a8c83a2e6fa4 210 result = uart->writeByte(CMD_CONFIG | PARMSEL_BAUDRATE | PARMSET_115200);
IanBenzMaxim 6:a8c83a2e6fa4 211 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 212 return result;
IanBenzMaxim 6:a8c83a2e6fa4 213 }
IanBenzMaxim 6:a8c83a2e6fa4 214
IanBenzMaxim 6:a8c83a2e6fa4 215 // Change our baud rate.
IanBenzMaxim 6:a8c83a2e6fa4 216 result = uart->setBaudRate(115200);
IanBenzMaxim 6:a8c83a2e6fa4 217 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 218 return result;
IanBenzMaxim 6:a8c83a2e6fa4 219 }
IanBenzMaxim 6:a8c83a2e6fa4 220
IanBenzMaxim 6:a8c83a2e6fa4 221 uint_least8_t response;
IanBenzMaxim 6:a8c83a2e6fa4 222
IanBenzMaxim 6:a8c83a2e6fa4 223 // Verify response.
IanBenzMaxim 6:a8c83a2e6fa4 224 result = uart->readByte(response);
IanBenzMaxim 6:a8c83a2e6fa4 225 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 226 return result;
IanBenzMaxim 6:a8c83a2e6fa4 227 }
IanBenzMaxim 6:a8c83a2e6fa4 228 if ((response & (PARMSEL_MASK | PARMSET_MASK)) !=
IanBenzMaxim 6:a8c83a2e6fa4 229 (PARMSEL_BAUDRATE | PARMSET_115200)) {
IanBenzMaxim 6:a8c83a2e6fa4 230 return make_error_code(HardwareError);
IanBenzMaxim 6:a8c83a2e6fa4 231 }
IanBenzMaxim 6:a8c83a2e6fa4 232
IanBenzMaxim 6:a8c83a2e6fa4 233 // Set the SPUD time value.
IanBenzMaxim 6:a8c83a2e6fa4 234 result = uart->writeByte(CMD_CONFIG | PARMSEL_5VPULSE | PARMSET_infinite);
IanBenzMaxim 6:a8c83a2e6fa4 235 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 236 return result;
IanBenzMaxim 6:a8c83a2e6fa4 237 }
IanBenzMaxim 6:a8c83a2e6fa4 238
IanBenzMaxim 6:a8c83a2e6fa4 239 // Verify response.
IanBenzMaxim 6:a8c83a2e6fa4 240 result = uart->readByte(response);
IanBenzMaxim 6:a8c83a2e6fa4 241 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 242 return result;
IanBenzMaxim 6:a8c83a2e6fa4 243 }
IanBenzMaxim 6:a8c83a2e6fa4 244 if ((response & (PARMSEL_MASK | PARMSET_MASK)) !=
IanBenzMaxim 6:a8c83a2e6fa4 245 (PARMSEL_5VPULSE | PARMSET_infinite)) {
IanBenzMaxim 6:a8c83a2e6fa4 246 return make_error_code(HardwareError);
IanBenzMaxim 6:a8c83a2e6fa4 247 }
IanBenzMaxim 6:a8c83a2e6fa4 248
IanBenzMaxim 6:a8c83a2e6fa4 249 return result;
IanBenzMaxim 6:a8c83a2e6fa4 250 }
IanBenzMaxim 6:a8c83a2e6fa4 251
IanBenzMaxim 6:a8c83a2e6fa4 252 error_code DS2480B::reset() {
IanBenzMaxim 6:a8c83a2e6fa4 253 if (level != NormalLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 254 return make_error_code(InvalidLevelError);
IanBenzMaxim 6:a8c83a2e6fa4 255 }
IanBenzMaxim 6:a8c83a2e6fa4 256
IanBenzMaxim 6:a8c83a2e6fa4 257 uint_least8_t packet[2];
IanBenzMaxim 6:a8c83a2e6fa4 258 int packetLen = 0;
IanBenzMaxim 6:a8c83a2e6fa4 259
IanBenzMaxim 6:a8c83a2e6fa4 260 // Check for correct mode.
IanBenzMaxim 6:a8c83a2e6fa4 261 if (mode != MODSEL_COMMAND) {
IanBenzMaxim 6:a8c83a2e6fa4 262 mode = MODSEL_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 263 packet[packetLen++] = MODE_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 264 }
IanBenzMaxim 6:a8c83a2e6fa4 265
IanBenzMaxim 6:a8c83a2e6fa4 266 // Construct the command.
IanBenzMaxim 6:a8c83a2e6fa4 267 packet[packetLen++] = CMD_COMM | FUNCTSEL_RESET | speed;
IanBenzMaxim 6:a8c83a2e6fa4 268
IanBenzMaxim 6:a8c83a2e6fa4 269 // Send the packet.
IanBenzMaxim 6:a8c83a2e6fa4 270 error_code result = uart->writeBlock(make_span(packet, packetLen));
IanBenzMaxim 6:a8c83a2e6fa4 271 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 272 return result;
IanBenzMaxim 6:a8c83a2e6fa4 273 }
IanBenzMaxim 6:a8c83a2e6fa4 274
IanBenzMaxim 6:a8c83a2e6fa4 275 // Read back the response.
IanBenzMaxim 6:a8c83a2e6fa4 276 result = uart->readByte(packet[0]);
IanBenzMaxim 6:a8c83a2e6fa4 277 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 278 return result;
IanBenzMaxim 6:a8c83a2e6fa4 279 }
IanBenzMaxim 6:a8c83a2e6fa4 280
IanBenzMaxim 6:a8c83a2e6fa4 281 // Make sure this byte looks like a reset byte.
IanBenzMaxim 6:a8c83a2e6fa4 282 if ((packet[0] & RB_RESET_MASK) == RB_1WIRESHORT) {
IanBenzMaxim 6:a8c83a2e6fa4 283 result = make_error_code(ShortDetectedError);
IanBenzMaxim 6:a8c83a2e6fa4 284 } else if ((packet[0] & RB_RESET_MASK) == RB_NOPRESENCE) {
IanBenzMaxim 6:a8c83a2e6fa4 285 result = make_error_code(NoSlaveError);
IanBenzMaxim 6:a8c83a2e6fa4 286 }
IanBenzMaxim 6:a8c83a2e6fa4 287 return result;
IanBenzMaxim 6:a8c83a2e6fa4 288 }
IanBenzMaxim 6:a8c83a2e6fa4 289
IanBenzMaxim 6:a8c83a2e6fa4 290 error_code DS2480B::touchBitSetLevel(bool & sendRecvBit, Level afterLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 291 if (level != NormalLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 292 return make_error_code(InvalidLevelError);
IanBenzMaxim 6:a8c83a2e6fa4 293 }
IanBenzMaxim 6:a8c83a2e6fa4 294
IanBenzMaxim 6:a8c83a2e6fa4 295 uint_least8_t packet[3];
IanBenzMaxim 6:a8c83a2e6fa4 296 int packetLen = 0;
IanBenzMaxim 6:a8c83a2e6fa4 297
IanBenzMaxim 6:a8c83a2e6fa4 298 // Check for correct mode.
IanBenzMaxim 6:a8c83a2e6fa4 299 if (mode != MODSEL_COMMAND) {
IanBenzMaxim 6:a8c83a2e6fa4 300 mode = MODSEL_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 301 packet[packetLen++] = MODE_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 302 }
IanBenzMaxim 6:a8c83a2e6fa4 303
IanBenzMaxim 6:a8c83a2e6fa4 304 // Construct the command.
IanBenzMaxim 6:a8c83a2e6fa4 305 packet[packetLen++] = CMD_COMM | FUNCTSEL_BIT |
IanBenzMaxim 6:a8c83a2e6fa4 306 (sendRecvBit ? BITPOL_ONE : BITPOL_ZERO) | speed;
IanBenzMaxim 6:a8c83a2e6fa4 307 switch (afterLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 308 case NormalLevel:
IanBenzMaxim 6:a8c83a2e6fa4 309 break;
IanBenzMaxim 6:a8c83a2e6fa4 310
IanBenzMaxim 6:a8c83a2e6fa4 311 case StrongLevel:
IanBenzMaxim 6:a8c83a2e6fa4 312 // Add the command to begin the pulse.
IanBenzMaxim 6:a8c83a2e6fa4 313 packet[packetLen++] =
IanBenzMaxim 6:a8c83a2e6fa4 314 CMD_COMM | FUNCTSEL_CHMOD | SPEEDSEL_PULSE | BITPOL_5V | PRIME5V_FALSE;
IanBenzMaxim 6:a8c83a2e6fa4 315 break;
IanBenzMaxim 6:a8c83a2e6fa4 316
IanBenzMaxim 6:a8c83a2e6fa4 317 default:
IanBenzMaxim 6:a8c83a2e6fa4 318 return make_error_code(InvalidLevelError);
IanBenzMaxim 6:a8c83a2e6fa4 319 }
IanBenzMaxim 6:a8c83a2e6fa4 320
IanBenzMaxim 6:a8c83a2e6fa4 321 // Send the packet.
IanBenzMaxim 6:a8c83a2e6fa4 322 error_code result = uart->writeBlock(make_span(packet, packetLen));
IanBenzMaxim 6:a8c83a2e6fa4 323 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 324 return result;
IanBenzMaxim 6:a8c83a2e6fa4 325 }
IanBenzMaxim 6:a8c83a2e6fa4 326
IanBenzMaxim 6:a8c83a2e6fa4 327 // Read back the response.
IanBenzMaxim 6:a8c83a2e6fa4 328 result = uart->readByte(packet[0]);
IanBenzMaxim 6:a8c83a2e6fa4 329 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 330 return result;
IanBenzMaxim 6:a8c83a2e6fa4 331 }
IanBenzMaxim 6:a8c83a2e6fa4 332
IanBenzMaxim 6:a8c83a2e6fa4 333 // Interpret the response.
IanBenzMaxim 6:a8c83a2e6fa4 334 if ((packet[0] & 0xE0) == 0x80) {
IanBenzMaxim 6:a8c83a2e6fa4 335 sendRecvBit = ((packet[0] & RB_BIT_MASK) == RB_BIT_ONE);
IanBenzMaxim 6:a8c83a2e6fa4 336 level = afterLevel;
IanBenzMaxim 6:a8c83a2e6fa4 337 } else {
IanBenzMaxim 6:a8c83a2e6fa4 338 result = make_error_code(HardwareError);
IanBenzMaxim 6:a8c83a2e6fa4 339 }
IanBenzMaxim 0:f77ad7f72d04 340 return result;
IanBenzMaxim 0:f77ad7f72d04 341 }
IanBenzMaxim 0:f77ad7f72d04 342
IanBenzMaxim 6:a8c83a2e6fa4 343 error_code DS2480B::writeByteSetLevel(uint_least8_t sendByte,
IanBenzMaxim 6:a8c83a2e6fa4 344 Level afterLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 345 if (level != NormalLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 346 return make_error_code(InvalidLevelError);
IanBenzMaxim 6:a8c83a2e6fa4 347 }
IanBenzMaxim 6:a8c83a2e6fa4 348
IanBenzMaxim 6:a8c83a2e6fa4 349 switch (afterLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 350 case NormalLevel:
IanBenzMaxim 6:a8c83a2e6fa4 351 break;
IanBenzMaxim 6:a8c83a2e6fa4 352
IanBenzMaxim 6:a8c83a2e6fa4 353 case StrongLevel:
IanBenzMaxim 6:a8c83a2e6fa4 354 return OneWireMaster::writeByteSetLevel(sendByte, afterLevel);
IanBenzMaxim 6:a8c83a2e6fa4 355
IanBenzMaxim 6:a8c83a2e6fa4 356 default:
IanBenzMaxim 6:a8c83a2e6fa4 357 return make_error_code(InvalidLevelError);
IanBenzMaxim 6:a8c83a2e6fa4 358 }
IanBenzMaxim 6:a8c83a2e6fa4 359
IanBenzMaxim 6:a8c83a2e6fa4 360 uint_least8_t packet[3];
IanBenzMaxim 6:a8c83a2e6fa4 361 int packetLen = 0;
IanBenzMaxim 6:a8c83a2e6fa4 362
IanBenzMaxim 6:a8c83a2e6fa4 363 // Check for correct mode.
IanBenzMaxim 6:a8c83a2e6fa4 364 if (mode != MODSEL_DATA) {
IanBenzMaxim 6:a8c83a2e6fa4 365 mode = MODSEL_DATA;
IanBenzMaxim 6:a8c83a2e6fa4 366 packet[packetLen++] = MODE_DATA;
IanBenzMaxim 6:a8c83a2e6fa4 367 }
IanBenzMaxim 6:a8c83a2e6fa4 368
IanBenzMaxim 6:a8c83a2e6fa4 369 // Add the byte to send.
IanBenzMaxim 6:a8c83a2e6fa4 370 packet[packetLen++] = sendByte;
IanBenzMaxim 6:a8c83a2e6fa4 371
IanBenzMaxim 6:a8c83a2e6fa4 372 // Check for duplication of data that looks like COMMAND mode.
IanBenzMaxim 6:a8c83a2e6fa4 373 if (sendByte == MODE_COMMAND) {
IanBenzMaxim 6:a8c83a2e6fa4 374 packet[packetLen++] = sendByte;
IanBenzMaxim 6:a8c83a2e6fa4 375 }
IanBenzMaxim 6:a8c83a2e6fa4 376
IanBenzMaxim 6:a8c83a2e6fa4 377 // Send the packet.
IanBenzMaxim 6:a8c83a2e6fa4 378 error_code result = uart->writeBlock(make_span(packet, packetLen));
IanBenzMaxim 6:a8c83a2e6fa4 379 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 380 return result;
IanBenzMaxim 6:a8c83a2e6fa4 381 }
IanBenzMaxim 6:a8c83a2e6fa4 382
IanBenzMaxim 6:a8c83a2e6fa4 383 // Read back the response.
IanBenzMaxim 6:a8c83a2e6fa4 384 result = uart->readByte(packet[0]);
IanBenzMaxim 6:a8c83a2e6fa4 385 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 386 return result;
IanBenzMaxim 6:a8c83a2e6fa4 387 }
IanBenzMaxim 6:a8c83a2e6fa4 388
IanBenzMaxim 6:a8c83a2e6fa4 389 // Interpret the response.
IanBenzMaxim 6:a8c83a2e6fa4 390 if (packet[0] != sendByte) {
IanBenzMaxim 6:a8c83a2e6fa4 391 result = make_error_code(HardwareError);
IanBenzMaxim 6:a8c83a2e6fa4 392 }
IanBenzMaxim 6:a8c83a2e6fa4 393 return result;
IanBenzMaxim 6:a8c83a2e6fa4 394 }
IanBenzMaxim 6:a8c83a2e6fa4 395
IanBenzMaxim 6:a8c83a2e6fa4 396 error_code DS2480B::readByteSetLevel(uint_least8_t & recvByte,
IanBenzMaxim 6:a8c83a2e6fa4 397 Level afterLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 398 if (level != NormalLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 399 return make_error_code(InvalidLevelError);
IanBenzMaxim 6:a8c83a2e6fa4 400 }
IanBenzMaxim 6:a8c83a2e6fa4 401
IanBenzMaxim 6:a8c83a2e6fa4 402 switch (afterLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 403 case NormalLevel:
IanBenzMaxim 6:a8c83a2e6fa4 404 break;
IanBenzMaxim 6:a8c83a2e6fa4 405
IanBenzMaxim 6:a8c83a2e6fa4 406 case StrongLevel:
IanBenzMaxim 6:a8c83a2e6fa4 407 return OneWireMaster::readByteSetLevel(recvByte, afterLevel);
IanBenzMaxim 6:a8c83a2e6fa4 408
IanBenzMaxim 6:a8c83a2e6fa4 409 default:
IanBenzMaxim 6:a8c83a2e6fa4 410 return make_error_code(InvalidLevelError);
IanBenzMaxim 6:a8c83a2e6fa4 411 }
IanBenzMaxim 6:a8c83a2e6fa4 412
IanBenzMaxim 6:a8c83a2e6fa4 413 uint_least8_t packet[2];
IanBenzMaxim 6:a8c83a2e6fa4 414 int packetLen = 0;
IanBenzMaxim 6:a8c83a2e6fa4 415
IanBenzMaxim 6:a8c83a2e6fa4 416 // Check for correct mode.
IanBenzMaxim 6:a8c83a2e6fa4 417 if (mode != MODSEL_DATA) {
IanBenzMaxim 6:a8c83a2e6fa4 418 mode = MODSEL_DATA;
IanBenzMaxim 6:a8c83a2e6fa4 419 packet[packetLen++] = MODE_DATA;
IanBenzMaxim 6:a8c83a2e6fa4 420 }
IanBenzMaxim 6:a8c83a2e6fa4 421
IanBenzMaxim 6:a8c83a2e6fa4 422 // Add the byte to send.
IanBenzMaxim 6:a8c83a2e6fa4 423 packet[packetLen++] = 0xFF;
IanBenzMaxim 6:a8c83a2e6fa4 424
IanBenzMaxim 6:a8c83a2e6fa4 425 // Send the packet.
IanBenzMaxim 6:a8c83a2e6fa4 426 error_code result = uart->writeBlock(make_span(packet, packetLen));
IanBenzMaxim 6:a8c83a2e6fa4 427 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 428 return result;
IanBenzMaxim 6:a8c83a2e6fa4 429 }
IanBenzMaxim 6:a8c83a2e6fa4 430
IanBenzMaxim 6:a8c83a2e6fa4 431 // Read back the response.
IanBenzMaxim 6:a8c83a2e6fa4 432 result = uart->readByte(recvByte);
IanBenzMaxim 6:a8c83a2e6fa4 433 return result;
IanBenzMaxim 6:a8c83a2e6fa4 434 }
IanBenzMaxim 6:a8c83a2e6fa4 435
IanBenzMaxim 6:a8c83a2e6fa4 436 error_code DS2480B::setSpeed(Speed newSpeed) {
IanBenzMaxim 6:a8c83a2e6fa4 437 uint_least8_t newSpeedByte;
IanBenzMaxim 6:a8c83a2e6fa4 438 switch (newSpeed) {
IanBenzMaxim 6:a8c83a2e6fa4 439 case OverdriveSpeed:
IanBenzMaxim 6:a8c83a2e6fa4 440 newSpeedByte = SPEEDSEL_OD;
IanBenzMaxim 6:a8c83a2e6fa4 441 break;
IanBenzMaxim 6:a8c83a2e6fa4 442
IanBenzMaxim 6:a8c83a2e6fa4 443 case StandardSpeed:
IanBenzMaxim 6:a8c83a2e6fa4 444 newSpeedByte = SPEEDSEL_STD;
IanBenzMaxim 6:a8c83a2e6fa4 445 break;
IanBenzMaxim 6:a8c83a2e6fa4 446
IanBenzMaxim 6:a8c83a2e6fa4 447 default:
IanBenzMaxim 6:a8c83a2e6fa4 448 return make_error_code(InvalidSpeedError);
IanBenzMaxim 6:a8c83a2e6fa4 449 }
IanBenzMaxim 6:a8c83a2e6fa4 450 if (speed == newSpeedByte) {
IanBenzMaxim 6:a8c83a2e6fa4 451 return error_code();
IanBenzMaxim 6:a8c83a2e6fa4 452 }
IanBenzMaxim 6:a8c83a2e6fa4 453 speed = newSpeedByte;
IanBenzMaxim 6:a8c83a2e6fa4 454
IanBenzMaxim 6:a8c83a2e6fa4 455 uint_least8_t packet[2];
IanBenzMaxim 6:a8c83a2e6fa4 456 int packetLen = 0;
IanBenzMaxim 6:a8c83a2e6fa4 457
IanBenzMaxim 6:a8c83a2e6fa4 458 // Check for correct mode.
IanBenzMaxim 6:a8c83a2e6fa4 459 if (mode != MODSEL_COMMAND) {
IanBenzMaxim 6:a8c83a2e6fa4 460 mode = MODSEL_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 461 packet[packetLen++] = MODE_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 462 }
IanBenzMaxim 6:a8c83a2e6fa4 463
IanBenzMaxim 6:a8c83a2e6fa4 464 // Change DS2480 speed.
IanBenzMaxim 6:a8c83a2e6fa4 465 packet[packetLen++] = CMD_COMM | FUNCTSEL_SEARCHOFF | speed;
IanBenzMaxim 6:a8c83a2e6fa4 466
IanBenzMaxim 6:a8c83a2e6fa4 467 // Send the packet.
IanBenzMaxim 6:a8c83a2e6fa4 468 return uart->writeBlock(make_span(packet, packetLen));
IanBenzMaxim 6:a8c83a2e6fa4 469 }
IanBenzMaxim 6:a8c83a2e6fa4 470
IanBenzMaxim 6:a8c83a2e6fa4 471 error_code DS2480B::setLevel(Level newLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 472 if (level == newLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 473 return error_code();
IanBenzMaxim 6:a8c83a2e6fa4 474 }
IanBenzMaxim 6:a8c83a2e6fa4 475
IanBenzMaxim 6:a8c83a2e6fa4 476 uint_least8_t packet[2];
IanBenzMaxim 6:a8c83a2e6fa4 477 int packetLen = 0;
IanBenzMaxim 6:a8c83a2e6fa4 478
IanBenzMaxim 6:a8c83a2e6fa4 479 switch (newLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 480 case NormalLevel:
IanBenzMaxim 6:a8c83a2e6fa4 481 // Stop pulse command.
IanBenzMaxim 6:a8c83a2e6fa4 482 packet[packetLen++] = MODE_STOP_PULSE;
IanBenzMaxim 6:a8c83a2e6fa4 483 break;
IanBenzMaxim 6:a8c83a2e6fa4 484
IanBenzMaxim 6:a8c83a2e6fa4 485 case StrongLevel:
IanBenzMaxim 6:a8c83a2e6fa4 486 // Check for correct mode.
IanBenzMaxim 6:a8c83a2e6fa4 487 if (mode != MODSEL_COMMAND) {
IanBenzMaxim 6:a8c83a2e6fa4 488 mode = MODSEL_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 489 packet[packetLen++] = MODE_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 490 }
IanBenzMaxim 6:a8c83a2e6fa4 491
IanBenzMaxim 6:a8c83a2e6fa4 492 // Add the command to begin the pulse.
IanBenzMaxim 6:a8c83a2e6fa4 493 packet[packetLen++] =
IanBenzMaxim 6:a8c83a2e6fa4 494 CMD_COMM | FUNCTSEL_CHMOD | SPEEDSEL_PULSE | BITPOL_5V | PRIME5V_FALSE;
IanBenzMaxim 6:a8c83a2e6fa4 495 break;
IanBenzMaxim 6:a8c83a2e6fa4 496
IanBenzMaxim 6:a8c83a2e6fa4 497 default:
IanBenzMaxim 6:a8c83a2e6fa4 498 return make_error_code(InvalidLevelError);
IanBenzMaxim 6:a8c83a2e6fa4 499 }
IanBenzMaxim 6:a8c83a2e6fa4 500
IanBenzMaxim 6:a8c83a2e6fa4 501 // Send the packet.
IanBenzMaxim 6:a8c83a2e6fa4 502 error_code result = uart->writeBlock(make_span(packet, packetLen));
IanBenzMaxim 6:a8c83a2e6fa4 503 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 504 return result;
IanBenzMaxim 6:a8c83a2e6fa4 505 }
IanBenzMaxim 6:a8c83a2e6fa4 506
IanBenzMaxim 6:a8c83a2e6fa4 507 if (newLevel == NormalLevel) {
IanBenzMaxim 6:a8c83a2e6fa4 508 // Read back the response.
IanBenzMaxim 6:a8c83a2e6fa4 509 result = uart->readByte(packet[0]);
IanBenzMaxim 6:a8c83a2e6fa4 510 if (result) {
IanBenzMaxim 6:a8c83a2e6fa4 511 return result;
IanBenzMaxim 6:a8c83a2e6fa4 512 }
IanBenzMaxim 6:a8c83a2e6fa4 513
IanBenzMaxim 6:a8c83a2e6fa4 514 // Interpret the response.
IanBenzMaxim 6:a8c83a2e6fa4 515 if ((packet[0] & 0xE0) != 0xE0) {
IanBenzMaxim 6:a8c83a2e6fa4 516 return make_error_code(HardwareError);
IanBenzMaxim 6:a8c83a2e6fa4 517 }
IanBenzMaxim 6:a8c83a2e6fa4 518 }
IanBenzMaxim 6:a8c83a2e6fa4 519
IanBenzMaxim 6:a8c83a2e6fa4 520 level = newLevel;
IanBenzMaxim 6:a8c83a2e6fa4 521 return result;
IanBenzMaxim 6:a8c83a2e6fa4 522 }
IanBenzMaxim 6:a8c83a2e6fa4 523
IanBenzMaxim 6:a8c83a2e6fa4 524 error_code DS2480B::sendCommand(uint_least8_t command) {
IanBenzMaxim 6:a8c83a2e6fa4 525 uint_least8_t packet[2];
IanBenzMaxim 6:a8c83a2e6fa4 526 int packetLen = 0;
IanBenzMaxim 6:a8c83a2e6fa4 527
IanBenzMaxim 6:a8c83a2e6fa4 528 // Check for correct mode.
IanBenzMaxim 6:a8c83a2e6fa4 529 if (mode != MODSEL_COMMAND) {
IanBenzMaxim 6:a8c83a2e6fa4 530 mode = MODSEL_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 531 packet[packetLen++] = MODE_COMMAND;
IanBenzMaxim 6:a8c83a2e6fa4 532 }
IanBenzMaxim 6:a8c83a2e6fa4 533
IanBenzMaxim 6:a8c83a2e6fa4 534 // Add command.
IanBenzMaxim 6:a8c83a2e6fa4 535 packet[packetLen++] = command;
IanBenzMaxim 6:a8c83a2e6fa4 536
IanBenzMaxim 6:a8c83a2e6fa4 537 // Send the packet.
IanBenzMaxim 6:a8c83a2e6fa4 538 return uart->writeBlock(make_span(packet, packetLen));
IanBenzMaxim 6:a8c83a2e6fa4 539 }
IanBenzMaxim 6:a8c83a2e6fa4 540
IanBenzMaxim 0:f77ad7f72d04 541 const error_category & DS2480B::errorCategory() {
IanBenzMaxim 0:f77ad7f72d04 542 static class : public error_category {
IanBenzMaxim 0:f77ad7f72d04 543 public:
IanBenzMaxim 0:f77ad7f72d04 544 virtual const char * name() const { return "DS2480B"; }
IanBenzMaxim 0:f77ad7f72d04 545
IanBenzMaxim 0:f77ad7f72d04 546 virtual std::string message(int condition) const {
IanBenzMaxim 0:f77ad7f72d04 547 switch (condition) {
IanBenzMaxim 0:f77ad7f72d04 548 case HardwareError:
IanBenzMaxim 0:f77ad7f72d04 549 return "Hardware Error";
IanBenzMaxim 0:f77ad7f72d04 550
IanBenzMaxim 0:f77ad7f72d04 551 default:
IanBenzMaxim 0:f77ad7f72d04 552 return defaultErrorMessage(condition);
IanBenzMaxim 0:f77ad7f72d04 553 }
IanBenzMaxim 0:f77ad7f72d04 554 }
IanBenzMaxim 0:f77ad7f72d04 555 } instance;
IanBenzMaxim 0:f77ad7f72d04 556 return instance;
IanBenzMaxim 0:f77ad7f72d04 557 }
IanBenzMaxim 0:f77ad7f72d04 558
IanBenzMaxim 0:f77ad7f72d04 559 } // namespace MaximInterface