Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Sat May 14 14:27:56 2016 -0500
Revision:
76:84e6c4994e29
Move ROM commands outside of OneWireMaster to increase cohesiveness of the class. Do not use subdivide OneWire namespace since it will likely not provide value on this project.

Who changed what in which revision?

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