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

Dependencies:   mbed RemoteIR SuperTweet ConfigFile EthernetNetIf

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?

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