Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
j3
Date:
Tue Aug 02 18:21:09 2016 +0000
Revision:
104:3f48daed532b
Parent:
86:2ce08ca58b9e
removed "OneWire" from absolute paths

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 104:3f48daed532b 34 #include "Slaves/Sensors/DS1920/DS1920.h"
IanBenzMaxim 86:2ce08ca58b9e 35 #include "wait_api.h"
j3 80:83b0d879cc32 36
j3 80:83b0d879cc32 37
j3 80:83b0d879cc32 38 using namespace OneWire;
j3 80:83b0d879cc32 39 using namespace OneWire::crc;
j3 80:83b0d879cc32 40
j3 80:83b0d879cc32 41
j3 80:83b0d879cc32 42 enum DS1920_CMDS
j3 80:83b0d879cc32 43 {
j3 80:83b0d879cc32 44 WRITE_SCRATCHPAD = 0x4E,
j3 80:83b0d879cc32 45 READ_SCRATCHPAD = 0xBE,
j3 80:83b0d879cc32 46 COPY_SCRATCHPAD = 0x48,
j3 80:83b0d879cc32 47 CONV_TEMPERATURE = 0x44,
j3 80:83b0d879cc32 48 RECALL = 0xB8
j3 80:83b0d879cc32 49 };
j3 80:83b0d879cc32 50
j3 80:83b0d879cc32 51
j3 80:83b0d879cc32 52 /**********************************************************************/
j3 81:e2a3ad98874e 53 DS1920::DS1920(RandomAccessRomIterator &selector):OneWireSlave(selector)
j3 80:83b0d879cc32 54 {
j3 80:83b0d879cc32 55 }
j3 80:83b0d879cc32 56
j3 80:83b0d879cc32 57
j3 80:83b0d879cc32 58 /**********************************************************************/
j3 80:83b0d879cc32 59 DS1920::CmdResult DS1920::writeScratchPad(uint8_t th, uint8_t tl)
j3 80:83b0d879cc32 60 {
j3 80:83b0d879cc32 61 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 62
j3 80:83b0d879cc32 63 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 64
j3 80:83b0d879cc32 65 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 66 {
j3 80:83b0d879cc32 67 uint8_t sendBlock[] = {WRITE_SCRATCHPAD, th, tl};
j3 80:83b0d879cc32 68
j3 80:83b0d879cc32 69 owmResult = master().OWWriteBlock(sendBlock, 3);
j3 80:83b0d879cc32 70 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 71 {
j3 80:83b0d879cc32 72 deviceResult = DS1920::Success;
j3 80:83b0d879cc32 73 }
j3 80:83b0d879cc32 74 else
j3 80:83b0d879cc32 75 {
j3 80:83b0d879cc32 76 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 77 }
j3 80:83b0d879cc32 78 }
j3 80:83b0d879cc32 79
j3 80:83b0d879cc32 80 return deviceResult;
j3 80:83b0d879cc32 81 }
j3 80:83b0d879cc32 82
j3 80:83b0d879cc32 83
j3 80:83b0d879cc32 84 /**********************************************************************/
j3 80:83b0d879cc32 85 DS1920::CmdResult DS1920::readScratchPad(uint8_t * scratchPadBuff)
j3 80:83b0d879cc32 86 {
j3 80:83b0d879cc32 87 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 88
j3 80:83b0d879cc32 89 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 90
j3 80:83b0d879cc32 91 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 92 {
j3 80:83b0d879cc32 93 uint8_t cmd = READ_SCRATCHPAD;
j3 80:83b0d879cc32 94
j3 80:83b0d879cc32 95 owmResult = master().OWWriteBlock(&cmd, 1);
j3 80:83b0d879cc32 96 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 97 {
j3 80:83b0d879cc32 98 uint8_t rxBlock[9];
j3 80:83b0d879cc32 99 owmResult = master().OWReadBlock(rxBlock, 9);
j3 80:83b0d879cc32 100
j3 80:83b0d879cc32 101 uint8_t crcCheck = calculateCrc8(rxBlock, 8);
j3 80:83b0d879cc32 102 if ((owmResult == OneWireMaster::Success) && (crcCheck == rxBlock[8]))
j3 80:83b0d879cc32 103 {
j3 80:83b0d879cc32 104 std::memcpy(scratchPadBuff, rxBlock, 8);
j3 80:83b0d879cc32 105 deviceResult = DS1920::Success;
j3 80:83b0d879cc32 106 }
j3 80:83b0d879cc32 107 else
j3 80:83b0d879cc32 108 {
j3 80:83b0d879cc32 109 deviceResult = DS1920::CommsReadError;
j3 80:83b0d879cc32 110 }
j3 80:83b0d879cc32 111 }
j3 80:83b0d879cc32 112 else
j3 80:83b0d879cc32 113 {
j3 80:83b0d879cc32 114 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 115 }
j3 80:83b0d879cc32 116 }
j3 80:83b0d879cc32 117
j3 80:83b0d879cc32 118 return deviceResult;
j3 80:83b0d879cc32 119 }
j3 80:83b0d879cc32 120
j3 80:83b0d879cc32 121 /**********************************************************************/
j3 80:83b0d879cc32 122 DS1920::CmdResult DS1920::copyScratchPad( void )
j3 80:83b0d879cc32 123 {
j3 80:83b0d879cc32 124 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 125
j3 80:83b0d879cc32 126 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 127
j3 80:83b0d879cc32 128 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 129 {
j3 80:83b0d879cc32 130 owmResult = master().OWWriteByteSetLevel(COPY_SCRATCHPAD, OneWireMaster::StrongLevel);
j3 80:83b0d879cc32 131 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 132 {
j3 80:83b0d879cc32 133 wait_ms(10);
j3 80:83b0d879cc32 134
j3 80:83b0d879cc32 135 owmResult = master().OWSetLevel(OneWireMaster::NormalLevel);
j3 80:83b0d879cc32 136 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 137 {
j3 80:83b0d879cc32 138 deviceResult = DS1920::Success;
j3 80:83b0d879cc32 139 }
j3 80:83b0d879cc32 140 }
j3 80:83b0d879cc32 141 else
j3 80:83b0d879cc32 142 {
j3 80:83b0d879cc32 143 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 144 }
j3 80:83b0d879cc32 145 }
j3 80:83b0d879cc32 146
j3 80:83b0d879cc32 147 return deviceResult;
j3 80:83b0d879cc32 148 }
j3 80:83b0d879cc32 149
j3 80:83b0d879cc32 150 /**********************************************************************/
j3 81:e2a3ad98874e 151 DS1920::CmdResult DS1920::convertTemperature(float & temp)
j3 80:83b0d879cc32 152 {
j3 80:83b0d879cc32 153 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 154
j3 80:83b0d879cc32 155 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 156
j3 80:83b0d879cc32 157 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 158 {
j3 80:83b0d879cc32 159 owmResult = master().OWWriteByteSetLevel(CONV_TEMPERATURE, OneWireMaster::StrongLevel);
j3 80:83b0d879cc32 160 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 161 {
j3 80:83b0d879cc32 162 wait_ms(750);
j3 80:83b0d879cc32 163
j3 80:83b0d879cc32 164 owmResult = master().OWSetLevel(OneWireMaster::NormalLevel);
j3 80:83b0d879cc32 165 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 166 {
j3 81:e2a3ad98874e 167 uint8_t scratchPadBuff[8];
j3 81:e2a3ad98874e 168 deviceResult = this->readScratchPad(scratchPadBuff);
j3 81:e2a3ad98874e 169 if(deviceResult == DS1920::Success)
j3 81:e2a3ad98874e 170 {
j3 81:e2a3ad98874e 171 if(scratchPadBuff[0] & 1)
j3 81:e2a3ad98874e 172 {
j3 81:e2a3ad98874e 173 temp = (((float) (scratchPadBuff[0] >> 1)) + 0.5F);
j3 81:e2a3ad98874e 174 }
j3 81:e2a3ad98874e 175 else
j3 81:e2a3ad98874e 176 {
j3 81:e2a3ad98874e 177 temp = ((float) (scratchPadBuff[0] >> 1));
j3 81:e2a3ad98874e 178 }
j3 81:e2a3ad98874e 179
j3 81:e2a3ad98874e 180 if(scratchPadBuff[1])
j3 81:e2a3ad98874e 181 {
j3 81:e2a3ad98874e 182 temp = (temp * -1.0F);
j3 81:e2a3ad98874e 183 }
j3 81:e2a3ad98874e 184 }
j3 80:83b0d879cc32 185 }
j3 80:83b0d879cc32 186 }
j3 80:83b0d879cc32 187 else
j3 80:83b0d879cc32 188 {
j3 80:83b0d879cc32 189 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 190 }
j3 80:83b0d879cc32 191 }
j3 80:83b0d879cc32 192
j3 80:83b0d879cc32 193 return deviceResult;
j3 80:83b0d879cc32 194 }
j3 80:83b0d879cc32 195
j3 80:83b0d879cc32 196
j3 80:83b0d879cc32 197 /**********************************************************************/
j3 80:83b0d879cc32 198 DS1920::CmdResult DS1920::recallEEPROM( void )
j3 80:83b0d879cc32 199 {
j3 80:83b0d879cc32 200 DS1920::CmdResult deviceResult = DS1920::OpFailure;
j3 80:83b0d879cc32 201
j3 80:83b0d879cc32 202 OneWireMaster::CmdResult owmResult = selectDevice();
j3 80:83b0d879cc32 203
j3 80:83b0d879cc32 204 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 205 {
j3 80:83b0d879cc32 206 uint8_t cmd = RECALL;
j3 80:83b0d879cc32 207
j3 80:83b0d879cc32 208 owmResult = master().OWWriteBlock(&cmd, 1);
j3 80:83b0d879cc32 209 if (owmResult == OneWireMaster::Success)
j3 80:83b0d879cc32 210 {
j3 80:83b0d879cc32 211 deviceResult = DS1920::Success;
j3 80:83b0d879cc32 212 }
j3 80:83b0d879cc32 213 else
j3 80:83b0d879cc32 214 {
j3 80:83b0d879cc32 215 deviceResult = DS1920::CommsWriteError;
j3 80:83b0d879cc32 216 }
j3 80:83b0d879cc32 217 }
j3 80:83b0d879cc32 218
j3 80:83b0d879cc32 219 return deviceResult;
j3 80:83b0d879cc32 220 }