PICO I2C FW

Dependencies:   USBDevice

Committer:
cyberjoey
Date:
Fri Jul 06 20:32:03 2018 +0000
Revision:
15:61dce4bef44f
Parent:
14:480f2398fe6a
Child:
16:2f373d3c8214
changed serial to non-blocking so code will continue even when serial connection is not present

Who changed what in which revision?

UserRevisionLine numberNew contents of line
switches 0:60a522ae2e35 1 #include "mbed.h"
switches 1:90313362ec11 2 #include "SDFileSystem.h"
cyberjoey 9:36ba3626aab7 3 #include "max32630fthr.h"
cyberjoey 9:36ba3626aab7 4 #include "USBSerial.h"
cyberjoey 11:94a7379c0db8 5 #include <ctype.h>
switches 0:60a522ae2e35 6
cyberjoey 9:36ba3626aab7 7
cyberjoey 9:36ba3626aab7 8 #define I2C_ADDRESS 0x30 // DS2484 I2C address
cyberjoey 9:36ba3626aab7 9 #define DS2484_ADD 0x30 // DS2484 I2C write address
cyberjoey 9:36ba3626aab7 10
cyberjoey 9:36ba3626aab7 11
cyberjoey 9:36ba3626aab7 12 #define PERIOD 10 // Logging period in seconds
cyberjoey 9:36ba3626aab7 13
cyberjoey 9:36ba3626aab7 14 //DS2484 Status register bits
cyberjoey 9:36ba3626aab7 15 #define OWB 0x01 // status reg, One Wire Busy
cyberjoey 9:36ba3626aab7 16 #define PPD 0x02 // status reg, Presence Pulse Detected
cyberjoey 9:36ba3626aab7 17 #define SD 0x04 // status reg, Short Detected
cyberjoey 9:36ba3626aab7 18 #define LL 0x08 // status reg, Logic Level
cyberjoey 9:36ba3626aab7 19 #define RST 0x10 // status reg, Device Reset (DS2484 Reset)
cyberjoey 9:36ba3626aab7 20 #define SBR 0x20 // status reg, Single Bit Result
cyberjoey 9:36ba3626aab7 21 #define TSB 0x40 // status reg, Triplet Second Bit
cyberjoey 9:36ba3626aab7 22 #define DIR 0x80 // status reg, Branch Direction Taken
cyberjoey 9:36ba3626aab7 23 //DS2484 Command bytes
cyberjoey 9:36ba3626aab7 24 #define RESET 0xF0 // DS2484 Reset
cyberjoey 9:36ba3626aab7 25 #define SRP 0xE1 // DS2484 Set Read Pointer
cyberjoey 9:36ba3626aab7 26 #define WDC 0xD2 // DS2484 Write Device Configuration
cyberjoey 9:36ba3626aab7 27 #define ACP 0xC3 // DS2484 Adjust one wire Control Port
cyberjoey 9:36ba3626aab7 28 #define OW_RESET 0xB4 // DS2484 One Wire Reset
cyberjoey 9:36ba3626aab7 29 #define OW_SB 0x87 // One Wire Single Bit (write or read)
cyberjoey 9:36ba3626aab7 30 #define OWWB 0xA5 // One Wire Write Byte
cyberjoey 9:36ba3626aab7 31 #define OWRB 0x96 // One Wire Read Byte
cyberjoey 9:36ba3626aab7 32 #define OWT 0x78 // One Wire Triplet (read 2 bits, write 1 bit)
cyberjoey 9:36ba3626aab7 33 //One Wire Commands
cyberjoey 9:36ba3626aab7 34 #define OW_SEARCH 0xF0 // Search Rom
cyberjoey 9:36ba3626aab7 35 #define OW_READ 0x33 // Read Rom
cyberjoey 9:36ba3626aab7 36 #define OW_MATCH 0x55 // Match Rom
cyberjoey 9:36ba3626aab7 37 #define OW_SKIP 0xCC // Skip Rom
cyberjoey 9:36ba3626aab7 38 #define OW_OD_MATCH 0x69 // Match Rom
cyberjoey 9:36ba3626aab7 39 #define OW_OD_SKIP 0x3C // Skip Rom
cyberjoey 9:36ba3626aab7 40 #define OW_ALARM 0xEC // Alarm Search
cyberjoey 9:36ba3626aab7 41 // OT07 OW commands
cyberjoey 9:36ba3626aab7 42 #define OT07_OW_CONVERT 0x44 //OT07 OW convert temperature command
cyberjoey 9:36ba3626aab7 43 #define OT07_OW_WRITE 0xCC // OT07 OW Write Register command
cyberjoey 9:36ba3626aab7 44 #define OT07_OW_READ 0x33 // OT07 OW Read Register command
cyberjoey 9:36ba3626aab7 45 #define OT07_OW_RESET 0x82 // OT07 OW Soft Reset command
switches 3:247c750f9f3d 46
cyberjoey 9:36ba3626aab7 47 //OT07 Registers
cyberjoey 9:36ba3626aab7 48 #define OT07_STATUS 0x00 // OT07 status regiter
cyberjoey 9:36ba3626aab7 49 #define OT07_INT_EN 0x01 // OT07 Interrupt Enable
cyberjoey 9:36ba3626aab7 50 #define OT07_FIFO_W 0x04 // OT07 FIFO Write Pointer
cyberjoey 9:36ba3626aab7 51 #define OT07_FIFO_R 0x05 // OT07 FIFO Read Pointer
cyberjoey 9:36ba3626aab7 52 #define OT07_FIFO_OF 0x06 // OT07 FIFO Overflow Counter
cyberjoey 9:36ba3626aab7 53 #define OT07_FIFO_COUNT 0x07 // OT07 FIFO Data Count
cyberjoey 9:36ba3626aab7 54 #define OT07_FIFO_DATA 0x08 // OT07 FIFO Data
cyberjoey 9:36ba3626aab7 55 #define OT07_FIFO_CNFG1 0x09 // OT07 FIFO Configuration 1 (FIFO_A_FULL)
cyberjoey 9:36ba3626aab7 56 #define OT07_FIFO_CNFG2 0x0A // OT07 FIFO Configuration 2
cyberjoey 9:36ba3626aab7 57 #define OT07_SYS 0x0C // OT07 System Configuration
cyberjoey 9:36ba3626aab7 58 #define OT07_ALARM_HIGH_MSB 0x10 // OT07 Alarm High MSB
cyberjoey 9:36ba3626aab7 59 #define OT07_ALARM_HIGH_LSB 0x11 // OT07 Alarm High LSB
cyberjoey 9:36ba3626aab7 60 #define OT07_ALARM_LOW_MSB 0x12 // OT07 Alarm Low MSB
cyberjoey 9:36ba3626aab7 61 #define OT07_ALARM_LOW_LSB 0x13 // OT07 Alarm LOW LSB
cyberjoey 9:36ba3626aab7 62 #define OT07_ADC_BITS 0x14 // OT07 Temp Seneor Setup (ADC_RES[7:6])
cyberjoey 9:36ba3626aab7 63 #define OT07_GPIO_SETUP 0x20 // OT07 GPIO Setup, sets GPIO modes
cyberjoey 9:36ba3626aab7 64 #define Ot07_GPIO_CTRL 0x21 // OT07 GPIO control
cyberjoey 9:36ba3626aab7 65 #define OT07_ROM_ID 0x30 // OT07 ROM_ID address of LSB?
cyberjoey 9:36ba3626aab7 66
cyberjoey 9:36ba3626aab7 67
cyberjoey 9:36ba3626aab7 68 #define MAX_DEVICES 64 // Maximum number of rom devices allowed
cyberjoey 9:36ba3626aab7 69 #define ID_LENGTH 8 // Rom ID length in bytes
cyberjoey 9:36ba3626aab7 70
cyberjoey 9:36ba3626aab7 71
cyberjoey 9:36ba3626aab7 72 #define BS 8 // ASCII Back Space
cyberjoey 9:36ba3626aab7 73 #define CR 13 // ASCII Carriage Return
cyberjoey 9:36ba3626aab7 74
cyberjoey 10:148da21c297e 75 const char* settings_file = "/sd/settings.txt";
cyberjoey 10:148da21c297e 76 const char* log_file = "/sd/MAX30207Log.csv";
cyberjoey 10:148da21c297e 77
cyberjoey 9:36ba3626aab7 78 //global variable
cyberjoey 9:36ba3626aab7 79
cyberjoey 9:36ba3626aab7 80 //******************** init Feather Boared Hardware ***********************
cyberjoey 9:36ba3626aab7 81
cyberjoey 9:36ba3626aab7 82 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
cyberjoey 9:36ba3626aab7 83
cyberjoey 9:36ba3626aab7 84 //microSD logging file system setup
cyberjoey 9:36ba3626aab7 85 SDFileSystem sd(P0_5, P0_6, P0_4, P0_7, "sd"); // mosi, miso, sclk, cs
cyberjoey 9:36ba3626aab7 86
cyberjoey 9:36ba3626aab7 87 //SD card insertion detection pin
cyberjoey 9:36ba3626aab7 88 DigitalIn SDDetect(P2_2, PullUp);
cyberjoey 11:94a7379c0db8 89 InterruptIn SDInsert(P2_2);
cyberjoey 9:36ba3626aab7 90
cyberjoey 9:36ba3626aab7 91
cyberjoey 9:36ba3626aab7 92 // Virtual serial port over USB
cyberjoey 15:61dce4bef44f 93 USBSerial pc(0x0B6A, 0x0042, 0x0001, false);
cyberjoey 9:36ba3626aab7 94
cyberjoey 9:36ba3626aab7 95 // I2C setup
cyberjoey 9:36ba3626aab7 96 I2C i2c(P3_4,P3_5); // P3_4 -> I2C1_SDA, P3_5-> I2C1_SCL
cyberjoey 9:36ba3626aab7 97
cyberjoey 9:36ba3626aab7 98 //Timer setup
cyberjoey 9:36ba3626aab7 99 Ticker timer_1; // timer for blinking led heartbeat
cyberjoey 9:36ba3626aab7 100
cyberjoey 9:36ba3626aab7 101 bool tick_flag; // used for counting seconds
cyberjoey 9:36ba3626aab7 102 bool log_flag = false;
cyberjoey 9:36ba3626aab7 103 bool led_toggle_flag = false;
cyberjoey 9:36ba3626aab7 104 bool button_flag = false;
cyberjoey 11:94a7379c0db8 105 bool sd_insert_flag = false;
cyberjoey 9:36ba3626aab7 106 bool error_flag;
cyberjoey 9:36ba3626aab7 107 int error_ticks;
cyberjoey 9:36ba3626aab7 108
cyberjoey 9:36ba3626aab7 109 //LED blink setup
switches 1:90313362ec11 110 DigitalOut rLED(LED1);
switches 1:90313362ec11 111 DigitalOut gLED(LED2);
cyberjoey 9:36ba3626aab7 112 DigitalOut bLED(LED3);
switches 0:60a522ae2e35 113
cyberjoey 9:36ba3626aab7 114 InterruptIn button(SW1);
cyberjoey 9:36ba3626aab7 115
cyberjoey 9:36ba3626aab7 116
cyberjoey 9:36ba3626aab7 117 void LED_blink_callback(){ // LED Heart beat
cyberjoey 9:36ba3626aab7 118
cyberjoey 9:36ba3626aab7 119 led_toggle_flag = !led_toggle_flag;
cyberjoey 9:36ba3626aab7 120
cyberjoey 9:36ba3626aab7 121 if(log_flag) //if logging
cyberjoey 9:36ba3626aab7 122 {
cyberjoey 9:36ba3626aab7 123
cyberjoey 9:36ba3626aab7 124 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 125 {
cyberjoey 9:36ba3626aab7 126 //toggle red led
cyberjoey 9:36ba3626aab7 127 rLED = LED_ON;
cyberjoey 9:36ba3626aab7 128 }
cyberjoey 9:36ba3626aab7 129 else
cyberjoey 9:36ba3626aab7 130 {
cyberjoey 9:36ba3626aab7 131 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 132 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 133 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 134 }
cyberjoey 9:36ba3626aab7 135 }
cyberjoey 9:36ba3626aab7 136 else if(error_flag) //if error (no sd card)
cyberjoey 9:36ba3626aab7 137 {
cyberjoey 9:36ba3626aab7 138 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 139 {
cyberjoey 9:36ba3626aab7 140 //toggle red led
cyberjoey 9:36ba3626aab7 141 rLED = LED_ON;
cyberjoey 9:36ba3626aab7 142 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 143 }
cyberjoey 9:36ba3626aab7 144 else
cyberjoey 9:36ba3626aab7 145 {
cyberjoey 9:36ba3626aab7 146 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 147 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 148 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 149 }
cyberjoey 9:36ba3626aab7 150 error_ticks--;
cyberjoey 9:36ba3626aab7 151 if(error_ticks <= 0)
cyberjoey 9:36ba3626aab7 152 error_flag = false;
cyberjoey 9:36ba3626aab7 153 }
cyberjoey 9:36ba3626aab7 154 else
cyberjoey 9:36ba3626aab7 155 {
cyberjoey 9:36ba3626aab7 156 if(led_toggle_flag)
cyberjoey 9:36ba3626aab7 157 {
cyberjoey 9:36ba3626aab7 158 //toggle teal leds
cyberjoey 9:36ba3626aab7 159 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 160 bLED = LED_ON;
cyberjoey 9:36ba3626aab7 161 }
cyberjoey 9:36ba3626aab7 162 else
cyberjoey 9:36ba3626aab7 163 {
cyberjoey 9:36ba3626aab7 164 rLED = LED_OFF;
cyberjoey 9:36ba3626aab7 165 gLED = LED_OFF;
cyberjoey 9:36ba3626aab7 166 bLED = LED_OFF;
cyberjoey 9:36ba3626aab7 167 }
cyberjoey 9:36ba3626aab7 168 }
cyberjoey 9:36ba3626aab7 169
cyberjoey 9:36ba3626aab7 170 tick_flag = true;
cyberjoey 9:36ba3626aab7 171 }
cyberjoey 9:36ba3626aab7 172
cyberjoey 9:36ba3626aab7 173 void btn_pressed() //button pressed isr
cyberjoey 9:36ba3626aab7 174 {
cyberjoey 9:36ba3626aab7 175 button_flag = true;
cyberjoey 9:36ba3626aab7 176 }
cyberjoey 9:36ba3626aab7 177
cyberjoey 11:94a7379c0db8 178 void sd_insert() //sd_insert pressed isr
cyberjoey 11:94a7379c0db8 179 {
cyberjoey 11:94a7379c0db8 180 sd_insert_flag = true;
cyberjoey 11:94a7379c0db8 181 }
cyberjoey 11:94a7379c0db8 182
cyberjoey 9:36ba3626aab7 183
cyberjoey 9:36ba3626aab7 184 // *****************************************************************************
cyberjoey 9:36ba3626aab7 185 // Define CRC-8 Table
cyberjoey 9:36ba3626aab7 186 // *****************************************************************************
cyberjoey 9:36ba3626aab7 187
cyberjoey 9:36ba3626aab7 188 static unsigned char crc_table[] = {
cyberjoey 9:36ba3626aab7 189 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
cyberjoey 9:36ba3626aab7 190 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
cyberjoey 9:36ba3626aab7 191 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
cyberjoey 9:36ba3626aab7 192 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
cyberjoey 9:36ba3626aab7 193 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
cyberjoey 9:36ba3626aab7 194 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
cyberjoey 9:36ba3626aab7 195 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
cyberjoey 9:36ba3626aab7 196 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
cyberjoey 9:36ba3626aab7 197 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
cyberjoey 9:36ba3626aab7 198 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
cyberjoey 9:36ba3626aab7 199 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
cyberjoey 9:36ba3626aab7 200 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
cyberjoey 9:36ba3626aab7 201 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
cyberjoey 9:36ba3626aab7 202 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
cyberjoey 9:36ba3626aab7 203 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
cyberjoey 9:36ba3626aab7 204 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
cyberjoey 9:36ba3626aab7 205
cyberjoey 9:36ba3626aab7 206
cyberjoey 9:36ba3626aab7 207
cyberjoey 9:36ba3626aab7 208 // -----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 209 // Calculate the CRC8 of the byte value provided with the current total
cyberjoey 9:36ba3626aab7 210 // calc_crc8(unsigned char, unsigned char) crc8 total, byte to add
cyberjoey 9:36ba3626aab7 211 // pass crc8 total = 0 to start new crc sum.
cyberjoey 9:36ba3626aab7 212
cyberjoey 9:36ba3626aab7 213 // Returns new crc8 total
cyberjoey 9:36ba3626aab7 214 // -----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 215
cyberjoey 9:36ba3626aab7 216 unsigned char calc_crc8(unsigned char crc8, unsigned char value){
cyberjoey 9:36ba3626aab7 217
cyberjoey 9:36ba3626aab7 218 return crc_table[crc8 ^ value];
cyberjoey 9:36ba3626aab7 219 }
cyberjoey 9:36ba3626aab7 220
cyberjoey 9:36ba3626aab7 221 // *****************************************************************************
cyberjoey 9:36ba3626aab7 222 // OW_reset()
cyberjoey 9:36ba3626aab7 223 // returns 0 no device present, 1 device present
cyberjoey 9:36ba3626aab7 224 // *****************************************************************************
cyberjoey 9:36ba3626aab7 225
cyberjoey 9:36ba3626aab7 226 int OW_reset(){
cyberjoey 9:36ba3626aab7 227 char data[2]; // define as minimun array size so 'data' is a pointer
cyberjoey 9:36ba3626aab7 228 data[0] = OW_RESET; // One Wire Reset 0xB4
cyberjoey 9:36ba3626aab7 229 i2c.write(DS2484_ADD,data,1,0); // write reset command to DS2484
cyberjoey 9:36ba3626aab7 230 wait_ms(1);
cyberjoey 9:36ba3626aab7 231 do{ // poll OW-busy
cyberjoey 9:36ba3626aab7 232 i2c.read(DS2484_ADD,data,1); // read back status byte from DS2484
cyberjoey 9:36ba3626aab7 233 }while(OWB & data[0]);
cyberjoey 9:36ba3626aab7 234 if(PPD & data[0])return 1; // Presence Pulse Detected bit true?
cyberjoey 9:36ba3626aab7 235 return 0; // else
cyberjoey 9:36ba3626aab7 236 } // end OW_reset()
cyberjoey 9:36ba3626aab7 237
cyberjoey 9:36ba3626aab7 238 // *****************************************************************************
cyberjoey 9:36ba3626aab7 239 // OW_write_byte(char) takes char to send over one wire
cyberjoey 9:36ba3626aab7 240 // returns DS2484 status byte
cyberjoey 9:36ba3626aab7 241 // *****************************************************************************
cyberjoey 9:36ba3626aab7 242
cyberjoey 9:36ba3626aab7 243 char OW_write_byte(char byte){
cyberjoey 9:36ba3626aab7 244
cyberjoey 9:36ba3626aab7 245 char data[2];
cyberjoey 9:36ba3626aab7 246 data[0] = 0xA5;
cyberjoey 9:36ba3626aab7 247 data[1] = byte;
cyberjoey 9:36ba3626aab7 248 i2c.write(DS2484_ADD,data,2,1);
cyberjoey 9:36ba3626aab7 249 i2c.read(DS2484_ADD,data,1); // read status byte
cyberjoey 9:36ba3626aab7 250
cyberjoey 9:36ba3626aab7 251 // db.printf("[%02X]",byte);
cyberjoey 9:36ba3626aab7 252 wait_us(700); // assumes normal speed OW write
cyberjoey 9:36ba3626aab7 253 return data[0]; // return DS2484 Status byte
cyberjoey 9:36ba3626aab7 254
cyberjoey 9:36ba3626aab7 255 }// end OW_write_byte()
cyberjoey 9:36ba3626aab7 256
cyberjoey 9:36ba3626aab7 257
cyberjoey 9:36ba3626aab7 258 // *****************************************************************************
cyberjoey 9:36ba3626aab7 259 // OW_read_byte(char *, int) char* (save data pointer)
cyberjoey 9:36ba3626aab7 260 // int (number of bytes to read)
cyberjoey 9:36ba3626aab7 261 // returns 0x00
cyberjoey 9:36ba3626aab7 262 //
cyberjoey 9:36ba3626aab7 263 // assumes OW_reset, OW_match rom, and OW device register read address already sent.
cyberjoey 9:36ba3626aab7 264 //
cyberjoey 9:36ba3626aab7 265 // *****************************************************************************
cyberjoey 9:36ba3626aab7 266
cyberjoey 9:36ba3626aab7 267 char OW_read_byte(char* a, int n){
cyberjoey 9:36ba3626aab7 268
cyberjoey 9:36ba3626aab7 269 char data[2];
cyberjoey 9:36ba3626aab7 270 int i;
cyberjoey 9:36ba3626aab7 271
cyberjoey 9:36ba3626aab7 272 //read n bytes of data
cyberjoey 9:36ba3626aab7 273 i=0;
cyberjoey 9:36ba3626aab7 274 do{
cyberjoey 9:36ba3626aab7 275 data[0] = OWRB; // send 0x96; DS2484 command, OW read byte
cyberjoey 9:36ba3626aab7 276 i2c.write(DS2484_ADD,data,1,0);
cyberjoey 9:36ba3626aab7 277 wait_us(600);
cyberjoey 9:36ba3626aab7 278 do{
cyberjoey 9:36ba3626aab7 279 i2c.read(DS2484_ADD,data,1); // read status byte and test OW-busy?
cyberjoey 9:36ba3626aab7 280 }while(data[0]&0x01 == 1); // status bit[0] set --> OW busy
cyberjoey 9:36ba3626aab7 281
cyberjoey 9:36ba3626aab7 282 //get byte from DS2484
cyberjoey 9:36ba3626aab7 283 data[0] = SRP; // send 0xE1, set read pointer
cyberjoey 9:36ba3626aab7 284 data[1] = 0xE1; // set read pointer address 0xE1 read OW data
cyberjoey 9:36ba3626aab7 285 i2c.write(DS2484_ADD,data,2,1);
cyberjoey 9:36ba3626aab7 286 i2c.read(DS2484_ADD,data,1); // read bytes from OW register
cyberjoey 9:36ba3626aab7 287
cyberjoey 9:36ba3626aab7 288 a[i] = data[0];
cyberjoey 9:36ba3626aab7 289
cyberjoey 9:36ba3626aab7 290 i++;
cyberjoey 9:36ba3626aab7 291 //pc.printf("[%02X] ",data[0]);
cyberjoey 9:36ba3626aab7 292 }while(i<n);
cyberjoey 9:36ba3626aab7 293 //for(i=0;i<n;i++) db.printf("OW_read_byte - [%2d][%02X]\r\n",i,a[i]);
cyberjoey 9:36ba3626aab7 294 return 0x00;
cyberjoey 9:36ba3626aab7 295 }// end OW_read_byte()
cyberjoey 9:36ba3626aab7 296
cyberjoey 9:36ba3626aab7 297
cyberjoey 9:36ba3626aab7 298
cyberjoey 9:36ba3626aab7 299 // *****************************************************************************
cyberjoey 9:36ba3626aab7 300 // OW_match_rom(char *) pointer to device_id byte array
cyberjoey 9:36ba3626aab7 301 // returns 0x00
cyberjoey 9:36ba3626aab7 302 // assumes OW_reset alread sent
cyberjoey 9:36ba3626aab7 303 // *****************************************************************************
cyberjoey 9:36ba3626aab7 304
cyberjoey 9:36ba3626aab7 305 char OW_match_rom(char *device_id){
cyberjoey 9:36ba3626aab7 306
cyberjoey 9:36ba3626aab7 307 int i;
cyberjoey 9:36ba3626aab7 308 //Match rom
cyberjoey 9:36ba3626aab7 309 OW_write_byte(OW_MATCH); // send 0x55, match rom command
cyberjoey 9:36ba3626aab7 310 //send rom code for device
cyberjoey 9:36ba3626aab7 311 for(i=0;i<8;i++){
cyberjoey 9:36ba3626aab7 312 OW_write_byte(device_id[i]); //I2C write ow byte
cyberjoey 9:36ba3626aab7 313 }
cyberjoey 9:36ba3626aab7 314 return 0x00;
cyberjoey 9:36ba3626aab7 315
cyberjoey 9:36ba3626aab7 316 }// end OW_macth_rom
cyberjoey 9:36ba3626aab7 317
cyberjoey 9:36ba3626aab7 318
cyberjoey 9:36ba3626aab7 319 // *****************************************************************************
cyberjoey 9:36ba3626aab7 320 // search_rom(char *) pointer to start of 2D array rom_id_list
cyberjoey 9:36ba3626aab7 321 // returns number of devices found
cyberjoey 9:36ba3626aab7 322 // *****************************************************************************
cyberjoey 9:36ba3626aab7 323
cyberjoey 9:36ba3626aab7 324
cyberjoey 9:36ba3626aab7 325 int search_rom(char rom_id_list[MAX_DEVICES][ID_LENGTH]){ // searches for all device on OW bus, returns # found
cyberjoey 9:36ba3626aab7 326
cyberjoey 9:36ba3626aab7 327 int bit_num;
cyberjoey 9:36ba3626aab7 328 int byte_num;
cyberjoey 9:36ba3626aab7 329 int last_zero;
cyberjoey 9:36ba3626aab7 330 int last_discrep;
cyberjoey 9:36ba3626aab7 331 int search_dir;
cyberjoey 9:36ba3626aab7 332 int rom_count;
cyberjoey 9:36ba3626aab7 333 char byte_mask;
cyberjoey 9:36ba3626aab7 334 int last_device;
cyberjoey 9:36ba3626aab7 335 int i;
cyberjoey 9:36ba3626aab7 336
cyberjoey 9:36ba3626aab7 337 char rom_id[8]; //used in rom search
cyberjoey 9:36ba3626aab7 338 char data[8];
cyberjoey 9:36ba3626aab7 339 char crc;
cyberjoey 9:36ba3626aab7 340
cyberjoey 9:36ba3626aab7 341 //init for first search only
cyberjoey 9:36ba3626aab7 342 last_device = 0;
cyberjoey 9:36ba3626aab7 343 last_discrep = 0;
cyberjoey 9:36ba3626aab7 344 rom_count = 0;
cyberjoey 9:36ba3626aab7 345
cyberjoey 9:36ba3626aab7 346 for(i=0;i<8;i++)rom_id[i] = 0x00; //clear rom_id
cyberjoey 9:36ba3626aab7 347
cyberjoey 9:36ba3626aab7 348 do{ // loop for each rom search (end when last_device = 1)
cyberjoey 9:36ba3626aab7 349
cyberjoey 9:36ba3626aab7 350 //init variable for each search
cyberjoey 9:36ba3626aab7 351 bit_num = 1;
cyberjoey 9:36ba3626aab7 352 byte_num = 0;
cyberjoey 9:36ba3626aab7 353 byte_mask = 1;
cyberjoey 9:36ba3626aab7 354 last_zero = 0;
cyberjoey 9:36ba3626aab7 355
cyberjoey 9:36ba3626aab7 356
cyberjoey 9:36ba3626aab7 357 //OW reset
cyberjoey 9:36ba3626aab7 358 if(OW_reset()){ //returns 1 if at least one device present
cyberjoey 9:36ba3626aab7 359 //test if last device found
cyberjoey 9:36ba3626aab7 360 if(last_device!=1){ // more devices to find
cyberjoey 9:36ba3626aab7 361 search_dir = 0;
cyberjoey 9:36ba3626aab7 362 OW_write_byte(OW_SEARCH); //send 0xF0 over one wire to init search rom
cyberjoey 9:36ba3626aab7 363
cyberjoey 9:36ba3626aab7 364 do{
cyberjoey 9:36ba3626aab7 365 //determine search direction
cyberjoey 9:36ba3626aab7 366 if(bit_num < last_discrep){ //before last discrepancy
cyberjoey 9:36ba3626aab7 367 if((rom_id[byte_num] & byte_mask) > 0){// use last rom path
cyberjoey 9:36ba3626aab7 368 search_dir = 1; // last path was 1
cyberjoey 9:36ba3626aab7 369 }else{
cyberjoey 9:36ba3626aab7 370 search_dir = 0; // last path was 0
cyberjoey 9:36ba3626aab7 371 }
cyberjoey 9:36ba3626aab7 372 }else{ // at or past last discrepancy
cyberjoey 9:36ba3626aab7 373 if(bit_num == last_discrep){ // at last discrepancy
cyberjoey 9:36ba3626aab7 374 search_dir = 1; //been here before so use 1
cyberjoey 9:36ba3626aab7 375 }else{
cyberjoey 9:36ba3626aab7 376 search_dir = 0; //past last discrepancy so use 0
cyberjoey 9:36ba3626aab7 377 }
cyberjoey 9:36ba3626aab7 378 }
cyberjoey 9:36ba3626aab7 379
cyberjoey 9:36ba3626aab7 380 //write direction bit and get reply
cyberjoey 9:36ba3626aab7 381 data[0] = 0x78;
cyberjoey 9:36ba3626aab7 382 data[1] = search_dir << 7; //sets bit 7 of status reg to search_dir
cyberjoey 9:36ba3626aab7 383 i2c.write(DS2484_ADD,data,2,1);
cyberjoey 9:36ba3626aab7 384
cyberjoey 9:36ba3626aab7 385 wait_us(250);
cyberjoey 9:36ba3626aab7 386
cyberjoey 9:36ba3626aab7 387 //read in rom_id bits
cyberjoey 9:36ba3626aab7 388 i2c.read(DS2484_ADD,data,1); // read status byte
cyberjoey 9:36ba3626aab7 389
cyberjoey 9:36ba3626aab7 390 //(todo) check for no device error here
cyberjoey 9:36ba3626aab7 391
cyberjoey 9:36ba3626aab7 392 //get search direction used by triplet command
cyberjoey 9:36ba3626aab7 393
cyberjoey 9:36ba3626aab7 394 if(data[0]&0x80){ //true --> DIR bit = 1
cyberjoey 9:36ba3626aab7 395 search_dir = 1;
cyberjoey 9:36ba3626aab7 396 }else{
cyberjoey 9:36ba3626aab7 397 search_dir = 0;
cyberjoey 9:36ba3626aab7 398 }
cyberjoey 9:36ba3626aab7 399
cyberjoey 9:36ba3626aab7 400 //test for discrepancy (both 0 and 1 present at current bit number)(TSB = 0 (1's present) and SBR = 0 (0's present))
cyberjoey 9:36ba3626aab7 401 if(!(data[0] & 0x60)){ // true --> discrepancy exist, both TSB and SBR = 0
cyberjoey 9:36ba3626aab7 402 if(search_dir == 0)last_zero = bit_num;
cyberjoey 9:36ba3626aab7 403 }
cyberjoey 9:36ba3626aab7 404 if(search_dir == 1){ // write search dir to rom bit
cyberjoey 9:36ba3626aab7 405 rom_id[byte_num] |= byte_mask;
cyberjoey 9:36ba3626aab7 406 }else{
cyberjoey 9:36ba3626aab7 407 rom_id[byte_num] &= ~byte_mask;
cyberjoey 9:36ba3626aab7 408 }
cyberjoey 9:36ba3626aab7 409
cyberjoey 9:36ba3626aab7 410 //increment bit_num and byte_num if needed
cyberjoey 9:36ba3626aab7 411 bit_num++;
cyberjoey 9:36ba3626aab7 412 byte_mask <<= 1; //rotate 1 bit left
cyberjoey 9:36ba3626aab7 413 if(byte_mask == 0){ //if bit shifts out of byte set byte to 1
cyberjoey 9:36ba3626aab7 414 byte_num++; //also increnent byt num
cyberjoey 9:36ba3626aab7 415 byte_mask = 1;
cyberjoey 9:36ba3626aab7 416 }
cyberjoey 9:36ba3626aab7 417
cyberjoey 9:36ba3626aab7 418
cyberjoey 9:36ba3626aab7 419 }while(bit_num<65); //bit nun started at 1 so end after 64
cyberjoey 9:36ba3626aab7 420 last_discrep = last_zero;
cyberjoey 9:36ba3626aab7 421 if(last_discrep == 0)last_device = 1;
cyberjoey 9:36ba3626aab7 422 //copy rom_id into rom_id_list and calc crc of first 7 bytes
cyberjoey 13:674c647d12dd 423 crc = 0x00; // reset crc8 total to 0
cyberjoey 9:36ba3626aab7 424 for(i=7;i>=0;i--){
cyberjoey 13:674c647d12dd 425 rom_id_list[rom_count][i] = rom_id[i];
cyberjoey 13:674c647d12dd 426 }
cyberjoey 9:36ba3626aab7 427
cyberjoey 9:36ba3626aab7 428 //clac_crc of rom ID
cyberjoey 9:36ba3626aab7 429 for (i=0;i<7;i++){
cyberjoey 9:36ba3626aab7 430 crc = calc_crc8(crc, rom_id[i]);
cyberjoey 9:36ba3626aab7 431 }
cyberjoey 9:36ba3626aab7 432
cyberjoey 9:36ba3626aab7 433 rom_count++;
cyberjoey 9:36ba3626aab7 434 }//if(last_device..)
cyberjoey 9:36ba3626aab7 435 }else{//if prescent -- if no device present rom count is 0
cyberjoey 9:36ba3626aab7 436 return 0;
cyberjoey 9:36ba3626aab7 437 }
cyberjoey 9:36ba3626aab7 438 }while(last_device == 0);
cyberjoey 9:36ba3626aab7 439 return rom_count;
cyberjoey 9:36ba3626aab7 440 }// end search_rom()
cyberjoey 9:36ba3626aab7 441
cyberjoey 9:36ba3626aab7 442 // *****************************************************************************
cyberjoey 9:36ba3626aab7 443 // alarm_search(char *) pointer to start of 2D array rom_id_list
cyberjoey 9:36ba3626aab7 444 // returns number of devices found with alarm triggered
cyberjoey 9:36ba3626aab7 445 // *****************************************************************************
cyberjoey 9:36ba3626aab7 446
cyberjoey 9:36ba3626aab7 447 int alarm_search(char rom_id_list[MAX_DEVICES][ID_LENGTH]){ // searches for all devices with alarm triggered on OW bus, returns # found
switches 0:60a522ae2e35 448
cyberjoey 9:36ba3626aab7 449 int bit_num;
cyberjoey 9:36ba3626aab7 450 int byte_num;
cyberjoey 9:36ba3626aab7 451 int last_zero;
cyberjoey 9:36ba3626aab7 452 int last_discrep;
cyberjoey 9:36ba3626aab7 453 int search_dir;
cyberjoey 9:36ba3626aab7 454 int rom_count;
cyberjoey 9:36ba3626aab7 455 char byte_mask;
cyberjoey 9:36ba3626aab7 456 int last_device;
cyberjoey 9:36ba3626aab7 457 int i;
cyberjoey 9:36ba3626aab7 458
cyberjoey 9:36ba3626aab7 459 char rom_id[8]; //used in rom search
cyberjoey 9:36ba3626aab7 460 char data[8];
cyberjoey 9:36ba3626aab7 461 char crc;
cyberjoey 9:36ba3626aab7 462
cyberjoey 9:36ba3626aab7 463 //init for first search only
cyberjoey 9:36ba3626aab7 464 last_device = 0;
cyberjoey 9:36ba3626aab7 465 last_discrep = 0;
cyberjoey 9:36ba3626aab7 466 rom_count = 0;
cyberjoey 9:36ba3626aab7 467
cyberjoey 9:36ba3626aab7 468 for(i=0;i<8;i++)rom_id[i] = 0x00; //clear rom_id
cyberjoey 9:36ba3626aab7 469
cyberjoey 9:36ba3626aab7 470 do{ // loop for each rom search (end when last_device = 1)
cyberjoey 9:36ba3626aab7 471
cyberjoey 9:36ba3626aab7 472 //init variable for each search
cyberjoey 9:36ba3626aab7 473 bit_num = 1;
cyberjoey 9:36ba3626aab7 474 byte_num = 0;
cyberjoey 9:36ba3626aab7 475 byte_mask = 1;
cyberjoey 9:36ba3626aab7 476 last_zero = 0;
cyberjoey 9:36ba3626aab7 477
cyberjoey 9:36ba3626aab7 478
cyberjoey 9:36ba3626aab7 479 //OW reset
cyberjoey 9:36ba3626aab7 480 if(OW_reset()){ //returns 1 if at least one device present
cyberjoey 9:36ba3626aab7 481 //test if last device found
cyberjoey 9:36ba3626aab7 482 if(last_device!=1){ // more devices to find
cyberjoey 9:36ba3626aab7 483 search_dir = 0;
cyberjoey 9:36ba3626aab7 484 OW_write_byte(OW_ALARM); //send 0xEC over one wire to init alarm search
cyberjoey 9:36ba3626aab7 485
cyberjoey 9:36ba3626aab7 486 do{
cyberjoey 9:36ba3626aab7 487 //determine search direction
cyberjoey 9:36ba3626aab7 488 if(bit_num < last_discrep){ //before last discrepancy
cyberjoey 9:36ba3626aab7 489 if((rom_id[byte_num] & byte_mask) > 0){// use last rom path
cyberjoey 9:36ba3626aab7 490 search_dir = 1; // last path was 1
cyberjoey 9:36ba3626aab7 491 }else{
cyberjoey 9:36ba3626aab7 492 search_dir = 0; // last path was 0
cyberjoey 9:36ba3626aab7 493 }
cyberjoey 9:36ba3626aab7 494 }else{ // at or past last discrepancy
cyberjoey 9:36ba3626aab7 495 if(bit_num == last_discrep){ // at last discrepancy
cyberjoey 9:36ba3626aab7 496 search_dir = 1; //been here before so use 1
cyberjoey 9:36ba3626aab7 497 }else{
cyberjoey 9:36ba3626aab7 498 search_dir = 0; //past last discrepancy so use 0
cyberjoey 9:36ba3626aab7 499 }
cyberjoey 9:36ba3626aab7 500 }
cyberjoey 9:36ba3626aab7 501
cyberjoey 9:36ba3626aab7 502 //write direction bit and get reply
cyberjoey 9:36ba3626aab7 503 data[0] = 0x78;
cyberjoey 9:36ba3626aab7 504 data[1] = search_dir << 7; //sets bit 7 of status reg to search_dir
cyberjoey 9:36ba3626aab7 505 i2c.write(DS2484_ADD,data,2,1);
cyberjoey 9:36ba3626aab7 506
cyberjoey 9:36ba3626aab7 507 wait_us(250);
cyberjoey 9:36ba3626aab7 508
cyberjoey 9:36ba3626aab7 509 //read in rom_id bits
cyberjoey 9:36ba3626aab7 510 i2c.read(DS2484_ADD,data,1); // read status byte
cyberjoey 9:36ba3626aab7 511
cyberjoey 9:36ba3626aab7 512 //(todo) check for no device error here
cyberjoey 9:36ba3626aab7 513
cyberjoey 9:36ba3626aab7 514 //get search direction used by triplet command
cyberjoey 9:36ba3626aab7 515
cyberjoey 9:36ba3626aab7 516 if(data[0]&0x80){ //true --> DIR bit = 1
cyberjoey 9:36ba3626aab7 517 search_dir = 1;
cyberjoey 9:36ba3626aab7 518 }else{
cyberjoey 9:36ba3626aab7 519 search_dir = 0;
cyberjoey 9:36ba3626aab7 520 }
cyberjoey 9:36ba3626aab7 521
cyberjoey 9:36ba3626aab7 522 //test for discrepancy (both 0 and 1 present at current bit number)(TSB = 0 (1's present) and SBR = 0 (0's present))
cyberjoey 9:36ba3626aab7 523 if(!(data[0] & 0x60)){ // true --> discrepancy exist, both TSB and SBR = 0
cyberjoey 9:36ba3626aab7 524 if(search_dir == 0)last_zero = bit_num;
cyberjoey 9:36ba3626aab7 525 }
cyberjoey 9:36ba3626aab7 526 if(search_dir == 1){ // write search dir to rom bit
cyberjoey 9:36ba3626aab7 527 rom_id[byte_num] |= byte_mask;
cyberjoey 9:36ba3626aab7 528 }else{
cyberjoey 9:36ba3626aab7 529 rom_id[byte_num] &= ~byte_mask;
cyberjoey 9:36ba3626aab7 530 }
cyberjoey 9:36ba3626aab7 531
cyberjoey 9:36ba3626aab7 532 //increment bit_num and byte_num if needed
cyberjoey 9:36ba3626aab7 533 bit_num++;
cyberjoey 9:36ba3626aab7 534 byte_mask <<= 1; //rotate 1 bit left
cyberjoey 9:36ba3626aab7 535 if(byte_mask == 0){ //if bit shifts out of byte set byte to 1
cyberjoey 9:36ba3626aab7 536 byte_num++; //also increnent byt num
cyberjoey 9:36ba3626aab7 537 byte_mask = 1;
cyberjoey 9:36ba3626aab7 538 }
cyberjoey 9:36ba3626aab7 539
cyberjoey 9:36ba3626aab7 540
cyberjoey 9:36ba3626aab7 541 }while(bit_num<65); //bit nun started at 1 so end after 64
cyberjoey 9:36ba3626aab7 542 last_discrep = last_zero;
cyberjoey 9:36ba3626aab7 543 if(last_discrep == 0)last_device = 1;
cyberjoey 9:36ba3626aab7 544 //copy rom_id into rom_id_list and calc crc of first 7 bytes
cyberjoey 13:674c647d12dd 545 crc = 0x00; // reset crc8 total to 0
cyberjoey 9:36ba3626aab7 546 for(i=7;i>=0;i--){
cyberjoey 9:36ba3626aab7 547 rom_id_list[rom_count][i] = rom_id[i];
cyberjoey 9:36ba3626aab7 548 }
cyberjoey 9:36ba3626aab7 549
cyberjoey 9:36ba3626aab7 550 //clac_crc of rom ID
cyberjoey 9:36ba3626aab7 551 for (i=0;i<7;i++){
cyberjoey 9:36ba3626aab7 552 crc = calc_crc8(crc, rom_id[i]);
cyberjoey 9:36ba3626aab7 553 }
cyberjoey 9:36ba3626aab7 554
cyberjoey 9:36ba3626aab7 555 rom_count++;
cyberjoey 9:36ba3626aab7 556 }//if(last_device..)
cyberjoey 9:36ba3626aab7 557 }else{//if prescent -- if no device present rom count is 0
cyberjoey 9:36ba3626aab7 558 return 0;
cyberjoey 9:36ba3626aab7 559 }
cyberjoey 9:36ba3626aab7 560 }while(last_device == 0);
cyberjoey 9:36ba3626aab7 561
cyberjoey 9:36ba3626aab7 562 //check if rom_id from alarm search is all 1s (this means there was a presence pulse but no alarm is triggered)
cyberjoey 9:36ba3626aab7 563 bool bad_rom_id = true;
cyberjoey 9:36ba3626aab7 564 for(int i = 0; i < 7; i++)
cyberjoey 9:36ba3626aab7 565 {
cyberjoey 9:36ba3626aab7 566 if(rom_id_list[0][i] != 0xFF)
cyberjoey 9:36ba3626aab7 567 bad_rom_id = false; //found a byte in the rom id that isn't all 1s
cyberjoey 9:36ba3626aab7 568 }
cyberjoey 9:36ba3626aab7 569 if(bad_rom_id)
cyberjoey 9:36ba3626aab7 570 return 0;
cyberjoey 9:36ba3626aab7 571
cyberjoey 9:36ba3626aab7 572 return rom_count;
cyberjoey 9:36ba3626aab7 573 }// end alarm_search()
cyberjoey 9:36ba3626aab7 574
cyberjoey 9:36ba3626aab7 575
cyberjoey 9:36ba3626aab7 576 // ******************** write_OW_register() ********************************
cyberjoey 9:36ba3626aab7 577 // write_OW_register(char*, int, int, char*)
cyberjoey 9:36ba3626aab7 578 // char* pointer to rom_id
cyberjoey 9:36ba3626aab7 579 // int start address
cyberjoey 9:36ba3626aab7 580 // int number of bytes to write
cyberjoey 9:36ba3626aab7 581 // char* pointer to write data location
cyberjoey 9:36ba3626aab7 582 // returns 0 if CRC match data
cyberjoey 9:36ba3626aab7 583 // returns -1 if CRC does not match data
cyberjoey 9:36ba3626aab7 584 //
cyberjoey 9:36ba3626aab7 585 // *****************************************************************************
cyberjoey 9:36ba3626aab7 586
cyberjoey 9:36ba3626aab7 587
cyberjoey 9:36ba3626aab7 588
cyberjoey 9:36ba3626aab7 589 int write_OW_register(char *device_ID, int start_add, int n, char *data){
cyberjoey 9:36ba3626aab7 590 int i;
cyberjoey 9:36ba3626aab7 591 //select device
cyberjoey 9:36ba3626aab7 592 OW_reset();
cyberjoey 9:36ba3626aab7 593 OW_match_rom(device_ID);
cyberjoey 9:36ba3626aab7 594 //set start address
cyberjoey 9:36ba3626aab7 595 OW_write_byte(OT07_OW_WRITE); // send 0xCC, OW write register command for OT07
cyberjoey 9:36ba3626aab7 596 OW_write_byte(start_add); // send write register start address
cyberjoey 9:36ba3626aab7 597 OW_write_byte(n-1); // send length of bytes to write (00-> one byte)
cyberjoey 9:36ba3626aab7 598 for(i=0;i<n;i++){ // send n bytes of data
cyberjoey 9:36ba3626aab7 599 OW_write_byte(data[i]);
cyberjoey 9:36ba3626aab7 600 }
cyberjoey 9:36ba3626aab7 601 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 602
cyberjoey 9:36ba3626aab7 603 // --- todo ----
cyberjoey 9:36ba3626aab7 604 // calculate CRC of
cyberjoey 9:36ba3626aab7 605 // Command + length + n bytes sent
cyberjoey 9:36ba3626aab7 606 // compare with 2 bytes read
cyberjoey 9:36ba3626aab7 607
cyberjoey 9:36ba3626aab7 608 return 0;
cyberjoey 9:36ba3626aab7 609
cyberjoey 9:36ba3626aab7 610 }//end write_OW_register
cyberjoey 9:36ba3626aab7 611
cyberjoey 9:36ba3626aab7 612
cyberjoey 9:36ba3626aab7 613
cyberjoey 9:36ba3626aab7 614
cyberjoey 9:36ba3626aab7 615 // ******************** read_OW_register() ********************************
cyberjoey 9:36ba3626aab7 616 // read_OW_register(char*, int, int, char*)
cyberjoey 9:36ba3626aab7 617 // char* pointer to rom_id
cyberjoey 9:36ba3626aab7 618 // int start address
cyberjoey 9:36ba3626aab7 619 // int number of bytes to read, not including CRC bytes
cyberjoey 9:36ba3626aab7 620 // char* pointer to save data location
cyberjoey 9:36ba3626aab7 621 // returns 0 if CRC match data
cyberjoey 9:36ba3626aab7 622 // returns -1 if CRC does not match data
cyberjoey 9:36ba3626aab7 623 //
cyberjoey 9:36ba3626aab7 624 // *****************************************************************************
cyberjoey 9:36ba3626aab7 625
cyberjoey 9:36ba3626aab7 626
cyberjoey 9:36ba3626aab7 627
cyberjoey 9:36ba3626aab7 628 int read_OW_register(char *device_ID, int start_add, int n, char *data){
cyberjoey 9:36ba3626aab7 629
cyberjoey 9:36ba3626aab7 630 //int i;
cyberjoey 9:36ba3626aab7 631 //select device
cyberjoey 9:36ba3626aab7 632 OW_reset();
cyberjoey 9:36ba3626aab7 633 OW_match_rom(device_ID);
cyberjoey 9:36ba3626aab7 634 //set start address
cyberjoey 9:36ba3626aab7 635 OW_write_byte(OT07_OW_READ); // send 0x33, OW read register command for OT07
cyberjoey 9:36ba3626aab7 636 OW_write_byte(start_add); // send read register start address
cyberjoey 9:36ba3626aab7 637 OW_write_byte(n-1); // send length of bytes to read (0 -> 1 byte)
cyberjoey 9:36ba3626aab7 638 OW_read_byte(data,n+2); // read n bytes plus 2 byte CRC
cyberjoey 9:36ba3626aab7 639
cyberjoey 9:36ba3626aab7 640 // --- todo ----
cyberjoey 9:36ba3626aab7 641 // calculate CRC of
cyberjoey 9:36ba3626aab7 642 // Command + length + n bytes
cyberjoey 9:36ba3626aab7 643 // compare with last 2 bytes read
cyberjoey 9:36ba3626aab7 644 return 0;
cyberjoey 9:36ba3626aab7 645
cyberjoey 9:36ba3626aab7 646 }//end read_OW_register
cyberjoey 9:36ba3626aab7 647
cyberjoey 9:36ba3626aab7 648 int set_test_mode(char *device_id){
cyberjoey 9:36ba3626aab7 649 char data[4];
cyberjoey 9:36ba3626aab7 650
cyberjoey 9:36ba3626aab7 651 // enter test mode
cyberjoey 9:36ba3626aab7 652 OW_reset();
cyberjoey 9:36ba3626aab7 653 OW_match_rom(device_id); // match ROM
cyberjoey 9:36ba3626aab7 654 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 655 OW_write_byte(0xFF); // device register address
cyberjoey 9:36ba3626aab7 656 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 657 OW_write_byte(0x54); // first half of test mode pass code
cyberjoey 9:36ba3626aab7 658 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 659
cyberjoey 9:36ba3626aab7 660 OW_reset();
cyberjoey 9:36ba3626aab7 661 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 662 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 663 OW_write_byte(0xFF); // device register address
cyberjoey 9:36ba3626aab7 664 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 665 OW_write_byte(0x4D); // second half of test mode pass code
cyberjoey 9:36ba3626aab7 666 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 667
cyberjoey 9:36ba3626aab7 668 // set ADC_ENABLED
cyberjoey 9:36ba3626aab7 669 OW_reset();
cyberjoey 9:36ba3626aab7 670 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 671 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 672 OW_write_byte(0x81); // device register address
cyberjoey 9:36ba3626aab7 673 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 674 OW_write_byte(0x04); // ADC_ENABLED code
cyberjoey 9:36ba3626aab7 675 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 676
cyberjoey 9:36ba3626aab7 677 OW_reset();
cyberjoey 9:36ba3626aab7 678 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 679 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 680 OW_write_byte(0x98); // device register address
cyberjoey 9:36ba3626aab7 681 OW_write_byte(0x05); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 682 OW_write_byte(0x40); // add 98 data 40
cyberjoey 9:36ba3626aab7 683 OW_write_byte(0xD4); // add 99 data D4
cyberjoey 9:36ba3626aab7 684 OW_write_byte(0xE0); // add 9A data E0
cyberjoey 9:36ba3626aab7 685 OW_write_byte(0xB3); // add 9B data B3
cyberjoey 9:36ba3626aab7 686 OW_write_byte(0x09); // add 9C data 09
cyberjoey 9:36ba3626aab7 687 OW_write_byte(0xBA); // add 9D data BA
cyberjoey 9:36ba3626aab7 688 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 689
cyberjoey 9:36ba3626aab7 690
cyberjoey 9:36ba3626aab7 691 //OTP copy
cyberjoey 9:36ba3626aab7 692 OW_reset();
cyberjoey 9:36ba3626aab7 693 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 694 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 695 OW_write_byte(0x80); // device register address
cyberjoey 9:36ba3626aab7 696 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 697 OW_write_byte(0x82); //
cyberjoey 9:36ba3626aab7 698 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 699
cyberjoey 9:36ba3626aab7 700 OW_reset();
cyberjoey 9:36ba3626aab7 701 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 702 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 703 OW_write_byte(0x80); // device register address
cyberjoey 9:36ba3626aab7 704 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 705 OW_write_byte(0x02); //
cyberjoey 9:36ba3626aab7 706 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 707
cyberjoey 9:36ba3626aab7 708
cyberjoey 9:36ba3626aab7 709 OW_reset();
cyberjoey 9:36ba3626aab7 710 OW_match_rom(device_id);
cyberjoey 9:36ba3626aab7 711 OW_write_byte(OT07_OW_WRITE); // device write register command
cyberjoey 9:36ba3626aab7 712 OW_write_byte(0xFF); // device register address
cyberjoey 9:36ba3626aab7 713 OW_write_byte(0x00); // number of bytes to write -1
cyberjoey 9:36ba3626aab7 714 OW_write_byte(0x00); // exit Test mode
cyberjoey 9:36ba3626aab7 715 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 716 return 0;
cyberjoey 9:36ba3626aab7 717 }// end set_test_mode()
cyberjoey 9:36ba3626aab7 718
cyberjoey 9:36ba3626aab7 719
cyberjoey 9:36ba3626aab7 720
cyberjoey 9:36ba3626aab7 721 // ******************** convert_temperature() ********************************
cyberjoey 9:36ba3626aab7 722 // convert_temperature()
cyberjoey 9:36ba3626aab7 723 // returns 0
cyberjoey 9:36ba3626aab7 724 // dose not block for 0.75 seconds.
cyberjoey 9:36ba3626aab7 725 // *****************************************************************************
cyberjoey 9:36ba3626aab7 726
cyberjoey 9:36ba3626aab7 727 int convert_temperature(){ // convert sent to all OW devices
cyberjoey 9:36ba3626aab7 728
cyberjoey 9:36ba3626aab7 729 char data[8];
cyberjoey 9:36ba3626aab7 730 OW_reset();
cyberjoey 9:36ba3626aab7 731
cyberjoey 9:36ba3626aab7 732 OW_write_byte(OW_SKIP); // send 0xCC, skip rom command
cyberjoey 9:36ba3626aab7 733
cyberjoey 9:36ba3626aab7 734 // activate strong pullup
cyberjoey 9:36ba3626aab7 735 data[0] = WDC; // send 0xD2 Write Device Configuration
cyberjoey 9:36ba3626aab7 736 data[1] = 0xA5; // 1010 0101 b strong and active pullup on
cyberjoey 9:36ba3626aab7 737 i2c.write(DS2484_ADD,data,2,0);
cyberjoey 9:36ba3626aab7 738
cyberjoey 9:36ba3626aab7 739 //convert command
cyberjoey 9:36ba3626aab7 740 OW_write_byte(OT07_OW_CONVERT); // send 0x44, Convert Temperature
cyberjoey 9:36ba3626aab7 741 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 742 return 0;
cyberjoey 9:36ba3626aab7 743 }
cyberjoey 9:36ba3626aab7 744
cyberjoey 9:36ba3626aab7 745
cyberjoey 9:36ba3626aab7 746 // ******************** convert_temperature() ********************************
cyberjoey 9:36ba3626aab7 747 // convert_temperature(char *) takes 8 byte rom_id as input
cyberjoey 9:36ba3626aab7 748 // returns 0
cyberjoey 9:36ba3626aab7 749 // dose not block for 0.75 seconds.
cyberjoey 9:36ba3626aab7 750 // *****************************************************************************
cyberjoey 9:36ba3626aab7 751
cyberjoey 9:36ba3626aab7 752 int convert_temperature(char *device_id){
cyberjoey 9:36ba3626aab7 753
cyberjoey 9:36ba3626aab7 754 char data[8];
cyberjoey 9:36ba3626aab7 755 OW_reset();
cyberjoey 9:36ba3626aab7 756 OW_match_rom(device_id); // send device id
cyberjoey 9:36ba3626aab7 757
cyberjoey 9:36ba3626aab7 758 // activate strong pullup
cyberjoey 9:36ba3626aab7 759 data[0] = WDC; // send 0xD2 Write Device Configuration
cyberjoey 9:36ba3626aab7 760 data[1] = 0xA5; // 1010 0101 b strong and active pullup on
cyberjoey 9:36ba3626aab7 761 i2c.write(DS2484_ADD,data,2,0);
cyberjoey 9:36ba3626aab7 762
cyberjoey 9:36ba3626aab7 763 //convert command
cyberjoey 9:36ba3626aab7 764 OW_write_byte(OT07_OW_CONVERT); // send 0x44, Convert Temperature
cyberjoey 9:36ba3626aab7 765 OW_read_byte(data,2); // read 2 byte CRC
cyberjoey 9:36ba3626aab7 766 return 0;
cyberjoey 9:36ba3626aab7 767 }
cyberjoey 9:36ba3626aab7 768
cyberjoey 9:36ba3626aab7 769 //************************ get_temperature() *********************************
cyberjoey 9:36ba3626aab7 770 // get_temperature(char *) takes 8 byte rom_id as input
cyberjoey 9:36ba3626aab7 771 // returns double temperature in oC
cyberjoey 9:36ba3626aab7 772 //******************************************************************************
cyberjoey 9:36ba3626aab7 773
cyberjoey 9:36ba3626aab7 774 double get_temperature(char *device_id){
cyberjoey 9:36ba3626aab7 775
cyberjoey 9:36ba3626aab7 776 char t[4];
cyberjoey 9:36ba3626aab7 777 double T;
cyberjoey 9:36ba3626aab7 778 int count;
cyberjoey 9:36ba3626aab7 779 // char data[2];
cyberjoey 9:36ba3626aab7 780
cyberjoey 9:36ba3626aab7 781 read_OW_register(device_id,OT07_FIFO_DATA,0x02,t); // Read temperature from FIFO, 2 bytes
cyberjoey 9:36ba3626aab7 782 //calculate temperture from data
cyberjoey 9:36ba3626aab7 783 count = (int)(t[0]*256 + t[1]);
cyberjoey 9:36ba3626aab7 784 if (count >= 32768)count = count - 65536; // 2s comp
cyberjoey 9:36ba3626aab7 785 T = (double)count*0.005;
cyberjoey 9:36ba3626aab7 786
cyberjoey 9:36ba3626aab7 787 return T;
cyberjoey 9:36ba3626aab7 788 }// end get_temperature()
cyberjoey 9:36ba3626aab7 789
cyberjoey 9:36ba3626aab7 790
cyberjoey 10:148da21c297e 791 void write_settings_file(int interval, bool device_logged[MAX_DEVICES])
cyberjoey 10:148da21c297e 792 {
cyberjoey 10:148da21c297e 793 FILE *fp = fopen(settings_file, "w");
cyberjoey 10:148da21c297e 794 if (fp != NULL)
cyberjoey 10:148da21c297e 795 {
cyberjoey 10:148da21c297e 796 fprintf(fp, "i %d\r\n", interval);
cyberjoey 10:148da21c297e 797
cyberjoey 10:148da21c297e 798 fprintf(fp, "d");
cyberjoey 10:148da21c297e 799
cyberjoey 10:148da21c297e 800 for(int i = 0; i < MAX_DEVICES; i++)
cyberjoey 10:148da21c297e 801 {
cyberjoey 10:148da21c297e 802 if(device_logged[i] == true)
cyberjoey 10:148da21c297e 803 {
cyberjoey 10:148da21c297e 804 fprintf(fp," %d", i);
cyberjoey 10:148da21c297e 805 }
cyberjoey 10:148da21c297e 806 }
cyberjoey 10:148da21c297e 807 fprintf(fp,"\r\n");
cyberjoey 10:148da21c297e 808
cyberjoey 10:148da21c297e 809 fclose(fp);
cyberjoey 10:148da21c297e 810 }
cyberjoey 10:148da21c297e 811 return;
cyberjoey 10:148da21c297e 812 }
cyberjoey 10:148da21c297e 813
cyberjoey 10:148da21c297e 814 bool print_settings_file()
cyberjoey 10:148da21c297e 815 {
cyberjoey 10:148da21c297e 816 FILE *fp = fopen(settings_file, "r");
cyberjoey 10:148da21c297e 817 if (fp != NULL)
cyberjoey 10:148da21c297e 818 {
cyberjoey 10:148da21c297e 819 pc.printf("*\r\n");
cyberjoey 10:148da21c297e 820
cyberjoey 10:148da21c297e 821 // Read contents from file
cyberjoey 10:148da21c297e 822 char c = fgetc(fp);
cyberjoey 11:94a7379c0db8 823
cyberjoey 10:148da21c297e 824 while (!feof(fp))
cyberjoey 10:148da21c297e 825 {
cyberjoey 10:148da21c297e 826 pc.printf("%c", c);
cyberjoey 10:148da21c297e 827 c = fgetc(fp);
cyberjoey 10:148da21c297e 828 }
cyberjoey 10:148da21c297e 829
cyberjoey 10:148da21c297e 830 pc.printf("*\r\n");
cyberjoey 10:148da21c297e 831
cyberjoey 10:148da21c297e 832 fclose(fp);
cyberjoey 10:148da21c297e 833 }
cyberjoey 10:148da21c297e 834 else
cyberjoey 10:148da21c297e 835 {
cyberjoey 10:148da21c297e 836 return false;
cyberjoey 10:148da21c297e 837 }
cyberjoey 10:148da21c297e 838 return true;
cyberjoey 10:148da21c297e 839 }
cyberjoey 10:148da21c297e 840
cyberjoey 10:148da21c297e 841 bool print_log_file()
cyberjoey 10:148da21c297e 842 {
cyberjoey 10:148da21c297e 843 FILE *fp = fopen(log_file, "r");
cyberjoey 10:148da21c297e 844 if (fp != NULL)
cyberjoey 10:148da21c297e 845 {
cyberjoey 10:148da21c297e 846 pc.printf("*\r\n");
cyberjoey 10:148da21c297e 847
cyberjoey 10:148da21c297e 848 // Read contents from file
cyberjoey 10:148da21c297e 849 char c = fgetc(fp);
cyberjoey 10:148da21c297e 850 while (!feof(fp))
cyberjoey 10:148da21c297e 851 {
cyberjoey 10:148da21c297e 852 pc.printf("%c", c);
cyberjoey 10:148da21c297e 853 c = fgetc(fp);
cyberjoey 10:148da21c297e 854 }
cyberjoey 10:148da21c297e 855
cyberjoey 10:148da21c297e 856 pc.printf("*\r\n");
cyberjoey 10:148da21c297e 857
cyberjoey 10:148da21c297e 858 fclose(fp);
cyberjoey 10:148da21c297e 859 }
cyberjoey 10:148da21c297e 860 else
cyberjoey 10:148da21c297e 861 {
cyberjoey 10:148da21c297e 862 return false;
cyberjoey 10:148da21c297e 863 }
cyberjoey 10:148da21c297e 864 return true;
cyberjoey 10:148da21c297e 865 }
cyberjoey 10:148da21c297e 866
cyberjoey 11:94a7379c0db8 867 int getline(char **lineptr, int *n, FILE *stream) {
cyberjoey 11:94a7379c0db8 868 char *bufptr = NULL;
cyberjoey 11:94a7379c0db8 869 char *p = bufptr;
cyberjoey 11:94a7379c0db8 870 size_t size;
cyberjoey 11:94a7379c0db8 871 int c;
cyberjoey 11:94a7379c0db8 872
cyberjoey 11:94a7379c0db8 873 if (lineptr == NULL) {
cyberjoey 11:94a7379c0db8 874 return -1;
cyberjoey 11:94a7379c0db8 875 }
cyberjoey 11:94a7379c0db8 876 if (stream == NULL) {
cyberjoey 11:94a7379c0db8 877 return -1;
cyberjoey 11:94a7379c0db8 878 }
cyberjoey 11:94a7379c0db8 879 if (n == NULL) {
cyberjoey 11:94a7379c0db8 880 return -1;
cyberjoey 11:94a7379c0db8 881 }
cyberjoey 11:94a7379c0db8 882 bufptr = *lineptr;
cyberjoey 11:94a7379c0db8 883 size = *n;
cyberjoey 11:94a7379c0db8 884
cyberjoey 11:94a7379c0db8 885 c = fgetc(stream);
cyberjoey 11:94a7379c0db8 886 if (c == EOF) {
cyberjoey 11:94a7379c0db8 887 return -1;
cyberjoey 11:94a7379c0db8 888 }
cyberjoey 11:94a7379c0db8 889 if (bufptr == NULL) {
cyberjoey 11:94a7379c0db8 890 bufptr = (char *)malloc(128);
cyberjoey 11:94a7379c0db8 891 if (bufptr == NULL) {
cyberjoey 11:94a7379c0db8 892 return -1;
cyberjoey 11:94a7379c0db8 893 }
cyberjoey 11:94a7379c0db8 894 size = 128;
cyberjoey 11:94a7379c0db8 895 }
cyberjoey 11:94a7379c0db8 896 p = bufptr;
cyberjoey 11:94a7379c0db8 897 while(c != EOF) {
cyberjoey 11:94a7379c0db8 898 if ((p - bufptr) > (size - 1)) {
cyberjoey 11:94a7379c0db8 899 size = size + 128;
cyberjoey 11:94a7379c0db8 900 bufptr = (char *)realloc(bufptr, size);
cyberjoey 11:94a7379c0db8 901 if (bufptr == NULL) {
cyberjoey 11:94a7379c0db8 902 return -1;
cyberjoey 11:94a7379c0db8 903 }
cyberjoey 11:94a7379c0db8 904 }
cyberjoey 11:94a7379c0db8 905 *p++ = c;
cyberjoey 11:94a7379c0db8 906 if (c == '\n') {
cyberjoey 11:94a7379c0db8 907 break;
cyberjoey 11:94a7379c0db8 908 }
cyberjoey 11:94a7379c0db8 909 c = fgetc(stream);
cyberjoey 11:94a7379c0db8 910 }
cyberjoey 11:94a7379c0db8 911
cyberjoey 11:94a7379c0db8 912 *p++ = '\0';
cyberjoey 11:94a7379c0db8 913 *lineptr = bufptr;
cyberjoey 11:94a7379c0db8 914 *n = size;
cyberjoey 11:94a7379c0db8 915
cyberjoey 11:94a7379c0db8 916 return p - bufptr - 1;
cyberjoey 11:94a7379c0db8 917 }
cyberjoey 11:94a7379c0db8 918
cyberjoey 14:480f2398fe6a 919 bool print_settings_file_2()
cyberjoey 14:480f2398fe6a 920 {
cyberjoey 14:480f2398fe6a 921 char * line = NULL;
cyberjoey 14:480f2398fe6a 922 int len = 0;
cyberjoey 14:480f2398fe6a 923
cyberjoey 14:480f2398fe6a 924 FILE *fp = fopen(settings_file, "r");
cyberjoey 14:480f2398fe6a 925 if (fp != NULL)
cyberjoey 14:480f2398fe6a 926 {
cyberjoey 14:480f2398fe6a 927 pc.printf("*\r\n");
cyberjoey 14:480f2398fe6a 928
cyberjoey 14:480f2398fe6a 929 // Read contents from file
cyberjoey 14:480f2398fe6a 930 while ((getline(&line, &len, fp)) != -1)
cyberjoey 14:480f2398fe6a 931 {
cyberjoey 14:480f2398fe6a 932 pc.printf("%s", line);
cyberjoey 14:480f2398fe6a 933 }
cyberjoey 14:480f2398fe6a 934 pc.printf("*\r\n");
cyberjoey 14:480f2398fe6a 935
cyberjoey 14:480f2398fe6a 936 fclose(fp);
cyberjoey 14:480f2398fe6a 937 }
cyberjoey 14:480f2398fe6a 938 else
cyberjoey 14:480f2398fe6a 939 {
cyberjoey 14:480f2398fe6a 940 return false;
cyberjoey 14:480f2398fe6a 941 }
cyberjoey 14:480f2398fe6a 942 return true;
cyberjoey 14:480f2398fe6a 943 }
cyberjoey 14:480f2398fe6a 944
cyberjoey 11:94a7379c0db8 945 //returns true if settings file exists and is in the proper format
cyberjoey 11:94a7379c0db8 946 bool apply_settings_file(bool (&logged_devices)[MAX_DEVICES], int& interval)
cyberjoey 11:94a7379c0db8 947 {
cyberjoey 11:94a7379c0db8 948
cyberjoey 11:94a7379c0db8 949 char * line = NULL;
cyberjoey 11:94a7379c0db8 950 int len = 0;
cyberjoey 11:94a7379c0db8 951 int line_number = 0;
cyberjoey 11:94a7379c0db8 952
cyberjoey 11:94a7379c0db8 953
cyberjoey 11:94a7379c0db8 954 FILE *fp = fopen("/sd/settings.txt", "r");
cyberjoey 11:94a7379c0db8 955 if (fp != NULL)
cyberjoey 11:94a7379c0db8 956 {
cyberjoey 11:94a7379c0db8 957
cyberjoey 11:94a7379c0db8 958 //initialize devices to all false;
cyberjoey 11:94a7379c0db8 959 for(int i = 0; i < MAX_DEVICES; i++)
cyberjoey 11:94a7379c0db8 960 {
cyberjoey 11:94a7379c0db8 961 logged_devices[i] = false;
cyberjoey 11:94a7379c0db8 962 }
cyberjoey 11:94a7379c0db8 963
cyberjoey 11:94a7379c0db8 964 // Read contents from file
cyberjoey 11:94a7379c0db8 965 while ((getline(&line, &len, fp)) != -1)
cyberjoey 11:94a7379c0db8 966 {
cyberjoey 11:94a7379c0db8 967 line_number++;
cyberjoey 11:94a7379c0db8 968
cyberjoey 11:94a7379c0db8 969 char i = 0;
cyberjoey 11:94a7379c0db8 970 char c = line[i];
cyberjoey 11:94a7379c0db8 971 while(c != '\0')
cyberjoey 11:94a7379c0db8 972 {
cyberjoey 11:94a7379c0db8 973 int number;
cyberjoey 11:94a7379c0db8 974 int n;
cyberjoey 11:94a7379c0db8 975 sscanf((line+i), "%d%n", &number, &n);
cyberjoey 11:94a7379c0db8 976 if(isdigit(c))
cyberjoey 11:94a7379c0db8 977 {
cyberjoey 11:94a7379c0db8 978 if(line_number == 1)
cyberjoey 11:94a7379c0db8 979 {
cyberjoey 11:94a7379c0db8 980 interval = number;
cyberjoey 11:94a7379c0db8 981 }
cyberjoey 11:94a7379c0db8 982 else if(line_number == 2)
cyberjoey 11:94a7379c0db8 983 {
cyberjoey 11:94a7379c0db8 984 logged_devices[number] = true;
cyberjoey 11:94a7379c0db8 985 }
cyberjoey 11:94a7379c0db8 986 if(n > 1)
cyberjoey 11:94a7379c0db8 987 i = i + (n - 1);
cyberjoey 11:94a7379c0db8 988 }
cyberjoey 11:94a7379c0db8 989 i++;
cyberjoey 11:94a7379c0db8 990 c = line[i];
cyberjoey 11:94a7379c0db8 991 }
cyberjoey 11:94a7379c0db8 992 }
cyberjoey 11:94a7379c0db8 993
cyberjoey 11:94a7379c0db8 994 fclose(fp);
cyberjoey 11:94a7379c0db8 995 }
cyberjoey 11:94a7379c0db8 996 else
cyberjoey 11:94a7379c0db8 997 {
cyberjoey 11:94a7379c0db8 998 return false;
cyberjoey 11:94a7379c0db8 999 }
cyberjoey 11:94a7379c0db8 1000
cyberjoey 11:94a7379c0db8 1001 return true;
cyberjoey 11:94a7379c0db8 1002
cyberjoey 11:94a7379c0db8 1003 }
cyberjoey 11:94a7379c0db8 1004
cyberjoey 9:36ba3626aab7 1005 //******************************************************************************
cyberjoey 9:36ba3626aab7 1006 // main()
cyberjoey 9:36ba3626aab7 1007 //******************************************************************************
cyberjoey 9:36ba3626aab7 1008
cyberjoey 9:36ba3626aab7 1009
switches 0:60a522ae2e35 1010 int main()
switches 0:60a522ae2e35 1011 {
cyberjoey 9:36ba3626aab7 1012
cyberjoey 9:36ba3626aab7 1013 char data[130];
cyberjoey 9:36ba3626aab7 1014 int device_count = 0; // number of OW devices found by search_rom()
cyberjoey 9:36ba3626aab7 1015 int i;
cyberjoey 9:36ba3626aab7 1016 int j;
cyberjoey 9:36ba3626aab7 1017 int k;
cyberjoey 9:36ba3626aab7 1018
cyberjoey 9:36ba3626aab7 1019
cyberjoey 9:36ba3626aab7 1020 char device_id[ID_LENGTH]; //8 byte rom id of current slected device
cyberjoey 9:36ba3626aab7 1021 char rom_id_list[MAX_DEVICES][ID_LENGTH]; //List of rom id for each device on OW bus
cyberjoey 9:36ba3626aab7 1022
cyberjoey 9:36ba3626aab7 1023 double T[MAX_DEVICES];
cyberjoey 9:36ba3626aab7 1024
cyberjoey 10:148da21c297e 1025 bool device_logged[MAX_DEVICES];
cyberjoey 11:94a7379c0db8 1026 //initialize device_logged to all false;
cyberjoey 11:94a7379c0db8 1027 for(int i = 0; i < MAX_DEVICES; i++)
cyberjoey 11:94a7379c0db8 1028 {
cyberjoey 11:94a7379c0db8 1029 device_logged[i] = false;
cyberjoey 11:94a7379c0db8 1030 }
cyberjoey 10:148da21c297e 1031
cyberjoey 9:36ba3626aab7 1032 // i/o variables
cyberjoey 9:36ba3626aab7 1033 char rx_buff[128]; // comport input buffer
cyberjoey 9:36ba3626aab7 1034 int rx_index; // rx_buffer pointer
cyberjoey 9:36ba3626aab7 1035 char c; // command type character
cyberjoey 9:36ba3626aab7 1036 int n; // argument count
cyberjoey 9:36ba3626aab7 1037 int arg1; // argumnet 1
cyberjoey 9:36ba3626aab7 1038 int arg2; // argument 2
cyberjoey 9:36ba3626aab7 1039 int device; // device argument
cyberjoey 9:36ba3626aab7 1040 int num_bytes;
cyberjoey 9:36ba3626aab7 1041
cyberjoey 9:36ba3626aab7 1042 int time_count;
cyberjoey 9:36ba3626aab7 1043 int log_interval = PERIOD;
cyberjoey 9:36ba3626aab7 1044 int time_to_sample;
cyberjoey 9:36ba3626aab7 1045
cyberjoey 11:94a7379c0db8 1046 apply_settings_file(device_logged, log_interval);
cyberjoey 11:94a7379c0db8 1047
cyberjoey 9:36ba3626aab7 1048 //************* init ticker timer callbacks ****************
cyberjoey 12:aa9fff0aec91 1049 timer_1.attach(&LED_blink_callback,0.5); //start ticker, once per sec.
cyberjoey 9:36ba3626aab7 1050
cyberjoey 9:36ba3626aab7 1051
cyberjoey 12:aa9fff0aec91 1052 i2c.frequency(400000); //set I2C clock to 400kHz
cyberjoey 9:36ba3626aab7 1053
cyberjoey 9:36ba3626aab7 1054 rLED = LED_OFF;
switches 6:96d8d823e292 1055 gLED = LED_ON;
cyberjoey 9:36ba3626aab7 1056 bLED = LED_ON;
cyberjoey 9:36ba3626aab7 1057
cyberjoey 9:36ba3626aab7 1058
cyberjoey 9:36ba3626aab7 1059 // reset DS2484
cyberjoey 9:36ba3626aab7 1060 data[0] = 0xE1;
cyberjoey 9:36ba3626aab7 1061 data[1] = 0xF0;
cyberjoey 9:36ba3626aab7 1062 i2c.write(DS2484_ADD,data,1,1);
cyberjoey 13:674c647d12dd 1063 i2c.read(DS2484_ADD,data,1);
cyberjoey 9:36ba3626aab7 1064
cyberjoey 9:36ba3626aab7 1065 // ****************** search for all OW devices on bus *****************
cyberjoey 9:36ba3626aab7 1066
cyberjoey 9:36ba3626aab7 1067 device_count = search_rom(rom_id_list);
cyberjoey 9:36ba3626aab7 1068
cyberjoey 9:36ba3626aab7 1069 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1070 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1071 device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1072 }
cyberjoey 9:36ba3626aab7 1073 set_test_mode(device_id);
cyberjoey 9:36ba3626aab7 1074 }
cyberjoey 9:36ba3626aab7 1075
cyberjoey 9:36ba3626aab7 1076
cyberjoey 9:36ba3626aab7 1077 rx_index = 0; //character buffer index for input from PC
cyberjoey 9:36ba3626aab7 1078
cyberjoey 9:36ba3626aab7 1079 button.fall(&btn_pressed);
cyberjoey 11:94a7379c0db8 1080 SDInsert.fall(&sd_insert);
cyberjoey 11:94a7379c0db8 1081
cyberjoey 11:94a7379c0db8 1082 sd.disk_initialize(); //initialize sd card
cyberjoey 9:36ba3626aab7 1083
cyberjoey 9:36ba3626aab7 1084 while(1) { // start main loop, take data if logging, check for input, repeat
cyberjoey 9:36ba3626aab7 1085
cyberjoey 11:94a7379c0db8 1086 if(sd_insert_flag == true)
cyberjoey 11:94a7379c0db8 1087 {
cyberjoey 11:94a7379c0db8 1088 sd.disk_initialize();
cyberjoey 11:94a7379c0db8 1089 sd_insert_flag = false;
cyberjoey 11:94a7379c0db8 1090 }
cyberjoey 11:94a7379c0db8 1091
cyberjoey 9:36ba3626aab7 1092 if(button_flag == true)
cyberjoey 9:36ba3626aab7 1093 {
cyberjoey 9:36ba3626aab7 1094 if(log_flag == false){ //start logging
cyberjoey 9:36ba3626aab7 1095
cyberjoey 9:36ba3626aab7 1096 if(SDDetect)//if SD card not detected
cyberjoey 9:36ba3626aab7 1097 {
cyberjoey 9:36ba3626aab7 1098 error_flag = true;
cyberjoey 9:36ba3626aab7 1099 error_ticks = 6;
cyberjoey 9:36ba3626aab7 1100 log_flag = false;
cyberjoey 9:36ba3626aab7 1101 }
cyberjoey 9:36ba3626aab7 1102 else
cyberjoey 9:36ba3626aab7 1103 {
cyberjoey 11:94a7379c0db8 1104 apply_settings_file(device_logged, log_interval);
cyberjoey 11:94a7379c0db8 1105
cyberjoey 10:148da21c297e 1106 FILE *fp = fopen(log_file, "a");
cyberjoey 9:36ba3626aab7 1107 if (fp != NULL)
cyberjoey 9:36ba3626aab7 1108 {
cyberjoey 9:36ba3626aab7 1109 fprintf(fp, "Time(s)");
cyberjoey 9:36ba3626aab7 1110
cyberjoey 9:36ba3626aab7 1111 for(j=0;j<device_count;j++)
cyberjoey 9:36ba3626aab7 1112 {
cyberjoey 11:94a7379c0db8 1113 if(device_logged[j])
cyberjoey 11:94a7379c0db8 1114 fprintf(fp,", Device %d Temperature (C)",j);
cyberjoey 9:36ba3626aab7 1115 }
cyberjoey 9:36ba3626aab7 1116 fprintf(fp,"\r\n");
cyberjoey 9:36ba3626aab7 1117
cyberjoey 9:36ba3626aab7 1118 fclose(fp);
cyberjoey 9:36ba3626aab7 1119 }
cyberjoey 9:36ba3626aab7 1120
cyberjoey 9:36ba3626aab7 1121 time_count = 0;
cyberjoey 9:36ba3626aab7 1122
cyberjoey 9:36ba3626aab7 1123 time_to_sample = 0; // force sample at time = 0;
cyberjoey 9:36ba3626aab7 1124 tick_flag = true; // force sample at time = 0;
cyberjoey 9:36ba3626aab7 1125 log_flag = true;
cyberjoey 9:36ba3626aab7 1126 }
cyberjoey 9:36ba3626aab7 1127 }else{
cyberjoey 9:36ba3626aab7 1128 log_flag = false;
cyberjoey 9:36ba3626aab7 1129 }
cyberjoey 9:36ba3626aab7 1130 button_flag = false;
cyberjoey 9:36ba3626aab7 1131 }
switches 1:90313362ec11 1132
cyberjoey 9:36ba3626aab7 1133 while(tick_flag == false){ //check for input while waiting for next tick
cyberjoey 9:36ba3626aab7 1134
cyberjoey 9:36ba3626aab7 1135 // ----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 1136 // test for charater input for USB com port
cyberjoey 9:36ba3626aab7 1137 // ----------------------------------------------------------------------------
cyberjoey 9:36ba3626aab7 1138
cyberjoey 9:36ba3626aab7 1139 //test if PC sent some charaters
cyberjoey 9:36ba3626aab7 1140 while(pc.readable()){ //characters in buffer, get them
cyberjoey 9:36ba3626aab7 1141 rx_buff[rx_index] = pc.getc();
cyberjoey 9:36ba3626aab7 1142
cyberjoey 9:36ba3626aab7 1143 if(rx_buff[rx_index] == CR){
cyberjoey 9:36ba3626aab7 1144 rx_buff[++rx_index] = 0;
cyberjoey 9:36ba3626aab7 1145 rx_index = -1; // because i++ at end of while give i=0 on next loop
cyberjoey 9:36ba3626aab7 1146 device = 0;
cyberjoey 9:36ba3626aab7 1147 arg1 = 0;
cyberjoey 9:36ba3626aab7 1148 arg2 = 0;
cyberjoey 9:36ba3626aab7 1149
cyberjoey 9:36ba3626aab7 1150 n = sscanf(rx_buff, " %c %d %x %x", &c, & device, &arg1, &arg2);
cyberjoey 9:36ba3626aab7 1151 //process input
cyberjoey 9:36ba3626aab7 1152 if(n > 0){//got input so process it
cyberjoey 9:36ba3626aab7 1153 switch(c){
cyberjoey 9:36ba3626aab7 1154 case 'a':
cyberjoey 9:36ba3626aab7 1155 case 'A': // alarm search
cyberjoey 9:36ba3626aab7 1156 // ****************** search for all OW devices with alarm triggered on bus *****************
cyberjoey 9:36ba3626aab7 1157
cyberjoey 9:36ba3626aab7 1158 device_count = alarm_search(rom_id_list);
cyberjoey 9:36ba3626aab7 1159
cyberjoey 9:36ba3626aab7 1160 pc.printf("%d devices:\r\n", device_count);
cyberjoey 9:36ba3626aab7 1161 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1162 pc.printf("device[%02X] rom id[",j);
cyberjoey 9:36ba3626aab7 1163 for(i=7;i>=0;i--){
cyberjoey 9:36ba3626aab7 1164 pc.printf("%02X",rom_id_list[j][i]);
cyberjoey 9:36ba3626aab7 1165 }
cyberjoey 9:36ba3626aab7 1166 pc.printf("]\r\n");
cyberjoey 9:36ba3626aab7 1167 }
cyberjoey 9:36ba3626aab7 1168 break;
cyberjoey 11:94a7379c0db8 1169 case 'c':
cyberjoey 11:94a7379c0db8 1170 case 'C':
cyberjoey 11:94a7379c0db8 1171 if(!SDDetect)
cyberjoey 11:94a7379c0db8 1172 pc.printf("y\r\n");
cyberjoey 11:94a7379c0db8 1173 else
cyberjoey 11:94a7379c0db8 1174 pc.printf("n\r\n");
cyberjoey 11:94a7379c0db8 1175 break;
cyberjoey 10:148da21c297e 1176 case 'd':
cyberjoey 10:148da21c297e 1177 case 'D':
cyberjoey 10:148da21c297e 1178 if(n==1) // if no device number is given
cyberjoey 10:148da21c297e 1179 {
cyberjoey 10:148da21c297e 1180 //clear device_logged array
cyberjoey 10:148da21c297e 1181 for(int i = 0; i < MAX_DEVICES; i++)
cyberjoey 10:148da21c297e 1182 {
cyberjoey 10:148da21c297e 1183 device_logged[i] = false;
cyberjoey 10:148da21c297e 1184 }
cyberjoey 10:148da21c297e 1185
cyberjoey 10:148da21c297e 1186 write_settings_file(log_interval, device_logged);
cyberjoey 10:148da21c297e 1187 }
cyberjoey 10:148da21c297e 1188 if(n == 2)
cyberjoey 10:148da21c297e 1189 {
cyberjoey 10:148da21c297e 1190 device_logged[device] = true;
cyberjoey 10:148da21c297e 1191 write_settings_file(log_interval, device_logged);
cyberjoey 10:148da21c297e 1192 }
cyberjoey 10:148da21c297e 1193 break;
cyberjoey 9:36ba3626aab7 1194 case 'f':
cyberjoey 9:36ba3626aab7 1195 case 'F': //f is for "flash" for microSD
cyberjoey 12:aa9fff0aec91 1196 if(!SDDetect)
cyberjoey 9:36ba3626aab7 1197 pc.printf("y\r\n");
cyberjoey 9:36ba3626aab7 1198 else
cyberjoey 12:aa9fff0aec91 1199 pc.printf("n\r\n");
cyberjoey 12:aa9fff0aec91 1200 /*apply_settings_file(device_logged, log_interval);
cyberjoey 11:94a7379c0db8 1201 pc.printf("Interval: %d\r\n", log_interval);
cyberjoey 11:94a7379c0db8 1202 bool no_devices = true;
cyberjoey 11:94a7379c0db8 1203 for(i = 0; i < MAX_DEVICES; i ++)
cyberjoey 11:94a7379c0db8 1204 {
cyberjoey 11:94a7379c0db8 1205 if(device_logged[i])
cyberjoey 11:94a7379c0db8 1206 {
cyberjoey 11:94a7379c0db8 1207 pc.printf("Device %d is being logged.\r\n", i);
cyberjoey 11:94a7379c0db8 1208 no_devices = false;
cyberjoey 11:94a7379c0db8 1209 }
cyberjoey 11:94a7379c0db8 1210
cyberjoey 11:94a7379c0db8 1211 }
cyberjoey 11:94a7379c0db8 1212 if(no_devices)
cyberjoey 12:aa9fff0aec91 1213 pc.printf("No devices being logged.\r\n", i);*/
cyberjoey 9:36ba3626aab7 1214 break;
cyberjoey 10:148da21c297e 1215 case 'g':
cyberjoey 10:148da21c297e 1216 case 'G':
cyberjoey 10:148da21c297e 1217 //0 means get config, 1 means get log
cyberjoey 10:148da21c297e 1218 if(n == 2)
cyberjoey 10:148da21c297e 1219 {
cyberjoey 10:148da21c297e 1220 bool fileExists = false;
cyberjoey 10:148da21c297e 1221 if(device == 0)//get config
cyberjoey 10:148da21c297e 1222 {
cyberjoey 10:148da21c297e 1223 fileExists = print_settings_file();
cyberjoey 14:480f2398fe6a 1224 //fileExists = print_settings_file_2();
cyberjoey 10:148da21c297e 1225 }
cyberjoey 10:148da21c297e 1226 if(device == 1)//get log
cyberjoey 10:148da21c297e 1227 {
cyberjoey 10:148da21c297e 1228 fileExists = print_log_file();
cyberjoey 10:148da21c297e 1229 }
cyberjoey 10:148da21c297e 1230 if(!fileExists)
cyberjoey 10:148da21c297e 1231 {
cyberjoey 10:148da21c297e 1232 pc.printf("no_file\r\n");
cyberjoey 10:148da21c297e 1233 }
cyberjoey 10:148da21c297e 1234 }
cyberjoey 10:148da21c297e 1235 break;
cyberjoey 9:36ba3626aab7 1236 case 'i':
cyberjoey 9:36ba3626aab7 1237 case 'I': //Set Logging sample intreval in seconds
cyberjoey 9:36ba3626aab7 1238
cyberjoey 9:36ba3626aab7 1239 log_interval = device;
cyberjoey 9:36ba3626aab7 1240 if(log_interval < 1)log_interval = 1;
cyberjoey 10:148da21c297e 1241 if(log_interval > 60)log_interval = 60;
cyberjoey 10:148da21c297e 1242 write_settings_file(log_interval, device_logged);
cyberjoey 9:36ba3626aab7 1243 break;
cyberjoey 9:36ba3626aab7 1244 case 'l':
cyberjoey 9:36ba3626aab7 1245 case 'L': // Toggle logging
cyberjoey 9:36ba3626aab7 1246
cyberjoey 9:36ba3626aab7 1247 if(log_flag == false){ //start logging
cyberjoey 9:36ba3626aab7 1248 if(SDDetect)//if SD card not detected
cyberjoey 9:36ba3626aab7 1249 {
cyberjoey 9:36ba3626aab7 1250 error_flag = true;
cyberjoey 9:36ba3626aab7 1251 error_ticks = 6;
cyberjoey 9:36ba3626aab7 1252 log_flag = false;
cyberjoey 9:36ba3626aab7 1253 }
cyberjoey 9:36ba3626aab7 1254 else
cyberjoey 9:36ba3626aab7 1255 {
cyberjoey 10:148da21c297e 1256 FILE *fp = fopen(log_file, "a");
cyberjoey 9:36ba3626aab7 1257 if (fp != NULL)
cyberjoey 9:36ba3626aab7 1258 {
cyberjoey 9:36ba3626aab7 1259 fprintf(fp, "Time(s)");
cyberjoey 9:36ba3626aab7 1260
cyberjoey 9:36ba3626aab7 1261 for(j=0;j<device_count;j++)
cyberjoey 9:36ba3626aab7 1262 {
cyberjoey 9:36ba3626aab7 1263 fprintf(fp,", Device %d Temperature (C)",j);
cyberjoey 9:36ba3626aab7 1264 }
cyberjoey 9:36ba3626aab7 1265 fprintf(fp,"\r\n");
cyberjoey 9:36ba3626aab7 1266
cyberjoey 9:36ba3626aab7 1267 fclose(fp);
cyberjoey 9:36ba3626aab7 1268 }
cyberjoey 9:36ba3626aab7 1269
cyberjoey 9:36ba3626aab7 1270 time_count = 0;
cyberjoey 9:36ba3626aab7 1271
cyberjoey 9:36ba3626aab7 1272 time_to_sample = 0; // force sample at time = 0;
cyberjoey 9:36ba3626aab7 1273 tick_flag = true; // force sample at time = 0;
cyberjoey 9:36ba3626aab7 1274 log_flag = true;
cyberjoey 9:36ba3626aab7 1275 }
cyberjoey 9:36ba3626aab7 1276 }else{
cyberjoey 9:36ba3626aab7 1277 //pc.printf("<stop logging>\r\n");
cyberjoey 9:36ba3626aab7 1278 log_flag = false;
cyberjoey 9:36ba3626aab7 1279 }
cyberjoey 9:36ba3626aab7 1280 break;
cyberjoey 9:36ba3626aab7 1281 case 'P':
cyberjoey 9:36ba3626aab7 1282 case 'p': // power down One Wire buss
cyberjoey 9:36ba3626aab7 1283 if(n == 2){
cyberjoey 9:36ba3626aab7 1284 if (device == 0){ // power down mode ON.
cyberjoey 9:36ba3626aab7 1285 data[0] = WDC; // 0xD2 Write Device Config
cyberjoey 9:36ba3626aab7 1286 data[1] = 0xD2; // 1101 0010 set 1WS = 0, SPU = 0, PDN = 1, APU = 0
cyberjoey 9:36ba3626aab7 1287 i2c.write(DS2484_ADD,data,2,0);
cyberjoey 9:36ba3626aab7 1288 pc.printf("<Power down DQ>\r\n");
cyberjoey 9:36ba3626aab7 1289 }else{ // power down mode OFF
cyberjoey 9:36ba3626aab7 1290 data[0] = WDC; // 0xD2 Write Device Config
cyberjoey 9:36ba3626aab7 1291 data[1] = 0xE1; // 1110 0001 set 1WS = 0, SPU = 0, PDN = 0, APU = 1
cyberjoey 9:36ba3626aab7 1292 i2c.write(DS2484_ADD,data,2,0);
cyberjoey 9:36ba3626aab7 1293 pc.printf("<Power up DQ>\r\n");
cyberjoey 9:36ba3626aab7 1294 }
cyberjoey 9:36ba3626aab7 1295 }
cyberjoey 9:36ba3626aab7 1296 break;
cyberjoey 9:36ba3626aab7 1297 case 'r':
cyberjoey 9:36ba3626aab7 1298 case 'R': //read register "r device radd.start radd.end"
cyberjoey 9:36ba3626aab7 1299 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1300 device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1301 }
cyberjoey 9:36ba3626aab7 1302 if(n==3){ //read single register from selected device
cyberjoey 9:36ba3626aab7 1303 read_OW_register(device_id,arg1,1,data);
cyberjoey 9:36ba3626aab7 1304 pc.printf("device[%02X] add[%02X] data[%02X] crc[%02X %02X]\r\n",device,arg1,data[0],data[1],data[2]);
cyberjoey 9:36ba3626aab7 1305 }
cyberjoey 9:36ba3626aab7 1306 if(n==4){ //read a range of regesters from selected device
cyberjoey 9:36ba3626aab7 1307 num_bytes = arg2-arg1 + 1; // calculate number of bytes to read
cyberjoey 9:36ba3626aab7 1308 if (num_bytes < 1) num_bytes = 1; // if arg2 <= arg 1 just read arg1 address.
cyberjoey 9:36ba3626aab7 1309 read_OW_register(device_id,arg1,num_bytes,data);
cyberjoey 9:36ba3626aab7 1310 for(i=0;i<num_bytes;i++){
cyberjoey 9:36ba3626aab7 1311 pc.printf("\r\ndevice[%02X] add[%02X] data[%02X]",device,arg1+i,data[i]);
cyberjoey 9:36ba3626aab7 1312 }
cyberjoey 9:36ba3626aab7 1313 pc.printf(" crc[%02X %02X]\r\n",data[i],data[i+1]);
cyberjoey 9:36ba3626aab7 1314 }
cyberjoey 9:36ba3626aab7 1315 break;
cyberjoey 9:36ba3626aab7 1316
cyberjoey 9:36ba3626aab7 1317 case 's':
cyberjoey 9:36ba3626aab7 1318 case 'S': // search rom
cyberjoey 9:36ba3626aab7 1319 // ****************** search for all OW devices on bus *****************
cyberjoey 9:36ba3626aab7 1320
cyberjoey 9:36ba3626aab7 1321 device_count = search_rom(rom_id_list);
cyberjoey 9:36ba3626aab7 1322
cyberjoey 9:36ba3626aab7 1323 // print out rom codes found
cyberjoey 9:36ba3626aab7 1324 //pc.printf("\r\nsearch rom\r\n");
cyberjoey 9:36ba3626aab7 1325 pc.printf("%d devices:\r\n", device_count);
cyberjoey 9:36ba3626aab7 1326 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1327 pc.printf("device[%02X] rom id[",j);
cyberjoey 9:36ba3626aab7 1328 for(i=7;i>=0;i--){
cyberjoey 9:36ba3626aab7 1329 pc.printf("%02X",rom_id_list[j][i]);
cyberjoey 9:36ba3626aab7 1330 }
cyberjoey 9:36ba3626aab7 1331 pc.printf("]\r\n");
cyberjoey 13:674c647d12dd 1332 }
cyberjoey 9:36ba3626aab7 1333 break;
cyberjoey 9:36ba3626aab7 1334
cyberjoey 9:36ba3626aab7 1335 case 'T':
cyberjoey 9:36ba3626aab7 1336 case 't':
cyberjoey 9:36ba3626aab7 1337 if(n == 2){//get temperatures from selected device
cyberjoey 9:36ba3626aab7 1338 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1339 device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1340 }
cyberjoey 9:36ba3626aab7 1341 convert_temperature(device_id); //send OW convert selected device
cyberjoey 9:36ba3626aab7 1342 wait(0.02); //wait 20 ms for convert temperature to complete
cyberjoey 9:36ba3626aab7 1343 T[0] = get_temperature(device_id);
cyberjoey 13:674c647d12dd 1344 pc.printf("device[%02X] temperature[%.3f]\r\n",device,T[0]);
cyberjoey 9:36ba3626aab7 1345 }
cyberjoey 9:36ba3626aab7 1346 if(n == 3){ // "t 1 5" get temperature for devices 1 thru 5
cyberjoey 9:36ba3626aab7 1347
cyberjoey 9:36ba3626aab7 1348 convert_temperature(); //send OW convert to all devices
cyberjoey 9:36ba3626aab7 1349 wait(0.02); //wait 750 ms for convert temperature to complete
cyberjoey 9:36ba3626aab7 1350 for(j=device;j<=arg1;j++){
cyberjoey 9:36ba3626aab7 1351 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1352 device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1353 }
cyberjoey 9:36ba3626aab7 1354 pc.printf("device[%02X] temperature[%.3f]\r\n",j,get_temperature(device_id));
cyberjoey 13:674c647d12dd 1355 }
cyberjoey 9:36ba3626aab7 1356 }
cyberjoey 9:36ba3626aab7 1357 break;
cyberjoey 9:36ba3626aab7 1358
cyberjoey 9:36ba3626aab7 1359 case 'w':
cyberjoey 9:36ba3626aab7 1360 case 'W': //write register "w device w.addr data"
cyberjoey 9:36ba3626aab7 1361 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1362 device_id[k] = rom_id_list[device][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1363 }
cyberjoey 9:36ba3626aab7 1364 data[0] = arg2;
cyberjoey 9:36ba3626aab7 1365 write_OW_register(device_id, arg1, 1, data);
cyberjoey 9:36ba3626aab7 1366
cyberjoey 9:36ba3626aab7 1367 pc.printf("write -- device[%02X] add[%02X] data[%02X] ",device,arg1,arg2);
cyberjoey 9:36ba3626aab7 1368
cyberjoey 13:674c647d12dd 1369 // get CRC
cyberjoey 9:36ba3626aab7 1370 pc.printf("crc[%02X %02X]\r\n",data[0],data[1]);
cyberjoey 9:36ba3626aab7 1371
cyberjoey 9:36ba3626aab7 1372 break;
cyberjoey 9:36ba3626aab7 1373
cyberjoey 9:36ba3626aab7 1374 case 'x':
cyberjoey 9:36ba3626aab7 1375 case 'X': // experimental modes
cyberjoey 9:36ba3626aab7 1376 // ****************** set up ADC enabled in test mode*****************
cyberjoey 9:36ba3626aab7 1377 pc.printf("<set ADC_ENABLED in test mode>\r\n");
cyberjoey 9:36ba3626aab7 1378
cyberjoey 9:36ba3626aab7 1379 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1380 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1381 device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1382 }
cyberjoey 9:36ba3626aab7 1383 set_test_mode(device_id);
cyberjoey 9:36ba3626aab7 1384 }
cyberjoey 9:36ba3626aab7 1385 break;
cyberjoey 9:36ba3626aab7 1386
cyberjoey 9:36ba3626aab7 1387
cyberjoey 9:36ba3626aab7 1388 }//end switch(c)
cyberjoey 9:36ba3626aab7 1389 }//if(n>0)
cyberjoey 9:36ba3626aab7 1390 }//end if(CR)
cyberjoey 9:36ba3626aab7 1391 if(rx_buff[rx_index] == BS){//backspace received, back up buffer pointer
cyberjoey 9:36ba3626aab7 1392 if(rx_index>0)rx_index--;//remove last char from buffer if not at start.
cyberjoey 9:36ba3626aab7 1393 }else rx_index++;
cyberjoey 9:36ba3626aab7 1394 }//end while(pc.redable())
cyberjoey 9:36ba3626aab7 1395 wait(0.1); // slow down polling
switches 0:60a522ae2e35 1396
cyberjoey 9:36ba3626aab7 1397 }// end (while tick == false)
cyberjoey 9:36ba3626aab7 1398 tick_flag = false; // set to false for next time
cyberjoey 9:36ba3626aab7 1399
cyberjoey 9:36ba3626aab7 1400 // only reached when tick_flag = true otherwise stuck in pc.readable() loop
cyberjoey 13:674c647d12dd 1401 if(log_flag == true){
cyberjoey 9:36ba3626aab7 1402 if(time_count >= time_to_sample){ //take next sample
cyberjoey 9:36ba3626aab7 1403 time_to_sample += log_interval; // calculate time for next sample
cyberjoey 9:36ba3626aab7 1404
cyberjoey 9:36ba3626aab7 1405 // start conversion
cyberjoey 9:36ba3626aab7 1406 convert_temperature();
cyberjoey 9:36ba3626aab7 1407 wait(0.02); //wait 20ms for convert to complete
cyberjoey 9:36ba3626aab7 1408 for(j=0;j<device_count;j++){
cyberjoey 9:36ba3626aab7 1409 for(k=0;k<8;k++){
cyberjoey 9:36ba3626aab7 1410 device_id[k] = rom_id_list[j][k]; // get device_id from rom_id_list
cyberjoey 9:36ba3626aab7 1411 }
cyberjoey 9:36ba3626aab7 1412 T[j] = get_temperature(device_id);
cyberjoey 9:36ba3626aab7 1413 }
cyberjoey 13:674c647d12dd 1414
cyberjoey 13:674c647d12dd 1415 //open file for microSD logging
cyberjoey 10:148da21c297e 1416 FILE *fp = fopen(log_file, "a");
cyberjoey 9:36ba3626aab7 1417 if (fp != NULL)
cyberjoey 9:36ba3626aab7 1418 {
cyberjoey 9:36ba3626aab7 1419 //fprintf(fp, "\n");
cyberjoey 10:148da21c297e 1420 fprintf(fp, "%d",time_count);
cyberjoey 9:36ba3626aab7 1421 for(j=0;j<device_count;j++)
cyberjoey 9:36ba3626aab7 1422 {
cyberjoey 11:94a7379c0db8 1423 if(device_logged[j])
cyberjoey 11:94a7379c0db8 1424 {
cyberjoey 11:94a7379c0db8 1425 fprintf(fp,", %.3f",T[j]);
cyberjoey 11:94a7379c0db8 1426 }
cyberjoey 11:94a7379c0db8 1427
cyberjoey 9:36ba3626aab7 1428 }
cyberjoey 9:36ba3626aab7 1429 fprintf(fp,"\r\n");
cyberjoey 9:36ba3626aab7 1430
cyberjoey 9:36ba3626aab7 1431 fclose(fp);
cyberjoey 9:36ba3626aab7 1432 }
cyberjoey 9:36ba3626aab7 1433 }// end if(time_count >= time_to_sample)
cyberjoey 9:36ba3626aab7 1434 time_count ++; //
cyberjoey 9:36ba3626aab7 1435
cyberjoey 9:36ba3626aab7 1436 }// end if(log_flag)
cyberjoey 9:36ba3626aab7 1437
cyberjoey 9:36ba3626aab7 1438 }//end while(1)
switches 0:60a522ae2e35 1439 }