mbed code for MAXREFDES131 Qt GUI demo

Dependencies:   OWGridEye OneWire mbed

Committer:
j3
Date:
Fri Dec 02 19:34:37 2016 +0000
Revision:
4:7c61c45e12ee
Parent:
0:bd523ea97465
Update ow lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 0:bd523ea97465 1 /**********************************************************************
j3 0:bd523ea97465 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 0:bd523ea97465 3 *
j3 0:bd523ea97465 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 0:bd523ea97465 5 * copy of this software and associated documentation files (the "Software"),
j3 0:bd523ea97465 6 * to deal in the Software without restriction, including without limitation
j3 0:bd523ea97465 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 0:bd523ea97465 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 0:bd523ea97465 9 * Software is furnished to do so, subject to the following conditions:
j3 0:bd523ea97465 10 *
j3 0:bd523ea97465 11 * The above copyright notice and this permission notice shall be included
j3 0:bd523ea97465 12 * in all copies or substantial portions of the Software.
j3 0:bd523ea97465 13 *
j3 0:bd523ea97465 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 0:bd523ea97465 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 0:bd523ea97465 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 0:bd523ea97465 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 0:bd523ea97465 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 0:bd523ea97465 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 0:bd523ea97465 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 0:bd523ea97465 21 *
j3 0:bd523ea97465 22 * Except as contained in this notice, the name of Maxim Integrated
j3 0:bd523ea97465 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 0:bd523ea97465 24 * Products, Inc. Branding Policy.
j3 0:bd523ea97465 25 *
j3 0:bd523ea97465 26 * The mere transfer of this software does not imply any licenses
j3 0:bd523ea97465 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 0:bd523ea97465 28 * trademarks, maskwork rights, or any other form of intellectual
j3 0:bd523ea97465 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 0:bd523ea97465 30 * ownership rights.
j3 0:bd523ea97465 31 **********************************************************************/
j3 0:bd523ea97465 32
j3 0:bd523ea97465 33
j3 0:bd523ea97465 34 #include "maxrefdes131_demo.h"
j3 0:bd523ea97465 35
j3 0:bd523ea97465 36
j3 0:bd523ea97465 37 //*********************************************************************
j3 0:bd523ea97465 38 void print_rom_id(Serial & comms, RomId & romId)
j3 0:bd523ea97465 39 {
j3 0:bd523ea97465 40 //print the rom number
j3 0:bd523ea97465 41 for(uint8_t idx = 0; idx < RomId::byteLen; idx++)
j3 0:bd523ea97465 42 {
j3 0:bd523ea97465 43 comms.printf("0x%2x ", romId[idx]);
j3 0:bd523ea97465 44 }
j3 0:bd523ea97465 45 comms.printf("\n");
j3 0:bd523ea97465 46 }
j3 0:bd523ea97465 47
j3 0:bd523ea97465 48
j3 0:bd523ea97465 49 //*********************************************************************
j3 0:bd523ea97465 50 uint8_t init_sensor_state(OneWireMaster & owm, Serial & comms)
j3 0:bd523ea97465 51 {
j3 0:bd523ea97465 52 OneWireMaster::CmdResult ow_result = owm.OWReset();
j3 0:bd523ea97465 53 SearchState search_state;
j3 0:bd523ea97465 54 MultidropRomIterator selector(owm);
j3 0:bd523ea97465 55
j3 0:bd523ea97465 56 DS2413 * p_ow_switch;
j3 0:bd523ea97465 57
j3 0:bd523ea97465 58 uint8_t num_sensors = 0;
j3 0:bd523ea97465 59 uint8_t num_sensors_old = 0;
j3 0:bd523ea97465 60
j3 0:bd523ea97465 61 if(ow_result == OneWireMaster::Success)
j3 0:bd523ea97465 62 {
j3 0:bd523ea97465 63 /*this loop will run at least twice. Each time a branch is closed
j3 0:bd523ea97465 64 OWFirst is called in order to make sure all sensors are found.
j3 0:bd523ea97465 65 When num_sensors == num_sensors_old, all sensors should have been found
j3 0:bd523ea97465 66 */
j3 0:bd523ea97465 67 do
j3 0:bd523ea97465 68 {
j3 0:bd523ea97465 69 num_sensors_old = num_sensors;
j3 0:bd523ea97465 70 num_sensors = 0;
j3 0:bd523ea97465 71
j3 0:bd523ea97465 72 ow_result = OWFirst(owm, search_state);
j3 0:bd523ea97465 73
j3 0:bd523ea97465 74 while(ow_result == OneWireMaster::Success)
j3 0:bd523ea97465 75 {
j3 0:bd523ea97465 76 if(search_state.romId.familyCode() == OWGridEye::DS2413_FAMILY_CODE)
j3 0:bd523ea97465 77 {
j3 0:bd523ea97465 78 num_sensors++;
j3 0:bd523ea97465 79
j3 0:bd523ea97465 80 p_ow_switch = new DS2413(selector);
j3 0:bd523ea97465 81
j3 0:bd523ea97465 82 p_ow_switch->setRomId(search_state.romId);
j3 0:bd523ea97465 83
j3 0:bd523ea97465 84 p_ow_switch->pioAccessWriteChAB(0);
j3 0:bd523ea97465 85
j3 0:bd523ea97465 86 delete p_ow_switch;
j3 0:bd523ea97465 87 }
j3 0:bd523ea97465 88
j3 0:bd523ea97465 89 ow_result = OWNext(owm, search_state);
j3 0:bd523ea97465 90 }
j3 0:bd523ea97465 91 }
j3 0:bd523ea97465 92 while(num_sensors > num_sensors_old);
j3 0:bd523ea97465 93
j3 0:bd523ea97465 94 //Disconnect all branches and GridEYE sensors for proper enumeration
j3 0:bd523ea97465 95 if(num_sensors > 0)
j3 0:bd523ea97465 96 {
j3 0:bd523ea97465 97 //set all sensors to default state
j3 0:bd523ea97465 98 uint8_t write_val = 0xFD;
j3 0:bd523ea97465 99 uint8_t send_block[] = {0x5A, write_val, ~write_val};
j3 0:bd523ea97465 100
j3 0:bd523ea97465 101 ow_result = OWSkipRom(owm);
j3 0:bd523ea97465 102 if(ow_result == OneWireMaster::Success)
j3 0:bd523ea97465 103 {
j3 0:bd523ea97465 104 ow_result = owm.OWWriteBlock(send_block, 3);
j3 0:bd523ea97465 105 }
j3 0:bd523ea97465 106
j3 0:bd523ea97465 107 if(ow_result != OneWireMaster::Success)
j3 0:bd523ea97465 108 {
j3 0:bd523ea97465 109 comms.printf("MBED: Failed to init sensors\n");
j3 0:bd523ea97465 110 }
j3 0:bd523ea97465 111 }
j3 0:bd523ea97465 112 }
j3 0:bd523ea97465 113
j3 0:bd523ea97465 114 return num_sensors;
j3 0:bd523ea97465 115 }
j3 0:bd523ea97465 116
j3 0:bd523ea97465 117
j3 0:bd523ea97465 118 //*********************************************************************
j3 0:bd523ea97465 119 uint8_t enumerate_sensors(Serial & comms, OneWireMaster & owm, RandomAccessRomIterator & selector, OWGridEye * array[])
j3 0:bd523ea97465 120 {
j3 0:bd523ea97465 121 OWGridEye * p_sensor;
j3 0:bd523ea97465 122 OWGridEye::CmdResult sensor_result;
j3 0:bd523ea97465 123
j3 0:bd523ea97465 124 RomId temp_rom;
j3 0:bd523ea97465 125
j3 0:bd523ea97465 126 uint8_t num_sensors = 0;
j3 0:bd523ea97465 127 uint8_t num_sensors_old = 0;
j3 0:bd523ea97465 128
j3 0:bd523ea97465 129 uint8_t array_idx = 0;
j3 0:bd523ea97465 130
j3 0:bd523ea97465 131 uint8_t idx;
j3 0:bd523ea97465 132
j3 0:bd523ea97465 133 bool sensor_exists = false;
j3 0:bd523ea97465 134
j3 0:bd523ea97465 135 OneWireMaster::CmdResult ow_result = owm.OWReset();
j3 0:bd523ea97465 136 SearchState search_state;
j3 0:bd523ea97465 137
j3 0:bd523ea97465 138 if(ow_result == OneWireMaster::Success)
j3 0:bd523ea97465 139 {
j3 0:bd523ea97465 140 do
j3 0:bd523ea97465 141 {
j3 0:bd523ea97465 142 num_sensors_old = num_sensors;
j3 0:bd523ea97465 143 num_sensors = 0;
j3 0:bd523ea97465 144
j3 0:bd523ea97465 145 ow_result = OWFirst(owm, search_state);
j3 0:bd523ea97465 146
j3 0:bd523ea97465 147 while(ow_result == OneWireMaster::Success)
j3 0:bd523ea97465 148 {
j3 0:bd523ea97465 149 num_sensors++;
j3 0:bd523ea97465 150
j3 0:bd523ea97465 151 if(search_state.romId.familyCode() == OWGridEye::DS2413_FAMILY_CODE)
j3 0:bd523ea97465 152 {
j3 0:bd523ea97465 153 //check if sensor already exists
j3 0:bd523ea97465 154 sensor_exists = false;
j3 0:bd523ea97465 155 for(idx = 0; idx < array_idx; idx++)
j3 0:bd523ea97465 156 {
j3 0:bd523ea97465 157 p_sensor = array[idx];
j3 0:bd523ea97465 158
j3 0:bd523ea97465 159 if(p_sensor->getOWSwitchRomId() == search_state.romId)
j3 0:bd523ea97465 160 {
j3 0:bd523ea97465 161 sensor_exists = true;
j3 0:bd523ea97465 162 }
j3 0:bd523ea97465 163 }
j3 0:bd523ea97465 164
j3 0:bd523ea97465 165 //if sensor doesn't already exist add to array
j3 0:bd523ea97465 166 if(!sensor_exists)
j3 0:bd523ea97465 167 {
j3 0:bd523ea97465 168 p_sensor = new OWGridEye(selector);
j3 0:bd523ea97465 169
j3 0:bd523ea97465 170 p_sensor->setOWSwitchRomId(search_state.romId);
j3 0:bd523ea97465 171
j3 0:bd523ea97465 172 sensor_result = p_sensor->connectGridEye();
j3 0:bd523ea97465 173 if(sensor_result == OWGridEye::Success)
j3 0:bd523ea97465 174 {
j3 0:bd523ea97465 175 search_state.findFamily(OWGridEye::DS28E17_FAMILY_CODE);
j3 0:bd523ea97465 176 ow_result = OWNext(owm, search_state);
j3 0:bd523ea97465 177 if(ow_result == OneWireMaster::Success)
j3 0:bd523ea97465 178 {
j3 0:bd523ea97465 179 p_sensor->setI2CBridgeRomId(search_state.romId);
j3 0:bd523ea97465 180
j3 0:bd523ea97465 181 array[array_idx++] = p_sensor;
j3 0:bd523ea97465 182
j3 0:bd523ea97465 183 comms.printf("MBED: DS2413 romId = ");
j3 0:bd523ea97465 184 temp_rom = p_sensor->getOWSwitchRomId();
j3 0:bd523ea97465 185 print_rom_id(comms,temp_rom);
j3 0:bd523ea97465 186 comms.printf("MBED: DS28E17 romId = ");
j3 0:bd523ea97465 187 temp_rom = p_sensor->getI2CBridgeRomId();
j3 0:bd523ea97465 188 print_rom_id(comms, temp_rom);
j3 0:bd523ea97465 189
j3 0:bd523ea97465 190 sensor_result = p_sensor->disconnectGridEye();
j3 0:bd523ea97465 191 if(sensor_result == OWGridEye::OpFailure)
j3 0:bd523ea97465 192 {
j3 0:bd523ea97465 193 comms.printf("MBED: Failed to disconnect sensor\n");
j3 0:bd523ea97465 194 mbed_die();
j3 0:bd523ea97465 195 }
j3 0:bd523ea97465 196
j3 0:bd523ea97465 197 sensor_result = p_sensor->connectOWbus();
j3 0:bd523ea97465 198 if(sensor_result == OWGridEye::OpFailure)
j3 0:bd523ea97465 199 {
j3 0:bd523ea97465 200 comms.printf("MBED: Failed to connect ow branch %d\n", array_idx);
j3 0:bd523ea97465 201 mbed_die();
j3 0:bd523ea97465 202 }
j3 0:bd523ea97465 203 }
j3 0:bd523ea97465 204 else
j3 0:bd523ea97465 205 {
j3 0:bd523ea97465 206 comms.printf("MBED: Failed to find DS28E17\n", array_idx);
j3 0:bd523ea97465 207 }
j3 0:bd523ea97465 208 }
j3 0:bd523ea97465 209 else
j3 0:bd523ea97465 210 {
j3 0:bd523ea97465 211 comms.printf("MBED: Failed to connect GridEye\n", array_idx);
j3 0:bd523ea97465 212 }
j3 0:bd523ea97465 213 }
j3 0:bd523ea97465 214 }
j3 0:bd523ea97465 215
j3 0:bd523ea97465 216 ow_result = OWNext(owm, search_state);
j3 0:bd523ea97465 217 }
j3 0:bd523ea97465 218 }
j3 0:bd523ea97465 219 while(num_sensors > num_sensors_old);
j3 0:bd523ea97465 220 }
j3 0:bd523ea97465 221
j3 0:bd523ea97465 222
j3 0:bd523ea97465 223 return array_idx;
j3 0:bd523ea97465 224 }
j3 0:bd523ea97465 225
j3 0:bd523ea97465 226
j3 0:bd523ea97465 227 //*********************************************************************
j3 0:bd523ea97465 228 void send_data(Serial & comms, float * data_buffer, float therm_temp)
j3 0:bd523ea97465 229 {
j3 0:bd523ea97465 230 comms.printf("DATA: ");
j3 0:bd523ea97465 231 wait_us(1000);
j3 0:bd523ea97465 232 for(uint8_t idx = 0; idx < 64; idx++)
j3 0:bd523ea97465 233 {
j3 0:bd523ea97465 234 comms.printf("%.3f ", data_buffer[idx]);
j3 0:bd523ea97465 235 wait_us(1000);
j3 0:bd523ea97465 236
j3 0:bd523ea97465 237 if(((idx+1) % 8) == 0)
j3 0:bd523ea97465 238 {
j3 0:bd523ea97465 239 comms.printf("\nDATA: ");
j3 0:bd523ea97465 240 wait_us(1000);
j3 0:bd523ea97465 241 }
j3 0:bd523ea97465 242 }
j3 0:bd523ea97465 243 comms.printf("%.3f \n", therm_temp);
j3 0:bd523ea97465 244 wait_us(1000);
j3 0:bd523ea97465 245 }