Implementation of 1-Wire with added Alarm Search Functionality
Dependents: Max32630_One_Wire_Interface
Diff: RomIterator.h
- Revision:
- 77:529edb329ee0
- Child:
- 78:0cbbac7f2016
diff -r 84e6c4994e29 -r 529edb329ee0 RomIterator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RomIterator.h Mon May 16 10:36:30 2016 -0500 @@ -0,0 +1,108 @@ +#ifndef OneWire_RomIterator +#define OneWire_RomIterator + +#include <stdint.h> +#include "Masters/OneWireMaster.h" + +namespace OneWire +{ + /// Controls selection of 1-Wire devices on the bus through ROM commands. + class RomIterator + { + private: + OneWireMaster & owMaster; + + public: + /// @param master 1-Wire master to use to issue ROM commands. + RomIterator(OneWireMaster & master) : owMaster(master) { } + virtual ~RomIterator() { } + + /// The 1-Wire master used to issue ROM commands. + OneWireMaster & master() const { return owMaster; } + }; + + /// Iterates through all 1-Wire devices in a sequential first to last order. + class ForwardRomIterator : public RomIterator + { + public: + /// @param master 1-Wire master to use to issue ROM commands. + ForwardRomIterator(OneWireMaster & master) : RomIterator(master) { } + + /// Indicates that current device is the last. + virtual bool lastDevice() const = 0; + + /// Select the first device in the sequence. + virtual OneWireMaster::CmdResult selectFirstDevice() = 0; + + /// Select the next device in the sequence. + virtual OneWireMaster::CmdResult selectNextDevice() = 0; + + /// Reselect the current device for an additional operation. + virtual OneWireMaster::CmdResult reselectCurrentDevice() = 0; + }; + + /// Iterates through all 1-Wire devices sequentially using the search procedure. + class ForwardSearchRomIterator : public ForwardRomIterator + { + protected: + OneWireMaster::SearchState searchState; + + public: + /// @param master 1-Wire master to use to issue ROM commands. + ForwardSearchRomIterator(OneWireMaster & master) : ForwardRomIterator(master) { } + + /// ROM ID of the currently selected device. + const RomId & selectedDevice() const { return searchState.romId; } + + virtual bool lastDevice() const; + virtual OneWireMaster::CmdResult selectFirstDevice(); + virtual OneWireMaster::CmdResult selectNextDevice(); + virtual OneWireMaster::CmdResult reselectCurrentDevice(); + + /// Select the first device in the sequence beginning with the given family. + /// @param familyCode Family code to select. + OneWireMaster::CmdResult selectFirstDeviceInFamily(uint8_t familyCode); + + /// Select the first device in the next sequential family skipping all remaining devices + /// in the current family. + OneWireMaster::CmdResult selectNextFamilyDevice(); + }; + + /// Iterates though 1-Wire devices on the bus using random selection by ROM ID. + class RandomAccessRomIterator : public RomIterator + { + public: + /// @param master 1-Wire master to use to issue ROM commands. + RandomAccessRomIterator(OneWireMaster & master) : RomIterator(master) { } + + /// Select the device with the given ROM ID. + virtual OneWireMaster::CmdResult selectDevice(const RomId & romId) = 0; + }; + + /// Iterator for a singledrop 1-Wire bus. + class SingledropRomIterator : public RandomAccessRomIterator + { + public: + /// @param master 1-Wire master to use to issue ROM commands. + SingledropRomIterator(OneWireMaster & master) : RandomAccessRomIterator(master) { } + + /// Select the one and only device. + OneWireMaster::CmdResult selectDevice() { return master().OWSkipRom(); } + virtual OneWireMaster::CmdResult selectDevice(const RomId & romId); + }; + + /// Iterator for a multidrop 1-Wire bus. + class MultidropRomIterator : public RandomAccessRomIterator + { + protected: + RomId lastRom; + + public: + /// @param master 1-Wire master to use to issue ROM commands. + MultidropRomIterator(OneWireMaster & master) : RandomAccessRomIterator(master) { } + + virtual OneWireMaster::CmdResult selectDevice(const RomId & romId); + }; +} + +#endif