Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Revision:
78:0cbbac7f2016
Parent:
77:529edb329ee0
--- a/Bridge/DS28E17/DS28E17.cpp	Mon May 16 10:36:30 2016 -0500
+++ b/Bridge/DS28E17/DS28E17.cpp	Mon May 16 15:18:09 2016 -0500
@@ -32,10 +32,11 @@
 
 #include "DS28E17.h"
 #include "Masters/OneWireMaster.h"
+#include "crc.h"
 
 using OneWire::DS28E17;
 using OneWire::OneWireMaster;
-
+using namespace OneWire::crc;
 
 enum Command
 {
@@ -52,9 +53,6 @@
 };
 
 
-const uint16_t DS28E17::_oddparity[] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 };
-
-
 //*********************************************************************
 DS28E17::DS28E17(RandomAccessRomIterator &selector)
     : OneWireSlave(selector)
@@ -78,33 +76,33 @@
     if (ow_result == OneWireMaster::Success)
     {
         //seed the crc
-        _crc16 = 0;
+        uint16_t crc16 = 0;
 
         // Form the 1-Wire Packet 
 
         // I2C Write Data with Stop command
         send_block[send_cnt] = WriteDataWithStopCmd;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // I2C Address
         send_block[send_cnt] = I2C_addr;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Length field
         send_block[send_cnt] = length;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Form the write data  
         for (size_t idx = 0; idx < length; idx++)
         {
             send_block[send_cnt] = data[idx];
-            docrc16(send_block[send_cnt++]);
+            crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
         }
 
         // Form the CRC16
-        _crc16 = _crc16 ^ 0xFFFF;
-        send_block[send_cnt++] = ((uint8_t)(_crc16 & 0xFF));
-        send_block[send_cnt++] = ((uint8_t)((_crc16 >> 8) & 0xFF));
+        crc16 ^= 0xFFFF;
+        send_block[send_cnt++] = ((uint8_t)(crc16 & 0xFF));
+        send_block[send_cnt++] = ((uint8_t)((crc16 >> 8) & 0xFF));
 
         // Send Packet
         bridge_result = send_packet(send_block, send_cnt, status, wr_status);
@@ -129,31 +127,31 @@
     if (ow_result == OneWireMaster::Success)
     {
         // seed the crc
-        _crc16 = 0;
+        uint16_t crc16 = 0;
 
         // I2C Write Data with Stop command
         send_block[send_cnt] = WriteDataNoStopCmd;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // I2C Address
         send_block[send_cnt] = I2C_addr;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Length field
         send_block[send_cnt] = length;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Form the write data
         for (size_t idx = 0; idx < length; idx++)
         {
             send_block[send_cnt] = data[idx];
-            docrc16(send_block[send_cnt++]);
+            crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
         }
 
         // Form the CRC16
-        _crc16 = _crc16 ^ 0xFFFF;
-        send_block[send_cnt++] = ((uint8_t)(_crc16 & 0xFF));
-        send_block[send_cnt++] = ((uint8_t)((_crc16 >> 8) & 0xFF));
+        crc16 ^= 0xFFFF;
+        send_block[send_cnt++] = ((uint8_t)(crc16 & 0xFF));
+        send_block[send_cnt++] = ((uint8_t)((crc16 >> 8) & 0xFF));
 
         // Send Packet
         bridge_result = send_packet(send_block, send_cnt, status, wr_status);
@@ -177,29 +175,29 @@
     if (ow_result == OneWireMaster::Success)
     {
         // seed the crc
-        _crc16 = 0;
+        uint16_t crc16 = 0;
 
         // Form the 1-Wire Packet
 
         // I2C Write Data with Stop command
         send_block[send_cnt] = WriteDataOnlyCmd;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Length field
         send_block[send_cnt] = length;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Form the write data
         for (size_t idx = 0; idx < length; idx++)
         {
             send_block[send_cnt] = data[idx];
-            docrc16(send_block[send_cnt++]);
+            crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
         }
 
-        // Form the CRC16\
-        _crc16 = _crc16^0xFFFF;
-        send_block[send_cnt++] = (_crc16 & 0xFF);
-        send_block[send_cnt++] = ((_crc16 >> 8) & 0xFF);
+        // Form the CRC16
+        crc16 ^= 0xFFFF;
+        send_block[send_cnt++] = (crc16 & 0xFF);
+        send_block[send_cnt++] = ((crc16 >> 8) & 0xFF);
 
         // Send Packet
         bridge_result = send_packet(send_block, send_cnt, status, wr_status);
@@ -223,29 +221,29 @@
     if (ow_result == OneWireMaster::Success)
     {
         //seed the crc
-        _crc16 = 0;
+        uint16_t crc16 = 0;
 
         // Form the 1-Wire Packet
 
         // I2C Write Data with Stop command
         send_block[send_cnt] = WriteDataOnlyWithStopCmd;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Length field
         send_block[send_cnt] = length;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Form the write data
         for (size_t idx = 0; idx < length; idx++)
         {
             send_block[send_cnt] = data[idx];
-            docrc16(send_block[send_cnt++]);
+            crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
         }
 
         // Form the CRC16
-        _crc16 = _crc16 ^ 0xFFFF;
-        send_block[send_cnt++] = (_crc16 & 0xFF);
-        send_block[send_cnt++] = ((_crc16 >> 8) & 0xFF);
+        crc16 ^= 0xFFFF;
+        send_block[send_cnt++] = (crc16 & 0xFF);
+        send_block[send_cnt++] = ((crc16 >> 8) & 0xFF);
 
         // Send Packet
         bridge_result = send_packet(send_block, send_cnt, status, wr_status);
@@ -272,37 +270,37 @@
     if (ow_result == OneWireMaster::Success)
     {
         //seed the crc
-        _crc16 = 0;
+        uint16_t crc16 = 0;
 
         // Form the 1-Wire Packet
 
         // I2C Write Data with Stop command
         send_block[send_cnt] = WriteReadDataWithStopCmd;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // I2C Address
         send_block[send_cnt] = I2C_addr;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Length field
         send_block[send_cnt] = length;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Form the write data
         for (idx = 0; idx < length; idx++)
         {
             send_block[send_cnt] = data[idx];
-            docrc16(send_block[send_cnt++]);
+            crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
         }
 
         // # of bytes to Read field
         send_block[send_cnt] = nu_bytes_read;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Form the CRC16
-        _crc16 = _crc16 ^ 0xFFFF;
-        send_block[send_cnt++] = (_crc16 & 0xFF);
-        send_block[send_cnt++] = ((_crc16 >> 8) & 0xFF);
+        crc16 ^= 0xFFFF;
+        send_block[send_cnt++] = (crc16 & 0xFF);
+        send_block[send_cnt++] = ((crc16 >> 8) & 0xFF);
 
         // Send Packet
         bridge_result = send_packet(send_block, send_cnt, status, wr_status);
@@ -338,26 +336,26 @@
     if (ow_result == OneWireMaster::Success)
     {
         //seed the crc for transmit bytes
-        _crc16 = 0;
+        uint16_t crc16 = 0;
 
         // Form the 1-Wire Packet to send
 
         // I2C Write Data with Stop command
         send_block[send_cnt] = ReadDataWithStopCmd;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // I2C Address
         send_block[send_cnt] = I2C_addr;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // # of bytes to Read field
         send_block[send_cnt] = nu_bytes_read;
-        docrc16(send_block[send_cnt++]);
+        crc16 = calculateCrc16(crc16, send_block[send_cnt++]);
 
         // Form the CRC16
-        _crc16 = _crc16 ^ 0xFFFF;
-        send_block[send_cnt++] = (_crc16 & 0xFF);
-        send_block[send_cnt++] = ((_crc16 >> 8) & 0xFF);
+        crc16 ^= 0xFFFF;
+        send_block[send_cnt++] = (crc16 & 0xFF);
+        send_block[send_cnt++] = ((crc16 >> 8) & 0xFF);
 
         // Send Packet
         bridge_result = send_packet(send_block, send_cnt, status);
@@ -394,7 +392,6 @@
         ow_result = master().OWWriteBlock(send_block, 2);
         if (ow_result == OneWireMaster::Success)
         {
-            _i2c_speed = data & 0x03; // Save off _i2c_speed setting to be used by other functions
             bridge_result = DS28E17::Success;
         }
         else
@@ -499,26 +496,6 @@
 
 
 //*********************************************************************
-uint16_t DS28E17::docrc16(uint16_t data)
-{
-    data = ((data ^ (_crc16 & 0xff)) & 0xff);
-    _crc16 >>= 8;
-
-    if (DS28E17::_oddparity[data & 0xf] ^ DS28E17::_oddparity[data >> 4])
-    {
-        _crc16 ^= 0xc001;
-    }
-
-    data <<= 6;
-    _crc16 ^= data;
-    data <<= 1;
-    _crc16 ^= data;
-
-    return _crc16;
-}
-
-
-//*********************************************************************
 DS28E17::CmdResult DS28E17::send_packet(const uint8_t * data, uint8_t data_length,
                                         uint8_t & status, uint8_t & wr_status)
 {