Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
IanBenzMaxim
Date:
Mon Nov 06 14:39:18 2017 -0600
Revision:
0:f77ad7f72d04
Initial commit.

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 <stdexcept>
IanBenzMaxim 0:f77ad7f72d04 34 #include <msclr/auto_gcroot.h>
IanBenzMaxim 0:f77ad7f72d04 35 #include <msclr/marshal_cppstd.h>
IanBenzMaxim 0:f77ad7f72d04 36 #include <MaximInterface/Utilities/Error.hpp>
IanBenzMaxim 0:f77ad7f72d04 37 #include "ChangeSizeType.hpp"
IanBenzMaxim 0:f77ad7f72d04 38 #include "OneWireLinkLayerMaster.hpp"
IanBenzMaxim 0:f77ad7f72d04 39
IanBenzMaxim 0:f77ad7f72d04 40 using DalSemi::OneWire::Adapter::AdapterException;
IanBenzMaxim 0:f77ad7f72d04 41 using System::IntPtr;
IanBenzMaxim 0:f77ad7f72d04 42 using System::Runtime::InteropServices::Marshal;
IanBenzMaxim 0:f77ad7f72d04 43 using System::String;
IanBenzMaxim 0:f77ad7f72d04 44 using msclr::interop::marshal_as;
IanBenzMaxim 0:f77ad7f72d04 45 using std::string;
IanBenzMaxim 0:f77ad7f72d04 46
IanBenzMaxim 0:f77ad7f72d04 47 namespace MaximInterface {
IanBenzMaxim 0:f77ad7f72d04 48
IanBenzMaxim 0:f77ad7f72d04 49 struct OneWireLinkLayerMaster::Data {
IanBenzMaxim 0:f77ad7f72d04 50 msclr::auto_gcroot<DalSemi::OneWire::Adapter::PortAdapter ^> adapter;
IanBenzMaxim 0:f77ad7f72d04 51 bool connected = false;
IanBenzMaxim 0:f77ad7f72d04 52 };
IanBenzMaxim 0:f77ad7f72d04 53
IanBenzMaxim 0:f77ad7f72d04 54 OneWireLinkLayerMaster::OneWireLinkLayerMaster(const string & adapterName)
IanBenzMaxim 0:f77ad7f72d04 55 : data(std::make_unique<Data>()) {
IanBenzMaxim 0:f77ad7f72d04 56 try {
IanBenzMaxim 0:f77ad7f72d04 57 data->adapter = DalSemi::OneWire::AccessProvider::GetAdapter(
IanBenzMaxim 0:f77ad7f72d04 58 marshal_as<String ^>(adapterName));
IanBenzMaxim 0:f77ad7f72d04 59 } catch (AdapterException ^ e) {
IanBenzMaxim 0:f77ad7f72d04 60 throw std::invalid_argument(marshal_as<string>(e->Message));
IanBenzMaxim 0:f77ad7f72d04 61 }
IanBenzMaxim 0:f77ad7f72d04 62 }
IanBenzMaxim 0:f77ad7f72d04 63
IanBenzMaxim 0:f77ad7f72d04 64 OneWireLinkLayerMaster::~OneWireLinkLayerMaster() = default;
IanBenzMaxim 0:f77ad7f72d04 65
IanBenzMaxim 0:f77ad7f72d04 66 OneWireLinkLayerMaster::OneWireLinkLayerMaster(
IanBenzMaxim 0:f77ad7f72d04 67 OneWireLinkLayerMaster && rhs) noexcept = default;
IanBenzMaxim 0:f77ad7f72d04 68
IanBenzMaxim 0:f77ad7f72d04 69 OneWireLinkLayerMaster & OneWireLinkLayerMaster::
IanBenzMaxim 0:f77ad7f72d04 70 operator=(OneWireLinkLayerMaster && rhs) noexcept = default;
IanBenzMaxim 0:f77ad7f72d04 71
IanBenzMaxim 0:f77ad7f72d04 72 error_code OneWireLinkLayerMaster::connect(const string & portName) {
IanBenzMaxim 0:f77ad7f72d04 73 if (connected()) {
IanBenzMaxim 0:f77ad7f72d04 74 return make_error_code(AlreadyConnectedError);
IanBenzMaxim 0:f77ad7f72d04 75 }
IanBenzMaxim 0:f77ad7f72d04 76
IanBenzMaxim 0:f77ad7f72d04 77 error_code result;
IanBenzMaxim 0:f77ad7f72d04 78 try {
IanBenzMaxim 0:f77ad7f72d04 79 auto adapterResult =
IanBenzMaxim 0:f77ad7f72d04 80 data->adapter->OpenPort(marshal_as<String ^>(portName));
IanBenzMaxim 0:f77ad7f72d04 81 if (adapterResult) {
IanBenzMaxim 0:f77ad7f72d04 82 adapterResult = data->adapter->BeginExclusive(true);
IanBenzMaxim 0:f77ad7f72d04 83 if (adapterResult) {
IanBenzMaxim 0:f77ad7f72d04 84 data->connected = true;
IanBenzMaxim 0:f77ad7f72d04 85 } else {
IanBenzMaxim 0:f77ad7f72d04 86 data->adapter->FreePort();
IanBenzMaxim 0:f77ad7f72d04 87 result = make_error_code(OpenPortError);
IanBenzMaxim 0:f77ad7f72d04 88 }
IanBenzMaxim 0:f77ad7f72d04 89 } else {
IanBenzMaxim 0:f77ad7f72d04 90 result = make_error_code(OpenPortError);
IanBenzMaxim 0:f77ad7f72d04 91 }
IanBenzMaxim 0:f77ad7f72d04 92 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 93 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 94 }
IanBenzMaxim 0:f77ad7f72d04 95 return result;
IanBenzMaxim 0:f77ad7f72d04 96 }
IanBenzMaxim 0:f77ad7f72d04 97
IanBenzMaxim 0:f77ad7f72d04 98 void OneWireLinkLayerMaster::disconnect() {
IanBenzMaxim 0:f77ad7f72d04 99 data->adapter->EndExclusive();
IanBenzMaxim 0:f77ad7f72d04 100 data->adapter->FreePort();
IanBenzMaxim 0:f77ad7f72d04 101 data->connected = false;
IanBenzMaxim 0:f77ad7f72d04 102 }
IanBenzMaxim 0:f77ad7f72d04 103
IanBenzMaxim 0:f77ad7f72d04 104 bool OneWireLinkLayerMaster::connected() const { return data->connected; }
IanBenzMaxim 0:f77ad7f72d04 105
IanBenzMaxim 0:f77ad7f72d04 106 string OneWireLinkLayerMaster::adapterName() const {
IanBenzMaxim 0:f77ad7f72d04 107 return marshal_as<string>(data->adapter->AdapterName);
IanBenzMaxim 0:f77ad7f72d04 108 }
IanBenzMaxim 0:f77ad7f72d04 109
IanBenzMaxim 0:f77ad7f72d04 110 string OneWireLinkLayerMaster::portName() const {
IanBenzMaxim 0:f77ad7f72d04 111 return connected() ? marshal_as<string>(data->adapter->PortName) : "";
IanBenzMaxim 0:f77ad7f72d04 112 }
IanBenzMaxim 0:f77ad7f72d04 113
IanBenzMaxim 0:f77ad7f72d04 114 error_code OneWireLinkLayerMaster::reset() {
IanBenzMaxim 0:f77ad7f72d04 115 using DalSemi::OneWire::Adapter::OWResetResult;
IanBenzMaxim 0:f77ad7f72d04 116
IanBenzMaxim 0:f77ad7f72d04 117 error_code result;
IanBenzMaxim 0:f77ad7f72d04 118 try {
IanBenzMaxim 0:f77ad7f72d04 119 switch (data->adapter->Reset()) {
IanBenzMaxim 0:f77ad7f72d04 120 case OWResetResult::RESET_SHORT:
IanBenzMaxim 0:f77ad7f72d04 121 result = make_error_code(ShortDetectedError);
IanBenzMaxim 0:f77ad7f72d04 122 break;
IanBenzMaxim 0:f77ad7f72d04 123
IanBenzMaxim 0:f77ad7f72d04 124 case OWResetResult::RESET_NOPRESENCE:
IanBenzMaxim 0:f77ad7f72d04 125 result = make_error_code(NoSlaveError);
IanBenzMaxim 0:f77ad7f72d04 126 break;
IanBenzMaxim 0:f77ad7f72d04 127 }
IanBenzMaxim 0:f77ad7f72d04 128 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 129 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 130 }
IanBenzMaxim 0:f77ad7f72d04 131 return result;
IanBenzMaxim 0:f77ad7f72d04 132 }
IanBenzMaxim 0:f77ad7f72d04 133
IanBenzMaxim 0:f77ad7f72d04 134 error_code OneWireLinkLayerMaster::touchBitSetLevel(bool & sendRecvBit,
IanBenzMaxim 0:f77ad7f72d04 135 Level afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 136 error_code result;
IanBenzMaxim 0:f77ad7f72d04 137 try {
IanBenzMaxim 0:f77ad7f72d04 138 switch (afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 139 case StrongLevel: {
IanBenzMaxim 0:f77ad7f72d04 140 auto adapterResult = data->adapter->StartPowerDelivery(
IanBenzMaxim 0:f77ad7f72d04 141 DalSemi::OneWire::Adapter::OWPowerStart::CONDITION_AFTER_BIT);
IanBenzMaxim 0:f77ad7f72d04 142 if (!adapterResult) {
IanBenzMaxim 0:f77ad7f72d04 143 result = make_error_code(PowerDeliveryError);
IanBenzMaxim 0:f77ad7f72d04 144 }
IanBenzMaxim 0:f77ad7f72d04 145 } break;
IanBenzMaxim 0:f77ad7f72d04 146
IanBenzMaxim 0:f77ad7f72d04 147 case NormalLevel:
IanBenzMaxim 0:f77ad7f72d04 148 break;
IanBenzMaxim 0:f77ad7f72d04 149
IanBenzMaxim 0:f77ad7f72d04 150 default:
IanBenzMaxim 0:f77ad7f72d04 151 result = make_error_code(InvalidLevelError);
IanBenzMaxim 0:f77ad7f72d04 152 break;
IanBenzMaxim 0:f77ad7f72d04 153 }
IanBenzMaxim 0:f77ad7f72d04 154 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 155 if (sendRecvBit) {
IanBenzMaxim 0:f77ad7f72d04 156 sendRecvBit = data->adapter->GetBit();
IanBenzMaxim 0:f77ad7f72d04 157 } else {
IanBenzMaxim 0:f77ad7f72d04 158 data->adapter->PutBit(0);
IanBenzMaxim 0:f77ad7f72d04 159 }
IanBenzMaxim 0:f77ad7f72d04 160 }
IanBenzMaxim 0:f77ad7f72d04 161 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 162 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 163 }
IanBenzMaxim 0:f77ad7f72d04 164 return result;
IanBenzMaxim 0:f77ad7f72d04 165 }
IanBenzMaxim 0:f77ad7f72d04 166
IanBenzMaxim 0:f77ad7f72d04 167 error_code OneWireLinkLayerMaster::writeByteSetLevel(uint_least8_t sendByte,
IanBenzMaxim 0:f77ad7f72d04 168 Level afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 169 error_code result;
IanBenzMaxim 0:f77ad7f72d04 170 try {
IanBenzMaxim 0:f77ad7f72d04 171 switch (afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 172 case StrongLevel: {
IanBenzMaxim 0:f77ad7f72d04 173 auto adapterResult = data->adapter->StartPowerDelivery(
IanBenzMaxim 0:f77ad7f72d04 174 DalSemi::OneWire::Adapter::OWPowerStart::CONDITION_AFTER_BYTE);
IanBenzMaxim 0:f77ad7f72d04 175 if (!adapterResult) {
IanBenzMaxim 0:f77ad7f72d04 176 result = make_error_code(PowerDeliveryError);
IanBenzMaxim 0:f77ad7f72d04 177 }
IanBenzMaxim 0:f77ad7f72d04 178 } break;
IanBenzMaxim 0:f77ad7f72d04 179
IanBenzMaxim 0:f77ad7f72d04 180 case NormalLevel:
IanBenzMaxim 0:f77ad7f72d04 181 break;
IanBenzMaxim 0:f77ad7f72d04 182
IanBenzMaxim 0:f77ad7f72d04 183 default:
IanBenzMaxim 0:f77ad7f72d04 184 result = make_error_code(InvalidLevelError);
IanBenzMaxim 0:f77ad7f72d04 185 break;
IanBenzMaxim 0:f77ad7f72d04 186 }
IanBenzMaxim 0:f77ad7f72d04 187 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 188 data->adapter->PutByte(sendByte);
IanBenzMaxim 0:f77ad7f72d04 189 }
IanBenzMaxim 0:f77ad7f72d04 190 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 191 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 192 }
IanBenzMaxim 0:f77ad7f72d04 193 return result;
IanBenzMaxim 0:f77ad7f72d04 194 }
IanBenzMaxim 0:f77ad7f72d04 195
IanBenzMaxim 0:f77ad7f72d04 196 error_code OneWireLinkLayerMaster::readByteSetLevel(uint_least8_t & recvByte,
IanBenzMaxim 0:f77ad7f72d04 197 Level afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 198 error_code result;
IanBenzMaxim 0:f77ad7f72d04 199 try {
IanBenzMaxim 0:f77ad7f72d04 200 switch (afterLevel) {
IanBenzMaxim 0:f77ad7f72d04 201 case StrongLevel: {
IanBenzMaxim 0:f77ad7f72d04 202 auto adapterResult = data->adapter->StartPowerDelivery(
IanBenzMaxim 0:f77ad7f72d04 203 DalSemi::OneWire::Adapter::OWPowerStart::CONDITION_AFTER_BYTE);
IanBenzMaxim 0:f77ad7f72d04 204 if (!adapterResult) {
IanBenzMaxim 0:f77ad7f72d04 205 result = make_error_code(PowerDeliveryError);
IanBenzMaxim 0:f77ad7f72d04 206 }
IanBenzMaxim 0:f77ad7f72d04 207 } break;
IanBenzMaxim 0:f77ad7f72d04 208
IanBenzMaxim 0:f77ad7f72d04 209 case NormalLevel:
IanBenzMaxim 0:f77ad7f72d04 210 break;
IanBenzMaxim 0:f77ad7f72d04 211
IanBenzMaxim 0:f77ad7f72d04 212 default:
IanBenzMaxim 0:f77ad7f72d04 213 result = make_error_code(InvalidLevelError);
IanBenzMaxim 0:f77ad7f72d04 214 break;
IanBenzMaxim 0:f77ad7f72d04 215 }
IanBenzMaxim 0:f77ad7f72d04 216 if (!result) {
IanBenzMaxim 0:f77ad7f72d04 217 recvByte = data->adapter->GetByte();
IanBenzMaxim 0:f77ad7f72d04 218 }
IanBenzMaxim 0:f77ad7f72d04 219 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 220 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 221 }
IanBenzMaxim 0:f77ad7f72d04 222 return result;
IanBenzMaxim 0:f77ad7f72d04 223 }
IanBenzMaxim 0:f77ad7f72d04 224
IanBenzMaxim 0:f77ad7f72d04 225 error_code OneWireLinkLayerMaster::writeBlock(const uint_least8_t * sendBuf,
IanBenzMaxim 0:f77ad7f72d04 226 size_t sendLen) {
IanBenzMaxim 0:f77ad7f72d04 227 error_code result;
IanBenzMaxim 0:f77ad7f72d04 228 try {
IanBenzMaxim 0:f77ad7f72d04 229 changeSizeType<int>(
IanBenzMaxim 0:f77ad7f72d04 230 [this](const uint_least8_t * data, int dataSize) {
IanBenzMaxim 0:f77ad7f72d04 231 auto dataManaged = gcnew array<uint_least8_t>(dataSize);
IanBenzMaxim 0:f77ad7f72d04 232 Marshal::Copy(static_cast<IntPtr>(const_cast<uint_least8_t *>(data)),
IanBenzMaxim 0:f77ad7f72d04 233 dataManaged, 0, dataSize);
IanBenzMaxim 0:f77ad7f72d04 234 this->data->adapter->DataBlock(dataManaged, 0, dataSize);
IanBenzMaxim 0:f77ad7f72d04 235 },
IanBenzMaxim 0:f77ad7f72d04 236 sendBuf, sendLen);
IanBenzMaxim 0:f77ad7f72d04 237 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 238 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 239 }
IanBenzMaxim 0:f77ad7f72d04 240 return result;
IanBenzMaxim 0:f77ad7f72d04 241 }
IanBenzMaxim 0:f77ad7f72d04 242
IanBenzMaxim 0:f77ad7f72d04 243 error_code OneWireLinkLayerMaster::readBlock(uint_least8_t * recvBuf,
IanBenzMaxim 0:f77ad7f72d04 244 size_t recvLen) {
IanBenzMaxim 0:f77ad7f72d04 245 error_code result;
IanBenzMaxim 0:f77ad7f72d04 246 try {
IanBenzMaxim 0:f77ad7f72d04 247 changeSizeType<int>(
IanBenzMaxim 0:f77ad7f72d04 248 [this](uint_least8_t * data, int dataSize) {
IanBenzMaxim 0:f77ad7f72d04 249 auto dataManaged = gcnew array<uint_least8_t>(dataSize);
IanBenzMaxim 0:f77ad7f72d04 250 this->data->adapter->GetBlock(dataManaged, dataSize);
IanBenzMaxim 0:f77ad7f72d04 251 Marshal::Copy(dataManaged, 0, static_cast<IntPtr>(data), dataSize);
IanBenzMaxim 0:f77ad7f72d04 252 },
IanBenzMaxim 0:f77ad7f72d04 253 recvBuf, recvLen);
IanBenzMaxim 0:f77ad7f72d04 254 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 255 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 256 }
IanBenzMaxim 0:f77ad7f72d04 257 return result;
IanBenzMaxim 0:f77ad7f72d04 258 }
IanBenzMaxim 0:f77ad7f72d04 259
IanBenzMaxim 0:f77ad7f72d04 260 error_code OneWireLinkLayerMaster::setSpeed(Speed newSpeed) {
IanBenzMaxim 0:f77ad7f72d04 261 using DalSemi::OneWire::Adapter::OWSpeed;
IanBenzMaxim 0:f77ad7f72d04 262
IanBenzMaxim 0:f77ad7f72d04 263 error_code result;
IanBenzMaxim 0:f77ad7f72d04 264 try {
IanBenzMaxim 0:f77ad7f72d04 265 switch (newSpeed) {
IanBenzMaxim 0:f77ad7f72d04 266 case OverdriveSpeed:
IanBenzMaxim 0:f77ad7f72d04 267 data->adapter->Speed = OWSpeed::SPEED_OVERDRIVE;
IanBenzMaxim 0:f77ad7f72d04 268 break;
IanBenzMaxim 0:f77ad7f72d04 269
IanBenzMaxim 0:f77ad7f72d04 270 case StandardSpeed:
IanBenzMaxim 0:f77ad7f72d04 271 data->adapter->Speed = OWSpeed::SPEED_REGULAR;
IanBenzMaxim 0:f77ad7f72d04 272 break;
IanBenzMaxim 0:f77ad7f72d04 273
IanBenzMaxim 0:f77ad7f72d04 274 default:
IanBenzMaxim 0:f77ad7f72d04 275 result = make_error_code(InvalidSpeedError);
IanBenzMaxim 0:f77ad7f72d04 276 break;
IanBenzMaxim 0:f77ad7f72d04 277 }
IanBenzMaxim 0:f77ad7f72d04 278 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 279 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 280 }
IanBenzMaxim 0:f77ad7f72d04 281 return result;
IanBenzMaxim 0:f77ad7f72d04 282 }
IanBenzMaxim 0:f77ad7f72d04 283
IanBenzMaxim 0:f77ad7f72d04 284 error_code OneWireLinkLayerMaster::setLevel(Level newLevel) {
IanBenzMaxim 0:f77ad7f72d04 285 error_code result;
IanBenzMaxim 0:f77ad7f72d04 286 try {
IanBenzMaxim 0:f77ad7f72d04 287 switch (newLevel) {
IanBenzMaxim 0:f77ad7f72d04 288 case StrongLevel: {
IanBenzMaxim 0:f77ad7f72d04 289 auto setResult = data->adapter->StartPowerDelivery(
IanBenzMaxim 0:f77ad7f72d04 290 DalSemi::OneWire::Adapter::OWPowerStart::CONDITION_NOW);
IanBenzMaxim 0:f77ad7f72d04 291 if (!setResult) {
IanBenzMaxim 0:f77ad7f72d04 292 result = make_error_code(PowerDeliveryError);
IanBenzMaxim 0:f77ad7f72d04 293 }
IanBenzMaxim 0:f77ad7f72d04 294 } break;
IanBenzMaxim 0:f77ad7f72d04 295
IanBenzMaxim 0:f77ad7f72d04 296 case NormalLevel:
IanBenzMaxim 0:f77ad7f72d04 297 data->adapter->SetPowerNormal();
IanBenzMaxim 0:f77ad7f72d04 298 break;
IanBenzMaxim 0:f77ad7f72d04 299
IanBenzMaxim 0:f77ad7f72d04 300 default:
IanBenzMaxim 0:f77ad7f72d04 301 result = make_error_code(InvalidLevelError);
IanBenzMaxim 0:f77ad7f72d04 302 break;
IanBenzMaxim 0:f77ad7f72d04 303 }
IanBenzMaxim 0:f77ad7f72d04 304 } catch (AdapterException ^) {
IanBenzMaxim 0:f77ad7f72d04 305 result = make_error_code(CommunicationError);
IanBenzMaxim 0:f77ad7f72d04 306 }
IanBenzMaxim 0:f77ad7f72d04 307 return result;
IanBenzMaxim 0:f77ad7f72d04 308 }
IanBenzMaxim 0:f77ad7f72d04 309
IanBenzMaxim 0:f77ad7f72d04 310 const error_category & OneWireLinkLayerMaster::errorCategory() {
IanBenzMaxim 0:f77ad7f72d04 311 static class : public error_category {
IanBenzMaxim 0:f77ad7f72d04 312 public:
IanBenzMaxim 0:f77ad7f72d04 313 virtual const char * name() const { return "OneWireLinkLayerMaster"; }
IanBenzMaxim 0:f77ad7f72d04 314
IanBenzMaxim 0:f77ad7f72d04 315 virtual string message(int condition) const {
IanBenzMaxim 0:f77ad7f72d04 316 switch (condition) {
IanBenzMaxim 0:f77ad7f72d04 317 case CommunicationError:
IanBenzMaxim 0:f77ad7f72d04 318 return "Communication Error";
IanBenzMaxim 0:f77ad7f72d04 319
IanBenzMaxim 0:f77ad7f72d04 320 case OpenPortError:
IanBenzMaxim 0:f77ad7f72d04 321 return "Open Port Error";
IanBenzMaxim 0:f77ad7f72d04 322
IanBenzMaxim 0:f77ad7f72d04 323 case PowerDeliveryError:
IanBenzMaxim 0:f77ad7f72d04 324 return "Power Delivery Error";
IanBenzMaxim 0:f77ad7f72d04 325
IanBenzMaxim 0:f77ad7f72d04 326 case AlreadyConnectedError:
IanBenzMaxim 0:f77ad7f72d04 327 return "Already Connected Error";
IanBenzMaxim 0:f77ad7f72d04 328
IanBenzMaxim 0:f77ad7f72d04 329 default:
IanBenzMaxim 0:f77ad7f72d04 330 return defaultErrorMessage(condition);
IanBenzMaxim 0:f77ad7f72d04 331 }
IanBenzMaxim 0:f77ad7f72d04 332 }
IanBenzMaxim 0:f77ad7f72d04 333 } instance;
IanBenzMaxim 0:f77ad7f72d04 334 return instance;
IanBenzMaxim 0:f77ad7f72d04 335 }
IanBenzMaxim 0:f77ad7f72d04 336
IanBenzMaxim 0:f77ad7f72d04 337 } // namespace MaximInterface