/* デジタル温度計: ウェブ配信版 */ #include <stdio.h> #include <string.h> #include <btron/proctask.h> #include <btron/bsocket.h> #include <btron/tkcall.h> volatile int dt; /* 温度センサドライバ用 */ /* セッションタスク */ void session_task( int fd ) { int n; char t; char buf[1024]; /* ブラウザからのメソッドを受信 */ n = so_read( fd, buf, sizeof(buf) ); if (n <= 0) goto e1; /* 温度センサドライバからリード */ tk_srea_dev( dt, -100, &t, 1, &n ); /* ブラウザへ返答を送信 */ n = sprintf( buf, "HTTP/1.1 200 OK\r\n" "Accept-Ranges: bytes\r\n" "Content-Length: 78\r\n" "Connection: close\r\n" "Content-Type: text/html\r\n" "\r\n" "<html><head>" "<meta http-equiv=refresh content=1>" "</head><body>%2d</body></html>\r\n", t ); so_write( fd, buf, n ); e1: so_close( fd ); ext_tsk(); /* タスク終了 */ } /* 簡易ウェブサーバータスク */ void http_task( int port ) { int fd, cfd, clen; struct sockaddr_in saddr, caddr; /* ソケット作成, バインド, リッスン */ fd = so_socket( AF_INET, SOCK_STREAM, 0 ); memset( &saddr, 0, sizeof(saddr) ); saddr.sin_family = AF_INET; saddr.sin_port = htons( port ); saddr.sin_addr.s_addr = htonl( INADDR_ANY ); so_bind( fd, (struct sockaddr *)&saddr, sizeof(saddr) ); so_listen( fd, 5 ); for(;;) { /* 無限ループ: このタスクは終了しない */ /* ブラウザからの接続をアクセプト */ clen = sizeof(caddr); cfd = so_accept( fd, (struct sockaddr *)&caddr, &clen ); /* セッションタスクの生成 */ cre_tsk( session_task, -1, cfd ); } } /* プロセス:メインタスク */ int main() { int dl, n; char t; /* 温度センサドライバをオープン */ dt = tk_opn_dev( "thermo", TD_READ ); /* 7セグメントLEDドライバをオープン */ dl = tk_opn_dev( "led", TD_WRITE ); /* 簡易ウェブサーバータスクを生成 */ cre_tsk( http_task, -1, 80 ); for(;;) { /* 無限ループ */ /* 温度センサドライバからリード */ tk_srea_dev( dt, -100, &t, 1, &n ); /* 7セグメントLEDドライバへライト */ tk_swri_dev( dl, -100, &t, 1, &n ); slp_tsk( 500 ); /* 500ミリ秒待つ */ } }
Copyright © ITmedia, Inc. All Rights Reserved.