Implementation of 1-Wire with added Alarm Search Functionality
Dependents: Max32630_One_Wire_Interface
RomId/RomCommands.cpp@103:6dcbb5166da1, 2016-07-07 (annotated)
- Committer:
- IanBenzMaxim
- Date:
- Thu Jul 07 13:56:44 2016 -0500
- Revision:
- 103:6dcbb5166da1
- Parent:
- Slaves/RomCommands.cpp@90:c233d1c265ff
- Child:
- 104:3f48daed532b
Consolidate RomId functionality in top-level directory.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |