Melbourne specific temperature/humidity sensor

Dependencies:   EALib EthernetInterface SHTx mbed-rtos mbed

Committer:
BPPearson
Date:
Fri May 06 10:19:50 2016 +0000
Revision:
0:4bbf12d35a8c
First revision - Melbourne specifics
;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BPPearson 0:4bbf12d35a8c 1 #include "mbed.h"
BPPearson 0:4bbf12d35a8c 2 #include "EthernetInterface.h"
BPPearson 0:4bbf12d35a8c 3 #include "QSPIFileSystem.h"
BPPearson 0:4bbf12d35a8c 4 #include "SHTx/sht15.hpp"
BPPearson 0:4bbf12d35a8c 5
BPPearson 0:4bbf12d35a8c 6
BPPearson 0:4bbf12d35a8c 7 #define ECHO_SERVER_PORT 7
BPPearson 0:4bbf12d35a8c 8 #define on 0
BPPearson 0:4bbf12d35a8c 9 #define off 1
BPPearson 0:4bbf12d35a8c 10 #define DESIRED_SIZE_IN_MB (1)
BPPearson 0:4bbf12d35a8c 11
BPPearson 0:4bbf12d35a8c 12 // devices
BPPearson 0:4bbf12d35a8c 13 Serial pc(USBTX, USBRX); // tx, rx
BPPearson 0:4bbf12d35a8c 14 DigitalOut led1(LED1);
BPPearson 0:4bbf12d35a8c 15 DigitalOut led2(LED2);
BPPearson 0:4bbf12d35a8c 16 DigitalOut led3(LED3);
BPPearson 0:4bbf12d35a8c 17 DigitalOut led4(LED4);
BPPearson 0:4bbf12d35a8c 18 DigitalIn ipReset(p23,PullUp);
BPPearson 0:4bbf12d35a8c 19 QSPIFileSystem qspifs("qspi");
BPPearson 0:4bbf12d35a8c 20 SHTx::SHT15 sensor(p32, p31);
BPPearson 0:4bbf12d35a8c 21 EthernetInterface eth;
BPPearson 0:4bbf12d35a8c 22 TCPSocketServer server;
BPPearson 0:4bbf12d35a8c 23 TCPSocketConnection client;
BPPearson 0:4bbf12d35a8c 24 Ticker oneSecondTick;
BPPearson 0:4bbf12d35a8c 25 DigitalOut hostQueryLED(p24);
BPPearson 0:4bbf12d35a8c 26 DigitalOut timingPulse(p25);
BPPearson 0:4bbf12d35a8c 27
BPPearson 0:4bbf12d35a8c 28 // variables
BPPearson 0:4bbf12d35a8c 29 char ipStr[20];
BPPearson 0:4bbf12d35a8c 30 char subnetStr[20];
BPPearson 0:4bbf12d35a8c 31 char gatewayStr[20];
BPPearson 0:4bbf12d35a8c 32 char inBuff[256];
BPPearson 0:4bbf12d35a8c 33 char outBuff[256];
BPPearson 0:4bbf12d35a8c 34 float currTemperature = 25.4;
BPPearson 0:4bbf12d35a8c 35 float currHumidity = 78.3;
BPPearson 0:4bbf12d35a8c 36 int flashLedCnt = 4;
BPPearson 0:4bbf12d35a8c 37 int cnt = 0;
BPPearson 0:4bbf12d35a8c 38 bool sensorCommsFault;
BPPearson 0:4bbf12d35a8c 39 int ipResetCount = 0;
BPPearson 0:4bbf12d35a8c 40
BPPearson 0:4bbf12d35a8c 41 // procedure declarations
BPPearson 0:4bbf12d35a8c 42 void initSensor();
BPPearson 0:4bbf12d35a8c 43 void readSensor();
BPPearson 0:4bbf12d35a8c 44 void oneSecondTimer();
BPPearson 0:4bbf12d35a8c 45 bool readConfigFile();
BPPearson 0:4bbf12d35a8c 46 void writeConfigFile();
BPPearson 0:4bbf12d35a8c 47 void processRcvBuffer(char *inBuff);
BPPearson 0:4bbf12d35a8c 48
BPPearson 0:4bbf12d35a8c 49
BPPearson 0:4bbf12d35a8c 50
BPPearson 0:4bbf12d35a8c 51 int main()
BPPearson 0:4bbf12d35a8c 52 {
BPPearson 0:4bbf12d35a8c 53 char *macAddr;
BPPearson 0:4bbf12d35a8c 54 //char *hello = "Hello\n";
BPPearson 0:4bbf12d35a8c 55
BPPearson 0:4bbf12d35a8c 56 // get mac address and print it to PC
BPPearson 0:4bbf12d35a8c 57 //macAddr = eth.getMACAddress();
BPPearson 0:4bbf12d35a8c 58 //pc.printf("MAC address %s\n", macAddr);
BPPearson 0:4bbf12d35a8c 59
BPPearson 0:4bbf12d35a8c 60 // check if file system already formatted
BPPearson 0:4bbf12d35a8c 61 if (!qspifs.isformatted())
BPPearson 0:4bbf12d35a8c 62 { pc.printf("Format qspi file system\n");
BPPearson 0:4bbf12d35a8c 63 qspifs.format(DESIRED_SIZE_IN_MB);
BPPearson 0:4bbf12d35a8c 64 }
BPPearson 0:4bbf12d35a8c 65
BPPearson 0:4bbf12d35a8c 66 // try to read config file which contains the IP address, subnet and gateway
BPPearson 0:4bbf12d35a8c 67 /* if (readConfigFile())
BPPearson 0:4bbf12d35a8c 68 {
BPPearson 0:4bbf12d35a8c 69 pc.printf("Config file ethernet details\n %s\n %s\n %s\n", ipStr, subnetStr, gatewayStr);
BPPearson 0:4bbf12d35a8c 70 // set IP address from config file
BPPearson 0:4bbf12d35a8c 71 eth.init(ipStr, subnetStr, gatewayStr);
BPPearson 0:4bbf12d35a8c 72 }
BPPearson 0:4bbf12d35a8c 73 else
BPPearson 0:4bbf12d35a8c 74 {
BPPearson 0:4bbf12d35a8c 75 pc.printf("default ethernet address\n");
BPPearson 0:4bbf12d35a8c 76 // set to a default IP address, subnet and gateway
BPPearson 0:4bbf12d35a8c 77 strcpy(ipStr, "10.39.123.123");
BPPearson 0:4bbf12d35a8c 78 strcpy(subnetStr, "255.255.0.0");
BPPearson 0:4bbf12d35a8c 79 strcpy(gatewayStr,"10.39.1.1");
BPPearson 0:4bbf12d35a8c 80
BPPearson 0:4bbf12d35a8c 81 // initialise the IP stack to these defaults
BPPearson 0:4bbf12d35a8c 82 eth.init(ipStr, subnetStr, gatewayStr);
BPPearson 0:4bbf12d35a8c 83
BPPearson 0:4bbf12d35a8c 84 // save default settings as working config
BPPearson 0:4bbf12d35a8c 85 writeConfigFile();
BPPearson 0:4bbf12d35a8c 86 }
BPPearson 0:4bbf12d35a8c 87 */
BPPearson 0:4bbf12d35a8c 88
BPPearson 0:4bbf12d35a8c 89 eth.init(); //Use DHCP
BPPearson 0:4bbf12d35a8c 90 eth.connect();
BPPearson 0:4bbf12d35a8c 91
BPPearson 0:4bbf12d35a8c 92 // get mac address and print it to PC
BPPearson 0:4bbf12d35a8c 93 macAddr = eth.getMACAddress();
BPPearson 0:4bbf12d35a8c 94 pc.printf("MAC address %s\n", macAddr);
BPPearson 0:4bbf12d35a8c 95
BPPearson 0:4bbf12d35a8c 96 pc.printf("IP Address is %s\n", eth.getIPAddress());
BPPearson 0:4bbf12d35a8c 97
BPPearson 0:4bbf12d35a8c 98 // turn off all the leds on the chip
BPPearson 0:4bbf12d35a8c 99 led1 = 1;
BPPearson 0:4bbf12d35a8c 100 led2 = 1;
BPPearson 0:4bbf12d35a8c 101 led3 = 0;
BPPearson 0:4bbf12d35a8c 102 led4 = 0;
BPPearson 0:4bbf12d35a8c 103
BPPearson 0:4bbf12d35a8c 104 // bind to the required port
BPPearson 0:4bbf12d35a8c 105 server.bind(ECHO_SERVER_PORT);
BPPearson 0:4bbf12d35a8c 106
BPPearson 0:4bbf12d35a8c 107 // put into listen mode
BPPearson 0:4bbf12d35a8c 108 server.listen();
BPPearson 0:4bbf12d35a8c 109
BPPearson 0:4bbf12d35a8c 110 // initialise the sensor
BPPearson 0:4bbf12d35a8c 111 initSensor();
BPPearson 0:4bbf12d35a8c 112
BPPearson 0:4bbf12d35a8c 113 // start the one second tick that does periodic tasks such as read the sensor and toggle the activity LED
BPPearson 0:4bbf12d35a8c 114 oneSecondTick.attach(&oneSecondTimer, 1);
BPPearson 0:4bbf12d35a8c 115
BPPearson 0:4bbf12d35a8c 116 // do forever
BPPearson 0:4bbf12d35a8c 117 while (1)
BPPearson 0:4bbf12d35a8c 118 {
BPPearson 0:4bbf12d35a8c 119 // configure stack ready to accept a client connection
BPPearson 0:4bbf12d35a8c 120 server.accept(client);
BPPearson 0:4bbf12d35a8c 121
BPPearson 0:4bbf12d35a8c 122 // wait for a connection request from the client (receipt of a packet)
BPPearson 0:4bbf12d35a8c 123 client.set_blocking(true, 0);
BPPearson 0:4bbf12d35a8c 124
BPPearson 0:4bbf12d35a8c 125 // get received packet from client
BPPearson 0:4bbf12d35a8c 126 int n = client.receive(inBuff, sizeof(inBuff));
BPPearson 0:4bbf12d35a8c 127
BPPearson 0:4bbf12d35a8c 128 // process the request from the client
BPPearson 0:4bbf12d35a8c 129 processRcvBuffer(inBuff);
BPPearson 0:4bbf12d35a8c 130
BPPearson 0:4bbf12d35a8c 131 // close the client connection
BPPearson 0:4bbf12d35a8c 132 client.close();
BPPearson 0:4bbf12d35a8c 133
BPPearson 0:4bbf12d35a8c 134 // pulse LED 4 to show ethernet activity
BPPearson 0:4bbf12d35a8c 135 hostQueryLED = 0;
BPPearson 0:4bbf12d35a8c 136 wait(0.1);
BPPearson 0:4bbf12d35a8c 137 hostQueryLED = 1;
BPPearson 0:4bbf12d35a8c 138
BPPearson 0:4bbf12d35a8c 139 //pc.printf("Sensor update\n");
BPPearson 0:4bbf12d35a8c 140 //pc.printf("Temp %5.1f, Humidity %5.1f\n", currTemperature, currHumidity );
BPPearson 0:4bbf12d35a8c 141 }}
BPPearson 0:4bbf12d35a8c 142
BPPearson 0:4bbf12d35a8c 143
BPPearson 0:4bbf12d35a8c 144
BPPearson 0:4bbf12d35a8c 145 void initSensor()
BPPearson 0:4bbf12d35a8c 146 {
BPPearson 0:4bbf12d35a8c 147
BPPearson 0:4bbf12d35a8c 148 // reset sensor just to check if it can be communicated with (returns true)
BPPearson 0:4bbf12d35a8c 149 if (sensor.reset())
BPPearson 0:4bbf12d35a8c 150 {
BPPearson 0:4bbf12d35a8c 151 sensorCommsFault = false;
BPPearson 0:4bbf12d35a8c 152 pc.printf("Sensor reset\n");
BPPearson 0:4bbf12d35a8c 153
BPPearson 0:4bbf12d35a8c 154 // set temperature in celcius
BPPearson 0:4bbf12d35a8c 155 sensor.setScale(false);
BPPearson 0:4bbf12d35a8c 156
BPPearson 0:4bbf12d35a8c 157 // optimise speed of sensor
BPPearson 0:4bbf12d35a8c 158 if (!sensor.setOTPReload(false))
BPPearson 0:4bbf12d35a8c 159 {
BPPearson 0:4bbf12d35a8c 160 sensorCommsFault = true;
BPPearson 0:4bbf12d35a8c 161 pc.printf("Set OTP reload\n");
BPPearson 0:4bbf12d35a8c 162 }
BPPearson 0:4bbf12d35a8c 163
BPPearson 0:4bbf12d35a8c 164 // set resolution to high (14 bits for temperature, 12 bits for humidity)
BPPearson 0:4bbf12d35a8c 165 if (!sensor.setResolution(false))
BPPearson 0:4bbf12d35a8c 166 {
BPPearson 0:4bbf12d35a8c 167 sensorCommsFault = true;
BPPearson 0:4bbf12d35a8c 168 pc.printf("Set resolution\n");
BPPearson 0:4bbf12d35a8c 169 }
BPPearson 0:4bbf12d35a8c 170 }
BPPearson 0:4bbf12d35a8c 171 else
BPPearson 0:4bbf12d35a8c 172 {
BPPearson 0:4bbf12d35a8c 173 sensorCommsFault = true;
BPPearson 0:4bbf12d35a8c 174 pc.printf("Sensor comms fault\n");
BPPearson 0:4bbf12d35a8c 175 }
BPPearson 0:4bbf12d35a8c 176 }
BPPearson 0:4bbf12d35a8c 177
BPPearson 0:4bbf12d35a8c 178
BPPearson 0:4bbf12d35a8c 179 void readSensor()
BPPearson 0:4bbf12d35a8c 180 {
BPPearson 0:4bbf12d35a8c 181 bool goodRead = false;
BPPearson 0:4bbf12d35a8c 182
BPPearson 0:4bbf12d35a8c 183 if (!sensorCommsFault)
BPPearson 0:4bbf12d35a8c 184 {
BPPearson 0:4bbf12d35a8c 185 timingPulse = 1;
BPPearson 0:4bbf12d35a8c 186
BPPearson 0:4bbf12d35a8c 187 goodRead = sensor.update();
BPPearson 0:4bbf12d35a8c 188
BPPearson 0:4bbf12d35a8c 189 timingPulse = 0;
BPPearson 0:4bbf12d35a8c 190
BPPearson 0:4bbf12d35a8c 191 // trigger a measurement
BPPearson 0:4bbf12d35a8c 192 if (goodRead == true)
BPPearson 0:4bbf12d35a8c 193 {
BPPearson 0:4bbf12d35a8c 194 // get temperature in celcius
BPPearson 0:4bbf12d35a8c 195 currTemperature = sensor.getTemperature();
BPPearson 0:4bbf12d35a8c 196
BPPearson 0:4bbf12d35a8c 197 // get relative humidity
BPPearson 0:4bbf12d35a8c 198 currHumidity = sensor.getHumidity();
BPPearson 0:4bbf12d35a8c 199 }
BPPearson 0:4bbf12d35a8c 200 else
BPPearson 0:4bbf12d35a8c 201 {
BPPearson 0:4bbf12d35a8c 202 currTemperature = -1.0F;
BPPearson 0:4bbf12d35a8c 203
BPPearson 0:4bbf12d35a8c 204 currHumidity = -1.0F;
BPPearson 0:4bbf12d35a8c 205 }
BPPearson 0:4bbf12d35a8c 206
BPPearson 0:4bbf12d35a8c 207 }
BPPearson 0:4bbf12d35a8c 208 else // return error values
BPPearson 0:4bbf12d35a8c 209 {
BPPearson 0:4bbf12d35a8c 210 currTemperature = -1.0F;
BPPearson 0:4bbf12d35a8c 211
BPPearson 0:4bbf12d35a8c 212 currHumidity = -1.0F;
BPPearson 0:4bbf12d35a8c 213 }
BPPearson 0:4bbf12d35a8c 214 }
BPPearson 0:4bbf12d35a8c 215
BPPearson 0:4bbf12d35a8c 216
BPPearson 0:4bbf12d35a8c 217
BPPearson 0:4bbf12d35a8c 218 void oneSecondTimer()
BPPearson 0:4bbf12d35a8c 219 {
BPPearson 0:4bbf12d35a8c 220
BPPearson 0:4bbf12d35a8c 221 // if end of pulse sequence and LED still lit
BPPearson 0:4bbf12d35a8c 222 if (flashLedCnt == 0 && led4 == 1)
BPPearson 0:4bbf12d35a8c 223 {
BPPearson 0:4bbf12d35a8c 224 // turn off LED
BPPearson 0:4bbf12d35a8c 225 led4 = 0;
BPPearson 0:4bbf12d35a8c 226 }
BPPearson 0:4bbf12d35a8c 227
BPPearson 0:4bbf12d35a8c 228 // if location LED still requires pulsing
BPPearson 0:4bbf12d35a8c 229 if (flashLedCnt > 0)
BPPearson 0:4bbf12d35a8c 230 {
BPPearson 0:4bbf12d35a8c 231 // toggle the LED indicator
BPPearson 0:4bbf12d35a8c 232 led4 = flashLedCnt & 1;
BPPearson 0:4bbf12d35a8c 233
BPPearson 0:4bbf12d35a8c 234 // decrement the count
BPPearson 0:4bbf12d35a8c 235 flashLedCnt--;
BPPearson 0:4bbf12d35a8c 236 }
BPPearson 0:4bbf12d35a8c 237
BPPearson 0:4bbf12d35a8c 238 // check if user pushbutton pressed (low)
BPPearson 0:4bbf12d35a8c 239 if (ipReset == 0)
BPPearson 0:4bbf12d35a8c 240 {
BPPearson 0:4bbf12d35a8c 241 // increment the counter
BPPearson 0:4bbf12d35a8c 242 ipResetCount++;
BPPearson 0:4bbf12d35a8c 243
BPPearson 0:4bbf12d35a8c 244 // turn on a LED for seconds 1 to 4
BPPearson 0:4bbf12d35a8c 245 switch (ipResetCount)
BPPearson 0:4bbf12d35a8c 246 {
BPPearson 0:4bbf12d35a8c 247 case 1:
BPPearson 0:4bbf12d35a8c 248 led1 = 0;
BPPearson 0:4bbf12d35a8c 249 break;
BPPearson 0:4bbf12d35a8c 250 case 2:
BPPearson 0:4bbf12d35a8c 251 led2 = 0;
BPPearson 0:4bbf12d35a8c 252 break;
BPPearson 0:4bbf12d35a8c 253 case 3:
BPPearson 0:4bbf12d35a8c 254 led3 = 1;
BPPearson 0:4bbf12d35a8c 255 break;
BPPearson 0:4bbf12d35a8c 256 case 4:
BPPearson 0:4bbf12d35a8c 257 led4 = 1;
BPPearson 0:4bbf12d35a8c 258 break;
BPPearson 0:4bbf12d35a8c 259 case 5:
BPPearson 0:4bbf12d35a8c 260 // turn off all the leds on the chip to indicate change of IP address
BPPearson 0:4bbf12d35a8c 261 led1 = 1;
BPPearson 0:4bbf12d35a8c 262 led2 = 1;
BPPearson 0:4bbf12d35a8c 263 led3 = 0;
BPPearson 0:4bbf12d35a8c 264 led4 = 0;
BPPearson 0:4bbf12d35a8c 265 break;
BPPearson 0:4bbf12d35a8c 266 default: ;
BPPearson 0:4bbf12d35a8c 267 }
BPPearson 0:4bbf12d35a8c 268
BPPearson 0:4bbf12d35a8c 269 // if button pressed for 5 seconds
BPPearson 0:4bbf12d35a8c 270 if (ipResetCount >= 5)
BPPearson 0:4bbf12d35a8c 271 {
BPPearson 0:4bbf12d35a8c 272 // initialise the IP address back to the default value
BPPearson 0:4bbf12d35a8c 273 strcpy(ipStr, "10.39.123.123");
BPPearson 0:4bbf12d35a8c 274 strcpy(subnetStr, "255.255.0.0");
BPPearson 0:4bbf12d35a8c 275 strcpy(gatewayStr,"10.39.1.1");
BPPearson 0:4bbf12d35a8c 276
BPPearson 0:4bbf12d35a8c 277 // save to config file
BPPearson 0:4bbf12d35a8c 278 writeConfigFile();
BPPearson 0:4bbf12d35a8c 279 }
BPPearson 0:4bbf12d35a8c 280 }
BPPearson 0:4bbf12d35a8c 281 else
BPPearson 0:4bbf12d35a8c 282 {
BPPearson 0:4bbf12d35a8c 283 // reset the counter
BPPearson 0:4bbf12d35a8c 284 ipResetCount = 0;
BPPearson 0:4bbf12d35a8c 285
BPPearson 0:4bbf12d35a8c 286 // turn off all the leds on the chip
BPPearson 0:4bbf12d35a8c 287 led1 = 1;
BPPearson 0:4bbf12d35a8c 288 led2 = 1;
BPPearson 0:4bbf12d35a8c 289 led3 = 0;
BPPearson 0:4bbf12d35a8c 290 led4 = 0;
BPPearson 0:4bbf12d35a8c 291 }
BPPearson 0:4bbf12d35a8c 292 }
BPPearson 0:4bbf12d35a8c 293
BPPearson 0:4bbf12d35a8c 294
BPPearson 0:4bbf12d35a8c 295 bool readConfigFile()
BPPearson 0:4bbf12d35a8c 296 {
BPPearson 0:4bbf12d35a8c 297 int digits;
BPPearson 0:4bbf12d35a8c 298 int octet1, octet2, octet3, octet4;
BPPearson 0:4bbf12d35a8c 299 bool ipOk = false;
BPPearson 0:4bbf12d35a8c 300 bool subnetOk = false;
BPPearson 0:4bbf12d35a8c 301 bool gatewayOk = false;
BPPearson 0:4bbf12d35a8c 302
BPPearson 0:4bbf12d35a8c 303 // open file pointer to config data
BPPearson 0:4bbf12d35a8c 304 FILE *fp = fopen("/qspi/config.dat", "r");
BPPearson 0:4bbf12d35a8c 305
BPPearson 0:4bbf12d35a8c 306 // if open successful
BPPearson 0:4bbf12d35a8c 307 if (fp != NULL)
BPPearson 0:4bbf12d35a8c 308 {
BPPearson 0:4bbf12d35a8c 309 // read 20 byte blocks for each parameter
BPPearson 0:4bbf12d35a8c 310 fread(ipStr, 20, 1, fp);
BPPearson 0:4bbf12d35a8c 311 fread(subnetStr, 20, 1, fp);
BPPearson 0:4bbf12d35a8c 312 fread(gatewayStr, 20, 1, fp);
BPPearson 0:4bbf12d35a8c 313
BPPearson 0:4bbf12d35a8c 314 // close the file pointer
BPPearson 0:4bbf12d35a8c 315 fclose(fp);
BPPearson 0:4bbf12d35a8c 316
BPPearson 0:4bbf12d35a8c 317 // break the IP address down to individual octets and return number of octets read
BPPearson 0:4bbf12d35a8c 318 digits = sscanf(ipStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
BPPearson 0:4bbf12d35a8c 319
BPPearson 0:4bbf12d35a8c 320 // check if 4 octets and all within range
BPPearson 0:4bbf12d35a8c 321 if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
BPPearson 0:4bbf12d35a8c 322 ipOk = true;
BPPearson 0:4bbf12d35a8c 323
BPPearson 0:4bbf12d35a8c 324 // break the subnet down to individual octets and return number of octets read
BPPearson 0:4bbf12d35a8c 325 digits = sscanf(subnetStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
BPPearson 0:4bbf12d35a8c 326
BPPearson 0:4bbf12d35a8c 327 // check if 4 octets and all within range
BPPearson 0:4bbf12d35a8c 328 if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
BPPearson 0:4bbf12d35a8c 329 subnetOk = true;
BPPearson 0:4bbf12d35a8c 330
BPPearson 0:4bbf12d35a8c 331 // break the gateway down to individual octets and return number of octets read
BPPearson 0:4bbf12d35a8c 332 digits = sscanf(gatewayStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
BPPearson 0:4bbf12d35a8c 333
BPPearson 0:4bbf12d35a8c 334 // check if 4 octets and all within range
BPPearson 0:4bbf12d35a8c 335 if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
BPPearson 0:4bbf12d35a8c 336 gatewayOk = true;
BPPearson 0:4bbf12d35a8c 337
BPPearson 0:4bbf12d35a8c 338 // if IP address, subnet and gateway valid
BPPearson 0:4bbf12d35a8c 339 if (ipOk && subnetOk && gatewayOk)
BPPearson 0:4bbf12d35a8c 340 return true;
BPPearson 0:4bbf12d35a8c 341 else
BPPearson 0:4bbf12d35a8c 342 return false;
BPPearson 0:4bbf12d35a8c 343 }
BPPearson 0:4bbf12d35a8c 344 return false;
BPPearson 0:4bbf12d35a8c 345 }
BPPearson 0:4bbf12d35a8c 346
BPPearson 0:4bbf12d35a8c 347
BPPearson 0:4bbf12d35a8c 348
BPPearson 0:4bbf12d35a8c 349 void writeConfigFile()
BPPearson 0:4bbf12d35a8c 350 {
BPPearson 0:4bbf12d35a8c 351
BPPearson 0:4bbf12d35a8c 352 // open file pointer to config data file
BPPearson 0:4bbf12d35a8c 353 FILE *fp = fopen("/qspi/config.dat", "w");
BPPearson 0:4bbf12d35a8c 354
BPPearson 0:4bbf12d35a8c 355 // if valid handle returned
BPPearson 0:4bbf12d35a8c 356 if (fp != NULL)
BPPearson 0:4bbf12d35a8c 357 {
BPPearson 0:4bbf12d35a8c 358 // write the IP address, subnet and gateway as 3 twenty byte blocks
BPPearson 0:4bbf12d35a8c 359 fwrite(ipStr, 20, 1, fp);
BPPearson 0:4bbf12d35a8c 360 fwrite(subnetStr, 20, 1, fp);
BPPearson 0:4bbf12d35a8c 361 fwrite(gatewayStr, 20, 1, fp);
BPPearson 0:4bbf12d35a8c 362
BPPearson 0:4bbf12d35a8c 363 // close the file handle
BPPearson 0:4bbf12d35a8c 364 fclose(fp);
BPPearson 0:4bbf12d35a8c 365 }
BPPearson 0:4bbf12d35a8c 366 }
BPPearson 0:4bbf12d35a8c 367
BPPearson 0:4bbf12d35a8c 368
BPPearson 0:4bbf12d35a8c 369
BPPearson 0:4bbf12d35a8c 370
BPPearson 0:4bbf12d35a8c 371
BPPearson 0:4bbf12d35a8c 372
BPPearson 0:4bbf12d35a8c 373 void processRcvBuffer(char *inBuff)
BPPearson 0:4bbf12d35a8c 374 {
BPPearson 0:4bbf12d35a8c 375 int digits;
BPPearson 0:4bbf12d35a8c 376 int octet1, octet2, octet3, octet4;
BPPearson 0:4bbf12d35a8c 377 bool ipOk = false;
BPPearson 0:4bbf12d35a8c 378 bool subnetOk = false;
BPPearson 0:4bbf12d35a8c 379 bool gatewayOk = false;
BPPearson 0:4bbf12d35a8c 380 char *cPtr = outBuff;
BPPearson 0:4bbf12d35a8c 381
BPPearson 0:4bbf12d35a8c 382 switch (inBuff[0])
BPPearson 0:4bbf12d35a8c 383 {
BPPearson 0:4bbf12d35a8c 384 case 'r': // return temperature and humidity readings
BPPearson 0:4bbf12d35a8c 385
BPPearson 0:4bbf12d35a8c 386 readSensor();
BPPearson 0:4bbf12d35a8c 387
BPPearson 0:4bbf12d35a8c 388 // get temperature and humidity in a string
BPPearson 0:4bbf12d35a8c 389 sprintf( cPtr, "%5.1f\n%5.1f\n", currTemperature, currHumidity );
BPPearson 0:4bbf12d35a8c 390
BPPearson 0:4bbf12d35a8c 391 // send readings back to client
BPPearson 0:4bbf12d35a8c 392 client.send_all(outBuff, strlen(outBuff));
BPPearson 0:4bbf12d35a8c 393 break;
BPPearson 0:4bbf12d35a8c 394 case 'i': // could be id or ip
BPPearson 0:4bbf12d35a8c 395 switch (inBuff[1])
BPPearson 0:4bbf12d35a8c 396 {
BPPearson 0:4bbf12d35a8c 397 case 'd': // flash a led to identify this device
BPPearson 0:4bbf12d35a8c 398 flashLedCnt = 10;
BPPearson 0:4bbf12d35a8c 399 break;
BPPearson 0:4bbf12d35a8c 400 case 'p': // set the IP address to that contained in this packet
BPPearson 0:4bbf12d35a8c 401 // split packet up into seperate strings - ip add, subnet and gateway
BPPearson 0:4bbf12d35a8c 402 sscanf(inBuff, "ip %s\n%s\n%s", ipStr, subnetStr, gatewayStr);
BPPearson 0:4bbf12d35a8c 403
BPPearson 0:4bbf12d35a8c 404 //pc.printf("ip %s\nSubnet %s\ngateway %s\n", ipStr, subnetStr, gatewayStr);
BPPearson 0:4bbf12d35a8c 405
BPPearson 0:4bbf12d35a8c 406 // check if ip address valid
BPPearson 0:4bbf12d35a8c 407 digits = sscanf(ipStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
BPPearson 0:4bbf12d35a8c 408
BPPearson 0:4bbf12d35a8c 409 if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
BPPearson 0:4bbf12d35a8c 410 ipOk = true;
BPPearson 0:4bbf12d35a8c 411
BPPearson 0:4bbf12d35a8c 412 //pc.printf("ip %d.%d.%d.%d\n", octet1, octet2, octet3, octet4 );
BPPearson 0:4bbf12d35a8c 413
BPPearson 0:4bbf12d35a8c 414 // check if subnet valid
BPPearson 0:4bbf12d35a8c 415 digits = sscanf(subnetStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
BPPearson 0:4bbf12d35a8c 416
BPPearson 0:4bbf12d35a8c 417 //pc.printf("subnet %d.%d.%d.%d\n", octet1, octet2, octet3, octet4 );
BPPearson 0:4bbf12d35a8c 418
BPPearson 0:4bbf12d35a8c 419 if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
BPPearson 0:4bbf12d35a8c 420 subnetOk = true;
BPPearson 0:4bbf12d35a8c 421
BPPearson 0:4bbf12d35a8c 422 // check if gateway valid
BPPearson 0:4bbf12d35a8c 423 digits = sscanf(gatewayStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
BPPearson 0:4bbf12d35a8c 424
BPPearson 0:4bbf12d35a8c 425 //pc.printf("gateway %d.%d.%d.%d\n", octet1, octet2, octet3, octet4 );
BPPearson 0:4bbf12d35a8c 426
BPPearson 0:4bbf12d35a8c 427 if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
BPPearson 0:4bbf12d35a8c 428 gatewayOk = true;
BPPearson 0:4bbf12d35a8c 429
BPPearson 0:4bbf12d35a8c 430 // if all valid
BPPearson 0:4bbf12d35a8c 431 if (ipOk && subnetOk && gatewayOk)
BPPearson 0:4bbf12d35a8c 432 {
BPPearson 0:4bbf12d35a8c 433 //pc.printf("Changing IP settings\n");
BPPearson 0:4bbf12d35a8c 434
BPPearson 0:4bbf12d35a8c 435 // save to config file
BPPearson 0:4bbf12d35a8c 436 writeConfigFile();
BPPearson 0:4bbf12d35a8c 437 }
BPPearson 0:4bbf12d35a8c 438 break;
BPPearson 0:4bbf12d35a8c 439 default: ;
BPPearson 0:4bbf12d35a8c 440 }
BPPearson 0:4bbf12d35a8c 441 break;
BPPearson 0:4bbf12d35a8c 442 default:
BPPearson 0:4bbf12d35a8c 443 break;
BPPearson 0:4bbf12d35a8c 444 }
BPPearson 0:4bbf12d35a8c 445 }
BPPearson 0:4bbf12d35a8c 446