Version 8, working version with Alix, sams and ollies code. Displays time, date and sensor info onto terminal, LCD and networking, and saves onto SD card.

Dependencies:   BMP280 ELEC350-Practicals-FZ429 TextLCD BME280 ntp-client

Committer:
Alix955
Date:
Fri Dec 07 13:24:50 2018 +0000
Revision:
9:f5eae5211225
Child:
10:eea19f8e6122
Version 5, mine & sams versions merged

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Alix955 9:f5eae5211225 1 #ifndef _NETWORK_
Alix955 9:f5eae5211225 2
Alix955 9:f5eae5211225 3 #define _NETWORK_
Alix955 9:f5eae5211225 4
Alix955 9:f5eae5211225 5 #include "mbed.h"
Alix955 9:f5eae5211225 6
Alix955 9:f5eae5211225 7 #include "FATFileSystem.h"
Alix955 9:f5eae5211225 8
Alix955 9:f5eae5211225 9 #include "sample_hardware.hpp"
Alix955 9:f5eae5211225 10
Alix955 9:f5eae5211225 11 #include "EthernetInterface.h"
Alix955 9:f5eae5211225 12
Alix955 9:f5eae5211225 13 #include "TCPServer.h"
Alix955 9:f5eae5211225 14
Alix955 9:f5eae5211225 15 //#include "messageStruct.hpp"
Alix955 9:f5eae5211225 16
Alix955 9:f5eae5211225 17 #include "TCPSocket.h"
Alix955 9:f5eae5211225 18
Alix955 9:f5eae5211225 19 #include <iostream>
Alix955 9:f5eae5211225 20
Alix955 9:f5eae5211225 21 #include <string>
Alix955 9:f5eae5211225 22
Alix955 9:f5eae5211225 23 #include "ntp-client/NTPClient.h"
Alix955 9:f5eae5211225 24
Alix955 9:f5eae5211225 25
Alix955 9:f5eae5211225 26
Alix955 9:f5eae5211225 27
Alix955 9:f5eae5211225 28 #define HTTP_STATUS_LINE "HTTP/1.0 200 OK"
Alix955 9:f5eae5211225 29
Alix955 9:f5eae5211225 30 #define HTTP_HEADER_FIELDS "Content-Type: text/html; charset=utf-8"
Alix955 9:f5eae5211225 31
Alix955 9:f5eae5211225 32 #define HTTP_MESSAGE_BODY1 "" \
Alix955 9:f5eae5211225 33 "<html>" "\r\n" \
Alix955 9:f5eae5211225 34 " <body style=\"display:flex;text-align:center\">" "\r\n" \
Alix955 9:f5eae5211225 35 " <div style=\"margin:auto\">" "\r\n" \
Alix955 9:f5eae5211225 36 " <h1>Alright sunshine</h1>" "\r\n" \
Alix955 9:f5eae5211225 37 " <p>The LDR value is "
Alix955 9:f5eae5211225 38
Alix955 9:f5eae5211225 39 #define HTTP_MESSAGE_BODY2 "" \
Alix955 9:f5eae5211225 40 "</p>" "\r\n" \
Alix955 9:f5eae5211225 41 " </div>" "\r\n" \
Alix955 9:f5eae5211225 42 " </body>" "\r\n" \
Alix955 9:f5eae5211225 43 "</html>"
Alix955 9:f5eae5211225 44
Alix955 9:f5eae5211225 45 #define HTTP_MESSAGE_BODY3 "" \
Alix955 9:f5eae5211225 46 "<html>" "\r\n" \
Alix955 9:f5eae5211225 47 " <body style=\"display:flex;text-align:center\">" "\r\n" \
Alix955 9:f5eae5211225 48 " <div style=\"margin:auto\">" "\r\n" \
Alix955 9:f5eae5211225 49 " <p>The Temperature value is "
Alix955 9:f5eae5211225 50
Alix955 9:f5eae5211225 51 #define HTTP_MESSAGE_BODY4 "" \
Alix955 9:f5eae5211225 52 "</p>" "\r\n" \
Alix955 9:f5eae5211225 53 " </div>" "\r\n" \
Alix955 9:f5eae5211225 54 " </body>" "\r\n" \
Alix955 9:f5eae5211225 55 "</html>"
Alix955 9:f5eae5211225 56
Alix955 9:f5eae5211225 57 #define HTTP_MESSAGE_BODY5 "" \
Alix955 9:f5eae5211225 58 "<html>" "\r\n" \
Alix955 9:f5eae5211225 59 " <body style=\"display:flex;text-align:center\">" "\r\n" \
Alix955 9:f5eae5211225 60 " <div style=\"margin:auto\">" "\r\n" \
Alix955 9:f5eae5211225 61 " <p>The Pressure value is "
Alix955 9:f5eae5211225 62
Alix955 9:f5eae5211225 63 #define HTTP_MESSAGE_BODY6 "" \
Alix955 9:f5eae5211225 64 "</p>" "\r\n" \
Alix955 9:f5eae5211225 65 " </div>" "\r\n" \
Alix955 9:f5eae5211225 66 " </body>" "\r\n" \
Alix955 9:f5eae5211225 67 "</html>"
Alix955 9:f5eae5211225 68
Alix955 9:f5eae5211225 69 #define HTTP_RESPONSE HTTP_STATUS_LINE "\r\n" \
Alix955 9:f5eae5211225 70 HTTP_HEADER_FIELDS "\r\n" \
Alix955 9:f5eae5211225 71 "\r\n" \
Alix955 9:f5eae5211225 72 HTTP_MESSAGE_BODY "\r\n"
Alix955 9:f5eae5211225 73
Alix955 9:f5eae5211225 74
Alix955 9:f5eae5211225 75
Alix955 9:f5eae5211225 76 #define IP "10.0.0.10"
Alix955 9:f5eae5211225 77
Alix955 9:f5eae5211225 78 #define NETMASK "255.0.0.0"
Alix955 9:f5eae5211225 79
Alix955 9:f5eae5211225 80 #define GATEWAY "10.0.0.2"
Alix955 9:f5eae5211225 81
Alix955 9:f5eae5211225 82 EthernetInterface eth;
Alix955 9:f5eae5211225 83
Alix955 9:f5eae5211225 84 NTPClient ntp(&eth);
Alix955 9:f5eae5211225 85
Alix955 9:f5eae5211225 86
Alix955 9:f5eae5211225 87
Alix955 9:f5eae5211225 88
Alix955 9:f5eae5211225 89 class Network
Alix955 9:f5eae5211225 90
Alix955 9:f5eae5211225 91 {
Alix955 9:f5eae5211225 92
Alix955 9:f5eae5211225 93 private:
Alix955 9:f5eae5211225 94
Alix955 9:f5eae5211225 95
Alix955 9:f5eae5211225 96
Alix955 9:f5eae5211225 97 float temp; //current temperature of sensor
Alix955 9:f5eae5211225 98
Alix955 9:f5eae5211225 99 float pressure; //current pressure of sensor
Alix955 9:f5eae5211225 100
Alix955 9:f5eae5211225 101 float fLDR; //current light level from LDR
Alix955 9:f5eae5211225 102
Alix955 9:f5eae5211225 103
Alix955 9:f5eae5211225 104
Alix955 9:f5eae5211225 105 void update_temp(double t) //use this function to update the current temperature value
Alix955 9:f5eae5211225 106
Alix955 9:f5eae5211225 107 {
Alix955 9:f5eae5211225 108
Alix955 9:f5eae5211225 109 temp = 5;
Alix955 9:f5eae5211225 110
Alix955 9:f5eae5211225 111 }
Alix955 9:f5eae5211225 112
Alix955 9:f5eae5211225 113 void update_pressure(double p) //use this function to update the current pressure value
Alix955 9:f5eae5211225 114
Alix955 9:f5eae5211225 115 {
Alix955 9:f5eae5211225 116
Alix955 9:f5eae5211225 117 pressure = 4;
Alix955 9:f5eae5211225 118
Alix955 9:f5eae5211225 119 }
Alix955 9:f5eae5211225 120
Alix955 9:f5eae5211225 121 void update_LDR(double L)
Alix955 9:f5eae5211225 122
Alix955 9:f5eae5211225 123 {
Alix955 9:f5eae5211225 124
Alix955 9:f5eae5211225 125 fLDR = 3;
Alix955 9:f5eae5211225 126
Alix955 9:f5eae5211225 127 }
Alix955 9:f5eae5211225 128
Alix955 9:f5eae5211225 129
Alix955 9:f5eae5211225 130
Alix955 9:f5eae5211225 131
Alix955 9:f5eae5211225 132
Alix955 9:f5eae5211225 133 public:
Alix955 9:f5eae5211225 134
Alix955 9:f5eae5211225 135 EventQueue Network_Queue;
Alix955 9:f5eae5211225 136
Alix955 9:f5eae5211225 137 //EthernetInterface eth;
Alix955 9:f5eae5211225 138
Alix955 9:f5eae5211225 139 //NTPClient ntp(&eth);
Alix955 9:f5eae5211225 140
Alix955 9:f5eae5211225 141
Alix955 9:f5eae5211225 142
Alix955 9:f5eae5211225 143
Alix955 9:f5eae5211225 144 Network(){ //constructor
Alix955 9:f5eae5211225 145
Alix955 9:f5eae5211225 146 //Configure an ethernet connection
Alix955 9:f5eae5211225 147 eth.set_network(IP, NETMASK, GATEWAY);
Alix955 9:f5eae5211225 148 eth.connect();
Alix955 9:f5eae5211225 149
Alix955 9:f5eae5211225 150 }
Alix955 9:f5eae5211225 151
Alix955 9:f5eae5211225 152
Alix955 9:f5eae5211225 153
Alix955 9:f5eae5211225 154
Alix955 9:f5eae5211225 155
Alix955 9:f5eae5211225 156 ~Network(){ //deconstructor
Alix955 9:f5eae5211225 157
Alix955 9:f5eae5211225 158
Alix955 9:f5eae5211225 159
Alix955 9:f5eae5211225 160 }
Alix955 9:f5eae5211225 161
Alix955 9:f5eae5211225 162
Alix955 9:f5eae5211225 163
Alix955 9:f5eae5211225 164
Alix955 9:f5eae5211225 165
Alix955 9:f5eae5211225 166 void update_sensor_info(sample_message msg) //updates all current sensor information, this is called by a ticker every 5 seconds to read from the mailbox
Alix955 9:f5eae5211225 167
Alix955 9:f5eae5211225 168 {
Alix955 9:f5eae5211225 169
Alix955 9:f5eae5211225 170 update_temp(msg.temp); // Include message class passing of data
Alix955 9:f5eae5211225 171
Alix955 9:f5eae5211225 172 update_pressure(msg.pressure);
Alix955 9:f5eae5211225 173
Alix955 9:f5eae5211225 174 update_LDR(msg.ldr);
Alix955 9:f5eae5211225 175
Alix955 9:f5eae5211225 176 }
Alix955 9:f5eae5211225 177
Alix955 9:f5eae5211225 178
Alix955 9:f5eae5211225 179
Alix955 9:f5eae5211225 180
Alix955 9:f5eae5211225 181
Alix955 9:f5eae5211225 182 void NetPush(){
Alix955 9:f5eae5211225 183
Alix955 9:f5eae5211225 184
Alix955 9:f5eae5211225 185 //Now setup a web server
Alix955 9:f5eae5211225 186
Alix955 9:f5eae5211225 187 TCPServer srv; //TCP/IP Server
Alix955 9:f5eae5211225 188
Alix955 9:f5eae5211225 189 TCPSocket clt_sock; //Socket for communication
Alix955 9:f5eae5211225 190
Alix955 9:f5eae5211225 191 SocketAddress clt_addr; //Address of incoming connection
Alix955 9:f5eae5211225 192
Alix955 9:f5eae5211225 193
Alix955 9:f5eae5211225 194
Alix955 9:f5eae5211225 195
Alix955 9:f5eae5211225 196
Alix955 9:f5eae5211225 197 /* Open the server on ethernet stack */
Alix955 9:f5eae5211225 198
Alix955 9:f5eae5211225 199 srv.open(&eth);
Alix955 9:f5eae5211225 200
Alix955 9:f5eae5211225 201
Alix955 9:f5eae5211225 202
Alix955 9:f5eae5211225 203 /* Bind the HTTP port (TCP 80) to the server */
Alix955 9:f5eae5211225 204
Alix955 9:f5eae5211225 205 srv.bind(eth.get_ip_address(), 80);
Alix955 9:f5eae5211225 206
Alix955 9:f5eae5211225 207
Alix955 9:f5eae5211225 208
Alix955 9:f5eae5211225 209 /* Can handle 5 simultaneous connections */
Alix955 9:f5eae5211225 210
Alix955 9:f5eae5211225 211 srv.listen(5);
Alix955 9:f5eae5211225 212
Alix955 9:f5eae5211225 213
Alix955 9:f5eae5211225 214
Alix955 9:f5eae5211225 215 //Block and wait on an incoming connection
Alix955 9:f5eae5211225 216
Alix955 9:f5eae5211225 217 srv.accept(&clt_sock, &clt_addr);
Alix955 9:f5eae5211225 218
Alix955 9:f5eae5211225 219 printf("accept %s:%d\n", clt_addr.get_ip_address(), clt_addr.get_port());
Alix955 9:f5eae5211225 220
Alix955 9:f5eae5211225 221
Alix955 9:f5eae5211225 222
Alix955 9:f5eae5211225 223 //Uses a C++ string to make it easier to concatinate
Alix955 9:f5eae5211225 224
Alix955 9:f5eae5211225 225 string response;
Alix955 9:f5eae5211225 226
Alix955 9:f5eae5211225 227
Alix955 9:f5eae5211225 228
Alix955 9:f5eae5211225 229 //This is a C string
Alix955 9:f5eae5211225 230
Alix955 9:f5eae5211225 231 char ldr_str[64];
Alix955 9:f5eae5211225 232
Alix955 9:f5eae5211225 233 char temp_str[64];
Alix955 9:f5eae5211225 234
Alix955 9:f5eae5211225 235 char pressure_str[64];
Alix955 9:f5eae5211225 236
Alix955 9:f5eae5211225 237
Alix955 9:f5eae5211225 238
Alix955 9:f5eae5211225 239
Alix955 9:f5eae5211225 240
Alix955 9:f5eae5211225 241 //Convert to a C String
Alix955 9:f5eae5211225 242
Alix955 9:f5eae5211225 243 sprintf(ldr_str, "%5.3f", fLDR );
Alix955 9:f5eae5211225 244
Alix955 9:f5eae5211225 245 sprintf(temp_str, "%5.3f", temp );
Alix955 9:f5eae5211225 246
Alix955 9:f5eae5211225 247 sprintf(pressure_str, "%5.3f", pressure );
Alix955 9:f5eae5211225 248
Alix955 9:f5eae5211225 249
Alix955 9:f5eae5211225 250
Alix955 9:f5eae5211225 251
Alix955 9:f5eae5211225 252
Alix955 9:f5eae5211225 253 //Build the C++ string response
Alix955 9:f5eae5211225 254
Alix955 9:f5eae5211225 255 response = HTTP_MESSAGE_BODY1;
Alix955 9:f5eae5211225 256
Alix955 9:f5eae5211225 257 response += ldr_str;
Alix955 9:f5eae5211225 258
Alix955 9:f5eae5211225 259 response += HTTP_MESSAGE_BODY2;
Alix955 9:f5eae5211225 260
Alix955 9:f5eae5211225 261
Alix955 9:f5eae5211225 262
Alix955 9:f5eae5211225 263 response = HTTP_MESSAGE_BODY3;
Alix955 9:f5eae5211225 264
Alix955 9:f5eae5211225 265 response += temp_str;
Alix955 9:f5eae5211225 266
Alix955 9:f5eae5211225 267 response += HTTP_MESSAGE_BODY4;
Alix955 9:f5eae5211225 268
Alix955 9:f5eae5211225 269
Alix955 9:f5eae5211225 270
Alix955 9:f5eae5211225 271 response += HTTP_MESSAGE_BODY5;
Alix955 9:f5eae5211225 272
Alix955 9:f5eae5211225 273 response += pressure_str;
Alix955 9:f5eae5211225 274
Alix955 9:f5eae5211225 275 response += HTTP_MESSAGE_BODY6;
Alix955 9:f5eae5211225 276
Alix955 9:f5eae5211225 277
Alix955 9:f5eae5211225 278
Alix955 9:f5eae5211225 279
Alix955 9:f5eae5211225 280
Alix955 9:f5eae5211225 281
Alix955 9:f5eae5211225 282
Alix955 9:f5eae5211225 283 //Send static HTML response (as a C string)
Alix955 9:f5eae5211225 284
Alix955 9:f5eae5211225 285 clt_sock.send(response.c_str(), response.size()+6);
Alix955 9:f5eae5211225 286
Alix955 9:f5eae5211225 287
Alix955 9:f5eae5211225 288
Alix955 9:f5eae5211225 289
Alix955 9:f5eae5211225 290
Alix955 9:f5eae5211225 291 }
Alix955 9:f5eae5211225 292
Alix955 9:f5eae5211225 293 };
Alix955 9:f5eae5211225 294
Alix955 9:f5eae5211225 295
Alix955 9:f5eae5211225 296
Alix955 9:f5eae5211225 297
Alix955 9:f5eae5211225 298
Alix955 9:f5eae5211225 299 Network m_oNet;
Alix955 9:f5eae5211225 300
Alix955 9:f5eae5211225 301 #endif