http://mbed.org/users/shintamainjp/notebook/starboard_expbrd-one_ex1_en/

Dependencies:   mbed RemoteIR SuperTweet ConfigFile EthernetNetIf

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?

UserRevisionLine numberNew 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 }