Extended MaximInterface
Dependents: mbed_DS28EC20_GPIO
Diff: Devices/DS18B20.cpp
- Revision:
- 6:a8c83a2e6fa4
- Parent:
- 0:f77ad7f72d04
--- a/Devices/DS18B20.cpp Fri Jan 19 10:25:02 2018 -0600 +++ b/Devices/DS18B20.cpp Wed Jan 23 13:11:04 2019 -0600 @@ -36,27 +36,22 @@ namespace MaximInterface { -enum DS18B20_CMDS { - WRITE_SCRATCHPAD = 0x4E, - READ_SCRATCHPAD = 0xBE, - COPY_SCRATCHPAD = 0x48, - CONV_TEMPERATURE = 0x44, - READ_POWER_SUPPY = 0xB4, - RECALL = 0xB8 -}; +const uint_least8_t DS18B20::nineBitResolution; +const uint_least8_t DS18B20::tenBitResolution; +const uint_least8_t DS18B20::elevenBitResolution; +const uint_least8_t DS18B20::twelveBitResolution; error_code DS18B20::initialize() { - Scratchpad scratchpad; + Scratchpad::array scratchpad; return readScratchpad(scratchpad); } error_code DS18B20::writeScratchpad(uint_least8_t th, uint_least8_t tl, - uint_least8_t res) { + uint_least8_t res) { error_code result = selectRom(*master); if (!result) { - const uint_least8_t sendBlock[] = {WRITE_SCRATCHPAD, th, tl, res}; - result = - master->writeBlock(sendBlock, sizeof(sendBlock) / sizeof(sendBlock[0])); + const uint_least8_t sendBlock[] = {0x4E, th, tl, res}; + result = master->writeBlock(sendBlock); if (!result) { resolution = res; } @@ -64,17 +59,16 @@ return result; } -error_code DS18B20::readScratchpad(Scratchpad & scratchpad) { +error_code DS18B20::readScratchpad(Scratchpad::span scratchpad) { error_code result = selectRom(*master); if (result) { return result; } - result = - master->writeByteSetLevel(READ_SCRATCHPAD, OneWireMaster::NormalLevel); + result = master->writeByte(0xBE); if (result) { return result; } - result = master->readBlock(scratchpad.data(), scratchpad.size()); + result = master->readBlock(scratchpad); if (result) { return result; } @@ -83,7 +77,7 @@ if (result) { return result; } - if (receivedCrc == calculateCrc8(scratchpad.data(), scratchpad.size())) { + if (receivedCrc == calculateCrc8(scratchpad)) { resolution = scratchpad[4]; } else { result = make_error_code(CrcError); @@ -91,21 +85,22 @@ return result; } -error_code DS18B20::readPowerSupply(bool & localPower) { +error_code DS18B20::readPowerSupply(bool & localPower) { error_code result = selectRom(*master); if (result) { return result; } - result = - master->writeByteSetLevel(READ_POWER_SUPPY, OneWireMaster::NormalLevel); + result = master->writeByte(0xB4); if (result) { return result; } - result = master->touchBitSetLevel(localPower, OneWireMaster::NormalLevel); + result = master->touchBit(localPower); return result; } error_code DS18B20::copyScratchpad() { + const uint_least8_t copyScratchpadCmd = 0x48; + bool hasLocalPower; error_code result = readPowerSupply(hasLocalPower); if (result) { @@ -116,17 +111,16 @@ return result; } if (hasLocalPower) { - result = - master->writeByteSetLevel(COPY_SCRATCHPAD, OneWireMaster::NormalLevel); + result = master->writeByte(copyScratchpadCmd); bool recvbit = 0; while (!recvbit && !result) { - result = master->touchBitSetLevel(recvbit, OneWireMaster::NormalLevel); + result = master->touchBit(recvbit); } } else { - result = - master->writeByteSetLevel(COPY_SCRATCHPAD, OneWireMaster::StrongLevel); + result = master->writeByteSetLevel(copyScratchpadCmd, + OneWireMaster::StrongLevel); if (!result) { - (*sleep)(10); + sleep->invoke(10); result = master->setLevel(OneWireMaster::NormalLevel); } } @@ -134,6 +128,8 @@ } error_code DS18B20::convertTemperature() { + const uint_least8_t convertTemperatureCmd = 0x44; + bool hasLocalPower; error_code result = readPowerSupply(hasLocalPower); if (result) { @@ -144,15 +140,14 @@ return result; } if (hasLocalPower) { - result = - master->writeByteSetLevel(CONV_TEMPERATURE, OneWireMaster::NormalLevel); + result = master->writeByte(convertTemperatureCmd); bool recvbit = 0; while (!result && !recvbit) { - result = master->touchBitSetLevel(recvbit, OneWireMaster::NormalLevel); + result = master->touchBit(recvbit); } } else { - result = - master->writeByteSetLevel(CONV_TEMPERATURE, OneWireMaster::StrongLevel); + result = master->writeByteSetLevel(convertTemperatureCmd, + OneWireMaster::StrongLevel); if (!result) { int sleepTime; switch (resolution) { @@ -173,17 +168,17 @@ sleepTime = 750; break; } - (*sleep)(sleepTime); + sleep->invoke(sleepTime); result = master->setLevel(OneWireMaster::NormalLevel); } } return result; } -error_code DS18B20::recallEeprom() { +error_code DS18B20::recallEeprom() { error_code result = selectRom(*master); if (!result) { - result = master->writeByte(RECALL); + result = master->writeByte(0xB8); } return result; } @@ -214,13 +209,13 @@ if (result) { return result; } - DS18B20::Scratchpad scratchpad; + DS18B20::Scratchpad::array scratchpad; result = ds18b20.readScratchpad(scratchpad); if (result) { return result; } - unsigned int tempData = + const unsigned int tempData = (static_cast<unsigned int>(scratchpad[1]) << 8) | scratchpad[0]; const unsigned int signMask = 0xF800; if ((tempData & signMask) == signMask) {