
http://mbed.org/users/shintamainjp/notebook/starboard_expbrd-one_ex1_en/
Dependencies: mbed RemoteIR SuperTweet ConfigFile EthernetNetIf
main.cpp@1:c4cfd136f9c7, 2010-11-04 (annotated)
- Committer:
- shintamainjp
- Date:
- Thu Nov 04 14:33:07 2010 +0000
- Revision:
- 1:c4cfd136f9c7
- Parent:
- 0:db299c5a18ba
Added license terms.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shintamainjp | 0:db299c5a18ba | 1 | /** |
shintamainjp | 1:c4cfd136f9c7 | 2 | * ============================================================================= |
shintamainjp | 1:c4cfd136f9c7 | 3 | * Expansion Board One - Example application No.1 (Version 0.0.1) |
shintamainjp | 0:db299c5a18ba | 4 | * http://mbed.org/users/shintamainjp/notebook/starboard_expbrd-one_ex1_en/ |
shintamainjp | 1:c4cfd136f9c7 | 5 | * ============================================================================= |
shintamainjp | 1:c4cfd136f9c7 | 6 | * Copyright (c) 2010 Shinichiro Nakamura (CuBeatSystems) |
shintamainjp | 0:db299c5a18ba | 7 | * |
shintamainjp | 1:c4cfd136f9c7 | 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
shintamainjp | 1:c4cfd136f9c7 | 9 | * of this software and associated documentation files (the "Software"), to deal |
shintamainjp | 1:c4cfd136f9c7 | 10 | * in the Software without restriction, including without limitation the rights |
shintamainjp | 1:c4cfd136f9c7 | 11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
shintamainjp | 1:c4cfd136f9c7 | 12 | * copies of the Software, and to permit persons to whom the Software is |
shintamainjp | 1:c4cfd136f9c7 | 13 | * furnished to do so, subject to the following conditions: |
shintamainjp | 1:c4cfd136f9c7 | 14 | * |
shintamainjp | 1:c4cfd136f9c7 | 15 | * The above copyright notice and this permission notice shall be included in |
shintamainjp | 1:c4cfd136f9c7 | 16 | * all copies or substantial portions of the Software. |
shintamainjp | 1:c4cfd136f9c7 | 17 | * |
shintamainjp | 1:c4cfd136f9c7 | 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
shintamainjp | 1:c4cfd136f9c7 | 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
shintamainjp | 1:c4cfd136f9c7 | 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
shintamainjp | 1:c4cfd136f9c7 | 21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
shintamainjp | 1:c4cfd136f9c7 | 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
shintamainjp | 1:c4cfd136f9c7 | 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
shintamainjp | 1:c4cfd136f9c7 | 24 | * THE SOFTWARE. |
shintamainjp | 1:c4cfd136f9c7 | 25 | * ============================================================================= |
shintamainjp | 0:db299c5a18ba | 26 | */ |
shintamainjp | 0:db299c5a18ba | 27 | |
shintamainjp | 0:db299c5a18ba | 28 | #include "mbed.h" |
shintamainjp | 0:db299c5a18ba | 29 | #include "TextLCD.h" |
shintamainjp | 0:db299c5a18ba | 30 | #include "EthernetNetIf.h" |
shintamainjp | 0:db299c5a18ba | 31 | #include "SuperTweetV1XML.h" |
shintamainjp | 0:db299c5a18ba | 32 | #include "ConfigFile.h" |
shintamainjp | 0:db299c5a18ba | 33 | #include "MyHomeLight.h" |
shintamainjp | 0:db299c5a18ba | 34 | #include "StreamFilter.h" |
shintamainjp | 0:db299c5a18ba | 35 | #include "TransmitterIR.h" |
shintamainjp | 0:db299c5a18ba | 36 | #include "appconf.h" |
shintamainjp | 0:db299c5a18ba | 37 | #include <string.h> |
shintamainjp | 0:db299c5a18ba | 38 | |
shintamainjp | 0:db299c5a18ba | 39 | extern "C" void mbed_reset(); |
shintamainjp | 0:db299c5a18ba | 40 | |
shintamainjp | 0:db299c5a18ba | 41 | /* |
shintamainjp | 0:db299c5a18ba | 42 | * Definitions for a configuration file. |
shintamainjp | 0:db299c5a18ba | 43 | */ |
shintamainjp | 1:c4cfd136f9c7 | 44 | #define CONFIG_FILENAME "/local/SBOE1.CFG" |
shintamainjp | 0:db299c5a18ba | 45 | |
shintamainjp | 0:db299c5a18ba | 46 | /* |
shintamainjp | 0:db299c5a18ba | 47 | * Variables. |
shintamainjp | 0:db299c5a18ba | 48 | */ |
shintamainjp | 0:db299c5a18ba | 49 | typedef struct { |
shintamainjp | 0:db299c5a18ba | 50 | bool toggled; |
shintamainjp | 0:db299c5a18ba | 51 | int fetch_count; |
shintamainjp | 0:db299c5a18ba | 52 | int error_count; |
shintamainjp | 0:db299c5a18ba | 53 | int toggle_count; |
shintamainjp | 0:db299c5a18ba | 54 | int text_count; |
shintamainjp | 0:db299c5a18ba | 55 | char txtcurr[1024]; |
shintamainjp | 0:db299c5a18ba | 56 | char txtprev[1024]; |
shintamainjp | 0:db299c5a18ba | 57 | } work_t; |
shintamainjp | 0:db299c5a18ba | 58 | work_t work = { |
shintamainjp | 0:db299c5a18ba | 59 | .toggled = false, |
shintamainjp | 0:db299c5a18ba | 60 | .fetch_count = 0, |
shintamainjp | 0:db299c5a18ba | 61 | .error_count = 0, |
shintamainjp | 0:db299c5a18ba | 62 | .toggle_count = 0, |
shintamainjp | 0:db299c5a18ba | 63 | .text_count = 0, |
shintamainjp | 0:db299c5a18ba | 64 | .txtcurr = {0}, |
shintamainjp | 0:db299c5a18ba | 65 | .txtprev = {0} |
shintamainjp | 0:db299c5a18ba | 66 | }; |
shintamainjp | 0:db299c5a18ba | 67 | static appconf_t appconf; |
shintamainjp | 0:db299c5a18ba | 68 | static const int CHANNEL = 2; |
shintamainjp | 0:db299c5a18ba | 69 | |
shintamainjp | 0:db299c5a18ba | 70 | /* |
shintamainjp | 0:db299c5a18ba | 71 | * Classes. |
shintamainjp | 0:db299c5a18ba | 72 | */ |
shintamainjp | 1:c4cfd136f9c7 | 73 | LocalFileSystem localfs("local"); |
shintamainjp | 0:db299c5a18ba | 74 | TextLCD lcd(p24, p26, p27, p28, p29, p30); |
shintamainjp | 0:db299c5a18ba | 75 | EthernetNetIf netif; |
shintamainjp | 0:db299c5a18ba | 76 | MyHomeLight room_light(p21); |
shintamainjp | 0:db299c5a18ba | 77 | StreamFilter sf("<text>", "</text>"); |
shintamainjp | 0:db299c5a18ba | 78 | |
shintamainjp | 0:db299c5a18ba | 79 | void splash(void); |
shintamainjp | 0:db299c5a18ba | 80 | int main(void); |
shintamainjp | 0:db299c5a18ba | 81 | |
shintamainjp | 0:db299c5a18ba | 82 | /** |
shintamainjp | 0:db299c5a18ba | 83 | * Display a splash screen. |
shintamainjp | 0:db299c5a18ba | 84 | */ |
shintamainjp | 0:db299c5a18ba | 85 | void splash(void) { |
shintamainjp | 0:db299c5a18ba | 86 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 87 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 88 | lcd.printf("StarBoard Orange"); |
shintamainjp | 0:db299c5a18ba | 89 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 90 | lcd.printf("Expansion Board "); |
shintamainjp | 0:db299c5a18ba | 91 | wait(2); |
shintamainjp | 0:db299c5a18ba | 92 | |
shintamainjp | 0:db299c5a18ba | 93 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 94 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 95 | lcd.printf("Example app No.1"); |
shintamainjp | 0:db299c5a18ba | 96 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 97 | lcd.printf(" "); |
shintamainjp | 0:db299c5a18ba | 98 | wait(2); |
shintamainjp | 0:db299c5a18ba | 99 | } |
shintamainjp | 0:db299c5a18ba | 100 | |
shintamainjp | 0:db299c5a18ba | 101 | /** |
shintamainjp | 0:db299c5a18ba | 102 | * A callback function with SuperTweet. |
shintamainjp | 0:db299c5a18ba | 103 | * |
shintamainjp | 0:db299c5a18ba | 104 | * @param buf A pointer to a buffer. |
shintamainjp | 0:db299c5a18ba | 105 | * @param siz Size of the buffer. |
shintamainjp | 0:db299c5a18ba | 106 | */ |
shintamainjp | 0:db299c5a18ba | 107 | void cbfunc(char *buf, size_t siz) { |
shintamainjp | 0:db299c5a18ba | 108 | /* |
shintamainjp | 0:db299c5a18ba | 109 | * Push the stream data to the stream filter. |
shintamainjp | 0:db299c5a18ba | 110 | */ |
shintamainjp | 0:db299c5a18ba | 111 | for (int i = 0; i < siz; i++) { |
shintamainjp | 0:db299c5a18ba | 112 | sf.push(buf[i]); |
shintamainjp | 0:db299c5a18ba | 113 | } |
shintamainjp | 0:db299c5a18ba | 114 | |
shintamainjp | 0:db299c5a18ba | 115 | /* |
shintamainjp | 0:db299c5a18ba | 116 | * Check the state of the stream filter. |
shintamainjp | 0:db299c5a18ba | 117 | */ |
shintamainjp | 0:db299c5a18ba | 118 | if (sf.done()) { |
shintamainjp | 0:db299c5a18ba | 119 | if (sf.getContent(&work.txtcurr[0], sizeof(work.txtcurr))) { |
shintamainjp | 0:db299c5a18ba | 120 | /* |
shintamainjp | 0:db299c5a18ba | 121 | * Toggle my room light if there is a 'Light' text in twitter stream. |
shintamainjp | 0:db299c5a18ba | 122 | */ |
shintamainjp | 0:db299c5a18ba | 123 | if (strstr(work.txtcurr, "Light") != NULL) { |
shintamainjp | 0:db299c5a18ba | 124 | work.text_count++; |
shintamainjp | 0:db299c5a18ba | 125 | if (work.text_count == 1) { |
shintamainjp | 0:db299c5a18ba | 126 | if (strcmp(work.txtcurr, work.txtprev) != 0) { |
shintamainjp | 0:db299c5a18ba | 127 | if (work.toggle_count > 0) { |
shintamainjp | 0:db299c5a18ba | 128 | if (room_light.toggle(CHANNEL)) { |
shintamainjp | 0:db299c5a18ba | 129 | printf("Controlled.\n"); |
shintamainjp | 0:db299c5a18ba | 130 | work.toggled = true; |
shintamainjp | 0:db299c5a18ba | 131 | } else { |
shintamainjp | 0:db299c5a18ba | 132 | printf("Control failed.\n"); |
shintamainjp | 0:db299c5a18ba | 133 | } |
shintamainjp | 0:db299c5a18ba | 134 | } |
shintamainjp | 0:db299c5a18ba | 135 | work.toggle_count++; |
shintamainjp | 0:db299c5a18ba | 136 | } |
shintamainjp | 0:db299c5a18ba | 137 | strcpy(work.txtprev, work.txtcurr); |
shintamainjp | 0:db299c5a18ba | 138 | } |
shintamainjp | 0:db299c5a18ba | 139 | } |
shintamainjp | 0:db299c5a18ba | 140 | } |
shintamainjp | 0:db299c5a18ba | 141 | sf.reset(); |
shintamainjp | 0:db299c5a18ba | 142 | } |
shintamainjp | 0:db299c5a18ba | 143 | } |
shintamainjp | 0:db299c5a18ba | 144 | |
shintamainjp | 0:db299c5a18ba | 145 | /** |
shintamainjp | 0:db299c5a18ba | 146 | * Entry point. |
shintamainjp | 0:db299c5a18ba | 147 | */ |
shintamainjp | 0:db299c5a18ba | 148 | int main(void) { |
shintamainjp | 0:db299c5a18ba | 149 | |
shintamainjp | 0:db299c5a18ba | 150 | /* |
shintamainjp | 0:db299c5a18ba | 151 | * Splash. |
shintamainjp | 0:db299c5a18ba | 152 | */ |
shintamainjp | 0:db299c5a18ba | 153 | splash(); |
shintamainjp | 0:db299c5a18ba | 154 | |
shintamainjp | 0:db299c5a18ba | 155 | /* |
shintamainjp | 0:db299c5a18ba | 156 | * Initialize ethernet interface. |
shintamainjp | 0:db299c5a18ba | 157 | */ |
shintamainjp | 0:db299c5a18ba | 158 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 159 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 160 | lcd.printf("Initializing. "); |
shintamainjp | 0:db299c5a18ba | 161 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 162 | lcd.printf("Ethernet: "); |
shintamainjp | 0:db299c5a18ba | 163 | EthernetErr ethErr = netif.setup(); |
shintamainjp | 0:db299c5a18ba | 164 | if (ethErr) { |
shintamainjp | 0:db299c5a18ba | 165 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 166 | lcd.printf("Ethernet:NG "); |
shintamainjp | 0:db299c5a18ba | 167 | error("Network setup failed.\n"); |
shintamainjp | 0:db299c5a18ba | 168 | } else { |
shintamainjp | 0:db299c5a18ba | 169 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 170 | lcd.printf("Ethernet:OK "); |
shintamainjp | 0:db299c5a18ba | 171 | } |
shintamainjp | 0:db299c5a18ba | 172 | wait(2); |
shintamainjp | 0:db299c5a18ba | 173 | |
shintamainjp | 0:db299c5a18ba | 174 | /* |
shintamainjp | 0:db299c5a18ba | 175 | * Read configuration variables from a file. |
shintamainjp | 0:db299c5a18ba | 176 | */ |
shintamainjp | 0:db299c5a18ba | 177 | appconf_init(&appconf); |
shintamainjp | 0:db299c5a18ba | 178 | if (appconf_read(CONFIG_FILENAME, &appconf) != 0) { |
shintamainjp | 0:db299c5a18ba | 179 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 180 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 181 | lcd.printf("ConfigFile"); |
shintamainjp | 0:db299c5a18ba | 182 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 183 | lcd.printf("Read error."); |
shintamainjp | 0:db299c5a18ba | 184 | error("Failure to read a configuration file.\n"); |
shintamainjp | 0:db299c5a18ba | 185 | } |
shintamainjp | 0:db299c5a18ba | 186 | |
shintamainjp | 0:db299c5a18ba | 187 | /* |
shintamainjp | 0:db299c5a18ba | 188 | * Setup http client object. |
shintamainjp | 0:db299c5a18ba | 189 | * |
shintamainjp | 0:db299c5a18ba | 190 | * Please replace this information by your account. |
shintamainjp | 0:db299c5a18ba | 191 | */ |
shintamainjp | 0:db299c5a18ba | 192 | SuperTweetV1XML twitter(appconf.account, appconf.password); |
shintamainjp | 0:db299c5a18ba | 193 | |
shintamainjp | 0:db299c5a18ba | 194 | int count = 0; |
shintamainjp | 0:db299c5a18ba | 195 | while (1) { |
shintamainjp | 0:db299c5a18ba | 196 | /* |
shintamainjp | 0:db299c5a18ba | 197 | * Fetching... |
shintamainjp | 0:db299c5a18ba | 198 | */ |
shintamainjp | 0:db299c5a18ba | 199 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 200 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 201 | lcd.printf("Fetching:%d", count++); |
shintamainjp | 0:db299c5a18ba | 202 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 203 | lcd.printf("Toggled :%d", work.toggle_count); |
shintamainjp | 0:db299c5a18ba | 204 | |
shintamainjp | 0:db299c5a18ba | 205 | work.fetch_count++; |
shintamainjp | 0:db299c5a18ba | 206 | work.text_count = 0; |
shintamainjp | 0:db299c5a18ba | 207 | work.toggled = false; |
shintamainjp | 0:db299c5a18ba | 208 | sf.reset(); |
shintamainjp | 0:db299c5a18ba | 209 | |
shintamainjp | 0:db299c5a18ba | 210 | /* |
shintamainjp | 0:db299c5a18ba | 211 | * getStatusesUserTimeline: Only You can control a device. |
shintamainjp | 0:db299c5a18ba | 212 | * getStatusesHomeTimeline: Everybody can control a device. |
shintamainjp | 0:db299c5a18ba | 213 | */ |
shintamainjp | 0:db299c5a18ba | 214 | // HTTPResult r = twitter.getStatusesUserTimeline(cbfunc); |
shintamainjp | 0:db299c5a18ba | 215 | HTTPResult r = twitter.getStatusesHomeTimeline(cbfunc); |
shintamainjp | 0:db299c5a18ba | 216 | |
shintamainjp | 0:db299c5a18ba | 217 | /* |
shintamainjp | 0:db299c5a18ba | 218 | * Report the toggled status to the twitter account. |
shintamainjp | 0:db299c5a18ba | 219 | */ |
shintamainjp | 0:db299c5a18ba | 220 | if (work.toggled) { |
shintamainjp | 0:db299c5a18ba | 221 | work.toggled = false; |
shintamainjp | 0:db299c5a18ba | 222 | char buf[64]; |
shintamainjp | 0:db299c5a18ba | 223 | snprintf(buf, sizeof(buf), "Toggled (%d/%d)", work.toggle_count, count); |
shintamainjp | 0:db299c5a18ba | 224 | if (twitter.postStatusesUpdate(buf) == 0) { |
shintamainjp | 0:db299c5a18ba | 225 | printf("Post done.\n"); |
shintamainjp | 0:db299c5a18ba | 226 | } else { |
shintamainjp | 0:db299c5a18ba | 227 | printf("Post failed.\n"); |
shintamainjp | 0:db299c5a18ba | 228 | } |
shintamainjp | 0:db299c5a18ba | 229 | } |
shintamainjp | 0:db299c5a18ba | 230 | |
shintamainjp | 0:db299c5a18ba | 231 | /* |
shintamainjp | 0:db299c5a18ba | 232 | * Note: |
shintamainjp | 0:db299c5a18ba | 233 | * I don't know why sometime it get a protocol error number 5. |
shintamainjp | 0:db299c5a18ba | 234 | * I think it a bug in a mbed library. |
shintamainjp | 0:db299c5a18ba | 235 | */ |
shintamainjp | 0:db299c5a18ba | 236 | printf("No.%d:[%d]\n", work.fetch_count, (int)r); |
shintamainjp | 0:db299c5a18ba | 237 | if ((int)r != 0) { |
shintamainjp | 0:db299c5a18ba | 238 | work.error_count++; |
shintamainjp | 0:db299c5a18ba | 239 | if (work.error_count > 2) { |
shintamainjp | 0:db299c5a18ba | 240 | printf("\tResetting...\n"); |
shintamainjp | 0:db299c5a18ba | 241 | mbed_reset(); |
shintamainjp | 0:db299c5a18ba | 242 | } |
shintamainjp | 0:db299c5a18ba | 243 | } |
shintamainjp | 0:db299c5a18ba | 244 | |
shintamainjp | 0:db299c5a18ba | 245 | /* |
shintamainjp | 0:db299c5a18ba | 246 | * Waiting... |
shintamainjp | 0:db299c5a18ba | 247 | */ |
shintamainjp | 0:db299c5a18ba | 248 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 249 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 250 | lcd.printf("Waiting..."); |
shintamainjp | 0:db299c5a18ba | 251 | wait(2); |
shintamainjp | 0:db299c5a18ba | 252 | } |
shintamainjp | 0:db299c5a18ba | 253 | } |