Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Fri Jun 17 15:24:37 2016 -0500
Revision:
90:c233d1c265ff
Moved ROM utility functions outside of the OneWireMaster class.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 90:c233d1c265ff 1 #include "RomCommands.h"
IanBenzMaxim 90:c233d1c265ff 2
IanBenzMaxim 90:c233d1c265ff 3 using namespace OneWire::crc;
IanBenzMaxim 90:c233d1c265ff 4
IanBenzMaxim 90:c233d1c265ff 5 namespace OneWire
IanBenzMaxim 90:c233d1c265ff 6 {
IanBenzMaxim 90:c233d1c265ff 7 namespace RomCommands
IanBenzMaxim 90:c233d1c265ff 8 {
IanBenzMaxim 90:c233d1c265ff 9 enum OwRomCmd
IanBenzMaxim 90:c233d1c265ff 10 {
IanBenzMaxim 90:c233d1c265ff 11 ReadRomCmd = 0x33,
IanBenzMaxim 90:c233d1c265ff 12 MatchRomCmd = 0x55,
IanBenzMaxim 90:c233d1c265ff 13 SearchRomCmd = 0xF0,
IanBenzMaxim 90:c233d1c265ff 14 SkipRomCmd = 0xCC,
IanBenzMaxim 90:c233d1c265ff 15 ResumeCmd = 0xA5,
IanBenzMaxim 90:c233d1c265ff 16 OverdriveSkipRomCmd = 0x3C,
IanBenzMaxim 90:c233d1c265ff 17 OverdriveMatchRomCmd = 0x69
IanBenzMaxim 90:c233d1c265ff 18 };
IanBenzMaxim 90:c233d1c265ff 19
IanBenzMaxim 90:c233d1c265ff 20 void SearchState::reset()
IanBenzMaxim 90:c233d1c265ff 21 {
IanBenzMaxim 90:c233d1c265ff 22 last_discrepancy = 0;
IanBenzMaxim 90:c233d1c265ff 23 last_device_flag = false;
IanBenzMaxim 90:c233d1c265ff 24 last_family_discrepancy = 0;
IanBenzMaxim 90:c233d1c265ff 25 romId.reset();
IanBenzMaxim 90:c233d1c265ff 26 }
IanBenzMaxim 90:c233d1c265ff 27
IanBenzMaxim 90:c233d1c265ff 28 void SearchState::findFamily(uint8_t familyCode)
IanBenzMaxim 90:c233d1c265ff 29 {
IanBenzMaxim 90:c233d1c265ff 30 reset();
IanBenzMaxim 90:c233d1c265ff 31 romId.setFamilyCode(familyCode);
IanBenzMaxim 90:c233d1c265ff 32 last_discrepancy = 64;
IanBenzMaxim 90:c233d1c265ff 33 }
IanBenzMaxim 90:c233d1c265ff 34
IanBenzMaxim 90:c233d1c265ff 35 void SearchState::skipCurrentFamily()
IanBenzMaxim 90:c233d1c265ff 36 {
IanBenzMaxim 90:c233d1c265ff 37 // set the Last discrepancy to last family discrepancy
IanBenzMaxim 90:c233d1c265ff 38 last_discrepancy = last_family_discrepancy;
IanBenzMaxim 90:c233d1c265ff 39
IanBenzMaxim 90:c233d1c265ff 40 // clear the last family discrpepancy
IanBenzMaxim 90:c233d1c265ff 41 last_family_discrepancy = 0;
IanBenzMaxim 90:c233d1c265ff 42
IanBenzMaxim 90:c233d1c265ff 43 // check for end of list
IanBenzMaxim 90:c233d1c265ff 44 if (last_discrepancy == 0)
IanBenzMaxim 90:c233d1c265ff 45 {
IanBenzMaxim 90:c233d1c265ff 46 last_device_flag = true;
IanBenzMaxim 90:c233d1c265ff 47 }
IanBenzMaxim 90:c233d1c265ff 48 }
IanBenzMaxim 90:c233d1c265ff 49
IanBenzMaxim 90:c233d1c265ff 50 OneWireMaster::CmdResult OWFirst(OneWireMaster & master, SearchState & searchState)
IanBenzMaxim 90:c233d1c265ff 51 {
IanBenzMaxim 90:c233d1c265ff 52 // Reset and begin a new search
IanBenzMaxim 90:c233d1c265ff 53 searchState.reset();
IanBenzMaxim 90:c233d1c265ff 54 return OWSearch(master, searchState);
IanBenzMaxim 90:c233d1c265ff 55 }
IanBenzMaxim 90:c233d1c265ff 56
IanBenzMaxim 90:c233d1c265ff 57 OneWireMaster::CmdResult OWNext(OneWireMaster & master, SearchState & searchState)
IanBenzMaxim 90:c233d1c265ff 58 {
IanBenzMaxim 90:c233d1c265ff 59 // Continue the previous search
IanBenzMaxim 90:c233d1c265ff 60 return OWSearch(master, searchState);
IanBenzMaxim 90:c233d1c265ff 61 }
IanBenzMaxim 90:c233d1c265ff 62
IanBenzMaxim 90:c233d1c265ff 63 OneWireMaster::CmdResult OWVerify(OneWireMaster & master, const RomId & romId)
IanBenzMaxim 90:c233d1c265ff 64 {
IanBenzMaxim 90:c233d1c265ff 65 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 66 SearchState searchState;
IanBenzMaxim 90:c233d1c265ff 67
IanBenzMaxim 90:c233d1c265ff 68 searchState.romId = romId;
IanBenzMaxim 90:c233d1c265ff 69
IanBenzMaxim 90:c233d1c265ff 70 // set search to find the same device
IanBenzMaxim 90:c233d1c265ff 71 searchState.last_discrepancy = 64;
IanBenzMaxim 90:c233d1c265ff 72 searchState.last_device_flag = false;
IanBenzMaxim 90:c233d1c265ff 73
IanBenzMaxim 90:c233d1c265ff 74 result = OWSearch(master, searchState);
IanBenzMaxim 90:c233d1c265ff 75 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 76 {
IanBenzMaxim 90:c233d1c265ff 77 // check if same device found
IanBenzMaxim 90:c233d1c265ff 78 if (romId != searchState.romId)
IanBenzMaxim 90:c233d1c265ff 79 {
IanBenzMaxim 90:c233d1c265ff 80 result = OneWireMaster::OperationFailure;
IanBenzMaxim 90:c233d1c265ff 81 }
IanBenzMaxim 90:c233d1c265ff 82 }
IanBenzMaxim 90:c233d1c265ff 83
IanBenzMaxim 90:c233d1c265ff 84 return result;
IanBenzMaxim 90:c233d1c265ff 85 }
IanBenzMaxim 90:c233d1c265ff 86
IanBenzMaxim 90:c233d1c265ff 87 OneWireMaster::CmdResult OWReadRom(OneWireMaster & master, RomId & romId)
IanBenzMaxim 90:c233d1c265ff 88 {
IanBenzMaxim 90:c233d1c265ff 89 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 90 RomId readId;
IanBenzMaxim 90:c233d1c265ff 91
IanBenzMaxim 90:c233d1c265ff 92 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 93 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 94 {
IanBenzMaxim 90:c233d1c265ff 95 result = master.OWWriteByte(ReadRomCmd);
IanBenzMaxim 90:c233d1c265ff 96 }
IanBenzMaxim 90:c233d1c265ff 97
IanBenzMaxim 90:c233d1c265ff 98 // read the ROM
IanBenzMaxim 90:c233d1c265ff 99 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 100 {
IanBenzMaxim 90:c233d1c265ff 101 result = master.OWReadBlock(readId, RomId::byteLen);
IanBenzMaxim 90:c233d1c265ff 102 }
IanBenzMaxim 90:c233d1c265ff 103
IanBenzMaxim 90:c233d1c265ff 104 // verify CRC8
IanBenzMaxim 90:c233d1c265ff 105 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 106 {
IanBenzMaxim 90:c233d1c265ff 107 if (readId.crc8Valid())
IanBenzMaxim 90:c233d1c265ff 108 {
IanBenzMaxim 90:c233d1c265ff 109 romId = readId;
IanBenzMaxim 90:c233d1c265ff 110 }
IanBenzMaxim 90:c233d1c265ff 111 else
IanBenzMaxim 90:c233d1c265ff 112 {
IanBenzMaxim 90:c233d1c265ff 113 result = OneWireMaster::OperationFailure;
IanBenzMaxim 90:c233d1c265ff 114 }
IanBenzMaxim 90:c233d1c265ff 115 }
IanBenzMaxim 90:c233d1c265ff 116
IanBenzMaxim 90:c233d1c265ff 117 return result;
IanBenzMaxim 90:c233d1c265ff 118 }
IanBenzMaxim 90:c233d1c265ff 119
IanBenzMaxim 90:c233d1c265ff 120 OneWireMaster::CmdResult OWSkipRom(OneWireMaster & master)
IanBenzMaxim 90:c233d1c265ff 121 {
IanBenzMaxim 90:c233d1c265ff 122 OneWireMaster::CmdResult result;
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(SkipRomCmd);
IanBenzMaxim 90:c233d1c265ff 128 }
IanBenzMaxim 90:c233d1c265ff 129
IanBenzMaxim 90:c233d1c265ff 130 return result;
IanBenzMaxim 90:c233d1c265ff 131 }
IanBenzMaxim 90:c233d1c265ff 132
IanBenzMaxim 90:c233d1c265ff 133 OneWireMaster::CmdResult OWMatchRom(OneWireMaster & master, const RomId & romId)
IanBenzMaxim 90:c233d1c265ff 134 {
IanBenzMaxim 90:c233d1c265ff 135 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 136
IanBenzMaxim 90:c233d1c265ff 137 uint8_t buf[1 + RomId::byteLen];
IanBenzMaxim 90:c233d1c265ff 138
IanBenzMaxim 90:c233d1c265ff 139 // use MatchROM
IanBenzMaxim 90:c233d1c265ff 140 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 141 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 142 {
IanBenzMaxim 90:c233d1c265ff 143 buf[0] = MatchRomCmd;
IanBenzMaxim 90:c233d1c265ff 144 std::memcpy(&buf[1], romId, RomId::byteLen);
IanBenzMaxim 90:c233d1c265ff 145 // send command and rom
IanBenzMaxim 90:c233d1c265ff 146 result = master.OWWriteBlock(buf, 1 + RomId::byteLen);
IanBenzMaxim 90:c233d1c265ff 147 }
IanBenzMaxim 90:c233d1c265ff 148
IanBenzMaxim 90:c233d1c265ff 149 return result;
IanBenzMaxim 90:c233d1c265ff 150 }
IanBenzMaxim 90:c233d1c265ff 151
IanBenzMaxim 90:c233d1c265ff 152 OneWireMaster::CmdResult OWOverdriveSkipRom(OneWireMaster & master)
IanBenzMaxim 90:c233d1c265ff 153 {
IanBenzMaxim 90:c233d1c265ff 154 OneWireMaster::CmdResult result = master.OWSetSpeed(OneWireMaster::StandardSpeed);
IanBenzMaxim 90:c233d1c265ff 155
IanBenzMaxim 90:c233d1c265ff 156 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 157 {
IanBenzMaxim 90:c233d1c265ff 158 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 159 }
IanBenzMaxim 90:c233d1c265ff 160
IanBenzMaxim 90:c233d1c265ff 161 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 162 {
IanBenzMaxim 90:c233d1c265ff 163 result = master.OWWriteByte(OverdriveSkipRomCmd);
IanBenzMaxim 90:c233d1c265ff 164 }
IanBenzMaxim 90:c233d1c265ff 165
IanBenzMaxim 90:c233d1c265ff 166 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 167 {
IanBenzMaxim 90:c233d1c265ff 168 result = master.OWSetSpeed(OneWireMaster::OverdriveSpeed);
IanBenzMaxim 90:c233d1c265ff 169 }
IanBenzMaxim 90:c233d1c265ff 170
IanBenzMaxim 90:c233d1c265ff 171 return result;
IanBenzMaxim 90:c233d1c265ff 172 }
IanBenzMaxim 90:c233d1c265ff 173
IanBenzMaxim 90:c233d1c265ff 174 OneWireMaster::CmdResult OWOverdriveMatchRom(OneWireMaster & master, const RomId & romId)
IanBenzMaxim 90:c233d1c265ff 175 {
IanBenzMaxim 90:c233d1c265ff 176 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 177
IanBenzMaxim 90:c233d1c265ff 178 // use overdrive MatchROM
IanBenzMaxim 90:c233d1c265ff 179 master.OWSetSpeed(OneWireMaster::StandardSpeed);
IanBenzMaxim 90:c233d1c265ff 180
IanBenzMaxim 90:c233d1c265ff 181 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 182 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 183 {
IanBenzMaxim 90:c233d1c265ff 184 result = master.OWWriteByte(OverdriveMatchRomCmd);
IanBenzMaxim 90:c233d1c265ff 185 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 186 {
IanBenzMaxim 90:c233d1c265ff 187 master.OWSetSpeed(OneWireMaster::OverdriveSpeed);
IanBenzMaxim 90:c233d1c265ff 188 // send ROM
IanBenzMaxim 90:c233d1c265ff 189 result = master.OWWriteBlock(romId, RomId::byteLen);
IanBenzMaxim 90:c233d1c265ff 190 }
IanBenzMaxim 90:c233d1c265ff 191 }
IanBenzMaxim 90:c233d1c265ff 192 return result;
IanBenzMaxim 90:c233d1c265ff 193 }
IanBenzMaxim 90:c233d1c265ff 194
IanBenzMaxim 90:c233d1c265ff 195 OneWireMaster::CmdResult OWResume(OneWireMaster & master)
IanBenzMaxim 90:c233d1c265ff 196 {
IanBenzMaxim 90:c233d1c265ff 197 OneWireMaster::CmdResult result;
IanBenzMaxim 90:c233d1c265ff 198
IanBenzMaxim 90:c233d1c265ff 199 result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 200 if (result == OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 201 {
IanBenzMaxim 90:c233d1c265ff 202 result = master.OWWriteByte(ResumeCmd);
IanBenzMaxim 90:c233d1c265ff 203 }
IanBenzMaxim 90:c233d1c265ff 204
IanBenzMaxim 90:c233d1c265ff 205 return result;
IanBenzMaxim 90:c233d1c265ff 206 }
IanBenzMaxim 90:c233d1c265ff 207
IanBenzMaxim 90:c233d1c265ff 208 OneWireMaster::CmdResult OWSearch(OneWireMaster & master, SearchState & searchState)
IanBenzMaxim 90:c233d1c265ff 209 {
IanBenzMaxim 90:c233d1c265ff 210 uint8_t id_bit_number;
IanBenzMaxim 90:c233d1c265ff 211 uint8_t last_zero, rom_byte_number;
IanBenzMaxim 90:c233d1c265ff 212 uint8_t id_bit, cmp_id_bit;
IanBenzMaxim 90:c233d1c265ff 213 uint8_t rom_byte_mask;
IanBenzMaxim 90:c233d1c265ff 214 bool search_result;
IanBenzMaxim 90:c233d1c265ff 215 uint8_t crc8 = 0;
IanBenzMaxim 90:c233d1c265ff 216 OneWireMaster::SearchDirection search_direction;
IanBenzMaxim 90:c233d1c265ff 217
IanBenzMaxim 90:c233d1c265ff 218 // initialize for search
IanBenzMaxim 90:c233d1c265ff 219 id_bit_number = 1;
IanBenzMaxim 90:c233d1c265ff 220 last_zero = 0;
IanBenzMaxim 90:c233d1c265ff 221 rom_byte_number = 0;
IanBenzMaxim 90:c233d1c265ff 222 rom_byte_mask = 1;
IanBenzMaxim 90:c233d1c265ff 223 search_result = false;
IanBenzMaxim 90:c233d1c265ff 224
IanBenzMaxim 90:c233d1c265ff 225 // if the last call was not the last one
IanBenzMaxim 90:c233d1c265ff 226 if (!searchState.last_device_flag)
IanBenzMaxim 90:c233d1c265ff 227 {
IanBenzMaxim 90:c233d1c265ff 228 // 1-Wire reset
IanBenzMaxim 90:c233d1c265ff 229 OneWireMaster::CmdResult result = master.OWReset();
IanBenzMaxim 90:c233d1c265ff 230 if (result != OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 231 {
IanBenzMaxim 90:c233d1c265ff 232 // reset the search
IanBenzMaxim 90:c233d1c265ff 233 searchState.reset();
IanBenzMaxim 90:c233d1c265ff 234 return result;
IanBenzMaxim 90:c233d1c265ff 235 }
IanBenzMaxim 90:c233d1c265ff 236
IanBenzMaxim 90:c233d1c265ff 237 // issue the search command
IanBenzMaxim 90:c233d1c265ff 238 master.OWWriteByte(SearchRomCmd);
IanBenzMaxim 90:c233d1c265ff 239
IanBenzMaxim 90:c233d1c265ff 240 // loop to do the search
IanBenzMaxim 90:c233d1c265ff 241 do
IanBenzMaxim 90:c233d1c265ff 242 {
IanBenzMaxim 90:c233d1c265ff 243 // if this discrepancy if before the Last Discrepancy
IanBenzMaxim 90:c233d1c265ff 244 // on a previous next then pick the same as last time
IanBenzMaxim 90:c233d1c265ff 245 if (id_bit_number < searchState.last_discrepancy)
IanBenzMaxim 90:c233d1c265ff 246 {
IanBenzMaxim 90:c233d1c265ff 247 if ((searchState.romId[rom_byte_number] & rom_byte_mask) > 0)
IanBenzMaxim 90:c233d1c265ff 248 {
IanBenzMaxim 90:c233d1c265ff 249 search_direction = OneWireMaster::WriteOne;
IanBenzMaxim 90:c233d1c265ff 250 }
IanBenzMaxim 90:c233d1c265ff 251 else
IanBenzMaxim 90:c233d1c265ff 252 {
IanBenzMaxim 90:c233d1c265ff 253 search_direction = OneWireMaster::WriteZero;
IanBenzMaxim 90:c233d1c265ff 254 }
IanBenzMaxim 90:c233d1c265ff 255 }
IanBenzMaxim 90:c233d1c265ff 256 else
IanBenzMaxim 90:c233d1c265ff 257 {
IanBenzMaxim 90:c233d1c265ff 258 // if equal to last pick 1, if not then pick 0
IanBenzMaxim 90:c233d1c265ff 259 if (id_bit_number == searchState.last_discrepancy)
IanBenzMaxim 90:c233d1c265ff 260 {
IanBenzMaxim 90:c233d1c265ff 261 search_direction = OneWireMaster::WriteOne;
IanBenzMaxim 90:c233d1c265ff 262 }
IanBenzMaxim 90:c233d1c265ff 263 else
IanBenzMaxim 90:c233d1c265ff 264 {
IanBenzMaxim 90:c233d1c265ff 265 search_direction = OneWireMaster::WriteZero;
IanBenzMaxim 90:c233d1c265ff 266 }
IanBenzMaxim 90:c233d1c265ff 267 }
IanBenzMaxim 90:c233d1c265ff 268
IanBenzMaxim 90:c233d1c265ff 269 // Peform a triple operation on the DS2465 which will perform 2 read bits and 1 write bit
IanBenzMaxim 90:c233d1c265ff 270 result = master.OWTriplet(search_direction, id_bit, cmp_id_bit);
IanBenzMaxim 90:c233d1c265ff 271 if (result != OneWireMaster::Success)
IanBenzMaxim 90:c233d1c265ff 272 {
IanBenzMaxim 90:c233d1c265ff 273 return result;
IanBenzMaxim 90:c233d1c265ff 274 }
IanBenzMaxim 90:c233d1c265ff 275
IanBenzMaxim 90:c233d1c265ff 276 // check for no devices on 1-wire
IanBenzMaxim 90:c233d1c265ff 277 if (id_bit && cmp_id_bit)
IanBenzMaxim 90:c233d1c265ff 278 {
IanBenzMaxim 90:c233d1c265ff 279 break;
IanBenzMaxim 90:c233d1c265ff 280 }
IanBenzMaxim 90:c233d1c265ff 281 else
IanBenzMaxim 90:c233d1c265ff 282 {
IanBenzMaxim 90:c233d1c265ff 283 if (!id_bit && !cmp_id_bit && (search_direction == OneWireMaster::WriteZero))
IanBenzMaxim 90:c233d1c265ff 284 {
IanBenzMaxim 90:c233d1c265ff 285 last_zero = id_bit_number;
IanBenzMaxim 90:c233d1c265ff 286
IanBenzMaxim 90:c233d1c265ff 287 // check for Last discrepancy in family
IanBenzMaxim 90:c233d1c265ff 288 if (last_zero < 9)
IanBenzMaxim 90:c233d1c265ff 289 {
IanBenzMaxim 90:c233d1c265ff 290 searchState.last_family_discrepancy = last_zero;
IanBenzMaxim 90:c233d1c265ff 291 }
IanBenzMaxim 90:c233d1c265ff 292 }
IanBenzMaxim 90:c233d1c265ff 293
IanBenzMaxim 90:c233d1c265ff 294 // set or clear the bit in the ROM byte rom_byte_number
IanBenzMaxim 90:c233d1c265ff 295 // with mask rom_byte_mask
IanBenzMaxim 90:c233d1c265ff 296 if (search_direction == OneWireMaster::WriteOne)
IanBenzMaxim 90:c233d1c265ff 297 {
IanBenzMaxim 90:c233d1c265ff 298 searchState.romId[rom_byte_number] |= rom_byte_mask;
IanBenzMaxim 90:c233d1c265ff 299 }
IanBenzMaxim 90:c233d1c265ff 300 else
IanBenzMaxim 90:c233d1c265ff 301 {
IanBenzMaxim 90:c233d1c265ff 302 searchState.romId[rom_byte_number] &= (uint8_t)~rom_byte_mask;
IanBenzMaxim 90:c233d1c265ff 303 }
IanBenzMaxim 90:c233d1c265ff 304
IanBenzMaxim 90:c233d1c265ff 305 // increment the byte counter id_bit_number
IanBenzMaxim 90:c233d1c265ff 306 // and shift the mask rom_byte_mask
IanBenzMaxim 90:c233d1c265ff 307 id_bit_number++;
IanBenzMaxim 90:c233d1c265ff 308 rom_byte_mask <<= 1;
IanBenzMaxim 90:c233d1c265ff 309
IanBenzMaxim 90:c233d1c265ff 310 // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
IanBenzMaxim 90:c233d1c265ff 311 if (rom_byte_mask == 0)
IanBenzMaxim 90:c233d1c265ff 312 {
IanBenzMaxim 90:c233d1c265ff 313 crc8 = calculateCrc8(crc8, searchState.romId[rom_byte_number]); // accumulate the CRC
IanBenzMaxim 90:c233d1c265ff 314 rom_byte_number++;
IanBenzMaxim 90:c233d1c265ff 315 rom_byte_mask = 1;
IanBenzMaxim 90:c233d1c265ff 316 }
IanBenzMaxim 90:c233d1c265ff 317 }
IanBenzMaxim 90:c233d1c265ff 318 } while (rom_byte_number < RomId::byteLen); // loop until through all ROM bytes 0-7
IanBenzMaxim 90:c233d1c265ff 319
IanBenzMaxim 90:c233d1c265ff 320 // if the search was successful then
IanBenzMaxim 90:c233d1c265ff 321 if (!((id_bit_number <= (RomId::byteLen * 8)) || (crc8 != 0)))
IanBenzMaxim 90:c233d1c265ff 322 {
IanBenzMaxim 90:c233d1c265ff 323 // search successful so set m_last_discrepancy,m_last_device_flag,search_result
IanBenzMaxim 90:c233d1c265ff 324 searchState.last_discrepancy = last_zero;
IanBenzMaxim 90:c233d1c265ff 325
IanBenzMaxim 90:c233d1c265ff 326 // check for last device
IanBenzMaxim 90:c233d1c265ff 327 if (searchState.last_discrepancy == 0)
IanBenzMaxim 90:c233d1c265ff 328 {
IanBenzMaxim 90:c233d1c265ff 329 searchState.last_device_flag = true;
IanBenzMaxim 90:c233d1c265ff 330 }
IanBenzMaxim 90:c233d1c265ff 331
IanBenzMaxim 90:c233d1c265ff 332 search_result = true;
IanBenzMaxim 90:c233d1c265ff 333 }
IanBenzMaxim 90:c233d1c265ff 334 }
IanBenzMaxim 90:c233d1c265ff 335
IanBenzMaxim 90:c233d1c265ff 336 // if no device found then reset counters so next 'search' will be like a first
IanBenzMaxim 90:c233d1c265ff 337 if (!search_result || (searchState.romId.familyCode() == 0))
IanBenzMaxim 90:c233d1c265ff 338 {
IanBenzMaxim 90:c233d1c265ff 339 searchState.reset();
IanBenzMaxim 90:c233d1c265ff 340 search_result = false;
IanBenzMaxim 90:c233d1c265ff 341 }
IanBenzMaxim 90:c233d1c265ff 342
IanBenzMaxim 90:c233d1c265ff 343 return (search_result ? OneWireMaster::Success : OneWireMaster::OperationFailure);
IanBenzMaxim 90:c233d1c265ff 344 }
IanBenzMaxim 90:c233d1c265ff 345 }
IanBenzMaxim 90:c233d1c265ff 346 }