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
Diff: MaximInterfaceCore/RunCommand.cpp
- Revision:
- 8:5ea891c7d1a1
- Parent:
- 7:9cd16581b578
- Child:
- 10:947d3f44e0a0
diff -r 9cd16581b578 -r 5ea891c7d1a1 MaximInterfaceCore/RunCommand.cpp --- a/MaximInterfaceCore/RunCommand.cpp Mon Jul 22 11:44:07 2019 -0500 +++ b/MaximInterfaceCore/RunCommand.cpp Mon Sep 16 11:13:37 2019 -0500 @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved. +* Copyright (C) Maxim Integrated Products, Inc., All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -30,7 +30,7 @@ * ownership rights. *******************************************************************************/ -#include "crc.hpp" +#include "Crc.hpp" #include "Error.hpp" #include "I2CMaster.hpp" #include "OneWireMaster.hpp" @@ -58,37 +58,37 @@ return instance; } -error_code RunCommandWithOneWireMaster:: +Result<span<uint_least8_t> > RunCommandWithOneWireMaster:: operator()(span<const uint_least8_t> request, int delayTime, - span<uint_least8_t> & response) const { + span<uint_least8_t> response) const { // Write request. - error_code result = selectRom(*master); - if (result) { - return result; + Result<void> result = selectRom(*master); + if (!result) { + return result.error(); } uint_least8_t xpcBuffer[2] = {0x66, static_cast<uint_least8_t>(request.size())}; result = master->writeBlock(xpcBuffer); - if (result) { - return result; + if (!result) { + return result.error(); } result = master->writeBlock(request); - if (result) { - return result; + if (!result) { + return result.error(); } uint_fast16_t expectedCrc = calculateCrc16(calculateCrc16(xpcBuffer), request) ^ 0xFFFFu; result = master->readBlock(xpcBuffer); - if (result) { - return result; + if (!result) { + return result.error(); } if (expectedCrc != ((static_cast<uint_fast16_t>(xpcBuffer[1]) << 8) | xpcBuffer[0])) { - return make_error_code(CrcError); + return CrcError; } result = master->writeBytePower(0xAA); - if (result) { - return result; + if (!result) { + return result.error(); } // Wait for device to process. @@ -96,33 +96,33 @@ // Read response. result = master->setLevel(OneWireMaster::NormalLevel); - if (result) { - return result; + if (!result) { + return result.error(); } result = master->readBlock(xpcBuffer); - if (result) { - return result; + if (!result) { + return result.error(); } if (xpcBuffer[1] > response.size()) { - return make_error_code(InvalidResponseError); + return InvalidResponseError; } response = response.first(xpcBuffer[1]); result = master->readBlock(response); - if (result) { - return result; + if (!result) { + return result.error(); } expectedCrc = calculateCrc16(calculateCrc16(make_span(xpcBuffer + 1, 1)), response) ^ 0xFFFFu; result = master->readBlock(xpcBuffer); - if (result) { - return result; + if (!result) { + return result.error(); } if (expectedCrc != ((static_cast<uint_fast16_t>(xpcBuffer[1]) << 8) | xpcBuffer[0])) { - return make_error_code(CrcError); + return CrcError; } - return result; + return response; } const error_category & RunCommandWithI2CMaster::errorCategory() { @@ -141,41 +141,42 @@ return instance; } -error_code RunCommandWithI2CMaster:: +Result<span<uint_least8_t> > RunCommandWithI2CMaster:: operator()(span<const uint_least8_t> request, int delayTime, - span<uint_least8_t> & response) const { + span<uint_least8_t> response) const { // Write request. - error_code result = master->start(address_); - if (result == make_error_condition(I2CMaster::NackError) && address_ != 0) { + Result<void> result = master->start(address_); + if (!result && result.error() == make_error_condition(I2CMaster::NackError) && + address_ != 0) { result = master->start(0); } - if (result) { + if (!result) { master->stop(); - return result; + return result.error(); } if (!request.empty()) { result = master->writeByte(request[0]); - if (result) { + if (!result) { master->stop(); - return result; + return result.error(); } request = request.subspan(1); if (!request.empty()) { result = master->writeByte(static_cast<uint_least8_t>(request.size())); - if (result) { + if (!result) { master->stop(); - return result; + return result.error(); } result = master->writeBlock(request); - if (result) { + if (!result) { master->stop(); - return result; + return result.error(); } } } result = master->stop(); - if (result) { - return result; + if (!result) { + return result.error(); } // Wait for device to process. @@ -183,28 +184,32 @@ // Read response. result = master->start(address_ | 1); - if (result) { + if (!result) { master->stop(); - return result; + return result.error(); } uint_least8_t length; - result = master->readByte(I2CMaster::Ack, length); - if (result) { + if (const Result<uint_least8_t> result = master->readByte(I2CMaster::Ack)) { + length = result.value(); + } else { master->stop(); - return result; + return result.error(); } if (length > response.size()) { master->stop(); - return make_error_code(InvalidResponseError); + return InvalidResponseError; } response = response.first(length); - result = master->readBlock(I2CMaster::Nack, response); - if (result) { + result = master->readBlock(response, I2CMaster::Nack); + if (!result) { master->stop(); - return result; + return result.error(); } result = master->stop(); - return result; + if (!result) { + return result.error(); + } + return response; } } // namespace MaximInterfaceCore