#include #include #include #include #include #include #include #include #include #include //シグナル利用のファイル #include #include //#include #include #include #include #include #include #include "led.h" #include "lcd.h" #include "pat.h" #include "adconv.h" #include "contents.h" #define NO_DATA 0xffff #define DATA_MASK 0xff typedef unsigned char uchar ; #define TELNET_PORT 80 void* TelnetThread( void* arg ) ; char* GetCommand( int Socket ) ; int Sockprintf( int Socket, const char* fmt, ...) ; int Communication( int Socket ) ; char* strlwr( char* Buffer ) ; void ReadOut( int fd ) ; ushort GetDataTM( int fd ) ; uchar GetData( int fd ) ; int GetWaistMilliSec( struct timeval* Org ) ; ushort GetDataWithTimeOut( int fd, int MilliSec ) ; void Usage( int Socket ) ; int GetParameter( char* Buffer, int* Parameter ) ; void DispParameter( int Param[], int NumOfParam ) ; char* RecieveRequest( int Socket ) ; int Answer( int Socket, char* RequestStr ) ; int GetNumber(char*RequestStr,char*Name); void SetADValue( char* Contents ) ; void testpat( int n ) ; const char Pat1[] = {0x00,0xC0,0x70,0x18,0x08,0x0C,0x04,0x04,0x04,0x04,0x0C,0x08,0x18,0x70,0xC0,0x00,0x00,0x03,0x0E,0x18,0x10,0x30,0x20,0x20,0x20,0x20,0x30,0x10,0x18,0x0E,0x03,0x00,}; const char Pat0[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; const char Hart[] = { s _ _ x x x _ _ _ , s _ x x x x x _ _ , s x x x x x x x _ , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s _ x x x x x x x , s _ _ x x x x x x , s _ _ _ x x x x x , s _ _ _ _ x x x x , s _ _ _ _ _ x x x , s _ _ _ _ _ _ _ x , s _ _ _ x x x _ _ , s _ _ x x x x x _ , s _ x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x x , s x x x x x x x _ , s x x x x x x _ _ , s x x x x x _ _ _ , s x x x x _ _ _ _ , s x x x _ _ _ _ _ , s x _ _ _ _ _ _ _ , } ; /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ int main(int argc, char * argv[]) { int new_sock, err ; struct timeval TimeOut ; struct sockaddr_in myaddr ; struct sockaddr_in client_addr ; socklen_t client_address_size ; int sock ; InitLed(); InitLcd() ; ClearLcd() ; TimeOut.tv_sec = 5 ; TimeOut.tv_usec = 0 ; client_address_size = sizeof( client_addr ) ; sock = socket( AF_INET, SOCK_STREAM, 0 ) ; bzero( &myaddr, sizeof( myaddr ) ) ; myaddr.sin_family = AF_INET ; myaddr.sin_addr.s_addr = htonl( INADDR_ANY ) ; myaddr.sin_port = htons( TELNET_PORT ) ; err = bind( sock,(struct sockaddr* )&myaddr, sizeof( myaddr ) ) ; err = listen( sock, 2 ) ; printf( "listen=%d\n", err ) ; while( 1 ) { new_sock = accept( sock, (struct sockaddr* )&client_addr , &client_address_size ) ; if( new_sock < 0 ) { exit( -1 ) ; } if( Communication( new_sock ) != 0 ) { close( sock ) ; break ; } printf( "detach\n" ) ; } return( 0 ) ; } /****************************************************************************** 機能要約 telnet の応答 機能 引数 戻り値 注意 ******************************************************************************/ int Communication( int Socket ) { char* RequestStr ; printf( "\nhttpd start port=%d\n",TELNET_PORT ) ; fflush( stdout ) ; //TimeOut 処理をするためにノンブロッキングモードにする fcntl( Socket, F_SETFL, O_NONBLOCK); RequestStr = RecieveRequest( Socket ) ; if( RequestStr == NULL ) { return( -1 ) ; } Answer( Socket, RequestStr ) ; return( 0 ) ; } /****************************************************************************** 機能要約 html を送る 機能 引数 戻り値 注意 ******************************************************************************/ int Answer( int Socket, char* RequestStr ) { int Length ; int LedNumber; int LcdNumber; char* Contents ; LedNumber=GetNumber(RequestStr,"led0"); if( LedNumber == 0 ) { Led( 0 ) ; } else { Led(1); } LcdNumber=GetNumber(RequestStr,"lcd1"); ClearLcd() ; testpat(LcdNumber); printf("Led0=%d\nLcd=%d\n",LedNumber,LcdNumber); Contents=GetContents(&Length); SetADValue( Contents ) ; //コンテナヘッダーを出力 Sockprintf( Socket, "HTTP/1.1 200 OK\n" ) ; Sockprintf( Socket, "Accept-Ranges: bytes\n" ) ; Sockprintf( Socket, "Content-Length: %d bytes\n", Length ) ; Sockprintf( Socket, "Connection: close\n" ) ; Sockprintf( Socket, "Content-Type: text/html\n" ) ; Sockprintf( Socket, "\n" ) ; write( Socket, Contents, Length ); return( 0 ) ; } /****************************************************************************** 機能要約 LCD に模様を書く 機能 引数 戻り値 注意 ******************************************************************************/ void testpat( int n ) { int i ; for( i = 0 ; i < n ; i ++ ) { SetLcdPoint( 0, i * 16 ) ; PutPattern( Hart, 16 ) ; SetLcdPoint( 1, i * 16 ) ; PutPattern( &Hart[ 16 ] , 16 ) ; } } /****************************************************************************** 機能要約 ADコンバーターの値を html に上書き 機能 引数 戻り値 注意 ******************************************************************************/ void SetADValue( char* Contents ) { char Buffer[ 6 ] ; char Format[] = "%04d " ; char* TargetStr ; sprintf( Buffer, Format, AdConv( 0 ) ) ; TargetStr = strstr( Contents, "AD0" ) ; TargetStr += 4 ; strncpy( TargetStr, Buffer, 4 ) ; sprintf( Buffer, Format, AdConv( 1 ) ) ; TargetStr = strstr( Contents, "AD1" ) ; TargetStr += 4 ; strncpy( TargetStr, Buffer, 4 ) ; } /****************************************************************************** 機能要約 数値を得る 機能 引数 戻り値 注意 ******************************************************************************/ int GetNumber(char*RequestStr,char*Name) { char*NamePoint; NamePoint=strstr(RequestStr,Name); if(NamePoint==NULL){ return(0); } NamePoint+=strlen(Name); while(*NamePoint!=0){ if(isdigit(*NamePoint)){ return(atoi(NamePoint)); } NamePoint++; } return(0); } /****************************************************************************** 機能要約 リクエストを得る 機能 引数 戻り値 注意 ******************************************************************************/ char* RecieveRequest( int Socket ) { static char GetStr[ 120 ] ; static char* Buffer; int DetectGetStr = 0 ; while( 1 ) { Buffer = GetCommand( Socket ) ; if( Buffer == NULL ) { return( NULL ) ; } if( strlen( Buffer ) == 0 ) { break ; } strlwr( Buffer ) ; printf( "[%s]\n", Buffer ) ; if( strstr( Buffer, "get" ) != NULL ) { DetectGetStr = 1 ; strcpy( GetStr, Buffer ) ; } } if( DetectGetStr ) { printf( "Get>%s\n", GetStr ) ; if(strstr(GetStr,"owari")!=NULL){ return(NULL); } return( GetStr ) ; } else { return( NULL ) ; } } /****************************************************************************** 機能要約 パラメーターを得る 機能 引数 戻り値 注意 ******************************************************************************/ int GetParameter( char* Buffer, int* Parameter ) { int NumOfParameter = 0 ; Buffer += 3 ; for(; *Buffer != 0 ; Buffer ++ ) { if( isdigit( *Buffer ) ) { Parameter[ NumOfParameter ] = atoi( Buffer ) ; NumOfParameter ++ ; for(; *Buffer != 0 ; Buffer ++ ) { if( *Buffer == 0 ) { return( NumOfParameter ) ; } if( isdigit( *Buffer ) == 0 ) { break ; } } } } return( NumOfParameter ) ; } /****************************************************************************** 機能要約 パラメーターを表示する 機能 引数 戻り値 注意 ******************************************************************************/ void DispParameter( int Param[], int NumOfParam ) { int i ; for( i = 0 ; i < NumOfParam ; i ++ ) { printf( "%d:", Param[ i ] ) ; } printf( "\n" ) ; } /****************************************************************************** 機能要約 コマンド文字列を受け取る 機能 引数 戻り値 注意 ******************************************************************************/ char* GetCommand( int Socket ) { uint uintData ; uchar Data ; static char Buffer[ 200 ] ; int BufPtr ; BufPtr = 0 ; while( 1 ) { uintData = GetDataWithTimeOut( Socket, 10000 ) ; if( uintData == NO_DATA ) { printf("timeout\n"); return( NULL ) ; } Data = uintData ; if( Data < ' ' ) { Buffer[ BufPtr ] = 0 ; return( Buffer ) ; } Buffer[ BufPtr ] = Data ; BufPtr ++ ; if( BufPtr >= 64 ) { return( NULL ) ; } } } /****************************************************************************** 機能要約 ソケットに対し printf 機能 引数 戻り値 注意 ******************************************************************************/ int Sockprintf( int Socket, const char* fmt, ...) { static char Buffer[ 128 ] ; va_list argptr; int cnt; //return(0); va_start(argptr, fmt ); cnt = vsprintf( Buffer, fmt, argptr ) ; va_end(argptr); write( Socket, Buffer, strlen( Buffer ) ) ; //printf( "<" ) ; //fwrite( Buffer, cnt , 1, stdout); //printf( ">\n" ) ; return(cnt); } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ ushort GetDataWithTimeOut( int fd, int MilliSec ) { char buf[ 1 ] ; struct timeval tv ; ushort Data ; int res ; if( MilliSec == 0 ) { Data = GetData( fd ) ; return( Data & DATA_MASK ) ; } gettimeofday(&tv, NULL); while( 1 ) { res = read( fd, buf, 1 ) ; if( res <= 0 ) { //printf( "%d:", GetWaistMilliSec( &tv ) ) ; if( GetWaistMilliSec( &tv ) > MilliSec ) { return( NO_DATA ) ; } usleep( 1000 ) ; continue ; } Data = buf[ 0 ] ; Data &= DATA_MASK ; //printf( "%d data=%02x\n",res,Data);fflush( stdout ) ; return( Data ) ; } } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ uchar GetData( int fd ) { char buf[ 1 ] ; ushort Data ; int res ; while( 1 ) { res = read( fd, buf, 1 ) ; if( res <= 0 ) { //printf("[%d]",res); fflush( stdout); usleep( 1000 ) ; continue ; } Data = buf[ 0 ] ; Data &= DATA_MASK ; //printf( "%d data=%02x\n",res,Data); fflush( stdout ) ; return( Data ) ; } } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ int GetWaistMilliSec( struct timeval* Org ) { int MilliSecOrg, MilliSecNow ; int MilliSec ; struct timeval Now ; gettimeofday(&Now, NULL); MilliSec = ( Now.tv_sec - Org->tv_sec ) * 1000; MilliSecOrg = Org->tv_usec / 1000 ; MilliSecNow = Now.tv_usec / 1000 ; return( MilliSec + MilliSecNow - MilliSecOrg ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ char* strlwr( char* Buffer ) { char Data ; int i ; for( i = 0 ; Buffer[ i ] != 0 ; i ++ ) { Data = Buffer[ i ] ; if( ( 'A' <= Data ) && ( Data <= 'Z' ) ) { Data = Data - 'A' + 'a' ; Buffer[ i ] = Data ; } } return( Buffer ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void ReadOut( int fd ) { int ret ; ret= tcflush(fd, TCIFLUSH ) ; printf( "tcflush %d\n",ret); }