Implementation of 1-Wire with added Alarm Search Functionality
Dependents: Max32630_One_Wire_Interface
RomCommands.cpp@76:84e6c4994e29, 2016-05-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |