Backing up an unused program in case of future need

Dependencies:   mbed

Committer:
andrewboyson
Date:
Thu Dec 06 11:40:19 2018 +0000
Revision:
8:45a0205a298f
Parent:
7:024ace6d943c
Backing up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 6:be97d38e0b01 1 #include "mbed.h"
andrewboyson 6:be97d38e0b01 2 #include "1-wire.h"
andrewboyson 6:be97d38e0b01 3 #include "log.h"
andrewboyson 6:be97d38e0b01 4 #include "io.h"
andrewboyson 6:be97d38e0b01 5 #include "wifi.h"
andrewboyson 6:be97d38e0b01 6 #include "ds18b20.h"
andrewboyson 6:be97d38e0b01 7
andrewboyson 7:024ace6d943c 8 #define DEBUG false //Set this to true to add debug messages to the log
andrewboyson 7:024ace6d943c 9
andrewboyson 6:be97d38e0b01 10 #define DEVICE_MAX 4
andrewboyson 4:e076884ef8bd 11
andrewboyson 6:be97d38e0b01 12 #define SEND_BUFFER_LENGTH 10
andrewboyson 4:e076884ef8bd 13 #define RECV_BUFFER_LENGTH 10
andrewboyson 4:e076884ef8bd 14 static char send[SEND_BUFFER_LENGTH];
andrewboyson 4:e076884ef8bd 15 static char recv[RECV_BUFFER_LENGTH];
andrewboyson 4:e076884ef8bd 16 static int sendlen = 0;
andrewboyson 4:e076884ef8bd 17 static int recvlen = 0;
andrewboyson 4:e076884ef8bd 18
andrewboyson 6:be97d38e0b01 19 int DS18B20DeviceCount = 0;
andrewboyson 6:be97d38e0b01 20 char DS18B20DeviceList[DEVICE_MAX * 8];
andrewboyson 6:be97d38e0b01 21 int16_t DS18B20Value[DEVICE_MAX];
andrewboyson 5:6226f3c566ef 22
andrewboyson 6:be97d38e0b01 23 int16_t DS18B20ValueFromRom(char* rom)
andrewboyson 6:be97d38e0b01 24 {
andrewboyson 6:be97d38e0b01 25 for (int device = 0; device < DS18B20DeviceCount; device++) if (memcmp(DS18B20DeviceList + 8 * device, rom, 8) == 0) return DS18B20Value[device];
andrewboyson 6:be97d38e0b01 26 return DS18B20_ERROR_NOT_FOUND;
andrewboyson 6:be97d38e0b01 27 }
andrewboyson 6:be97d38e0b01 28 char rom[8];
andrewboyson 6:be97d38e0b01 29 int allRomsFound = false;
andrewboyson 6:be97d38e0b01 30 static void searchRom(int first)
andrewboyson 4:e076884ef8bd 31 {
andrewboyson 4:e076884ef8bd 32 sendlen = 1;
andrewboyson 6:be97d38e0b01 33 send[0] = 0xF0; //Search Rom
andrewboyson 6:be97d38e0b01 34 recvlen = 0;
andrewboyson 6:be97d38e0b01 35 for (int i = 0; i < recvlen; i++) recv[i] = 0;
andrewboyson 6:be97d38e0b01 36 if (first) OneWireSearch(send[0], rom, &allRomsFound);
andrewboyson 6:be97d38e0b01 37 else OneWireSearch(send[0], NULL, NULL);
andrewboyson 4:e076884ef8bd 38 }
andrewboyson 6:be97d38e0b01 39 static void readScratchpad(int device)
andrewboyson 5:6226f3c566ef 40 {
andrewboyson 6:be97d38e0b01 41 sendlen = 10;
andrewboyson 6:be97d38e0b01 42 send[0] = 0x55; //Match Rom
andrewboyson 6:be97d38e0b01 43 for (int i = 0; i < 8; i++) send[i+1] = DS18B20DeviceList[device * 8 + i];
andrewboyson 6:be97d38e0b01 44 send[9] = 0xBE; //Read Scratchpad
andrewboyson 4:e076884ef8bd 45 recvlen = 9;
andrewboyson 5:6226f3c566ef 46 for (int i = 0; i < recvlen; i++) recv[i] = 0;
andrewboyson 4:e076884ef8bd 47 OneWireExchange(sendlen, recvlen, send, recv, 0);
andrewboyson 4:e076884ef8bd 48 }
andrewboyson 6:be97d38e0b01 49 static void convertT()
andrewboyson 4:e076884ef8bd 50 {
andrewboyson 4:e076884ef8bd 51 sendlen = 2;
andrewboyson 6:be97d38e0b01 52 send[0] = 0xCC; //Skip Rom
andrewboyson 6:be97d38e0b01 53 send[1] = 0x44; //Convert T
andrewboyson 4:e076884ef8bd 54 recvlen = 0;
andrewboyson 5:6226f3c566ef 55 for (int i = 0; i < recvlen; i++) recv[i] = 0;
andrewboyson 4:e076884ef8bd 56 OneWireExchange(sendlen, recvlen, send, recv, 750);
andrewboyson 4:e076884ef8bd 57 }
andrewboyson 5:6226f3c566ef 58 #define IDLE 0
andrewboyson 6:be97d38e0b01 59 #define LIST_FIRST_DEVICE 1
andrewboyson 6:be97d38e0b01 60 #define LIST_NEXT_DEVICE 2
andrewboyson 6:be97d38e0b01 61 #define CONVERT_T 3
andrewboyson 6:be97d38e0b01 62 #define READ_SCRATCH_PAD 4
andrewboyson 6:be97d38e0b01 63 #define EXTRACT_TEMPERATURE 5
andrewboyson 6:be97d38e0b01 64 static volatile int state = IDLE;
andrewboyson 6:be97d38e0b01 65 int DS18B20Busy() { return state; }
andrewboyson 5:6226f3c566ef 66 static int handlestate()
andrewboyson 4:e076884ef8bd 67 {
andrewboyson 5:6226f3c566ef 68 if (OneWireBusy()) return 0;
andrewboyson 6:be97d38e0b01 69 static int device;
andrewboyson 5:6226f3c566ef 70 switch (state)
andrewboyson 5:6226f3c566ef 71 {
andrewboyson 5:6226f3c566ef 72 case IDLE:
andrewboyson 7:024ace6d943c 73 state = LIST_FIRST_DEVICE;
andrewboyson 5:6226f3c566ef 74 break;
andrewboyson 6:be97d38e0b01 75 case LIST_FIRST_DEVICE:
andrewboyson 6:be97d38e0b01 76 device = 0;
andrewboyson 6:be97d38e0b01 77 searchRom(true);
andrewboyson 6:be97d38e0b01 78 state = LIST_NEXT_DEVICE;
andrewboyson 5:6226f3c566ef 79 break;
andrewboyson 6:be97d38e0b01 80 case LIST_NEXT_DEVICE:
andrewboyson 6:be97d38e0b01 81 if (OneWireResult())
andrewboyson 6:be97d38e0b01 82 {
andrewboyson 6:be97d38e0b01 83 state = IDLE;
andrewboyson 6:be97d38e0b01 84 }
andrewboyson 6:be97d38e0b01 85 else
andrewboyson 5:6226f3c566ef 86 {
andrewboyson 6:be97d38e0b01 87 for (int i = 0; i < 8; i++) DS18B20DeviceList[8 * device + i] = rom[i];
andrewboyson 6:be97d38e0b01 88 device++;
andrewboyson 6:be97d38e0b01 89 if (allRomsFound || device >= DEVICE_MAX)
andrewboyson 6:be97d38e0b01 90 {
andrewboyson 6:be97d38e0b01 91 DS18B20DeviceCount = device;
andrewboyson 6:be97d38e0b01 92 state = CONVERT_T;
andrewboyson 6:be97d38e0b01 93 }
andrewboyson 6:be97d38e0b01 94 else
andrewboyson 6:be97d38e0b01 95 {
andrewboyson 6:be97d38e0b01 96 searchRom(false);
andrewboyson 6:be97d38e0b01 97 }
andrewboyson 6:be97d38e0b01 98 }
andrewboyson 6:be97d38e0b01 99 break;
andrewboyson 6:be97d38e0b01 100 case CONVERT_T:
andrewboyson 6:be97d38e0b01 101 if (OneWireResult())
andrewboyson 6:be97d38e0b01 102 {
andrewboyson 6:be97d38e0b01 103 state = IDLE;
andrewboyson 5:6226f3c566ef 104 }
andrewboyson 5:6226f3c566ef 105 else
andrewboyson 5:6226f3c566ef 106 {
andrewboyson 6:be97d38e0b01 107 convertT();
andrewboyson 6:be97d38e0b01 108 device = 0;
andrewboyson 6:be97d38e0b01 109 state = READ_SCRATCH_PAD;
andrewboyson 6:be97d38e0b01 110 }
andrewboyson 6:be97d38e0b01 111 break;
andrewboyson 6:be97d38e0b01 112 case READ_SCRATCH_PAD:
andrewboyson 6:be97d38e0b01 113 if (OneWireResult())
andrewboyson 6:be97d38e0b01 114 {
andrewboyson 6:be97d38e0b01 115 state = IDLE;
andrewboyson 6:be97d38e0b01 116 }
andrewboyson 6:be97d38e0b01 117 else
andrewboyson 6:be97d38e0b01 118 {
andrewboyson 6:be97d38e0b01 119 readScratchpad(device);
andrewboyson 6:be97d38e0b01 120 state = EXTRACT_TEMPERATURE;
andrewboyson 5:6226f3c566ef 121 }
andrewboyson 6:be97d38e0b01 122 break;
andrewboyson 6:be97d38e0b01 123 case EXTRACT_TEMPERATURE:
andrewboyson 6:be97d38e0b01 124 switch (OneWireResult())
andrewboyson 6:be97d38e0b01 125 {
andrewboyson 6:be97d38e0b01 126 case ONE_WIRE_RESULT_OK:
andrewboyson 6:be97d38e0b01 127 DS18B20Value[device] = recv[1];
andrewboyson 6:be97d38e0b01 128 DS18B20Value[device] <<= 8;
andrewboyson 6:be97d38e0b01 129 DS18B20Value[device] |= recv[0];
andrewboyson 6:be97d38e0b01 130 break;
andrewboyson 6:be97d38e0b01 131 case ONE_WIRE_RESULT_CRC_ERROR: DS18B20Value[device] = DS18B20_ERROR_CRC; break;
andrewboyson 6:be97d38e0b01 132 case ONE_WIRE_RESULT_NO_DEVICE_PRESENT: DS18B20Value[device] = DS18B20_ERROR_NO_DEVICE_PRESENT; break;
andrewboyson 6:be97d38e0b01 133 case ONE_WIRE_RESULT_TIMED_OUT: DS18B20Value[device] = DS18B20_ERROR_TIMED_OUT; break;
andrewboyson 6:be97d38e0b01 134 case ONE_WIRE_RESULT_NO_DEVICE_PARTICIPATING: DS18B20Value[device] = DS18B20_ERROR_NO_DEVICE_PARTICIPATING; break;
andrewboyson 6:be97d38e0b01 135 default:
andrewboyson 6:be97d38e0b01 136 LogF("Unknown OneWireResult %d\r\n", OneWireResult());
andrewboyson 6:be97d38e0b01 137 break;
andrewboyson 6:be97d38e0b01 138 }
andrewboyson 6:be97d38e0b01 139 device++;
andrewboyson 6:be97d38e0b01 140 if (device < DS18B20DeviceCount) state = READ_SCRATCH_PAD;
andrewboyson 6:be97d38e0b01 141 else state = IDLE;
andrewboyson 5:6226f3c566ef 142 break;
andrewboyson 5:6226f3c566ef 143 default:
andrewboyson 5:6226f3c566ef 144 LogF("Unknown DS18B20 state %d\r\n", state);
andrewboyson 5:6226f3c566ef 145 return -1;
andrewboyson 5:6226f3c566ef 146 }
andrewboyson 4:e076884ef8bd 147 return 0;
andrewboyson 4:e076884ef8bd 148 }
andrewboyson 5:6226f3c566ef 149 static void logcomms()
andrewboyson 4:e076884ef8bd 150 {
andrewboyson 4:e076884ef8bd 151 static int wasbusy = false;
andrewboyson 4:e076884ef8bd 152 if (!OneWireBusy() && wasbusy)
andrewboyson 4:e076884ef8bd 153 {
andrewboyson 4:e076884ef8bd 154 LogF("1-wire | send:");
andrewboyson 4:e076884ef8bd 155 for (int i = 0; i < sendlen; i++) LogF(" %02x", send[i]);
andrewboyson 4:e076884ef8bd 156 LogF(" | recv:");
andrewboyson 4:e076884ef8bd 157 for (int i = 0; i < recvlen; i++) LogF(" %02x", recv[i]);
andrewboyson 4:e076884ef8bd 158 LogF("\r\n");
andrewboyson 4:e076884ef8bd 159 }
andrewboyson 4:e076884ef8bd 160 wasbusy = OneWireBusy();
andrewboyson 5:6226f3c566ef 161 }
andrewboyson 5:6226f3c566ef 162 int DS18B20Init()
andrewboyson 5:6226f3c566ef 163 {
andrewboyson 5:6226f3c566ef 164 return 0;
andrewboyson 5:6226f3c566ef 165 }
andrewboyson 5:6226f3c566ef 166 int DS18B20Main()
andrewboyson 5:6226f3c566ef 167 {
andrewboyson 5:6226f3c566ef 168
andrewboyson 7:024ace6d943c 169 if (DEBUG) logcomms();
andrewboyson 5:6226f3c566ef 170
andrewboyson 7:024ace6d943c 171 int r = handlestate(); if (r) return -1;
andrewboyson 5:6226f3c566ef 172
andrewboyson 4:e076884ef8bd 173 return 0;
andrewboyson 4:e076884ef8bd 174 }