Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetNetIf mbed
WeatherStationInterface.cpp@1:1972c4310a72, 2012-01-02 (annotated)
- Committer:
- BillEccles
- Date:
- Mon Jan 02 19:13:55 2012 +0000
- Revision:
- 1:1972c4310a72
- Parent:
- 0:dfbd7dacdf8c
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |