Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
j3
Date:
Tue Dec 13 13:31:30 2016 -0800
Revision:
139:f0e0a7976846
Parent:
104:3f48daed532b
Child:
142:85b71cfd617e
Merge from svn

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 104:3f48daed532b 1 /******************************************************************//**
j3 104:3f48daed532b 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 104:3f48daed532b 3 *
j3 104:3f48daed532b 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 104:3f48daed532b 5 * copy of this software and associated documentation files (the "Software"),
j3 104:3f48daed532b 6 * to deal in the Software without restriction, including without limitation
j3 104:3f48daed532b 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 104:3f48daed532b 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 104:3f48daed532b 9 * Software is furnished to do so, subject to the following conditions:
j3 104:3f48daed532b 10 *
j3 104:3f48daed532b 11 * The above copyright notice and this permission notice shall be included
j3 104:3f48daed532b 12 * in all copies or substantial portions of the Software.
j3 104:3f48daed532b 13 *
j3 104:3f48daed532b 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 104:3f48daed532b 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 104:3f48daed532b 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 104:3f48daed532b 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 104:3f48daed532b 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 104:3f48daed532b 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 104:3f48daed532b 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 104:3f48daed532b 21 *
j3 104:3f48daed532b 22 * Except as contained in this notice, the name of Maxim Integrated
j3 104:3f48daed532b 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 104:3f48daed532b 24 * Products, Inc. Branding Policy.
j3 104:3f48daed532b 25 *
j3 104:3f48daed532b 26 * The mere transfer of this software does not imply any licenses
j3 104:3f48daed532b 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 104:3f48daed532b 28 * trademarks, maskwork rights, or any other form of intellectual
j3 104:3f48daed532b 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 104:3f48daed532b 30 * ownership rights.
j3 104:3f48daed532b 31 **********************************************************************/
j3 104:3f48daed532b 32
j3 104:3f48daed532b 33 #include "RomId/RomCommands.h"
IanBenzMaxim 90:c233d1c265ff 34
IanBenzMaxim 90:c233d1c265ff 35 using namespace OneWire::crc;
IanBenzMaxim 90:c233d1c265ff 36
IanBenzMaxim 90:c233d1c265ff 37 namespace OneWire
IanBenzMaxim 90:c233d1c265ff 38 {
IanBenzMaxim 90:c233d1c265ff 39 namespace RomCommands
IanBenzMaxim 90:c233d1c265ff 40 {
IanBenzMaxim 90:c233d1c265ff 41 enum OwRomCmd
IanBenzMaxim 90:c233d1c265ff 42 {
IanBenzMaxim 90:c233d1c265ff 43 ReadRomCmd = 0x33,
IanBenzMaxim 90:c233d1c265ff 44 MatchRomCmd = 0x55,
IanBenzMaxim 90:c233d1c265ff 45 SearchRomCmd = 0xF0,
IanBenzMaxim 90:c233d1c265ff 46 SkipRomCmd = 0xCC,
IanBenzMaxim 90:c233d1c265ff 47 ResumeCmd = 0xA5,
IanBenzMaxim 90:c233d1c265ff 48 OverdriveSkipRomCmd = 0x3C,
IanBenzMaxim 90:c233d1c265ff 49 OverdriveMatchRomCmd = 0x69
IanBenzMaxim 90:c233d1c265ff 50 };
IanBenzMaxim 90:c233d1c265ff 51
IanBenzMaxim 90:c233d1c265ff 52 void SearchState::reset()
IanBenzMaxim 90:c233d1c265ff 53 {
IanBenzMaxim 90:c233d1c265ff 54 last_discrepancy = 0;
IanBenzMaxim 90:c233d1c265ff 55 last_device_flag = false;
IanBenzMaxim 90:c233d1c265ff 56 last_family_discrepancy = 0;
j3 139:f0e0a7976846 57 romId = RomId();
IanBenzMaxim 90:c233d1c265ff 58 }
IanBenzMaxim 90:c233d1c265ff 59
IanBenzMaxim 90:c233d1c265ff 60 void SearchState::findFamily(uint8_t familyCode)
IanBenzMaxim 90:c233d1c265ff 61 {
IanBenzMaxim 90:c233d1c265ff 62 reset();
j3 139:f0e0a7976846 63 romId.familyCode() = familyCode;
IanBenzMaxim 90:c233d1c265ff 64 last_discrepancy = 64;
IanBenzMaxim 90:c233d1c265ff 65 }
IanBenzMaxim 90:c233d1c265ff 66
IanBenzMaxim 90:c233d1c265ff 67 void SearchState::skipCurrentFamily()
IanBenzMaxim 90:c233d1c265ff 68 {
IanBenzMaxim 90:c233d1c265ff 69 // set the Last discrepancy to last family discrepancy
IanBenzMaxim 90:c233d1c265ff 70 last_discrepancy = last_family_discrepancy;
IanBenzMaxim 90:c233d1c265ff 71
IanBenzMaxim 90:c233d1c265ff 72 // clear the last family discrpepancy
IanBenzMaxim 90:c233d1c265ff 73 last_family_discrepancy = 0;
IanBenzMaxim 90:c233d1c265ff 74
IanBenzMaxim 90:c233d1c265ff 75 // check for end of list
IanBenzMaxim 90:c233d1c265ff 76 if (last_discrepancy == 0)
IanBenzMaxim 90:c233d1c265ff 77 {
IanBenzMaxim 90:c233d1c265ff 78 last_device_flag = true;
IanBenzMaxim 90:c233d1c265ff 79 }
IanBenzMaxim 90:c233d1c265ff 80 }
IanBenzMaxim 90:c233d1c265ff 81
IanBenzMaxim 90:c233d1c265ff 82 OneWireMaster::CmdResult OWFirst(OneWireMaster & master, SearchState & searchState)
IanBenzMaxim 90:c233d1c265ff 83 {
IanBenzMaxim 90:c233d1c265ff 84 // Reset and begin a new search
IanBenzMaxim 90:c233d1c265ff 85 searchState.reset();
IanBenzMaxim 90:c233d1c265ff 86 return OWSearch(master, searchState);
IanBenzMaxim 90:c233d1c265ff 87 }
IanBenzMaxim 90:c233d1c265ff 88
IanBenzMaxim 90:c233d1c265ff 89 OneWireMaster::CmdResult OWNext(OneWireMaster & master, SearchState & searchState)
IanBenzMaxim 90:c233d1c265ff 90 {
IanBenzMaxim 90:c233d1c265ff 91 // Continue the previous search
IanBenzMaxim 90:c233d1c265ff 92 return OWSearch(master, searchState);
IanBenzMaxim 90:c233d1c265ff 93 }
IanBenzMaxim 90:c233d1c265ff 94
IanBenzMaxim 90:c233d1c265ff 95 OneWireMaster::CmdResult OWVerify(OneWireMaster & master, const RomId & romId)
IanBenzMaxim 90:c233d1c265ff 96 {
IanBenzMaxim 90:c233d1c265ff 97 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 98 SearchState searchState;
IanBenzMaxim 90:c233d1c265ff 99
IanBenzMaxim 90:c233d1c265ff 100 searchState.romId = romId;
IanBenzMaxim 90:c233d1c265ff 101
IanBenzMaxim 90:c233d1c265ff 102 // set search to find the same device
IanBenzMaxim 90:c233d1c265ff 103 searchState.last_discrepancy = 64;
IanBenzMaxim 90:c233d1c265ff 104 searchState.last_device_flag = false;
IanBenzMaxim 90:c233d1c265ff 105
IanBenzMaxim 90:c233d1c265ff 106 result = OWSearch(master, searchState);
IanBenzMaxim 90:c233d1c265ff 107 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 108 {
IanBenzMaxim 90:c233d1c265ff 109 // check if same device found
IanBenzMaxim 90:c233d1c265ff 110 if (romId != searchState.romId)
IanBenzMaxim 90:c233d1c265ff 111 {
IanBenzMaxim 90:c233d1c265ff 112 result = OneWireMaster::OperationFailure;
IanBenzMaxim 90:c233d1c265ff 113 }
IanBenzMaxim 90:c233d1c265ff 114 }
IanBenzMaxim 90:c233d1c265ff 115
IanBenzMaxim 90:c233d1c265ff 116 return result;
IanBenzMaxim 90:c233d1c265ff 117 }
IanBenzMaxim 90:c233d1c265ff 118
IanBenzMaxim 90:c233d1c265ff 119 OneWireMaster::CmdResult OWReadRom(OneWireMaster & master, RomId & romId)
IanBenzMaxim 90:c233d1c265ff 120 {
IanBenzMaxim 90:c233d1c265ff 121 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 122 RomId readId;
IanBenzMaxim 90:c233d1c265ff 123
IanBenzMaxim 90:c233d1c265ff 124 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 125 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 126 {
IanBenzMaxim 90:c233d1c265ff 127 result = master.OWWriteByte(ReadRomCmd);
IanBenzMaxim 90:c233d1c265ff 128 }
IanBenzMaxim 90:c233d1c265ff 129
IanBenzMaxim 90:c233d1c265ff 130 // read the ROM
IanBenzMaxim 90:c233d1c265ff 131 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 132 {
j3 139:f0e0a7976846 133 result = master.OWReadBlock(readId.buffer.data(), readId.buffer.size());
IanBenzMaxim 90:c233d1c265ff 134 }
IanBenzMaxim 90:c233d1c265ff 135
IanBenzMaxim 90:c233d1c265ff 136 // verify CRC8
IanBenzMaxim 90:c233d1c265ff 137 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 138 {
j3 139:f0e0a7976846 139 if (readId.valid())
IanBenzMaxim 90:c233d1c265ff 140 {
IanBenzMaxim 90:c233d1c265ff 141 romId = readId;
IanBenzMaxim 90:c233d1c265ff 142 }
IanBenzMaxim 90:c233d1c265ff 143 else
IanBenzMaxim 90:c233d1c265ff 144 {
IanBenzMaxim 90:c233d1c265ff 145 result = OneWireMaster::OperationFailure;
IanBenzMaxim 90:c233d1c265ff 146 }
IanBenzMaxim 90:c233d1c265ff 147 }
IanBenzMaxim 90:c233d1c265ff 148
IanBenzMaxim 90:c233d1c265ff 149 return result;
IanBenzMaxim 90:c233d1c265ff 150 }
j3 139:f0e0a7976846 151
IanBenzMaxim 90:c233d1c265ff 152 OneWireMaster::CmdResult OWSkipRom(OneWireMaster & master)
IanBenzMaxim 90:c233d1c265ff 153 {
IanBenzMaxim 90:c233d1c265ff 154 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 155
IanBenzMaxim 90:c233d1c265ff 156 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 157 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 158 {
IanBenzMaxim 90:c233d1c265ff 159 result = master.OWWriteByte(SkipRomCmd);
IanBenzMaxim 90:c233d1c265ff 160 }
IanBenzMaxim 90:c233d1c265ff 161
IanBenzMaxim 90:c233d1c265ff 162 return result;
IanBenzMaxim 90:c233d1c265ff 163 }
j3 139:f0e0a7976846 164
IanBenzMaxim 90:c233d1c265ff 165 OneWireMaster::CmdResult OWMatchRom(OneWireMaster & master, const RomId & romId)
IanBenzMaxim 90:c233d1c265ff 166 {
IanBenzMaxim 90:c233d1c265ff 167 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 168
j3 139:f0e0a7976846 169 uint8_t buf[1 + RomId::Buffer::csize];
IanBenzMaxim 90:c233d1c265ff 170
IanBenzMaxim 90:c233d1c265ff 171 // use MatchROM
IanBenzMaxim 90:c233d1c265ff 172 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 173 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 174 {
IanBenzMaxim 90:c233d1c265ff 175 buf[0] = MatchRomCmd;
j3 139:f0e0a7976846 176 std::memcpy(&buf[1], romId.buffer.data(), romId.buffer.size());
IanBenzMaxim 90:c233d1c265ff 177 // send command and rom
j3 139:f0e0a7976846 178 result = master.OWWriteBlock(buf, 1 + romId.buffer.size());
IanBenzMaxim 90:c233d1c265ff 179 }
IanBenzMaxim 90:c233d1c265ff 180
IanBenzMaxim 90:c233d1c265ff 181 return result;
IanBenzMaxim 90:c233d1c265ff 182 }
j3 139:f0e0a7976846 183
IanBenzMaxim 90:c233d1c265ff 184 OneWireMaster::CmdResult OWOverdriveSkipRom(OneWireMaster & master)
IanBenzMaxim 90:c233d1c265ff 185 {
IanBenzMaxim 90:c233d1c265ff 186 OneWireMaster::CmdResult result = master.OWSetSpeed(OneWireMaster::StandardSpeed);
IanBenzMaxim 90:c233d1c265ff 187
IanBenzMaxim 90:c233d1c265ff 188 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 189 {
IanBenzMaxim 90:c233d1c265ff 190 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 191 }
IanBenzMaxim 90:c233d1c265ff 192
IanBenzMaxim 90:c233d1c265ff 193 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 194 {
IanBenzMaxim 90:c233d1c265ff 195 result = master.OWWriteByte(OverdriveSkipRomCmd);
IanBenzMaxim 90:c233d1c265ff 196 }
IanBenzMaxim 90:c233d1c265ff 197
IanBenzMaxim 90:c233d1c265ff 198 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 199 {
IanBenzMaxim 90:c233d1c265ff 200 result = master.OWSetSpeed(OneWireMaster::OverdriveSpeed);
IanBenzMaxim 90:c233d1c265ff 201 }
IanBenzMaxim 90:c233d1c265ff 202
IanBenzMaxim 90:c233d1c265ff 203 return result;
IanBenzMaxim 90:c233d1c265ff 204 }
IanBenzMaxim 90:c233d1c265ff 205
IanBenzMaxim 90:c233d1c265ff 206 OneWireMaster::CmdResult OWOverdriveMatchRom(OneWireMaster & master, const RomId & romId)
IanBenzMaxim 90:c233d1c265ff 207 {
IanBenzMaxim 90:c233d1c265ff 208 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 209
IanBenzMaxim 90:c233d1c265ff 210 // use overdrive MatchROM
IanBenzMaxim 90:c233d1c265ff 211 master.OWSetSpeed(OneWireMaster::StandardSpeed);
IanBenzMaxim 90:c233d1c265ff 212
IanBenzMaxim 90:c233d1c265ff 213 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 214 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 215 {
IanBenzMaxim 90:c233d1c265ff 216 result = master.OWWriteByte(OverdriveMatchRomCmd);
IanBenzMaxim 90:c233d1c265ff 217 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 218 {
IanBenzMaxim 90:c233d1c265ff 219 master.OWSetSpeed(OneWireMaster::OverdriveSpeed);
IanBenzMaxim 90:c233d1c265ff 220 // send ROM
j3 139:f0e0a7976846 221 result = master.OWWriteBlock(romId.buffer.data(), romId.buffer.size());
IanBenzMaxim 90:c233d1c265ff 222 }
IanBenzMaxim 90:c233d1c265ff 223 }
IanBenzMaxim 90:c233d1c265ff 224 return result;
IanBenzMaxim 90:c233d1c265ff 225 }
j3 139:f0e0a7976846 226
IanBenzMaxim 90:c233d1c265ff 227 OneWireMaster::CmdResult OWResume(OneWireMaster & master)
IanBenzMaxim 90:c233d1c265ff 228 {
IanBenzMaxim 90:c233d1c265ff 229 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 230
IanBenzMaxim 90:c233d1c265ff 231 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 232 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 233 {
IanBenzMaxim 90:c233d1c265ff 234 result = master.OWWriteByte(ResumeCmd);
IanBenzMaxim 90:c233d1c265ff 235 }
IanBenzMaxim 90:c233d1c265ff 236
IanBenzMaxim 90:c233d1c265ff 237 return result;
IanBenzMaxim 90:c233d1c265ff 238 }
IanBenzMaxim 90:c233d1c265ff 239
IanBenzMaxim 90:c233d1c265ff 240 OneWireMaster::CmdResult OWSearch(OneWireMaster & master, SearchState & searchState)
IanBenzMaxim 90:c233d1c265ff 241 {
IanBenzMaxim 90:c233d1c265ff 242 uint8_t id_bit_number;
IanBenzMaxim 90:c233d1c265ff 243 uint8_t last_zero, rom_byte_number;
IanBenzMaxim 90:c233d1c265ff 244 uint8_t id_bit, cmp_id_bit;
IanBenzMaxim 90:c233d1c265ff 245 uint8_t rom_byte_mask;
IanBenzMaxim 90:c233d1c265ff 246 bool search_result;
IanBenzMaxim 90:c233d1c265ff 247 uint8_t crc8 = 0;
IanBenzMaxim 90:c233d1c265ff 248 OneWireMaster::SearchDirection search_direction;
IanBenzMaxim 90:c233d1c265ff 249
IanBenzMaxim 90:c233d1c265ff 250 // initialize for search
IanBenzMaxim 90:c233d1c265ff 251 id_bit_number = 1;
IanBenzMaxim 90:c233d1c265ff 252 last_zero = 0;
IanBenzMaxim 90:c233d1c265ff 253 rom_byte_number = 0;
IanBenzMaxim 90:c233d1c265ff 254 rom_byte_mask = 1;
IanBenzMaxim 90:c233d1c265ff 255 search_result = false;
IanBenzMaxim 90:c233d1c265ff 256
IanBenzMaxim 90:c233d1c265ff 257 // if the last call was not the last one
IanBenzMaxim 90:c233d1c265ff 258 if (!searchState.last_device_flag)
IanBenzMaxim 90:c233d1c265ff 259 {
IanBenzMaxim 90:c233d1c265ff 260 // 1-Wire reset
IanBenzMaxim 90:c233d1c265ff 261 OneWireMaster::CmdResult result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 262 if (result != OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 263 {
IanBenzMaxim 90:c233d1c265ff 264 // reset the search
IanBenzMaxim 90:c233d1c265ff 265 searchState.reset();
IanBenzMaxim 90:c233d1c265ff 266 return result;
IanBenzMaxim 90:c233d1c265ff 267 }
IanBenzMaxim 90:c233d1c265ff 268
IanBenzMaxim 90:c233d1c265ff 269 // issue the search command
IanBenzMaxim 90:c233d1c265ff 270 master.OWWriteByte(SearchRomCmd);
IanBenzMaxim 90:c233d1c265ff 271
IanBenzMaxim 90:c233d1c265ff 272 // loop to do the search
IanBenzMaxim 90:c233d1c265ff 273 do
IanBenzMaxim 90:c233d1c265ff 274 {
IanBenzMaxim 90:c233d1c265ff 275 // if this discrepancy if before the Last Discrepancy
IanBenzMaxim 90:c233d1c265ff 276 // on a previous next then pick the same as last time
IanBenzMaxim 90:c233d1c265ff 277 if (id_bit_number < searchState.last_discrepancy)
IanBenzMaxim 90:c233d1c265ff 278 {
j3 139:f0e0a7976846 279 if ((searchState.romId.buffer[rom_byte_number] & rom_byte_mask) > 0)
IanBenzMaxim 90:c233d1c265ff 280 {
IanBenzMaxim 90:c233d1c265ff 281 search_direction = OneWireMaster::WriteOne;
IanBenzMaxim 90:c233d1c265ff 282 }
IanBenzMaxim 90:c233d1c265ff 283 else
IanBenzMaxim 90:c233d1c265ff 284 {
IanBenzMaxim 90:c233d1c265ff 285 search_direction = OneWireMaster::WriteZero;
IanBenzMaxim 90:c233d1c265ff 286 }
IanBenzMaxim 90:c233d1c265ff 287 }
IanBenzMaxim 90:c233d1c265ff 288 else
IanBenzMaxim 90:c233d1c265ff 289 {
IanBenzMaxim 90:c233d1c265ff 290 // if equal to last pick 1, if not then pick 0
IanBenzMaxim 90:c233d1c265ff 291 if (id_bit_number == searchState.last_discrepancy)
IanBenzMaxim 90:c233d1c265ff 292 {
IanBenzMaxim 90:c233d1c265ff 293 search_direction = OneWireMaster::WriteOne;
IanBenzMaxim 90:c233d1c265ff 294 }
IanBenzMaxim 90:c233d1c265ff 295 else
IanBenzMaxim 90:c233d1c265ff 296 {
IanBenzMaxim 90:c233d1c265ff 297 search_direction = OneWireMaster::WriteZero;
IanBenzMaxim 90:c233d1c265ff 298 }
IanBenzMaxim 90:c233d1c265ff 299 }
IanBenzMaxim 90:c233d1c265ff 300
IanBenzMaxim 90:c233d1c265ff 301 // Peform a triple operation on the DS2465 which will perform 2 read bits and 1 write bit
IanBenzMaxim 90:c233d1c265ff 302 result = master.OWTriplet(search_direction, id_bit, cmp_id_bit);
IanBenzMaxim 90:c233d1c265ff 303 if (result != OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 304 {
IanBenzMaxim 90:c233d1c265ff 305 return result;
IanBenzMaxim 90:c233d1c265ff 306 }
IanBenzMaxim 90:c233d1c265ff 307
IanBenzMaxim 90:c233d1c265ff 308 // check for no devices on 1-wire
IanBenzMaxim 90:c233d1c265ff 309 if (id_bit && cmp_id_bit)
IanBenzMaxim 90:c233d1c265ff 310 {
IanBenzMaxim 90:c233d1c265ff 311 break;
IanBenzMaxim 90:c233d1c265ff 312 }
IanBenzMaxim 90:c233d1c265ff 313 else
IanBenzMaxim 90:c233d1c265ff 314 {
IanBenzMaxim 90:c233d1c265ff 315 if (!id_bit && !cmp_id_bit && (search_direction == OneWireMaster::WriteZero))
IanBenzMaxim 90:c233d1c265ff 316 {
IanBenzMaxim 90:c233d1c265ff 317 last_zero = id_bit_number;
IanBenzMaxim 90:c233d1c265ff 318
IanBenzMaxim 90:c233d1c265ff 319 // check for Last discrepancy in family
IanBenzMaxim 90:c233d1c265ff 320 if (last_zero < 9)
IanBenzMaxim 90:c233d1c265ff 321 {
IanBenzMaxim 90:c233d1c265ff 322 searchState.last_family_discrepancy = last_zero;
IanBenzMaxim 90:c233d1c265ff 323 }
IanBenzMaxim 90:c233d1c265ff 324 }
IanBenzMaxim 90:c233d1c265ff 325
IanBenzMaxim 90:c233d1c265ff 326 // set or clear the bit in the ROM byte rom_byte_number
IanBenzMaxim 90:c233d1c265ff 327 // with mask rom_byte_mask
IanBenzMaxim 90:c233d1c265ff 328 if (search_direction == OneWireMaster::WriteOne)
IanBenzMaxim 90:c233d1c265ff 329 {
j3 139:f0e0a7976846 330 searchState.romId.buffer[rom_byte_number] |= rom_byte_mask;
IanBenzMaxim 90:c233d1c265ff 331 }
IanBenzMaxim 90:c233d1c265ff 332 else
IanBenzMaxim 90:c233d1c265ff 333 {
j3 139:f0e0a7976846 334 searchState.romId.buffer[rom_byte_number] &= (uint8_t)~rom_byte_mask;
IanBenzMaxim 90:c233d1c265ff 335 }
IanBenzMaxim 90:c233d1c265ff 336
IanBenzMaxim 90:c233d1c265ff 337 // increment the byte counter id_bit_number
IanBenzMaxim 90:c233d1c265ff 338 // and shift the mask rom_byte_mask
IanBenzMaxim 90:c233d1c265ff 339 id_bit_number++;
IanBenzMaxim 90:c233d1c265ff 340 rom_byte_mask <<= 1;
IanBenzMaxim 90:c233d1c265ff 341
IanBenzMaxim 90:c233d1c265ff 342 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
IanBenzMaxim 90:c233d1c265ff 343 if (rom_byte_mask == 0)
IanBenzMaxim 90:c233d1c265ff 344 {
j3 139:f0e0a7976846 345 crc8 = calculateCrc8(crc8, searchState.romId.buffer[rom_byte_number]); // accumulate the CRC
IanBenzMaxim 90:c233d1c265ff 346 rom_byte_number++;
IanBenzMaxim 90:c233d1c265ff 347 rom_byte_mask = 1;
IanBenzMaxim 90:c233d1c265ff 348 }
IanBenzMaxim 90:c233d1c265ff 349 }
j3 139:f0e0a7976846 350 } while (rom_byte_number < searchState.romId.buffer.size()); // loop until through all ROM bytes 0-7
IanBenzMaxim 90:c233d1c265ff 351
IanBenzMaxim 90:c233d1c265ff 352 // if the search was successful then
j3 139:f0e0a7976846 353 if (!((id_bit_number <= (searchState.romId.buffer.size() * 8)) || (crc8 != 0)))
IanBenzMaxim 90:c233d1c265ff 354 {
IanBenzMaxim 90:c233d1c265ff 355 // search successful so set m_last_discrepancy,m_last_device_flag,search_result
IanBenzMaxim 90:c233d1c265ff 356 searchState.last_discrepancy = last_zero;
IanBenzMaxim 90:c233d1c265ff 357
IanBenzMaxim 90:c233d1c265ff 358 // check for last device
IanBenzMaxim 90:c233d1c265ff 359 if (searchState.last_discrepancy == 0)
IanBenzMaxim 90:c233d1c265ff 360 {
IanBenzMaxim 90:c233d1c265ff 361 searchState.last_device_flag = true;
IanBenzMaxim 90:c233d1c265ff 362 }
IanBenzMaxim 90:c233d1c265ff 363
IanBenzMaxim 90:c233d1c265ff 364 search_result = true;
IanBenzMaxim 90:c233d1c265ff 365 }
IanBenzMaxim 90:c233d1c265ff 366 }
IanBenzMaxim 90:c233d1c265ff 367
IanBenzMaxim 90:c233d1c265ff 368 // if no device found then reset counters so next 'search' will be like a first
IanBenzMaxim 90:c233d1c265ff 369 if (!search_result || (searchState.romId.familyCode() == 0))
IanBenzMaxim 90:c233d1c265ff 370 {
IanBenzMaxim 90:c233d1c265ff 371 searchState.reset();
IanBenzMaxim 90:c233d1c265ff 372 search_result = false;
IanBenzMaxim 90:c233d1c265ff 373 }
IanBenzMaxim 90:c233d1c265ff 374
IanBenzMaxim 90:c233d1c265ff 375 return (search_result ? OneWireMaster::Success : OneWireMaster::OperationFailure);
IanBenzMaxim 90:c233d1c265ff 376 }
IanBenzMaxim 90:c233d1c265ff 377 }
IanBenzMaxim 90:c233d1c265ff 378 }