Bill Eccles / Mbed 2 deprecated WS-2010-PCInterface

Dependencies:   EthernetNetIf mbed

Committer:
BillEccles
Date:
Mon Jan 02 19:13:55 2012 +0000
Revision:
1:1972c4310a72
Parent:
0:dfbd7dacdf8c

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BillEccles 1:1972c4310a72 1 /*
BillEccles 1:1972c4310a72 2 WeatherStationInterface.cpp
BillEccles 1:1972c4310a72 3 An interface for the LaCrosse Technology WS-2010-13 PC Interface.
BillEccles 1:1972c4310a72 4
BillEccles 1:1972c4310a72 5 Copyright (C)2012 William N. Eccles
BillEccles 1:1972c4310a72 6
BillEccles 1:1972c4310a72 7 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
BillEccles 1:1972c4310a72 8 documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
BillEccles 1:1972c4310a72 9 rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
BillEccles 1:1972c4310a72 10 persons to whom the Software is furnished to do so, subject to the following conditions:
BillEccles 1:1972c4310a72 11
BillEccles 1:1972c4310a72 12 The above copyright notice and this permission notice shall be includied in all copies or substiantial portions of the
BillEccles 1:1972c4310a72 13 Software.
BillEccles 1:1972c4310a72 14
BillEccles 1:1972c4310a72 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
BillEccles 1:1972c4310a72 16 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
BillEccles 1:1972c4310a72 17 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECITON WITH
BillEccles 1:1972c4310a72 18 THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
BillEccles 1:1972c4310a72 19 */
BillEccles 1:1972c4310a72 20
BillEccles 0:dfbd7dacdf8c 21 #include "mbed.h"
BillEccles 0:dfbd7dacdf8c 22 #include "EthernetNetIf.h"
BillEccles 0:dfbd7dacdf8c 23 #include "HTTPClient.h"
BillEccles 0:dfbd7dacdf8c 24 #define WAIT_time 0.05
BillEccles 0:dfbd7dacdf8c 25 #define D() wait(WAIT_time)
BillEccles 0:dfbd7dacdf8c 26
BillEccles 0:dfbd7dacdf8c 27 Serial mac(USBTX, USBRX);
BillEccles 0:dfbd7dacdf8c 28 Serial ws2010pc(p28, p27); // tx, rx
BillEccles 0:dfbd7dacdf8c 29 DigitalOut DTR(p29);
BillEccles 0:dfbd7dacdf8c 30 DigitalOut mled0(LED1);
BillEccles 0:dfbd7dacdf8c 31 DigitalOut mled1(LED2);
BillEccles 0:dfbd7dacdf8c 32 DigitalOut mled2(LED3);
BillEccles 0:dfbd7dacdf8c 33 DigitalOut mled3(LED4);
BillEccles 0:dfbd7dacdf8c 34
BillEccles 0:dfbd7dacdf8c 35 const char *requestDCFtime = "\x01\x30\xCF\x04";
BillEccles 0:dfbd7dacdf8c 36 const char *requestData = "\x01\x31\xCE\x04";
BillEccles 0:dfbd7dacdf8c 37 const char *requestNextDataset = "\x01\x32\xCD\x04";
BillEccles 0:dfbd7dacdf8c 38 const char *requestStatus = "\x01\x35\xCA\x04";
BillEccles 0:dfbd7dacdf8c 39
BillEccles 0:dfbd7dacdf8c 40 void blink() {
BillEccles 0:dfbd7dacdf8c 41 int m0, m1, m2, m3;
BillEccles 0:dfbd7dacdf8c 42
BillEccles 0:dfbd7dacdf8c 43 m0 = mled0;
BillEccles 0:dfbd7dacdf8c 44 m1 = mled1;
BillEccles 0:dfbd7dacdf8c 45 m2 = mled2;
BillEccles 0:dfbd7dacdf8c 46 m3 = mled3;
BillEccles 0:dfbd7dacdf8c 47
BillEccles 0:dfbd7dacdf8c 48 mled0 = mled1 = mled2 = mled3 = 0;
BillEccles 0:dfbd7dacdf8c 49
BillEccles 0:dfbd7dacdf8c 50 mled0 = 1;D();mled1 = 1;D();mled2 = 1;D();mled3 = 1;D();
BillEccles 0:dfbd7dacdf8c 51 mled0 = 0;D();mled1 = 0;D();mled2 = 0;D();mled3 = 0;D();D();D();
BillEccles 0:dfbd7dacdf8c 52 mled3 = 1;D();mled2 = 1;D();mled1 = 1;D();mled0 = 1;D();
BillEccles 0:dfbd7dacdf8c 53 mled3 = 0;D();mled2 = 0;D();mled1 = 0;D();mled0 = 0;D();D();D();
BillEccles 0:dfbd7dacdf8c 54
BillEccles 0:dfbd7dacdf8c 55 mled0 = m0;
BillEccles 0:dfbd7dacdf8c 56 mled1 = m1;
BillEccles 0:dfbd7dacdf8c 57 mled2 = m2;
BillEccles 0:dfbd7dacdf8c 58 mled3 = m3;
BillEccles 0:dfbd7dacdf8c 59
BillEccles 0:dfbd7dacdf8c 60 // takes 1s with a delay time of 0.05s
BillEccles 0:dfbd7dacdf8c 61
BillEccles 0:dfbd7dacdf8c 62 return;
BillEccles 0:dfbd7dacdf8c 63 }
BillEccles 0:dfbd7dacdf8c 64
BillEccles 0:dfbd7dacdf8c 65 int errorHalt( bool L3, bool L2, bool L1, bool L0 ) {
BillEccles 0:dfbd7dacdf8c 66 while (1) {
BillEccles 0:dfbd7dacdf8c 67 mled3 = L0;
BillEccles 0:dfbd7dacdf8c 68 mled2 = L1;
BillEccles 0:dfbd7dacdf8c 69 mled1 = L2;
BillEccles 0:dfbd7dacdf8c 70 mled0 = L3;
BillEccles 0:dfbd7dacdf8c 71 wait(0.5);
BillEccles 0:dfbd7dacdf8c 72 mled3 = false;
BillEccles 0:dfbd7dacdf8c 73 mled2 = false;
BillEccles 0:dfbd7dacdf8c 74 mled1 = false;
BillEccles 0:dfbd7dacdf8c 75 mled0 = false;
BillEccles 0:dfbd7dacdf8c 76 wait(0.5);
BillEccles 0:dfbd7dacdf8c 77 }
BillEccles 0:dfbd7dacdf8c 78 return -1;
BillEccles 0:dfbd7dacdf8c 79 }
BillEccles 0:dfbd7dacdf8c 80
BillEccles 0:dfbd7dacdf8c 81 void showLEDs( bool L3, bool L2, bool L1, bool L0 ) {
BillEccles 0:dfbd7dacdf8c 82 mled3 = L0;
BillEccles 0:dfbd7dacdf8c 83 mled2 = L1;
BillEccles 0:dfbd7dacdf8c 84 mled1 = L2;
BillEccles 0:dfbd7dacdf8c 85 mled0 = L3;
BillEccles 0:dfbd7dacdf8c 86 return;
BillEccles 0:dfbd7dacdf8c 87 }
BillEccles 0:dfbd7dacdf8c 88
BillEccles 0:dfbd7dacdf8c 89 float H( int byte ) {
BillEccles 0:dfbd7dacdf8c 90 return (float)(byte >> 4);
BillEccles 0:dfbd7dacdf8c 91 }
BillEccles 0:dfbd7dacdf8c 92
BillEccles 0:dfbd7dacdf8c 93 float HS( int byte ) {
BillEccles 0:dfbd7dacdf8c 94 return (float)((byte >> 4) & 0x07);
BillEccles 0:dfbd7dacdf8c 95 }
BillEccles 0:dfbd7dacdf8c 96
BillEccles 0:dfbd7dacdf8c 97 float S( int byte ) {
BillEccles 0:dfbd7dacdf8c 98 byte = (byte & 0x0F) >> 3;
BillEccles 0:dfbd7dacdf8c 99 return ((byte==1) ? -1.0 : 1.0);
BillEccles 0:dfbd7dacdf8c 100 }
BillEccles 0:dfbd7dacdf8c 101
BillEccles 0:dfbd7dacdf8c 102 float L( int byte ) {
BillEccles 0:dfbd7dacdf8c 103 byte = (byte & 0x0F);
BillEccles 0:dfbd7dacdf8c 104 return (float)byte;
BillEccles 0:dfbd7dacdf8c 105 }
BillEccles 0:dfbd7dacdf8c 106
BillEccles 0:dfbd7dacdf8c 107 float LS( int byte ) {
BillEccles 0:dfbd7dacdf8c 108 byte = (byte & 0x07);
BillEccles 0:dfbd7dacdf8c 109 return (float)byte;
BillEccles 0:dfbd7dacdf8c 110 }
BillEccles 0:dfbd7dacdf8c 111
BillEccles 0:dfbd7dacdf8c 112 bool wakeup() {
BillEccles 0:dfbd7dacdf8c 113 char aChar;
BillEccles 0:dfbd7dacdf8c 114 bool wokeup = false;
BillEccles 0:dfbd7dacdf8c 115
BillEccles 0:dfbd7dacdf8c 116 // mac.printf("Waking up the WS2010...");
BillEccles 0:dfbd7dacdf8c 117 DTR = 1;
BillEccles 0:dfbd7dacdf8c 118 wait(0.05);
BillEccles 0:dfbd7dacdf8c 119 DTR = 0;
BillEccles 0:dfbd7dacdf8c 120 wait(0.05);
BillEccles 0:dfbd7dacdf8c 121
BillEccles 0:dfbd7dacdf8c 122 while (ws2010pc.readable()) {
BillEccles 0:dfbd7dacdf8c 123 aChar = ws2010pc.getc();
BillEccles 0:dfbd7dacdf8c 124 if (aChar==3) {
BillEccles 0:dfbd7dacdf8c 125 // mac.printf(" and it's awake.\n\r");
BillEccles 0:dfbd7dacdf8c 126 wokeup = true;
BillEccles 0:dfbd7dacdf8c 127 } else {
BillEccles 0:dfbd7dacdf8c 128 // mac.printf(" and it didn't want to wake up, returning a %i instead of a 3.\n\r",aChar);
BillEccles 0:dfbd7dacdf8c 129 wokeup = false;
BillEccles 0:dfbd7dacdf8c 130 }
BillEccles 0:dfbd7dacdf8c 131 }
BillEccles 0:dfbd7dacdf8c 132 wait(0.1);
BillEccles 0:dfbd7dacdf8c 133 return wokeup;
BillEccles 0:dfbd7dacdf8c 134 }
BillEccles 0:dfbd7dacdf8c 135 int sendString( char *theString ) {
BillEccles 0:dfbd7dacdf8c 136 int index = 0;
BillEccles 0:dfbd7dacdf8c 137 while (theString[index]!='\0') {
BillEccles 0:dfbd7dacdf8c 138 ws2010pc.putc((char)theString[index++]);
BillEccles 0:dfbd7dacdf8c 139 // wait(0.005);
BillEccles 0:dfbd7dacdf8c 140 }
BillEccles 0:dfbd7dacdf8c 141 return index;
BillEccles 0:dfbd7dacdf8c 142 }
BillEccles 0:dfbd7dacdf8c 143
BillEccles 0:dfbd7dacdf8c 144 int receiveString( char *theString, int numChars, int timeout_ms ) {
BillEccles 0:dfbd7dacdf8c 145 int index = 0;
BillEccles 0:dfbd7dacdf8c 146 bool done = false;
BillEccles 0:dfbd7dacdf8c 147 int LSRValue;
BillEccles 0:dfbd7dacdf8c 148 Timer aTimer;
BillEccles 0:dfbd7dacdf8c 149
BillEccles 0:dfbd7dacdf8c 150 theString[0]='\0';
BillEccles 0:dfbd7dacdf8c 151 aTimer.start();
BillEccles 0:dfbd7dacdf8c 152
BillEccles 0:dfbd7dacdf8c 153 while ((aTimer.read_ms()<=timeout_ms)&&(index<numChars)&&(!done)) {
BillEccles 0:dfbd7dacdf8c 154 // LSRValue = LPC_UART2-> LSR;
BillEccles 0:dfbd7dacdf8c 155 // if ((LSRValue!=97)&&(LSRValue!=96)) { mac.printf("Receive error? LSR is %i.\n\r",LSRValue); }
BillEccles 0:dfbd7dacdf8c 156 if (ws2010pc.readable()) {
BillEccles 0:dfbd7dacdf8c 157 theString[index] = ws2010pc.getc();
BillEccles 0:dfbd7dacdf8c 158 if (theString[index]==0x03) {
BillEccles 0:dfbd7dacdf8c 159 done = true;
BillEccles 0:dfbd7dacdf8c 160 }
BillEccles 0:dfbd7dacdf8c 161 index++;
BillEccles 0:dfbd7dacdf8c 162 theString[index]='\0';
BillEccles 0:dfbd7dacdf8c 163 }
BillEccles 0:dfbd7dacdf8c 164 }
BillEccles 0:dfbd7dacdf8c 165 aTimer.stop();
BillEccles 0:dfbd7dacdf8c 166 return index;
BillEccles 0:dfbd7dacdf8c 167 }
BillEccles 0:dfbd7dacdf8c 168
BillEccles 0:dfbd7dacdf8c 169 // MAIN
BillEccles 0:dfbd7dacdf8c 170
BillEccles 0:dfbd7dacdf8c 171 int main() {
BillEccles 0:dfbd7dacdf8c 172 int i, j, dataLength, strippedLength, LSRValue;
BillEccles 0:dfbd7dacdf8c 173 int db, dt, spreadraw;
BillEccles 0:dfbd7dacdf8c 174 float t1c, t1f, h1, hif, hic;
BillEccles 0:dfbd7dacdf8c 175 float tic, tif, hi;
BillEccles 0:dfbd7dacdf8c 176 float sp, dir, spread, wc;
BillEccles 0:dfbd7dacdf8c 177 float pr;
BillEccles 0:dfbd7dacdf8c 178 float rn;
BillEccles 0:dfbd7dacdf8c 179 string n1, ni, nwin, nr;
BillEccles 0:dfbd7dacdf8c 180 HTTPText txt;
BillEccles 0:dfbd7dacdf8c 181 HTTPResult r;
BillEccles 0:dfbd7dacdf8c 182 bool error, firstTime, haveData, dataPostedOK;
BillEccles 0:dfbd7dacdf8c 183 char theData[1024], strippedData[1024], httpQuery[1024];
BillEccles 0:dfbd7dacdf8c 184 EthernetNetIf eth;
BillEccles 0:dfbd7dacdf8c 185 HTTPClient http;
BillEccles 0:dfbd7dacdf8c 186 EthernetErr ethErr;
BillEccles 0:dfbd7dacdf8c 187 IpAddr myIpAddr;
BillEccles 0:dfbd7dacdf8c 188
BillEccles 0:dfbd7dacdf8c 189 firstTime = true;
BillEccles 0:dfbd7dacdf8c 190
BillEccles 0:dfbd7dacdf8c 191 // Setup Ethernet
BillEccles 0:dfbd7dacdf8c 192 showLEDs( false, false, false, true );
BillEccles 0:dfbd7dacdf8c 193
BillEccles 0:dfbd7dacdf8c 194 // mac.printf("Setting up Ethernet...\n\r");
BillEccles 0:dfbd7dacdf8c 195 ethErr = eth.setup();
BillEccles 0:dfbd7dacdf8c 196 if (ethErr) {
BillEccles 0:dfbd7dacdf8c 197 // mac.printf("Error %d in setup.\n\r", ethErr);
BillEccles 0:dfbd7dacdf8c 198 errorHalt( false, false, false, true );
BillEccles 0:dfbd7dacdf8c 199 } else {
BillEccles 0:dfbd7dacdf8c 200 // mac.printf("Ethernet setup was successful.\n\r");
BillEccles 0:dfbd7dacdf8c 201 }
BillEccles 0:dfbd7dacdf8c 202
BillEccles 0:dfbd7dacdf8c 203 while (1) {
BillEccles 0:dfbd7dacdf8c 204 error = false;
BillEccles 0:dfbd7dacdf8c 205
BillEccles 0:dfbd7dacdf8c 206 // Setup serial port
BillEccles 0:dfbd7dacdf8c 207
BillEccles 0:dfbd7dacdf8c 208 showLEDs( false, false, true, false );
BillEccles 0:dfbd7dacdf8c 209
BillEccles 0:dfbd7dacdf8c 210 // mac.printf("Opening serial port...\n\r");
BillEccles 0:dfbd7dacdf8c 211 ws2010pc.baud(9600);
BillEccles 0:dfbd7dacdf8c 212 ws2010pc.format(8, Serial::Even, 2);
BillEccles 0:dfbd7dacdf8c 213
BillEccles 0:dfbd7dacdf8c 214 // Wait six minutes unless this is the first time through this
BillEccles 0:dfbd7dacdf8c 215
BillEccles 0:dfbd7dacdf8c 216 showLEDs( false, false, true, true );
BillEccles 0:dfbd7dacdf8c 217
BillEccles 0:dfbd7dacdf8c 218 if (!firstTime) {
BillEccles 0:dfbd7dacdf8c 219 DTR = 1;
BillEccles 0:dfbd7dacdf8c 220 mac.printf("Sleeping for six minutes... ");
BillEccles 0:dfbd7dacdf8c 221 i=6;
BillEccles 0:dfbd7dacdf8c 222 while (i>=1) {
BillEccles 0:dfbd7dacdf8c 223 mac.printf("%i...",i--);
BillEccles 0:dfbd7dacdf8c 224 for (j=0; j<12; j++) {
BillEccles 0:dfbd7dacdf8c 225 blink();
BillEccles 0:dfbd7dacdf8c 226 wait(4);
BillEccles 0:dfbd7dacdf8c 227 }
BillEccles 0:dfbd7dacdf8c 228 }
BillEccles 0:dfbd7dacdf8c 229 mac.printf("\n\r");
BillEccles 0:dfbd7dacdf8c 230 }
BillEccles 0:dfbd7dacdf8c 231
BillEccles 0:dfbd7dacdf8c 232 firstTime = false;
BillEccles 0:dfbd7dacdf8c 233
BillEccles 0:dfbd7dacdf8c 234 // Wakeup the 2010
BillEccles 0:dfbd7dacdf8c 235
BillEccles 0:dfbd7dacdf8c 236 showLEDs( false, true, false, false );
BillEccles 0:dfbd7dacdf8c 237
BillEccles 0:dfbd7dacdf8c 238 error = !wakeup();
BillEccles 0:dfbd7dacdf8c 239
BillEccles 0:dfbd7dacdf8c 240 // Ask the 2010 for data until there is no more to be had.
BillEccles 0:dfbd7dacdf8c 241
BillEccles 0:dfbd7dacdf8c 242
BillEccles 0:dfbd7dacdf8c 243 haveData = true;
BillEccles 0:dfbd7dacdf8c 244 while (haveData&&(!error)) {
BillEccles 0:dfbd7dacdf8c 245 showLEDs( false, true, false, true );
BillEccles 0:dfbd7dacdf8c 246 mac.printf("Requesting data.... ");
BillEccles 0:dfbd7dacdf8c 247 dataLength = sendString((char *)requestData);
BillEccles 0:dfbd7dacdf8c 248 dataLength = receiveString(theData, 128, 500);
BillEccles 0:dfbd7dacdf8c 249 mac.printf("Received %i characters.\n\r",dataLength);
BillEccles 0:dfbd7dacdf8c 250 if (dataLength<2) {
BillEccles 0:dfbd7dacdf8c 251 mac.printf("No data received.\n\r");
BillEccles 0:dfbd7dacdf8c 252 haveData=false;
BillEccles 0:dfbd7dacdf8c 253 } else if ((theData[0]!=2)||(theData[dataLength-1]!=3)) {
BillEccles 0:dfbd7dacdf8c 254 mac.printf("Bad dataset received.\n\r");
BillEccles 0:dfbd7dacdf8c 255 haveData = false;
BillEccles 0:dfbd7dacdf8c 256 } else if ((theData[1]==1)&&(theData[2]==16)) {
BillEccles 0:dfbd7dacdf8c 257 mac.printf("No data available at the moment. Will retry later.\n\r");
BillEccles 0:dfbd7dacdf8c 258 haveData = false;
BillEccles 0:dfbd7dacdf8c 259 }
BillEccles 0:dfbd7dacdf8c 260
BillEccles 0:dfbd7dacdf8c 261 if (haveData) {
BillEccles 0:dfbd7dacdf8c 262 /*
BillEccles 0:dfbd7dacdf8c 263 mac.printf("The raw dataset has %i characters: ",dataLength);
BillEccles 0:dfbd7dacdf8c 264 i=0;
BillEccles 0:dfbd7dacdf8c 265 while (i<dataLength) {
BillEccles 0:dfbd7dacdf8c 266 mac.printf("%02X ",theData[i++]);
BillEccles 0:dfbd7dacdf8c 267 }
BillEccles 0:dfbd7dacdf8c 268 mac.printf("\n\r");
BillEccles 0:dfbd7dacdf8c 269 */
BillEccles 0:dfbd7dacdf8c 270 // We have some data. Now strip out the ENQ escape sequences
BillEccles 0:dfbd7dacdf8c 271
BillEccles 0:dfbd7dacdf8c 272 strippedLength=0;
BillEccles 0:dfbd7dacdf8c 273 for (j=0; j<dataLength; j++) {
BillEccles 0:dfbd7dacdf8c 274 if (theData[j]==5) {
BillEccles 0:dfbd7dacdf8c 275 strippedData[strippedLength++]=theData[j+1]-16;
BillEccles 0:dfbd7dacdf8c 276 j++;
BillEccles 0:dfbd7dacdf8c 277 } else {
BillEccles 0:dfbd7dacdf8c 278 strippedData[strippedLength++]=theData[j];
BillEccles 0:dfbd7dacdf8c 279 }
BillEccles 0:dfbd7dacdf8c 280 }
BillEccles 0:dfbd7dacdf8c 281 /*
BillEccles 0:dfbd7dacdf8c 282 mac.printf("No ENQ dataset has %i characters: ",strippedLength);
BillEccles 0:dfbd7dacdf8c 283 i=0;
BillEccles 0:dfbd7dacdf8c 284 while (i<strippedLength) {
BillEccles 0:dfbd7dacdf8c 285 mac.printf("%02X ",strippedData[i++]);
BillEccles 0:dfbd7dacdf8c 286 }
BillEccles 0:dfbd7dacdf8c 287 mac.printf("\n\r");
BillEccles 0:dfbd7dacdf8c 288 */
BillEccles 0:dfbd7dacdf8c 289 // Get rid of leading STX, and trailing checksum and ETX. (Leave the length as a pad in [0].
BillEccles 0:dfbd7dacdf8c 290
BillEccles 0:dfbd7dacdf8c 291 for (j=2; j<strippedLength-2; j++) {
BillEccles 0:dfbd7dacdf8c 292 strippedData[j-2]=strippedData[j];
BillEccles 0:dfbd7dacdf8c 293 }
BillEccles 0:dfbd7dacdf8c 294 strippedLength = strippedLength-4;
BillEccles 0:dfbd7dacdf8c 295
BillEccles 0:dfbd7dacdf8c 296 // Show the user what we have.
BillEccles 0:dfbd7dacdf8c 297 /*
BillEccles 0:dfbd7dacdf8c 298 mac.printf("SOHless dataset has %i characters: ",strippedLength);
BillEccles 0:dfbd7dacdf8c 299 i=0;
BillEccles 0:dfbd7dacdf8c 300 while (i<strippedLength) {
BillEccles 0:dfbd7dacdf8c 301 mac.printf("%02X ",strippedData[i++]);
BillEccles 0:dfbd7dacdf8c 302 }
BillEccles 0:dfbd7dacdf8c 303 mac.printf("\n\r");
BillEccles 0:dfbd7dacdf8c 304 */
BillEccles 0:dfbd7dacdf8c 305 // Now decode everything.
BillEccles 0:dfbd7dacdf8c 306
BillEccles 0:dfbd7dacdf8c 307 // dataset ID and time before now (in minutes)
BillEccles 0:dfbd7dacdf8c 308 db = strippedData[1]*256+strippedData[0];
BillEccles 0:dfbd7dacdf8c 309 dt = strippedData[3]*256+strippedData[2];
BillEccles 0:dfbd7dacdf8c 310
BillEccles 0:dfbd7dacdf8c 311 // remove the header bytes (note that I'm leaving one byte in strippedData[0] so that the index value lines up with
BillEccles 0:dfbd7dacdf8c 312 // the index values of the bytes in the WS-2010 documentation, i.e., L25 will correspond to the low nybble of strippedData[25])
BillEccles 0:dfbd7dacdf8c 313
BillEccles 0:dfbd7dacdf8c 314 for (j=3; j<=strippedLength; j++) {
BillEccles 0:dfbd7dacdf8c 315 strippedData[j-3]=strippedData[j];
BillEccles 0:dfbd7dacdf8c 316 }
BillEccles 0:dfbd7dacdf8c 317 strippedLength = strippedLength - 3;
BillEccles 0:dfbd7dacdf8c 318 /*
BillEccles 0:dfbd7dacdf8c 319 mac.printf("Hdrless dataset has %i characters: ",strippedLength);
BillEccles 0:dfbd7dacdf8c 320 i=0;
BillEccles 0:dfbd7dacdf8c 321 while (i<strippedLength) {
BillEccles 0:dfbd7dacdf8c 322 mac.printf("%02X ",strippedData[i++]);
BillEccles 0:dfbd7dacdf8c 323 }
BillEccles 0:dfbd7dacdf8c 324 mac.printf("\n\r");
BillEccles 0:dfbd7dacdf8c 325 */
BillEccles 0:dfbd7dacdf8c 326 // mac.printf("Read dataset id %i from %i minutes ago.\n\r", db, dt);
BillEccles 0:dfbd7dacdf8c 327
BillEccles 0:dfbd7dacdf8c 328 // reading: temperature 1, humidity 1 and heat index
BillEccles 0:dfbd7dacdf8c 329
BillEccles 0:dfbd7dacdf8c 330 t1c = (LS(strippedData[2])*10.0+H(strippedData[1])+L(strippedData[1])/10.0)*S(L(strippedData[2]));
BillEccles 0:dfbd7dacdf8c 331 t1f = 9.0/5.0*t1c+32.0;
BillEccles 0:dfbd7dacdf8c 332 h1 = LS(strippedData[3])*16.0+H(strippedData[2]);
BillEccles 0:dfbd7dacdf8c 333 n1 = (S(L(strippedData[3]))==-1) ? "NEW" : "OLD";
BillEccles 0:dfbd7dacdf8c 334
BillEccles 0:dfbd7dacdf8c 335 if (t1f>70) {
BillEccles 0:dfbd7dacdf8c 336 hif = -42.379+2.04901523*t1f+10.14333127*h1-0.22475541*t1f*h1-((6.83783e-3)*t1f*t1f)-((5.481717e-2)*h1*h1)+((1.22874e-3)*t1f*t1f*h1)+((8.5282e-4)*t1f*h1*h1)-((1.99e-6)*t1f*t1f*h1*h1);
BillEccles 0:dfbd7dacdf8c 337 hic = (hif-32.0)*5.0/9.0;
BillEccles 0:dfbd7dacdf8c 338 } else {
BillEccles 0:dfbd7dacdf8c 339 hif = t1f;
BillEccles 0:dfbd7dacdf8c 340 hic = t1c;
BillEccles 0:dfbd7dacdf8c 341 }
BillEccles 0:dfbd7dacdf8c 342
BillEccles 0:dfbd7dacdf8c 343 // mac.printf(" T1C:%5.2f T1F:%5.2f H1:%5.2f HIF:%5.2f HIC:%5.2f %s \n\r", t1c, t1f, h1, hif, hic, n1);
BillEccles 0:dfbd7dacdf8c 344
BillEccles 0:dfbd7dacdf8c 345 // reading: indoor temperature and humidity
BillEccles 0:dfbd7dacdf8c 346
BillEccles 0:dfbd7dacdf8c 347 tic = (LS(strippedData[29])*10+H(strippedData[28])+L(strippedData[28])/10)*S(L(strippedData[29]));
BillEccles 0:dfbd7dacdf8c 348 tif = 9.0/5.0*tic+32;
BillEccles 0:dfbd7dacdf8c 349 hi = LS(strippedData[30])*16+H(strippedData[29]);
BillEccles 0:dfbd7dacdf8c 350 ni = (S((int)L(strippedData[30]))==-1) ? "NEW" : "OLD";
BillEccles 0:dfbd7dacdf8c 351
BillEccles 0:dfbd7dacdf8c 352 // mac.printf(" TIC:%3.2f TIF:%3.2f HI:%3.2f %s \n\r", tic, tif, hi, ni);
BillEccles 0:dfbd7dacdf8c 353
BillEccles 0:dfbd7dacdf8c 354 // reading: wind speed, direction and directional spread, wind chill
BillEccles 0:dfbd7dacdf8c 355
BillEccles 0:dfbd7dacdf8c 356 sp = (HS(strippedData[24])*100.0+L(strippedData[24])*10.0+H(strippedData[23])+L(strippedData[23])/10.0)*0.6215;
BillEccles 0:dfbd7dacdf8c 357 dir = (float)((int)L(strippedData[26])%4)*100.0+H(strippedData[25])*10.0+L(strippedData[25]);
BillEccles 0:dfbd7dacdf8c 358 spreadraw = (int)(L(strippedData[26])/4);
BillEccles 0:dfbd7dacdf8c 359 switch (spreadraw) {
BillEccles 0:dfbd7dacdf8c 360 case 1:
BillEccles 0:dfbd7dacdf8c 361 spread = 22.5;
BillEccles 0:dfbd7dacdf8c 362 break;
BillEccles 0:dfbd7dacdf8c 363 case 2:
BillEccles 0:dfbd7dacdf8c 364 spread = 45;
BillEccles 0:dfbd7dacdf8c 365 break;
BillEccles 0:dfbd7dacdf8c 366 case 3:
BillEccles 0:dfbd7dacdf8c 367 spread = 67.5;
BillEccles 0:dfbd7dacdf8c 368 break;
BillEccles 0:dfbd7dacdf8c 369 default:
BillEccles 0:dfbd7dacdf8c 370 spread = 0;
BillEccles 0:dfbd7dacdf8c 371 }
BillEccles 0:dfbd7dacdf8c 372 nwin = (S((int)H(strippedData[24]))==-1) ? "NEW" : "OLD";
BillEccles 0:dfbd7dacdf8c 373
BillEccles 0:dfbd7dacdf8c 374 // mac.printf(" SP: %5.2f DIR:%5.2f SPREADRAW:%i SPREAD:%5.2f %s \n\r", sp, dir, spreadraw, spread, nwin);
BillEccles 0:dfbd7dacdf8c 375
BillEccles 0:dfbd7dacdf8c 376 if ((t1f<=50)&&(sp>3)) {
BillEccles 0:dfbd7dacdf8c 377 wc = 35.74+(0.6215*t1f)-(35.75*pow(sp,(float)0.16))+(0.4275*t1f*pow(sp,(float)0.16));
BillEccles 0:dfbd7dacdf8c 378 } else {
BillEccles 0:dfbd7dacdf8c 379 wc = t1f;
BillEccles 0:dfbd7dacdf8c 380 }
BillEccles 0:dfbd7dacdf8c 381
BillEccles 0:dfbd7dacdf8c 382 // mac.printf(" WC: %5.2f\n\r",wc);
BillEccles 0:dfbd7dacdf8c 383
BillEccles 0:dfbd7dacdf8c 384 // reading: air pressure
BillEccles 0:dfbd7dacdf8c 385
BillEccles 0:dfbd7dacdf8c 386 pr = (H(strippedData[27])*100.0+L(strippedData[27])*10.0+H(strippedData[26])+200.0)/33.775;
BillEccles 0:dfbd7dacdf8c 387 // mac.printf(" PR: %6.3f\n\r",pr);
BillEccles 0:dfbd7dacdf8c 388
BillEccles 0:dfbd7dacdf8c 389 // Ah, rain. The see-saw tips, and each tip represents 0.0145636 inches of rain.
BillEccles 0:dfbd7dacdf8c 390
BillEccles 0:dfbd7dacdf8c 391 rn = (strippedData[22]&0x7F)*256+strippedData[21];
BillEccles 0:dfbd7dacdf8c 392 nr = (S((int)H(strippedData[22]))==-1) ? "NEW" : "OLD";
BillEccles 0:dfbd7dacdf8c 393
BillEccles 0:dfbd7dacdf8c 394 // mac.printf(" RN: %7.1f NR %s\n\r",rn,nr);
BillEccles 0:dfbd7dacdf8c 395
BillEccles 0:dfbd7dacdf8c 396 // Generate the query string
BillEccles 0:dfbd7dacdf8c 397
BillEccles 0:dfbd7dacdf8c 398 j = sprintf(httpQuery, "http://www.example.com/yourquery.php?datasetnumber=%06d&timedelta=%06d&t1=%.1f&h1=%.1f&n1=%s&hif=%.1f&hic=%.1f&ti=%.1f&hi=%.1f&ni=%s&sp=%.1f&dir=%.1f&spread=%.1f&nwin=%s&wc=%.1f&pr=%.7f&rn=%.1f&nr=%s",db,dt,t1f,h1,n1,hif,hic,tif,hi,ni,sp,dir,spread,nwin,wc,pr,rn,nr);
BillEccles 0:dfbd7dacdf8c 399 // mac.printf("The query is \"%s\"\n\r",httpQuery);
BillEccles 0:dfbd7dacdf8c 400
BillEccles 0:dfbd7dacdf8c 401 // Now try and post the data. Make sure the response from the server doesn't exceed capacity of the buffer "txt".
BillEccles 0:dfbd7dacdf8c 402
BillEccles 0:dfbd7dacdf8c 403 showLEDs( false, true, true, false );
BillEccles 0:dfbd7dacdf8c 404
BillEccles 0:dfbd7dacdf8c 405 r = http.get(httpQuery, &txt);
BillEccles 0:dfbd7dacdf8c 406 if(r==HTTP_OK) {
BillEccles 0:dfbd7dacdf8c 407 // mac.printf("HTTP result:\"%s\"\n\r", txt.gets());
BillEccles 0:dfbd7dacdf8c 408 dataPostedOK = true;
BillEccles 0:dfbd7dacdf8c 409 } else {
BillEccles 0:dfbd7dacdf8c 410 // mac.printf("HTTP error #%d\n\r", r);
BillEccles 0:dfbd7dacdf8c 411 dataPostedOK = false;
BillEccles 0:dfbd7dacdf8c 412 }
BillEccles 0:dfbd7dacdf8c 413
BillEccles 0:dfbd7dacdf8c 414 if (dataPostedOK) {
BillEccles 0:dfbd7dacdf8c 415 showLEDs( false, true, true, true );
BillEccles 0:dfbd7dacdf8c 416 error = !wakeup();
BillEccles 0:dfbd7dacdf8c 417 mac.printf("Requesting next dataset.... ");
BillEccles 0:dfbd7dacdf8c 418 dataLength = sendString((char *)requestNextDataset);
BillEccles 0:dfbd7dacdf8c 419 dataLength = receiveString(theData, 128, 300);
BillEccles 0:dfbd7dacdf8c 420 mac.printf("Received %i characters.\n\r",dataLength);
BillEccles 0:dfbd7dacdf8c 421 if (dataLength<2) {
BillEccles 0:dfbd7dacdf8c 422 mac.printf("No data received.\n\r");
BillEccles 0:dfbd7dacdf8c 423 haveData=false;
BillEccles 0:dfbd7dacdf8c 424 error = true;
BillEccles 0:dfbd7dacdf8c 425 } else if ((theData[0]!=2)||(theData[dataLength-1]!=3)) {
BillEccles 0:dfbd7dacdf8c 426 mac.printf("Bad dataset received.\n\r");
BillEccles 0:dfbd7dacdf8c 427 haveData = false;
BillEccles 0:dfbd7dacdf8c 428 error = true;
BillEccles 0:dfbd7dacdf8c 429 } else if ((theData[1]==1)&&(theData[2]==16)) {
BillEccles 0:dfbd7dacdf8c 430 mac.printf("No data available at the moment. Will retry later.\n\r");
BillEccles 0:dfbd7dacdf8c 431 haveData = false;
BillEccles 0:dfbd7dacdf8c 432 }
BillEccles 0:dfbd7dacdf8c 433 }
BillEccles 0:dfbd7dacdf8c 434 } // end of "if (haveData)"
BillEccles 0:dfbd7dacdf8c 435 }
BillEccles 0:dfbd7dacdf8c 436 }
BillEccles 0:dfbd7dacdf8c 437
BillEccles 0:dfbd7dacdf8c 438 errorHalt( true, true, true, true );
BillEccles 0:dfbd7dacdf8c 439 return 0;
BillEccles 0:dfbd7dacdf8c 440
BillEccles 0:dfbd7dacdf8c 441 }