X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=rf433ctl%2FOneWire%2FOneWire.h;fp=rf433ctl%2FOneWire%2FOneWire.h;h=c579b9488d27c780ff56dfd220aab580919bc5f7;hb=d28fbe27742a031f5bc5c39cd3b5588a39423162;hp=0000000000000000000000000000000000000000;hpb=b654506283c4f625e5ade66e2bc5eb22ad4d1545;p=svn42.git diff --git a/rf433ctl/OneWire/OneWire.h b/rf433ctl/OneWire/OneWire.h new file mode 100644 index 0000000..c579b94 --- /dev/null +++ b/rf433ctl/OneWire/OneWire.h @@ -0,0 +1,110 @@ +#ifndef OneWire_h +#define OneWire_h + +#include + +// you can exclude onewire_search by defining that to 0 +#ifndef ONEWIRE_SEARCH +#define ONEWIRE_SEARCH 1 +#endif + +// You can exclude CRC checks altogether by defining this to 0 +#ifndef ONEWIRE_CRC +#define ONEWIRE_CRC 1 +#endif + +// Select the table-lookup method of computing the 8-bit CRC +// by setting this to 1. The lookup table no longer consumes +// limited RAM, but enlarges total code size by about 250 bytes +#ifndef ONEWIRE_CRC8_TABLE +#define ONEWIRE_CRC8_TABLE 0 +#endif + +// You can allow 16-bit CRC checks by defining this to 1 +// (Note that ONEWIRE_CRC must also be 1.) +#ifndef ONEWIRE_CRC16 +#define ONEWIRE_CRC16 0 +#endif + +#define FALSE 0 +#define TRUE 1 + +class OneWire +{ + private: + uint8_t bitmask; + volatile uint8_t *baseReg; + +#if ONEWIRE_SEARCH + // global search state + unsigned char ROM_NO[8]; + uint8_t LastDiscrepancy; + uint8_t LastFamilyDiscrepancy; + uint8_t LastDeviceFlag; +#endif + + public: + OneWire( uint8_t pin); + + // Perform a 1-Wire reset cycle. Returns 1 if a device responds + // with a presence pulse. Returns 0 if there is no device or the + // bus is shorted or otherwise held low for more than 250uS + uint8_t reset(void); + + // Issue a 1-Wire rom select command, you do the reset first. + void select( uint8_t rom[8]); + + // Issue a 1-Wire rom skip command, to address all on bus. + void skip(void); + + // Write a byte. If 'power' is one then the wire is held high at + // the end for parasitically powered devices. You are responsible + // for eventually depowering it by calling depower() or doing + // another read or write. + void write(uint8_t v, uint8_t power = 0); + + // Read a byte. + uint8_t read(void); + + // Write a bit. The bus is always left powered at the end, see + // note in write() about that. + void write_bit(uint8_t v); + + // Read a bit. + uint8_t read_bit(void); + + // Stop forcing power onto the bus. You only need to do this if + // you used the 'power' flag to write() or used a write_bit() call + // and aren't about to do another read or write. You would rather + // not leave this powered if you don't have to, just in case + // someone shorts your bus. + void depower(void); + +#if ONEWIRE_SEARCH + // Clear the search state so that if will start from the beginning again. + void reset_search(); + + // Look for the next device. Returns 1 if a new address has been + // returned. A zero might mean that the bus is shorted, there are + // no devices, or you have already retrieved all of them. It + // might be a good idea to check the CRC to make sure you didn't + // get garbage. The order is deterministic. You will always get + // the same devices in the same order. + uint8_t search(uint8_t *newAddr); +#endif + +#if ONEWIRE_CRC + // Compute a Dallas Semiconductor 8 bit CRC, these are used in the + // ROM and scratchpad registers. + static uint8_t crc8( uint8_t *addr, uint8_t len); + +#if ONEWIRE_CRC16 + // Compute a Dallas Semiconductor 16 bit CRC. Maybe. I don't have + // any devices that use this so this might be wrong. I just copied + // it from their sample code. + static unsigned short crc16(unsigned short *data, unsigned short len); +#endif +#endif +}; + +#endif