連載
» 2006年09月08日 00時00分 公開

ドライバ開発とネットワークプログラミングT-Engineプログラミング入門(4)(6/6 ページ)

[中村 大真 パーソナルメディア株式会社,@IT MONOist]
前のページへ 1|2|3|4|5|6       

リスト3 アプリケーション(プロセスベース)appl.c


/*
  デジタル温度計: ウェブ配信版
 */
#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ミリ秒待つ */
  }
}
リスト3 アプリケーション(プロセスベース)appl.c


前のページへ 1|2|3|4|5|6       

Copyright © ITmedia, Inc. All Rights Reserved.