Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Thu May 12 14:38:16 2016 -0500
Revision:
73:2cecc1372acc
Parent:
OneWire_Switches/DS2413/ds2413.cpp@56:be69bd88a3e3
Child:
74:23be10c32fa3
Added namespaces. Renamed files and directories for consistency. Use <stdint.h> instead of <cstdint> since it is not supported by C++98.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 19:6d4c039a2d8e 1 /******************************************************************//**
j3 19:6d4c039a2d8e 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 19:6d4c039a2d8e 3 *
j3 19:6d4c039a2d8e 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 19:6d4c039a2d8e 5 * copy of this software and associated documentation files (the "Software"),
j3 19:6d4c039a2d8e 6 * to deal in the Software without restriction, including without limitation
j3 19:6d4c039a2d8e 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 19:6d4c039a2d8e 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 19:6d4c039a2d8e 9 * Software is furnished to do so, subject to the following conditions:
j3 19:6d4c039a2d8e 10 *
j3 19:6d4c039a2d8e 11 * The above copyright notice and this permission notice shall be included
j3 19:6d4c039a2d8e 12 * in all copies or substantial portions of the Software.
j3 19:6d4c039a2d8e 13 *
j3 19:6d4c039a2d8e 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 19:6d4c039a2d8e 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 19:6d4c039a2d8e 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 19:6d4c039a2d8e 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 19:6d4c039a2d8e 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 19:6d4c039a2d8e 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 19:6d4c039a2d8e 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 19:6d4c039a2d8e 21 *
j3 19:6d4c039a2d8e 22 * Except as contained in this notice, the name of Maxim Integrated
j3 19:6d4c039a2d8e 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 19:6d4c039a2d8e 24 * Products, Inc. Branding Policy.
j3 19:6d4c039a2d8e 25 *
j3 19:6d4c039a2d8e 26 * The mere transfer of this software does not imply any licenses
j3 19:6d4c039a2d8e 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 19:6d4c039a2d8e 28 * trademarks, maskwork rights, or any other form of intellectual
j3 19:6d4c039a2d8e 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 19:6d4c039a2d8e 30 * ownership rights.
j3 19:6d4c039a2d8e 31 **********************************************************************/
j3 19:6d4c039a2d8e 32
IanBenzMaxim 73:2cecc1372acc 33 #include "DS2413.h"
IanBenzMaxim 73:2cecc1372acc 34 #include "Masters/OneWireMasters.h"
j3 19:6d4c039a2d8e 35
IanBenzMaxim 73:2cecc1372acc 36 using OneWire::Switches::DS2413;
IanBenzMaxim 73:2cecc1372acc 37 using OneWire::Masters::OneWireMaster;
j3 19:6d4c039a2d8e 38
j3 19:6d4c039a2d8e 39 //*********************************************************************
IanBenzMaxim 73:2cecc1372acc 40 DS2413::DS2413(OneWireMaster &owm): _owm(owm)
j3 19:6d4c039a2d8e 41 {
j3 19:6d4c039a2d8e 42 }
j3 19:6d4c039a2d8e 43
j3 19:6d4c039a2d8e 44
j3 19:6d4c039a2d8e 45 //*********************************************************************
IanBenzMaxim 73:2cecc1372acc 46 DS2413::CmdResult DS2413::pio_access_read_chA(uint8_t & val)
j3 19:6d4c039a2d8e 47 {
IanBenzMaxim 73:2cecc1372acc 48 DS2413::CmdResult result = OpFailure;
j3 19:6d4c039a2d8e 49
IanBenzMaxim 73:2cecc1372acc 50 result = pio_access_read(val);
j3 19:6d4c039a2d8e 51
j3 19:6d4c039a2d8e 52 val = (val & 0x01);
j3 19:6d4c039a2d8e 53
j3 19:6d4c039a2d8e 54 return result;
j3 19:6d4c039a2d8e 55 }
j3 19:6d4c039a2d8e 56
j3 19:6d4c039a2d8e 57
j3 19:6d4c039a2d8e 58 //*********************************************************************
IanBenzMaxim 73:2cecc1372acc 59 DS2413::CmdResult DS2413::pio_access_read_chB(uint8_t & val)
j3 19:6d4c039a2d8e 60 {
IanBenzMaxim 73:2cecc1372acc 61 DS2413::CmdResult result = OpFailure;
j3 19:6d4c039a2d8e 62
IanBenzMaxim 73:2cecc1372acc 63 result = pio_access_read(val);
j3 19:6d4c039a2d8e 64
j3 19:6d4c039a2d8e 65 val = ((val >> 2) & 0x01);
j3 19:6d4c039a2d8e 66
j3 19:6d4c039a2d8e 67 return result;
j3 19:6d4c039a2d8e 68 }
j3 19:6d4c039a2d8e 69
j3 19:6d4c039a2d8e 70
j3 19:6d4c039a2d8e 71 //*********************************************************************
IanBenzMaxim 73:2cecc1372acc 72 DS2413::CmdResult DS2413::pio_access_write_chA(uint8_t val)
j3 19:6d4c039a2d8e 73 {
IanBenzMaxim 73:2cecc1372acc 74 DS2413::CmdResult result = OpFailure;
j3 19:6d4c039a2d8e 75
j3 19:6d4c039a2d8e 76 uint8_t local_val = 0;
j3 19:6d4c039a2d8e 77
j3 19:6d4c039a2d8e 78 //read current state of PIO
IanBenzMaxim 73:2cecc1372acc 79 result = pio_access_read(local_val);
j3 19:6d4c039a2d8e 80
IanBenzMaxim 73:2cecc1372acc 81 if(result == DS2413::Success)
j3 19:6d4c039a2d8e 82 {
j3 19:6d4c039a2d8e 83 //modify
j3 19:6d4c039a2d8e 84 //current state of pioB OR
j3 19:6d4c039a2d8e 85 //desired state of pioA OR
j3 19:6d4c039a2d8e 86 //bits[7:2] should all be 1, per datasheet
j3 54:08985bf69691 87 val = (0xFC | (((local_val >> 1) & 0x02) | (0x01 & val)));
j3 19:6d4c039a2d8e 88
j3 19:6d4c039a2d8e 89 //write, bit[1:0] new state of pio
IanBenzMaxim 73:2cecc1372acc 90 result = pio_access_write(val);
j3 19:6d4c039a2d8e 91 }
j3 19:6d4c039a2d8e 92
j3 19:6d4c039a2d8e 93 return result;
j3 19:6d4c039a2d8e 94 }
j3 19:6d4c039a2d8e 95
j3 19:6d4c039a2d8e 96
j3 19:6d4c039a2d8e 97 //*********************************************************************
IanBenzMaxim 73:2cecc1372acc 98 DS2413::CmdResult DS2413::pio_access_write_chB(uint8_t val)
j3 19:6d4c039a2d8e 99 {
IanBenzMaxim 73:2cecc1372acc 100 DS2413::CmdResult result = OpFailure;
j3 19:6d4c039a2d8e 101
j3 19:6d4c039a2d8e 102 uint8_t local_val = 0;
j3 19:6d4c039a2d8e 103
j3 19:6d4c039a2d8e 104 //read current state of PIO
IanBenzMaxim 73:2cecc1372acc 105 result = pio_access_read(local_val);
j3 19:6d4c039a2d8e 106
IanBenzMaxim 73:2cecc1372acc 107 if(result == DS2413::Success)
j3 19:6d4c039a2d8e 108 {
j3 19:6d4c039a2d8e 109 //modify
j3 19:6d4c039a2d8e 110 //current state of pioA OR
j3 19:6d4c039a2d8e 111 //desired state of pioB OR
j3 19:6d4c039a2d8e 112 //bits[7:2] should all be 1, per datasheet
j3 19:6d4c039a2d8e 113 val = (0xFC | ((local_val & 0x01) | (0x02 & (val << 1))));
j3 19:6d4c039a2d8e 114
j3 19:6d4c039a2d8e 115 //write, bit[1:0] new state of pio
IanBenzMaxim 73:2cecc1372acc 116 result = pio_access_write(val);
j3 19:6d4c039a2d8e 117 }
j3 19:6d4c039a2d8e 118
j3 19:6d4c039a2d8e 119 return result;
j3 19:6d4c039a2d8e 120 }
j3 19:6d4c039a2d8e 121
j3 19:6d4c039a2d8e 122
j3 19:6d4c039a2d8e 123 //*********************************************************************
IanBenzMaxim 73:2cecc1372acc 124 DS2413::CmdResult DS2413::pio_access_write_chAB(uint8_t val)
j3 54:08985bf69691 125 {
IanBenzMaxim 73:2cecc1372acc 126 return pio_access_write((0x03 & val) | 0xFC);
j3 54:08985bf69691 127 }
j3 54:08985bf69691 128
j3 54:08985bf69691 129
j3 54:08985bf69691 130 //*********************************************************************
IanBenzMaxim 73:2cecc1372acc 131 DS2413::CmdResult DS2413::pio_access_read(uint8_t & val)
j3 19:6d4c039a2d8e 132 {
IanBenzMaxim 73:2cecc1372acc 133 DS2413::CmdResult result = DS2413::OpFailure;
j3 19:6d4c039a2d8e 134
j3 23:e8e403d61359 135 OneWireMaster::CmdResult ow_result = _owm.OWMatchROM(romId);
j3 19:6d4c039a2d8e 136
j3 23:e8e403d61359 137 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 138 {
IanBenzMaxim 73:2cecc1372acc 139 ow_result = _owm.OWWriteByte(DS2413::PIO_ACCESS_READ);
j3 19:6d4c039a2d8e 140
j3 23:e8e403d61359 141 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 142 {
j3 19:6d4c039a2d8e 143 ow_result = _owm.OWReadByte(val);
j3 19:6d4c039a2d8e 144
j3 23:e8e403d61359 145 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 146 {
IanBenzMaxim 73:2cecc1372acc 147 result = DS2413::Success;
j3 19:6d4c039a2d8e 148 }
j3 19:6d4c039a2d8e 149 else
j3 19:6d4c039a2d8e 150 {
IanBenzMaxim 73:2cecc1372acc 151 result = DS2413::CommsReadError;
j3 19:6d4c039a2d8e 152 }
j3 19:6d4c039a2d8e 153 }
j3 19:6d4c039a2d8e 154 else
j3 19:6d4c039a2d8e 155 {
IanBenzMaxim 73:2cecc1372acc 156 result = DS2413::CommsWriteError;
j3 19:6d4c039a2d8e 157 }
j3 19:6d4c039a2d8e 158 }
j3 19:6d4c039a2d8e 159
j3 19:6d4c039a2d8e 160 return result;
j3 19:6d4c039a2d8e 161 }
j3 19:6d4c039a2d8e 162
j3 19:6d4c039a2d8e 163
j3 19:6d4c039a2d8e 164 //*********************************************************************
IanBenzMaxim 73:2cecc1372acc 165 DS2413::CmdResult DS2413::pio_access_write(uint8_t val)
j3 19:6d4c039a2d8e 166 {
IanBenzMaxim 73:2cecc1372acc 167 DS2413::CmdResult result = DS2413::OpFailure;
j3 19:6d4c039a2d8e 168
j3 23:e8e403d61359 169 OneWireMaster::CmdResult ow_result = _owm.OWMatchROM(romId);
j3 19:6d4c039a2d8e 170
j3 23:e8e403d61359 171 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 172 {
IanBenzMaxim 73:2cecc1372acc 173 uint8_t send_block[] = {DS2413::PIO_ACCESS_WRITE, val, ~val};
j3 19:6d4c039a2d8e 174
j3 19:6d4c039a2d8e 175 ow_result = _owm.OWWriteBlock(send_block, 3);
j3 23:e8e403d61359 176 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 177 {
j3 19:6d4c039a2d8e 178 uint8_t expected_status = ((0x01 & val) | ((0x01 & val) << 1) |
j3 19:6d4c039a2d8e 179 ((0x02 & val) << 1) | ((0x02 & val) << 2));
j3 19:6d4c039a2d8e 180
j3 19:6d4c039a2d8e 181 uint8_t rcv_block[2];
j3 19:6d4c039a2d8e 182 ow_result = _owm.OWReadBlock(rcv_block, 2);
j3 19:6d4c039a2d8e 183
j3 23:e8e403d61359 184 if(ow_result == OneWireMaster::Success)
j3 19:6d4c039a2d8e 185 {
j3 54:08985bf69691 186 if((rcv_block[0] == 0xAA) && ((rcv_block[1] & 0x0F) == expected_status))
j3 19:6d4c039a2d8e 187 {
IanBenzMaxim 73:2cecc1372acc 188 result = DS2413::Success;
j3 19:6d4c039a2d8e 189 }
j3 19:6d4c039a2d8e 190 }
j3 19:6d4c039a2d8e 191 else
j3 19:6d4c039a2d8e 192 {
IanBenzMaxim 73:2cecc1372acc 193 result = DS2413::CommsReadError;
j3 19:6d4c039a2d8e 194 }
j3 19:6d4c039a2d8e 195 }
j3 19:6d4c039a2d8e 196 else
j3 19:6d4c039a2d8e 197 {
IanBenzMaxim 73:2cecc1372acc 198 result = DS2413::CommsWriteError;
j3 19:6d4c039a2d8e 199 }
j3 19:6d4c039a2d8e 200 }
j3 19:6d4c039a2d8e 201
j3 19:6d4c039a2d8e 202 return result;
j3 19:6d4c039a2d8e 203 }