Dependencies:   EthernetNetIf NTPClient_NetServices mbed

Committer:
jksoft
Date:
Wed May 04 11:25:52 2011 +0000
Revision:
0:1eb334b65fb2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:1eb334b65fb2 1 #include "mbed.h"
jksoft 0:1eb334b65fb2 2 #include "EthernetNetIf.h"
jksoft 0:1eb334b65fb2 3 #include "NTPClient.h"
jksoft 0:1eb334b65fb2 4 #include "HTTPClient.h"
jksoft 0:1eb334b65fb2 5
jksoft 0:1eb334b65fb2 6 #define TMP_TEXT_BUF_SIZE 256 // 文字列用のバッファ・サイズ
jksoft 0:1eb334b65fb2 7
jksoft 0:1eb334b65fb2 8 // 使用するライブラリの定義
jksoft 0:1eb334b65fb2 9 PwmOut beep(p21);
jksoft 0:1eb334b65fb2 10 DigitalOut t_p(p29);
jksoft 0:1eb334b65fb2 11 DigitalIn touch(p30);
jksoft 0:1eb334b65fb2 12 EthernetNetIf eth;
jksoft 0:1eb334b65fb2 13 NTPClient ntp;
jksoft 0:1eb334b65fb2 14 LocalFileSystem local("local");
jksoft 0:1eb334b65fb2 15
jksoft 0:1eb334b65fb2 16 // 使用する変数の定義と初期化
jksoft 0:1eb334b65fb2 17 char id[32] = "\0";
jksoft 0:1eb334b65fb2 18 char password[32] = "\0";
jksoft 0:1eb334b65fb2 19 char msg_file_name[32] = "\0";
jksoft 0:1eb334b65fb2 20
jksoft 0:1eb334b65fb2 21 // 圧電ブザーを鳴らす関数 鳴らす周波数と時間を指定する
jksoft 0:1eb334b65fb2 22 void Beep(float freq, float time) {
jksoft 0:1eb334b65fb2 23 beep.period(1.0/freq);
jksoft 0:1eb334b65fb2 24 beep.write(0.5);
jksoft 0:1eb334b65fb2 25 wait(time);
jksoft 0:1eb334b65fb2 26 beep.write(0.0);
jksoft 0:1eb334b65fb2 27 }
jksoft 0:1eb334b65fb2 28
jksoft 0:1eb334b65fb2 29 // タッチを検出する関数 タッチを検出したときにTRUEになる
jksoft 0:1eb334b65fb2 30 bool GetTouch(void) {
jksoft 0:1eb334b65fb2 31 int touch_count = 0;
jksoft 0:1eb334b65fb2 32 t_p = 1;
jksoft 0:1eb334b65fb2 33 touch_count = 0;
jksoft 0:1eb334b65fb2 34
jksoft 0:1eb334b65fb2 35 while((touch != 1)&&(touch_count < 10000))
jksoft 0:1eb334b65fb2 36 {
jksoft 0:1eb334b65fb2 37 touch_count++;
jksoft 0:1eb334b65fb2 38 }
jksoft 0:1eb334b65fb2 39 t_p = 0;
jksoft 0:1eb334b65fb2 40
jksoft 0:1eb334b65fb2 41 if( touch_count != 10000 ) {
jksoft 0:1eb334b65fb2 42 return(true);
jksoft 0:1eb334b65fb2 43 }
jksoft 0:1eb334b65fb2 44 else {
jksoft 0:1eb334b65fb2 45 return(false);
jksoft 0:1eb334b65fb2 46 }
jksoft 0:1eb334b65fb2 47 }
jksoft 0:1eb334b65fb2 48
jksoft 0:1eb334b65fb2 49 // テキストファイルから1行分を取得する関数
jksoft 0:1eb334b65fb2 50 unsigned char GetFileLine( FILE *stm , char *str ) {
jksoft 0:1eb334b65fb2 51 char count = 0;
jksoft 0:1eb334b65fb2 52 if(fread(&str[count], 1,1,stm) > 0) {
jksoft 0:1eb334b65fb2 53 count++;
jksoft 0:1eb334b65fb2 54 while( (fread(&str[count], 1,1,stm) > 0)
jksoft 0:1eb334b65fb2 55 &&(str[count] != '\n')
jksoft 0:1eb334b65fb2 56 &&(count < TMP_TEXT_BUF_SIZE)) {
jksoft 0:1eb334b65fb2 57 count++;
jksoft 0:1eb334b65fb2 58 }
jksoft 0:1eb334b65fb2 59 }
jksoft 0:1eb334b65fb2 60 str[count] = '\0';
jksoft 0:1eb334b65fb2 61 return(count);
jksoft 0:1eb334b65fb2 62 }
jksoft 0:1eb334b65fb2 63
jksoft 0:1eb334b65fb2 64 // 文字列に時間を追加する関数
jksoft 0:1eb334b65fb2 65 void StrTimeAdd( char *msg, struct tm *set_time) {
jksoft 0:1eb334b65fb2 66 char tmp[10];
jksoft 0:1eb334b65fb2 67 sprintf(tmp," at %02d:%02d",set_time->tm_hour, set_time->tm_min);
jksoft 0:1eb334b65fb2 68 strcat( msg ,tmp);
jksoft 0:1eb334b65fb2 69 }
jksoft 0:1eb334b65fb2 70
jksoft 0:1eb334b65fb2 71 // 日本時間を取得する関数
jksoft 0:1eb334b65fb2 72 struct tm *GetJstTime(void) {
jksoft 0:1eb334b65fb2 73 time_t ctTime;
jksoft 0:1eb334b65fb2 74 ctTime = time(NULL);
jksoft 0:1eb334b65fb2 75 ctTime += 32400;
jksoft 0:1eb334b65fb2 76 return(localtime(&ctTime));
jksoft 0:1eb334b65fb2 77 }
jksoft 0:1eb334b65fb2 78
jksoft 0:1eb334b65fb2 79 // ファイルからタグを検索し,その文字列を取得する関数
jksoft 0:1eb334b65fb2 80 int GetStatus( char *path , char *tag , char *text ) {
jksoft 0:1eb334b65fb2 81 char *TmpText = (char*)malloc(TMP_TEXT_BUF_SIZE);
jksoft 0:1eb334b65fb2 82 if( TmpText == NULL ) {
jksoft 0:1eb334b65fb2 83 return( -1 );
jksoft 0:1eb334b65fb2 84 }
jksoft 0:1eb334b65fb2 85
jksoft 0:1eb334b65fb2 86 char *TmpTag = (char*)malloc(TMP_TEXT_BUF_SIZE);
jksoft 0:1eb334b65fb2 87
jksoft 0:1eb334b65fb2 88 if( TmpTag == NULL ) {
jksoft 0:1eb334b65fb2 89 free( TmpTag );
jksoft 0:1eb334b65fb2 90 return( -1 );
jksoft 0:1eb334b65fb2 91 }
jksoft 0:1eb334b65fb2 92
jksoft 0:1eb334b65fb2 93 FILE *stm = fopen( path,"r");
jksoft 0:1eb334b65fb2 94
jksoft 0:1eb334b65fb2 95 if( stm != NULL ) {
jksoft 0:1eb334b65fb2 96 text[0] = '\0';
jksoft 0:1eb334b65fb2 97 sprintf( TmpTag,"%s:%%s",tag );
jksoft 0:1eb334b65fb2 98 while(GetFileLine( stm , TmpText ) > 0) {
jksoft 0:1eb334b65fb2 99 sscanf( TmpText,TmpTag,text );
jksoft 0:1eb334b65fb2 100 }
jksoft 0:1eb334b65fb2 101 fclose(stm);
jksoft 0:1eb334b65fb2 102 }
jksoft 0:1eb334b65fb2 103
jksoft 0:1eb334b65fb2 104 free( TmpText );
jksoft 0:1eb334b65fb2 105 free( TmpTag );
jksoft 0:1eb334b65fb2 106 return(0);
jksoft 0:1eb334b65fb2 107 }
jksoft 0:1eb334b65fb2 108
jksoft 0:1eb334b65fb2 109 // ファイルから今の時間と一日のつぶやき数でつぶやく内容を探す関数
jksoft 0:1eb334b65fb2 110 int GetTimeMsg( char *path , struct tm *set_time ,char *msg , char day_cnt) {
jksoft 0:1eb334b65fb2 111 int count = 0;
jksoft 0:1eb334b65fb2 112
jksoft 0:1eb334b65fb2 113 char *TmpText = (char*)malloc(TMP_TEXT_BUF_SIZE);
jksoft 0:1eb334b65fb2 114 if( TmpText == NULL ) {
jksoft 0:1eb334b65fb2 115 return( -1 );
jksoft 0:1eb334b65fb2 116 }
jksoft 0:1eb334b65fb2 117
jksoft 0:1eb334b65fb2 118 char *GoodText = (char*)malloc(TMP_TEXT_BUF_SIZE);
jksoft 0:1eb334b65fb2 119 if( GoodText == NULL ) {
jksoft 0:1eb334b65fb2 120 free( TmpText );
jksoft 0:1eb334b65fb2 121 return( -1 );
jksoft 0:1eb334b65fb2 122 }
jksoft 0:1eb334b65fb2 123
jksoft 0:1eb334b65fb2 124 char *BadText = (char*)malloc(TMP_TEXT_BUF_SIZE);
jksoft 0:1eb334b65fb2 125 if( BadText == NULL ) {
jksoft 0:1eb334b65fb2 126 free( TmpText );
jksoft 0:1eb334b65fb2 127 free( GoodText );
jksoft 0:1eb334b65fb2 128 return( -1 );
jksoft 0:1eb334b65fb2 129 }
jksoft 0:1eb334b65fb2 130
jksoft 0:1eb334b65fb2 131 FILE *stm = fopen( path,"r");
jksoft 0:1eb334b65fb2 132 if( stm != NULL ) {
jksoft 0:1eb334b65fb2 133 char tmp_hour;
jksoft 0:1eb334b65fb2 134 char tmp_min;
jksoft 0:1eb334b65fb2 135
jksoft 0:1eb334b65fb2 136 GetFileLine(stm,TmpText);
jksoft 0:1eb334b65fb2 137
jksoft 0:1eb334b65fb2 138 count = 0;
jksoft 0:1eb334b65fb2 139 msg[0] = '\0';
jksoft 0:1eb334b65fb2 140 while((GetFileLine(stm,TmpText) > 0)&&(msg[0] == '\0')) {
jksoft 0:1eb334b65fb2 141 if(sscanf(TmpText,"%d:%d %s %s", &tmp_hour,&tmp_min,GoodText,BadText) > 0) {
jksoft 0:1eb334b65fb2 142 if( day_cnt == count ) {
jksoft 0:1eb334b65fb2 143 if( (set_time->tm_hour * 60 + set_time->tm_min) < (tmp_hour * 60 + tmp_min + 5) ) {
jksoft 0:1eb334b65fb2 144 strcpy(msg,GoodText);
jksoft 0:1eb334b65fb2 145 }
jksoft 0:1eb334b65fb2 146 else {
jksoft 0:1eb334b65fb2 147 strcpy(msg,BadText);
jksoft 0:1eb334b65fb2 148 }
jksoft 0:1eb334b65fb2 149 }
jksoft 0:1eb334b65fb2 150 count++;
jksoft 0:1eb334b65fb2 151 }
jksoft 0:1eb334b65fb2 152 }
jksoft 0:1eb334b65fb2 153 fclose(stm);
jksoft 0:1eb334b65fb2 154 }
jksoft 0:1eb334b65fb2 155 else
jksoft 0:1eb334b65fb2 156 {
jksoft 0:1eb334b65fb2 157 count = -1;
jksoft 0:1eb334b65fb2 158 }
jksoft 0:1eb334b65fb2 159 free( TmpText );
jksoft 0:1eb334b65fb2 160 free( GoodText );
jksoft 0:1eb334b65fb2 161 free( BadText );
jksoft 0:1eb334b65fb2 162
jksoft 0:1eb334b65fb2 163 return( count );
jksoft 0:1eb334b65fb2 164 }
jksoft 0:1eb334b65fb2 165
jksoft 0:1eb334b65fb2 166 // Twitterへつぶやく関数
jksoft 0:1eb334b65fb2 167 bool TwitMsg( char *id , char *password , char *msg) {
jksoft 0:1eb334b65fb2 168 HTTPClient twitter;
jksoft 0:1eb334b65fb2 169 HTTPMap h_msg;
jksoft 0:1eb334b65fb2 170
jksoft 0:1eb334b65fb2 171 h_msg["status"] = msg;
jksoft 0:1eb334b65fb2 172
jksoft 0:1eb334b65fb2 173 twitter.basicAuth(id, password);
jksoft 0:1eb334b65fb2 174 HTTPResult r = twitter.post("http://api.supertweet.net/1/statuses/update.xml", h_msg, NULL);
jksoft 0:1eb334b65fb2 175
jksoft 0:1eb334b65fb2 176 if( r == HTTP_OK ) {
jksoft 0:1eb334b65fb2 177 return(true);
jksoft 0:1eb334b65fb2 178 }
jksoft 0:1eb334b65fb2 179 else {
jksoft 0:1eb334b65fb2 180 return(false);
jksoft 0:1eb334b65fb2 181 }
jksoft 0:1eb334b65fb2 182 }
jksoft 0:1eb334b65fb2 183
jksoft 0:1eb334b65fb2 184 int main() {
jksoft 0:1eb334b65fb2 185 struct tm *jst_time;
jksoft 0:1eb334b65fb2 186 int day_count = 0;
jksoft 0:1eb334b65fb2 187 int old_day = 0;
jksoft 0:1eb334b65fb2 188
jksoft 0:1eb334b65fb2 189 // 設定ファイルからTwitterのユーザ名,パスワードなどを読み出す.
jksoft 0:1eb334b65fb2 190 GetStatus("/local/env.ini","ID",id);
jksoft 0:1eb334b65fb2 191 GetStatus("/local/env.ini","PASS",password);
jksoft 0:1eb334b65fb2 192 GetStatus("/local/env.ini","FILE",msg_file_name);
jksoft 0:1eb334b65fb2 193
jksoft 0:1eb334b65fb2 194 EthernetErr ethErr = eth.setup();
jksoft 0:1eb334b65fb2 195 if(ethErr)
jksoft 0:1eb334b65fb2 196 {
jksoft 0:1eb334b65fb2 197 return -1;
jksoft 0:1eb334b65fb2 198 }
jksoft 0:1eb334b65fb2 199
jksoft 0:1eb334b65fb2 200 if( time(NULL) == -1 ) {
jksoft 0:1eb334b65fb2 201 Host server(IpAddr(), 123, "0.uk.pool.ntp.org");
jksoft 0:1eb334b65fb2 202 ntp.setTime(server);
jksoft 0:1eb334b65fb2 203 }
jksoft 0:1eb334b65fb2 204
jksoft 0:1eb334b65fb2 205 while(1) {
jksoft 0:1eb334b65fb2 206
jksoft 0:1eb334b65fb2 207 jst_time = GetJstTime();
jksoft 0:1eb334b65fb2 208 if( jst_time->tm_mday != old_day ) {
jksoft 0:1eb334b65fb2 209 day_count = 0;
jksoft 0:1eb334b65fb2 210 }
jksoft 0:1eb334b65fb2 211
jksoft 0:1eb334b65fb2 212 old_day = jst_time->tm_mday;
jksoft 0:1eb334b65fb2 213 if( GetTouch() == true ) {
jksoft 0:1eb334b65fb2 214
jksoft 0:1eb334b65fb2 215 Beep( 2637.020455 , 0.5 );
jksoft 0:1eb334b65fb2 216
jksoft 0:1eb334b65fb2 217 char *msg = (char*)malloc(TMP_TEXT_BUF_SIZE);
jksoft 0:1eb334b65fb2 218 if( msg != NULL ) {
jksoft 0:1eb334b65fb2 219
jksoft 0:1eb334b65fb2 220 int result = GetTimeMsg( msg_file_name , jst_time ,msg , day_count );
jksoft 0:1eb334b65fb2 221 if( result != -1 ) {
jksoft 0:1eb334b65fb2 222 day_count = result;
jksoft 0:1eb334b65fb2 223 }
jksoft 0:1eb334b65fb2 224
jksoft 0:1eb334b65fb2 225 StrTimeAdd( msg , jst_time );
jksoft 0:1eb334b65fb2 226
jksoft 0:1eb334b65fb2 227 if(TwitMsg( id , password , msg )) {
jksoft 0:1eb334b65fb2 228 Beep( 2637.020455 , 0.5 );
jksoft 0:1eb334b65fb2 229 }
jksoft 0:1eb334b65fb2 230 free( msg );
jksoft 0:1eb334b65fb2 231 }
jksoft 0:1eb334b65fb2 232 }
jksoft 0:1eb334b65fb2 233 }
jksoft 0:1eb334b65fb2 234 return 0;
jksoft 0:1eb334b65fb2 235 }
jksoft 0:1eb334b65fb2 236