Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
j3
Date:
Fri Jun 03 22:15:59 2016 +0000
Revision:
81:e2a3ad98874e
Parent:
80:83b0d879cc32
DS1920 convertTemperature updates float passed by ref now

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 80:83b0d879cc32 1 /******************************************************************//**
j3 80:83b0d879cc32 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 80:83b0d879cc32 3 *
j3 80:83b0d879cc32 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 80:83b0d879cc32 5 * copy of this software and associated documentation files (the "Software"),
j3 80:83b0d879cc32 6 * to deal in the Software without restriction, including without limitation
j3 80:83b0d879cc32 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 80:83b0d879cc32 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 80:83b0d879cc32 9 * Software is furnished to do so, subject to the following conditions:
j3 80:83b0d879cc32 10 *
j3 80:83b0d879cc32 11 * The above copyright notice and this permission notice shall be included
j3 80:83b0d879cc32 12 * in all copies or substantial portions of the Software.
j3 80:83b0d879cc32 13 *
j3 80:83b0d879cc32 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 80:83b0d879cc32 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 80:83b0d879cc32 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 80:83b0d879cc32 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 80:83b0d879cc32 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 80:83b0d879cc32 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 80:83b0d879cc32 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 80:83b0d879cc32 21 *
j3 80:83b0d879cc32 22 * Except as contained in this notice, the name of Maxim Integrated
j3 80:83b0d879cc32 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 80:83b0d879cc32 24 * Products, Inc. Branding Policy.
j3 80:83b0d879cc32 25 *
j3 80:83b0d879cc32 26 * The mere transfer of this software does not imply any licenses
j3 80:83b0d879cc32 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 80:83b0d879cc32 28 * trademarks, maskwork rights, or any other form of intellectual
j3 80:83b0d879cc32 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 80:83b0d879cc32 30 * ownership rights.
j3 80:83b0d879cc32 31 **********************************************************************/
j3 80:83b0d879cc32 32
j3 80:83b0d879cc32 33
j3 80:83b0d879cc32 34 #include "DS1920.h"
j3 80:83b0d879cc32 35
j3 80:83b0d879cc32 36
j3 80:83b0d879cc32 37 using namespace OneWire;
j3 80:83b0d879cc32 38 using namespace OneWire::crc;
j3 80:83b0d879cc32 39
j3 80:83b0d879cc32 40
j3 80:83b0d879cc32 41 enum DS1920_CMDS
j3 80:83b0d879cc32 42 {
j3 80:83b0d879cc32 43 WRITE_SCRATCHPAD = 0x4E,
j3 80:83b0d879cc32 44 READ_SCRATCHPAD = 0xBE,
j3 80:83b0d879cc32 45 COPY_SCRATCHPAD = 0x48,
j3 80:83b0d879cc32 46 CONV_TEMPERATURE = 0x44,
j3 80:83b0d879cc32 47 RECALL = 0xB8
j3 80:83b0d879cc32 48 };
j3 80:83b0d879cc32 49
j3 80:83b0d879cc32 50
j3 80:83b0d879cc32 51 /**********************************************************************/
j3 81:e2a3ad98874e 52 DS1920::DS1920(RandomAccessRomIterator &selector):OneWireSlave(selector)
j3 80:83b0d879cc32 53 {
j3 80:83b0d879cc32 54 }
j3 80:83b0d879cc32 55
j3 80:83b0d879cc32 56
j3 80:83b0d879cc32 57 /**********************************************************************/
j3 80:83b0d879cc32 58 DS1920::CmdResult DS1920::writeScratchPad(uint8_t th, uint8_t tl)
j3 80:83b0d879cc32 59 {
j3 80:83b0d879cc32 60 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 61
j3 80:83b0d879cc32 62 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 63
j3 80:83b0d879cc32 64 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 65 {
j3 80:83b0d879cc32 66 uint8_t sendBlock[] = {WRITE_SCRATCHPAD, th, tl};
j3 80:83b0d879cc32 67
j3 80:83b0d879cc32 68 owmResult = master().OWWriteBlock(sendBlock, 3);
j3 80:83b0d879cc32 69 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 70 {
j3 80:83b0d879cc32 71 deviceResult = DS1920::Success;
j3 80:83b0d879cc32 72 }
j3 80:83b0d879cc32 73 else
j3 80:83b0d879cc32 74 {
j3 80:83b0d879cc32 75 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 76 }
j3 80:83b0d879cc32 77 }
j3 80:83b0d879cc32 78
j3 80:83b0d879cc32 79 return deviceResult;
j3 80:83b0d879cc32 80 }
j3 80:83b0d879cc32 81
j3 80:83b0d879cc32 82
j3 80:83b0d879cc32 83 /**********************************************************************/
j3 80:83b0d879cc32 84 DS1920::CmdResult DS1920::readScratchPad(uint8_t * scratchPadBuff)
j3 80:83b0d879cc32 85 {
j3 80:83b0d879cc32 86 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 87
j3 80:83b0d879cc32 88 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 89
j3 80:83b0d879cc32 90 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 91 {
j3 80:83b0d879cc32 92 uint8_t cmd = READ_SCRATCHPAD;
j3 80:83b0d879cc32 93
j3 80:83b0d879cc32 94 owmResult = master().OWWriteBlock(&cmd, 1);
j3 80:83b0d879cc32 95 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 96 {
j3 80:83b0d879cc32 97 uint8_t rxBlock[9];
j3 80:83b0d879cc32 98 owmResult = master().OWReadBlock(rxBlock, 9);
j3 80:83b0d879cc32 99
j3 80:83b0d879cc32 100 uint8_t crcCheck = calculateCrc8(rxBlock, 8);
j3 80:83b0d879cc32 101 if ((owmResult == OneWireMaster::Success) && (crcCheck == rxBlock[8]))
j3 80:83b0d879cc32 102 {
j3 80:83b0d879cc32 103 std::memcpy(scratchPadBuff, rxBlock, 8);
j3 80:83b0d879cc32 104 deviceResult = DS1920::Success;
j3 80:83b0d879cc32 105 }
j3 80:83b0d879cc32 106 else
j3 80:83b0d879cc32 107 {
j3 80:83b0d879cc32 108 deviceResult = DS1920::CommsReadError;
j3 80:83b0d879cc32 109 }
j3 80:83b0d879cc32 110 }
j3 80:83b0d879cc32 111 else
j3 80:83b0d879cc32 112 {
j3 80:83b0d879cc32 113 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 114 }
j3 80:83b0d879cc32 115 }
j3 80:83b0d879cc32 116
j3 80:83b0d879cc32 117 return deviceResult;
j3 80:83b0d879cc32 118 }
j3 80:83b0d879cc32 119
j3 80:83b0d879cc32 120 /**********************************************************************/
j3 80:83b0d879cc32 121 DS1920::CmdResult DS1920::copyScratchPad( void )
j3 80:83b0d879cc32 122 {
j3 80:83b0d879cc32 123 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 124
j3 80:83b0d879cc32 125 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 126
j3 80:83b0d879cc32 127 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 128 {
j3 80:83b0d879cc32 129 owmResult = master().OWWriteByteSetLevel(COPY_SCRATCHPAD, OneWireMaster::StrongLevel);
j3 80:83b0d879cc32 130 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 131 {
j3 80:83b0d879cc32 132 wait_ms(10);
j3 80:83b0d879cc32 133
j3 80:83b0d879cc32 134 owmResult = master().OWSetLevel(OneWireMaster::NormalLevel);
j3 80:83b0d879cc32 135 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 136 {
j3 80:83b0d879cc32 137 deviceResult = DS1920::Success;
j3 80:83b0d879cc32 138 }
j3 80:83b0d879cc32 139 }
j3 80:83b0d879cc32 140 else
j3 80:83b0d879cc32 141 {
j3 80:83b0d879cc32 142 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 143 }
j3 80:83b0d879cc32 144 }
j3 80:83b0d879cc32 145
j3 80:83b0d879cc32 146 return deviceResult;
j3 80:83b0d879cc32 147 }
j3 80:83b0d879cc32 148
j3 80:83b0d879cc32 149 /**********************************************************************/
j3 81:e2a3ad98874e 150 DS1920::CmdResult DS1920::convertTemperature(float & temp)
j3 80:83b0d879cc32 151 {
j3 80:83b0d879cc32 152 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 153
j3 80:83b0d879cc32 154 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 155
j3 80:83b0d879cc32 156 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 157 {
j3 80:83b0d879cc32 158 owmResult = master().OWWriteByteSetLevel(CONV_TEMPERATURE, OneWireMaster::StrongLevel);
j3 80:83b0d879cc32 159 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 160 {
j3 80:83b0d879cc32 161 wait_ms(750);
j3 80:83b0d879cc32 162
j3 80:83b0d879cc32 163 owmResult = master().OWSetLevel(OneWireMaster::NormalLevel);
j3 80:83b0d879cc32 164 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 165 {
j3 81:e2a3ad98874e 166 uint8_t scratchPadBuff[8];
j3 81:e2a3ad98874e 167 deviceResult = this->readScratchPad(scratchPadBuff);
j3 81:e2a3ad98874e 168 if(deviceResult == DS1920::Success)
j3 81:e2a3ad98874e 169 {
j3 81:e2a3ad98874e 170 if(scratchPadBuff[0] & 1)
j3 81:e2a3ad98874e 171 {
j3 81:e2a3ad98874e 172 temp = (((float) (scratchPadBuff[0] >> 1)) + 0.5F);
j3 81:e2a3ad98874e 173 }
j3 81:e2a3ad98874e 174 else
j3 81:e2a3ad98874e 175 {
j3 81:e2a3ad98874e 176 temp = ((float) (scratchPadBuff[0] >> 1));
j3 81:e2a3ad98874e 177 }
j3 81:e2a3ad98874e 178
j3 81:e2a3ad98874e 179 if(scratchPadBuff[1])
j3 81:e2a3ad98874e 180 {
j3 81:e2a3ad98874e 181 temp = (temp * -1.0F);
j3 81:e2a3ad98874e 182 }
j3 81:e2a3ad98874e 183 }
j3 80:83b0d879cc32 184 }
j3 80:83b0d879cc32 185 }
j3 80:83b0d879cc32 186 else
j3 80:83b0d879cc32 187 {
j3 80:83b0d879cc32 188 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 189 }
j3 80:83b0d879cc32 190 }
j3 80:83b0d879cc32 191
j3 80:83b0d879cc32 192 return deviceResult;
j3 80:83b0d879cc32 193 }
j3 80:83b0d879cc32 194
j3 80:83b0d879cc32 195
j3 80:83b0d879cc32 196 /**********************************************************************/
j3 80:83b0d879cc32 197 DS1920::CmdResult DS1920::recallEEPROM( void )
j3 80:83b0d879cc32 198 {
j3 80:83b0d879cc32 199 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 200
j3 80:83b0d879cc32 201 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 202
j3 80:83b0d879cc32 203 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 204 {
j3 80:83b0d879cc32 205 uint8_t cmd = RECALL;
j3 80:83b0d879cc32 206
j3 80:83b0d879cc32 207 owmResult = master().OWWriteBlock(&cmd, 1);
j3 80:83b0d879cc32 208 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 209 {
j3 80:83b0d879cc32 210 deviceResult = DS1920::Success;
j3 80:83b0d879cc32 211 }
j3 80:83b0d879cc32 212 else
j3 80:83b0d879cc32 213 {
j3 80:83b0d879cc32 214 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 215 }
j3 80:83b0d879cc32 216 }
j3 80:83b0d879cc32 217
j3 80:83b0d879cc32 218 return deviceResult;
j3 80:83b0d879cc32 219 }