
http://mbed.org/users/shintamainjp/notebook/starboard_expbrd-one_ex1_en/
Dependencies: mbed RemoteIR SuperTweet ConfigFile EthernetNetIf
main.cpp@0:db299c5a18ba, 2010-10-29 (annotated)
- Committer:
- shintamainjp
- Date:
- Fri Oct 29 23:17:01 2010 +0000
- Revision:
- 0:db299c5a18ba
- Child:
- 1:c4cfd136f9c7
Initial version.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shintamainjp | 0:db299c5a18ba | 1 | /** |
shintamainjp | 0:db299c5a18ba | 2 | * StarBoard Orange Expansion Board - Example application No.1 (Version 0.0.1) |
shintamainjp | 0:db299c5a18ba | 3 | * http://mbed.org/users/shintamainjp/notebook/starboard_expbrd-one_ex1_en/ |
shintamainjp | 0:db299c5a18ba | 4 | * |
shintamainjp | 0:db299c5a18ba | 5 | * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems) |
shintamainjp | 0:db299c5a18ba | 6 | * http://shinta.main.jp/ |
shintamainjp | 0:db299c5a18ba | 7 | */ |
shintamainjp | 0:db299c5a18ba | 8 | |
shintamainjp | 0:db299c5a18ba | 9 | #include "mbed.h" |
shintamainjp | 0:db299c5a18ba | 10 | #include "TextLCD.h" |
shintamainjp | 0:db299c5a18ba | 11 | #include "TextLCD_SR4.h" |
shintamainjp | 0:db299c5a18ba | 12 | #include "EthernetNetIf.h" |
shintamainjp | 0:db299c5a18ba | 13 | #include "SuperTweetV1XML.h" |
shintamainjp | 0:db299c5a18ba | 14 | #include "ConfigFile.h" |
shintamainjp | 0:db299c5a18ba | 15 | #include "MyHomeLight.h" |
shintamainjp | 0:db299c5a18ba | 16 | #include "StreamFilter.h" |
shintamainjp | 0:db299c5a18ba | 17 | #include "TransmitterIR.h" |
shintamainjp | 0:db299c5a18ba | 18 | #include "appconf.h" |
shintamainjp | 0:db299c5a18ba | 19 | #include <string.h> |
shintamainjp | 0:db299c5a18ba | 20 | |
shintamainjp | 0:db299c5a18ba | 21 | extern "C" void mbed_reset(); |
shintamainjp | 0:db299c5a18ba | 22 | |
shintamainjp | 0:db299c5a18ba | 23 | /* |
shintamainjp | 0:db299c5a18ba | 24 | * Definitions for a configuration file. |
shintamainjp | 0:db299c5a18ba | 25 | */ |
shintamainjp | 0:db299c5a18ba | 26 | #define CONFIG_FILENAME "/local/SETUP.CFG" |
shintamainjp | 0:db299c5a18ba | 27 | |
shintamainjp | 0:db299c5a18ba | 28 | /* |
shintamainjp | 0:db299c5a18ba | 29 | * Variables. |
shintamainjp | 0:db299c5a18ba | 30 | */ |
shintamainjp | 0:db299c5a18ba | 31 | typedef struct { |
shintamainjp | 0:db299c5a18ba | 32 | bool toggled; |
shintamainjp | 0:db299c5a18ba | 33 | int fetch_count; |
shintamainjp | 0:db299c5a18ba | 34 | int error_count; |
shintamainjp | 0:db299c5a18ba | 35 | int toggle_count; |
shintamainjp | 0:db299c5a18ba | 36 | int text_count; |
shintamainjp | 0:db299c5a18ba | 37 | char txtcurr[1024]; |
shintamainjp | 0:db299c5a18ba | 38 | char txtprev[1024]; |
shintamainjp | 0:db299c5a18ba | 39 | } work_t; |
shintamainjp | 0:db299c5a18ba | 40 | work_t work = { |
shintamainjp | 0:db299c5a18ba | 41 | .toggled = false, |
shintamainjp | 0:db299c5a18ba | 42 | .fetch_count = 0, |
shintamainjp | 0:db299c5a18ba | 43 | .error_count = 0, |
shintamainjp | 0:db299c5a18ba | 44 | .toggle_count = 0, |
shintamainjp | 0:db299c5a18ba | 45 | .text_count = 0, |
shintamainjp | 0:db299c5a18ba | 46 | .txtcurr = {0}, |
shintamainjp | 0:db299c5a18ba | 47 | .txtprev = {0} |
shintamainjp | 0:db299c5a18ba | 48 | }; |
shintamainjp | 0:db299c5a18ba | 49 | static appconf_t appconf; |
shintamainjp | 0:db299c5a18ba | 50 | static const int CHANNEL = 2; |
shintamainjp | 0:db299c5a18ba | 51 | |
shintamainjp | 0:db299c5a18ba | 52 | /* |
shintamainjp | 0:db299c5a18ba | 53 | * Classes. |
shintamainjp | 0:db299c5a18ba | 54 | */ |
shintamainjp | 0:db299c5a18ba | 55 | TextLCD lcd(p24, p26, p27, p28, p29, p30); |
shintamainjp | 0:db299c5a18ba | 56 | // TextLCD_SR4 lcd(p29, p30, p28, p27); |
shintamainjp | 0:db299c5a18ba | 57 | LocalFileSystem fs_local("local"); |
shintamainjp | 0:db299c5a18ba | 58 | EthernetNetIf netif; |
shintamainjp | 0:db299c5a18ba | 59 | MyHomeLight room_light(p21); |
shintamainjp | 0:db299c5a18ba | 60 | StreamFilter sf("<text>", "</text>"); |
shintamainjp | 0:db299c5a18ba | 61 | |
shintamainjp | 0:db299c5a18ba | 62 | void splash(void); |
shintamainjp | 0:db299c5a18ba | 63 | int main(void); |
shintamainjp | 0:db299c5a18ba | 64 | |
shintamainjp | 0:db299c5a18ba | 65 | /** |
shintamainjp | 0:db299c5a18ba | 66 | * Display a splash screen. |
shintamainjp | 0:db299c5a18ba | 67 | */ |
shintamainjp | 0:db299c5a18ba | 68 | void splash(void) { |
shintamainjp | 0:db299c5a18ba | 69 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 70 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 71 | lcd.printf("StarBoard Orange"); |
shintamainjp | 0:db299c5a18ba | 72 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 73 | lcd.printf("Expansion Board "); |
shintamainjp | 0:db299c5a18ba | 74 | wait(2); |
shintamainjp | 0:db299c5a18ba | 75 | |
shintamainjp | 0:db299c5a18ba | 76 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 77 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 78 | lcd.printf("Example app No.1"); |
shintamainjp | 0:db299c5a18ba | 79 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 80 | lcd.printf(" "); |
shintamainjp | 0:db299c5a18ba | 81 | wait(2); |
shintamainjp | 0:db299c5a18ba | 82 | } |
shintamainjp | 0:db299c5a18ba | 83 | |
shintamainjp | 0:db299c5a18ba | 84 | /** |
shintamainjp | 0:db299c5a18ba | 85 | * A callback function with SuperTweet. |
shintamainjp | 0:db299c5a18ba | 86 | * |
shintamainjp | 0:db299c5a18ba | 87 | * @param buf A pointer to a buffer. |
shintamainjp | 0:db299c5a18ba | 88 | * @param siz Size of the buffer. |
shintamainjp | 0:db299c5a18ba | 89 | */ |
shintamainjp | 0:db299c5a18ba | 90 | void cbfunc(char *buf, size_t siz) { |
shintamainjp | 0:db299c5a18ba | 91 | /* |
shintamainjp | 0:db299c5a18ba | 92 | * Push the stream data to the stream filter. |
shintamainjp | 0:db299c5a18ba | 93 | */ |
shintamainjp | 0:db299c5a18ba | 94 | for (int i = 0; i < siz; i++) { |
shintamainjp | 0:db299c5a18ba | 95 | sf.push(buf[i]); |
shintamainjp | 0:db299c5a18ba | 96 | } |
shintamainjp | 0:db299c5a18ba | 97 | |
shintamainjp | 0:db299c5a18ba | 98 | /* |
shintamainjp | 0:db299c5a18ba | 99 | * Check the state of the stream filter. |
shintamainjp | 0:db299c5a18ba | 100 | */ |
shintamainjp | 0:db299c5a18ba | 101 | if (sf.done()) { |
shintamainjp | 0:db299c5a18ba | 102 | if (sf.getContent(&work.txtcurr[0], sizeof(work.txtcurr))) { |
shintamainjp | 0:db299c5a18ba | 103 | /* |
shintamainjp | 0:db299c5a18ba | 104 | * Toggle my room light if there is a 'Light' text in twitter stream. |
shintamainjp | 0:db299c5a18ba | 105 | */ |
shintamainjp | 0:db299c5a18ba | 106 | if (strstr(work.txtcurr, "Light") != NULL) { |
shintamainjp | 0:db299c5a18ba | 107 | work.text_count++; |
shintamainjp | 0:db299c5a18ba | 108 | if (work.text_count == 1) { |
shintamainjp | 0:db299c5a18ba | 109 | if (strcmp(work.txtcurr, work.txtprev) != 0) { |
shintamainjp | 0:db299c5a18ba | 110 | if (work.toggle_count > 0) { |
shintamainjp | 0:db299c5a18ba | 111 | if (room_light.toggle(CHANNEL)) { |
shintamainjp | 0:db299c5a18ba | 112 | printf("Controlled.\n"); |
shintamainjp | 0:db299c5a18ba | 113 | work.toggled = true; |
shintamainjp | 0:db299c5a18ba | 114 | } else { |
shintamainjp | 0:db299c5a18ba | 115 | printf("Control failed.\n"); |
shintamainjp | 0:db299c5a18ba | 116 | } |
shintamainjp | 0:db299c5a18ba | 117 | } |
shintamainjp | 0:db299c5a18ba | 118 | work.toggle_count++; |
shintamainjp | 0:db299c5a18ba | 119 | } |
shintamainjp | 0:db299c5a18ba | 120 | strcpy(work.txtprev, work.txtcurr); |
shintamainjp | 0:db299c5a18ba | 121 | } |
shintamainjp | 0:db299c5a18ba | 122 | } |
shintamainjp | 0:db299c5a18ba | 123 | } |
shintamainjp | 0:db299c5a18ba | 124 | sf.reset(); |
shintamainjp | 0:db299c5a18ba | 125 | } |
shintamainjp | 0:db299c5a18ba | 126 | } |
shintamainjp | 0:db299c5a18ba | 127 | |
shintamainjp | 0:db299c5a18ba | 128 | /** |
shintamainjp | 0:db299c5a18ba | 129 | * Entry point. |
shintamainjp | 0:db299c5a18ba | 130 | */ |
shintamainjp | 0:db299c5a18ba | 131 | int main(void) { |
shintamainjp | 0:db299c5a18ba | 132 | |
shintamainjp | 0:db299c5a18ba | 133 | /* |
shintamainjp | 0:db299c5a18ba | 134 | * Splash. |
shintamainjp | 0:db299c5a18ba | 135 | */ |
shintamainjp | 0:db299c5a18ba | 136 | splash(); |
shintamainjp | 0:db299c5a18ba | 137 | |
shintamainjp | 0:db299c5a18ba | 138 | /* |
shintamainjp | 0:db299c5a18ba | 139 | * Initialize ethernet interface. |
shintamainjp | 0:db299c5a18ba | 140 | */ |
shintamainjp | 0:db299c5a18ba | 141 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 142 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 143 | lcd.printf("Initializing. "); |
shintamainjp | 0:db299c5a18ba | 144 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 145 | lcd.printf("Ethernet: "); |
shintamainjp | 0:db299c5a18ba | 146 | EthernetErr ethErr = netif.setup(); |
shintamainjp | 0:db299c5a18ba | 147 | if (ethErr) { |
shintamainjp | 0:db299c5a18ba | 148 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 149 | lcd.printf("Ethernet:NG "); |
shintamainjp | 0:db299c5a18ba | 150 | error("Network setup failed.\n"); |
shintamainjp | 0:db299c5a18ba | 151 | } else { |
shintamainjp | 0:db299c5a18ba | 152 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 153 | lcd.printf("Ethernet:OK "); |
shintamainjp | 0:db299c5a18ba | 154 | } |
shintamainjp | 0:db299c5a18ba | 155 | wait(2); |
shintamainjp | 0:db299c5a18ba | 156 | |
shintamainjp | 0:db299c5a18ba | 157 | /* |
shintamainjp | 0:db299c5a18ba | 158 | * Read configuration variables from a file. |
shintamainjp | 0:db299c5a18ba | 159 | */ |
shintamainjp | 0:db299c5a18ba | 160 | appconf_init(&appconf); |
shintamainjp | 0:db299c5a18ba | 161 | if (appconf_read(CONFIG_FILENAME, &appconf) != 0) { |
shintamainjp | 0:db299c5a18ba | 162 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 163 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 164 | lcd.printf("ConfigFile"); |
shintamainjp | 0:db299c5a18ba | 165 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 166 | lcd.printf("Read error."); |
shintamainjp | 0:db299c5a18ba | 167 | error("Failure to read a configuration file.\n"); |
shintamainjp | 0:db299c5a18ba | 168 | } |
shintamainjp | 0:db299c5a18ba | 169 | |
shintamainjp | 0:db299c5a18ba | 170 | /* |
shintamainjp | 0:db299c5a18ba | 171 | * Setup http client object. |
shintamainjp | 0:db299c5a18ba | 172 | * |
shintamainjp | 0:db299c5a18ba | 173 | * Please replace this information by your account. |
shintamainjp | 0:db299c5a18ba | 174 | */ |
shintamainjp | 0:db299c5a18ba | 175 | SuperTweetV1XML twitter(appconf.account, appconf.password); |
shintamainjp | 0:db299c5a18ba | 176 | |
shintamainjp | 0:db299c5a18ba | 177 | int count = 0; |
shintamainjp | 0:db299c5a18ba | 178 | while (1) { |
shintamainjp | 0:db299c5a18ba | 179 | /* |
shintamainjp | 0:db299c5a18ba | 180 | * Fetching... |
shintamainjp | 0:db299c5a18ba | 181 | */ |
shintamainjp | 0:db299c5a18ba | 182 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 183 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 184 | lcd.printf("Fetching:%d", count++); |
shintamainjp | 0:db299c5a18ba | 185 | lcd.locate(0, 1); |
shintamainjp | 0:db299c5a18ba | 186 | lcd.printf("Toggled :%d", work.toggle_count); |
shintamainjp | 0:db299c5a18ba | 187 | |
shintamainjp | 0:db299c5a18ba | 188 | work.fetch_count++; |
shintamainjp | 0:db299c5a18ba | 189 | work.text_count = 0; |
shintamainjp | 0:db299c5a18ba | 190 | work.toggled = false; |
shintamainjp | 0:db299c5a18ba | 191 | sf.reset(); |
shintamainjp | 0:db299c5a18ba | 192 | |
shintamainjp | 0:db299c5a18ba | 193 | /* |
shintamainjp | 0:db299c5a18ba | 194 | * getStatusesUserTimeline: Only You can control a device. |
shintamainjp | 0:db299c5a18ba | 195 | * getStatusesHomeTimeline: Everybody can control a device. |
shintamainjp | 0:db299c5a18ba | 196 | */ |
shintamainjp | 0:db299c5a18ba | 197 | // HTTPResult r = twitter.getStatusesUserTimeline(cbfunc); |
shintamainjp | 0:db299c5a18ba | 198 | HTTPResult r = twitter.getStatusesHomeTimeline(cbfunc); |
shintamainjp | 0:db299c5a18ba | 199 | |
shintamainjp | 0:db299c5a18ba | 200 | /* |
shintamainjp | 0:db299c5a18ba | 201 | * Report the toggled status to the twitter account. |
shintamainjp | 0:db299c5a18ba | 202 | */ |
shintamainjp | 0:db299c5a18ba | 203 | if (work.toggled) { |
shintamainjp | 0:db299c5a18ba | 204 | work.toggled = false; |
shintamainjp | 0:db299c5a18ba | 205 | char buf[64]; |
shintamainjp | 0:db299c5a18ba | 206 | snprintf(buf, sizeof(buf), "Toggled (%d/%d)", work.toggle_count, count); |
shintamainjp | 0:db299c5a18ba | 207 | if (twitter.postStatusesUpdate(buf) == 0) { |
shintamainjp | 0:db299c5a18ba | 208 | printf("Post done.\n"); |
shintamainjp | 0:db299c5a18ba | 209 | } else { |
shintamainjp | 0:db299c5a18ba | 210 | printf("Post failed.\n"); |
shintamainjp | 0:db299c5a18ba | 211 | } |
shintamainjp | 0:db299c5a18ba | 212 | } |
shintamainjp | 0:db299c5a18ba | 213 | |
shintamainjp | 0:db299c5a18ba | 214 | /* |
shintamainjp | 0:db299c5a18ba | 215 | * Note: |
shintamainjp | 0:db299c5a18ba | 216 | * I don't know why sometime it get a protocol error number 5. |
shintamainjp | 0:db299c5a18ba | 217 | * I think it a bug in a mbed library. |
shintamainjp | 0:db299c5a18ba | 218 | */ |
shintamainjp | 0:db299c5a18ba | 219 | printf("No.%d:[%d]\n", work.fetch_count, (int)r); |
shintamainjp | 0:db299c5a18ba | 220 | if ((int)r != 0) { |
shintamainjp | 0:db299c5a18ba | 221 | work.error_count++; |
shintamainjp | 0:db299c5a18ba | 222 | if (work.error_count > 2) { |
shintamainjp | 0:db299c5a18ba | 223 | printf("\tResetting...\n"); |
shintamainjp | 0:db299c5a18ba | 224 | mbed_reset(); |
shintamainjp | 0:db299c5a18ba | 225 | } |
shintamainjp | 0:db299c5a18ba | 226 | } |
shintamainjp | 0:db299c5a18ba | 227 | |
shintamainjp | 0:db299c5a18ba | 228 | /* |
shintamainjp | 0:db299c5a18ba | 229 | * Waiting... |
shintamainjp | 0:db299c5a18ba | 230 | */ |
shintamainjp | 0:db299c5a18ba | 231 | lcd.cls(); |
shintamainjp | 0:db299c5a18ba | 232 | lcd.locate(0, 0); |
shintamainjp | 0:db299c5a18ba | 233 | lcd.printf("Waiting..."); |
shintamainjp | 0:db299c5a18ba | 234 | wait(2); |
shintamainjp | 0:db299c5a18ba | 235 | } |
shintamainjp | 0:db299c5a18ba | 236 | } |