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: MaximInterfaceDevices/DS1920.cpp
- Revision:
- 8:5ea891c7d1a1
- Parent:
- 7:9cd16581b578
- Child:
- 11:3f3bf6bf5e6c
--- a/MaximInterfaceDevices/DS1920.cpp Mon Jul 22 11:44:07 2019 -0500 +++ b/MaximInterfaceDevices/DS1920.cpp Mon Sep 16 11:13:37 2019 -0500 @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (C) 2017 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"), @@ -38,38 +38,42 @@ using namespace Core; -error_code DS1920::writeScratchpad(uint_least8_t th, uint_least8_t tl) { - error_code result = selectRom(*master); - if (!result) { +Result<void> DS1920::writeScratchpad(uint_least8_t th, uint_least8_t tl) { + Result<void> result = selectRom(*master); + if (result) { const uint_least8_t sendBlock[] = {0x4E, th, tl}; result = master->writeBlock(sendBlock); } return result; } -error_code DS1920::readScratchpad(Scratchpad::span scratchpad) { - error_code result = selectRom(*master); +Result<DS1920::Scratchpad> DS1920::readScratchpad() const { + Result<void> result = selectRom(*master); + if (!result) { + return result.error(); + } + result = master->writeByte(0xBE); if (!result) { - result = master->writeByte(0xBE); - if (!result) { - result = master->readBlock(scratchpad); - if (!result) { - uint_least8_t receivedCrc; - result = master->readByte(receivedCrc); - if (!result && (receivedCrc != calculateCrc8(scratchpad))) { - result = make_error_code(CrcError); - } - } - } + return result.error(); + } + Scratchpad scratchpad; + result = master->readBlock(scratchpad); + if (!result) { + return result.error(); } - return result; + uint_least8_t receivedCrc; + MaximInterfaceCore_TRY_VALUE(receivedCrc, master->readByte()); + if (receivedCrc != calculateCrc8(scratchpad)) { + return CrcError; + } + return scratchpad; } -error_code DS1920::copyScratchpad() { - error_code result = selectRom(*master); - if (!result) { +Result<void> DS1920::copyScratchpad() { + Result<void> result = selectRom(*master); + if (result) { result = master->writeByteSetLevel(0x48, OneWireMaster::StrongLevel); - if (!result) { + if (result) { sleep->invoke(10); result = master->setLevel(OneWireMaster::NormalLevel); } @@ -77,11 +81,11 @@ return result; } -error_code DS1920::convertTemperature() { - error_code result = selectRom(*master); - if (!result) { +Result<void> DS1920::convertTemperature() { + Result<void> result = selectRom(*master); + if (result) { result = master->writeByteSetLevel(0x44, OneWireMaster::StrongLevel); - if (!result) { + if (result) { sleep->invoke(750); result = master->setLevel(OneWireMaster::NormalLevel); } @@ -89,9 +93,9 @@ return result; } -error_code DS1920::recallEeprom() { - error_code result = selectRom(*master); - if (!result) { +Result<void> DS1920::recallEeprom() { + Result<void> result = selectRom(*master); + if (result) { result = master->writeByte(0xB8); } return result; @@ -109,39 +113,32 @@ case DataError: return "Data Error"; - - default: - return defaultErrorMessage(condition); } + return defaultErrorMessage(condition); } } instance; return instance; } -error_code readTemperature(DS1920 & ds1920, int & temperature) { - error_code result = ds1920.convertTemperature(); - if (result) { - return result; - } - DS1920::Scratchpad::array scratchpad; - result = ds1920.readScratchpad(scratchpad); - if (result) { - return result; - } +Result<int> readTemperature(DS1920 & ds1920) { + MaximInterfaceCore_TRY(ds1920.convertTemperature()); + DS1920::Scratchpad scratchpad; + MaximInterfaceCore_TRY_VALUE(scratchpad, ds1920.readScratchpad()); unsigned int tempData = (static_cast<unsigned int>(scratchpad[1]) << 8) | scratchpad[0]; const unsigned int signMask = 0xFF00; + int temperature; if ((tempData & signMask) == signMask) { temperature = -0x100; tempData &= ~signMask; } else if ((tempData & signMask) == 0) { temperature = 0; } else { - return make_error_code(DS1920::DataError); + return DS1920::DataError; } temperature += static_cast<int>(tempData); - return error_code(); + return temperature; } } // namespace MaximInterfaceDevices